diff options
Diffstat (limited to 'organizers-notebook/index.org')
-rw-r--r-- | organizers-notebook/index.org | 424 |
1 files changed, 424 insertions, 0 deletions
diff --git a/organizers-notebook/index.org b/organizers-notebook/index.org index 358c0108..22194a3d 100644 --- a/organizers-notebook/index.org +++ b/organizers-notebook/index.org @@ -119,3 +119,427 @@ Put inside double square brackets: =!template id=pagedraft= - It’s easier for us to extend beyond 5pm than to go before 9am (especially for Pacific time). Extending beyond 5pm puts strain on European organizers and volunteers, though. +- Put the speaker introduction right after the talk description for easier web page copying. +** Announce + +- Post CFP to emacsconf-discuss, reddit.com/r/emacs, and in Emacs News +- Submit to https://foss.events/ + +** Process proposals + +1. In the private repository, create a conf.org. +2. Set ~emacsconf-org-file~ to its location. +3. Create a heading for Submissions and set ~CUSTOM_ID~ to ~submissions~. +4. Prepare the ~prepare~ and ~submit~ pages on the wiki. + +When proposals come in: + + 1. Acknowledge with an e-mail along the lines of: + + #+begin_example + Hello, ....! + + <feedback> We'll wait another week in case anyone else wants to + chime in before I add it to the wiki and send further notes. :) Thanks for + submitting this! + #+end_example + + 2. Use ~emacsconf-mail-add-submission~ if it works, or create the entry and paste it in. + ~org-toggle-item~ can help convert Org-style headings into a nested list. + 3. Set the following fields (~my/org-set-property~ + can be helpful): EMERGENCY, Q_AND_A, + AVAILABILITY, NAME, PRONOUNS, TIME, + SLUG, EMAIL, NAME_SHORT, CUSTOM_ID, + TRACK, TIMEZONE, CATEGORY, DATE_SUBMITTED, + PUBLIC_EMAIL +** Accept proposals + +Setup: + +1. Create YYYY/talks.md. + +For each talk: + +1. Set up "Talk abstract" and "Talk details" sections in the conf.org talk subtree. +2. Change status to ~TO_CONFIRM~. +3. Create wiki page with ~emacsconf-publish-add-talk~. +4. Use ~emacsconf-publish-info-pages~ and ~emacsconf-publish-schedule~ as needed. +5. Send acceptance e-mail with ~emacsconf-mail-accept-talk~ +** Draft schedule +:PROPERTIES: +:CUSTOM_ID: draft-schedule +:END: +- Create entries for opening and closing remarks + - FIXED: t + - SCHEDULED + - TIME: 10 + - BUFFER: 0 + - CUSTOM_ID: + - SLUG: + - Q_AND_A: pad +- Create draft-schedule section in the public organizers notebook for the year +- Add missing items to plan +** Set up backstage and upload + +See [[emacsconf-ansible:README.org]]. + +Lessons learned: + +- Next year, let's get upload.emacsconf.org in place as the domain name so that people don't try to FTP files to it. + +** Post the schedule + +- [[elisp:(setq emacsconf-publishing-phase 'schedule)]] +- elisp:emacsconf-publish-info-pages +- elisp:emacsconf-publish-schedule-org-files +- elisp:emacsconf-ical-generate-all +- Update talks.md to refer to watch.md as well + + +** Process uploaded files + +Basic setup: + +1. Set up the media server and symlinks: [[emacsconf-ansible:README.org]] (Media). +2. Set up the prerec processing areas on res: [[emacsconf-ansible:README.org]] (Processing prerecs). +2. Set up the caption processor on res: [[emacsconf-ansible:README.org]] (Captioning). + +Process: + +1. Review uploaded files with elisp:emacsconf-upload-dired +2. Open the JSON for the file you want to process and use elisp:emacsconf-upload-copy-from-json . + If more than one file uses the same extension, provide a suffix to disambiguate them. +3. On res: + 1. Create a directory ~/current/files/$slug. + 2. Copy the uploaded file from ~/cache as =$video_slug--original.$extension=, or use =rename-original.sh $slug $file=. + 3. Call =process-prerec.sh $file=. +4. When the screens are finished, do locally: + 1. update-cache on my computer. + 2. elisp:emacsconf-publish-cache-video-data or elisp:emacsconf-cache-all-video-data + 3. elisp:emacsconf-publish-backstage-index +** Generate assets +*** In-between pages +- Make the $year/assets/in-between directory and copy the template.svg from the previous year. +- elisp:emacsconf-stream-generate-in-between-pages +*** Intros +- In an empty VTT file, elisp:emacsconf-subed-intro-subtitles +- Record the audio and get captions +- Splice together into a file that will be processed with subed-record-compile-video. +** Prepare the infrastructure + +Checklist: + +- [ ] IRC + - [ ] Manual announcements + - [ ] Automated announcements +- [ ] Web conference +- [ ] Streaming assets + - [ ] Overlays + - [ ] Intros +- [ ] OBS +- [ ] VNC +- [ ] Publishing to the wiki +- [ ] Publishing to the media server +- [ ] Etherpad +- [ ] Mumble +- [ ] Icecast + +** Getting ready for captions + +Onboarding: + +- Add captioner to conf.org with the ~:caption:~ tag, under a Volunteers heading with the ~volunteer~ tag. Make sure the ~EMAIL~ property is set. +- Add captioner to emacsconf-org mailing list. +- Send backstage information elisp:emacsconf-mail-backstage-info-to-volunteer . (Can be sent to all captioning volunteers with elisp:emacsconf-mail-backstage-info-to-captioning-volunteers) +* General infrastructure +** Icecast +:PROPERTIES: +:CUSTOM_ID: icecast +:END: + +Success: You can use [[#obs-instructions][OBS+VNC to record]], and the results can be viewed by mpv. +- [X] Gen +- [X] Dev +Also, recordings are available in /data. + +New year: + +1. Reprovision with + #+begin_src sh :eval no + ansible-playbook -i inventory.yml prod-playbook.yml --tags stream + #+end_src + so that the year is updated in the configuration. +2. SSH to live0.emacsconf.org and run ~/etc/init.d/emacsconf stop~. Confirm that icecast has stopped with ~ps | grep emacsconf~; if not, kill the process. + Start it again with ~/etc/init.d/emacsconf start~ +3. To test, you can use FFmpeg like this for the gen stream: + #+begin_src sh + ffmpeg -y -f lavfi -i testsrc=size=1280x720:rate=10 -i background-music.opus \ + -c:v libvpx -b:v 500K -crf 25 -b:a 128k \ + -content_type video/webm "icecast://emacsconf:$EMACSCONF_ICECAST_SOURCE_PASSWORD@live0.emacsconf.org:8001/gen.webm" + #+end_src + For dev: + #+begin_src sh + ffmpeg -y -f lavfi -i testsrc=size=1280x720:rate=10 -i background-music.opus \ + -c:v libvpx -b:v 500K -crf 25 -b:a 128k \ + -content_type video/webm "icecast://emacsconf:$EMACSCONF_ICECAST_SOURCE_PASSWORD@live0.emacsconf.org:8001/dev.webm" + #+end_src + and then view it with + #+begin_src sh + mpv https://live0.emacsconf.org/gen.webm + #+end_src +** Watching pages +:PROPERTIES: +:CUSTOM_ID: watch +:END: + +Success: You can watch at https://live.emacsconf.org. +- [X] https://live.emacsconf.org goes to the current year's page. +- [X] gen stream works in the browser +- [X] dev stream works in the browser +- [X] Schedule is correct + +New year: +1. ansible-playbook -i inventory.yml prod-playbook.yml --tags live +2. Republish with elisp:emacsconf-publish-watch-pages. +3. Update front:/var/www/live.emacsconf.org. + +Set up test streams (see ffmpeg instructions from [[#icecast][Icecast]]) and then: + +** VNC +:PROPERTIES: +:CUSTOM_ID: vnc +:END: + +We use VNC to connect to the X servers on res.emacsconf.org so that we can stream from it. + +Success: +- [X] Confirm that you can connect to emacsconf-gen via VNC +- [X] Confirm that you can connect to emacsconf-dev via VNC + +Setting up +- elisp:emacsconf-publish-res-index + +*** Instructions +:PROPERTIES: +:CUSTOM_ID: vnc-instructions +:END: + +NOTE: VNC+OBS doesn't work well if you have a window manager that +automatically resizes windows, like i3. Please configure your window +manager so that the VNC window is not resized. + + 1. Install a VNC viewer on your system (ex: tigervnc-viewer). + + 2. Set up your local environment: + + - gen: ~export TRACK=gen; export TRACK_PORT=5905; export SSH_PORT=46668~ + - dev: ~export TRACK=dev; export TRACK_PORT=5906; export SSH_PORT=46668~ + + 3. Copy the password: + + scp emacsconf-$TRACK@res.emacsconf.org:~/.vnc/passwd vnc-passwd-$TRACK -p $SSH_PORT + + 4. Forward your local ports and connect via VNC viewer to the + appropriate forwarded port from your laptop: + + #+begin_example + ssh emacsconf-$TRACK@res.emacsconf.org -N -L $TRACK_PORT:127.0.0.1:$TRACK_PORT -p $SSH_PORT & + sleep 5 # Give it time to establish the tunnels + xvncviewer 127.0.0.1:$TRACK_PORT -shared -geometry 1280x720 -passwd vnc-passwd-$TRACK & + #+end_example + +If you get the following error: + +#+begin_example +channel 2: open failed: connect failed: Connection refused +CConn: End of stream +CConn: The connection was dropped by the server before the session could + be established. +#+end_example + +then the VNC server hasn't started yet. You can start it with + +#+begin_src sh :eval no +ssh emacsconf-$TRACK@res.emacsconf.org -p $SSH_PORT /home/emacsconf-$TRACK/bin/track-vnc +#+end_src + +and then connect with: + +#+begin_src sh :eval no +xvncviewer 127.0.0.1:$TRACK_PORT -shared -geometry 1280x720 -passwd vnc-passwd-$TRACK & +#+end_src + +** Streaming with OBS +:PROPERTIES: +:CUSTOM_ID: obs +:END: + +Success: Confirm that you can stream +- [X] gen +- [X] dev + +New year: reprovision with + +#+begin_src sh :eval no +ansible-playbook -i inventory.yml prod-playbook.yml --tags obs +#+end_src + +so that the year is updated in the shell scripts. + +*** Instructions +:PROPERTIES: +:CUSTOM_ID: obs-instructions +:END: + +1. [[#vnc-instructions][Connect to the VNC session for the track.]] + +2. Start *recording* (not streaming). If you don't see OBS when you connect, it's probably on workspace 2, so you can switch with Alt-2. If you still don't see it there, you can open a terminal with Alt-Enter and then run ~track-obs~. After you start recording, confirm that it is now broadcasting to the stream. + +3. Verify with MPV on your local system: + + #+begin_example + mpv https://live0.emacsconf.org/$TRACK.webm & + #+end_example + +*** Icecast +:PROPERTIES: +:CUSTOM_ID: icecast +:END: + +Success: You can use [[#obs-instructions][OBS+VNC to record]], and the results can be viewed by mpv. +- [ ] gen +- [ ] dev + +New year: reprovision with + +#+begin_src sh :eval no +ansible-playbook -i inventory.yml prod-playbook.yml --tags stream +#+end_src + +so that the year is updated in the configuration. + +This is on live.emacsconf.org and can be restarted with =/etc/init.d/emacsconf restart=. +** Shell scripts + +Success: From the commandline, hosts can: +- [X] play just the intro: intro $SLUG +- [X] play a file without an intro: play $SLUG +- [X] play a file with an intro: play-with-intro $SLUG (hmm, this didn't show the subtitles) + ah, it's because the intros need to be in the cache dir? +- [X] open the Q&A for a talk: handle-qa $SLUG + - [X] open the pad: pad $SLUG + - [X] open BBB: bbb $SLUG +- [ ] do the whole thing: handle-session $SLUG +- [ ] rebroadcast the other stream: + - rebroadcast gen + - rebroadcast dev +- [ ] control background music: music, stop-music + +Setup: +- OBS must be streaming from the stream you're testing. [[#obs][Streaming with OBS]] +- You may want to generate test assets and copy them over to the assets/stream directory. +- Generate all the overlays and copy them to assets/overlays +- Set up the assets/music directory + +** IRC web client + +Success: +- [X] You can join from https://chat.emacsconf.org +- [X] You can join from https://live.emacsconf.org and the channels end up as the latest ones + +Remember to schedule a task to ask libera.chat to increase the number of users it will accept from chat.emacsconf.org to avoid connection exhaustion errors. + +Message I've posted to support@libera.chat: + +Thank you for running libera.chat. We're looking forward to using IRC +(#emacsconf-gen, #emacsconf-dev) for the discussions for the upcoming +EmacsConf (Dec 7-8, https://emacsconf.org). In the past, we've needed to +coordinate with Libera staff to increase the number of connections +allowed from chat.emacsconf.org during conference days in order to avoid +connection exhaustion errors. Is that something we can plan now or would +you like me to bring it up a few days before the conference? +** Etherpad + +Success: + +- [X] pad.emacsconf.org redirects to this year's entry +- [X] Each talk has its own Etherpad +** Publishing media to the server and to the wiki +:PROPERTIES: +:CUSTOM_ID: media +:END: + +Start of year: + +1. Set =media_protect_root= to true in Ansible =group_vars/all.yml=. +2. =ansible-playbook -i inventory.yml prod-playbook.yml --tags media= +3. Generate the index with =emacsconf-publish-update-media= + +Confirm by setting a submitted talk to =PLAYING= and testing with +elisp:emacsconf-publish-media-files-on-change . The public media +directory should have the files and the entry should be in the index. +Switching it back to =TO_STREAM= and calling +elisp:emacsconf-publish-media-files-on-change should remove it. + +*** TODO Switch public media to unprotected root before the conference + +1. Clear public media directory. +2. Set =media_protect_root= to false in Ansible =group_vars/all.yml=. +3. =ansible-playbook -i inventory.yml prod-playbook.yml --tags media= + +You can generate the index with =emacsconf-publish-update-media=. +** Automated IRC announcements + +Success: + +- [ ] When a talk starts playing, it is announced in the relevant channel + +** Manual IRC announcements + +Success: + +- [X] You can /opall, /conftopic, and /broadcast + +** Low-res stream +** Restream to YouTube +** Restream to Toobnix +* Other process notes +:PROPERTIES: +:CUSTOM_ID: other +:END: +** Adding another user to BBB +:PROPERTIES: +:CUSTOM_ID: bbb-user +:END: + +#+begin_src ssh :eval no +ssh bbb.emacsverse.org +docker exec -it greenlight-v2 bundle exec rake user:create["USERNAME","EMAIL","PASSWORD","user"] +#+end_src +** When a talk is cancelled +:PROPERTIES: +:CUSTOM_ID: cancel-talk +:END: + +1. Update the status to CANCELLED. +2. Update the schedule with [[elisp:emacsconf-update-schedule]] +3. Regenerate the intros (before, after). elisp:emacsconf-stream-generate-in-between-pages, then use elisp:subed-record-compile-video in the intros file. +4. Sync the new intros to the /data/emacsconf/shared/$YEAR/assets/intros directory. +5. Regenerate the pads: elisp:emacsconf-pad-prepopulate-all-talks +** When a talk Q&A changes method +:PROPERTIES: +:CUSTOM_ID: change-talk-qa +:END: + +1. Update the talk property. +2. Update the schedule with [[elisp:emacsconf-update-schedule]] +3. Regenerate the intros (before, after). elisp:emacsconf-stream-generate-in-between-pages, then use elisp:subed-record-compile-video in the intros file. +4. Sync the new intros to the /data/emacsconf/shared/$YEAR/assets/intros directory. +5. Regenerate the pads: elisp:emacsconf-pad-prepopulate-all-talks +6. Regenerate talks.json: elisp:emacsconf-publish-talks-json-to-files + +** Ansible + +#+begin_src sh :eval no +git clone git@git.emacsconf.org:pub/emacsconf-ansible +#+end_src |