diff options
Diffstat (limited to '')
-rw-r--r-- | 2020/organizers-notebook.md | 377 | ||||
-rw-r--r-- | 2020/organizers-notebook.org | 413 | ||||
-rw-r--r-- | 2020/submissions.md | 750 | ||||
-rw-r--r-- | 2020/submissions.org | 448 |
4 files changed, 1044 insertions, 944 deletions
diff --git a/2020/organizers-notebook.md b/2020/organizers-notebook.md index 5ca98f07..80a0c81d 100644 --- a/2020/organizers-notebook.md +++ b/2020/organizers-notebook.md @@ -1,6 +1,8 @@ <!-- automatically generated from organizers-notebook.org. Please edit that file instead. --> [[!toc levels=4]] +[Export and tangle]((progn (org-md-export-to-markdown) (org-babel-tangle))) + # Tasks @@ -70,26 +72,25 @@ organizers-notebook.org back to the repo. - [ ] <./subtitles/emacsconf-2020--42-closing-remarks-autogen.sbv> -## DONE Create tasks for each of the subtitles - +# Assumptions and settings -## DONE Link compressed videos on each talk page +Note that re-evaluating a defvar won't change the value, so if you want to change the value after this is already loaded, use `(setq ...)`. - (mapc (lambda (o) - (if (string-match "\\(emacsconf-2020--\\([0-9]+\\).*?\\)-vp9-q56-original-audio\\.webm" o) - (let ((talk-id (match-string 2 o)) - (base (match-string 1 o))) - (find-file (expand-file-name (concat talk-id ".md") "~/vendor/emacsconf-wiki/2020/info")) - (goto-char (point-min)) - (when (re-search-forward base nil t) - (forward-line 1) - (beginning-of-line) - (unless (looking-at "\\[Download") - (insert (format "[Download compressed %s.webm video (%s)](https://media.emacsconf.org/2020/%s)\n" - (if (string-match "questions" o) "Q&A " "") - (file-size-human-readable (file-attribute-size (file-attributes o))) - (file-name-nondirectory o)))))))) - (directory-files "~/vendor/emacsconf-original-audio" t "webm")) + (defvar conf/buffer-minutes 3 "Number of minutes to use as a buffer between talks.") + (defvar conf/timezones '("EST" "America/Los_Angeles" "UTC" "CET" "Asia/Singapore") "List of timezones") + (defvar conf/autogenerate-talk-pages nil "Set this to t at the beginning of the conference, when we're still autogenerating individual talk pages. + Otherwise you might overwrite hand-edited talk pages.") + (defvar conf/collaborative-pad "https://etherpad.wikimedia.org/p/emacsconf-2020" "URL of collaborative pad.") + (defvar conf/streaming-nick "bandali" "IRC nick of main organizer in charge of streaming.") + (defvar conf/topic-templates nil "List of (channel topic-template) entries for mass-setting channel topics.") + (defvar conf/rooms '(("A" "http://example.org?room=a") + ("B" "http://example.org?room=b") + ("C" "http://example.org?room=c")) + "List of (code join-url) entries. Room codes should be uppercase.") ; actually set this in organizers' wiki index.org + (setq conf/topic-templates + '(("#emacsconf" "EmacsConf 2020 is over, thanks for joining! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates") + ("#emacsconf-accessible" "EmacsConf 2020 is over. Thanks for making it more accessible! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates") + ("#emacsconf-org" "EmacsConf2020 is over, thanks for joining! | Dedicated channel for EmacsConf organizers and speakers | this is intended as an internal, low-traffic channel; for main discussion around EmacsConf, please join #emacsconf | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates"))) # Workflows @@ -103,6 +104,327 @@ STREAM - main organizer, CHECK - secondary organizer or volunteer, PAD - organiz - See submissions.org for Org scheduling code; 3 minutes of buffer was okay last time, but more would be better for Q&A; opening remarks time could be trimmed +#### Code for scheduling + + (defun conf/get-talk-info () + (let (talk results) + (org-map-entries (lambda () + (let ((heading (org-heading-components))) + (cond + ((and (elt heading 2) (or (null talk) + (<= (car heading) + (plist-get talk :level)))) ;; has a todo, therefore is a talk + (when talk (setq results (cons talk results))) + (setq talk (list + :type 'talk + :title (elt heading 4) + :talk-id (org-entry-get (point) "TALK_ID") + :status (elt heading 2) + :level (car heading) + :scheduled (org-entry-get (point) "SCHEDULED") + :duration (org-entry-get (point) "DURATION") + :time (org-entry-get (point) "MIN_TIME") + :speakers (org-entry-get (point) "NAME")))) + ((string-match "^ *Talk information *$" (elt heading 4)) + (plist-put talk :info + (org-export-as 'md t nil t))) + ((or (null talk) (< (car heading) (plist-get talk :level))) ;; heading above + (when talk + (setq results (cons talk results)) + (setq talk nil)) + (setq results (cons + (list :type 'headline + :level (car heading) + :speakers (org-entry-get (point) "NAME") + :duration (org-entry-get (point) "DURATION") + :talk-id (org-entry-get (point) "TALK_ID") + :title (elt heading 4) + :scheduled (org-entry-get (point) "SCHEDULED")) + results)))))) + nil 'tree) + (when talk (setq results (cons talk results))) + (reverse results))) + + (defun conf/filter-talks (list) + "Return only talk info in LIST." + (seq-filter + (lambda (talk) (eq (plist-get talk :type) 'talk)) + list)) + + (defun conf/get-talk-info-from-file (&optional filename) + (with-temp-buffer + (insert-file-contents (or filename "submissions.org")) + (org-mode) + (org-show-all) + (goto-char (point-min)) + (goto-char (org-find-property "ID" "talks")) + (conf/get-talk-info))) + + + (defun conf/find-talk (filter &optional info) + (setq info (or info (conf/filter-talks conf/info))) + (when (stringp filter) (setq filter (list filter))) + (or (seq-find (lambda (o) (string= (plist-get o :talk-id) (car filter))) info) + (seq-find (lambda (o) + (let ((case-fold-search t) + (all (mapconcat (lambda (f) (plist-get o f)) '(:title :speakers :talk-id) " "))) + (null (seq-contains-p + (mapcar (lambda (condition) (string-match condition all)) filter) + nil)))) + info))) + + (defun conf/goto-talk-id (id) + (goto-char (org-find-property "TALK_ID" id))) + + (defun conf/assign-ids () + "Assign numeric talk IDs." + (interactive) + (goto-char (point-min)) + ;; Determine the maximum ID assigned so far + (let ((id + (1+ + (apply 'max + (or (mapcar + 'string-to-number + (org-map-entries + (lambda () + (let ((org-trust-scanner-tags t)) + (org-entry-get (point) "TALK_ID"))) "TALK_ID>0" 'file)) + '(0)))))) + (goto-char (point-min)) + (while (re-search-forward "^ *:NAME: " nil t) + (unless (org-entry-get (point) "TALK_ID") + (org-set-property "TALK_ID" (format "%02d" id)) + (org-set-property "CUSTOM_ID" (format "talk%02d" id)) + (setq id (1+ id)))))) + + (defun conf/update-talks () + "Update times, tables, and schedules." + (interactive) + (save-excursion + (conf/update-times) + (conf/update-tables) + (conf/update-schedules))) + + (defun conf/update-times () + "Check whether we need more time or less time based on TARGET_TIME and MIN_TIME_SUM." + (goto-char (point-min)) + (org-map-entries + (lambda () + (when (org-entry-get (point) "TARGET_TIME") + (conf/org-sum-min-time-in-subtree) + (org-entry-put + (point) + "DIFFERENCE" + (let ((diff + (- + (string-to-number (org-entry-get (point) "TARGET_TIME")) + (string-to-number (org-entry-get (point) "MIN_TIME_SUM"))))) + (cond + ((> diff 0) (format "Extra: %d" diff)) + ((< diff 0) (format "Needs: %d" (- diff))) + (t "")))))) nil 'file)) + + (defun conf/update-tables () + "Update the time checks and table reports." + (goto-char (point-min)) + (while (re-search-forward "#\\+CALL: check_time()" nil t) + (org-ctrl-c-ctrl-c)) + (goto-char (point-min)) + (while (re-search-forward "#\\+BEGIN: columnview" nil t) + (org-ctrl-c-ctrl-c))) + + (defun conf/update-schedules () + "Schedule the talks based on the MIN_TIME and 3 minutes of buffer. + Talks with a FIXED_TIME property are not moved." + (interactive) + (goto-char (org-find-exact-headline-in-buffer "Talks")) + (let (current-time scheduled end-time duration (buffer (seconds-to-time (* conf/buffer-minutes 60)))) ;; assumption: 3 minutes between talks + (org-map-entries (lambda () + (if (org-entry-get (point) "FIXED_TIME") + (setq current-time (org-get-scheduled-time (point)))) + (when (org-entry-get (point) "MIN_TIME") + (setq duration (* (string-to-number (org-entry-get (point) "MIN_TIME")) 60) + end-time (time-add current-time (seconds-to-time duration))) + (org-set-property "SCHEDULED" (format "%s-%s" (org-format-time-string "%Y-%m-%d %H:%M" current-time) + (org-format-time-string "%H:%M" end-time))) + (setq current-time (time-add end-time buffer)))) + nil 'tree))) + + (defun conf/org-sum-min-time-in-subtree () + "Add up all the MIN_TIME properties of headings underneath the current one + The total is written to the MIN_TIME_SUM property of this heading" + (interactive) + (org-entry-put + (point) + "MIN_TIME_SUM" + (save-excursion + (format "%d" + (apply + '+ + (mapcar 'string-to-number + (delq nil + (org-map-entries + (lambda () (org-entry-get (point) "MIN_TIME")) nil 'tree)))))))) + + +#### Generate schedule file + + (defun conf/format-talk-link (talk) + (and talk (if (plist-get talk :talk-id) + (format "<a href=\"/2020/talks/%s\">%s</a>" + (plist-get talk :talk-id) + (plist-get talk :title)) + (plist-get talk :title)))) + + (defun conf/format-talk-info-as-schedule (info) + (format "<table width=\"100%%\">%s</table>" + (mapconcat + (lambda (o) + (let* ((time-fmt "%l:%M %p") + (timestamp (org-timestamp-from-string (plist-get o :scheduled))) + (start (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp))) "")) + (end (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp t))) "")) + (title (plist-get o :title)) + (speakers (plist-get o :speakers))) + (if (eq (plist-get o :type) 'headline) + (format "<tr><td colspan=\"4\"><strong>%s<strong></td></tr>" + (if (plist-get o :talk-id) + (conf/format-talk-link o) + title)) + (format "<tr><td width=100>~%s</td><td width=100>~%s</td><td>%s</td><td>%s</td></tr>" + start end (conf/format-talk-link o) speakers)))) + (cdr info) "\n"))) + + (defun conf/filter-talks (info) + (seq-filter (lambda (o) (plist-get o :talk-id)) info)) + + (defun conf/split-out-talk-information () + (interactive) + (let ((talks (conf/filter-talks conf/info))) + (mapc (lambda (o) + (with-temp-buffer + (insert + (format "# %s\n%s\n\n%s" + (plist-get o :title) + (plist-get o :speakers) + (plist-get o :info))) + (write-file (expand-file-name (format "%s.md" (plist-get o :talk-id)) "info")))) + talks))) + + (defun conf/format-talk-pages (info) + (let* ((talks (conf/filter-talks info)) + (next-talks (cdr talks)) + (prev-talks (cons nil talks))) + (mapc (lambda (o) + (with-temp-buffer + (let* ((timestamp (org-timestamp-from-string (plist-get o :scheduled))) + (next-talk (conf/format-talk-link (pop next-talks))) + (prev-talk (conf/format-talk-link (pop prev-talks))) + (schedule (mapconcat + (lambda (tz) + (format "%s - %s" + (format-time-string "%A, %b %e %Y, ~%l:%M %p" + (org-timestamp-to-time (org-timestamp-split-range timestamp)) tz) + (format-time-string "%l:%M %p %Z" + (org-timestamp-to-time (org-timestamp-split-range timestamp t)) tz))) + conf/timezones + " \n")) + (nav-links (format "Back to the [[schedule]] \n%s%s" + (if prev-talk (format "Previous: %s \n" prev-talk) "") + (if next-talk (format "Next: %s \n" next-talk) "")))) + (insert (format "[[%s title=\"%s\"]] + [[%s copyright=\"Copyright © 2020 %s\"]] + + <!-- To edit the talk information, change /2020/info/TALKID.md. Boilerplate automatically generated from submissions.org using conf/generate-schedule-files --->\n + + %s + + [[!inline pages=\"internal(2020/info/%s)\" raw=\"yes\"]] + + %s + + %s + + " + "!meta" + (replace-regexp-in-string "\"" "\\\\\"" (plist-get o :title)) + "!meta" + (plist-get o :speakers) + nav-links + (plist-get o :talk-id) + schedule + nav-links))) + (write-file (format "talks/%s.md" (plist-get o :talk-id))))) + talks))) + + (defun conf/generate-pad-template () + (interactive) + (let ((talks (conf/filter-talks conf/info))) + (with-current-buffer (find-file "pad-template.md") + (erase-buffer) + (insert + (concat + "Conference info, how to watch/participate: <https://emacsconf.org/2020/> + Code of conduct: <https://emacsconf.org/conduct/> + + " + (mapconcat + (lambda (o) + (format "**%s** + Speaker(s): %s + Talk page: <https://emacsconf.org/2020/schedule/%s> + + *Questions:* + + * Put your questions here, most recent on top + * sample text + + *Links:* + + * sample text + * sample text + + *Other notes:* + + * sample text + * sample text + <br> + <br> + " (plist-get o :title) (plist-get o :speakers) (plist-get o :talk-id))) talks " \n \n"))) + (save-buffer)))) + + (defun conf/generate-talks-page () + (let ((info conf/info)) + (with-temp-buffer + (find-file "talk-details.md") + (erase-buffer) + (insert (format "<table><thead><th>Duration</th><th>Title</th><th>Speakers</th></thead><tbody>%s</tbody></table>" + (mapconcat + (lambda (o) + (let* ((title (plist-get o :title)) + (speakers (plist-get o :speakers))) + (if (null (plist-get o :talk-id)) + (format "<tr><td colspan=\"3\">%s</td></tr>" (conf/format-talk-link o)) + (format "<tr><td>%s</td><td>%s</td><td>%s</td><tr>" + (plist-get o :duration) + (conf/format-talk-link o) + (plist-get o :speakers))))) + info "\n"))) + (save-buffer)))) + + (defun conf/generate-schedule-files (&optional filename) + (interactive) + (with-temp-buffer + (insert (conf/format-talk-info-as-schedule conf/info)) + (write-file "schedule-details.md")) + (when conf/autogenerate-talk-pages (conf/format-talk-pages conf/info))) + +Set the info based on submissions.org. + + (setq conf/info (conf/get-talk-info-from-file "submissions.org")) + + ### Before the conference - Do tech checks and get alternative ways to contact speakers (phone number? IRC nick? Something that goes ding?) @@ -226,20 +548,7 @@ Needs the `$main480p` environment variable set to somethnig of the form `icecast ##### Load data - (defvar conf/collaborative-pad "https://etherpad.wikimedia.org/p/emacsconf-2020" "URL of collaborative pad.") - (defvar conf/topic-templates nil "List of (channel topic-template) entries for mass-setting channel topics.") - (defvar conf/streaming-nick "bandali" "IRC nick of main organizer in charge of streaming.") - "List of (code join-url) entries, one for each meeting room.") ;; Set this in a private file - (defvar conf/channels nil "List of IRC channels for broadcasts.") (defvar conf/info nil "List of plists with the following keys: `:talk-id', `:name', `:speakers', and other info.") ; Set from submissions.org - (setq conf/topic-templates - '(("#emacsconf" "EmacsConf 2020 is over, thanks for joining! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates") - ("#emacsconf-accessible" "EmacsConf 2020 is over. Thanks for making it more accessible! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates") - ("#emacsconf-org" "EmacsConf2020 is over, thanks for joining! | Dedicated channel for EmacsConf organizers and speakers | this is intended as an internal, low-traffic channel; for main discussion around EmacsConf, please join #emacsconf | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates"))) - (defvar conf/rooms '(("A" "http://example.org?room=a") - ("B" "http://example.org?room=b") - ("C" "http://example.org?room=c")) - "List of (code join-url) entries. Room codes should be uppercase.") ; set from organizers' wiki index.org ##### Announce topics @@ -305,7 +614,7 @@ Needs the `$main480p` environment variable set to somethnig of the form `icecast (defun erc-cmd-BROADCAST (&rest message) "Say MESSAGE in all the conference channels." - (conf/erc-with-channels conf/channels + (conf/erc-with-channels (mapcar 'car conf/topic-templates) (erc-send-message (s-join " " message)))) @@ -397,10 +706,10 @@ Another collaborative pad #### Encode highly-compressed versions -[Compressing video](#org1261a7d) +[Compressing video](#org8cc42f6) -<a id="org1261a7d"></a> +<a id="org8cc42f6"></a> #### Compressing video diff --git a/2020/organizers-notebook.org b/2020/organizers-notebook.org index d69c4d2d..5e5a3b41 100644 --- a/2020/organizers-notebook.org +++ b/2020/organizers-notebook.org @@ -1,12 +1,14 @@ #+todo: TODO(t) INPROGRESS(i) | DONE(d) CANCELLED(c) #+OPTIONS: h:6 -#+PROPERTY: header-args :results silent :exports code +#+PROPERTY: header-args :results silent :exports code :tangle yes #+begin_export md <!-- automatically generated from organizers-notebook.org. Please edit that file instead. --> [[!toc levels=4]] #+end_export +[[elisp:(progn (org-md-export-to-markdown) (org-babel-tangle))][Export and tangle]] + * Tasks ** Manually transcribe Either subtitles (with timestamps) or a text transcript (no timestamps) is perfectly okay. @@ -69,32 +71,26 @@ organizers-notebook.org back to the repo. - [ ] [[./subtitles/emacsconf-2020--41-opening-remarks-autogen.sbv]] - [ ] [[./subtitles/emacsconf-2020--42-closing-remarks-autogen.sbv]] -** DONE Create tasks for each of the subtitles - CLOSED: [2020-12-09 Wed 15:42] - :LOGBOOK: - - State "DONE" from "TODO" [2020-12-09 Wed 15:42] - :END: -** DONE Link compressed videos on each talk page - CLOSED: [2020-12-09 Wed 15:42] - :LOGBOOK: - - State "DONE" from "TODO" [2020-12-09 Wed 15:42] - :END: +* Assumptions and settings + +Note that re-evaluating a defvar won't change the value, so if you want to change the value after this is already loaded, use =(setq ...)=. + #+begin_src emacs-lisp - (mapc (lambda (o) - (if (string-match "\\(emacsconf-2020--\\([0-9]+\\).*?\\)-vp9-q56-original-audio\\.webm" o) - (let ((talk-id (match-string 2 o)) - (base (match-string 1 o))) - (find-file (expand-file-name (concat talk-id ".md") "~/vendor/emacsconf-wiki/2020/info")) - (goto-char (point-min)) - (when (re-search-forward base nil t) - (forward-line 1) - (beginning-of-line) - (unless (looking-at "\\[Download") - (insert (format "[Download compressed %s.webm video (%s)](https://media.emacsconf.org/2020/%s)\n" - (if (string-match "questions" o) "Q&A " "") - (file-size-human-readable (file-attribute-size (file-attributes o))) - (file-name-nondirectory o)))))))) - (directory-files "~/vendor/emacsconf-original-audio" t "webm")) +(defvar conf/buffer-minutes 3 "Number of minutes to use as a buffer between talks.") +(defvar conf/timezones '("EST" "America/Los_Angeles" "UTC" "CET" "Asia/Singapore") "List of timezones") +(defvar conf/autogenerate-talk-pages nil "Set this to t at the beginning of the conference, when we're still autogenerating individual talk pages. +Otherwise you might overwrite hand-edited talk pages.") +(defvar conf/collaborative-pad "https://etherpad.wikimedia.org/p/emacsconf-2020" "URL of collaborative pad.") +(defvar conf/streaming-nick "bandali" "IRC nick of main organizer in charge of streaming.") +(defvar conf/topic-templates nil "List of (channel topic-template) entries for mass-setting channel topics.") +(defvar conf/rooms '(("A" "http://example.org?room=a") + ("B" "http://example.org?room=b") + ("C" "http://example.org?room=c")) + "List of (code join-url) entries. Room codes should be uppercase.") ; actually set this in organizers' wiki index.org +(setq conf/topic-templates + '(("#emacsconf" "EmacsConf 2020 is over, thanks for joining! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates") + ("#emacsconf-accessible" "EmacsConf 2020 is over. Thanks for making it more accessible! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates") + ("#emacsconf-org" "EmacsConf2020 is over, thanks for joining! | Dedicated channel for EmacsConf organizers and speakers | this is intended as an internal, low-traffic channel; for main discussion around EmacsConf, please join #emacsconf | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates"))) #+end_src * Workflows @@ -106,6 +102,333 @@ STREAM - main organizer, CHECK - secondary organizer or volunteer, PAD - organiz - Collect e-mail addresses of accepted speakers into a list for easy pasting into Bcc (organizers' private wiki) - See submissions.org for Org scheduling code; 3 minutes of buffer was okay last time, but more would be better for Q&A; opening remarks time could be trimmed +**** Code for scheduling +#+begin_src emacs-lisp :exports code :results none +(defun conf/get-talk-info () + (let (talk results) + (org-map-entries (lambda () + (let ((heading (org-heading-components))) + (cond + ((and (elt heading 2) (or (null talk) + (<= (car heading) + (plist-get talk :level)))) ;; has a todo, therefore is a talk + (when talk (setq results (cons talk results))) + (setq talk (list + :type 'talk + :title (elt heading 4) + :talk-id (org-entry-get (point) "TALK_ID") + :status (elt heading 2) + :level (car heading) + :scheduled (org-entry-get (point) "SCHEDULED") + :duration (org-entry-get (point) "DURATION") + :time (org-entry-get (point) "MIN_TIME") + :speakers (org-entry-get (point) "NAME")))) + ((string-match "^ *Talk information *$" (elt heading 4)) + (plist-put talk :info + (org-export-as 'md t nil t))) + ((or (null talk) (< (car heading) (plist-get talk :level))) ;; heading above + (when talk + (setq results (cons talk results)) + (setq talk nil)) + (setq results (cons + (list :type 'headline + :level (car heading) + :speakers (org-entry-get (point) "NAME") + :duration (org-entry-get (point) "DURATION") + :talk-id (org-entry-get (point) "TALK_ID") + :title (elt heading 4) + :scheduled (org-entry-get (point) "SCHEDULED")) + results)))))) + nil 'tree) + (when talk (setq results (cons talk results))) + (reverse results))) + +(defun conf/filter-talks (list) + "Return only talk info in LIST." + (seq-filter + (lambda (talk) (eq (plist-get talk :type) 'talk)) + list)) + +(defun conf/get-talk-info-from-file (&optional filename) + (with-temp-buffer + (insert-file-contents (or filename "submissions.org")) + (org-mode) + (org-show-all) + (goto-char (point-min)) + (goto-char (org-find-property "ID" "talks")) + (conf/get-talk-info))) + + +(defun conf/find-talk (filter &optional info) + (setq info (or info (conf/filter-talks conf/info))) + (when (stringp filter) (setq filter (list filter))) + (or (seq-find (lambda (o) (string= (plist-get o :talk-id) (car filter))) info) + (seq-find (lambda (o) + (let ((case-fold-search t) + (all (mapconcat (lambda (f) (plist-get o f)) '(:title :speakers :talk-id) " "))) + (null (seq-contains-p + (mapcar (lambda (condition) (string-match condition all)) filter) + nil)))) + info))) + +(defun conf/goto-talk-id (id) + (goto-char (org-find-property "TALK_ID" id))) + +(defun conf/assign-ids () + "Assign numeric talk IDs." + (interactive) + (goto-char (point-min)) + ;; Determine the maximum ID assigned so far + (let ((id + (1+ + (apply 'max + (or (mapcar + 'string-to-number + (org-map-entries + (lambda () + (let ((org-trust-scanner-tags t)) + (org-entry-get (point) "TALK_ID"))) "TALK_ID>0" 'file)) + '(0)))))) + (goto-char (point-min)) + (while (re-search-forward "^ *:NAME: " nil t) + (unless (org-entry-get (point) "TALK_ID") + (org-set-property "TALK_ID" (format "%02d" id)) + (org-set-property "CUSTOM_ID" (format "talk%02d" id)) + (setq id (1+ id)))))) + +(defun conf/update-talks () + "Update times, tables, and schedules." + (interactive) + (save-excursion + (conf/update-times) + (conf/update-tables) + (conf/update-schedules))) + +(defun conf/update-times () + "Check whether we need more time or less time based on TARGET_TIME and MIN_TIME_SUM." + (goto-char (point-min)) + (org-map-entries + (lambda () + (when (org-entry-get (point) "TARGET_TIME") + (conf/org-sum-min-time-in-subtree) + (org-entry-put + (point) + "DIFFERENCE" + (let ((diff + (- + (string-to-number (org-entry-get (point) "TARGET_TIME")) + (string-to-number (org-entry-get (point) "MIN_TIME_SUM"))))) + (cond + ((> diff 0) (format "Extra: %d" diff)) + ((< diff 0) (format "Needs: %d" (- diff))) + (t "")))))) nil 'file)) + +(defun conf/update-tables () + "Update the time checks and table reports." + (goto-char (point-min)) + (while (re-search-forward "#\\+CALL: check_time()" nil t) + (org-ctrl-c-ctrl-c)) + (goto-char (point-min)) + (while (re-search-forward "#\\+BEGIN: columnview" nil t) + (org-ctrl-c-ctrl-c))) + +(defun conf/update-schedules () + "Schedule the talks based on the MIN_TIME and 3 minutes of buffer. +Talks with a FIXED_TIME property are not moved." + (interactive) + (goto-char (org-find-exact-headline-in-buffer "Talks")) + (let (current-time scheduled end-time duration (buffer (seconds-to-time (* conf/buffer-minutes 60)))) ;; assumption: 3 minutes between talks + (org-map-entries (lambda () + (if (org-entry-get (point) "FIXED_TIME") + (setq current-time (org-get-scheduled-time (point)))) + (when (org-entry-get (point) "MIN_TIME") + (setq duration (* (string-to-number (org-entry-get (point) "MIN_TIME")) 60) + end-time (time-add current-time (seconds-to-time duration))) + (org-set-property "SCHEDULED" (format "%s-%s" (org-format-time-string "%Y-%m-%d %H:%M" current-time) + (org-format-time-string "%H:%M" end-time))) + (setq current-time (time-add end-time buffer)))) + nil 'tree))) + +(defun conf/org-sum-min-time-in-subtree () + "Add up all the MIN_TIME properties of headings underneath the current one +The total is written to the MIN_TIME_SUM property of this heading" + (interactive) + (org-entry-put + (point) + "MIN_TIME_SUM" + (save-excursion + (format "%d" + (apply + '+ + (mapcar 'string-to-number + (delq nil + (org-map-entries + (lambda () (org-entry-get (point) "MIN_TIME")) nil 'tree)))))))) + +#+end_src + +**** Generate schedule file + + #+begin_src emacs-lisp :results none :eval yes :exports code :tangle "conf.el" + (defun conf/format-talk-link (talk) + (and talk (if (plist-get talk :talk-id) + (format "<a href=\"/2020/talks/%s\">%s</a>" + (plist-get talk :talk-id) + (plist-get talk :title)) + (plist-get talk :title)))) + + (defun conf/format-talk-info-as-schedule (info) + (format "<table width=\"100%%\">%s</table>" + (mapconcat + (lambda (o) + (let* ((time-fmt "%l:%M %p") + (timestamp (org-timestamp-from-string (plist-get o :scheduled))) + (start (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp))) "")) + (end (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp t))) "")) + (title (plist-get o :title)) + (speakers (plist-get o :speakers))) + (if (eq (plist-get o :type) 'headline) + (format "<tr><td colspan=\"4\"><strong>%s<strong></td></tr>" + (if (plist-get o :talk-id) + (conf/format-talk-link o) + title)) + (format "<tr><td width=100>~%s</td><td width=100>~%s</td><td>%s</td><td>%s</td></tr>" + start end (conf/format-talk-link o) speakers)))) + (cdr info) "\n"))) + + (defun conf/filter-talks (info) + (seq-filter (lambda (o) (plist-get o :talk-id)) info)) + + (defun conf/split-out-talk-information () + (interactive) + (let ((talks (conf/filter-talks conf/info))) + (mapc (lambda (o) + (with-temp-buffer + (insert + (format "# %s\n%s\n\n%s" + (plist-get o :title) + (plist-get o :speakers) + (plist-get o :info))) + (write-file (expand-file-name (format "%s.md" (plist-get o :talk-id)) "info")))) + talks))) + + (defun conf/format-talk-pages (info) + (let* ((talks (conf/filter-talks info)) + (next-talks (cdr talks)) + (prev-talks (cons nil talks))) + (mapc (lambda (o) + (with-temp-buffer + (let* ((timestamp (org-timestamp-from-string (plist-get o :scheduled))) + (next-talk (conf/format-talk-link (pop next-talks))) + (prev-talk (conf/format-talk-link (pop prev-talks))) + (schedule (mapconcat + (lambda (tz) + (format "%s - %s" + (format-time-string "%A, %b %e %Y, ~%l:%M %p" + (org-timestamp-to-time (org-timestamp-split-range timestamp)) tz) + (format-time-string "%l:%M %p %Z" + (org-timestamp-to-time (org-timestamp-split-range timestamp t)) tz))) + conf/timezones + " \n")) + (nav-links (format "Back to the [[schedule]] \n%s%s" + (if prev-talk (format "Previous: %s \n" prev-talk) "") + (if next-talk (format "Next: %s \n" next-talk) "")))) + (insert (format "[[%s title=\"%s\"]] + [[%s copyright=\"Copyright © 2020 %s\"]] + + <!-- To edit the talk information, change /2020/info/TALKID.md. Boilerplate automatically generated from submissions.org using conf/generate-schedule-files --->\n + + %s + + [[!inline pages=\"internal(2020/info/%s)\" raw=\"yes\"]] + + %s + + %s + + " + "!meta" + (replace-regexp-in-string "\"" "\\\\\"" (plist-get o :title)) + "!meta" + (plist-get o :speakers) + nav-links + (plist-get o :talk-id) + schedule + nav-links))) + (write-file (format "talks/%s.md" (plist-get o :talk-id))))) + talks))) + + (defun conf/generate-pad-template () + (interactive) + (let ((talks (conf/filter-talks conf/info))) + (with-current-buffer (find-file "pad-template.md") + (erase-buffer) + (insert + (concat + "Conference info, how to watch/participate: <https://emacsconf.org/2020/> + Code of conduct: <https://emacsconf.org/conduct/> + + " + (mapconcat + (lambda (o) + (format "**%s** + Speaker(s): %s + Talk page: <https://emacsconf.org/2020/schedule/%s> + + ,*Questions:* + + ,* Put your questions here, most recent on top + ,* sample text + + ,*Links:* + + ,* sample text + ,* sample text + + ,*Other notes:* + + ,* sample text + ,* sample text + <br> + <br> + " (plist-get o :title) (plist-get o :speakers) (plist-get o :talk-id))) talks " \n \n"))) + (save-buffer)))) + + (defun conf/generate-talks-page () + (let ((info conf/info)) + (with-temp-buffer + (find-file "talk-details.md") + (erase-buffer) + (insert (format "<table><thead><th>Duration</th><th>Title</th><th>Speakers</th></thead><tbody>%s</tbody></table>" + (mapconcat + (lambda (o) + (let* ((title (plist-get o :title)) + (speakers (plist-get o :speakers))) + (if (null (plist-get o :talk-id)) + (format "<tr><td colspan=\"3\">%s</td></tr>" (conf/format-talk-link o)) + (format "<tr><td>%s</td><td>%s</td><td>%s</td><tr>" + (plist-get o :duration) + (conf/format-talk-link o) + (plist-get o :speakers))))) + info "\n"))) + (save-buffer)))) + + (defun conf/generate-schedule-files (&optional filename) + (interactive) + (with-temp-buffer + (insert (conf/format-talk-info-as-schedule conf/info)) + (write-file "schedule-details.md")) + (when conf/autogenerate-talk-pages (conf/format-talk-pages conf/info))) + #+end_src + +Set the info based on submissions.org. + +#+begin_src emacs-lisp +(setq conf/info (conf/get-talk-info-from-file "submissions.org")) +#+end_src + + #+RESULTS: + *** Before the conference - Do tech checks and get alternative ways to contact speakers (phone number? IRC nick? Something that goes ding?) @@ -219,20 +542,7 @@ STREAM - main organizer, CHECK - secondary organizer or volunteer, PAD - organiz ***** Load data #+begin_src emacs-lisp :results silent - (defvar conf/collaborative-pad "https://etherpad.wikimedia.org/p/emacsconf-2020" "URL of collaborative pad.") - (defvar conf/topic-templates nil "List of (channel topic-template) entries for mass-setting channel topics.") - (defvar conf/streaming-nick "bandali" "IRC nick of main organizer in charge of streaming.") - "List of (code join-url) entries, one for each meeting room.") ;; Set this in a private file - (defvar conf/channels nil "List of IRC channels for broadcasts.") - (defvar conf/info nil "List of plists with the following keys: `:talk-id', `:name', `:speakers', and other info.") ; Set from submissions.org - (setq conf/topic-templates - '(("#emacsconf" "EmacsConf 2020 is over, thanks for joining! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates") - ("#emacsconf-accessible" "EmacsConf 2020 is over. Thanks for making it more accessible! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates") - ("#emacsconf-org" "EmacsConf2020 is over, thanks for joining! | Dedicated channel for EmacsConf organizers and speakers | this is intended as an internal, low-traffic channel; for main discussion around EmacsConf, please join #emacsconf | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates"))) - (defvar conf/rooms '(("A" "http://example.org?room=a") - ("B" "http://example.org?room=b") - ("C" "http://example.org?room=c")) - "List of (code join-url) entries. Room codes should be uppercase.") ; set from organizers' wiki index.org + (defvar conf/info nil "List of plists with the following keys: `:talk-id', `:name', `:speakers', and other info.") ; Set from submissions.org #+end_src ***** Announce topics @@ -299,7 +609,7 @@ STREAM - main organizer, CHECK - secondary organizer or volunteer, PAD - organiz (defun erc-cmd-BROADCAST (&rest message) "Say MESSAGE in all the conference channels." - (conf/erc-with-channels conf/channels + (conf/erc-with-channels (mapcar 'car conf/topic-templates) (erc-send-message (s-join " " message)))) #+end_src @@ -399,7 +709,7 @@ Another collaborative pad Usage: compress-video.sh input-filename.webm output-filename.webm - #+begin_src sh :tangle compress-video.sh + #+begin_src sh :eval no :tangle compress-video.sh Q=56 nice 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 999 -pass 1 -f webm -threads 8 /dev/null && nice 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 999 -threads 8 $2 @@ -407,7 +717,7 @@ Another collaborative pad Here's the original version which compresses audio too. Usage: compress-video-compressed-audio.sh input-filename.webm output-filename.webm - #+begin_src sh :tangle compress-video-compressed-audio.sh + #+begin_src sh :eval no :tangle compress-video-compressed-audio.sh Q=56 nice 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 999 -pass 1 -f webm -threads 8 /dev/null && nice ffmpeg -y -i $1 -c:v libvpx-vp9 -b:v 0 -crf $Q -aq-mode 2 -c:a libopus -b:a 12k -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 999 -threads 8 $2 @@ -463,6 +773,23 @@ Take advantage of provided scripts or autogenerated files ssh front 'sudo -iu ikiwiki ikiwiki --setup ~ikiwiki/emacsconf.setup' #+end_src + +** COMMENT Copyright & License + + Copyright (C) 2020 Sacha Chua + + The EmacsConf 2020 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 + # Local Variables: # org-indent-mode: t # org-indent-indentation-per-level: 2 diff --git a/2020/submissions.md b/2020/submissions.md index 21d09dfb..64b197ab 100644 --- a/2020/submissions.md +++ b/2020/submissions.md @@ -7,50 +7,53 @@ You can check out the Org Mode source for this page by following the [editing in # Table of Contents -- [Actions](#org7d8cc77) -- [Tables](#orgc89dd54) - - [Overall](#orgf9d7f69) - - [By slot](#org33f7445) - - [Saturday](#org2518c70) - - [Sunday](#org45ee756) - - [Table for all talks](#org7e5fd50) -- [Talks](#orgd54b98f) - - [NOVEMBER 28 (Saturday)](#org68ef6fa):sat: - - [9:00 - 9:30 Opening remarks](#org6a91418) - - [9:30 - 12:00 User talks](#org7f8e774):morning: - - [12:00 - 13:00 Lunch](#org49ea1ed) - - [13:00 - 16:30 Afternoon talks](#orga750a7a):afternoon: - - [16:30 - 17:00 Closing remarks](#org56c93c0) - - [NOVEMBER 29 (Sunday)](#orgea7cab9):sun: - - [9:00 - 9:10 Opening remarks](#orgaa9ea5c) - - [9:10 - 12:00 Morning talks](#org5bba0d4):morning: - - [12:00 - 13:00 Lunch](#orgaaf69b1) - - [13:00 - 16:30 Afternoon talks](#org405c07d):afternoon: - - [16:30 - 17:00 Closing remarks](#orgbfc2b3a) -- [Code](#talk37) - - [Planning](#org70194b9) - - [Generate schedule file](#orgb231870) - - -<a id="org7d8cc77"></a> +- [Actions](#org7281502) +- [Tables](#org105055b) + - [Overall](#org5df6237) + - [By slot](#orge5ba5a0) + - [Saturday](#org1146dd9) + - [Sunday](#org052126b) + - [Table for all talks](#orge6d10a7) +- [Talks](#orgd992caf) + - [NOVEMBER 28 (Saturday)](#org8b4b196):sat: + - [Day 1 opening remarks](#talk00) + - [9:30 - 12:00 User talks](#org3062065):morning: + - [12:00 - 13:00 Lunch](#orgbaf7821) + - [13:00 - 16:30 Afternoon talks](#org02ab8bc):afternoon: + - [Day 1 closing remarks](#talk40) + - [NOVEMBER 29 (Sunday)](#orgf96e9db):sun: + - [Day 2 opening remarks](#talk41) + - [9:10 - 12:00 Morning talks](#org634a83e):morning: + - [12:00 - 13:00 Lunch](#orgf86a59e) + - [13:00 - 16:30 Afternoon talks](#org048b0d0):afternoon: + - [Day 2 closing remarks](#talk42) +- [Code](#orgd51f6e5) + - [Planning](#org6a3d245) + - [Yasnippet for adding video links to the individual talk page](#org3516f2d) + + +<a id="org7281502"></a> # Actions -- [Execute buffer]((org-babel-execute-buffer)) - start with this to get the function definitions +You may want to `(setq org-confirm-babel-evaluate nil)`. + +- [Load code from organizers-notebook.org]((org-babel-load-file "organizers-notebook.org")) - run this to load function definitions or reset conf/info if the talk info changes - [Update talk info]((conf/update-talks)) - run this after changing talk time or order -- [View as agenda]((let ((org-agenda-files (list (buffer-file-name)))) (org-agenda-list nil (org-read-date nil nil "2020-11-28") 2))) -- [Generate schedule files](conf/generate-schedule-files) +- [View as agenda]((let ((org-agenda-skip-function (lambda () (unless (elt (org-heading-components) 2) (org-entry-end-position)))) (org-agenda-files (list (buffer-file-name)))) (org-agenda-list nil (org-read-date nil nil "2020-11-28") 2))) +- [Generate schedule files](conf/generate-schedule-files) - updates schedule-details.md; set conf/autogenerate-talk-pages to t if you want to overwrite individual talk pages too. +- [Export this file to Markdown]((org-md-export-to-markdown)) To update the information included in the individual talk page, execute the buffer, update the talk's info/TALKID.md file. -<a id="orgc89dd54"></a> +<a id="org105055b"></a> # Tables -<a id="orgf9d7f69"></a> +<a id="org5df6237"></a> ## Overall @@ -69,17 +72,17 @@ execute the buffer, update the talk's info/TALKID.md file. <thead> <tr> <th scope="col" class="org-left">DIFFERENCE</th> -<th scope="col" class="org-right">TARGET_TIME</th> -<th scope="col" class="org-right">MIN_TIME_SUM</th> +<th scope="col" class="org-right">TARGET\_TIME</th> +<th scope="col" class="org-right">MIN\_TIME\_SUM</th> <th scope="col" class="org-left">ITEM</th> </tr> </thead> <tbody> <tr> -<td class="org-left">Needs: 99</td> +<td class="org-left">Needs: 112</td> <td class="org-right">768</td> -<td class="org-right">867</td> +<td class="org-right">880</td> <td class="org-left">Talks</td> </tr> @@ -96,7 +99,7 @@ execute the buffer, update the talk's info/TALKID.md file. <td class="org-left"> </td> <td class="org-right"> </td> <td class="org-right"> </td> -<td class="org-left">9:00 - 9:30 Opening remarks</td> +<td class="org-left">Day 1 opening remarks</td> </tr> @@ -128,7 +131,7 @@ execute the buffer, update the talk's info/TALKID.md file. <td class="org-left"> </td> <td class="org-right"> </td> <td class="org-right"> </td> -<td class="org-left">16:30 - 17:00 Closing remarks</td> +<td class="org-left">Day 1 closing remarks</td> </tr> @@ -144,7 +147,7 @@ execute the buffer, update the talk's info/TALKID.md file. <td class="org-left"> </td> <td class="org-right"> </td> <td class="org-right"> </td> -<td class="org-left">9:00 - 9:10 Opening remarks</td> +<td class="org-left">Day 2 opening remarks</td> </tr> @@ -165,9 +168,9 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left">Needs: 12</td> +<td class="org-left">Needs: 25</td> <td class="org-right">168</td> -<td class="org-right">180</td> +<td class="org-right">193</td> <td class="org-left">13:00 - 16:30 Afternoon talks</td> </tr> @@ -176,18 +179,18 @@ execute the buffer, update the talk's info/TALKID.md file. <td class="org-left"> </td> <td class="org-right"> </td> <td class="org-right"> </td> -<td class="org-left">16:30 - 17:00 Closing remarks</td> +<td class="org-left">Day 2 closing remarks</td> </tr> </tbody> </table> -<a id="org33f7445"></a> +<a id="orge5ba5a0"></a> ## By slot -<a id="org2518c70"></a> +<a id="org1146dd9"></a> ### Saturday @@ -219,17 +222,17 @@ execute the buffer, update the talk's info/TALKID.md file. <tbody> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 09:33]–[2020-11-28 Sat 09:43]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 09:33>–<2020-11-28 Sat 09:37></span></span></td> <td class="org-left">Emacs News Highlights</td> <td class="org-left">Sacha Chua</td> - <td class="org-left">planned</td> + <td class="org-left">ready</td> <td class="org-left">prerec, maybe 9am-3pm EST</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 09:46]–[2020-11-28 Sat 10:06]</span></span></td> - <td class="org-left">An Emacs Developer Story: From User to Maintainer</td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 09:40>–<2020-11-28 Sat 10:00></span></span></td> + <td class="org-left">An Emacs Developer Story: From User to Package Maintainer</td> <td class="org-left">Leo Vivier</td> <td class="org-left"> </td> <td class="org-left">9am-12pm EST</td> @@ -237,16 +240,16 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:09]–[2020-11-28 Sat 10:19]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 10:03>–<2020-11-28 Sat 10:13></span></span></td> <td class="org-left">Idea to Novel Superstructure: Emacs for Writing</td> <td class="org-left">Bala Ramadurai</td> - <td class="org-left"> </td> + <td class="org-left">done, live Q&A</td> <td class="org-left">8:30am EST-12pm EST</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:22]–[2020-11-28 Sat 10:32]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 10:16>–<2020-11-28 Sat 10:26></span></span></td> <td class="org-left">Music in Plain Text</td> <td class="org-left">Jonathan Gregory</td> <td class="org-left">planned</td> @@ -255,7 +258,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:35]–[2020-11-28 Sat 10:45]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 10:29>–<2020-11-28 Sat 10:45></span></span></td> <td class="org-left">Bard Bivou(m)acs - Building a bandcamp-like page for an album of music</td> <td class="org-left">Grant Shangreaux</td> <td class="org-left"> </td> @@ -264,36 +267,36 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:48]–[2020-11-28 Sat 10:58]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 10:48>–<2020-11-28 Sat 10:58></span></span></td> <td class="org-left">Trivial Emacs Kits</td> - <td class="org-left">Corwin Brust</td> + <td class="org-left">Corwin Brust (mplsCorwin)</td> <td class="org-left"> </td> <td class="org-left">ok</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:01]–[2020-11-28 Sat 11:21]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 11:01>–<2020-11-28 Sat 11:21></span></span></td> <td class="org-left">Beyond Vim and Emacs: A Scalable UI Paradigm</td> - <td class="org-left">Sid Kasivajhula</td> + <td class="org-left">Sid Kasivajhula (countvajhula)</td> <td class="org-left"> </td> <td class="org-left">PST, so maybe 11 AM EST - 5 PM EST?</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:24]–[2020-11-28 Sat 11:44]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 11:24>–<2020-11-28 Sat 11:44></span></span></td> <td class="org-left">Building reproducible Emacs</td> - <td class="org-left">Andrew Tropin</td> + <td class="org-left">Andrew Tropin (abcdw)</td> <td class="org-left"> </td> <td class="org-left">After 4pm UTC - 11am-5pm EST</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:47]–[2020-11-28 Sat 12:27]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 11:47>–<2020-11-28 Sat 12:27></span></span></td> <td class="org-left">On why most of the best features in eev look like 5-minute hacks</td> - <td class="org-left">Eduardo Ochs</td> + <td class="org-left">Eduardo Ochs (edrx)</td> <td class="org-left">planned</td> <td class="org-left">ok</td> </tr> @@ -328,7 +331,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tbody> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:03]–[2020-11-28 Sat 13:13]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 13:03>–<2020-11-28 Sat 13:13></span></span></td> <td class="org-left">Orgmode - your life in plain text</td> <td class="org-left">Rainer König</td> <td class="org-left"> </td> @@ -337,7 +340,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:16]–[2020-11-28 Sat 13:26]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 13:16>–<2020-11-28 Sat 13:26></span></span></td> <td class="org-left">Lead your future with Org</td> <td class="org-left">Andrea</td> <td class="org-left"> </td> @@ -346,7 +349,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:29]–[2020-11-28 Sat 13:49]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 13:29>–<2020-11-28 Sat 13:49></span></span></td> <td class="org-left">the org-gtd package: opinions about Getting Things Done</td> <td class="org-left">Aldric</td> <td class="org-left"> </td> @@ -355,7 +358,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:52]–[2020-11-28 Sat 14:02]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 13:52>–<2020-11-28 Sat 14:02></span></span></td> <td class="org-left">One Big-ass Org File or multiple tiny ones? Finally, the End of the debate!</td> <td class="org-left">Leo Vivier</td> <td class="org-left"> </td> @@ -364,7 +367,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:05]–[2020-11-28 Sat 14:15]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 14:05>–<2020-11-28 Sat 14:15></span></span></td> <td class="org-left">Experience Report: Steps to "Emacs Hyper Notebooks"</td> <td class="org-left">Joseph Corneli, Raymond Puzio, and Cameron Ray Smith</td> <td class="org-left"> </td> @@ -373,16 +376,16 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:18]–[2020-11-28 Sat 14:38]</span></span></td> - <td class="org-left">Literate Programming in Emacs Org-Mode</td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 14:18>–<2020-11-28 Sat 14:38></span></span></td> + <td class="org-left">README-Driven Design</td> <td class="org-left">Adam Ard</td> - <td class="org-left">planned</td> + <td class="org-left">done</td> <td class="org-left">ok</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:41]–[2020-11-28 Sat 14:51]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 14:41>–<2020-11-28 Sat 14:51></span></span></td> <td class="org-left">Moving from Jekyll to OrgMode, an experience report</td> <td class="org-left">Adolfo Villafiorita</td> <td class="org-left"> </td> @@ -391,7 +394,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:54]–[2020-11-28 Sat 15:14]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 14:54>–<2020-11-28 Sat 15:14></span></span></td> <td class="org-left">Org-roam: Presentation, Demonstration, and What's on the Horizon</td> <td class="org-left">Leo Vivier</td> <td class="org-left"> </td> @@ -400,7 +403,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 15:17]–[2020-11-28 Sat 15:37]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 15:17>–<2020-11-28 Sat 15:37></span></span></td> <td class="org-left">Org-mode and Org-Roam for Scholars and Researchers</td> <td class="org-left">Noorah Alhasan</td> <td class="org-left"> </td> @@ -409,7 +412,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 15:40]–[2020-11-28 Sat 16:00]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 15:40>–<2020-11-28 Sat 16:00></span></span></td> <td class="org-left">Org-roam: Technical Presentation</td> <td class="org-left">Leo Vivier</td> <td class="org-left"> </td> @@ -418,7 +421,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 16:03]–[2020-11-28 Sat 16:13]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 16:03>–<2020-11-28 Sat 16:13></span></span></td> <td class="org-left">Sharing blogs (and more) with org-webring</td> <td class="org-left">Brett Gilio</td> <td class="org-left"> </td> @@ -427,9 +430,9 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 16:16]–[2020-11-28 Sat 16:36]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 16:16>–<2020-11-28 Sat 16:36></span></span></td> <td class="org-left">OMG Macros</td> - <td class="org-left">Corwin Brust</td> + <td class="org-left">Corwin Brust (mplsCorwin)</td> <td class="org-left"> </td> <td class="org-left">ok</td> </tr> @@ -437,7 +440,7 @@ execute the buffer, update the talk's info/TALKID.md file. </table> -<a id="org45ee756"></a> +<a id="org052126b"></a> ### Sunday @@ -469,16 +472,16 @@ execute the buffer, update the talk's info/TALKID.md file. <tbody> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:13]–[2020-11-29 Sun 09:30]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 09:13>–<2020-11-29 Sun 09:30></span></span></td> <td class="org-left">Emacs development update</td> <td class="org-left">John Wiegley</td> - <td class="org-left">planned</td> + <td class="org-left">done</td> <td class="org-left">prerec</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:33]–[2020-11-29 Sun 09:53]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 09:33>–<2020-11-29 Sun 09:53></span></span></td> <td class="org-left">Powering-up Special Blocks</td> <td class="org-left">Musa Al-hassy</td> <td class="org-left"> </td> @@ -487,37 +490,37 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:56]–[2020-11-29 Sun 10:46]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 09:56>–<2020-11-29 Sun 10:46></span></span></td> <td class="org-left">Incremental Parsing with emacs-tree-sitter</td> <td class="org-left">Tuấn-Anh Nguyễn</td> - <td class="org-left">planned</td> + <td class="org-left">24min</td> <td class="org-left">GMT+7, so earlier is better (9:30 EST?). Can pre-record and answer questions.</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 10:49]–[2020-11-29 Sun 11:09]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 10:49>–<2020-11-29 Sun 11:09></span></span></td> <td class="org-left">Analyze code quality through Emacs: a smart forensics approach and the story of a hack</td> <td class="org-left">Andrea</td> - <td class="org-left">planned</td> + <td class="org-left">done</td> <td class="org-left">ok</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 11:12]–[2020-11-29 Sun 11:22]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 11:12>–<2020-11-29 Sun 11:22></span></span></td> <td class="org-left">Traverse complex JSON structures with live feedback</td> <td class="org-left">Zen Monk Alain M. Lafon</td> - <td class="org-left">planned</td> + <td class="org-left">done</td> <td class="org-left">Available both days, birthday on the 28th</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 11:25]–[2020-11-29 Sun 11:45]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 11:25>–<2020-11-29 Sun 11:45></span></span></td> <td class="org-left">NonGNU ELPA</td> <td class="org-left">Richard Stallman</td> - <td class="org-left">planned</td> + <td class="org-left">done</td> <td class="org-left">tbd</td> </tr> </tbody> @@ -551,25 +554,25 @@ execute the buffer, update the talk's info/TALKID.md file. <tbody> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:03]–[2020-11-29 Sun 13:13]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 13:03>–<2020-11-29 Sun 13:13></span></span></td> <td class="org-left">Emacs as a Highschooler: How It Changed My Life</td> <td class="org-left">Pierce Wang</td> - <td class="org-left"> </td> + <td class="org-left">done</td> <td class="org-left">Sun 12pm EST onwards</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:16]–[2020-11-29 Sun 13:26]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 13:16>–<2020-11-29 Sun 13:26></span></span></td> <td class="org-left">State of Retro Gaming in Emacs</td> <td class="org-left">Vasilij "wasamasa" Schneidermann</td> - <td class="org-left"> </td> + <td class="org-left">done</td> <td class="org-left">8am-10pm CET, so 9am-3pm EST</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:29]–[2020-11-29 Sun 14:19]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 13:29>–<2020-11-29 Sun 14:19></span></span></td> <td class="org-left">Welcome To The Dungeon</td> <td class="org-left">Erik Elmshauser and Corwin Brust</td> <td class="org-left"> </td> @@ -578,34 +581,34 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:22]–[2020-11-29 Sun 14:42]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 14:22>–<2020-11-29 Sun 14:42></span></span></td> <td class="org-left">Pathing of Least Resistance</td> - <td class="org-left">Corwin Brust</td> + <td class="org-left">Erik Elmshauser and Corwin Brust (mplsCorwin)</td> <td class="org-left"> </td> <td class="org-left">ok</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:45]–[2020-11-29 Sun 14:55]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 14:45>–<2020-11-29 Sun 14:55></span></span></td> <td class="org-left">A tour of vterm</td> <td class="org-left">Gabriele Bozzola (@sbozzolo)</td> - <td class="org-left">planned</td> + <td class="org-left">done</td> <td class="org-left">MST, so 11am-5pm EST</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:58]–[2020-11-29 Sun 15:08]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 14:58>–<2020-11-29 Sun 15:14></span></span></td> <td class="org-left">Lakota Language and Emacs</td> <td class="org-left">Grant Shangreaux</td> - <td class="org-left">planned</td> + <td class="org-left">done</td> <td class="org-left">Central time, 10am EST-5pm EST</td> </tr> <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:11]–[2020-11-29 Sun 15:31]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 15:17>–<2020-11-29 Sun 15:41></span></span></td> <td class="org-left">Object Oriented Code in the Gnus Newsreader</td> <td class="org-left">Eric Abrahamsen</td> <td class="org-left">planned</td> @@ -614,7 +617,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:34]–[2020-11-29 Sun 15:54]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 15:44>–<2020-11-29 Sun 16:04></span></span></td> <td class="org-left">Maxima a computer algebra system in Emacs</td> <td class="org-left">Fermin MF</td> <td class="org-left"> </td> @@ -623,7 +626,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:57]–[2020-11-29 Sun 16:17]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 16:07>–<2020-11-29 Sun 16:30></span></span></td> <td class="org-left">Extend Emacs to Modern GUI Applications with EAF</td> <td class="org-left">Matthew Zeng</td> <td class="org-left"> </td> @@ -632,17 +635,17 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> - <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 16:20]–[2020-11-29 Sun 16:30]</span></span></td> + <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 16:33>–<2020-11-29 Sun 16:43></span></span></td> <td class="org-left">WAVEing at Repetitive Repetitive Repetitive Music</td> <td class="org-left">Zachary Kanfer</td> - <td class="org-left"> </td> + <td class="org-left">done</td> <td class="org-left">ok</td> </tr> </tbody> </table> -<a id="org7e5fd50"></a> +<a id="orge6d10a7"></a> ## Table for all talks @@ -669,8 +672,8 @@ execute the buffer, update the talk's info/TALKID.md file. <tbody> <tr> -<td class="org-left">planned</td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 09:33]–[2020-11-28 Sat 09:43]</span></span></td> +<td class="org-left">ready</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 09:33>–<2020-11-28 Sat 09:37></span></span></td> <td class="org-left">Emacs News Highlights</td> <td class="org-left">Sacha Chua</td> </tr> @@ -678,15 +681,15 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 09:46]–[2020-11-28 Sat 10:06]</span></span></td> -<td class="org-left">An Emacs Developer Story: From User to Maintainer</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 09:40>–<2020-11-28 Sat 10:00></span></span></td> +<td class="org-left">An Emacs Developer Story: From User to Package Maintainer</td> <td class="org-left">Leo Vivier</td> </tr> <tr> -<td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:09]–[2020-11-28 Sat 10:19]</span></span></td> +<td class="org-left">done, live Q&A</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 10:03>–<2020-11-28 Sat 10:13></span></span></td> <td class="org-left">Idea to Novel Superstructure: Emacs for Writing</td> <td class="org-left">Bala Ramadurai</td> </tr> @@ -694,7 +697,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left">planned</td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:22]–[2020-11-28 Sat 10:32]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 10:16>–<2020-11-28 Sat 10:26></span></span></td> <td class="org-left">Music in Plain Text</td> <td class="org-left">Jonathan Gregory</td> </tr> @@ -702,7 +705,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:35]–[2020-11-28 Sat 10:45]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 10:29>–<2020-11-28 Sat 10:45></span></span></td> <td class="org-left">Bard Bivou(m)acs - Building a bandcamp-like page for an album of music</td> <td class="org-left">Grant Shangreaux</td> </tr> @@ -710,39 +713,39 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:48]–[2020-11-28 Sat 10:58]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 10:48>–<2020-11-28 Sat 10:58></span></span></td> <td class="org-left">Trivial Emacs Kits</td> -<td class="org-left">Corwin Brust</td> +<td class="org-left">Corwin Brust (mplsCorwin)</td> </tr> <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:01]–[2020-11-28 Sat 11:21]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 11:01>–<2020-11-28 Sat 11:21></span></span></td> <td class="org-left">Beyond Vim and Emacs: A Scalable UI Paradigm</td> -<td class="org-left">Sid Kasivajhula</td> +<td class="org-left">Sid Kasivajhula (countvajhula)</td> </tr> <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:24]–[2020-11-28 Sat 11:44]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 11:24>–<2020-11-28 Sat 11:44></span></span></td> <td class="org-left">Building reproducible Emacs</td> -<td class="org-left">Andrew Tropin</td> +<td class="org-left">Andrew Tropin (abcdw)</td> </tr> <tr> <td class="org-left">planned</td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:47]–[2020-11-28 Sat 12:27]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 11:47>–<2020-11-28 Sat 12:27></span></span></td> <td class="org-left">On why most of the best features in eev look like 5-minute hacks</td> -<td class="org-left">Eduardo Ochs</td> +<td class="org-left">Eduardo Ochs (edrx)</td> </tr> <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:03]–[2020-11-28 Sat 13:13]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 13:03>–<2020-11-28 Sat 13:13></span></span></td> <td class="org-left">Orgmode - your life in plain text</td> <td class="org-left">Rainer König</td> </tr> @@ -750,7 +753,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:16]–[2020-11-28 Sat 13:26]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 13:16>–<2020-11-28 Sat 13:26></span></span></td> <td class="org-left">Lead your future with Org</td> <td class="org-left">Andrea</td> </tr> @@ -758,7 +761,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:29]–[2020-11-28 Sat 13:49]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 13:29>–<2020-11-28 Sat 13:49></span></span></td> <td class="org-left">the org-gtd package: opinions about Getting Things Done</td> <td class="org-left">Aldric</td> </tr> @@ -766,7 +769,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:52]–[2020-11-28 Sat 14:02]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 13:52>–<2020-11-28 Sat 14:02></span></span></td> <td class="org-left">One Big-ass Org File or multiple tiny ones? Finally, the End of the debate!</td> <td class="org-left">Leo Vivier</td> </tr> @@ -774,23 +777,23 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:05]–[2020-11-28 Sat 14:15]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 14:05>–<2020-11-28 Sat 14:15></span></span></td> <td class="org-left">Experience Report: Steps to "Emacs Hyper Notebooks"</td> <td class="org-left">Joseph Corneli, Raymond Puzio, and Cameron Ray Smith</td> </tr> <tr> -<td class="org-left">planned</td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:18]–[2020-11-28 Sat 14:38]</span></span></td> -<td class="org-left">Literate Programming in Emacs Org-Mode</td> +<td class="org-left">done</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 14:18>–<2020-11-28 Sat 14:38></span></span></td> +<td class="org-left">README-Driven Design</td> <td class="org-left">Adam Ard</td> </tr> <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:41]–[2020-11-28 Sat 14:51]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 14:41>–<2020-11-28 Sat 14:51></span></span></td> <td class="org-left">Moving from Jekyll to OrgMode, an experience report</td> <td class="org-left">Adolfo Villafiorita</td> </tr> @@ -798,7 +801,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:54]–[2020-11-28 Sat 15:14]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 14:54>–<2020-11-28 Sat 15:14></span></span></td> <td class="org-left">Org-roam: Presentation, Demonstration, and What's on the Horizon</td> <td class="org-left">Leo Vivier</td> </tr> @@ -806,7 +809,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 15:17]–[2020-11-28 Sat 15:37]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 15:17>–<2020-11-28 Sat 15:37></span></span></td> <td class="org-left">Org-mode and Org-Roam for Scholars and Researchers</td> <td class="org-left">Noorah Alhasan</td> </tr> @@ -814,7 +817,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 15:40]–[2020-11-28 Sat 16:00]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 15:40>–<2020-11-28 Sat 16:00></span></span></td> <td class="org-left">Org-roam: Technical Presentation</td> <td class="org-left">Leo Vivier</td> </tr> @@ -822,7 +825,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 16:03]–[2020-11-28 Sat 16:13]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 16:03>–<2020-11-28 Sat 16:13></span></span></td> <td class="org-left">Sharing blogs (and more) with org-webring</td> <td class="org-left">Brett Gilio</td> </tr> @@ -830,15 +833,15 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 16:16]–[2020-11-28 Sat 16:36]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 16:16>–<2020-11-28 Sat 16:36></span></span></td> <td class="org-left">OMG Macros</td> -<td class="org-left">Corwin Brust</td> +<td class="org-left">Corwin Brust (mplsCorwin)</td> </tr> <tr> -<td class="org-left">planned</td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:13]–[2020-11-29 Sun 09:30]</span></span></td> +<td class="org-left">done</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 09:13>–<2020-11-29 Sun 09:30></span></span></td> <td class="org-left">Emacs development update</td> <td class="org-left">John Wiegley</td> </tr> @@ -846,55 +849,55 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:33]–[2020-11-29 Sun 09:53]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 09:33>–<2020-11-29 Sun 09:53></span></span></td> <td class="org-left">Powering-up Special Blocks</td> <td class="org-left">Musa Al-hassy</td> </tr> <tr> -<td class="org-left">planned</td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:56]–[2020-11-29 Sun 10:46]</span></span></td> +<td class="org-left">24min</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 09:56>–<2020-11-29 Sun 10:46></span></span></td> <td class="org-left">Incremental Parsing with emacs-tree-sitter</td> <td class="org-left">Tuấn-Anh Nguyễn</td> </tr> <tr> -<td class="org-left">planned</td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 10:49]–[2020-11-29 Sun 11:09]</span></span></td> +<td class="org-left">done</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 10:49>–<2020-11-29 Sun 11:09></span></span></td> <td class="org-left">Analyze code quality through Emacs: a smart forensics approach and the story of a hack</td> <td class="org-left">Andrea</td> </tr> <tr> -<td class="org-left">planned</td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 11:12]–[2020-11-29 Sun 11:22]</span></span></td> +<td class="org-left">done</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 11:12>–<2020-11-29 Sun 11:22></span></span></td> <td class="org-left">Traverse complex JSON structures with live feedback</td> <td class="org-left">Zen Monk Alain M. Lafon</td> </tr> <tr> -<td class="org-left">planned</td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 11:25]–[2020-11-29 Sun 11:45]</span></span></td> +<td class="org-left">done</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 11:25>–<2020-11-29 Sun 11:45></span></span></td> <td class="org-left">NonGNU ELPA</td> <td class="org-left">Richard Stallman</td> </tr> <tr> -<td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:03]–[2020-11-29 Sun 13:13]</span></span></td> +<td class="org-left">done</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 13:03>–<2020-11-29 Sun 13:13></span></span></td> <td class="org-left">Emacs as a Highschooler: How It Changed My Life</td> <td class="org-left">Pierce Wang</td> </tr> <tr> -<td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:16]–[2020-11-29 Sun 13:26]</span></span></td> +<td class="org-left">done</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 13:16>–<2020-11-29 Sun 13:26></span></span></td> <td class="org-left">State of Retro Gaming in Emacs</td> <td class="org-left">Vasilij "wasamasa" Schneidermann</td> </tr> @@ -902,7 +905,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:29]–[2020-11-29 Sun 14:19]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 13:29>–<2020-11-29 Sun 14:19></span></span></td> <td class="org-left">Welcome To The Dungeon</td> <td class="org-left">Erik Elmshauser and Corwin Brust</td> </tr> @@ -910,23 +913,23 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:22]–[2020-11-29 Sun 14:42]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 14:22>–<2020-11-29 Sun 14:42></span></span></td> <td class="org-left">Pathing of Least Resistance</td> -<td class="org-left">Corwin Brust</td> +<td class="org-left">Erik Elmshauser and Corwin Brust (mplsCorwin)</td> </tr> <tr> -<td class="org-left">planned</td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:45]–[2020-11-29 Sun 14:55]</span></span></td> +<td class="org-left">done</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 14:45>–<2020-11-29 Sun 14:55></span></span></td> <td class="org-left">A tour of vterm</td> <td class="org-left">Gabriele Bozzola (@sbozzolo)</td> </tr> <tr> -<td class="org-left">planned</td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:58]–[2020-11-29 Sun 15:08]</span></span></td> +<td class="org-left">done</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 14:58>–<2020-11-29 Sun 15:14></span></span></td> <td class="org-left">Lakota Language and Emacs</td> <td class="org-left">Grant Shangreaux</td> </tr> @@ -934,7 +937,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left">planned</td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:11]–[2020-11-29 Sun 15:31]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 15:17>–<2020-11-29 Sun 15:41></span></span></td> <td class="org-left">Object Oriented Code in the Gnus Newsreader</td> <td class="org-left">Eric Abrahamsen</td> </tr> @@ -942,7 +945,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:34]–[2020-11-29 Sun 15:54]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 15:44>–<2020-11-29 Sun 16:04></span></span></td> <td class="org-left">Maxima a computer algebra system in Emacs</td> <td class="org-left">Fermin MF</td> </tr> @@ -950,15 +953,15 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> <td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:57]–[2020-11-29 Sun 16:17]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 16:07>–<2020-11-29 Sun 16:30></span></span></td> <td class="org-left">Extend Emacs to Modern GUI Applications with EAF</td> <td class="org-left">Matthew Zeng</td> </tr> <tr> -<td class="org-left"> </td> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 16:20]–[2020-11-29 Sun 16:30]</span></span></td> +<td class="org-left">done</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 16:33>–<2020-11-29 Sun 16:43></span></span></td> <td class="org-left">WAVEing at Repetitive Repetitive Repetitive Music</td> <td class="org-left">Zachary Kanfer</td> </tr> @@ -966,22 +969,22 @@ execute the buffer, update the talk's info/TALKID.md file. </table> -<a id="orgd54b98f"></a> +<a id="orgd992caf"></a> # Talks -<a id="org68ef6fa"></a> +<a id="org8b4b196"></a> ## NOVEMBER 28 (Saturday) :sat: -<a id="org6a91418"></a> +<a id="talk00"></a> -### 9:00 - 9:30 Opening remarks +### Day 1 opening remarks -<a id="org7f8e774"></a> +<a id="org3062065"></a> ### 9:30 - 12:00 User talks :morning: @@ -1037,17 +1040,17 @@ execute the buffer, update the talk's info/TALKID.md file. <tbody> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 09:33]–[2020-11-28 Sat 09:43]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 09:33>–<2020-11-28 Sat 09:37></span></span></td> <td class="org-left">Emacs News Highlights</td> <td class="org-left">Sacha Chua</td> -<td class="org-left">planned</td> +<td class="org-left">ready</td> <td class="org-left">prerec, maybe 9am-3pm EST</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 09:46]–[2020-11-28 Sat 10:06]</span></span></td> -<td class="org-left">An Emacs Developer Story: From User to Maintainer</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 09:40>–<2020-11-28 Sat 10:00></span></span></td> +<td class="org-left">An Emacs Developer Story: From User to Package Maintainer</td> <td class="org-left">Leo Vivier</td> <td class="org-left"> </td> <td class="org-left">9am-12pm EST</td> @@ -1055,16 +1058,16 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:09]–[2020-11-28 Sat 10:19]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 10:03>–<2020-11-28 Sat 10:13></span></span></td> <td class="org-left">Idea to Novel Superstructure: Emacs for Writing</td> <td class="org-left">Bala Ramadurai</td> -<td class="org-left"> </td> +<td class="org-left">done, live Q&A</td> <td class="org-left">8:30am EST-12pm EST</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:22]–[2020-11-28 Sat 10:32]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 10:16>–<2020-11-28 Sat 10:26></span></span></td> <td class="org-left">Music in Plain Text</td> <td class="org-left">Jonathan Gregory</td> <td class="org-left">planned</td> @@ -1073,7 +1076,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:35]–[2020-11-28 Sat 10:45]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 10:29>–<2020-11-28 Sat 10:45></span></span></td> <td class="org-left">Bard Bivou(m)acs - Building a bandcamp-like page for an album of music</td> <td class="org-left">Grant Shangreaux</td> <td class="org-left"> </td> @@ -1082,36 +1085,36 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:48]–[2020-11-28 Sat 10:58]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 10:48>–<2020-11-28 Sat 10:58></span></span></td> <td class="org-left">Trivial Emacs Kits</td> -<td class="org-left">Corwin Brust</td> +<td class="org-left">Corwin Brust (mplsCorwin)</td> <td class="org-left"> </td> <td class="org-left">ok</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:01]–[2020-11-28 Sat 11:21]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 11:01>–<2020-11-28 Sat 11:21></span></span></td> <td class="org-left">Beyond Vim and Emacs: A Scalable UI Paradigm</td> -<td class="org-left">Sid Kasivajhula</td> +<td class="org-left">Sid Kasivajhula (countvajhula)</td> <td class="org-left"> </td> <td class="org-left">PST, so maybe 11 AM EST - 5 PM EST?</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:24]–[2020-11-28 Sat 11:44]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 11:24>–<2020-11-28 Sat 11:44></span></span></td> <td class="org-left">Building reproducible Emacs</td> -<td class="org-left">Andrew Tropin</td> +<td class="org-left">Andrew Tropin (abcdw)</td> <td class="org-left"> </td> <td class="org-left">After 4pm UTC - 11am-5pm EST</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:47]–[2020-11-28 Sat 12:27]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 11:47>–<2020-11-28 Sat 12:27></span></span></td> <td class="org-left">On why most of the best features in eev look like 5-minute hacks</td> -<td class="org-left">Eduardo Ochs</td> +<td class="org-left">Eduardo Ochs (edrx)</td> <td class="org-left">planned</td> <td class="org-left">ok</td> </tr> @@ -1180,7 +1183,7 @@ execute the buffer, update the talk's info/TALKID.md file. sublicensable to the EmacsConf organizers or that my use of them is fair use. - - in-progress An Emacs Developer Story: From User to Maintainer :standard:user:community: + - in-progress An Emacs Developer Story: From User to Package Maintainer :standard:user:community: Name: Leo Vivier @@ -1243,7 +1246,7 @@ execute the buffer, update the talk's info/TALKID.md file. - Exploring Emacs's flexibility - - in-progress Idea to Novel Superstructure: Emacs for Writing :standard:lightning:user: + - ready Idea to Novel Superstructure: Emacs for Writing :standard:lightning:user: Name: Bala Ramadurai @@ -1718,12 +1721,12 @@ execute the buffer, update the talk's info/TALKID.md file. fair use. -<a id="org49ea1ed"></a> +<a id="orgbaf7821"></a> ### 12:00 - 13:00 Lunch -<a id="orga750a7a"></a> +<a id="org02ab8bc"></a> ### 13:00 - 16:30 Afternoon talks :afternoon: @@ -1779,7 +1782,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tbody> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:03]–[2020-11-28 Sat 13:13]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 13:03>–<2020-11-28 Sat 13:13></span></span></td> <td class="org-left">Orgmode - your life in plain text</td> <td class="org-left">Rainer König</td> <td class="org-left"> </td> @@ -1788,7 +1791,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:16]–[2020-11-28 Sat 13:26]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 13:16>–<2020-11-28 Sat 13:26></span></span></td> <td class="org-left">Lead your future with Org</td> <td class="org-left">Andrea</td> <td class="org-left"> </td> @@ -1797,7 +1800,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:29]–[2020-11-28 Sat 13:49]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 13:29>–<2020-11-28 Sat 13:49></span></span></td> <td class="org-left">the org-gtd package: opinions about Getting Things Done</td> <td class="org-left">Aldric</td> <td class="org-left"> </td> @@ -1806,7 +1809,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:52]–[2020-11-28 Sat 14:02]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 13:52>–<2020-11-28 Sat 14:02></span></span></td> <td class="org-left">One Big-ass Org File or multiple tiny ones? Finally, the End of the debate!</td> <td class="org-left">Leo Vivier</td> <td class="org-left"> </td> @@ -1815,7 +1818,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:05]–[2020-11-28 Sat 14:15]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 14:05>–<2020-11-28 Sat 14:15></span></span></td> <td class="org-left">Experience Report: Steps to "Emacs Hyper Notebooks"</td> <td class="org-left">Joseph Corneli, Raymond Puzio, and Cameron Ray Smith</td> <td class="org-left"> </td> @@ -1824,16 +1827,16 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:18]–[2020-11-28 Sat 14:38]</span></span></td> -<td class="org-left">Literate Programming in Emacs Org-Mode</td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 14:18>–<2020-11-28 Sat 14:38></span></span></td> +<td class="org-left">README-Driven Design</td> <td class="org-left">Adam Ard</td> -<td class="org-left">planned</td> +<td class="org-left">done</td> <td class="org-left">ok</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:41]–[2020-11-28 Sat 14:51]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 14:41>–<2020-11-28 Sat 14:51></span></span></td> <td class="org-left">Moving from Jekyll to OrgMode, an experience report</td> <td class="org-left">Adolfo Villafiorita</td> <td class="org-left"> </td> @@ -1842,7 +1845,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:54]–[2020-11-28 Sat 15:14]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 14:54>–<2020-11-28 Sat 15:14></span></span></td> <td class="org-left">Org-roam: Presentation, Demonstration, and What's on the Horizon</td> <td class="org-left">Leo Vivier</td> <td class="org-left"> </td> @@ -1851,7 +1854,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 15:17]–[2020-11-28 Sat 15:37]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 15:17>–<2020-11-28 Sat 15:37></span></span></td> <td class="org-left">Org-mode and Org-Roam for Scholars and Researchers</td> <td class="org-left">Noorah Alhasan</td> <td class="org-left"> </td> @@ -1860,7 +1863,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 15:40]–[2020-11-28 Sat 16:00]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 15:40>–<2020-11-28 Sat 16:00></span></span></td> <td class="org-left">Org-roam: Technical Presentation</td> <td class="org-left">Leo Vivier</td> <td class="org-left"> </td> @@ -1869,7 +1872,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 16:03]–[2020-11-28 Sat 16:13]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 16:03>–<2020-11-28 Sat 16:13></span></span></td> <td class="org-left">Sharing blogs (and more) with org-webring</td> <td class="org-left">Brett Gilio</td> <td class="org-left"> </td> @@ -1878,9 +1881,9 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 16:16]–[2020-11-28 Sat 16:36]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-28 Sat 16:16>–<2020-11-28 Sat 16:36></span></span></td> <td class="org-left">OMG Macros</td> -<td class="org-left">Corwin Brust</td> +<td class="org-left">Corwin Brust (mplsCorwin)</td> <td class="org-left"> </td> <td class="org-left">ok</td> </tr> @@ -2197,7 +2200,7 @@ execute the buffer, update the talk's info/TALKID.md file. sublicensable to the EmacsConf organizers or that my use of them is fair use. -- in-progress README-Driven Design :extended:standard:org:tutorial: +- ready README-Driven Design :extended:standard:org:tutorial: Name: Adam Ard @@ -2623,22 +2626,22 @@ execute the buffer, update the talk's info/TALKID.md file. fair use. -<a id="org56c93c0"></a> +<a id="talk40"></a> -### 16:30 - 17:00 Closing remarks +### Day 1 closing remarks -<a id="orgea7cab9"></a> +<a id="orgf96e9db"></a> ## NOVEMBER 29 (Sunday) :sun: -<a id="orgaa9ea5c"></a> +<a id="talk41"></a> -### 9:00 - 9:10 Opening remarks +### Day 2 opening remarks -<a id="org5bba0d4"></a> +<a id="org634a83e"></a> ### 9:10 - 12:00 Morning talks :morning: @@ -2694,16 +2697,16 @@ execute the buffer, update the talk's info/TALKID.md file. <tbody> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:13]–[2020-11-29 Sun 09:30]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 09:13>–<2020-11-29 Sun 09:30></span></span></td> <td class="org-left">Emacs development update</td> <td class="org-left">John Wiegley</td> -<td class="org-left">planned</td> +<td class="org-left">done</td> <td class="org-left">prerec</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:33]–[2020-11-29 Sun 09:53]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 09:33>–<2020-11-29 Sun 09:53></span></span></td> <td class="org-left">Powering-up Special Blocks</td> <td class="org-left">Musa Al-hassy</td> <td class="org-left"> </td> @@ -2712,37 +2715,37 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:56]–[2020-11-29 Sun 10:46]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 09:56>–<2020-11-29 Sun 10:46></span></span></td> <td class="org-left">Incremental Parsing with emacs-tree-sitter</td> <td class="org-left">Tuấn-Anh Nguyễn</td> -<td class="org-left">planned</td> +<td class="org-left">24min</td> <td class="org-left">GMT+7, so earlier is better (9:30 EST?). Can pre-record and answer questions.</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 10:49]–[2020-11-29 Sun 11:09]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 10:49>–<2020-11-29 Sun 11:09></span></span></td> <td class="org-left">Analyze code quality through Emacs: a smart forensics approach and the story of a hack</td> <td class="org-left">Andrea</td> -<td class="org-left">planned</td> +<td class="org-left">done</td> <td class="org-left">ok</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 11:12]–[2020-11-29 Sun 11:22]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 11:12>–<2020-11-29 Sun 11:22></span></span></td> <td class="org-left">Traverse complex JSON structures with live feedback</td> <td class="org-left">Zen Monk Alain M. Lafon</td> -<td class="org-left">planned</td> +<td class="org-left">done</td> <td class="org-left">Available both days, birthday on the 28th</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 11:25]–[2020-11-29 Sun 11:45]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 11:25>–<2020-11-29 Sun 11:45></span></span></td> <td class="org-left">NonGNU ELPA</td> <td class="org-left">Richard Stallman</td> -<td class="org-left">planned</td> +<td class="org-left">done</td> <td class="org-left">tbd</td> </tr> </tbody> @@ -2797,9 +2800,7 @@ execute the buffer, update the talk's info/TALKID.md file. defaults to 2 when not given. <div class="stutter"> - <p> Emacs for the win ⌣̈ - </p> </div> @@ -2869,6 +2870,8 @@ execute the buffer, update the talk's info/TALKID.md file. Name: Tuấn-Anh Nguyễn + prerec and live Q&A + - Preferred format 50 minutes (Extended talk) @@ -3050,12 +3053,12 @@ execute the buffer, update the talk's info/TALKID.md file. TBD - plans for a NonGNU ELPA that will be easy to enable and contribute to without signing copyright assignment papers -<a id="orgaaf69b1"></a> +<a id="orgf86a59e"></a> ### 12:00 - 13:00 Lunch -<a id="org405c07d"></a> +<a id="org048b0d0"></a> ### 13:00 - 16:30 Afternoon talks :afternoon: @@ -3078,8 +3081,8 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-right">-12</td> -<td class="org-right">180</td> +<td class="org-right">-25</td> +<td class="org-right">193</td> <td class="org-right">168</td> </tr> </tbody> @@ -3111,25 +3114,25 @@ execute the buffer, update the talk's info/TALKID.md file. <tbody> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:03]–[2020-11-29 Sun 13:13]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 13:03>–<2020-11-29 Sun 13:13></span></span></td> <td class="org-left">Emacs as a Highschooler: How It Changed My Life</td> <td class="org-left">Pierce Wang</td> -<td class="org-left"> </td> +<td class="org-left">done</td> <td class="org-left">Sun 12pm EST onwards</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:16]–[2020-11-29 Sun 13:26]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 13:16>–<2020-11-29 Sun 13:26></span></span></td> <td class="org-left">State of Retro Gaming in Emacs</td> <td class="org-left">Vasilij "wasamasa" Schneidermann</td> -<td class="org-left"> </td> +<td class="org-left">done</td> <td class="org-left">8am-10pm CET, so 9am-3pm EST</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:29]–[2020-11-29 Sun 14:19]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 13:29>–<2020-11-29 Sun 14:19></span></span></td> <td class="org-left">Welcome To The Dungeon</td> <td class="org-left">Erik Elmshauser and Corwin Brust</td> <td class="org-left"> </td> @@ -3138,34 +3141,34 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:22]–[2020-11-29 Sun 14:42]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 14:22>–<2020-11-29 Sun 14:42></span></span></td> <td class="org-left">Pathing of Least Resistance</td> -<td class="org-left">Corwin Brust</td> +<td class="org-left">Erik Elmshauser and Corwin Brust (mplsCorwin)</td> <td class="org-left"> </td> <td class="org-left">ok</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:45]–[2020-11-29 Sun 14:55]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 14:45>–<2020-11-29 Sun 14:55></span></span></td> <td class="org-left">A tour of vterm</td> <td class="org-left">Gabriele Bozzola (@sbozzolo)</td> -<td class="org-left">planned</td> +<td class="org-left">done</td> <td class="org-left">MST, so 11am-5pm EST</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:58]–[2020-11-29 Sun 15:08]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 14:58>–<2020-11-29 Sun 15:14></span></span></td> <td class="org-left">Lakota Language and Emacs</td> <td class="org-left">Grant Shangreaux</td> -<td class="org-left">planned</td> +<td class="org-left">done</td> <td class="org-left">Central time, 10am EST-5pm EST</td> </tr> <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:11]–[2020-11-29 Sun 15:31]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 15:17>–<2020-11-29 Sun 15:41></span></span></td> <td class="org-left">Object Oriented Code in the Gnus Newsreader</td> <td class="org-left">Eric Abrahamsen</td> <td class="org-left">planned</td> @@ -3174,7 +3177,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:34]–[2020-11-29 Sun 15:54]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 15:44>–<2020-11-29 Sun 16:04></span></span></td> <td class="org-left">Maxima a computer algebra system in Emacs</td> <td class="org-left">Fermin MF</td> <td class="org-left"> </td> @@ -3183,7 +3186,7 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:57]–[2020-11-29 Sun 16:17]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 16:07>–<2020-11-29 Sun 16:30></span></span></td> <td class="org-left">Extend Emacs to Modern GUI Applications with EAF</td> <td class="org-left">Matthew Zeng</td> <td class="org-left"> </td> @@ -3192,10 +3195,10 @@ execute the buffer, update the talk's info/TALKID.md file. <tr> -<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 16:20]–[2020-11-29 Sun 16:30]</span></span></td> +<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp"><2020-11-29 Sun 16:33>–<2020-11-29 Sun 16:43></span></span></td> <td class="org-left">WAVEing at Repetitive Repetitive Repetitive Music</td> <td class="org-left">Zachary Kanfer</td> -<td class="org-left"> </td> +<td class="org-left">done</td> <td class="org-left">ok</td> </tr> </tbody> @@ -3389,7 +3392,7 @@ execute the buffer, update the talk's info/TALKID.md file. - in-progress Pathing of Least Resistance :standard:elisp: - Name: Corwin Brust + Name: Erik Elmshauser and Corwin Brust (mplsCorwin) - Preferred format @@ -3819,9 +3822,9 @@ execute the buffer, update the talk's info/TALKID.md file. fair use. -<a id="orgbfc2b3a"></a> +<a id="talk42"></a> -### 16:30 - 17:00 Closing remarks +### Day 2 closing remarks # Withdrawn @@ -3882,12 +3885,12 @@ sublicensable to the EmacsConf organizers or that my use of them is fair use. -<a id="talk37"></a> +<a id="orgd51f6e5"></a> # Code -<a id="org70194b9"></a> +<a id="org6a3d245"></a> ## Planning @@ -3902,241 +3905,22 @@ the target time. (org-entry-get (point) "MIN_TIME_SUM") (org-entry-get (point) "TARGET_TIME"))) -Some conference-related functions - - (defun conf/assign-ids () - "Assign numeric talk IDs." - (interactive) - (goto-char (point-min)) - ;; Determine the maximum ID assigned so far - (let ((id - (1+ - (apply 'max - (or (mapcar - 'string-to-number - (org-map-entries - (lambda () - (let ((org-trust-scanner-tags t)) - (org-entry-get (point) "TALK_ID"))) "TALK_ID>0" 'file)) - '(0)))))) - (goto-char (point-min)) - (while (re-search-forward ":NAME: " nil t) - (unless (org-entry-get (point) "TALK_ID") - (org-set-property "TALK_ID" (format "%02d" id)) - (org-set-property "CUSTOM_ID" (format "talk%02d" id)) - (setq id (1+ id)))))) - - (defun conf/update-talks () - (interactive) - (save-excursion - (conf/update-times) - (conf/update-tables) - (conf/update-schedules))) - - (defun conf/update-times () - (goto-char (point-min)) - (org-map-entries - (lambda () - (when (org-entry-get (point) "TARGET_TIME") - (conf/org-sum-min-time-in-subtree) - (org-entry-put - (point) - "DIFFERENCE" - (let ((diff - (- - (string-to-number (org-entry-get (point) "TARGET_TIME")) - (string-to-number (org-entry-get (point) "MIN_TIME_SUM"))))) - (cond - ((> diff 0) (format "Extra: %d" diff)) - ((< diff 0) (format "Needs: %d" (- diff))) - (t "")))))) nil 'file)) - (defun conf/update-tables () - (goto-char (point-min)) - (while (re-search-forward "#\\+CALL: check_time()" nil t) - (org-ctrl-c-ctrl-c)) - (goto-char (point-min)) - (while (re-search-forward "#\\+BEGIN: columnview" nil t) - (org-ctrl-c-ctrl-c))) - (defun conf/update-schedules () - (interactive) - (goto-char (org-find-exact-headline-in-buffer "Talks")) - (let (current-time scheduled end-time duration (buffer (seconds-to-time (* 3 60)))) ;; assumption: 3 minutes between talks - (org-map-entries (lambda () - (if (org-entry-get (point) "FIXED_TIME") - (setq current-time (org-get-scheduled-time (point)))) - (when (org-entry-get (point) "MIN_TIME") - (setq duration (* (string-to-number (org-entry-get (point) "MIN_TIME")) 60) - end-time (time-add current-time (seconds-to-time duration))) - (org-set-property "SCHEDULED" (format "%s-%s" (org-format-time-string "%Y-%m-%d %H:%M" current-time) - (org-format-time-string "%H:%M" end-time))) - (setq current-time (time-add end-time buffer)))) - nil 'tree))) - - (defun conf/org-sum-min-time-in-subtree () - "Add up all the MIN_TIME properties of headings underneath the current one - The total is written to the MIN_TIME_SUM property of this heading" - (interactive) - (org-entry-put - (point) - "MIN_TIME_SUM" - (save-excursion - (format "%d" - (apply - '+ - (mapcar 'string-to-number - (delq nil - (org-map-entries - (lambda () (org-entry-get (point) "MIN_TIME")) nil 'tree)))))))) - - -<a id="orgb231870"></a> - -## Generate schedule file - - (defvar conf/timezones '("EST" "America/Los_Angeles" "UTC" "CET" "Asia/Singapore") "List of timezones") - - (defun conf/get-talk-info () - (let (talk results) - (org-map-entries (lambda () - (let ((heading (org-heading-components))) - (cond - ((and (elt heading 2) (or (null talk) - (<= (car heading) - (plist-get talk :level)))) ;; has a todo, therefore is a talk - (when talk (setq results (cons talk results))) - (setq talk (list - :type 'talk - :title (elt heading 4) - :talk-id (org-entry-get (point) "TALK_ID") - :status (elt heading 2) - :level (car heading) - :scheduled (org-entry-get (point) "SCHEDULED") - :time (org-entry-get (point) "MIN_TIME") - :speakers (org-entry-get (point) "NAME")))) - ((string-match "^ *Talk information *$" (elt heading 4)) - (plist-put talk :info - (org-export-as 'md t nil t))) - ((or (null talk) (< (car heading) (plist-get talk :level))) ;; heading above - (when talk - (setq results (cons talk results)) - (setq talk nil)) - (setq results (cons - (list :type 'headline - :level (car heading) - :title (elt heading 4) - :scheduled (org-entry-get (point) "SCHEDULED")) - results)))))) - nil 'tree) - (when talk (setq results (cons talk results))) - (reverse results))) - - (defun conf/filter-talks (list) - "Return only talk info in LIST." - (seq-filter - (lambda (talk) (eq (plist-get talk :type) 'talk)) - list)) - - (defun conf/format-talk-link (talk) - (and talk (format "<a href=\"/2020/schedule/%s\">%s</a>" - (plist-get talk :talk-id) - (plist-get talk :title)))) - - (defun conf/format-talk-info-as-schedule (info) - (format "<table width=\"100%%\">%s</table>" - (mapconcat - (lambda (o) - (let* ((time-fmt "%l:%M %p") - (timestamp (org-timestamp-from-string (plist-get o :scheduled))) - (start (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp))) "")) - (end (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp t))) "")) - (title (plist-get o :title)) - (speakers (plist-get o :speakers))) - (if (eq (plist-get o :type) 'headline) - (format "<tr><td colspan=\"4\"><strong>%s<strong></td></tr>" - title) - (format "<tr><td width=100>%s</td><td width=100>%s</td><td>%s</td><td>%s</td></tr>" - start end (conf/format-talk-link o) speakers)))) (cdr info) "\n"))) - - (defun conf/filter-talks (info) - (seq-filter (lambda (o) (eq (plist-get o :type) 'talk)) info)) - - (defun conf/split-out-talk-information () - (interactive) - (let ((talks (conf/filter-talks (conf/get-talk-info-from-file)))) - (mapc (lambda (o) - (with-temp-buffer - (insert - (format "# %s\n%s\n\n%s" - (plist-get o :title) - (plist-get o :speakers) - (plist-get o :info))) - (write-file (expand-file-name (format "%s.md" (plist-get o :talk-id)) "info")))) - talks))) - - (defun conf/format-talk-pages (info) - (let* ((talks (conf/filter-talks info)) - (next-talks (cdr talks)) - (prev-talks (cons nil talks))) - (mapc (lambda (o) - (with-temp-buffer - (let* ((timestamp (org-timestamp-from-string (plist-get o :scheduled))) - (next-talk (conf/format-talk-link (pop next-talks))) - (prev-talk (conf/format-talk-link (pop prev-talks))) - (nav-links (format "Back to the [[schedule]] \n%s%s" - (if prev-talk (format "Previous: %s \n" prev-talk) "") - (if next-talk (format "Next: %s \n" next-talk) "")))) - (insert (format "[[%s title=\"%s\"]] - [[%s copyright=\"Copyright © 2020 %s\"]] - - <!-- To edit the talk information, change /2020/info/TALKID.md. Boilerplate automatically generated from submissions.org using conf/generate-schedule-files --->\n - - %s - - [[!inline pages=\"internal(2020/info/%s)\" raw=\"yes\"]] - - %s - - %s - - All times are approximate, and we might shuffle talks around as needed. - Please check <https://emacsconf.org/2020> a few days before the start of the - conference for instructions on how to watch and participate. See you then! - " - "!meta" - (replace-regexp-in-string "\"" "\\\\\"" (plist-get o :title)) - "!meta" - (plist-get o :speakers) - nav-links - (plist-get o :talk-id) - (mapconcat - (lambda (tz) - (format "%s - %s" - (format-time-string "%A, %b %e %Y, %l:%M %p" - (org-timestamp-to-time (org-timestamp-split-range timestamp)) tz) - (format-time-string "%l:%M %p %Z" - (org-timestamp-to-time (org-timestamp-split-range timestamp t)) tz))) - conf/timezones - " \n") - nav-links))) - (write-file (format "schedule/%s.md" (plist-get o :talk-id))))) - talks))) - - (defun conf/get-talk-info-from-file (&optional filename) - (with-temp-buffer - (insert-file-contents (or filename "submissions.org")) - (org-mode) - (org-show-all) - (goto-char (point-min)) - (goto-char (org-find-property "ID" "talks")) - (conf/get-talk-info))) - - (defun conf/generate-schedule-files (&optional filename) - (interactive) - (let ((info (conf/get-talk-info-from-file filename))) - (with-temp-buffer - (insert (conf/format-talk-info-as-schedule info)) - (write-file "schedule-details.txt")) - (conf/format-talk-pages info) - (with-current-buffer (find-file "schedule.org") - (org-export-to-file 'md "schedule.md")))) + +<a id="org3516f2d"></a> + +## Yasnippet for adding video links to the individual talk page + + # -*- mode: snippet -*- + # name: vid + # key: vid + # -- + [[!template id=vid src="`(current-kill 0)`"]] + [Download $2.webm video, 720p, $1](`(current-kill 0)`) + +or with the source code from the directory listing: + + (while (re-search-forward "<a href=\"\\(.*\\)?\">.*?\\([0-9]+[MB]\\)" nil t) + (replace-match "[[!template id=vid src=\"https://mirror.csclub.uwaterloo.ca/emacsconf/2020/\\1\"]] + [Download .webm video, 720p, \\2B](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/\\1) + ")) diff --git a/2020/submissions.org b/2020/submissions.org index e6a41970..5d7416f7 100644 --- a/2020/submissions.org +++ b/2020/submissions.org @@ -12,13 +12,15 @@ You can check out the Org Mode source for this page by following the [[https://e #+TOC: headlines 3 - * Actions -- [[elisp:(org-babel-execute-buffer)][Execute buffer]] - start with this to get the function definitions +You may want to =(setq org-confirm-babel-evaluate nil)=. + +- [[elisp:(org-babel-load-file "organizers-notebook.org")][Load code from organizers-notebook.org]] - run this to load function definitions or reset conf/info if the talk info changes - [[elisp:(conf/update-talks)][Update talk info]] - run this after changing talk time or order - [[elisp:(let ((org-agenda-skip-function (lambda () (unless (elt (org-heading-components) 2) (org-entry-end-position)))) (org-agenda-files (list (buffer-file-name)))) (org-agenda-list nil (org-read-date nil nil "2020-11-28") 2))][View as agenda]] -- [[elisp:conf/generate-schedule-files][Generate schedule files]] +- [[elisp:conf/generate-schedule-files][Generate schedule files]] - updates schedule-details.md; set conf/autogenerate-talk-pages to t if you want to overwrite individual talk pages too. +- [[elisp:(org-md-export-to-markdown)][Export this file to Markdown]] To update the information included in the individual talk page, execute the buffer, update the talk's info/TALKID.md file. @@ -32,17 +34,17 @@ execute the buffer, update the talk's info/TALKID.md file. |------------+-------------+--------------+-------------------------------| | Needs: 112 | 768 | 880 | Talks | | | | | NOVEMBER 28 (Saturday) | -| | | | 9:00 - 9:30 Opening remarks | +| | | | Day 1 opening remarks | | Needs: 30 | 120 | 150 | 9:30 - 12:00 User talks | | | | | 12:00 - 13:00 Lunch | | Needs: 12 | 168 | 180 | 13:00 - 16:30 Afternoon talks | -| | | | 16:30 - 17:00 Closing remarks | +| | | | Day 1 closing remarks | | | | | NOVEMBER 29 (Sunday) | -| | | | 9:00 - 9:10 Opening remarks | +| | | | Day 2 opening remarks | | Extra: 3 | 140 | 137 | 9:10 - 12:00 Morning talks | | | | | 12:00 - 13:00 Lunch | | Needs: 25 | 168 | 193 | 13:00 - 16:30 Afternoon talks | -| | | | 16:30 - 17:00 Closing remarks | +| | | | Day 2 closing remarks | #+END: ** By slot @@ -52,17 +54,17 @@ execute the buffer, update the talk's info/TALKID.md file. **** 9:30 - 12:00 User talks :morning: #+BEGIN: columnview :hlines 1 :id "talks" :format "%SCHEDULED%20ITEM%NAME%PREREC%AVAILABILITY" :match "sat+morning/!" -| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY | -|------------------------------+------------------------------------------------------------------------+-----------------------------+----------------+-------------------------------------| -| <2020-11-28 Sat 09:33-09:37> | Emacs News Highlights | Sacha Chua | ready | prerec, maybe 9am-3pm EST | -| <2020-11-28 Sat 09:40-10:00> | An Emacs Developer Story: From User to Package Maintainer | Leo Vivier | | 9am-12pm EST | -| <2020-11-28 Sat 10:03-10:13> | Idea to Novel Superstructure: Emacs for Writing | Bala Ramadurai | done, live Q&A | 8:30am EST-12pm EST | -| <2020-11-28 Sat 10:16-10:26> | Music in Plain Text | Jonathan Gregory | planned | ok | -| <2020-11-28 Sat 10:29-10:45> | Bard Bivou(m)acs - Building a bandcamp-like page for an album of music | Grant Shangreaux | | 10am-5pm EST, daylight Central US | -| <2020-11-28 Sat 10:48-10:58> | Trivial Emacs Kits | Corwin Brust | | ok | -| <2020-11-28 Sat 11:01-11:21> | Beyond Vim and Emacs: A Scalable UI Paradigm | Sid Kasivajhula (countvaj`) | | PST, so maybe 11 AM EST - 5 PM EST? | -| <2020-11-28 Sat 11:24-11:44> | Building reproducible Emacs | Andrew Tropin (abcdw) | | After 4pm UTC - 11am-5pm EST | -| <2020-11-28 Sat 11:47-12:27> | On why most of the best features in eev look like 5-minute hacks | Eduardo Ochs (edrx) | planned | ok | +| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY | +|------------------------------+------------------------------------------------------------------------+--------------------------------+----------------+-------------------------------------| +| <2020-11-28 Sat 09:33-09:37> | Emacs News Highlights | Sacha Chua | ready | prerec, maybe 9am-3pm EST | +| <2020-11-28 Sat 09:40-10:00> | An Emacs Developer Story: From User to Package Maintainer | Leo Vivier | | 9am-12pm EST | +| <2020-11-28 Sat 10:03-10:13> | Idea to Novel Superstructure: Emacs for Writing | Bala Ramadurai | done, live Q&A | 8:30am EST-12pm EST | +| <2020-11-28 Sat 10:16-10:26> | Music in Plain Text | Jonathan Gregory | planned | ok | +| <2020-11-28 Sat 10:29-10:45> | Bard Bivou(m)acs - Building a bandcamp-like page for an album of music | Grant Shangreaux | | 10am-5pm EST, daylight Central US | +| <2020-11-28 Sat 10:48-10:58> | Trivial Emacs Kits | Corwin Brust (mplsCorwin) | | ok | +| <2020-11-28 Sat 11:01-11:21> | Beyond Vim and Emacs: A Scalable UI Paradigm | Sid Kasivajhula (countvajhula) | | PST, so maybe 11 AM EST - 5 PM EST? | +| <2020-11-28 Sat 11:24-11:44> | Building reproducible Emacs | Andrew Tropin (abcdw) | | After 4pm UTC - 11am-5pm EST | +| <2020-11-28 Sat 11:47-12:27> | On why most of the best features in eev look like 5-minute hacks | Eduardo Ochs (edrx) | planned | ok | #+END: **** 13:00 - 16:30 Afternoon talks :afternoon: @@ -81,7 +83,7 @@ execute the buffer, update the talk's info/TALKID.md file. | <2020-11-28 Sat 15:17-15:37> | Org-mode and Org-Roam for Scholars and Researchers | Noorah Alhasan | | ok | | <2020-11-28 Sat 15:40-16:00> | Org-roam: Technical Presentation | Leo Vivier | | 2:30-ish EST ok with tea; in CET timezone | | <2020-11-28 Sat 16:03-16:13> | Sharing blogs (and more) with org-webring | Brett Gilio | | ok | -| <2020-11-28 Sat 16:16-16:36> | OMG Macros | Corwin Brust | | ok | +| <2020-11-28 Sat 16:16-16:36> | OMG Macros | Corwin Brust (mplsCorwin) | | ok | #+END: *** Sunday @@ -102,18 +104,18 @@ execute the buffer, update the talk's info/TALKID.md file. **** 13:00 - 16:30 Afternoon talks :afternoon: #+BEGIN: columnview :hlines 1 :id "talks" :format "%SCHEDULED%20ITEM%NAME%PREREC%AVAILABILITY" :match "sun+afternoon/!" -| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY | -|------------------------------+---------------------------------------------------+----------------------------------+---------+----------------------------------------------------------------------------| -| <2020-11-29 Sun 13:03-13:13> | Emacs as a Highschooler: How It Changed My Life | Pierce Wang | done | Sun 12pm EST onwards | -| <2020-11-29 Sun 13:16-13:26> | State of Retro Gaming in Emacs | Vasilij "wasamasa" Schneidermann | done | 8am-10pm CET, so 9am-3pm EST | -| <2020-11-29 Sun 13:29-14:19> | Welcome To The Dungeon | Erik Elmshauser and Corwin Brust | | ok | -| <2020-11-29 Sun 14:22-14:42> | Pathing of Least Resistance | Erik Elmshauser and Corwin Brust | | ok | -| <2020-11-29 Sun 14:45-14:55> | A tour of vterm | Gabriele Bozzola (@sbozzolo) | done | MST, so 11am-5pm EST | -| <2020-11-29 Sun 14:58-15:14> | Lakota Language and Emacs | Grant Shangreaux | done | Central time, 10am EST-5pm EST | -| <2020-11-29 Sun 15:17-15:41> | Object Oriented Code in the Gnus Newsreader | Eric Abrahamsen | planned | ok | -| <2020-11-29 Sun 15:44-16:04> | Maxima a computer algebra system in Emacs | Fermin MF | | afternoon if possible | -| <2020-11-29 Sun 16:07-16:27> | Extend Emacs to Modern GUI Applications with EAF | Matthew Zeng | | after 12pm EST both days; confirmed available November 29, 1pm-4:30pm EST. | -| <2020-11-29 Sun 16:30-16:40> | WAVEing at Repetitive Repetitive Repetitive Music | Zachary Kanfer | done | ok | +| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY | +|------------------------------+---------------------------------------------------+-----------------------------------------------+---------+----------------------------------------------------------------------------| +| <2020-11-29 Sun 13:03-13:13> | Emacs as a Highschooler: How It Changed My Life | Pierce Wang | done | Sun 12pm EST onwards | +| <2020-11-29 Sun 13:16-13:26> | State of Retro Gaming in Emacs | Vasilij "wasamasa" Schneidermann | done | 8am-10pm CET, so 9am-3pm EST | +| <2020-11-29 Sun 13:29-14:19> | Welcome To The Dungeon | Erik Elmshauser and Corwin Brust | | ok | +| <2020-11-29 Sun 14:22-14:42> | Pathing of Least Resistance | Erik Elmshauser and Corwin Brust (mplsCorwin) | | ok | +| <2020-11-29 Sun 14:45-14:55> | A tour of vterm | Gabriele Bozzola (@sbozzolo) | done | MST, so 11am-5pm EST | +| <2020-11-29 Sun 14:58-15:14> | Lakota Language and Emacs | Grant Shangreaux | done | Central time, 10am EST-5pm EST | +| <2020-11-29 Sun 15:17-15:41> | Object Oriented Code in the Gnus Newsreader | Eric Abrahamsen | planned | ok | +| <2020-11-29 Sun 15:44-16:04> | Maxima a computer algebra system in Emacs | Fermin MF | | afternoon if possible | +| <2020-11-29 Sun 16:07-16:30> | Extend Emacs to Modern GUI Applications with EAF | Matthew Zeng | | after 12pm EST both days; confirmed available November 29, 1pm-4:30pm EST. | +| <2020-11-29 Sun 16:33-16:43> | WAVEing at Repetitive Repetitive Repetitive Music | Zachary Kanfer | done | ok | #+END: ** Table for all talks @@ -126,8 +128,8 @@ execute the buffer, update the talk's info/TALKID.md file. | done, live Q&A | <2020-11-28 Sat 10:03-10:13> | Idea to Novel Superstructure: Emacs for Writing | Bala Ramadurai | | planned | <2020-11-28 Sat 10:16-10:26> | Music in Plain Text | Jonathan Gregory | | | <2020-11-28 Sat 10:29-10:45> | Bard Bivou(m)acs - Building a bandcamp-like page for an album of music | Grant Shangreaux | -| | <2020-11-28 Sat 10:48-10:58> | Trivial Emacs Kits | Corwin Brust | -| | <2020-11-28 Sat 11:01-11:21> | Beyond Vim and Emacs: A Scalable UI Paradigm | Sid Kasivajhula (countvaj`) | +| | <2020-11-28 Sat 10:48-10:58> | Trivial Emacs Kits | Corwin Brust (mplsCorwin) | +| | <2020-11-28 Sat 11:01-11:21> | Beyond Vim and Emacs: A Scalable UI Paradigm | Sid Kasivajhula (countvajhula) | | | <2020-11-28 Sat 11:24-11:44> | Building reproducible Emacs | Andrew Tropin (abcdw) | | planned | <2020-11-28 Sat 11:47-12:27> | On why most of the best features in eev look like 5-minute hacks | Eduardo Ochs (edrx) | | | <2020-11-28 Sat 13:03-13:13> | Orgmode - your life in plain text | Rainer König | @@ -141,7 +143,7 @@ execute the buffer, update the talk's info/TALKID.md file. | | <2020-11-28 Sat 15:17-15:37> | Org-mode and Org-Roam for Scholars and Researchers | Noorah Alhasan | | | <2020-11-28 Sat 15:40-16:00> | Org-roam: Technical Presentation | Leo Vivier | | | <2020-11-28 Sat 16:03-16:13> | Sharing blogs (and more) with org-webring | Brett Gilio | -| | <2020-11-28 Sat 16:16-16:36> | OMG Macros | Corwin Brust | +| | <2020-11-28 Sat 16:16-16:36> | OMG Macros | Corwin Brust (mplsCorwin) | | done | <2020-11-29 Sun 09:13-09:30> | Emacs development update | John Wiegley | | | <2020-11-29 Sun 09:33-09:53> | Powering-up Special Blocks | Musa Al-hassy | | 24min | <2020-11-29 Sun 09:56-10:46> | Incremental Parsing with emacs-tree-sitter | Tuấn-Anh Nguyễn | @@ -151,13 +153,13 @@ execute the buffer, update the talk's info/TALKID.md file. | done | <2020-11-29 Sun 13:03-13:13> | Emacs as a Highschooler: How It Changed My Life | Pierce Wang | | done | <2020-11-29 Sun 13:16-13:26> | State of Retro Gaming in Emacs | Vasilij "wasamasa" Schneidermann | | | <2020-11-29 Sun 13:29-14:19> | Welcome To The Dungeon | Erik Elmshauser and Corwin Brust | -| | <2020-11-29 Sun 14:22-14:42> | Pathing of Least Resistance | Erik Elmshauser and Corwin Brust | +| | <2020-11-29 Sun 14:22-14:42> | Pathing of Least Resistance | Erik Elmshauser and Corwin Brust (mplsCorwin) | | done | <2020-11-29 Sun 14:45-14:55> | A tour of vterm | Gabriele Bozzola (@sbozzolo) | | done | <2020-11-29 Sun 14:58-15:14> | Lakota Language and Emacs | Grant Shangreaux | | planned | <2020-11-29 Sun 15:17-15:41> | Object Oriented Code in the Gnus Newsreader | Eric Abrahamsen | | | <2020-11-29 Sun 15:44-16:04> | Maxima a computer algebra system in Emacs | Fermin MF | -| | <2020-11-29 Sun 16:07-16:27> | Extend Emacs to Modern GUI Applications with EAF | Matthew Zeng | -| done | <2020-11-29 Sun 16:30-16:40> | WAVEing at Repetitive Repetitive Repetitive Music | Zachary Kanfer | +| | <2020-11-29 Sun 16:07-16:30> | Extend Emacs to Modern GUI Applications with EAF | Matthew Zeng | +| done | <2020-11-29 Sun 16:33-16:43> | WAVEing at Repetitive Repetitive Repetitive Music | Zachary Kanfer | #+END: * Talks @@ -196,17 +198,17 @@ SCHEDULED: <2020-11-28 Sat 09:00-09:30> | -30 | 150 | 120 | #+BEGIN: columnview :hlines 1 :id "talks" :format "%SCHEDULED%20ITEM%NAME%PREREC%AVAILABILITY" :match "sat+morning/!" -| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY | -|------------------------------+------------------------------------------------------------------------+-----------------------------+----------------+-------------------------------------| -| <2020-11-28 Sat 09:33-09:37> | Emacs News Highlights | Sacha Chua | ready | prerec, maybe 9am-3pm EST | -| <2020-11-28 Sat 09:40-10:00> | An Emacs Developer Story: From User to Package Maintainer | Leo Vivier | | 9am-12pm EST | -| <2020-11-28 Sat 10:03-10:13> | Idea to Novel Superstructure: Emacs for Writing | Bala Ramadurai | done, live Q&A | 8:30am EST-12pm EST | -| <2020-11-28 Sat 10:16-10:26> | Music in Plain Text | Jonathan Gregory | planned | ok | -| <2020-11-28 Sat 10:29-10:45> | Bard Bivou(m)acs - Building a bandcamp-like page for an album of music | Grant Shangreaux | | 10am-5pm EST, daylight Central US | -| <2020-11-28 Sat 10:48-10:58> | Trivial Emacs Kits | Corwin Brust | | ok | -| <2020-11-28 Sat 11:01-11:21> | Beyond Vim and Emacs: A Scalable UI Paradigm | Sid Kasivajhula (countvaj`) | | PST, so maybe 11 AM EST - 5 PM EST? | -| <2020-11-28 Sat 11:24-11:44> | Building reproducible Emacs | Andrew Tropin (abcdw) | | After 4pm UTC - 11am-5pm EST | -| <2020-11-28 Sat 11:47-12:27> | On why most of the best features in eev look like 5-minute hacks | Eduardo Ochs (edrx) | planned | ok | +| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY | +|------------------------------+------------------------------------------------------------------------+--------------------------------+----------------+-------------------------------------| +| <2020-11-28 Sat 09:33-09:37> | Emacs News Highlights | Sacha Chua | ready | prerec, maybe 9am-3pm EST | +| <2020-11-28 Sat 09:40-10:00> | An Emacs Developer Story: From User to Package Maintainer | Leo Vivier | | 9am-12pm EST | +| <2020-11-28 Sat 10:03-10:13> | Idea to Novel Superstructure: Emacs for Writing | Bala Ramadurai | done, live Q&A | 8:30am EST-12pm EST | +| <2020-11-28 Sat 10:16-10:26> | Music in Plain Text | Jonathan Gregory | planned | ok | +| <2020-11-28 Sat 10:29-10:45> | Bard Bivou(m)acs - Building a bandcamp-like page for an album of music | Grant Shangreaux | | 10am-5pm EST, daylight Central US | +| <2020-11-28 Sat 10:48-10:58> | Trivial Emacs Kits | Corwin Brust (mplsCorwin) | | ok | +| <2020-11-28 Sat 11:01-11:21> | Beyond Vim and Emacs: A Scalable UI Paradigm | Sid Kasivajhula (countvajhula) | | PST, so maybe 11 AM EST - 5 PM EST? | +| <2020-11-28 Sat 11:24-11:44> | Building reproducible Emacs | Andrew Tropin (abcdw) | | After 4pm UTC - 11am-5pm EST | +| <2020-11-28 Sat 11:47-12:27> | On why most of the best features in eev look like 5-minute hacks | Eduardo Ochs (edrx) | planned | ok | #+END: **** User stories @@ -935,7 +937,7 @@ SCHEDULED: <2020-11-28 Sat 12:00-13:00> | <2020-11-28 Sat 15:17-15:37> | Org-mode and Org-Roam for Scholars and Researchers | Noorah Alhasan | | ok | | <2020-11-28 Sat 15:40-16:00> | Org-roam: Technical Presentation | Leo Vivier | | 2:30-ish EST ok with tea; in CET timezone | | <2020-11-28 Sat 16:03-16:13> | Sharing blogs (and more) with org-webring | Brett Gilio | | ok | -| <2020-11-28 Sat 16:16-16:36> | OMG Macros | Corwin Brust | | ok | +| <2020-11-28 Sat 16:16-16:36> | OMG Macros | Corwin Brust (mplsCorwin) | | ok | #+END: **** in-progress Orgmode - your life in plain text :standard:tutorial:org:nudge: @@ -2234,18 +2236,18 @@ SCHEDULED: <2020-11-29 Sun 12:00-13:00> #+BEGIN: columnview :hlines 1 :id "talks" :format "%SCHEDULED%20ITEM%NAME%PREREC%AVAILABILITY" :match "sun+afternoon/!" -| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY | -|------------------------------+---------------------------------------------------+----------------------------------+---------+----------------------------------------------------------------------------| -| <2020-11-29 Sun 13:03-13:13> | Emacs as a Highschooler: How It Changed My Life | Pierce Wang | done | Sun 12pm EST onwards | -| <2020-11-29 Sun 13:16-13:26> | State of Retro Gaming in Emacs | Vasilij "wasamasa" Schneidermann | done | 8am-10pm CET, so 9am-3pm EST | -| <2020-11-29 Sun 13:29-14:19> | Welcome To The Dungeon | Erik Elmshauser and Corwin Brust | | ok | -| <2020-11-29 Sun 14:22-14:42> | Pathing of Least Resistance | Erik Elmshauser and Corwin Brust | | ok | -| <2020-11-29 Sun 14:45-14:55> | A tour of vterm | Gabriele Bozzola (@sbozzolo) | done | MST, so 11am-5pm EST | -| <2020-11-29 Sun 14:58-15:14> | Lakota Language and Emacs | Grant Shangreaux | done | Central time, 10am EST-5pm EST | -| <2020-11-29 Sun 15:17-15:41> | Object Oriented Code in the Gnus Newsreader | Eric Abrahamsen | planned | ok | -| <2020-11-29 Sun 15:44-16:04> | Maxima a computer algebra system in Emacs | Fermin MF | | afternoon if possible | -| <2020-11-29 Sun 16:07-16:27> | Extend Emacs to Modern GUI Applications with EAF | Matthew Zeng | | after 12pm EST both days; confirmed available November 29, 1pm-4:30pm EST. | -| <2020-11-29 Sun 16:30-16:40> | WAVEing at Repetitive Repetitive Repetitive Music | Zachary Kanfer | done | ok | +| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY | +|------------------------------+---------------------------------------------------+-----------------------------------------------+---------+----------------------------------------------------------------------------| +| <2020-11-29 Sun 13:03-13:13> | Emacs as a Highschooler: How It Changed My Life | Pierce Wang | done | Sun 12pm EST onwards | +| <2020-11-29 Sun 13:16-13:26> | State of Retro Gaming in Emacs | Vasilij "wasamasa" Schneidermann | done | 8am-10pm CET, so 9am-3pm EST | +| <2020-11-29 Sun 13:29-14:19> | Welcome To The Dungeon | Erik Elmshauser and Corwin Brust | | ok | +| <2020-11-29 Sun 14:22-14:42> | Pathing of Least Resistance | Erik Elmshauser and Corwin Brust (mplsCorwin) | | ok | +| <2020-11-29 Sun 14:45-14:55> | A tour of vterm | Gabriele Bozzola (@sbozzolo) | done | MST, so 11am-5pm EST | +| <2020-11-29 Sun 14:58-15:14> | Lakota Language and Emacs | Grant Shangreaux | done | Central time, 10am EST-5pm EST | +| <2020-11-29 Sun 15:17-15:41> | Object Oriented Code in the Gnus Newsreader | Eric Abrahamsen | planned | ok | +| <2020-11-29 Sun 15:44-16:04> | Maxima a computer algebra system in Emacs | Fermin MF | | afternoon if possible | +| <2020-11-29 Sun 16:07-16:30> | Extend Emacs to Modern GUI Applications with EAF | Matthew Zeng | | after 12pm EST both days; confirmed available November 29, 1pm-4:30pm EST. | +| <2020-11-29 Sun 16:33-16:43> | WAVEing at Repetitive Repetitive Repetitive Music | Zachary Kanfer | done | ok | #+END: **** in-progress Emacs as a Highschooler: How It Changed My Life :standard:user:community:timing:nudge: @@ -3070,328 +3072,6 @@ the target time. (org-entry-get (point) "TARGET_TIME"))) #+end_src -Some conference-related functions - -#+begin_src emacs-lisp :exports code :results none :tangle "conf.el" - (defun conf/find-talk (filter &optional info) - (setq info (or info (conf/filter-talks conf/info))) - (when (stringp filter) (setq filter (list filter))) - (or (seq-find (lambda (o) (string= (plist-get o :talk-id) (car filter))) info) - (seq-find (lambda (o) - (let ((case-fold-search t) - (all (mapconcat (lambda (f) (plist-get o f)) '(:title :speakers :talk-id) " "))) - (null (seq-contains-p - (mapcar (lambda (condition) (string-match condition all)) filter) - nil)))) - info))) - -(defun conf/goto-talk-id (id) - (goto-char (org-find-property "TALK_ID" id))) - -(defun conf/assign-ids () - "Assign numeric talk IDs." - (interactive) - (goto-char (point-min)) - ;; Determine the maximum ID assigned so far - (let ((id - (1+ - (apply 'max - (or (mapcar - 'string-to-number - (org-map-entries - (lambda () - (let ((org-trust-scanner-tags t)) - (org-entry-get (point) "TALK_ID"))) "TALK_ID>0" 'file)) - '(0)))))) - (goto-char (point-min)) - (while (re-search-forward "^ *:NAME: " nil t) - (unless (org-entry-get (point) "TALK_ID") - (org-set-property "TALK_ID" (format "%02d" id)) - (org-set-property "CUSTOM_ID" (format "talk%02d" id)) - (setq id (1+ id)))))) - -(defun conf/update-talks () - (interactive) - (save-excursion - (conf/update-times) - (conf/update-tables) - (conf/update-schedules))) - -(defun conf/update-times () - (goto-char (point-min)) - (org-map-entries - (lambda () - (when (org-entry-get (point) "TARGET_TIME") - (conf/org-sum-min-time-in-subtree) - (org-entry-put - (point) - "DIFFERENCE" - (let ((diff - (- - (string-to-number (org-entry-get (point) "TARGET_TIME")) - (string-to-number (org-entry-get (point) "MIN_TIME_SUM"))))) - (cond - ((> diff 0) (format "Extra: %d" diff)) - ((< diff 0) (format "Needs: %d" (- diff))) - (t "")))))) nil 'file)) -(defun conf/update-tables () - (goto-char (point-min)) - (while (re-search-forward "#\\+CALL: check_time()" nil t) - (org-ctrl-c-ctrl-c)) - (goto-char (point-min)) - (while (re-search-forward "#\\+BEGIN: columnview" nil t) - (org-ctrl-c-ctrl-c))) -(defun conf/update-schedules () - (interactive) - (goto-char (org-find-exact-headline-in-buffer "Talks")) - (let (current-time scheduled end-time duration (buffer (seconds-to-time (* 3 60)))) ;; assumption: 3 minutes between talks - (org-map-entries (lambda () - (if (org-entry-get (point) "FIXED_TIME") - (setq current-time (org-get-scheduled-time (point)))) - (when (org-entry-get (point) "MIN_TIME") - (setq duration (* (string-to-number (org-entry-get (point) "MIN_TIME")) 60) - end-time (time-add current-time (seconds-to-time duration))) - (org-set-property "SCHEDULED" (format "%s-%s" (org-format-time-string "%Y-%m-%d %H:%M" current-time) - (org-format-time-string "%H:%M" end-time))) - (setq current-time (time-add end-time buffer)))) - nil 'tree))) - -(defun conf/org-sum-min-time-in-subtree () - "Add up all the MIN_TIME properties of headings underneath the current one -The total is written to the MIN_TIME_SUM property of this heading" - (interactive) - (org-entry-put - (point) - "MIN_TIME_SUM" - (save-excursion - (format "%d" - (apply - '+ - (mapcar 'string-to-number - (delq nil - (org-map-entries - (lambda () (org-entry-get (point) "MIN_TIME")) nil 'tree)))))))) - -#+end_src -** Generate schedule file - -#+begin_src emacs-lisp :results none :eval yes :exports code :tangle "conf.el" - -(defvar conf/timezones '("EST" "America/Los_Angeles" "UTC" "CET" "Asia/Singapore") "List of timezones") - -(defun conf/get-talk-info () - (let (talk results) - (org-map-entries (lambda () - (let ((heading (org-heading-components))) - (cond - ((and (elt heading 2) (or (null talk) - (<= (car heading) - (plist-get talk :level)))) ;; has a todo, therefore is a talk - (when talk (setq results (cons talk results))) - (setq talk (list - :type 'talk - :title (elt heading 4) - :talk-id (org-entry-get (point) "TALK_ID") - :status (elt heading 2) - :level (car heading) - :scheduled (org-entry-get (point) "SCHEDULED") - :duration (org-entry-get (point) "DURATION") - :time (org-entry-get (point) "MIN_TIME") - :speakers (org-entry-get (point) "NAME")))) - ((string-match "^ *Talk information *$" (elt heading 4)) - (plist-put talk :info - (org-export-as 'md t nil t))) - ((or (null talk) (< (car heading) (plist-get talk :level))) ;; heading above - (when talk - (setq results (cons talk results)) - (setq talk nil)) - (setq results (cons - (list :type 'headline - :level (car heading) - :speakers (org-entry-get (point) "NAME") - :duration (org-entry-get (point) "DURATION") - :talk-id (org-entry-get (point) "TALK_ID") - :title (elt heading 4) - :scheduled (org-entry-get (point) "SCHEDULED")) - results)))))) - nil 'tree) - (when talk (setq results (cons talk results))) - (reverse results))) - -(defun conf/filter-talks (list) - "Return only talk info in LIST." - (seq-filter - (lambda (talk) (eq (plist-get talk :type) 'talk)) - list)) - -(defun conf/format-talk-link (talk) - (and talk (if (plist-get talk :talk-id) - (format "<a href=\"/2020/talks/%s\">%s</a>" - (plist-get talk :talk-id) - (plist-get talk :title)) - (plist-get talk :title)))) - -(defun conf/format-talk-info-as-schedule (info) - (format "<table width=\"100%%\">%s</table>" - (mapconcat - (lambda (o) - (let* ((time-fmt "%l:%M %p") - (timestamp (org-timestamp-from-string (plist-get o :scheduled))) - (start (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp))) "")) - (end (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp t))) "")) - (title (plist-get o :title)) - (speakers (plist-get o :speakers))) - (if (eq (plist-get o :type) 'headline) - (format "<tr><td colspan=\"4\"><strong>%s<strong></td></tr>" - (if (plist-get o :talk-id) - (conf/format-talk-link o) - title)) - (format "<tr><td width=100>~%s</td><td width=100>~%s</td><td>%s</td><td>%s</td></tr>" - start end (conf/format-talk-link o) speakers)))) - (cdr info) "\n"))) - -(defun conf/filter-talks (info) - (seq-filter (lambda (o) (plist-get o :talk-id)) info)) - -(defun conf/split-out-talk-information () - (interactive) - (let ((talks (conf/filter-talks (conf/get-talk-info-from-file)))) - (mapc (lambda (o) - (with-temp-buffer - (insert - (format "# %s\n%s\n\n%s" - (plist-get o :title) - (plist-get o :speakers) - (plist-get o :info))) - (write-file (expand-file-name (format "%s.md" (plist-get o :talk-id)) "info")))) - talks))) - -(defun conf/format-talk-pages (info) - (let* ((talks (conf/filter-talks info)) - (next-talks (cdr talks)) - (prev-talks (cons nil talks))) - (mapc (lambda (o) - (with-temp-buffer - (let* ((timestamp (org-timestamp-from-string (plist-get o :scheduled))) - (next-talk (conf/format-talk-link (pop next-talks))) - (prev-talk (conf/format-talk-link (pop prev-talks))) - (schedule (mapconcat - (lambda (tz) - (format "%s - %s" - (format-time-string "%A, %b %e %Y, ~%l:%M %p" - (org-timestamp-to-time (org-timestamp-split-range timestamp)) tz) - (format-time-string "%l:%M %p %Z" - (org-timestamp-to-time (org-timestamp-split-range timestamp t)) tz))) - conf/timezones - " \n")) - (nav-links (format "Back to the [[schedule]] \n%s%s" - (if prev-talk (format "Previous: %s \n" prev-talk) "") - (if next-talk (format "Next: %s \n" next-talk) "")))) - (insert (format "[[%s title=\"%s\"]] -[[%s copyright=\"Copyright © 2020 %s\"]] - -<!-- To edit the talk information, change /2020/info/TALKID.md. Boilerplate automatically generated from submissions.org using conf/generate-schedule-files --->\n - -%s - -[[!inline pages=\"internal(2020/info/%s)\" raw=\"yes\"]] - -%s - -%s - -" - "!meta" - (replace-regexp-in-string "\"" "\\\\\"" (plist-get o :title)) - "!meta" - (plist-get o :speakers) - nav-links - (plist-get o :talk-id) - schedule - nav-links))) - (write-file (format "talks/%s.md" (plist-get o :talk-id))))) - talks))) - -(defun conf/get-talk-info-from-file (&optional filename) - (with-temp-buffer - (insert-file-contents (or filename "submissions.org")) - (org-mode) - (org-show-all) - (goto-char (point-min)) - (goto-char (org-find-property "ID" "talks")) - (conf/get-talk-info))) - (defvar conf/info nil) - (setq conf/info (conf/get-talk-info-from-file)) - -(defun conf/generate-pad-template () - (interactive) - (let ((talks (conf/filter-talks (conf/get-talk-info-from-file filename)))) - (with-current-buffer (find-file "pad-template.md") - (erase-buffer) - (insert - (concat - "Conference info, how to watch/participate: <https://emacsconf.org/2020/> -Code of conduct: <https://emacsconf.org/conduct/> - -" - (mapconcat - (lambda (o) - (format "**%s** -Speaker(s): %s -Talk page: <https://emacsconf.org/2020/schedule/%s> - -,*Questions:* - -,* Put your questions here, most recent on top -,* sample text - -,*Links:* - -,* sample text -,* sample text - -,*Other notes:* - -,* sample text -,* sample text -<br> -<br> -" (plist-get o :title) (plist-get o :speakers) (plist-get o :talk-id))) talks " \n \n"))) - (save-buffer)))) - -(defun conf/generate-talks-page () - (let ((info conf/info)) - (with-temp-buffer - (find-file "talk-details.md") - (erase-buffer) - (insert (format "<table><thead><th>Duration</th><th>Title</th><th>Speakers</th></thead><tbody>%s</tbody></table>" - (mapconcat - (lambda (o) - (let* ((title (plist-get o :title)) - (speakers (plist-get o :speakers))) - (if (null (plist-get o :talk-id)) - (format "<tr><td colspan=\"3\">%s</td></tr>" (conf/format-talk-link o)) - (format "<tr><td>%s</td><td>%s</td><td>%s</td><tr>" - (plist-get o :duration) - (conf/format-talk-link o) - (plist-get o :speakers))))) - info "\n"))) - (save-buffer)))) - -(defun conf/generate-schedule-files (&optional filename) - (interactive) - (let ((info (conf/get-talk-info-from-file filename))) - ;(conf/generate-talks-page) - (with-temp-buffer - (insert (conf/format-talk-info-as-schedule info)) - (write-file "schedule-details.md")) - (conf/format-talk-pages info))) -#+end_src - -#+RESULTS: - -** Copy the pad - ** Yasnippet for adding video links to the individual talk page #+begin_example @@ -3431,7 +3111,7 @@ or with the source code from the directory listing: Copyright (C) 2020 Sacha Chua, and authors of submitted proposals -The EmacsConf 2020 submissions is part of the EmacsConf wiki, and is +The EmacsConf 2020 submissions are 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, |