Transcript

[[!template new="1" text="""Introduction""" start="00:00:00.000" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Can you believe it's been a decade since I started""" start="00:00:00.000" video="mainVideo-literate" id="subtitle"]] [[!template text="""pontificating on literate programming?""" start="00:00:09.360" video="mainVideo-literate" id="subtitle"]] [[!template text="""I am Howard Abrams. In 2015, I spoke at this EmacsConf""" start="00:00:12.359" video="mainVideo-literate" id="subtitle"]] [[!template text="""where I described my challenges I called Literate DevOps.""" start="00:00:17.543" video="mainVideo-literate" id="subtitle"]] [[!template text="""The conference wasn't completely virtual, even though I was.""" start="00:00:21.706" video="mainVideo-literate" id="subtitle"]] [[!template text="""My city of Portland was suffering a citywide electrical outage""" start="00:00:25.635" video="mainVideo-literate" id="subtitle"]] [[!template text="""and I was without power, so I gave the talk in a corner of my""" start="00:00:29.318" video="mainVideo-literate" id="subtitle"]] [[!template text="""friend's living room. People online asking questions and""" start="00:00:33.480" video="mainVideo-literate" id="subtitle"]] [[!template text="""wondering about literate programming... I also see comments""" start="00:00:37.440" video="mainVideo-literate" id="subtitle"]] [[!template text="""explaining why literate programming hasn't caught on in""" start="00:00:41.440" video="mainVideo-literate" id="subtitle"]] [[!template text="""corporate practice. I often don't engage. I mean, is the""" start="00:00:44.600" video="mainVideo-literate" id="subtitle"]] [[!template text="""online arguments and chatter over ignorance or""" start="00:00:49.080" video="mainVideo-literate" id="subtitle"]] [[!template text="""preference? Sure, we're wired differently. I mean, my""" start="00:00:51.600" video="mainVideo-literate" id="subtitle"]] [[!template text="""favorite programming languages put the parentheses""" start="00:00:56.720" video="mainVideo-literate" id="subtitle"]] [[!template text="""before the function name.""" start="00:00:59.560" video="mainVideo-literate" id="subtitle"]] [[!template text="""Literate programming has come a long way""" start="00:01:01.940" video="mainVideo-literate" id="subtitle"]] [[!template text="""since Knuth proposed it in the 19th century. I feel""" start="00:01:03.801" video="mainVideo-literate" id="subtitle"]] [[!template text="""it's come a long way just in the last 10 years. Obviously,""" start="00:01:08.520" video="mainVideo-literate" id="subtitle"]] [[!template text="""this interest is due to Org. I don't think I would bother if""" start="00:01:13.000" video="mainVideo-literate" id="subtitle"]] [[!template text="""all I had was Knuth's original preprocessor. But since I'm""" start="00:01:16.400" video="mainVideo-literate" id="subtitle"]] [[!template text="""talking to fellow nerds about an open source project""" start="00:01:21.360" video="mainVideo-literate" id="subtitle"]] [[!template text="""without corporate backing, let me change the title of my""" start="00:01:24.840" video="mainVideo-literate" id="subtitle"]] [[!template text="""talk and re-pitch Literate Programming in the 24th and a""" start="00:01:27.920" video="mainVideo-literate" id="subtitle"]] [[!template text="""Half Century!""" start="00:01:32.920" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Do I still literate?""" start="00:01:35.253" video="mainVideo-literate" id="subtitle"]]
[[!template text="""People often ask if I still program that way.""" start="00:01:35.253" video="mainVideo-literate" id="subtitle"]] [[!template text="""I guess they want to know if there's any long-term benefits,""" start="00:01:36.654" video="mainVideo-literate" id="subtitle"]] [[!template text="""for many of our tools and our workflows, while initially""" start="00:01:42.760" video="mainVideo-literate" id="subtitle"]] [[!template text="""tantalizing, often don't last. But yes, when I sit down to""" start="00:01:45.920" video="mainVideo-literate" id="subtitle"]] [[!template text="""write a program, I create a file with an extension of .org.""" start="00:01:51.080" video="mainVideo-literate" id="subtitle"]] [[!template text="""I guess you can say I program literally.""" start="00:01:57.760" video="mainVideo-literate" id="subtitle"]] [[!template text="""Let me be transparent. Do I use literate programming during""" start="00:02:03.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""my day job? Yes, but only for personal tools or for initial""" start="00:02:07.360" video="mainVideo-literate" id="subtitle"]] [[!template text="""investigation. At the end of the sprint, I tangle the file""" start="00:02:12.600" video="mainVideo-literate" id="subtitle"]] [[!template text="""and git commit that. My personal projects, on the other""" start="00:02:16.760" video="mainVideo-literate" id="subtitle"]] [[!template text="""hand, are Org files. Since I can't show you the code from""" start="00:02:21.080" video="mainVideo-literate" id="subtitle"]] [[!template text="""my day job, I'm afraid my example code will have a lot of""" start="00:02:25.680" video="mainVideo-literate" id="subtitle"]] [[!template text="""parentheses.""" start="00:02:27.840" video="mainVideo-literate" id="subtitle"]] [[!template text="""I'm sure you won't mind.""" start="00:02:31.160" video="mainVideo-literate" id="subtitle"]] [[!template text="""I like having my Emacs configuration in Org.""" start="00:02:33.956" video="mainVideo-literate" id="subtitle"]] [[!template text="""It's pretty bling. It has over 8,000""" start="00:02:37.357" video="mainVideo-literate" id="subtitle"]] [[!template text="""lines of code. I know, I can hear the screams and gasps over""" start="00:02:40.360" video="mainVideo-literate" id="subtitle"]] [[!template text="""the network. However, the surrounding prose in Org adds""" start="00:02:44.560" video="mainVideo-literate" id="subtitle"]] [[!template text="""10,000 lines, and those lines are non-wrapped paragraphs.""" start="00:02:49.440" video="mainVideo-literate" id="subtitle"]] [[!template text="""I mean, is that large? Sure, we've all worked on""" start="00:02:53.411" video="mainVideo-literate" id="subtitle"]] [[!template text="""larger, so I guess it's not huge. Come on, it's still""" start="00:02:58.120" video="mainVideo-literate" id="subtitle"]] [[!template text="""significant.""" start="00:03:03.640" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Advantages""" start="00:03:06.332" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Advantages? Look who I'm talking to. I'm sure""" start="00:03:06.332" video="mainVideo-literate" id="subtitle"]] [[!template text="""you know the advantages, but indulge me. I feel that one""" start="00:03:09.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""advantage of literate programming, especially with large""" start="00:03:14.280" video="mainVideo-literate" id="subtitle"]] [[!template text="""code bases, is how you can organize and manage the""" start="00:03:16.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""complexity. Most programming languages tame large bases""" start="00:03:20.280" video="mainVideo-literate" id="subtitle"]] [[!template text="""by putting code in separate files. While Org can too, with""" start="00:03:24.840" video="mainVideo-literate" id="subtitle"]] [[!template text="""Org, we can group related functions together under""" start="00:03:29.120" video="mainVideo-literate" id="subtitle"]] [[!template text="""expandable headlines.""" start="00:03:32.280" video="mainVideo-literate" id="subtitle"]] [[!template text="""Here's one. You can see that""" start="00:03:35.044" video="mainVideo-literate" id="subtitle"]] [[!template text="""I've got different sections grouped together.""" start="00:03:37.280" video="mainVideo-literate" id="subtitle"]] [[!template text="""In my original talk, I mentioned how I would attempt to organize""" start="00:03:40.707" video="mainVideo-literate" id="subtitle"]] [[!template text="""my thoughts before coding. I appreciate how I can look back""" start="00:03:43.760" video="mainVideo-literate" id="subtitle"]] [[!template text="""at my notes. In my Emacs configuration, I review the prose to""" start="00:03:47.840" video="mainVideo-literate" id="subtitle"]] [[!template text="""help memorize key bindings.""" start="00:03:53.600" video="mainVideo-literate" id="subtitle"]] [[!template text="""My section on getting email working with Emacs using""" start="00:03:57.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""notmuch means creating small collections of scripts and""" start="00:04:01.040" video="mainVideo-literate" id="subtitle"]] [[!template text="""configuration files. I can tangle them all from one Org""" start="00:04:04.080" video="mainVideo-literate" id="subtitle"]] [[!template text="""file. I like that I can explain each part separately.""" start="00:04:08.200" video="mainVideo-literate" id="subtitle"]] [[!template text="""You just can't beat having links back to Stack Overflow or""" start="00:04:16.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""that GitHub repo where you stole, I mean, became inspired to""" start="00:04:20.880" video="mainVideo-literate" id="subtitle"]] [[!template text="""write your code.""" start="00:04:25.520" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Disadvantages""" start="00:04:28.720" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Literate programming may push the boundaries of our""" start="00:04:28.720" video="mainVideo-literate" id="subtitle"]] [[!template text="""workflows and revealing some abrasion, but we aren't""" start="00:04:34.280" video="mainVideo-literate" id="subtitle"]] [[!template text="""solely working with Org. We have the flexibility of a Lisp""" start="00:04:38.120" video="mainVideo-literate" id="subtitle"]] [[!template text="""engine to file down those rough parts. You may have your""" start="00:04:41.240" video="mainVideo-literate" id="subtitle"]] [[!template text="""concerns. Perhaps you could reach out to me, and with""" start="00:04:45.120" video="mainVideo-literate" id="subtitle"]] [[!template text="""particular issues, maybe we can figure something out.""" start="00:04:48.160" video="mainVideo-literate" id="subtitle"]] [[!template text="""Here is my list of frictions, and the rest of my talk""" start="00:04:54.240" video="mainVideo-literate" id="subtitle"]] [[!template text="""demonstrates my answers and my hacks. The goal in literate""" start="00:04:57.440" video="mainVideo-literate" id="subtitle"]] [[!template text="""programming with Org is that it should not require more""" start="00:05:02.160" video="mainVideo-literate" id="subtitle"]] [[!template text="""effort than non-literate programming. For instance, I""" start="00:05:05.040" video="mainVideo-literate" id="subtitle"]] [[!template text="""shouldn't have to type much more than regular programming""" start="00:05:08.680" video="mainVideo-literate" id="subtitle"]] [[!template text="""to get my code literate. I also shouldn't have to worry about""" start="00:05:12.120" video="mainVideo-literate" id="subtitle"]] [[!template text="""the state between my Org file and the source code. I want""" start="00:05:15.720" video="mainVideo-literate" id="subtitle"]] [[!template text="""to be able to jump around my code just as easily.""" start="00:05:20.800" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Ease of typing""" start="00:05:24.133" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Let me explain more. I've created some templates using""" start="00:05:24.133" video="mainVideo-literate" id="subtitle"]] [[!template text="""yasnippet. Since I was used to the old org-tempo feature,""" start="00:05:28.655" video="mainVideo-literate" id="subtitle"]] [[!template text="""my habit has all the snippets starting with a""" start="00:05:34.680" video="mainVideo-literate" id="subtitle"]] [[!template text="""< character. I'm not sure if I should demonstrate all of them""" start="00:05:37.146" video="mainVideo-literate" id="subtitle"]] [[!template text="""as you may be doing something similar. I like to build on top""" start="00:05:40.760" video="mainVideo-literate" id="subtitle"]] [[!template text="""of characters to remind me that if I just enter a [[!template new="1" text="""Keep tangled code sync'd""" start="00:06:24.720" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Do you ever forget to tangle your code? You can append this""" start="00:06:24.720" video="mainVideo-literate" id="subtitle"]] [[!template text="""code to the bottom of your Org file so that it gets tangled""" start="00:06:28.400" video="mainVideo-literate" id="subtitle"]] [[!template text="""every time you save. I've written a function so I can visit""" start="00:06:31.520" video="mainVideo-literate" id="subtitle"]] [[!template text="""that tangled file and then return. I've grouped all my""" start="00:06:36.160" video="mainVideo-literate" id="subtitle"]] [[!template text="""functions together. I've taken a cue from Charles Choi, you""" start="00:06:40.560" video="mainVideo-literate" id="subtitle"]] [[!template text="""know, kickingvegas, and his Casual feature set. But""" start="00:06:45.120" video="mainVideo-literate" id="subtitle"]] [[!template text="""instead of Transient, I've just made a hydra using""" start="00:06:48.640" video="mainVideo-literate" id="subtitle"]] [[!template text="""the major-mode-hydra package. Anyway, this allows me to use and""" start="00:06:52.375" video="mainVideo-literate" id="subtitle"]] [[!template text="""remember my micro-optimizations.""" start="00:06:57.400" video="mainVideo-literate" id="subtitle"]] [[!template text="""If you set the :comments property to link,""" start="00:07:00.137" video="mainVideo-literate" id="subtitle"]] [[!template text="""the tangled output is back-connected.""" start="00:07:03.698" video="mainVideo-literate" id="subtitle"]] [[!template text="""This allows us to edit the tangled code and have it update the""" start="00:07:07.000" video="mainVideo-literate" id="subtitle"]] [[!template text="""Org file. Personally, I don't like this. My source of truth""" start="00:07:11.480" video="mainVideo-literate" id="subtitle"]] [[!template text="""is the Org file, and I tangle as a one-way diode.""" start="00:07:16.880" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Code evaluation""" start="00:07:22.501" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Often a block of code will reference a variable""" start="00:07:22.501" video="mainVideo-literate" id="subtitle"]] [[!template text="""or call a function to find in another block of code.""" start="00:07:25.604" video="mainVideo-literate" id="subtitle"]] [[!template text="""In my original literate DevOps talk,""" start="00:07:29.047" video="mainVideo-literate" id="subtitle"]] [[!template text="""I discussed how to use the output from one block into""" start="00:07:31.509" video="mainVideo-literate" id="subtitle"]] [[!template text="""another block by naming the first block and referencing it""" start="00:07:34.520" video="mainVideo-literate" id="subtitle"]] [[!template text="""with a :var for the second. However, if all the blocks use the""" start="00:07:37.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""same language, you can use sessions, which create a""" start="00:07:42.160" video="mainVideo-literate" id="subtitle"]] [[!template text="""persistent REPL behind the scenes. Let's evaluate the""" start="00:07:46.040" video="mainVideo-literate" id="subtitle"]] [[!template text="""blocks of Python code in this file.""" start="00:07:51.480" video="mainVideo-literate" id="subtitle"]] [[!template text="""The evaluation created a Python REPL. It's available in""" start="00:07:53.200" video="mainVideo-literate" id="subtitle"]] [[!template text="""another buffer. This buffer matches the name of the""" start="00:08:00.120" video="mainVideo-literate" id="subtitle"]] [[!template text="""session, but with surrounding asterisks. Evaluating a""" start="00:08:04.280" video="mainVideo-literate" id="subtitle"]] [[!template text="""code block sends it into the REPL, and now I can work with my""" start="00:08:07.960" video="mainVideo-literate" id="subtitle"]] [[!template text="""code blocks interactively. (That's not quite right.)""" start="00:08:11.400" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Has that block been eval'd?""" start="00:08:19.960" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I primarily hack on Emacs Lisp, and textual changes to""" start="00:08:19.960" video="mainVideo-literate" id="subtitle"]] [[!template text="""variables, functions, or macros--unless you habitually""" start="00:08:24.040" video="mainVideo-literate" id="subtitle"]] [[!template text="""type C-c C-c--may not represent the state of your""" start="00:08:28.200" video="mainVideo-literate" id="subtitle"]] [[!template text="""machine. A similar effect happens in any language that""" start="00:08:31.680" video="mainVideo-literate" id="subtitle"]] [[!template text="""uses sessions. Sure, I can move the point to a block and""" start="00:08:35.440" video="mainVideo-literate" id="subtitle"]] [[!template text="""evaluate, but I have three functions that allow me to""" start="00:08:39.320" video="mainVideo-literate" id="subtitle"]] [[!template text="""evaluate all blocks in a buffer or all blocks in a subtree,""" start="00:08:42.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""or I can, without moving the point, evaluate any block I see.""" start="00:08:44.735" video="mainVideo-literate" id="subtitle"]] [[!template text="""Now, this function here evaluates all blocks in a buffer.""" start="00:08:50.200" video="mainVideo-literate" id="subtitle"]] [[!template text="""Someone mentioned calling this function when you first""" start="00:08:54.920" video="mainVideo-literate" id="subtitle"]] [[!template text="""load a file. I'm not sure that's a good policy. I mean, have""" start="00:08:58.280" video="mainVideo-literate" id="subtitle"]] [[!template text="""you not written a bug?""" start="00:09:02.360" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Evaluating code in a subtree""" start="00:09:05.239" video="mainVideo-literate" id="subtitle"]]
[[!template text="""Since this function right here""" start="00:09:05.239" video="mainVideo-literate" id="subtitle"]] [[!template text="""evaluates only visible blocks, we can limit what Emacs""" start="00:09:08.560" video="mainVideo-literate" id="subtitle"]] [[!template text="""evaluates to a single Org mode section. For instance, with""" start="00:09:12.040" video="mainVideo-literate" id="subtitle"]] [[!template text="""the cursor in one section, I can evaluate just the blocks in""" start="00:09:18.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""that header section.""" start="00:09:23.760" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Evaluating code from a distance""" start="00:09:26.872" video="mainVideo-literate" id="subtitle"]]
[[!template text="""If I can see a block, why clumsily""" start="00:09:26.872" video="mainVideo-literate" id="subtitle"]] [[!template text="""navigate to it when I can extend the avy project to just jump to""" start="00:09:29.400" video="mainVideo-literate" id="subtitle"]] [[!template text="""it? For instance, let's pull this file up. I can jump to any of""" start="00:09:33.080" video="mainVideo-literate" id="subtitle"]] [[!template text="""the four blocks.""" start="00:09:40.480" video="mainVideo-literate" id="subtitle"]] [[!template text="""I think that's quite slick. Now why navigate to a code block""" start="00:09:41.640" video="mainVideo-literate" id="subtitle"]] [[!template text="""solely to evaluate it? Yes, this is a terrible example, but""" start="00:09:50.320" video="mainVideo-literate" id="subtitle"]] [[!template text="""these three blocks set a variable to different values. So""" start="00:09:55.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""without moving the point, I can evaluate any one of them.""" start="00:09:59.680" video="mainVideo-literate" id="subtitle"]] [[!template text="""To be honest, the reason why I wrote this is because I often""" start="00:10:02.600" video="mainVideo-literate" id="subtitle"]] [[!template text="""forget to evaluate a block after editing it. I've moved on,""" start="00:10:09.720" video="mainVideo-literate" id="subtitle"]] [[!template text="""and I just don't want to jump back. Now, I can just evaluate""" start="00:10:14.000" video="mainVideo-literate" id="subtitle"]] [[!template text="""from a distance. I apologize for the previous terrible""" start="00:10:17.840" video="mainVideo-literate" id="subtitle"]] [[!template text="""examples, but I'm quite pleased with this feature.""" start="00:10:22.360" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Navigating by headers""" start="00:10:26.020" video="mainVideo-literate" id="subtitle"]]
[[!template text="""As I mentioned earlier, in a large code base, we organize code by""" start="00:10:26.020" video="mainVideo-literate" id="subtitle"]] [[!template text="""library or module, and each file contains a class composed""" start="00:10:30.120" video="mainVideo-literate" id="subtitle"]] [[!template text="""of methods, functions, variables, fields, et cetera.""" start="00:10:33.840" video="mainVideo-literate" id="subtitle"]] [[!template text="""Literate programming in Org files allows me to add a""" start="00:10:37.120" video="mainVideo-literate" id="subtitle"]] [[!template text="""semantic organization layer where I can group related""" start="00:10:40.000" video="mainVideo-literate" id="subtitle"]] [[!template text="""concepts under headlines. Now, while this isn't specific""" start="00:10:43.160" video="mainVideo-literate" id="subtitle"]] [[!template text="""to literate programming, I wrote a little user interface to""" start="00:10:46.920" video="mainVideo-literate" id="subtitle"]] [[!template text="""allow me to jump to any heading in any Org file""" start="00:10:50.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""in a particular project.""" start="00:10:54.297" video="mainVideo-literate" id="subtitle"]] [[!template text="""These are the headings in my Emacs configuration project.""" start="00:10:57.680" video="mainVideo-literate" id="subtitle"]] [[!template text="""Notice the file name beforehand, before the colon""" start="00:11:02.880" video="mainVideo-literate" id="subtitle"]] [[!template text="""character. The header name and its parent headers are""" start="00:11:06.560" video="mainVideo-literate" id="subtitle"]] [[!template text="""after. Let me search for the LSP sections. Maybe I only want""" start="00:11:09.760" video="mainVideo-literate" id="subtitle"]] [[!template text="""the one for Python. Now I use ripgrep to search the files and""" start="00:11:14.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""then some Lisp to parse the output. Unless someone has""" start="00:11:20.040" video="mainVideo-literate" id="subtitle"]] [[!template text="""already done this, I should package this up on MELPA.""" start="00:11:24.560" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Navigating by function names""" start="00:11:26.794" video="mainVideo-literate" id="subtitle"]]
[[!template text="""What about jumping directly to the definition of a function,""" start="00:11:26.794" video="mainVideo-literate" id="subtitle"]] [[!template text="""variable, or what have you? We can use Emacs's built-in xref""" start="00:11:32.200" video="mainVideo-literate" id="subtitle"]] [[!template text="""library, but these functions don't understand that the""" start="00:11:36.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""source code is in Org files. When I started using Emacs""" start="00:11:39.880" video="mainVideo-literate" id="subtitle"]] [[!template text="""30-something years ago, I would pre-index my source into""" start="00:11:45.320" video="mainVideo-literate" id="subtitle"]] [[!template text="""tag files, but the dumb-jump project uses the newfangled and""" start="00:11:49.480" video="mainVideo-literate" id="subtitle"]] [[!template text="""faster text search programs like ripgrep to find a symbol in""" start="00:11:53.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""real time. I followed this pattern and wrote an extension""" start="00:11:58.320" video="mainVideo-literate" id="subtitle"]] [[!template text="""to the xref API. Now, I want to jump around my code from both""" start="00:12:02.320" video="mainVideo-literate" id="subtitle"]] [[!template text="""code block or in the surrounding prose. I'm sure it""" start="00:12:08.120" video="mainVideo-literate" id="subtitle"]] [[!template text="""comes as no surprise that my presentation is just an Org""" start="00:12:14.520" video="mainVideo-literate" id="subtitle"]] [[!template text="""file. Let's suppose my cursor is on this symbol. I wrote this""" start="00:12:18.200" video="mainVideo-literate" id="subtitle"]] [[!template text="""function for this demonstration. We can jump to the""" start="00:12:23.920" video="mainVideo-literate" id="subtitle"]] [[!template text="""definition and I can jump back.""" start="00:12:28.080" video="mainVideo-literate" id="subtitle"]] [[!template text="""Notice it jumped into an Org file and back out. References,""" start="00:12:30.760" video="mainVideo-literate" id="subtitle"]] [[!template text="""unlike definitions, is where something is defined and""" start="00:12:37.640" video="mainVideo-literate" id="subtitle"]] [[!template text="""where it's used. Well, you know how the xref system works.""" start="00:12:42.280" video="mainVideo-literate" id="subtitle"]] [[!template text="""Here, I can jump to the definition or where it's""" start="00:12:46.920" video="mainVideo-literate" id="subtitle"]] [[!template text="""used. Of course, and jump back. I think this is cool. This""" start="00:12:52.680" video="mainVideo-literate" id="subtitle"]] [[!template text="""should be a nifty package on MELPA. But my code is specific to""" start="00:12:59.520" video="mainVideo-literate" id="subtitle"]] [[!template text="""Lisp, and I'm not completely sure how to make it general. For""" start="00:13:04.320" video="mainVideo-literate" id="subtitle"]] [[!template text="""instance, what is a symbol? If you know the language, this is""" start="00:13:08.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""obvious. But what should the language be when your cursor is""" start="00:13:13.400" video="mainVideo-literate" id="subtitle"]] [[!template text="""in the prose of an Org file? Python only supports sequences""" start="00:13:17.680" video="mainVideo-literate" id="subtitle"]] [[!template text="""of alphanumeric and underscores, but in Lisp, a symbol can""" start="00:13:22.640" video="mainVideo-literate" id="subtitle"]] [[!template text="""be almost any character sequence. I've been stewing on how""" start="00:13:25.560" video="mainVideo-literate" id="subtitle"]] [[!template text="""to do this. I have ideas like prompting during the first""" start="00:13:30.400" video="mainVideo-literate" id="subtitle"]] [[!template text="""query or scanning the language based on the nearest code""" start="00:13:34.480" video="mainVideo-literate" id="subtitle"]] [[!template text="""block. I think I'm babbling.""" start="00:13:37.720" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Why literate programming?""" start="00:13:40.480" video="mainVideo-literate" id="subtitle"]]
[[!template text="""In true geek fashion, I dived into the details before""" start="00:13:40.480" video="mainVideo-literate" id="subtitle"]] [[!template text="""answering some better questions. In my original Literate""" start="00:13:47.200" video="mainVideo-literate" id="subtitle"]] [[!template text="""DevOps talk, I explained the advantages of initially""" start="00:13:52.080" video="mainVideo-literate" id="subtitle"]] [[!template text="""writing down your thoughts, your plans, goals... the""" start="00:13:55.480" video="mainVideo-literate" id="subtitle"]] [[!template text="""user requirements. But what do you do with all that luscious""" start="00:13:58.960" video="mainVideo-literate" id="subtitle"]] [[!template text="""prose afterwards? Well, you do the same thing you do to your""" start="00:14:02.880" video="mainVideo-literate" id="subtitle"]] [[!template text="""initial code. You refactor that prose.""" start="00:14:06.360" video="mainVideo-literate" id="subtitle"]] [[!template text="""Just because the tech surrounding your code is now a""" start="00:14:09.280" video="mainVideo-literate" id="subtitle"]] [[!template text="""first-class citizen doesn't excuse bad code. You want""" start="00:14:14.760" video="mainVideo-literate" id="subtitle"]] [[!template text="""something more from both your code and your prose.""" start="00:14:18.800" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""LP prose isn't comments""" start="00:14:23.166" video="mainVideo-literate" id="subtitle"]]
[[!template text="""The prose of your literate program isn't""" start="00:14:23.166" video="mainVideo-literate" id="subtitle"]] [[!template text="""just regurgitation of the code in the block.""" start="00:14:25.587" video="mainVideo-literate" id="subtitle"]] [[!template text="""You want something more helpful.""" start="00:14:28.668" video="mainVideo-literate" id="subtitle"]] [[!template text="""You're really writing a research paper to yourself.""" start="00:14:31.528" video="mainVideo-literate" id="subtitle"]] [[!template text="""I know what you're thinking. You've seen my Git repos.""" start="00:14:35.737" video="mainVideo-literate" id="subtitle"]] [[!template text="""I'm guilty and not always the best example.""" start="00:14:38.578" video="mainVideo-literate" id="subtitle"]] [[!template text="""However, I do get great joy""" start="00:14:41.859" video="mainVideo-literate" id="subtitle"]] [[!template text="""when I see someone ask about something in Emacs""" start="00:14:44.560" video="mainVideo-literate" id="subtitle"]] [[!template text="""and my response is little more than a link""" start="00:14:48.681" video="mainVideo-literate" id="subtitle"]] [[!template text="""to my online repo that I've rendered as a website.""" start="00:14:51.042" video="mainVideo-literate" id="subtitle"]]
[[!template new="1" text="""Summary""" start="00:14:55.800" video="mainVideo-literate" id="subtitle"]]
[[!template text="""I'm out of time. I hope this has been interesting""" start="00:14:55.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""philosophically as well as practically, as I think""" start="00:15:01.200" video="mainVideo-literate" id="subtitle"]] [[!template text="""literate programming is the cat's meow. I'm afraid this""" start="00:15:04.360" video="mainVideo-literate" id="subtitle"]] [[!template text="""summary slide is about my home-baked solutions that fit my""" start="00:15:08.560" video="mainVideo-literate" id="subtitle"]] [[!template text="""needs, but hopefully you can recognize your pain points and""" start="00:15:11.880" video="mainVideo-literate" id="subtitle"]] [[!template text="""address them. If you don't need my Literate""" start="00:15:15.120" video="mainVideo-literate" id="subtitle"]] [[!template text="""DevOps-specific techniques for connecting code blocks, I""" start="00:15:17.840" video="mainVideo-literate" id="subtitle"]] [[!template text="""suggest using sessions by default. I highly recommend""" start="00:15:21.480" video="mainVideo-literate" id="subtitle"]] [[!template text="""looking at your workflow and writing snippets to give you""" start="00:15:25.800" video="mainVideo-literate" id="subtitle"]] [[!template text="""less typing for Org blocks. I now jump by headlines in my""" start="00:15:28.400" video="mainVideo-literate" id="subtitle"]] [[!template text="""projects, but extending xref to support Org files made""" start="00:15:33.160" video="mainVideo-literate" id="subtitle"]] [[!template text="""literate programming as easy as programming the""" start="00:15:37.480" video="mainVideo-literate" id="subtitle"]] [[!template text="""old-fashioned way. I do need to make it more general to put up""" start="00:15:40.160" video="mainVideo-literate" id="subtitle"]] [[!template text="""on MELPA, though. Thanks for watching.""" start="00:15:44.320" video="mainVideo-literate" id="subtitle"]] [[!template text="""Happy hacking, my friends.""" start="00:15:47.723" video="mainVideo-literate" id="subtitle"]] Captioner: sachac

Q&A transcript (unedited)

[[!template text="""I'm doing great. Good to hear from you guys. Yeah, I mean,""" start="00:00:00.000" video="qanda-literate" id="subtitle"]] [[!template text="""you've been a regular of the show, I would say, for quite a""" start="00:00:04.840" video="qanda-literate" id="subtitle"]] [[!template text="""while, and it's good. I really like the retrospective that""" start="00:00:07.960" video="qanda-literate" id="subtitle"]] [[!template text="""you did the first time you attended EmacsConf. And when was""" start="00:00:11.400" video="qanda-literate" id="subtitle"]] [[!template text="""it? Was it 2015? I can't actually remember. 2015 was when I""" start="00:00:14.960" video="qanda-literate" id="subtitle"]] [[!template text="""presented that, but I did an earlier talk the year before. So""" start="00:00:18.760" video="qanda-literate" id="subtitle"]] [[!template text="""yeah, that's why it's kind of thing. It's like, wow, it's""" start="00:00:22.320" video="qanda-literate" id="subtitle"]] [[!template text="""been a decade. It's been a while. Yeah, and I'm glad that you""" start="00:00:25.480" video="qanda-literate" id="subtitle"]] [[!template text="""are in a much better recording situation than you were in""" start="00:00:31.280" video="qanda-literate" id="subtitle"]] [[!template text="""2015 at the back of your colleague's house. It's good to see""" start="00:00:35.560" video="qanda-literate" id="subtitle"]] [[!template text="""you at your own place. Well, it's also nice to pre-record and""" start="00:00:39.440" video="qanda-literate" id="subtitle"]] [[!template text="""then just share. Yeah, I mean, that's why we keep talking""" start="00:00:44.360" video="qanda-literate" id="subtitle"]] [[!template text="""about pre-recording. You know, when we really pushed""" start="00:00:48.240" video="qanda-literate" id="subtitle"]] [[!template text="""pre-recordings, I think it was five years ago when we""" start="00:00:51.520" video="qanda-literate" id="subtitle"]] [[!template text="""started, people were not really liking it. They thought,""" start="00:00:53.760" video="qanda-literate" id="subtitle"]] [[!template text="""oh, but most conferences are just asking you to come and""" start="00:00:57.680" video="qanda-literate" id="subtitle"]] [[!template text="""chat. And, you know, I don't need to do the pesky""" start="00:01:00.040" video="qanda-literate" id="subtitle"]] [[!template text="""pre-recording. But now, and especially for you regulars,""" start="00:01:02.920" video="qanda-literate" id="subtitle"]] [[!template text="""you're really starting to realize that pre-recordings are""" start="00:01:06.320" video="qanda-literate" id="subtitle"]] [[!template text="""actually amazing for everyone. You're less stressed on the""" start="00:01:08.360" video="qanda-literate" id="subtitle"]] [[!template text="""day of the conference. We, the organizers, are way less""" start="00:01:11.280" video="qanda-literate" id="subtitle"]] [[!template text="""stressed. So it's a win-win scenario for absolutely""" start="00:01:14.200" video="qanda-literate" id="subtitle"]] [[!template text="""everyone in the equation. Okay, so there's some""" start="00:01:16.520" video="qanda-literate" id="subtitle"]] [[!template text="""confirmation bias at work, but I'm not really arguing with""" start="00:01:19.360" video="qanda-literate" id="subtitle"]] [[!template text="""what Leo says for the record. It may be that we are just that""" start="00:01:22.520" video="qanda-literate" id="subtitle"]] [[!template text="""this stoked that we're lying to ourselves by the""" start="00:01:27.640" video="qanda-literate" id="subtitle"]] [[!template text="""opportunity that we have to chat with each of you. Sure.""" start="00:01:30.760" video="qanda-literate" id="subtitle"]] [[!template text="""Sure. Sure. I have really appreciated all of the, the""" start="00:01:33.960" video="qanda-literate" id="subtitle"]] [[!template text="""transcripts. It's been great that, you know, to be able to""" start="00:01:38.760" video="qanda-literate" id="subtitle"]] [[!template text="""read and copy and paste and all that kind of thing. Yeah, it's""" start="00:01:43.560" video="qanda-literate" id="subtitle"]] [[!template text="""great. So yeah, let's answer some questions here.""" start="00:01:46.520" video="qanda-literate" id="subtitle"]] [[!template text="""Let's see. Yeah, just feel free to jump onto the Etherpad and""" start="00:01:49.960" video="qanda-literate" id="subtitle"]] [[!template text="""just drop on the questions. I'll keep answering them all day""" start="00:01:58.160" video="qanda-literate" id="subtitle"]] [[!template text="""kind of thing and get better answers as we go along.""" start="00:02:01.240" video="qanda-literate" id="subtitle"]]
[[!template new="1" text="""Q: What's the largest code base you've ever tackled with the literate approach (esp. Emacs + Org-mode)?""" start="00:02:07.400" video="qanda-literate" id="subtitle"]]
[[!template text="""So yeah, the first question here is, what's my largest code base?""" start="00:02:07.400" video="qanda-literate" id="subtitle"]] [[!template text="""I kind of touched it in my presentation. However, I think""" start="00:02:12.440" video="qanda-literate" id="subtitle"]] [[!template text="""someone just went through and did a better count than it""" start="00:02:18.360" video="qanda-literate" id="subtitle"]] [[!template text="""looks like. a little bit more. So""" start="00:02:22.440" video="qanda-literate" id="subtitle"]] [[!template text="""as I joked about in the video, we've all worked on larger code""" start="00:02:27.880" video="qanda-literate" id="subtitle"]] [[!template text="""bases, but that's still, it's kind of significant. So it's""" start="00:02:32.960" video="qanda-literate" id="subtitle"]] [[!template text="""not, so yeah, anyway. So let's talk a little bit about""" start="00:02:36.800" video="qanda-literate" id="subtitle"]] [[!template text="""searching for functions here. If you've got your functions""" start="00:02:43.680" video="qanda-literate" id="subtitle"]] [[!template text="""in your code or code block, well, you can search for the""" start="00:02:49.520" video="qanda-literate" id="subtitle"]] [[!template text="""descriptions, you know, as long as you've evaluated it. And""" start="00:02:53.680" video="qanda-literate" id="subtitle"]] [[!template text="""so that wasn't so much of a problem, but I did want to like look""" start="00:02:59.320" video="qanda-literate" id="subtitle"]] [[!template text="""at the commentary around any function that I would define.""" start="00:03:04.520" video="qanda-literate" id="subtitle"]] [[!template text="""And that's where, yeah, you know, the C-x or the""" start="00:03:07.840" video="qanda-literate" id="subtitle"]] [[!template text="""C-f to define that function and display it. It won't""" start="00:03:14.040" video="qanda-literate" id="subtitle"]] [[!template text="""pull out the literate stuff around it, obviously, it'll""" start="00:03:18.920" video="qanda-literate" id="subtitle"]] [[!template text="""only do the doc header. But if you could search for it and find""" start="00:03:22.280" video="qanda-literate" id="subtitle"]] [[!template text="""it quick, then it might be just as useful. And I guess that's""" start="00:03:27.160" video="qanda-literate" id="subtitle"]] [[!template text="""why I started getting into seeing if I can't tie that into the""" start="00:03:30.560" video="qanda-literate" id="subtitle"]] [[!template text="""X ref. you know, just the standard ways. My first part, I""" start="00:03:36.080" video="qanda-literate" id="subtitle"]] [[!template text="""noticed that evil has a different way of searching through""" start="00:03:40.840" video="qanda-literate" id="subtitle"]] [[!template text="""for looking for code definitions. That was my first foray""" start="00:03:45.800" video="qanda-literate" id="subtitle"]] [[!template text="""into it. It's like, oh, that's not a bad idea. Let's hook it up""" start="00:03:51.000" video="qanda-literate" id="subtitle"]] [[!template text="""under, you know, in the standard way.""" start="00:03:53.960" video="qanda-literate" id="subtitle"]]
[[!template new="1" text="""Q: Have you ever used org-transclusion?""" start="00:03:58.080" video="qanda-literate" id="subtitle"]]
[[!template text="""Let's see. Have I ever used org-transclusion?""" start="00:03:58.080" video="qanda-literate" id="subtitle"]] [[!template text="""No, I haven't, but I think I want to""" start="00:04:02.280" video="qanda-literate" id="subtitle"]] [[!template text="""take a look at it. I haven't heard of it before.""" start="00:04:05.320" video="qanda-literate" id="subtitle"]]
[[!template new="1" text="""Q: What is your usage of dynamic blocks in such workflows?""" start="00:04:08.440" video="qanda-literate" id="subtitle"]]
[[!template text="""Let's see. What's my usage of dynamic blocks in my""" start="00:04:08.440" video="qanda-literate" id="subtitle"]] [[!template text="""workflows? You know, that's a real good question. I haven't""" start="00:04:16.520" video="qanda-literate" id="subtitle"]] [[!template text="""really used them a lot in all of my workflows, but yeah, it's""" start="00:04:21.440" video="qanda-literate" id="subtitle"]] [[!template text="""an interesting, you know, we always start.""" start="00:04:26.320" video="qanda-literate" id="subtitle"]] [[!template text="""At first, all""" start="00:04:29.440" video="qanda-literate" id="subtitle"]] [[!template text="""we're doing is just taking a few notes, then we start""" start="00:04:31.000" video="qanda-literate" id="subtitle"]] [[!template text="""organizing, then we've got links, and then we're writing""" start="00:04:33.680" video="qanda-literate" id="subtitle"]] [[!template text="""code blocks, and then agendas, and table, you know, we keep""" start="00:04:36.040" video="qanda-literate" id="subtitle"]] [[!template text="""building up on it.""" start="00:04:39.520" video="qanda-literate" id="subtitle"]] [[!template text="""I guess I haven't really added that to""" start="00:04:41.000" video="qanda-literate" id="subtitle"]] [[!template text="""my workflow, but maybe I'll have to come back""" start="00:04:44.400" video="qanda-literate" id="subtitle"]] [[!template text="""and report on that.""" start="00:04:46.979" video="qanda-literate" id="subtitle"]]
[[!template new="1" text="""Q: Is the minibuffer being deliberately hidden in this video?""" start="00:04:48.840" video="qanda-literate" id="subtitle"]]
[[!template text="""Is the mini buffer being deliberately hidden in my""" start="00:04:48.840" video="qanda-literate" id="subtitle"]] [[!template text="""video? Not deliberately. I recorded it first and""" start="00:04:51.600" video="qanda-literate" id="subtitle"]] [[!template text="""accidentally not clipped the video and turned that all off.""" start="00:04:57.880" video="qanda-literate" id="subtitle"]] [[!template text="""So I went through and started fixing all of it. But yeah, so""" start="00:05:03.760" video="qanda-literate" id="subtitle"]] [[!template text="""you'll notice the mini buffer kind of comes and goes in the""" start="00:05:07.360" video="qanda-literate" id="subtitle"]] [[!template text="""video. Sorry about that.""" start="00:05:10.760" video="qanda-literate" id="subtitle"]] [[!template text="""So yeah, it wasn't intentional at all.""" start="00:05:12.445" video="qanda-literate" id="subtitle"]]
[[!template new="1" text="""Q: What's your take on Emacs+Org vs. Jupyter notebooks (for interactive programming)?""" start="00:05:17.341" video="qanda-literate" id="subtitle"]]
[[!template text="""What's my take on Emacs Org versus Jupyter? That's a real""" start="00:05:17.341" video="qanda-literate" id="subtitle"]] [[!template text="""good question. I've been toying about seeing if I could do""" start="00:05:21.840" video="qanda-literate" id="subtitle"]] [[!template text="""everything that some people do with Jupyter notebooks in""" start="00:05:29.520" video="qanda-literate" id="subtitle"]] [[!template text="""order. I don't need to do it as much because I'm still kind of""" start="00:05:32.480" video="qanda-literate" id="subtitle"]] [[!template text="""doing a lot of list programming and a lot of my DevOps, which""" start="00:05:36.080" video="qanda-literate" id="subtitle"]] [[!template text="""is a lot of shell work and a lot of Python. Most of the Jupyter""" start="00:05:40.320" video="qanda-literate" id="subtitle"]] [[!template text="""notebooks, they automatically include a lot of things in""" start="00:05:45.560" video="qanda-literate" id="subtitle"]] [[!template text="""from either Julia or Python, like NumPy and all the dynamic""" start="00:05:49.640" video="qanda-literate" id="subtitle"]] [[!template text="""stuff that's going on there. Since it has a server,""" start="00:05:56.680" video="qanda-literate" id="subtitle"]] [[!template text="""it seems like it's running a lot more stuff and then just""" start="00:06:01.440" video="qanda-literate" id="subtitle"]] [[!template text="""shipping it back off into the web app. That has been the""" start="00:06:07.440" video="qanda-literate" id="subtitle"]] [[!template text="""biggest challenge as I've tried to kind of duplicate that. I""" start="00:06:10.720" video="qanda-literate" id="subtitle"]] [[!template text="""don't really know NumPy and all the math stuff and that sort""" start="00:06:16.240" video="qanda-literate" id="subtitle"]] [[!template text="""of stuff that well. So trying to do like matrix""" start="00:06:20.440" video="qanda-literate" id="subtitle"]] [[!template text="""multiplications and that kind of thing that seemed to be""" start="00:06:25.040" video="qanda-literate" id="subtitle"]] [[!template text="""pretty easy in the Jupyter, it's not very easy in Org. I've""" start="00:06:27.360" video="qanda-literate" id="subtitle"]] [[!template text="""attempted to kind of work with Julia and the Julia support""" start="00:06:33.120" video="qanda-literate" id="subtitle"]] [[!template text="""for Org is really limited it seems. That's the, So, yeah,""" start="00:06:36.640" video="qanda-literate" id="subtitle"]] [[!template text="""there's some improvements we could probably make. So, I""" start="00:06:45.760" video="qanda-literate" id="subtitle"]] [[!template text="""think if somebody is comfortable with Jupiter, and that""" start="00:06:49.200" video="qanda-literate" id="subtitle"]] [[!template text="""seems to work, you may have to stay there. I don't know how""" start="00:06:53.160" video="qanda-literate" id="subtitle"]] [[!template text="""easy. I would be curious to try to see what we could do as a""" start="00:06:59.040" video="qanda-literate" id="subtitle"]] [[!template text="""community to kind of make that transition a lot easier.""" start="00:07:04.680" video="qanda-literate" id="subtitle"]]
[[!template new="1" text="""Q: Do you think any programming language is more suited to literate programming than another?""" start="00:07:07.800" video="qanda-literate" id="subtitle"]]
[[!template text="""Do you think any programming language""" start="00:07:07.800" video="qanda-literate" id="subtitle"]] [[!template text="""is more suited to literate""" start="00:07:12.417" video="qanda-literate" id="subtitle"]] [[!template text="""programming than another? Hey, that's a real good""" start="00:07:13.560" video="qanda-literate" id="subtitle"]] [[!template text="""question. A lot of mine is with Emacs Lisp, and obviously""" start="00:07:16.960" video="qanda-literate" id="subtitle"]] [[!template text="""that's a first-class citizen in Emacs. Go figure, right? So""" start="00:07:22.360" video="qanda-literate" id="subtitle"]] [[!template text="""that one certainly works. A lot depends on the support in the""" start="00:07:27.640" video="qanda-literate" id="subtitle"]] [[!template text="""OB version for the Babel work. Python is really well""" start="00:07:33.520" video="qanda-literate" id="subtitle"]] [[!template text="""supported, and yeah, Emacs Lisp. Others, Shell, you know,""" start="00:07:38.200" video="qanda-literate" id="subtitle"]] [[!template text="""it works, but it's hard to get both the values, the variables""" start="00:07:45.600" video="qanda-literate" id="subtitle"]] [[!template text="""out of the environment variables into your thing. So most""" start="00:07:50.440" video="qanda-literate" id="subtitle"]] [[!template text="""everything is just with the results of output. So, you know,""" start="00:07:53.480" video="qanda-literate" id="subtitle"]] [[!template text="""some languages aren't quite as good as others for sure. I""" start="00:07:58.960" video="qanda-literate" id="subtitle"]] [[!template text="""would love to see better support for more interesting""" start="00:08:03.080" video="qanda-literate" id="subtitle"]] [[!template text="""languages, especially ones that are compiled. I've been""" start="00:08:06.880" video="qanda-literate" id="subtitle"]] [[!template text="""dabbling with Rust and like, yeah, what can we do to have Rust""" start="00:08:10.440" video="qanda-literate" id="subtitle"]] [[!template text="""more iterative as well? So...""" start="00:08:16.640" video="qanda-literate" id="subtitle"]]
[[!template new="1" text="""Q: Do you use inline org function calls and org babel library and such?""" start="00:08:21.560" video="qanda-literate" id="subtitle"]]
[[!template text="""Do you use inline org function calls in Org Babel library? So""" start="00:08:21.560" video="qanda-literate" id="subtitle"]] [[!template text="""I used to do a lot of Org Babel libraries to kind of share""" start="00:08:29.160" video="qanda-literate" id="subtitle"]] [[!template text="""things.""" start="00:08:33.600" video="qanda-literate" id="subtitle"]] [[!template text="""Yeah. What I. But yeah. Sorry, I'm just kind of thinking""" start="00:08:35.640" video="qanda-literate" id="subtitle"]] [[!template text="""through here. I've done a lot of it in the past. There were a""" start="00:08:46.400" video="qanda-literate" id="subtitle"]] [[!template text="""lot of bugs in it. Oh, I don't know, eight years ago when I was""" start="00:08:49.840" video="qanda-literate" id="subtitle"]] [[!template text="""playing with it. I bet things have improved a lot more and it""" start="00:08:54.920" video="qanda-literate" id="subtitle"]] [[!template text="""probably saved me a lot more effort. Right now, most of the""" start="00:08:59.360" video="qanda-literate" id="subtitle"]] [[!template text="""literate devops, the devops kind of stuff that I'm doing, is""" start="00:09:04.240" video="qanda-literate" id="subtitle"]] [[!template text="""calling a lot of back-end programs and that sort of thing. So""" start="00:09:08.640" video="qanda-literate" id="subtitle"]] [[!template text="""the Org Babel kind of has limited help in that regard. And as""" start="00:09:14.080" video="qanda-literate" id="subtitle"]] [[!template text="""far as my Emacs work, well, it's just part of the session. So""" start="00:09:19.360" video="qanda-literate" id="subtitle"]] [[!template text="""it's going to be available or not. So that hasn't been as""" start="00:09:24.000" video="qanda-literate" id="subtitle"]] [[!template text="""helpful either. So it's kind of dropped off. But I bet if""" start="00:09:26.760" video="qanda-literate" id="subtitle"]] [[!template text="""you're using something like, say, Python, it might be a lot""" start="00:09:30.560" video="qanda-literate" id="subtitle"]] [[!template text="""more helpful.""" start="00:09:34.520" video="qanda-literate" id="subtitle"]]
[[!template new="1" text="""Q: How do you handle the cases where org markup may sometimes interfere with some of the code?""" start="00:09:36.970" video="qanda-literate" id="subtitle"]]
[[!template text="""Another question, how do you handle the cases""" start="00:09:36.970" video="qanda-literate" id="subtitle"]] [[!template text="""where markup may sometimes interfere with some of the code""" start="00:09:40.160" video="qanda-literate" id="subtitle"]] [[!template text="""in places where you can't escape? Oh, okay. All right. Let me""" start="00:09:44.000" video="qanda-literate" id="subtitle"]] [[!template text="""see if I understand the question correctly.""" start="00:09:50.560" video="qanda-literate" id="subtitle"]] [[!template text="""When I, like, when I'm making prose, and I'm talking about a""" start="00:09:54.720" video="qanda-literate" id="subtitle"]] [[!template text="""function that I've written somewhere else, like, oh, I need""" start="00:10:01.760" video="qanda-literate" id="subtitle"]] [[!template text="""to work on this, or this calls this, and yeah, I'll use the""" start="00:10:04.840" video="qanda-literate" id="subtitle"]] [[!template text="""tildes or the equal signs on either side to make sure it's.""" start="00:10:09.440" video="qanda-literate" id="subtitle"]] [[!template text="""that it's clear that it's code. In my xref, when I'm doing a""" start="00:10:14.840" video="qanda-literate" id="subtitle"]] [[!template text="""thing-at-point so it can go look for that symbol, I do look for""" start="00:10:20.400" video="qanda-literate" id="subtitle"]] [[!template text="""those things at the end and strip them off so that I can mark it""" start="00:10:27.480" video="qanda-literate" id="subtitle"]] [[!template text="""up and still search and it's still okay. I'm not sure if""" start="00:10:31.920" video="qanda-literate" id="subtitle"]] [[!template text="""that's the answer to the question. Yeah, clarifying. I'm""" start="00:10:35.040" video="qanda-literate" id="subtitle"]] [[!template text="""making prose. I'm talking about a function I've written""" start="00:10:39.360" video="qanda-literate" id="subtitle"]] [[!template text="""somewhere else. Yeah, yeah, yeah, that is what I'm talking""" start="00:10:41.760" video="qanda-literate" id="subtitle"]] [[!template text="""about, where a function with tildes on either end, and if I do""" start="00:10:47.320" video="qanda-literate" id="subtitle"]] [[!template text="""an xref search find for that symbol, it'll strip that off and""" start="00:10:53.280" video="qanda-literate" id="subtitle"]] [[!template text="""then still look for the function name, so I can still mark it""" start="00:10:57.360" video="qanda-literate" id="subtitle"]] [[!template text="""correctly.""" start="00:11:01.440" video="qanda-literate" id="subtitle"]]
[[!template new="1" text="""Q: You said at the start that literate didn't catch on in corporate DevOps - why not?""" start="00:11:06.220" video="qanda-literate" id="subtitle"]]
[[!template text="""You said at the start that literate didn't catch on in""" start="00:11:06.220" video="qanda-literate" id="subtitle"]] [[!template text="""corporate devops, why not? You know,""" start="00:11:08.440" video="qanda-literate" id="subtitle"]] [[!template text="""I guess the big thing is not everybody's using Emacs, and I""" start="00:11:12.320" video="qanda-literate" id="subtitle"]] [[!template text="""don't think anybody would be doing literate programming if""" start="00:11:18.320" video="qanda-literate" id="subtitle"]] [[!template text="""you didn't have Emacs. I mean, you gotta have org, or it just""" start="00:11:22.360" video="qanda-literate" id="subtitle"]] [[!template text="""doesn't work that well, right?""" start="00:11:27.880" video="qanda-literate" id="subtitle"]] [[!template text="""Why not that full stack on Markdown? Yeah, so I often do a lot""" start="00:11:30.800" video="qanda-literate" id="subtitle"]] [[!template text="""of Markdown. I have got, so I've gone through and make my""" start="00:11:36.360" video="qanda-literate" id="subtitle"]] [[!template text="""markdown look a lot like org. So my headers are the same size""" start="00:11:44.280" video="qanda-literate" id="subtitle"]] [[!template text="""as org. When I mark, do the triple back ticks, you know, and""" start="00:11:49.040" video="qanda-literate" id="subtitle"]] [[!template text="""specify your language, we can now colorize that. So you can""" start="00:11:54.760" video="qanda-literate" id="subtitle"]] [[!template text="""kind of now have it syntactically marked up. It would be""" start="00:12:00.200" video="qanda-literate" id="subtitle"]] [[!template text="""interesting if we kind of expanded on Markdown so that I""" start="00:12:05.680" video="qanda-literate" id="subtitle"]] [[!template text="""could do a C-c twice on it and run that code block.""" start="00:12:11.200" video="qanda-literate" id="subtitle"]] [[!template text="""That's a real good idea. Maybe we should work on that.""" start="00:12:14.480" video="qanda-literate" id="subtitle"]] [[!template text="""How does your management of to do's project and tasks""" start="00:12:22.120" video="qanda-literate" id="subtitle"]] [[!template text="""interact with this literate mindset? I can't believe I'm""" start="00:12:28.040" video="qanda-literate" id="subtitle"]] [[!template text="""going to do this, but Howard, I'm going to break right in""" start="00:12:31.680" video="qanda-literate" id="subtitle"]] [[!template text="""there because I just can't. I need to talk about that. So this""" start="00:12:33.880" video="qanda-literate" id="subtitle"]] [[!template text="""is I bought a domain. And really what I mean is I have this""" start="00:12:37.120" video="qanda-literate" id="subtitle"]] [[!template text="""domain of somebody get some work done in this area. I'm""" start="00:12:41.800" video="qanda-literate" id="subtitle"]] [[!template text="""fascinated by this. That's mostly really actually my whole""" start="00:12:45.600" video="qanda-literate" id="subtitle"]] [[!template text="""comment. But I just wanted to say, indeed, that is something""" start="00:12:48.840" video="qanda-literate" id="subtitle"]] [[!template text="""maybe we should work on. Well said. I think the idea of having""" start="00:12:52.600" video="qanda-literate" id="subtitle"]] [[!template text="""something that's full stack baked around Emacs is pretty""" start="00:12:56.600" video="qanda-literate" id="subtitle"]] [[!template text="""fascinating, just thinking about it as some command line""" start="00:12:59.560" video="qanda-literate" id="subtitle"]] [[!template text="""tool that we can run to get some work done and then there are""" start="00:13:03.080" video="qanda-literate" id="subtitle"]] [[!template text="""documents involved and as you know coming back to the kind of""" start="00:13:05.640" video="qanda-literate" id="subtitle"]] [[!template text="""corporate you know sense of some of the things like there's""" start="00:13:09.240" video="qanda-literate" id="subtitle"]] [[!template text="""that's that's a little dicey the same way a free software""" start="00:13:12.760" video="qanda-literate" id="subtitle"]] [[!template text="""project raising money for itself is a little dicey it might""" start="00:13:15.320" video="qanda-literate" id="subtitle"]] [[!template text="""be a necessary way to get through certain kinds of things and""" start="00:13:19.360" video="qanda-literate" id="subtitle"]] [[!template text="""like what the corporate side of the world brings to the table""" start="00:13:23.600" video="qanda-literate" id="subtitle"]] [[!template text="""here in my mind is that idea of I've got a formal process, like""" start="00:13:26.560" video="qanda-literate" id="subtitle"]] [[!template text="""the process itself is an asset. If I were selling my company,""" start="00:13:32.200" video="qanda-literate" id="subtitle"]] [[!template text="""that would be visibly of value to outside auditors that""" start="00:13:35.240" video="qanda-literate" id="subtitle"]] [[!template text="""would help us arbitrate the sale. It's just empirical. Then""" start="00:13:39.400" video="qanda-literate" id="subtitle"]] [[!template text="""tie that together with free software is maybe a little""" start="00:13:43.480" video="qanda-literate" id="subtitle"]] [[!template text="""unstated ethos of doing our work in the open, and you might""" start="00:13:48.240" video="qanda-literate" id="subtitle"]] [[!template text="""even deal with some of the ick factor. that you know that for a""" start="00:13:53.160" video="qanda-literate" id="subtitle"]] [[!template text="""handler. Maybe so, but yeah, the downside to that is you'd""" start="00:13:58.760" video="qanda-literate" id="subtitle"]] [[!template text="""still need to use Emacs to run through it, right? You know,""" start="00:14:05.120" video="qanda-literate" id="subtitle"]] [[!template text="""for all those cool features, yes, it would be kind of a yet""" start="00:14:09.680" video="qanda-literate" id="subtitle"]] [[!template text="""another killer app that we would have. So my domain name is""" start="00:14:13.720" video="qanda-literate" id="subtitle"]] [[!template text="""orgvm, and my concept is really put org into a box, build a UI""" start="00:14:17.520" video="qanda-literate" id="subtitle"]] [[!template text="""around it, it executes things that manipulate files that""" start="00:14:22.240" video="qanda-literate" id="subtitle"]] [[!template text="""generate, let's say, And that's just one conceptual""" start="00:14:25.120" video="qanda-literate" id="subtitle"]] [[!template text="""solution. But I really do think this is a super fun topic. And""" start="00:14:30.240" video="qanda-literate" id="subtitle"]] [[!template text="""that's the space. I'm not sure my idea is that wonderful. I""" start="00:14:34.360" video="qanda-literate" id="subtitle"]] [[!template text="""personally haven't soaked too many weekends into it. But I""" start="00:14:37.480" video="qanda-literate" id="subtitle"]] [[!template text="""just love the way you're thinking in terms of, well, we""" start="00:14:42.440" video="qanda-literate" id="subtitle"]] [[!template text="""should think more about that. Gosh, that's great to hear.""" start="00:14:45.160" video="qanda-literate" id="subtitle"]] [[!template text="""Yeah. Yeah, I mean, just like the talk yesterday on the""" start="00:14:49.520" video="qanda-literate" id="subtitle"]] [[!template text="""future of org, it's like, let's standardize it. Because,""" start="00:14:53.400" video="qanda-literate" id="subtitle"]] [[!template text="""yeah, we don't want to have org fragmented like Markdown is.""" start="00:14:57.640" video="qanda-literate" id="subtitle"]] [[!template text="""Markdown is terribly fragmented. You know, everybody's""" start="00:15:03.240" video="qanda-literate" id="subtitle"]] [[!template text="""got different implementations. And Yeah, what I've ended""" start="00:15:06.840" video="qanda-literate" id="subtitle"]] [[!template text="""up doing, I don't know if you've seen my blog, but I often I'm""" start="00:15:10.200" video="qanda-literate" id="subtitle"]] [[!template text="""always just writing an org and talking to myself and writing""" start="00:15:15.040" video="qanda-literate" id="subtitle"]] [[!template text="""questions and answers and essays come out of that. And then""" start="00:15:19.120" video="qanda-literate" id="subtitle"]] [[!template text="""I'll put them on my web page and easy. It's easy to publish to a""" start="00:15:22.920" video="qanda-literate" id="subtitle"]] [[!template text="""web page. Well, I do the same thing at work, but I need to have""" start="00:15:26.320" video="qanda-literate" id="subtitle"]] [[!template text="""it marked down. I don't start Markdown though. I'm always""" start="00:15:30.080" video="qanda-literate" id="subtitle"]] [[!template text="""starting an org because that, you know, I can really work""" start="00:15:33.320" video="qanda-literate" id="subtitle"]] [[!template text="""through the problem space, you know, executing code blocks""" start="00:15:36.480" video="qanda-literate" id="subtitle"]] [[!template text="""and making sure they work and all of that sort of stuff. And""" start="00:15:40.240" video="qanda-literate" id="subtitle"]] [[!template text="""then I just export to Markdown and then go cleaned up a little""" start="00:15:44.760" video="qanda-literate" id="subtitle"]] [[!template text="""bit if I need to. And that makes sense. But I am editing""" start="00:15:47.960" video="qanda-literate" id="subtitle"]] [[!template text="""Markdown afterwards. So yeah, it would be nice. It would be""" start="00:15:51.680" video="qanda-literate" id="subtitle"]] [[!template text="""nice. It's just, it's all done over here as opposed to, you""" start="00:15:56.000" video="qanda-literate" id="subtitle"]] [[!template text="""know, Adding it over there, but yeah, let's think about""" start="00:16:00.360" video="qanda-literate" id="subtitle"]] [[!template text="""every bit as much as as that. You know, I jumped in in the""" start="00:16:02.880" video="qanda-literate" id="subtitle"]] [[!template text="""spirit of yes, let's think about it. You know, your, your""" start="00:16:06.520" video="qanda-literate" id="subtitle"]] [[!template text="""comments about, let's think about the workflows that work""" start="00:16:09.960" video="qanda-literate" id="subtitle"]] [[!template text="""for us. Wow. Does that hit home? Right? So great. Yeah. Yeah.""" start="00:16:12.600" video="qanda-literate" id="subtitle"]] [[!template text="""Yeah. Okay. So, uh, on to do's and that sort of thing, um. You""" start="00:16:17.920" video="qanda-literate" id="subtitle"]] [[!template text="""know, a lot is the same as it was 10 years ago. At the beginning""" start="00:16:25.280" video="qanda-literate" id="subtitle"]] [[!template text="""of every sprint,""" start="00:16:32.200" video="qanda-literate" id="subtitle"]] [[!template text="""my company, we're using JIRA.""" start="00:16:33.320" video="qanda-literate" id="subtitle"]] [[!template text="""All jokes are valid when I say that. But I just go to its web""" start="00:16:38.280" video="qanda-literate" id="subtitle"]] [[!template text="""page. I copy all the tasks that I need to do that sprint. I""" start="00:16:46.160" video="qanda-literate" id="subtitle"]] [[!template text="""wrote a function that takes that code and reformats it as a""" start="00:16:49.640" video="qanda-literate" id="subtitle"]] [[!template text="""bunch of org tasks for me to do that I can just now have all my""" start="00:16:54.120" video="qanda-literate" id="subtitle"]] [[!template text="""to-dos. And I start to work off of that from that point on. So""" start="00:16:58.200" video="qanda-literate" id="subtitle"]] [[!template text="""it'll reference all the projects, and I do symlinks to every""" start="00:17:02.800" video="qanda-literate" id="subtitle"]] [[!template text="""code base that I need to use. Most of the to-dos I put inside my""" start="00:17:06.480" video="qanda-literate" id="subtitle"]] [[!template text="""code block is kind of just for me, just so I can remember it.""" start="00:17:12.480" video="qanda-literate" id="subtitle"]] [[!template text="""Because the work that I have to do needs to be tracked a little""" start="00:17:16.640" video="qanda-literate" id="subtitle"]] [[!template text="""more""" start="00:17:22.760" video="qanda-literate" id="subtitle"]] [[!template text="""fine-grained, I guess. Yeah. Do I use LP also on larger""" start="00:17:24.120" video="qanda-literate" id="subtitle"]] [[!template text="""projects? More files and nested directories? Yeah, I""" start="00:17:33.440" video="qanda-literate" id="subtitle"]] [[!template text="""haven't really done nested directories, but I can now. Now""" start="00:17:37.200" video="qanda-literate" id="subtitle"]] [[!template text="""that I've now kind of realized that I have the feature that I""" start="00:17:43.880" video="qanda-literate" id="subtitle"]] [[!template text="""demonstrated where I can just jump to any projects for a""" start="00:17:49.840" video="qanda-literate" id="subtitle"]] [[!template text="""particular project, all the org files and all the headings""" start="00:17:54.440" video="qanda-literate" id="subtitle"]] [[!template text="""show up, that works in nested directories.""" start="00:17:59.560" video="qanda-literate" id="subtitle"]] [[!template text="""Oh, okay, yeah, somebody's typing it in. Yeah, so it's""" start="00:18:02.440" video="qanda-literate" id="subtitle"]] [[!template text="""definitely possible. And I have now, since I recorded the""" start="00:18:11.000" video="qanda-literate" id="subtitle"]] [[!template text="""talk, I've been busy typing in and trying to extract that out""" start="00:18:15.360" video="qanda-literate" id="subtitle"]] [[!template text="""of my init file and make it into a package. I'm looking for a""" start="00:18:20.520" video="qanda-literate" id="subtitle"]] [[!template text="""good name right now. I'm calling it jobs, jump to project""" start="00:18:24.480" video="qanda-literate" id="subtitle"]] [[!template text="""sections. Anyway, but yeah, I think that's kind of a nice,""" start="00:18:30.240" video="qanda-literate" id="subtitle"]] [[!template text="""useful feature. Have I used Cucumber, Gherkin, and other""" start="00:18:36.400" video="qanda-literate" id="subtitle"]] [[!template text="""behavior-driven development?""" start="00:18:41.920" video="qanda-literate" id="subtitle"]] [[!template text="""Have I, I mean, I do a lot of...""" start="00:18:44.480" video="qanda-literate" id="subtitle"]] [[!template text="""more test driven. I do a lot of unit tests and I just put it""" start="00:18:50.720" video="qanda-literate" id="subtitle"]] [[!template text="""right in my code base because if it's in my pros, I can just""" start="00:19:00.280" video="qanda-literate" id="subtitle"]] [[!template text="""shove it in there. I've got the test right next to the""" start="00:19:04.680" video="qanda-literate" id="subtitle"]] [[!template text="""function that I'm testing. I like that so I can kind of see it.""" start="00:19:07.200" video="qanda-literate" id="subtitle"]] [[!template text="""I don't tangle it out to that same source file. I tangle it""" start="00:19:11.520" video="qanda-literate" id="subtitle"]] [[!template text="""somewhere else if I tangle it at all because I don't need to. I""" start="00:19:15.360" video="qanda-literate" id="subtitle"]] [[!template text="""can just, you know, control C that and run it. I like that""" start="00:19:19.120" video="qanda-literate" id="subtitle"]] [[!template text="""aspect of it.""" start="00:19:23.200" video="qanda-literate" id="subtitle"]] [[!template text="""Yeah, just keeping things together. That's the big problem""" start="00:19:24.880" video="qanda-literate" id="subtitle"]] [[!template text="""I have with a lot of tests is the tests are somewhere else.""" start="00:19:29.320" video="qanda-literate" id="subtitle"]] [[!template text="""It's separate from the code. I like seeing it all together,""" start="00:19:32.480" video="qanda-literate" id="subtitle"]] [[!template text="""but a lot depends on how extensive it is. So for a lot of the,""" start="00:19:35.320" video="qanda-literate" id="subtitle"]] [[!template text="""you know, the tests that we end up doing where, you know,""" start="00:19:39.880" video="qanda-literate" id="subtitle"]] [[!template text="""you've got to do a lot of mocks and a lot of startup and tear""" start="00:19:43.360" video="qanda-literate" id="subtitle"]] [[!template text="""down, that kind of thing. Yeah, that doesn't help as much.""" start="00:19:47.760" video="qanda-literate" id="subtitle"]] [[!template text="""And you probably have to kind of go old school on that.""" start="00:19:51.840" video="qanda-literate" id="subtitle"]] [[!template text="""What granularity I'm looking for with my org files and my""" start="00:19:54.600" video="qanda-literate" id="subtitle"]] [[!template text="""subcontent? That's a real good question and really""" start="00:20:01.360" video="qanda-literate" id="subtitle"]] [[!template text="""subjective. I change that over time. I begin by just dump. I""" start="00:20:04.880" video="qanda-literate" id="subtitle"]] [[!template text="""just dump everything in my head into a file and then I go""" start="00:20:13.160" video="qanda-literate" id="subtitle"]] [[!template text="""through and start to refine it.""" start="00:20:17.080" video="qanda-literate" id="subtitle"]] [[!template text="""My goal at one point was to have an Emacs config file that was""" start="00:20:19.680" video="qanda-literate" id="subtitle"]] [[!template text="""really small and simple. And boy, that just doesn't happen.""" start="00:20:26.160" video="qanda-literate" id="subtitle"]] [[!template text="""It's just too fun to add things and try new ideas. And I found""" start="00:20:29.920" video="qanda-literate" id="subtitle"]] [[!template text="""my files were just littered with good ideas that were""" start="00:20:35.760" video="qanda-literate" id="subtitle"]] [[!template text="""half-baked and not finished. And so it's like, oh, I need to""" start="00:20:41.840" video="qanda-literate" id="subtitle"]] [[!template text="""extract these and put them into different files so I can keep""" start="00:20:47.120" video="qanda-literate" id="subtitle"]] [[!template text="""it clean. And so I think it's like with any code base, you're""" start="00:20:49.960" video="qanda-literate" id="subtitle"]] [[!template text="""just going to keep refactoring. It's an iterative process.""" start="00:20:54.360" video="qanda-literate" id="subtitle"]] [[!template text="""So having the ability to, like with an org file, where you can""" start="00:20:59.000" video="qanda-literate" id="subtitle"]] [[!template text="""archive a subtree. Okay, this idea didn't pan out. Archive""" start="00:21:04.200" video="qanda-literate" id="subtitle"]] [[!template text="""it. I can come back to it later. Being able to just kind of""" start="00:21:09.160" video="qanda-literate" id="subtitle"]] [[!template text="""shove it somewhere else is really a nice little feature. All""" start="00:21:13.520" video="qanda-literate" id="subtitle"]] [[!template text="""right. Not a question, just a comment. We need more of your""" start="00:21:20.400" video="qanda-literate" id="subtitle"]] [[!template text="""insightful posts and videos. Oh, thanks.""" start="00:21:25.080" video="qanda-literate" id="subtitle"]] [[!template text="""I appreciate it. Yes, it's been a fun journey. And I think we""" start="00:21:29.240" video="qanda-literate" id="subtitle"]] [[!template text="""are coming up on our time, actually. So that is just an""" start="00:21:35.520" video="qanda-literate" id="subtitle"]] [[!template text="""amazing quiz. And it helps me from manipulating, as I said,""" start="00:21:38.520" video="qanda-literate" id="subtitle"]] [[!template text="""or as I put it earlier, like my chance as an organizer, or not""" start="00:21:41.920" video="qanda-literate" id="subtitle"]] [[!template text="""manipulating, monopolizing my chance as an organizer to""" start="00:21:46.960" video="qanda-literate" id="subtitle"]] [[!template text="""just get a chance to pick your brain on all kinds of things,""" start="00:21:50.680" video="qanda-literate" id="subtitle"]] [[!template text="""which is too kind, too kind. Appreciate it. It's been fun.""" start="00:21:53.440" video="qanda-literate" id="subtitle"]] [[!template text="""All right, I'll try answering more questions online as""" start="00:21:58.960" video="qanda-literate" id="subtitle"]] [[!template text="""well. All right, talk to you later. And we appreciate your""" start="00:22:04.680" video="qanda-literate" id="subtitle"]] [[!template text="""being in a huge resource that you are to the community.""" start="00:22:07.960" video="qanda-literate" id="subtitle"]] [[!template text="""Thanks to everyone for tuning in and we'll be coming over to""" start="00:22:10.400" video="qanda-literate" id="subtitle"]] [[!template text="""our next talk in just a moment here. And so bear with us""" start="00:22:14.200" video="qanda-literate" id="subtitle"]] [[!template text="""through the transition as we slip into, I think it's our, is""" start="00:22:18.240" video="qanda-literate" id="subtitle"]] [[!template text="""that our penultimate or our ultimate talk? We have one or two""" start="00:22:23.240" video="qanda-literate" id="subtitle"]] [[!template text="""left, I'm not sure. I think we've got a couple of talks left.""" start="00:22:26.920" video="qanda-literate" id="subtitle"]] [[!template text="""I'm back. Thank you, Howard. And we will be moving to the next""" start="00:22:30.120" video="qanda-literate" id="subtitle"]] [[!template text="""talk in about six minutes. So if you need to grab some coffee,""" start="00:22:34.080" video="qanda-literate" id="subtitle"]] [[!template text="""some tea, use the time wisely. And to confirm, we will have""" start="00:22:37.160" video="qanda-literate" id="subtitle"]] [[!template text="""one, two, three more talks this afternoon. So there's still""" start="00:22:42.120" video="qanda-literate" id="subtitle"]] [[!template text="""plenty to go around. See you in a bit, folks.""" start="00:22:44.320" video="qanda-literate" id="subtitle"]]
Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202023%20literate%3A%20Literate%20programming%20for%20the%2021st%20Century)