diff options
Diffstat (limited to '2020/subtitles')
6 files changed, 3322 insertions, 3690 deletions
diff --git a/2020/subtitles/emacsconf-2020--13-experience-report-steps-to-emacs-hyper-notebooks--joseph-corneli-raymond-puzio-cameron-ray-smith-autogen.vtt b/2020/subtitles/emacsconf-2020--13-experience-report-steps-to-emacs-hyper-notebooks--joseph-corneli-raymond-puzio-cameron-ray-smith-autogen.vtt deleted file mode 100644 index eb176536..00000000 --- a/2020/subtitles/emacsconf-2020--13-experience-report-steps-to-emacs-hyper-notebooks--joseph-corneli-raymond-puzio-cameron-ray-smith-autogen.vtt +++ /dev/null @@ -1,1081 +0,0 @@ -WEBVTT - -00:00:00.320 --> 00:00:03.280 -um so hi I'm joe corneli - -00:00:03.280 --> 00:00:05.920 -uh this is work I did with ray puzio and - -00:00:05.920 --> 00:00:06.879 -cameron smith - -00:00:06.879 --> 00:00:10.559 -um and they're the main protagonists in - -00:00:10.559 --> 00:00:11.599 -this story they - -00:00:11.599 --> 00:00:14.960 -are uh researchers who've been working - -00:00:14.960 --> 00:00:17.840 -on theoretical biology um so in a - -00:00:17.840 --> 00:00:20.160 -typical project they may use manxima - -00:00:20.160 --> 00:00:23.760 -and julia their work for biology physics - -00:00:23.760 --> 00:00:24.800 -and computer science - -00:00:24.800 --> 00:00:27.199 -computer science and the latest work in - -00:00:27.199 --> 00:00:29.439 -progress is on branching processes for - -00:00:29.439 --> 00:00:30.800 -cancer modeling so - -00:00:30.800 --> 00:00:34.719 -how can um Emacs possibly help - -00:00:34.719 --> 00:00:37.360 -let's let's have a look uh moving code - -00:00:37.360 --> 00:00:38.399 -and data between these different - -00:00:38.399 --> 00:00:39.680 -programs by hand is - -00:00:39.680 --> 00:00:42.000 -annoying on separate workflows for - -00:00:42.000 --> 00:00:43.200 -writing up notes and preparing - -00:00:43.200 --> 00:00:44.399 -publications - -00:00:44.399 --> 00:00:46.000 -is perhaps even more annoying all of - -00:00:46.000 --> 00:00:48.640 -it's time consuming and error-prone - -00:00:48.640 --> 00:00:52.000 -um so what about maybe using jupiter - -00:00:52.000 --> 00:00:53.760 -uh we found something called script of - -00:00:53.760 --> 00:00:55.199 -scripts and it solves some of those - -00:00:55.199 --> 00:00:58.399 -problems because you can use - -00:00:58.399 --> 00:01:01.120 -maximum and julia together but we were - -00:01:01.120 --> 00:01:02.640 -quite happy to explore emacs based - -00:01:02.640 --> 00:01:05.199 -solutions being emax enthusiasts and we - -00:01:05.199 --> 00:01:05.840 -even - -00:01:05.840 --> 00:01:07.760 -got cameron to be enthusiastic about - -00:01:07.760 --> 00:01:09.200 -doing emacs so that - -00:01:09.200 --> 00:01:11.600 -went nice so just here's a little - -00:01:11.600 --> 00:01:12.400 -feature grid - -00:01:12.400 --> 00:01:15.360 -of emacs org versus just sort of your - -00:01:15.360 --> 00:01:16.400 -generic - -00:01:16.400 --> 00:01:19.040 -um tools that are in a different more - -00:01:19.040 --> 00:01:20.960 -general ecosystem so as you can see it's - -00:01:20.960 --> 00:01:21.520 -quite - -00:01:21.520 --> 00:01:23.360 -feature complete you've got your maximo - -00:01:23.360 --> 00:01:25.520 -mode julia mode you can use both of them - -00:01:25.520 --> 00:01:27.119 -inside of org mode - -00:01:27.119 --> 00:01:28.720 -you can present things with word tree - -00:01:28.720 --> 00:01:30.240 -slide you can set up a - -00:01:30.240 --> 00:01:33.280 -wiki inside of orgrome this is one I - -00:01:33.280 --> 00:01:33.680 -found - -00:01:33.680 --> 00:01:35.759 -rather recently you can even use - -00:01:35.759 --> 00:01:37.759 -compatibly with orgrome something called - -00:01:37.759 --> 00:01:38.799 -log seek - -00:01:38.799 --> 00:01:41.520 -which is in the browser um so that's - -00:01:41.520 --> 00:01:42.159 -nice - -00:01:42.159 --> 00:01:44.320 -um you can do real-time collaborative - -00:01:44.320 --> 00:01:45.840 -editing um - -00:01:45.840 --> 00:01:47.840 -either in a kind of pairing style or in - -00:01:47.840 --> 00:01:49.280 -a more etherpad style - -00:01:49.280 --> 00:01:51.520 -obviously you can manage your references - -00:01:51.520 --> 00:01:54.159 -you can typeset whatever you want um you - -00:01:54.159 --> 00:01:55.759 -can publish work in progress on a blog - -00:01:55.759 --> 00:01:57.439 -and the fern is another one of these - -00:01:57.439 --> 00:01:58.159 -external - -00:01:58.159 --> 00:02:00.560 -org mode tools it's not actually any mac - -00:02:00.560 --> 00:02:01.360 -but works with - -00:02:01.360 --> 00:02:03.680 -org mode stuff and you know so we're - -00:02:03.680 --> 00:02:04.399 -good to go - -00:02:04.399 --> 00:02:06.640 -uh with all of that so what does that - -00:02:06.640 --> 00:02:08.000 -look like well here's - -00:02:08.000 --> 00:02:09.679 -a little example from before they were - -00:02:09.679 --> 00:02:11.599 -doing um - -00:02:11.599 --> 00:02:12.800 -before we started really thinking - -00:02:12.800 --> 00:02:14.560 -seriously about this stuff so this is - -00:02:14.560 --> 00:02:15.599 -just maxima - -00:02:15.599 --> 00:02:17.440 -well maximo doesn't have a long running - -00:02:17.440 --> 00:02:19.280 -process by default if you've ever used - -00:02:19.280 --> 00:02:20.160 -python - -00:02:20.160 --> 00:02:22.480 -uh you have something called sessions uh - -00:02:22.480 --> 00:02:23.920 -they don't have that for maxim at least - -00:02:23.920 --> 00:02:24.959 -not by default - -00:02:24.959 --> 00:02:27.599 -um so how what was the workaround - -00:02:27.599 --> 00:02:29.360 -there's this thing called uh - -00:02:29.360 --> 00:02:32.480 -solve for you here and um - -00:02:32.480 --> 00:02:34.879 -that shows up down below again in these - -00:02:34.879 --> 00:02:36.319 -angle brackets which you've seen maybe - -00:02:36.319 --> 00:02:37.360 -in someone else's talk - -00:02:37.360 --> 00:02:40.480 -uh which means go to the previous uh - -00:02:40.480 --> 00:02:41.920 -thing that was named soul for you - -00:02:41.920 --> 00:02:43.920 -and do that all over again so they do - -00:02:43.920 --> 00:02:45.280 -that over again - -00:02:45.280 --> 00:02:47.440 -and here's the little maxima code for - -00:02:47.440 --> 00:02:49.519 -defining you saw so you've now defined - -00:02:49.519 --> 00:02:50.560 -you saw - -00:02:50.560 --> 00:02:51.920 -and then you can use it in the next - -00:02:51.920 --> 00:02:54.000 -expression you get out a nice juicy - -00:02:54.000 --> 00:02:56.560 -zero at the end but it's a little bit a - -00:02:56.560 --> 00:02:57.200 -little bit - -00:02:57.200 --> 00:02:58.959 -like cartridge in a pear tree to have to - -00:02:58.959 --> 00:03:00.640 -redefine everything every time - -00:03:00.640 --> 00:03:02.560 -so this is clearly at the level of work - -00:03:02.560 --> 00:03:04.159 -around um maybe just - -00:03:04.159 --> 00:03:06.879 -one more time going looking through that - -00:03:06.879 --> 00:03:07.920 -um - -00:03:07.920 --> 00:03:11.599 -that stuff um - -00:03:11.599 --> 00:03:13.760 -sorry so uh looking through that stuff - -00:03:13.760 --> 00:03:15.280 -this is we're going to need something - -00:03:15.280 --> 00:03:17.200 -like that probably for stitching - -00:03:17.200 --> 00:03:19.599 -maxima and julie julia together so it's - -00:03:19.599 --> 00:03:20.319 -good to - -00:03:20.319 --> 00:03:21.680 -look a little bit about how that might - -00:03:21.680 --> 00:03:23.920 -work so first of all you can cache - -00:03:23.920 --> 00:03:25.680 -results so if you wanted to save the - -00:03:25.680 --> 00:03:26.480 -date - -00:03:26.480 --> 00:03:28.480 -out of block one at a certain time and - -00:03:28.480 --> 00:03:29.920 -then use - -00:03:29.920 --> 00:03:32.239 -use it again later so at the time when I - -00:03:32.239 --> 00:03:33.280 -ran this code - -00:03:33.280 --> 00:03:34.640 -you can see I've got two slightly - -00:03:34.640 --> 00:03:36.720 -different time stamps down below one's - -00:03:36.720 --> 00:03:38.560 -the cached result and the other was the - -00:03:38.560 --> 00:03:40.319 -result of reevaluating - -00:03:40.319 --> 00:03:42.640 -the block so you can move things around - -00:03:42.640 --> 00:03:43.760 -um and that's - -00:03:43.760 --> 00:03:46.000 -that's going to be useful but you know - -00:03:46.000 --> 00:03:47.280 -that's not really the main problem the - -00:03:47.280 --> 00:03:48.080 -main problem is - -00:03:48.080 --> 00:03:50.799 -making maxima long running so kind of - -00:03:50.799 --> 00:03:51.440 -the - -00:03:51.440 --> 00:03:53.920 -core of this talk is a new observant - -00:03:53.920 --> 00:03:56.400 -facility which is a general purpose - -00:03:56.400 --> 00:03:59.280 -way to do that kind of thing which - -00:03:59.280 --> 00:04:00.560 -involves a very simple - -00:04:00.560 --> 00:04:04.239 -change to obcor uh so we'll give a quick - -00:04:04.239 --> 00:04:05.360 -overview of that and show - -00:04:05.360 --> 00:04:08.480 -an example um so here's the example - -00:04:08.480 --> 00:04:11.760 -um a very simple sort of silly example - -00:04:11.760 --> 00:04:13.040 -uh what does it mean to have a long - -00:04:13.040 --> 00:04:14.640 -running process here I've set this - -00:04:14.640 --> 00:04:15.920 -display2d - -00:04:15.920 --> 00:04:18.560 -to be false um which just means that - -00:04:18.560 --> 00:04:19.440 -things are going to come - -00:04:19.440 --> 00:04:22.320 -come across in 1d and then I ask it to - -00:04:22.320 --> 00:04:23.040 -expand - -00:04:23.040 --> 00:04:25.199 -uh something and I get latex by default - -00:04:25.199 --> 00:04:27.280 -so so that's what it means is I've sent - -00:04:27.280 --> 00:04:28.639 -something in and it's going to come - -00:04:28.639 --> 00:04:30.240 -across in one view which is great - -00:04:30.240 --> 00:04:32.080 -um maybe you'll also notice that there's - -00:04:32.080 --> 00:04:34.560 -no semicolon if you're a maxima fan - -00:04:34.560 --> 00:04:36.720 -um and things are coming across as tech - -00:04:36.720 --> 00:04:38.400 -so those were some little bonus features - -00:04:38.400 --> 00:04:40.320 -and I'll show you how that works later - -00:04:40.320 --> 00:04:41.040 -so - -00:04:41.040 --> 00:04:45.440 -um the change to obcor is as follows uh - -00:04:45.440 --> 00:04:48.880 -um we uh actually this should say uh - -00:04:48.880 --> 00:04:51.520 -instead of stream here it should say um - -00:04:51.520 --> 00:04:52.479 -servant - -00:04:52.479 --> 00:04:54.800 -sorry uh we tried an experimental - -00:04:54.800 --> 00:04:56.160 -version what's called stream so now it's - -00:04:56.160 --> 00:04:58.160 -called servant but all it does is it - -00:04:58.160 --> 00:05:01.520 -overrides uh or babel execute laying for - -00:05:01.520 --> 00:05:02.639 -arbitrary laying - -00:05:02.639 --> 00:05:05.919 -if you have um a servant - -00:05:05.919 --> 00:05:07.840 -in your in your params so that's the - -00:05:07.840 --> 00:05:09.759 -change that hasn't been - -00:05:09.759 --> 00:05:11.919 -pushed out or sent as a patch to anybody - -00:05:11.919 --> 00:05:13.759 -but it's a pretty minor change - -00:05:13.759 --> 00:05:16.960 -um here's an overview without the code - -00:05:16.960 --> 00:05:19.080 -of just a high level overview of - -00:05:19.080 --> 00:05:20.720 -observant.el so - -00:05:20.720 --> 00:05:22.160 -it stores information about these - -00:05:22.160 --> 00:05:24.479 -processes in a hash table - -00:05:24.479 --> 00:05:26.080 -it can do pre-processing and - -00:05:26.080 --> 00:05:27.600 -post-processing - -00:05:27.600 --> 00:05:29.759 -um it does all these things it stores - -00:05:29.759 --> 00:05:30.720 -the output - -00:05:30.720 --> 00:05:32.479 -I mentioned here that in principle we - -00:05:32.479 --> 00:05:34.080 -could store lots of output and have a - -00:05:34.080 --> 00:05:35.280 -kind of browsable - -00:05:35.280 --> 00:05:36.560 -history although we don't do that - -00:05:36.560 --> 00:05:38.880 -presently um but that's what observant - -00:05:38.880 --> 00:05:40.639 -does is it does what you might expect - -00:05:40.639 --> 00:05:41.440 -and here's the - -00:05:41.440 --> 00:05:45.440 -here's the maxima kind of um - -00:05:45.440 --> 00:05:48.160 -on-ramp uh to get maxima brought in so - -00:05:48.160 --> 00:05:49.600 -you have to obviously have a maximum - -00:05:49.600 --> 00:05:51.360 -process you can call - -00:05:51.360 --> 00:05:54.960 -um put hash uh this is the preprocessing - -00:05:54.960 --> 00:05:57.840 -thing I mentioned adding in some tech um - -00:05:57.840 --> 00:05:58.960 -and adding in - -00:05:58.960 --> 00:06:01.520 -uh or deleting rather a substring and - -00:06:01.520 --> 00:06:03.120 -here here is why you delete the - -00:06:03.120 --> 00:06:03.759 -substring - -00:06:03.759 --> 00:06:06.960 -is because um maxima thinks it's a good - -00:06:06.960 --> 00:06:08.240 -idea to tell you false - -00:06:08.240 --> 00:06:10.080 -once you once you run check on things - -00:06:10.080 --> 00:06:11.759 -you've got to delete that back out to - -00:06:11.759 --> 00:06:13.680 -get something kind of coherent out of it - -00:06:13.680 --> 00:06:16.960 -but so this is how to set up maximal um - -00:06:16.960 --> 00:06:19.280 -that's enough really of the demo is not - -00:06:19.280 --> 00:06:20.000 -really a demos for - -00:06:20.000 --> 00:06:21.919 -show and tell but uh this is an - -00:06:21.919 --> 00:06:23.600 -experience report I wanted to talk about - -00:06:23.600 --> 00:06:25.440 -the experience of doing this - -00:06:25.440 --> 00:06:28.080 -so some some negatives like we tried to - -00:06:28.080 --> 00:06:30.160 -get emacs jupiter working - -00:06:30.160 --> 00:06:33.199 -prior to prior to working on the um - -00:06:33.199 --> 00:06:36.000 -observant and we couldn't get it doing - -00:06:36.000 --> 00:06:37.919 -everything we wanted despite a bit of - -00:06:37.919 --> 00:06:40.160 -heavy lifting and debugging and stuff so - -00:06:40.160 --> 00:06:41.840 -that's not not finished that was a bit - -00:06:41.840 --> 00:06:42.880 -difficult - -00:06:42.880 --> 00:06:45.360 -um on the other hand working on - -00:06:45.360 --> 00:06:47.759 -observing was fun and pretty lightweight - -00:06:47.759 --> 00:06:48.479 -and easy - -00:06:48.479 --> 00:06:50.400 -um we got some experience co-editing - -00:06:50.400 --> 00:06:52.400 -things with these real-time tools - -00:06:52.400 --> 00:06:54.479 -obviously the stack is somewhat work in - -00:06:54.479 --> 00:06:55.919 -progress um - -00:06:55.919 --> 00:06:58.000 -so I just wanted to give a shout out to - -00:06:58.000 --> 00:07:00.800 -crdt which was really fun - -00:07:00.800 --> 00:07:03.919 -and champion was making bug fiction - -00:07:03.919 --> 00:07:07.039 -bug fixes for that as we go similarly - -00:07:07.039 --> 00:07:08.960 -for fern and log seek the maintainers - -00:07:08.960 --> 00:07:10.160 -were really responsive - -00:07:10.160 --> 00:07:12.960 -um and so that was nice we did try to - -00:07:12.960 --> 00:07:14.560 -get emacs running in the browser - -00:07:14.560 --> 00:07:15.840 -thinking it would be really nice for - -00:07:15.840 --> 00:07:16.880 -people who - -00:07:16.880 --> 00:07:19.520 -um didn't want to install it to get a - -00:07:19.520 --> 00:07:21.120 -chance to just try it - -00:07:21.120 --> 00:07:23.120 -uh but actually browsers capture things - -00:07:23.120 --> 00:07:24.479 -like uh control n - -00:07:24.479 --> 00:07:27.120 -and so that's that was a bit annoying - -00:07:27.120 --> 00:07:28.479 -but we did get lots of great feedback - -00:07:28.479 --> 00:07:29.759 -and interaction with people including - -00:07:29.759 --> 00:07:31.599 -around this conference so thank you - -00:07:31.599 --> 00:07:33.759 -to those who we've had discussions with - -00:07:33.759 --> 00:07:35.599 -um - -00:07:35.599 --> 00:07:37.680 -so future work okay so maybe you - -00:07:37.680 --> 00:07:38.639 -remember I didn't - -00:07:38.639 --> 00:07:41.039 -give a talk a few years back on arcana - -00:07:41.039 --> 00:07:42.400 -so what what - -00:07:42.400 --> 00:07:44.479 -might this have to do with org mode and - -00:07:44.479 --> 00:07:45.919 -that's always the question one asks - -00:07:45.919 --> 00:07:47.039 -about arcata - -00:07:47.039 --> 00:07:48.720 -well so arcana one of the things it does - -00:07:48.720 --> 00:07:50.319 -is transclusions and so that could be - -00:07:50.319 --> 00:07:51.680 -actually very helpful - -00:07:51.680 --> 00:07:54.000 -in connection with this combined notes - -00:07:54.000 --> 00:07:55.520 -and write-up workflow so you might have - -00:07:55.520 --> 00:07:56.479 -a - -00:07:56.479 --> 00:07:58.400 -forward mode uh and some of these - -00:07:58.400 --> 00:08:00.800 -results we got back as raw results - -00:08:00.800 --> 00:08:03.199 -could go right into your write up in a - -00:08:03.199 --> 00:08:03.919 -kind of - -00:08:03.919 --> 00:08:07.520 -convenient way at a level above um - -00:08:07.520 --> 00:08:09.039 -transparently a level above the notebook - -00:08:09.039 --> 00:08:11.280 -so you'd have the notebook alongside the - -00:08:11.280 --> 00:08:13.440 -write-up in that case - -00:08:13.440 --> 00:08:15.599 -which is a sort of variation on the - -00:08:15.599 --> 00:08:16.800 -literate programming - -00:08:16.800 --> 00:08:19.120 -workflow this is speculative who knows - -00:08:19.120 --> 00:08:20.000 -the other thought is - -00:08:20.000 --> 00:08:22.080 -it just relates to the idea of network - -00:08:22.080 --> 00:08:23.520 -programming so we can imagine these - -00:08:23.520 --> 00:08:24.800 -networks of - -00:08:24.800 --> 00:08:26.639 -computational nodes maybe sitting inside - -00:08:26.639 --> 00:08:28.800 -of orgrome calling each other - -00:08:28.800 --> 00:08:31.199 -um and you would want to maintain some - -00:08:31.199 --> 00:08:32.560 -kind of model of that - -00:08:32.560 --> 00:08:34.959 -process and a sort of general question - -00:08:34.959 --> 00:08:36.640 -is how do we have a remote control for - -00:08:36.640 --> 00:08:38.320 -long-running processes you could do that - -00:08:38.320 --> 00:08:40.240 -in lisp or closure but - -00:08:40.240 --> 00:08:42.479 -maybe we could have something a little - -00:08:42.479 --> 00:08:44.080 -bit like that here - -00:08:44.080 --> 00:08:45.839 -um so conclusions what have we actually - -00:08:45.839 --> 00:08:48.080 -addressed well uh we addressed uh - -00:08:48.080 --> 00:08:50.080 -accessing any long-running process with - -00:08:50.080 --> 00:08:51.600 -a simple or mode interface - -00:08:51.600 --> 00:08:52.959 -obviously we're not the only people to - -00:08:52.959 --> 00:08:54.880 -think about notebooks but we think that - -00:08:54.880 --> 00:08:56.880 -emacs has some advantages - -00:08:56.880 --> 00:08:58.880 -related to reproducible research and - -00:08:58.880 --> 00:09:01.120 -interdisciplinary collaboration so let's - -00:09:01.120 --> 00:09:01.680 -just - -00:09:01.680 --> 00:09:03.120 -say that we think something is - -00:09:03.120 --> 00:09:04.880 -reproducible if it's actually teachable - -00:09:04.880 --> 00:09:07.200 -to someone new and they can do it - -00:09:07.200 --> 00:09:09.279 -org mode seems very useful for that many - -00:09:09.279 --> 00:09:11.680 -of the other talks have touched on this - -00:09:11.680 --> 00:09:14.399 -interdisciplinary collaboration is great - -00:09:14.399 --> 00:09:16.000 -this was an interdisciplinary - -00:09:16.000 --> 00:09:17.839 -collaboration on some level but - -00:09:17.839 --> 00:09:19.680 -what about you know future work for - -00:09:19.680 --> 00:09:21.600 -bringing in scenario planners simulation - -00:09:21.600 --> 00:09:22.320 -scientists - -00:09:22.320 --> 00:09:24.480 -and local farmers and building something - -00:09:24.480 --> 00:09:25.519 -that they can all - -00:09:25.519 --> 00:09:27.200 -use that's more than the sum of the - -00:09:27.200 --> 00:09:29.200 -parts so a little - -00:09:29.200 --> 00:09:30.720 -future work for everybody else here so - -00:09:30.720 --> 00:09:32.160 -we think science should be widely - -00:09:32.160 --> 00:09:33.120 -teachable - -00:09:33.120 --> 00:09:34.560 -shareable semi-automated - -00:09:34.560 --> 00:09:36.720 -transdisciplinary and real time - -00:09:36.720 --> 00:09:40.399 -like EmacsConf so you can get in touch - -00:09:40.399 --> 00:09:43.279 -uh via these methods and the code which - -00:09:43.279 --> 00:09:44.560 -is very much early stage work in - -00:09:44.560 --> 00:09:45.200 -progress - -00:09:45.200 --> 00:09:46.640 -as this was meant to be an experience - -00:09:46.640 --> 00:09:48.800 -report not a it's all done here it is - -00:09:48.800 --> 00:09:49.920 -polished report - -00:09:49.920 --> 00:09:51.680 -um it's also online if you'd like to - -00:09:51.680 --> 00:09:53.360 -have a look so that's the end of the - -00:09:53.360 --> 00:09:54.560 -talk and I don't know if there's time - -00:09:54.560 --> 00:09:55.279 -for questions - -00:09:55.279 --> 00:09:57.440 -or not but um I'm at your disposal now - -00:09:57.440 --> 00:10:00.240 -thank you you are now unmuted - -00:10:00.240 --> 00:10:04.079 -um many thanks for the tough job - -00:10:04.079 --> 00:10:07.120 -uh let's see we have about I think four - -00:10:07.120 --> 00:10:08.880 -minutes four questions - -00:10:08.880 --> 00:10:10.880 -um and we have a couple of questions on - -00:10:10.880 --> 00:10:12.320 -the pad would you like to read them - -00:10:12.320 --> 00:10:14.240 -yourself or should I read them to you - -00:10:14.240 --> 00:10:16.560 -uh just for sake of easy management why - -00:10:16.560 --> 00:10:18.079 -don't you read them out if that's okay - -00:10:18.079 --> 00:10:21.279 -yeah sure uh so they ask have you looked - -00:10:21.279 --> 00:10:22.240 -into trying - -00:10:22.240 --> 00:10:25.440 -sage math I've long uh long wanted - -00:10:25.440 --> 00:10:33.760 -nothing org files - -00:10:33.760 --> 00:10:36.959 -right and I and I wrote the answer that - -00:10:36.959 --> 00:10:39.279 -we should be possible because one can - -00:10:39.279 --> 00:10:44.839 -call it from a command - -00:10:44.839 --> 00:10:46.399 -okay - -00:10:46.399 --> 00:10:48.640 -and I see there's another sagemath - -00:10:48.640 --> 00:10:50.079 -question that you seem to have answered - -00:10:50.079 --> 00:10:52.100 -as well so I guess I won't repeat that - -00:10:52.100 --> 00:10:54.880 -[Music] - -00:10:54.880 --> 00:10:56.959 -there's let's not forget about embedded - -00:10:56.959 --> 00:11:00.640 -calc in emacs - -00:11:00.640 --> 00:11:03.680 -so so the first demos actually were with - -00:11:03.680 --> 00:11:05.040 -calc so that's that's - -00:11:05.040 --> 00:11:06.640 -useful uh although I think it was a - -00:11:06.640 --> 00:11:07.839 -different kind of a different command - -00:11:07.839 --> 00:11:08.240 -line - -00:11:08.240 --> 00:11:11.839 -well that was the next calc yeah - -00:11:11.839 --> 00:11:13.839 -so sure there is there is calc so that - -00:11:13.839 --> 00:11:15.680 -would be calculus and - -00:11:15.680 --> 00:11:19.120 -calc is already in org mode yeah - -00:11:19.120 --> 00:11:25.680 -yeah yeah - -00:11:25.680 --> 00:11:39.760 -um still looking for questions - -00:11:39.760 --> 00:11:41.760 -okay I think that's about it I don't see - -00:11:41.760 --> 00:11:44.320 -any questions on the ether pad - -00:11:44.320 --> 00:11:47.440 -and let's see - -00:11:47.440 --> 00:11:53.040 -anything on irc - -00:11:53.040 --> 00:11:55.760 -um nothing but phrases and everyone - -00:11:55.760 --> 00:11:56.720 -thanking you - -00:11:56.720 --> 00:11:59.120 -thank you all right you're welcome - -00:11:59.120 --> 00:12:00.240 -thanks a lot uh - -00:12:00.240 --> 00:12:02.880 -we'll see you guys around then cheers - -00:12:02.880 --> 00:12:06.800 -and see you around diff --git a/2020/subtitles/emacsconf-2020--13-experience-report-steps-to-emacs-hyper-notebooks--joseph-corneli-raymond-puzio-cameron-ray-smith.vtt b/2020/subtitles/emacsconf-2020--13-experience-report-steps-to-emacs-hyper-notebooks--joseph-corneli-raymond-puzio-cameron-ray-smith.vtt new file mode 100644 index 00000000..15513080 --- /dev/null +++ b/2020/subtitles/emacsconf-2020--13-experience-report-steps-to-emacs-hyper-notebooks--joseph-corneli-raymond-puzio-cameron-ray-smith.vtt @@ -0,0 +1,968 @@ +WEBVTT + +00:00:00.320 --> 00:00:03.280 +Joe: Hi, I'm Joe Corneli. + +00:00:03.280 --> 00:00:06.879 +This is work I did with Ray Puzio and +Cameron Smith. + +00:00:06.879 --> 00:00:11.123 +They're the main protagonists in +this story. + +00:00:11.123 --> 00:00:14.960 +They are researchers who've been working + +00:00:14.960 --> 00:00:17.490 +on theoretical biology. + +00:00:17.490 --> 00:00:21.357 +In a typical project, they may use +Maxima and Julia. + +00:00:21.357 --> 00:00:24.800 +Their work combines biology, physics and +computer science. + +00:00:24.800 --> 00:00:29.439 +The latest work-in-progress is on +branching processes for + +00:00:29.439 --> 00:00:30.800 +cancer modeling. + +00:00:30.800 --> 00:00:34.719 +How can Emacs possibly help? + +00:00:34.719 --> 00:00:37.360 +Let's have a look. Moving code + +00:00:37.360 --> 00:00:38.399 +and data between these different + +00:00:38.399 --> 00:00:39.680 +programs by hand is + +00:00:39.680 --> 00:00:42.000 +annoying. Separate workflows for + +00:00:42.000 --> 00:00:44.399 +writing up notes and preparing +publications + +00:00:44.399 --> 00:00:46.000 +is perhaps even more annoying. All of + +00:00:46.000 --> 00:00:48.640 +it is time consuming and error-prone. + +00:00:48.640 --> 00:00:52.000 +So what about maybe using Jupyter? + +00:00:52.000 --> 00:00:53.760 +We found something called Script of + +00:00:53.760 --> 00:00:55.199 +Scripts. It solves some of those + +00:00:55.199 --> 00:00:58.399 +problems because you can use + +00:00:58.399 --> 00:01:01.120 +Maxima and Julia together, but we were + +00:01:01.120 --> 00:01:02.640 +quite happy to explore Emacs-based + +00:01:02.640 --> 00:01:04.890 +solutions, being Emcas enthusiasts + +00:01:04.890 --> 00:01:07.760 +We even got Cameron to be +enthusiastic about + +00:01:07.760 --> 00:01:10.057 +doing Emacs, so that went nice. + +00:01:10.057 --> 00:01:12.400 +Here's a little feature grid + +00:01:12.400 --> 00:01:15.360 +of Emacs + Org versus your + +00:01:15.360 --> 00:01:18.390 +generic tools that are in a + +00:01:18.390 --> 00:01:20.123 +different, more general ecosystem. + +00:01:20.123 --> 00:01:21.520 +As you can see, it's quite + +00:01:21.520 --> 00:01:22.957 +feature-complete. You've got your + +00:01:22.957 --> 00:01:25.520 +maxima-mode, julia-mode. You can use both of them + +00:01:25.520 --> 00:01:27.119 +inside of org-mode. + +00:01:27.119 --> 00:01:28.720 +You can present things with org-tree-slide. + +00:01:28.720 --> 00:01:31.490 +You can set up a wiki inside of org-roam. + +00:01:31.490 --> 00:01:33.680 +This is one I found + +00:01:33.680 --> 00:01:35.759 +rather recently. You can even use + +00:01:35.759 --> 00:01:37.759 +compatibly with org-roam, something called + +00:01:37.759 --> 00:01:42.159 +logseq, which is in the browser, so that's +nice. + +00:01:42.159 --> 00:01:44.957 +You can do real-time collaborative +editing, + +00:01:44.957 --> 00:01:47.657 +either in a kind of pairing style + +00:01:47.657 --> 00:01:49.280 +or in a more Etherpad style. + +00:01:49.280 --> 00:01:51.520 +Obviously, you can manage your references. + +00:01:51.520 --> 00:01:53.457 +You can typeset whatever you want. + +00:01:53.457 --> 00:01:55.759 +You can publish work in progress on +a blog. + +00:01:55.759 --> 00:01:57.439 +Firn is another one of these + +00:01:57.439 --> 00:01:59.790 +external Org Mode tools. + +00:01:59.790 --> 00:02:00.560 +It's not actually in Emacs, + +00:02:00.560 --> 00:02:03.557 +but works with Org Mode stuff. And, you know... + +00:02:03.557 --> 00:02:05.657 +So we're good to go with all of that. + +00:02:05.657 --> 00:02:07.423 +So what does that look like? Well, + +00:02:07.423 --> 00:02:09.423 +here's a little example from before + +00:02:09.423 --> 00:02:12.800 +they were doing... before we started +really thinking + +00:02:12.800 --> 00:02:13.890 +seriously about this stuff. + +00:02:13.890 --> 00:02:15.599 +So this is just Maxima. + +00:02:15.599 --> 00:02:17.440 +Well, Maxima doesn't have a long running + +00:02:17.440 --> 00:02:19.280 +process by default. If you've ever used + +00:02:19.280 --> 00:02:22.480 +Python, you have something called +sessions. + +00:02:22.480 --> 00:02:23.920 +They don't have that for Maxima, at least + +00:02:23.920 --> 00:02:24.959 +not by default. + +00:02:24.959 --> 00:02:27.599 +So how... What was the workaround? + +00:02:27.599 --> 00:02:29.360 +There's this thing called + +00:02:29.360 --> 00:02:32.480 +solve-for-u here + +00:02:32.480 --> 00:02:34.879 +that shows up down below again in these + +00:02:34.879 --> 00:02:36.319 +angle brackets, which you've seen maybe + +00:02:36.319 --> 00:02:37.360 +in someone else's talk, + +00:02:37.360 --> 00:02:40.480 +which means go to the previous + +00:02:40.480 --> 00:02:41.920 +thing that was named solve-for-u + +00:02:41.920 --> 00:02:43.920 +and do that all over again, so they do + +00:02:43.920 --> 00:02:45.280 +that over again. + +00:02:45.280 --> 00:02:47.440 +Here's the little Maxima code for + +00:02:47.440 --> 00:02:48.990 +defining usol, so you've now + +00:02:48.990 --> 00:02:51.723 +defined usol, and then you can use it + +00:02:51.723 --> 00:02:54.000 +in the next expression. You get out a +nice juicy + +00:02:54.000 --> 00:02:56.560 +zero at the end. It's a little bit + +00:02:57.200 --> 00:02:58.959 +like a partridge in a pear tree to have to + +00:02:58.959 --> 00:03:00.640 +redefine everything every time. + +00:03:00.640 --> 00:03:02.490 +So this is clearly at the level of + +00:03:02.490 --> 00:03:04.159 +work-around. Maybe just + +00:03:04.159 --> 00:03:06.223 +one more time looking through + +00:03:06.223 --> 00:03:11.599 +that stuff. + +00:03:11.599 --> 00:03:13.760 +Sorry. So, looking through that stuff, + +00:03:13.760 --> 00:03:15.280 +this is... We're going to need something + +00:03:15.280 --> 00:03:17.200 +like that, probably, for stitching + +00:03:17.200 --> 00:03:19.599 +Maxima and Julia together. so it's + +00:03:19.599 --> 00:03:20.890 +good to look a little bit + +00:03:20.890 --> 00:03:22.590 +about how that might work. + +00:03:22.590 --> 00:03:23.920 +First of all, you can cache + +00:03:23.920 --> 00:03:25.680 +results, so if you wanted to save the + +00:03:25.680 --> 00:03:28.480 +date out of block one at a certain +time and + +00:03:28.480 --> 00:03:30.990 +then use it again later... + +00:03:30.990 --> 00:03:33.280 +At the time when I ran this code, + +00:03:33.280 --> 00:03:34.640 +you can see I've got two slightly + +00:03:34.640 --> 00:03:36.623 +different time stamps down below. + +00:03:36.623 --> 00:03:38.323 +One's the cached result, and the other + +00:03:38.323 --> 00:03:40.319 +was the result of reevaluating + +00:03:40.319 --> 00:03:42.640 +the block. So you can move things around. + +00:03:43.760 --> 00:03:46.000 +That's going to be useful. But you know, + +00:03:46.000 --> 00:03:46.923 +that's not really the main problem. + +00:03:46.923 --> 00:03:48.080 +The main problem is + +00:03:48.080 --> 00:03:50.799 +making Maxima long-running. + +00:03:50.799 --> 00:03:53.920 +The core of this talk is a new observant + +00:03:53.920 --> 00:03:56.400 +facility, which is a general purpose + +00:03:56.400 --> 00:03:59.280 +way to do that kind of thing, which + +00:03:59.280 --> 00:04:01.823 +involves a very simple change to ob-core. + +00:04:01.823 --> 00:04:04.239 +We'll give a quick + +00:04:04.239 --> 00:04:05.360 +overview of that and show + +00:04:05.360 --> 00:04:08.480 +an example. So here's the example, + +00:04:08.480 --> 00:04:11.760 +a very simple sort of silly example. + +00:04:11.760 --> 00:04:12.957 +What does it mean to have + +00:04:12.957 --> 00:04:13.990 +a long-running process? + +00:04:13.990 --> 00:04:14.640 +Here, I've set this + +00:04:14.640 --> 00:04:18.560 +display2d to be false, which just +means that + +00:04:18.560 --> 00:04:19.440 +things are going to come + +00:04:19.440 --> 00:04:22.320 +come across in 1d. Then I ask it to + +00:04:22.320 --> 00:04:25.199 +expand something. I get LaTeX +by default. + +00:04:25.199 --> 00:04:27.280 +So that's what it means. It's that I've sent + +00:04:27.280 --> 00:04:28.639 +something in and it's going to come + +00:04:28.639 --> 00:04:30.240 +across in one view, which is great. + +00:04:30.240 --> 00:04:32.080 +Maybe you'll also notice that there's + +00:04:32.080 --> 00:04:34.560 +no semicolon, if you're a Maxima fan, + +00:04:34.560 --> 00:04:36.720 +and things are coming across as TeX. + +00:04:36.720 --> 00:04:38.400 +So those were some little bonus features. + +00:04:38.400 --> 00:04:40.320 +I'll show you how that works later. + +00:04:41.040 --> 00:04:45.440 +The change to ob-core is as follows. + +00:04:45.440 --> 00:04:48.880 +Actually, this should say... + +00:04:48.880 --> 00:04:51.520 +Instead of stream here, it should say + +00:04:51.520 --> 00:04:54.800 +servant. Sorry. We tried an experimental + +00:04:54.800 --> 00:04:56.160 +version which was called stream, so now it's + +00:04:56.160 --> 00:04:58.160 +called servant. But all it does is it + +00:04:58.160 --> 00:05:01.520 +overrides org-babel-execute lang for + +00:05:01.520 --> 00:05:02.639 +arbitrary lang + +00:05:02.639 --> 00:05:05.919 +if you have a servant + +00:05:05.919 --> 00:05:07.840 +in your params. So that's the + +00:05:07.840 --> 00:05:09.759 +change that hasn't been + +00:05:09.759 --> 00:05:11.919 +pushed out or sent as a patch to anybody, + +00:05:11.919 --> 00:05:13.759 +but it's a pretty minor change. + +00:05:13.759 --> 00:05:16.960 +Here's an overview without the code. + +00:05:16.960 --> 00:05:19.080 +Just a high level overview of + +00:05:19.080 --> 00:05:20.720 +observant.el. + +00:05:20.720 --> 00:05:22.160 +It stores information about these + +00:05:22.160 --> 00:05:24.479 +processes in a hash table. + +00:05:24.479 --> 00:05:26.080 +It can do pre-processing and + +00:05:26.080 --> 00:05:27.600 +post-processing. + +00:05:27.600 --> 00:05:29.759 +It does all these things. It stores + +00:05:29.759 --> 00:05:30.720 +the output. + +00:05:30.720 --> 00:05:32.479 +I mentioned here that, in principle, we + +00:05:32.479 --> 00:05:34.080 +could store lots of output and have a + +00:05:34.080 --> 00:05:35.657 +kind of browsable history, + +00:05:35.657 --> 00:05:37.790 +although we don't do that +presently. + +00:05:37.790 --> 00:05:38.790 +But that's what observant does. + +00:05:38.790 --> 00:05:40.639 +It does what you might expect. + +00:05:41.440 --> 00:05:46.190 +Here's the Maxima on-ramp + +00:05:46.190 --> 00:05:48.160 +to get Maxima brought in. + +00:05:48.160 --> 00:05:49.257 +You have to obviously have + +00:05:49.257 --> 00:05:51.360 +a Maxima process you can call. + +00:05:51.360 --> 00:05:54.960 +puthash... this is the preprocessing + +00:05:54.960 --> 00:05:57.840 +thing I mentioned, adding in some Tex + +00:05:57.840 --> 00:05:58.960 +and adding in-- + +00:05:58.960 --> 00:06:01.520 +or deleting, rather--a substring. + +00:06:01.520 --> 00:06:03.759 +Here is why you delete the +substring. + +00:06:03.759 --> 00:06:06.960 +It's because Maxima thinks it's a good + +00:06:06.960 --> 00:06:08.240 +idea to tell you false + +00:06:08.240 --> 00:06:10.080 +once you run check on things. + +00:06:10.080 --> 00:06:11.759 +You've got to delete that back out to + +00:06:11.759 --> 00:06:13.680 +get something coherent out of it. + +00:06:13.680 --> 00:06:16.960 +So this is how to set up Maxima. + +00:06:16.960 --> 00:06:19.157 +That's enough, really, of the demo. + +00:06:19.157 --> 00:06:20.000 +It's not really a demo for + +00:06:20.000 --> 00:06:21.919 +show and tell, but as this is an + +00:06:21.919 --> 00:06:23.600 +experience report, I wanted to talk about + +00:06:23.600 --> 00:06:25.440 +the experience of doing this. + +00:06:25.440 --> 00:06:28.080 +Some negatives, like we tried to + +00:06:28.080 --> 00:06:30.160 +get Emacs Jupyter working + +00:06:30.160 --> 00:06:34.190 +prior to working on observant. + +00:06:34.190 --> 00:06:36.000 +We couldn't get it doing + +00:06:36.000 --> 00:06:37.919 +everything we wanted, despite a bit of + +00:06:37.919 --> 00:06:40.160 +heavy lifting and debugging and stuff. + +00:06:40.160 --> 00:06:42.880 +So that's not finished. That was a bit +difficult. + +00:06:42.880 --> 00:06:45.360 +On the other hand, working on + +00:06:45.360 --> 00:06:47.759 +observant was fun, pretty lightweight, + +00:06:47.759 --> 00:06:48.479 +and easy. + +00:06:48.479 --> 00:06:50.400 +We got some experience co-editing + +00:06:50.400 --> 00:06:52.400 +things with these real-time tools. + +00:06:52.400 --> 00:06:55.919 +Obviously, the stack is somewhat work in +progress. + +00:06:55.919 --> 00:06:58.000 +I just wanted to give a shout out to + +00:06:58.000 --> 00:07:00.800 +crdt which was really fun, + +00:07:00.800 --> 00:07:03.919 +and Qiantan was making + +00:07:03.919 --> 00:07:06.057 +bug fixes for that as we go. + +00:07:06.057 --> 00:07:08.960 +Similarly, for firn and logseq, +the maintainers + +00:07:08.960 --> 00:07:10.160 +were really responsive, + +00:07:10.160 --> 00:07:12.960 +so that was nice. We did try to + +00:07:12.960 --> 00:07:14.560 +get Emacs running in the browser, + +00:07:14.560 --> 00:07:15.840 +thinking it would be really nice for + +00:07:15.840 --> 00:07:19.290 +people who didn't want to install it + +00:07:19.290 --> 00:07:21.120 +to get a chance to just try it, + +00:07:21.120 --> 00:07:23.120 +but actually, browsers capture things + +00:07:23.120 --> 00:07:27.120 +like C-n, so that was a bit annoying. + +00:07:27.120 --> 00:07:28.479 +But we did get lots of great feedback + +00:07:28.479 --> 00:07:29.759 +and interaction with people, including + +00:07:29.759 --> 00:07:31.599 +around this conference. Thank you + +00:07:31.599 --> 00:07:33.759 +to those who we've had discussions with. + +00:07:35.599 --> 00:07:37.680 +So, future work. Okay, so... Maybe you + +00:07:37.680 --> 00:07:41.039 +remember, I gave a talk a few years back +on Arxana. + +00:07:41.039 --> 00:07:44.479 +What might this have to do with Org +Mode? + +00:07:44.479 --> 00:07:45.919 +That's always the question one asks + +00:07:45.919 --> 00:07:47.039 +about Arxana. + +00:07:47.039 --> 00:07:48.720 +Arxana... One of the things it does + +00:07:48.720 --> 00:07:50.319 +is transclusions, and so that could be + +00:07:50.319 --> 00:07:51.680 +actually very helpful + +00:07:51.680 --> 00:07:54.000 +in connection with this "combined notes + +00:07:54.000 --> 00:07:55.520 +and write-up" workflow. So you might have + +00:07:55.520 --> 00:07:58.400 +an Org Mode. Some of these + +00:07:58.400 --> 00:08:00.800 +results we got back as raw results + +00:08:00.800 --> 00:08:03.199 +could go right into your write-up in a + +00:08:03.919 --> 00:08:07.520 +convenient way, at a level above-- + +00:08:07.520 --> 00:08:09.039 +transparently, a level above the notebook. + +00:08:09.039 --> 00:08:11.280 +So you'd have the notebook alongside the + +00:08:11.280 --> 00:08:13.440 +write-up in that case, + +00:08:13.440 --> 00:08:15.599 +which is a variation on the + +00:08:15.599 --> 00:08:17.423 +literate programming workflow. + +00:08:17.423 --> 00:08:19.120 +This is speculative. Who knows? + +00:08:19.120 --> 00:08:20.000 +The other thought is, + +00:08:20.000 --> 00:08:22.080 +it just relates to the idea of network + +00:08:22.080 --> 00:08:23.520 +programming. So we can imagine these + +00:08:23.520 --> 00:08:25.990 +networks of computational nodes + +00:08:25.990 --> 00:08:27.623 +sitting inside of org-roam, + +00:08:27.623 --> 00:08:28.800 +calling each other. + +00:08:28.800 --> 00:08:31.199 +You would want to maintain some + +00:08:31.199 --> 00:08:33.357 +kind of model of that process. + +00:08:33.357 --> 00:08:36.640 +A general question is: how do we have a +remote control for + +00:08:36.640 --> 00:08:37.957 +long-running processes? + +00:08:37.957 --> 00:08:38.320 +You could do that + +00:08:38.320 --> 00:08:39.857 +in Lisp or Clojure, + +00:08:39.857 --> 00:08:41.657 +but maybe we could have something + +00:08:41.657 --> 00:08:44.080 +a little bit like that here. + +00:08:44.080 --> 00:08:45.839 +Conclusions: what have we actually + +00:08:45.839 --> 00:08:48.080 +addressed? Well, we addressed + +00:08:48.080 --> 00:08:50.080 +accessing any long-running process with + +00:08:50.080 --> 00:08:51.600 +a simple Org Mode interface. + +00:08:51.600 --> 00:08:52.959 +Obviously, we're not the only people to + +00:08:52.959 --> 00:08:54.880 +think about notebooks, but we think that + +00:08:54.880 --> 00:08:56.880 +Emacs has some advantages + +00:08:56.880 --> 00:08:58.880 +related to reproducible research and + +00:08:58.880 --> 00:09:00.757 +interdisciplinary collaboration. + +00:09:00.757 --> 00:09:02.590 +Let's just say that we think + +00:09:02.590 --> 00:09:04.880 +something is reproducible if it's +actually teachable + +00:09:04.880 --> 00:09:07.200 +to someone new and they can do it. + +00:09:07.200 --> 00:09:09.190 +Org Mode seems very useful for that. + +00:09:09.190 --> 00:09:11.680 +Many of the other talks have touched +on this. + +00:09:11.680 --> 00:09:14.399 +Interdisciplinary collaboration is great. + +00:09:14.399 --> 00:09:16.000 +This was an interdisciplinary + +00:09:16.000 --> 00:09:17.839 +collaboration on some level, but + +00:09:17.839 --> 00:09:19.680 +what about future work for + +00:09:19.680 --> 00:09:21.190 +bringing in scenario planners, + +00:09:21.190 --> 00:09:22.320 +simulation scientists, + +00:09:22.320 --> 00:09:24.480 +and local farmers, and building something + +00:09:24.480 --> 00:09:26.023 +that they can all use + +00:09:26.023 --> 00:09:27.857 +that's more than the sum of the +parts? + +00:09:27.857 --> 00:09:30.720 +So a little future work for everybody +else here. + +00:09:30.720 --> 00:09:32.160 +We think science should be widely + +00:09:32.160 --> 00:09:34.560 +teachable, shareable, semi-automated, + +00:09:34.560 --> 00:09:36.720 +transdisciplinary, and real-time + +00:09:36.720 --> 00:09:40.399 +like EmacsConf. So you can get in touch + +00:09:40.399 --> 00:09:43.279 +via these methods. The code--which + +00:09:43.279 --> 00:09:45.200 +is very much early stage work in +progress, + +00:09:45.200 --> 00:09:46.640 +as this was meant to be an experience + +00:09:46.640 --> 00:09:48.800 +report, not a "it's all done, here, it is + +00:09:48.800 --> 00:09:49.920 +polished" report-- + +00:09:49.920 --> 00:09:51.680 +it's also online if you'd like to + +00:09:51.680 --> 00:09:53.360 +have a look. That's the end of the + +00:09:53.360 --> 00:09:54.560 +talk. I don't know if there's time + +00:09:54.560 --> 00:09:57.440 +for questions or not, but um I'm at your +disposal now. + +00:09:57.440 --> 00:10:00.240 +Thank you. + +00:10:00.240 --> 00:10:04.079 +(Amin: Many thanks for the tough job. + +00:10:04.079 --> 00:10:07.120 +Let's see. We have about I think four + +00:10:07.120 --> 00:10:08.880 +minutes for questions, + +00:10:08.880 --> 00:10:10.880 +and we have a couple of questions on + +00:10:10.880 --> 00:10:12.320 +the pad. Would you like to read them + +00:10:12.320 --> 00:10:14.240 +yourself or should I read them to you?) + +00:10:14.240 --> 00:10:16.423 +Just for the sake of easy management + +00:10:16.423 --> 00:10:18.079 +why don't you read them out, if +that's okay? + +00:10:18.079 --> 00:10:21.279 +(Amin: yeah, sure. They ask, "Have you looked + +00:10:21.279 --> 00:10:25.440 +into trying Sage Math? I've long wanted + +00:10:25.440 --> 00:10:33.760 +to use Sage Math in Org files.") + +00:10:33.760 --> 00:10:36.959 +Ray: Right. I wrote the answer that + +00:10:36.959 --> 00:10:39.279 +it should be possible because one can + +00:10:39.279 --> 00:10:44.839 +call it from a command. + +00:10:44.839 --> 00:10:48.190 +(Amin: okay, and I see there's + +00:10:48.190 --> 00:10:50.079 +another Sage Math question that you seem +to have answered + +00:10:50.079 --> 00:10:52.100 +as well, so I guess I won't repeat that. + +00:10:54.880 --> 00:10:56.959 +There's... "Let's not forget about embedded + +00:10:56.959 --> 00:11:00.640 +Calc in Emacs.") + +00:11:00.640 --> 00:11:05.040 +Joe: So the first demos actually were with +Calc. + +00:11:05.040 --> 00:11:06.640 +That's useful. Although I think it was a + +00:11:06.640 --> 00:11:08.240 +different--kind of a different command +line. + +00:11:08.240 --> 00:11:11.839 +Ray: Well, that was UNIX Calc. + +00:11:11.839 --> 00:11:13.839 +Joe: So, sure, there is calc, so that... + +00:11:15.680 --> 00:11:19.120 +Ray: Calc is already in Org Mode. + +00:11:25.680 --> 00:11:39.760 +(Amin: Still looking for questions. + +00:11:39.760 --> 00:11:41.760 +Okay, I think that's about it. I don't see + +00:11:41.760 --> 00:11:44.320 +any questions on the Etherpad. + +00:11:44.320 --> 00:11:47.440 +And let's see... + +00:11:47.440 --> 00:11:53.040 +Anything on irc? + +00:11:53.040 --> 00:11:55.760 +Nothing but praises and everyone + +00:11:55.760 --> 00:11:57.290 +thanking you. Thank you.) + +00:11:57.290 --> 00:11:59.120 +Ray: all right, you're welcome. + +00:11:59.120 --> 00:12:00.240 +Joe: Thanks a lot! + +00:12:00.240 --> 00:12:01.923 +We'll see you guys around then. + +00:12:01.923 --> 00:12:06.800 +Amin: Cheers, and see you around! diff --git a/2020/subtitles/emacsconf-2020--14-readme-driven-design--adam-ard-autogen.vtt b/2020/subtitles/emacsconf-2020--14-readme-driven-design--adam-ard-autogen.vtt deleted file mode 100644 index 3179635f..00000000 --- a/2020/subtitles/emacsconf-2020--14-readme-driven-design--adam-ard-autogen.vtt +++ /dev/null @@ -1,1426 +0,0 @@ -WEBVTT - -00:00:03.600 --> 00:00:04.400 -hello - -00:00:04.400 --> 00:00:06.560 -welcome to readme driven design in Emacs - -00:00:06.560 --> 00:00:08.400 -by adam aard - -00:00:08.400 --> 00:00:10.800 -if you're a programmer you're accustomed - -00:00:10.800 --> 00:00:12.559 -to putting a readme file at the root of - -00:00:12.559 --> 00:00:13.759 -your project - -00:00:13.759 --> 00:00:16.400 -and it's usually a markdown file but if - -00:00:16.400 --> 00:00:17.600 -you use an org - -00:00:17.600 --> 00:00:20.720 -more an org mode file instead you can - -00:00:20.720 --> 00:00:22.560 -take advantage of the great features - -00:00:22.560 --> 00:00:24.400 -that org mode provides including - -00:00:24.400 --> 00:00:25.920 -literate programming - -00:00:25.920 --> 00:00:28.000 -which lets you generate your source code - -00:00:28.000 --> 00:00:31.840 -and markdown documentation dynamically - -00:00:31.840 --> 00:00:34.719 -I want to walk you through a little bit - -00:00:34.719 --> 00:00:37.120 -of what this looks like - -00:00:37.120 --> 00:00:39.440 -when you start a project especially if - -00:00:39.440 --> 00:00:41.280 -if you use something like github you - -00:00:41.280 --> 00:00:43.320 -begin with an automatically generated - -00:00:43.320 --> 00:00:47.039 -readme.md file so just delete that - -00:00:47.039 --> 00:00:50.239 -and instead create a readme.org file - -00:00:50.239 --> 00:00:51.920 -starting with an empty org file like you - -00:00:51.920 --> 00:00:54.800 -see here you can begin - -00:00:54.800 --> 00:00:56.559 -by recording important information about - -00:00:56.559 --> 00:00:59.440 -your project goals you can add diagrams - -00:00:59.440 --> 00:01:01.920 -code snippets to-do lists time tracking - -00:01:01.920 --> 00:01:03.520 -and much more - -00:01:03.520 --> 00:01:05.360 -I'm going to drop in some documentation - -00:01:05.360 --> 00:01:07.760 -that I r that I've written about - -00:01:07.760 --> 00:01:10.840 -about my project here so you can kind of - -00:01:10.840 --> 00:01:12.240 -see - -00:01:12.240 --> 00:01:15.280 -what this would look like - -00:01:15.280 --> 00:01:17.119 -so as you can see I have a title and a - -00:01:17.119 --> 00:01:20.320 -description and then a sub section - -00:01:20.320 --> 00:01:23.840 -as well as some code snippets - -00:01:23.840 --> 00:01:25.520 -and you can see that orgmo does a great - -00:01:25.520 --> 00:01:28.240 -job of formatting lists and - -00:01:28.240 --> 00:01:31.280 -code sections diagrams and so forth - -00:01:31.280 --> 00:01:33.920 -it's good or it's as good or better than - -00:01:33.920 --> 00:01:35.040 -markdown - -00:01:35.040 --> 00:01:37.520 -but when you use it in the Emacs you can - -00:01:37.520 --> 00:01:38.880 -do a lot more - -00:01:38.880 --> 00:01:40.479 -for example you can dynamically create - -00:01:40.479 --> 00:01:43.360 -diagrams using graphviz - -00:01:43.360 --> 00:01:45.200 -from a text description so if you go to - -00:01:45.200 --> 00:01:46.560 -this source block here - -00:01:46.560 --> 00:01:49.439 -and hit control c control c you'll see - -00:01:49.439 --> 00:01:51.439 -that we generate a - -00:01:51.439 --> 00:01:55.439 -diagram dynamically you can run - -00:01:55.439 --> 00:01:59.200 -so you can run these code snippets in - -00:01:59.200 --> 00:02:00.799 -place and get the results - -00:02:00.799 --> 00:02:03.040 -to show up inside of your your file - -00:02:03.040 --> 00:02:08.000 -which is a really powerful paradigm - -00:02:08.000 --> 00:02:10.640 -but most important most importantly for - -00:02:10.640 --> 00:02:11.520 -the - -00:02:11.520 --> 00:02:14.800 -purposes my purpose is here - -00:02:14.800 --> 00:02:17.200 -orgmo provides you the ability to do - -00:02:17.200 --> 00:02:19.520 -literate programming - -00:02:19.520 --> 00:02:21.440 -so take a quick look at this diagram - -00:02:21.440 --> 00:02:23.200 -that I generated here - -00:02:23.200 --> 00:02:25.360 -and gives you a quick overview of what I - -00:02:25.360 --> 00:02:27.520 -mean by literate programming - -00:02:27.520 --> 00:02:31.200 -and how I'm using it you can see - -00:02:31.200 --> 00:02:33.920 -that we start with a readme.org file on - -00:02:33.920 --> 00:02:34.720 -top - -00:02:34.720 --> 00:02:36.879 -at this point we can do one of two - -00:02:36.879 --> 00:02:37.920 -things - -00:02:37.920 --> 00:02:41.280 -tangle or weave tangle is used to - -00:02:41.280 --> 00:02:42.720 -describe the process of - -00:02:42.720 --> 00:02:46.319 -generating source code while weave - -00:02:46.319 --> 00:02:47.599 -is the process of generating - -00:02:47.599 --> 00:02:49.840 -documentation these are terms that - -00:02:49.840 --> 00:02:51.920 -donald knuth used - -00:02:51.920 --> 00:02:53.840 -and he's the one that came up with the - -00:02:53.840 --> 00:02:55.519 -idea of literate programming - -00:02:55.519 --> 00:02:59.920 -in the early 1980s - -00:02:59.920 --> 00:03:01.519 -but this is really all that there is to - -00:03:01.519 --> 00:03:04.480 -it you just - -00:03:04.480 --> 00:03:06.400 -who are simply using literate illiterate - -00:03:06.400 --> 00:03:07.840 -source file - -00:03:07.840 --> 00:03:10.319 -in this case the readme.org to generate - -00:03:10.319 --> 00:03:11.680 -the rest of the project - -00:03:11.680 --> 00:03:17.120 -the rest of the project files basically - -00:03:17.120 --> 00:03:20.959 -so let's dig in to the details of how - -00:03:20.959 --> 00:03:22.640 -this works - -00:03:22.640 --> 00:03:24.560 -and I hope you hopefully you'll see how - -00:03:24.560 --> 00:03:26.159 -cool this is - -00:03:26.159 --> 00:03:28.959 -so returning to the file here let's - -00:03:28.959 --> 00:03:31.120 -assume we have enough documentation now - -00:03:31.120 --> 00:03:32.080 -that we want to get started - -00:03:32.080 --> 00:03:34.159 -coding so maybe we'll just start with - -00:03:34.159 --> 00:03:35.519 -like a hello world - -00:03:35.519 --> 00:03:38.159 -app just so we can make sure that our - -00:03:38.159 --> 00:03:41.519 -environment is set up correctly - -00:03:41.519 --> 00:03:47.120 -so let's get started with a code block - -00:03:47.120 --> 00:03:49.519 -so I created a little snippet to help me - -00:03:49.519 --> 00:03:50.319 -add - -00:03:50.319 --> 00:03:52.239 -a source block for literate programming - -00:03:52.239 --> 00:03:53.599 -quickly - -00:03:53.599 --> 00:03:56.959 -and there's not much to it - -00:03:56.959 --> 00:03:58.799 -but there is some important annotations - -00:03:58.799 --> 00:04:01.599 -here so there's - -00:04:01.599 --> 00:04:04.080 -excuse me there's a there's a property - -00:04:04.080 --> 00:04:05.200 -called tangle - -00:04:05.200 --> 00:04:09.360 -and that takes a value of a file name - -00:04:09.360 --> 00:04:13.280 -and then there's also a no web property - -00:04:13.280 --> 00:04:18.880 -called no export - -00:04:18.880 --> 00:04:23.759 -and basically - -00:04:23.759 --> 00:04:26.800 -basically the no export will explain - -00:04:26.800 --> 00:04:28.639 -that a little bit - -00:04:28.639 --> 00:04:32.080 -more later um it has has to do with how - -00:04:32.080 --> 00:04:33.919 -the tangling - -00:04:33.919 --> 00:04:37.600 -is uh done in the tangle step versus the - -00:04:37.600 --> 00:04:39.280 -weave step and I'll explain that a - -00:04:39.280 --> 00:04:41.199 -little bit more but the tangle - -00:04:41.199 --> 00:04:45.199 -field just simply tells tells uh - -00:04:45.199 --> 00:04:48.320 -Emacs where it needs to generate the - -00:04:48.320 --> 00:04:50.320 -main.go file and where it needs to put - -00:04:50.320 --> 00:04:55.360 -it on the file system - -00:04:55.360 --> 00:04:57.680 -uh you'll you'll notice that we we're - -00:04:57.680 --> 00:04:59.040 -going to use go - -00:04:59.040 --> 00:05:01.440 -that's just the language that I've been - -00:05:01.440 --> 00:05:02.160 -using - -00:05:02.160 --> 00:05:05.360 -the most lately uh but - -00:05:05.360 --> 00:05:07.360 -this programming strategy is language - -00:05:07.360 --> 00:05:08.400 -agnostic - -00:05:08.400 --> 00:05:12.080 -you could use any language or any mix - -00:05:12.080 --> 00:05:14.720 -of languages you could create some files - -00:05:14.720 --> 00:05:16.560 -in python some files and go - -00:05:16.560 --> 00:05:19.520 -some files in in lisp or whatever you - -00:05:19.520 --> 00:05:21.520 -want - -00:05:21.520 --> 00:05:24.720 -and so but let's - -00:05:24.720 --> 00:05:28.000 -uh let's create just a little hello - -00:05:28.000 --> 00:05:29.440 -world - -00:05:29.440 --> 00:05:32.320 -let's use another snippet here to - -00:05:32.320 --> 00:05:33.520 -generate - -00:05:33.520 --> 00:05:36.560 -the basics of a go program - -00:05:36.560 --> 00:05:40.240 -so I'm just going to print - -00:05:40.240 --> 00:05:44.960 -hello world - -00:05:44.960 --> 00:05:48.560 -so that's and then - -00:05:48.560 --> 00:05:52.320 -let's make it a section in our - -00:05:52.320 --> 00:05:55.280 -file so now you can see we've got this - -00:05:55.280 --> 00:05:56.400 -snippet - -00:05:56.400 --> 00:05:59.600 -um when you have a source block in - -00:05:59.600 --> 00:06:01.600 -inside of org mode you can easily pop - -00:06:01.600 --> 00:06:02.880 -into a - -00:06:02.880 --> 00:06:04.960 -language specific buffer by typing - -00:06:04.960 --> 00:06:07.680 -control c single quote - -00:06:07.680 --> 00:06:10.240 -so you can see now I have a a go a - -00:06:10.240 --> 00:06:12.160 -buffer that's in go mode - -00:06:12.160 --> 00:06:14.240 -and gives you all the ability to edit - -00:06:14.240 --> 00:06:15.520 -like you would - -00:06:15.520 --> 00:06:18.800 -normally if you hit ctrl c - -00:06:18.800 --> 00:06:20.800 -single quote again then it goes back and - -00:06:20.800 --> 00:06:22.639 -any changes you - -00:06:22.639 --> 00:06:25.280 -make would will be updated there but you - -00:06:25.280 --> 00:06:26.160 -can do quite a bit - -00:06:26.160 --> 00:06:28.000 -just inside of here too there's quite a - -00:06:28.000 --> 00:06:29.199 -bit of - -00:06:29.199 --> 00:06:33.360 -language specific - -00:06:33.360 --> 00:06:35.440 -functionality just in place and so you - -00:06:35.440 --> 00:06:36.880 -don't always have to go over to a - -00:06:36.880 --> 00:06:38.080 -separate buffer - -00:06:38.080 --> 00:06:42.319 -but it's a it's a nice option sometimes - -00:06:42.319 --> 00:06:44.319 -but now that you have the code in here - -00:06:44.319 --> 00:06:46.720 -you're going to want to run it - -00:06:46.720 --> 00:06:48.560 -but right now it just lives here in this - -00:06:48.560 --> 00:06:50.240 -documentation - -00:06:50.240 --> 00:06:52.160 -so you need to get a copy of it into a - -00:06:52.160 --> 00:06:53.840 -separate file - -00:06:53.840 --> 00:06:57.440 -and that's the tangle process that you - -00:06:57.440 --> 00:07:01.360 -you need to follow there so I'm gonna - -00:07:01.360 --> 00:07:03.360 -drop in a little bit more doc a little - -00:07:03.360 --> 00:07:05.280 -bit more - -00:07:05.280 --> 00:07:12.240 -documentation really quick here - -00:07:12.240 --> 00:07:17.360 -okay all right so just kind of as a - -00:07:17.360 --> 00:07:21.520 -kind of as a side note I like to follow - -00:07:21.520 --> 00:07:24.800 -this process uh whenever having whenever - -00:07:24.800 --> 00:07:26.639 -I have an operation to perform I - -00:07:26.639 --> 00:07:28.880 -I'd like to document it here with a - -00:07:28.880 --> 00:07:31.680 -snippet that can be executed in line - -00:07:31.680 --> 00:07:33.280 -then I don't have to leave org mode and - -00:07:33.280 --> 00:07:34.639 -I don't have to try to remember what I - -00:07:34.639 --> 00:07:36.800 -did later so instead of just - -00:07:36.800 --> 00:07:38.960 -trying to do an operation the first time - -00:07:38.960 --> 00:07:40.319 -I do something I take the - -00:07:40.319 --> 00:07:41.680 -take the time to figure out what it is - -00:07:41.680 --> 00:07:43.440 -and document it and so then it's - -00:07:43.440 --> 00:07:44.879 -recorded - -00:07:44.879 --> 00:07:48.400 -and so here we find that to do a tangle - -00:07:48.400 --> 00:07:49.120 -operation - -00:07:49.120 --> 00:07:51.680 -you run the command or babel tangled - -00:07:51.680 --> 00:07:52.560 -which is a - -00:07:52.560 --> 00:07:55.840 -e-list command so if you hit ctrl c - -00:07:55.840 --> 00:07:59.199 -ctrl c to run it in place you get the - -00:07:59.199 --> 00:08:00.080 -result - -00:08:00.080 --> 00:08:02.720 -of main dot go which basically is - -00:08:02.720 --> 00:08:03.759 -telling us that - -00:08:03.759 --> 00:08:07.680 -we've tangled one file called main.go - -00:08:07.680 --> 00:08:11.039 -and you can see that that's true - -00:08:11.039 --> 00:08:14.000 -if you go to the file system and you - -00:08:14.000 --> 00:08:14.400 -look - -00:08:14.400 --> 00:08:17.840 -so now in uh in our demo directory - -00:08:17.840 --> 00:08:20.960 -we have a readme.org we have that png - -00:08:20.960 --> 00:08:22.479 -that we generated but we also have a - -00:08:22.479 --> 00:08:23.440 -main.go - -00:08:23.440 --> 00:08:26.080 -and if you if you visit that file you'll - -00:08:26.080 --> 00:08:27.759 -see that it's just the source code that - -00:08:27.759 --> 00:08:29.280 -was in our documentation which is - -00:08:29.280 --> 00:08:31.039 -exactly what we expected and what we - -00:08:31.039 --> 00:08:32.880 -wanted so that's good - -00:08:32.880 --> 00:08:36.560 -so if we return to - -00:08:36.560 --> 00:08:41.120 -to where we are at - -00:08:41.120 --> 00:08:42.959 -now we're we're at the point where we - -00:08:42.959 --> 00:08:44.640 -have a file on the file system so now we - -00:08:44.640 --> 00:08:45.760 -need - -00:08:45.760 --> 00:08:48.959 -um now we need to build it and to - -00:08:48.959 --> 00:08:53.600 -run it so let's follow the same - -00:08:53.600 --> 00:08:57.040 -philosophy where let's document - -00:08:57.040 --> 00:08:58.720 -these operations that we're going to - -00:08:58.720 --> 00:09:00.160 -perform - -00:09:00.160 --> 00:09:04.560 -so I'm dropping in a - -00:09:04.560 --> 00:09:07.839 -a build instruction section and a run - -00:09:07.839 --> 00:09:13.360 -instruction section - -00:09:13.360 --> 00:09:15.279 -so as you can see here we have a little - -00:09:15.279 --> 00:09:17.839 -a bash source block - -00:09:17.839 --> 00:09:20.000 -and another batch source block this one - -00:09:20.000 --> 00:09:22.000 -compiles the go build command is what - -00:09:22.000 --> 00:09:25.440 -compiles a file and then - -00:09:25.440 --> 00:09:26.880 -the file that gets generated should be - -00:09:26.880 --> 00:09:30.080 -called demo - -00:09:30.080 --> 00:09:32.959 -and uh so we just run it here so if if I - -00:09:32.959 --> 00:09:34.000 -type control c - -00:09:34.000 --> 00:09:37.839 -control c we get an empty results block - -00:09:37.839 --> 00:09:40.640 -when you compile things no news is good - -00:09:40.640 --> 00:09:41.360 -news - -00:09:41.360 --> 00:09:44.399 -so it means there's no errors so - -00:09:44.399 --> 00:09:46.560 -presumably we've created an executable - -00:09:46.560 --> 00:09:48.000 -that's called demo - -00:09:48.000 --> 00:09:51.440 -so let's uh - -00:09:51.440 --> 00:09:54.560 -let's look again at the file system and - -00:09:54.560 --> 00:10:02.480 -regenerate - -00:10:02.480 --> 00:10:05.760 -yep and what we have here is a demo - -00:10:05.760 --> 00:10:07.200 -executable which is exactly what we - -00:10:07.200 --> 00:10:07.760 -wanted - -00:10:07.760 --> 00:10:12.079 -so let's go back - -00:10:12.079 --> 00:10:14.160 -so now we should be able to run it so - -00:10:14.160 --> 00:10:16.079 -ctrl c ctrl c - -00:10:16.079 --> 00:10:20.399 -and we get hello world as a result - -00:10:20.399 --> 00:10:23.440 -which was exactly what we were expecting - -00:10:23.440 --> 00:10:26.560 -so that's already pretty cool - -00:10:26.560 --> 00:10:30.839 -you can you can do that much - -00:10:30.839 --> 00:10:33.040 -um but - -00:10:33.040 --> 00:10:34.560 -that's really just kind of the tip of - -00:10:34.560 --> 00:10:37.839 -the iceberg to uh to really - -00:10:37.839 --> 00:10:41.040 -kind of um - -00:10:41.040 --> 00:10:43.440 -use the more impressive features of - -00:10:43.440 --> 00:10:46.160 -literate programming we need to uh - -00:10:46.160 --> 00:10:49.920 -we need to do a little bit more - -00:10:49.920 --> 00:10:53.200 -so or at least - -00:10:53.200 --> 00:10:55.519 -at least really to get the full benefit - -00:10:55.519 --> 00:10:56.480 -of it then - -00:10:56.480 --> 00:10:59.600 -we need to do - -00:10:59.600 --> 00:11:02.959 -add some sections that will cause uh - -00:11:02.959 --> 00:11:06.320 -Emacs to have to to tangle or assemble - -00:11:06.320 --> 00:11:06.720 -this - -00:11:06.720 --> 00:11:09.760 -this file from different pieces so - -00:11:09.760 --> 00:11:13.120 -imagine that we wanted to take this file - -00:11:13.120 --> 00:11:16.720 -and maybe kind of templatize it - -00:11:16.720 --> 00:11:19.120 -so using literature programming syntax - -00:11:19.120 --> 00:11:21.279 -this angle bracket syntax - -00:11:21.279 --> 00:11:24.399 -let's say that we want to create an in - -00:11:24.399 --> 00:11:29.360 -imports section - -00:11:29.360 --> 00:11:32.399 -in a functions section - -00:11:32.399 --> 00:11:35.040 -and then maybe just a main section and - -00:11:35.040 --> 00:11:36.240 -we'll get rid of this - -00:11:36.240 --> 00:11:37.920 -so now you see we've created something - -00:11:37.920 --> 00:11:39.760 -that looks a little bit like a - -00:11:39.760 --> 00:11:42.000 -like a template or a scaffolding or - -00:11:42.000 --> 00:11:42.880 -outline - -00:11:42.880 --> 00:11:46.000 -for what what our file is going to be it - -00:11:46.000 --> 00:11:48.399 -looks a little bit like pseudocode - -00:11:48.399 --> 00:11:50.800 -and what we're going to have literate - -00:11:50.800 --> 00:11:52.399 -programming do - -00:11:52.399 --> 00:11:54.800 -is dynamically insert those things into - -00:11:54.800 --> 00:11:56.639 -those slots - -00:11:56.639 --> 00:12:00.079 -so the first thing we need to do - -00:12:00.079 --> 00:12:03.200 -is so let's create a section - -00:12:03.200 --> 00:12:08.079 -maybe called say hello so we want - -00:12:08.079 --> 00:12:09.519 -we want to add some functionality that - -00:12:09.519 --> 00:12:12.720 -makes our program say hello - -00:12:12.720 --> 00:12:15.680 -so using a different snippet that I have - -00:12:15.680 --> 00:12:17.600 -for creating something - -00:12:17.600 --> 00:12:20.800 -that I call like a literate section - -00:12:20.800 --> 00:12:24.079 -um basically we create a - -00:12:24.079 --> 00:12:26.000 -another source block that's almost the - -00:12:26.000 --> 00:12:27.839 -same as the one for the file but it's - -00:12:27.839 --> 00:12:31.040 -it just has a few differences so say we - -00:12:31.040 --> 00:12:31.680 -want to - -00:12:31.680 --> 00:12:34.160 -drop code into the import section and we - -00:12:34.160 --> 00:12:36.639 -want it to be in go - -00:12:36.639 --> 00:12:39.120 -here we use the same noed no web no - -00:12:39.120 --> 00:12:40.720 -export syntax - -00:12:40.720 --> 00:12:43.200 -but then we've added this no web refs - -00:12:43.200 --> 00:12:44.560 -imports - -00:12:44.560 --> 00:12:48.240 -and this ties that slot - -00:12:48.240 --> 00:12:51.120 -basically to this reference it tells - -00:12:51.120 --> 00:12:53.760 -Emacs that when you tangle - -00:12:53.760 --> 00:12:56.880 -we want to stick whatever's in here in - -00:12:56.880 --> 00:12:58.240 -that spot - -00:12:58.240 --> 00:13:02.079 -so you skip the tangle file name section - -00:13:02.079 --> 00:13:03.279 -because you're not actually creating a - -00:13:03.279 --> 00:13:04.240 -file name you're - -00:13:04.240 --> 00:13:06.160 -you're putting information into an - -00:13:06.160 --> 00:13:07.680 -existing file - -00:13:07.680 --> 00:13:10.720 -so here we would just add the fmt - -00:13:10.720 --> 00:13:14.399 -for the imports - -00:13:14.399 --> 00:13:18.839 -so let's add another section for uh - -00:13:18.839 --> 00:13:22.240 -functions and let's create a - -00:13:22.240 --> 00:13:25.519 -let's just create a function called - -00:13:25.519 --> 00:13:30.240 -say hello that - -00:13:30.240 --> 00:13:32.839 -doesn't have any arguments no return - -00:13:32.839 --> 00:13:34.000 -types - -00:13:34.000 --> 00:13:35.760 -all it does is kind of pretty much the - -00:13:35.760 --> 00:13:37.440 -same thing as we did before - -00:13:37.440 --> 00:13:39.199 -just print something but let's just say - -00:13:39.199 --> 00:13:41.360 -hello - -00:13:41.360 --> 00:13:45.760 -Emacs comp this time - -00:13:45.760 --> 00:13:49.519 -okay so now we have a function and now - -00:13:49.519 --> 00:13:51.040 -the function won't do anything unless we - -00:13:51.040 --> 00:13:52.720 -invoke it so let's do - -00:13:52.720 --> 00:13:56.000 -one last literate section - -00:13:56.000 --> 00:13:59.920 -called main make that go - -00:13:59.920 --> 00:14:03.519 -source block and then let's - -00:14:03.519 --> 00:14:06.560 -just invoke - -00:14:06.560 --> 00:14:10.320 -that that function - -00:14:10.320 --> 00:14:13.360 -so now you can see that we've got - -00:14:13.360 --> 00:14:15.600 -our scaffolding scaffolding kind of - -00:14:15.600 --> 00:14:17.199 -outline and then we have - -00:14:17.199 --> 00:14:20.079 -the sections that we want to get tangled - -00:14:20.079 --> 00:14:21.360 -or inserted - -00:14:21.360 --> 00:14:25.440 -so I I've kind of used this syntax - -00:14:25.440 --> 00:14:27.199 -it's it's kind of borrowed from - -00:14:27.199 --> 00:14:28.560 -literature programming a little bit with - -00:14:28.560 --> 00:14:30.320 -a plus equals so really it's just saying - -00:14:30.320 --> 00:14:32.480 -that I want to append - -00:14:32.480 --> 00:14:35.760 -this item into the import section so - -00:14:35.760 --> 00:14:37.600 -it's really just to make a little bit - -00:14:37.600 --> 00:14:39.839 -more clear what's going on - -00:14:39.839 --> 00:14:41.519 -when you generate documentation you - -00:14:41.519 --> 00:14:43.519 -won't see these - -00:14:43.519 --> 00:14:46.160 -these these particular property - -00:14:46.160 --> 00:14:49.360 -annotations and so you won't know - -00:14:49.360 --> 00:14:51.440 -immediately that this section goes in - -00:14:51.440 --> 00:14:53.839 -the imports area and so I usually put - -00:14:53.839 --> 00:14:55.440 -a little bit of documentation on top - -00:14:55.440 --> 00:14:57.760 -there so that it's easy to see - -00:14:57.760 --> 00:15:01.120 -and you would probably if this was very - -00:15:01.120 --> 00:15:03.040 -complicated you'd put some - -00:15:03.040 --> 00:15:06.399 -documentation above to explain what you - -00:15:06.399 --> 00:15:07.360 -were doing - -00:15:07.360 --> 00:15:11.519 -maybe right here - -00:15:11.519 --> 00:15:13.279 -you could you could picture yourself - -00:15:13.279 --> 00:15:15.040 -maybe explaining - -00:15:15.040 --> 00:15:17.440 -a complicated algorithm or something up - -00:15:17.440 --> 00:15:18.079 -here - -00:15:18.079 --> 00:15:21.120 -and having a nice way to document it - -00:15:21.120 --> 00:15:22.959 -so now that we've got that here in the - -00:15:22.959 --> 00:15:25.600 -documentation we need to figure out - -00:15:25.600 --> 00:15:27.040 -we need to make sure that it's going to - -00:15:27.040 --> 00:15:29.920 -tangle properly so your best friend - -00:15:29.920 --> 00:15:33.519 -at this point is is uh - -00:15:33.519 --> 00:15:35.680 -is a keyboard shortcut that lets you - -00:15:35.680 --> 00:15:38.240 -preview the tangled operation so if you - -00:15:38.240 --> 00:15:38.959 -say control - -00:15:38.959 --> 00:15:42.560 -c control v control v - -00:15:42.560 --> 00:15:45.120 -it will create a new buffer with the - -00:15:45.120 --> 00:15:46.480 -tangled - -00:15:46.480 --> 00:15:49.360 -contents and so you can see here that - -00:15:49.360 --> 00:15:50.639 -the fmt - -00:15:50.639 --> 00:15:53.199 -import went to the right place that - -00:15:53.199 --> 00:15:54.720 -function went to the right place the - -00:15:54.720 --> 00:15:56.160 -function invocation went to the right - -00:15:56.160 --> 00:15:58.480 -place and so we're feeling good - -00:15:58.480 --> 00:16:01.279 -you can nest these things many layers - -00:16:01.279 --> 00:16:02.800 -deep - -00:16:02.800 --> 00:16:04.800 -actually so like if you came into the - -00:16:04.800 --> 00:16:07.199 -say hello function you could add - -00:16:07.199 --> 00:16:10.560 -more sections - -00:16:10.560 --> 00:16:12.160 -you know and it gets and it'll go - -00:16:12.160 --> 00:16:13.759 -through and it'll - -00:16:13.759 --> 00:16:15.680 -keep track of all that and tangle it for - -00:16:15.680 --> 00:16:16.959 -you so you really get a lot of freedom - -00:16:16.959 --> 00:16:18.320 -and flexibility for how you want to - -00:16:18.320 --> 00:16:19.600 -document things - -00:16:19.600 --> 00:16:22.320 -by doing this so now that we've - -00:16:22.320 --> 00:16:25.839 -previewed it and we feel good about it - -00:16:25.839 --> 00:16:28.639 -we need to uh we need to tangle so we - -00:16:28.639 --> 00:16:31.440 -get the file on the file system - -00:16:31.440 --> 00:16:34.480 -so ctrl c ctrl c and - -00:16:34.480 --> 00:16:37.199 -get just main.go comes back again - -00:16:37.199 --> 00:16:37.920 -control c - -00:16:37.920 --> 00:16:40.959 -control c and no errors come back - -00:16:40.959 --> 00:16:43.839 -and then if we did this right when we - -00:16:43.839 --> 00:16:45.600 -when we run this we should get hello - -00:16:45.600 --> 00:16:47.199 -Emacs comp so ctrl c - -00:16:47.199 --> 00:16:51.199 -ctrl c hello Emacs comp - -00:16:51.199 --> 00:16:54.800 -so I uh - -00:16:54.800 --> 00:16:57.120 -I think that's pretty pretty cool - -00:16:57.120 --> 00:16:58.240 -actually so we've got - -00:16:58.240 --> 00:17:00.160 -kind of the breadcrumbs of the process - -00:17:00.160 --> 00:17:02.399 -we've gone through to get to this point - -00:17:02.399 --> 00:17:05.520 -this initial this initial - -00:17:05.520 --> 00:17:08.000 -document that has some tangling in it we - -00:17:08.000 --> 00:17:09.919 -have documentation for how to tangle - -00:17:09.919 --> 00:17:12.799 -how to build how to run it's we've - -00:17:12.799 --> 00:17:14.079 -really built a nice - -00:17:14.079 --> 00:17:17.760 -foundation for - -00:17:17.760 --> 00:17:20.160 -moving forward on our project and a nice - -00:17:20.160 --> 00:17:21.439 -way of breaking things out and - -00:17:21.439 --> 00:17:23.280 -documenting further - -00:17:23.280 --> 00:17:27.120 -the last piece that we need to - -00:17:27.120 --> 00:17:30.559 -take care of is the weave that I - -00:17:30.559 --> 00:17:34.799 -that's I showed you in the diagram above - -00:17:34.799 --> 00:17:38.640 -so one more time we'll drop in - -00:17:38.640 --> 00:17:41.760 -some documentation so this time on how - -00:17:41.760 --> 00:17:42.400 -to weave - -00:17:42.400 --> 00:17:44.400 -so it's really just an export function - -00:17:44.400 --> 00:17:47.520 -it's not there's not a separate weave - -00:17:47.520 --> 00:17:49.280 -command going on here we're just going - -00:17:49.280 --> 00:17:50.640 -to export - -00:17:50.640 --> 00:17:52.799 -what we've got here into a markdown - -00:17:52.799 --> 00:17:55.200 -format so we're using org - -00:17:55.200 --> 00:17:57.440 -gfm export to markdown which is the - -00:17:57.440 --> 00:17:58.880 -github style - -00:17:58.880 --> 00:18:02.160 -markdown you can use the other just - -00:18:02.160 --> 00:18:05.440 -more standard type as well so hit ctrl c - -00:18:05.440 --> 00:18:10.320 -ctrl c now you see we've got a readme - -00:18:10.320 --> 00:18:15.280 -file and if you look - -00:18:15.280 --> 00:18:17.440 -in the file system we've got that right - -00:18:17.440 --> 00:18:19.120 -there and so - -00:18:19.120 --> 00:18:23.120 -if you go to something like ghostwriter - -00:18:23.120 --> 00:18:31.679 -and open that file - -00:18:31.679 --> 00:18:34.559 -now you can see that it's generated some - -00:18:34.559 --> 00:18:35.520 -documentation - -00:18:35.520 --> 00:18:38.320 -it puts a index at top at the top I - -00:18:38.320 --> 00:18:39.679 -usually just - -00:18:39.679 --> 00:18:42.000 -I usually turn that off it's easy to do - -00:18:42.000 --> 00:18:43.679 -that by putting a property at the top of - -00:18:43.679 --> 00:18:44.559 -your - -00:18:44.559 --> 00:18:46.880 -your org file but some people like to - -00:18:46.880 --> 00:18:48.559 -have an index - -00:18:48.559 --> 00:18:50.799 -but here you can see that it's generated - -00:18:50.799 --> 00:18:52.160 -pretty nicely and - -00:18:52.160 --> 00:18:55.200 -formatted snippets well - -00:18:55.200 --> 00:18:56.880 -put the diagram in there and then it's - -00:18:56.880 --> 00:18:58.240 -preserved - -00:18:58.240 --> 00:19:01.039 -it's preserved this literate programming - -00:19:01.039 --> 00:19:02.799 -syntax - -00:19:02.799 --> 00:19:04.960 -which is important because that's how we - -00:19:04.960 --> 00:19:06.480 -want to view the documentation that's - -00:19:06.480 --> 00:19:07.200 -what the no - -00:19:07.200 --> 00:19:10.559 -exports um - -00:19:10.559 --> 00:19:13.360 -property was was trying to maintain so - -00:19:13.360 --> 00:19:14.000 -that - -00:19:14.000 --> 00:19:16.080 -no exports means when you export do not - -00:19:16.080 --> 00:19:18.400 -try to tangle so that's - -00:19:18.400 --> 00:19:20.559 -hopefully that makes more sense now but - -00:19:20.559 --> 00:19:22.240 -now you can see all the documentation - -00:19:22.240 --> 00:19:26.080 -and I think it demonstrates a - -00:19:26.080 --> 00:19:29.919 -pretty useful feature that's inside of - -00:19:29.919 --> 00:19:33.520 -Emacs and and hopefully - -00:19:33.520 --> 00:19:35.039 -hopefully you'll have as much fun using - -00:19:35.039 --> 00:19:39.919 -that as I have - -00:19:39.919 --> 00:19:43.600 -so thanks diff --git a/2020/subtitles/emacsconf-2020--14-readme-driven-design--adam-ard.vtt b/2020/subtitles/emacsconf-2020--14-readme-driven-design--adam-ard.vtt new file mode 100644 index 00000000..608729bd --- /dev/null +++ b/2020/subtitles/emacsconf-2020--14-readme-driven-design--adam-ard.vtt @@ -0,0 +1,1297 @@ +WEBVTT + +00:00:03.600 --> 00:00:04.400 +Adam: Hello! + +00:00:04.400 --> 00:00:06.560 +Welcome to Readme Driven Design in Emacs + +00:00:06.560 --> 00:00:08.400 +by Adam Aard. + +00:00:08.400 --> 00:00:10.800 +If you're a programmer, you're accustomed + +00:00:10.800 --> 00:00:12.559 +to putting a README file at the root of + +00:00:12.559 --> 00:00:13.759 +your project. + +00:00:13.759 --> 00:00:15.845 +It's usually a Markdown file + +00:00:15.845 --> 00:00:20.579 +But if you use an Org Mode file instead, + +00:00:20.579 --> 00:00:22.560 +you can take advantage of the +great features + +00:00:22.560 --> 00:00:24.400 +that Org Mode provides, including + +00:00:24.400 --> 00:00:25.920 +literate programming, + +00:00:25.920 --> 00:00:28.000 +which lets you generate your source code + +00:00:28.000 --> 00:00:31.840 +and Markdown documentation dynamically. + +00:00:31.840 --> 00:00:34.719 +I want to walk you through a little bit + +00:00:34.719 --> 00:00:37.120 +of what this looks like. + +00:00:37.120 --> 00:00:39.440 +When you start a project, especially if + +00:00:39.440 --> 00:00:41.280 +if you use something like Github you + +00:00:41.280 --> 00:00:43.320 +begin with an automatically generated + +00:00:43.320 --> 00:00:47.039 +README.md file. So just delete that + +00:00:47.039 --> 00:00:50.239 +and instead create a README.org file. + +00:00:50.239 --> 00:00:51.712 +Starting with an empty Org file, + +00:00:51.712 --> 00:00:54.800 +like you see here, you can begin + +00:00:54.800 --> 00:00:56.559 +by recording important information about + +00:00:56.559 --> 00:00:59.440 +your project goals. You can add diagrams, + +00:00:59.440 --> 00:01:01.920 +code snippets, to-do lists, time tracking + +00:01:01.920 --> 00:01:03.520 +and much more. + +00:01:03.520 --> 00:01:05.360 +I'm going to drop in some documentation + +00:01:05.360 --> 00:01:07.760 +that that I've written about + +00:01:07.760 --> 00:01:12.240 +about my project here, so you can see + +00:01:12.240 --> 00:01:15.280 +what this would look like. + +00:01:15.280 --> 00:01:17.119 +As you can see, I have a title, and a + +00:01:17.119 --> 00:01:20.320 +description, and then a subsection + +00:01:20.320 --> 00:01:23.840 +as well as some code snippets. + +00:01:23.840 --> 00:01:25.520 +You can see that Org Mode does a great + +00:01:25.520 --> 00:01:28.240 +job of formatting lists, + +00:01:28.240 --> 00:01:31.280 +code sections, diagrams, and so forth. + +00:01:31.280 --> 00:01:35.040 +It's as good or better than Markdown, + +00:01:35.040 --> 00:01:37.179 +but when you use it in Emacs + +00:01:37.179 --> 00:01:38.880 +you can do a lot more. + +00:01:38.880 --> 00:01:40.479 +For example, you can dynamically create + +00:01:40.479 --> 00:01:43.360 +diagrams using Graphviz + +00:01:43.360 --> 00:01:45.200 +from a text description. If you go to + +00:01:45.200 --> 00:01:46.560 +this source block here + +00:01:46.560 --> 00:01:49.439 +and hit C-c C-c, you'll see + +00:01:49.439 --> 00:01:52.979 +that we generate a diagram dynamically + +00:01:55.439 --> 00:01:59.200 +You can run these code snippets in + +00:01:59.200 --> 00:02:00.799 +place and get the results + +00:02:00.799 --> 00:02:03.040 +to show up inside of your file, + +00:02:03.040 --> 00:02:08.000 +which is a really powerful paradigm. + +00:02:08.000 --> 00:02:10.640 +But most importantly, for + +00:02:10.640 --> 00:02:14.800 +my purposes here, + +00:02:14.800 --> 00:02:17.200 +Org Mode provides you the ability to do + +00:02:17.200 --> 00:02:19.520 +literate programming. + +00:02:19.520 --> 00:02:21.440 +So take a quick look at this diagram + +00:02:21.440 --> 00:02:23.200 +that I generated here. + +00:02:23.200 --> 00:02:25.312 +It gives you a quick overview of what + +00:02:25.312 --> 00:02:27.520 +I mean by literate programming + +00:02:27.520 --> 00:02:31.200 +and how I'm using it. You can see + +00:02:31.200 --> 00:02:34.720 +that we start with a README.org file +on top. + +00:02:34.720 --> 00:02:37.920 +At this point, we can do one of two +things: + +00:02:37.920 --> 00:02:41.280 +tangle or weave. Tangle is used to + +00:02:41.280 --> 00:02:42.720 +describe the process of + +00:02:42.720 --> 00:02:46.319 +generating source code, while weave + +00:02:46.319 --> 00:02:47.599 +is the process of generating + +00:02:47.599 --> 00:02:49.840 +documentation. These are terms that + +00:02:49.840 --> 00:02:51.920 +Donald Knuth used. + +00:02:51.920 --> 00:02:53.840 +He's the one that came up with the + +00:02:53.840 --> 00:02:55.519 +idea of literate programming + +00:02:55.519 --> 00:02:59.920 +in the early 1980s. + +00:02:59.920 --> 00:03:01.945 +But this is really all that there is to +it. + +00:03:01.945 --> 00:03:05.412 +You just... You are simply + +00:03:05.412 --> 00:03:07.840 +using a literate source file, + +00:03:07.840 --> 00:03:10.319 +in this case the README.org, to generate + +00:03:11.680 --> 00:03:17.120 +the rest of the project files, basically. + +00:03:17.120 --> 00:03:22.640 +So let's dig in to the details of how +this works. + +00:03:22.640 --> 00:03:24.560 +I hope you... Hopefully you'll see how + +00:03:24.560 --> 00:03:26.159 +cool this is. + +00:03:26.159 --> 00:03:27.545 +So returning to the file here. + +00:03:27.545 --> 00:03:31.120 +Let's assume we have enough +documentation now, + +00:03:31.120 --> 00:03:32.679 +that we want to get started +coding. + +00:03:32.679 --> 00:03:34.159 +So maybe we'll just start with + +00:03:34.159 --> 00:03:35.845 +like a Hello World app, + +00:03:35.845 --> 00:03:38.159 +just so we can make sure that our + +00:03:38.159 --> 00:03:41.519 +environment is set up correctly. + +00:03:41.519 --> 00:03:47.120 +Let's get started with a code block. + +00:03:47.120 --> 00:03:49.519 +So I created a little snippet to help me + +00:03:49.519 --> 00:03:51.612 +add a source block for + +00:03:51.612 --> 00:03:53.599 +literate programming quickly. + +00:03:53.599 --> 00:03:56.959 +There's not much to it, + +00:03:56.959 --> 00:03:59.479 +but there are some important annotations +here. + +00:04:01.599 --> 00:04:04.080 +Excuse me. There's a property + +00:04:04.080 --> 00:04:05.200 +called :tangle + +00:04:05.200 --> 00:04:09.360 +and that takes a value of a file name. + +00:04:09.360 --> 00:04:13.280 +Then there's also a :noweb property + +00:04:13.280 --> 00:04:18.880 +called no-export. + +00:04:23.759 --> 00:04:26.800 +Basically, the noexport--we'll explain + +00:04:26.800 --> 00:04:29.645 +that a little bit more later + +00:04:29.645 --> 00:04:32.080 +It has has to do with how + +00:04:32.080 --> 00:04:36.845 +the tangling is done in the tangle +step + +00:04:36.845 --> 00:04:38.479 +versus the weave step. + +00:04:38.479 --> 00:04:40.212 +I'll explain that a little bit more. + +00:04:40.212 --> 00:04:45.199 +But the tangle field just simply tells + +00:04:45.199 --> 00:04:48.320 +Emacs where it needs to generate the + +00:04:48.320 --> 00:04:50.320 +main.go file and where it needs to put + +00:04:50.320 --> 00:04:55.360 +it on the file system. + +00:04:55.360 --> 00:04:57.680 +You'll notice that we we're + +00:04:57.680 --> 00:04:59.040 +going to use Go. + +00:04:59.040 --> 00:05:01.440 +That's just the language that I've been + +00:05:01.440 --> 00:05:03.379 +using the most lately, + +00:05:03.379 --> 00:05:06.845 +but this programming strategy + +00:05:06.845 --> 00:05:08.400 +is language-agnostic. + +00:05:08.400 --> 00:05:11.279 +You could use any language + +00:05:11.279 --> 00:05:13.145 +or any mix of languages. + +00:05:13.145 --> 00:05:14.720 +You could create some files + +00:05:14.720 --> 00:05:16.560 +in Python, some files in Go, + +00:05:16.560 --> 00:05:19.179 +some files in Lisp, + +00:05:19.179 --> 00:05:21.520 +or whatever you want. + +00:05:24.720 --> 00:05:29.440 +Let's create just a little +Hello World. + +00:05:29.440 --> 00:05:31.379 +Let's use another snippet here + +00:05:31.379 --> 00:05:36.560 +to generate the basics of a Go program. + +00:05:36.560 --> 00:05:40.240 +I'm just going to print + +00:05:40.240 --> 00:05:44.960 +Hello World. + +00:05:44.960 --> 00:05:48.560 +So that's... And then + +00:05:48.560 --> 00:05:52.779 +let's make it a section in our file. + +00:05:52.779 --> 00:05:55.045 +So now you can see, we've got + +00:05:55.045 --> 00:05:56.400 +this snippet. + +00:05:56.400 --> 00:05:59.600 +When you have a source block in + +00:05:59.600 --> 00:06:01.600 +inside of Org Mode, you can easily pop + +00:06:01.600 --> 00:06:04.960 +into a language-specific buffer +by typing + +00:06:04.960 --> 00:06:07.680 +C-c ' (single quote). + +00:06:07.680 --> 00:06:10.240 +So you can see, now I have a + +00:06:10.240 --> 00:06:12.160 +buffer that's in go-mode + +00:06:12.160 --> 00:06:14.240 +and gives you all the ability to edit + +00:06:14.240 --> 00:06:15.520 +like you would + +00:06:15.520 --> 00:06:19.945 +normally. If you hit C-c ' +(single quote) + +00:06:19.945 --> 00:06:20.800 +again, it goes back and + +00:06:20.800 --> 00:06:25.045 +any changes you make will be +updated there. + +00:06:25.045 --> 00:06:26.160 +But you can do quite a bit + +00:06:26.160 --> 00:06:27.879 +just inside of here too. + +00:06:27.879 --> 00:06:29.199 +There's quite a bit of + +00:06:29.199 --> 00:06:34.479 +language-specific functionality + +00:06:34.479 --> 00:06:35.312 +just in place, + +00:06:35.312 --> 00:06:36.880 +so you don't always have to go over to a + +00:06:36.880 --> 00:06:38.080 +separate buffer. + +00:06:38.080 --> 00:06:42.319 +It's a nice option sometimes. + +00:06:42.319 --> 00:06:44.319 +Now that you have the code in here, + +00:06:44.319 --> 00:06:46.720 +you're going to want to run it. + +00:06:46.720 --> 00:06:48.179 +Right now, it just lives here + +00:06:48.179 --> 00:06:50.240 +in this documentation. + +00:06:50.240 --> 00:06:52.160 +You need to get a copy of it into a + +00:06:52.160 --> 00:06:53.840 +separate file, + +00:06:53.840 --> 00:06:57.440 +and that's the tangle process that you + +00:06:57.440 --> 00:07:01.360 +you need to follow there. So I'm gonna + +00:07:01.360 --> 00:07:03.360 +drop in a little bit more doc, a little + +00:07:03.360 --> 00:07:12.240 +bit more documentation really quick here. + +00:07:12.240 --> 00:07:19.112 +Okay, all right. So just as a side note, + +00:07:19.112 --> 00:07:22.845 +I like to follow this process. + +00:07:22.845 --> 00:07:26.639 +Whenever I have an operation to perform, + +00:07:26.639 --> 00:07:28.880 +I'd like to document it here with a + +00:07:28.880 --> 00:07:31.680 +snippet that can be executed inline. + +00:07:31.680 --> 00:07:33.280 +Then I don't have to leave Org Mode, and + +00:07:33.280 --> 00:07:34.639 +I don't have to try to remember what I + +00:07:34.639 --> 00:07:36.800 +did later. So instead of just + +00:07:36.800 --> 00:07:38.960 +trying to do an operation, the first time + +00:07:38.960 --> 00:07:40.319 +I do something, + +00:07:40.319 --> 00:07:41.680 +I take the time to figure out what it is + +00:07:41.680 --> 00:07:44.879 +and document it, so then it's +recorded. + +00:07:44.879 --> 00:07:49.120 +So here we find that to do a tangle +operation, + +00:07:49.120 --> 00:07:51.680 +you run the command org-babel-tangle, + +00:07:51.680 --> 00:07:53.779 +which is an Elisp command. + +00:07:53.779 --> 00:07:58.712 +If you hit C-c C-c to run it in place, + +00:07:58.712 --> 00:08:00.080 +you get the result + +00:08:00.080 --> 00:08:02.720 +of main.go, which basically is + +00:08:02.720 --> 00:08:03.759 +telling us that + +00:08:03.759 --> 00:08:07.680 +we've tangled one file called main.go. + +00:08:07.680 --> 00:08:11.039 +You can see that that's true + +00:08:11.039 --> 00:08:12.879 +if you go to the file system + +00:08:12.879 --> 00:08:14.400 +and you look. + +00:08:14.400 --> 00:08:17.840 +Now in our demo directory, + +00:08:17.840 --> 00:08:19.712 +we have a README.org, + +00:08:19.712 --> 00:08:22.045 +we have that PNG that we generated, + +00:08:22.045 --> 00:08:23.440 +but we also have a main.go. + +00:08:23.440 --> 00:08:25.945 +If you visit that file, + +00:08:25.945 --> 00:08:27.045 +you'll see that it's just + +00:08:27.045 --> 00:08:28.212 +the source code that was + +00:08:28.212 --> 00:08:29.280 +in our documentation, which is + +00:08:29.280 --> 00:08:30.679 +exactly what we expected + +00:08:30.679 --> 00:08:32.880 +and what we wanted. So that's good. + +00:08:32.880 --> 00:08:41.120 +So if we return to where we were at... + +00:08:41.120 --> 00:08:42.959 +Now we're at the point where we + +00:08:42.959 --> 00:08:44.479 +have a file on the file system. + +00:08:45.760 --> 00:08:48.379 +Now we need to build it + +00:08:48.379 --> 00:08:49.612 +and to run it. + +00:08:49.612 --> 00:08:57.040 +So let's follow the same philosophy, +where let's document + +00:08:57.040 --> 00:09:00.160 +these operations that we're going to +perform. + +00:09:00.160 --> 00:09:04.560 +I'm dropping in a + +00:09:04.560 --> 00:09:07.112 +a build instruction section + +00:09:07.112 --> 00:09:13.360 +and a run instruction section. + +00:09:13.360 --> 00:09:15.279 +As you can see here, we have a little + +00:09:15.279 --> 00:09:17.839 +a bash source block, + +00:09:17.839 --> 00:09:19.245 +and another bash source block. + +00:09:19.245 --> 00:09:21.812 +This one compiles. The go build command + +00:09:21.812 --> 00:09:25.440 +is what compiles a file. Then + +00:09:25.440 --> 00:09:26.579 +the file that gets generated + +00:09:26.579 --> 00:09:30.080 +should be called demo. + +00:09:30.080 --> 00:09:32.412 +So we just run it here. + +00:09:32.412 --> 00:09:37.839 +If I type C-c C-c, we get an +empty results block. + +00:09:37.839 --> 00:09:38.979 +When you compile things, + +00:09:38.979 --> 00:09:41.360 +no news is good news. + +00:09:41.360 --> 00:09:43.012 +It means there's no errors + +00:09:43.012 --> 00:09:45.912 +So presumably, we've created + +00:09:45.912 --> 00:09:48.000 +an executable that's called demo. + +00:09:51.440 --> 00:09:53.312 +Let's look again at the file system + +00:09:53.312 --> 00:10:02.480 +and regenerate... + +00:10:02.480 --> 00:10:06.479 +Yep. What we have here is a demo +executable, + +00:10:06.479 --> 00:10:07.760 +which is exactly what we +wanted. + +00:10:07.760 --> 00:10:12.079 +Let's go back. + +00:10:12.079 --> 00:10:14.160 +Now we should be able to run it. + +00:10:14.160 --> 00:10:16.079 +C-c C-c, + +00:10:16.079 --> 00:10:20.399 +and we get Hello World as a result, + +00:10:20.399 --> 00:10:23.440 +which was exactly what we were expecting. + +00:10:23.440 --> 00:10:26.560 +So that's already pretty cool. + +00:10:26.560 --> 00:10:30.839 +You can do that much. + +00:10:33.040 --> 00:10:34.560 +That's really just the tip of + +00:10:34.560 --> 00:10:37.839 +the iceberg. To really + +00:10:41.040 --> 00:10:43.440 +use the more impressive features of + +00:10:43.440 --> 00:10:46.160 +literate programming, + +00:10:46.160 --> 00:10:49.920 +we need to do a little bit more + +00:10:53.200 --> 00:10:54.512 +at least. Really, + +00:10:54.512 --> 00:10:56.480 +to get the full benefit of it, + +00:10:56.480 --> 00:11:01.079 +we need to add some sections + +00:11:01.079 --> 00:11:04.412 +that will cause Emacs to have to + +00:11:04.412 --> 00:11:06.720 +tangle or assemble + +00:11:06.720 --> 00:11:09.760 +this file from different pieces. + +00:11:09.760 --> 00:11:13.120 +Imagine that we wanted to take this file + +00:11:13.120 --> 00:11:16.720 +and maybe kind of templatize it. + +00:11:16.720 --> 00:11:19.120 +So, using literature programming syntax, + +00:11:19.120 --> 00:11:21.279 +this angle bracket syntax, + +00:11:21.279 --> 00:11:24.399 +let's say that we want to create an + +00:11:24.399 --> 00:11:29.360 +imports section, + +00:11:29.360 --> 00:11:32.399 +a functions section, + +00:11:32.399 --> 00:11:35.040 +and then maybe just a main section. + +00:11:35.040 --> 00:11:36.240 +We'll get rid of this. + +00:11:36.240 --> 00:11:37.920 +So now you see, we've created something + +00:11:37.920 --> 00:11:39.760 +that looks a little bit like a + +00:11:39.760 --> 00:11:42.880 +template or a scaffolding or outline + +00:11:42.880 --> 00:11:45.812 +for what our file is going to be. + +00:11:45.812 --> 00:11:48.399 +It looks a little bit like pseudocode. + +00:11:48.399 --> 00:11:50.612 +What we're going to have + +00:11:50.612 --> 00:11:52.399 +literate programming do + +00:11:52.399 --> 00:11:54.800 +is dynamically insert those things into + +00:11:54.800 --> 00:11:56.639 +those slots. + +00:11:56.639 --> 00:12:00.079 +So the first thing we need to do + +00:12:00.079 --> 00:12:03.200 +is... So let's create a section + +00:12:03.200 --> 00:12:08.079 +called "Say Hello." + +00:12:08.079 --> 00:12:09.519 +We want to add some functionality that + +00:12:09.519 --> 00:12:12.720 +makes our program say hello. + +00:12:12.720 --> 00:12:15.680 +So using a different snippet that I have + +00:12:15.680 --> 00:12:17.600 +for creating something + +00:12:17.600 --> 00:12:20.800 +that I call like a literate section, + +00:12:20.800 --> 00:12:24.079 +basically, we create a + +00:12:24.079 --> 00:12:26.000 +another source block that's almost the + +00:12:26.000 --> 00:12:27.839 +same as the one for the file. + +00:12:27.839 --> 00:12:29.412 +It just has a few differences + +00:12:29.412 --> 00:12:34.079 +Say we want to drop code into the import +section + +00:12:34.079 --> 00:12:36.639 +and we want it to be in Go. + +00:12:36.639 --> 00:12:40.720 +Here we use the same :noweb no-export syntax, + +00:12:40.720 --> 00:12:44.560 +but then we've added this :noweb-ref imports, + +00:12:44.560 --> 00:12:48.240 +and this ties that slot + +00:12:48.240 --> 00:12:51.120 +to this reference. It tells + +00:12:51.120 --> 00:12:53.760 +Emacs that when you tangle, + +00:12:53.760 --> 00:12:55.479 +we want to stick whatever's in here + +00:12:55.479 --> 00:12:58.240 +in that spot. + +00:12:58.240 --> 00:13:02.079 +You skip the tangle file name section + +00:13:02.079 --> 00:13:03.279 +because you're not actually creating a + +00:13:03.279 --> 00:13:04.240 +file name. + +00:13:04.240 --> 00:13:06.160 +You're putting information into an + +00:13:06.160 --> 00:13:07.680 +existing file. + +00:13:07.680 --> 00:13:10.720 +So here, we would just add the "fmt" + +00:13:10.720 --> 00:13:14.399 +for the imports. + +00:13:14.399 --> 00:13:16.145 +Let's add another section + +00:13:16.145 --> 00:13:22.240 +for functions. + +00:13:22.240 --> 00:13:23.812 +Let's just create a function + +00:13:23.812 --> 00:13:28.079 +called sayHello + +00:13:28.079 --> 00:13:31.745 +that doesn't have any arguments. + +00:13:31.745 --> 00:13:34.000 +No return types. + +00:13:34.000 --> 00:13:35.760 +All it does is pretty much the + +00:13:35.760 --> 00:13:37.440 +same thing as we did before: + +00:13:37.440 --> 00:13:38.479 +just print something. + +00:13:38.479 --> 00:13:45.760 +Let's just say "Hello EmacsConf" +this time. + +00:13:45.760 --> 00:13:47.279 +Now we have a function, + +00:13:47.279 --> 00:13:50.779 +and now the function won't do anything + +00:13:50.779 --> 00:13:52.720 +unless we invoke it. Let's do + +00:13:52.720 --> 00:13:56.000 +one last literate section + +00:13:56.000 --> 00:13:59.920 +called main. Make that Go + +00:13:59.920 --> 00:14:03.519 +source block. Then let's + +00:14:03.519 --> 00:14:10.320 +invoke that function. + +00:14:10.320 --> 00:14:13.360 +Now you can see that we've got + +00:14:13.360 --> 00:14:15.600 +our scaffolding + +00:14:15.600 --> 00:14:17.199 +outline, and then we have + +00:14:17.199 --> 00:14:20.079 +the sections that we want to get tangled + +00:14:20.079 --> 00:14:21.360 +or inserted. + +00:14:21.360 --> 00:14:25.440 +I've used this syntax. + +00:14:25.440 --> 00:14:27.199 +It's kinda borrowed from + +00:14:27.199 --> 00:14:28.479 +literate programming a little bit + +00:14:28.479 --> 00:14:30.320 +with a +=, so really it's just saying + +00:14:30.320 --> 00:14:32.480 +that I want to append + +00:14:32.480 --> 00:14:35.760 +this item into the import section + +00:14:35.760 --> 00:14:37.600 +It's really just to make a little bit + +00:14:37.600 --> 00:14:39.839 +more clear what's going on. + +00:14:39.839 --> 00:14:41.445 +When you generate documentation, + +00:14:41.445 --> 00:14:43.519 +you won't see these + +00:14:43.519 --> 00:14:46.979 +particular property annotations, + +00:14:46.979 --> 00:14:50.145 +and so you won't know immediately + +00:14:50.145 --> 00:14:51.779 +that this section goes in the + +00:14:51.779 --> 00:14:53.839 +imports area. So I usually put + +00:14:53.839 --> 00:14:55.440 +a little bit of documentation on top + +00:14:55.440 --> 00:14:57.760 +there, so that it's easy to see. + +00:14:57.760 --> 00:15:01.120 +You would, probably, if this was very + +00:15:01.120 --> 00:15:03.040 +complicated, you'd put some + +00:15:03.040 --> 00:15:06.245 +documentation above to explain + +00:15:06.245 --> 00:15:07.360 +what you were doing, + +00:15:07.360 --> 00:15:11.519 +maybe right here. + +00:15:11.519 --> 00:15:13.279 +You could picture yourself + +00:15:13.279 --> 00:15:15.040 +maybe explaining + +00:15:15.040 --> 00:15:16.745 +a complicated algorithm + +00:15:16.745 --> 00:15:18.079 +or something up here + +00:15:18.079 --> 00:15:21.120 +and having a nice way to document it. + +00:15:21.120 --> 00:15:22.959 +So now that we've got that here in the + +00:15:22.959 --> 00:15:25.600 +documentation, we need to figure out... + +00:15:25.600 --> 00:15:27.040 +We need to make sure that it's going to + +00:15:27.040 --> 00:15:28.045 +tangle properly. + +00:15:28.045 --> 00:15:33.519 +Your best friend at this point + +00:15:33.519 --> 00:15:35.680 +is a keyboard shortcut that lets you + +00:15:35.680 --> 00:15:37.945 +preview the tangled operation. + +00:15:37.945 --> 00:15:42.560 +If you say C-c C-v C-v, + +00:15:42.560 --> 00:15:44.079 +it will create a new buffer + +00:15:44.079 --> 00:15:47.212 +with the tangled contents + +00:15:47.212 --> 00:15:49.179 +and so you can see here + +00:15:49.179 --> 00:15:52.345 +that the fmt import went to the right +place, + +00:15:52.345 --> 00:15:54.679 +that function went to the right place, + +00:15:54.679 --> 00:15:56.079 +the function invocation went to + +00:15:56.079 --> 00:15:58.480 +the right place. We're feeling good. + +00:15:58.480 --> 00:16:00.912 +You can nest these things + +00:16:00.912 --> 00:16:02.800 +many layers deep. + +00:16:02.800 --> 00:16:06.045 +If you came into the sayHello function, + +00:16:06.045 --> 00:16:10.560 +you could add more sections. + +00:16:10.560 --> 00:16:13.759 +It'll go through and it'll + +00:16:13.759 --> 00:16:15.345 +keep track of all that + +00:16:15.345 --> 00:16:16.212 +and tangle it for you + +00:16:16.212 --> 00:16:16.959 +so you really get a lot of freedom + +00:16:16.959 --> 00:16:18.320 +and flexibility for how you want to + +00:16:18.320 --> 00:16:20.479 +document things by doing this. + +00:16:20.479 --> 00:16:23.079 +So now that we've previewed it + +00:16:23.079 --> 00:16:25.839 +and we feel good about it, + +00:16:25.839 --> 00:16:28.639 +we need to tangle so + +00:16:28.639 --> 00:16:31.440 +we get the file on the file system. + +00:16:31.440 --> 00:16:34.979 +so C-c C-c and get... + +00:16:34.979 --> 00:16:37.199 +just main.go comes back again. + +00:16:37.199 --> 00:16:40.959 +C-c C-cc and no errors come back. + +00:16:40.959 --> 00:16:43.279 +Then if we did this right, + +00:16:43.279 --> 00:16:45.079 +when we run this, we should get + +00:16:45.079 --> 00:16:45.600 +"Hello, EmacsConf." + +00:16:45.600 --> 00:16:51.199 +So C-c C-c, Hello EmacsConf. + +00:16:54.800 --> 00:16:57.645 +I think that's pretty, pretty cool, +actually. + +00:16:57.645 --> 00:16:59.579 +So we've got the breadcrumbs + +00:16:59.579 --> 00:17:01.212 +of the process we've gone through + +00:17:01.212 --> 00:17:02.399 +to get to this point, + +00:17:02.399 --> 00:17:07.545 +this initial document that has some +tangling in it. + +00:17:07.545 --> 00:17:09.919 +We have documentation for how to tangle, + +00:17:09.919 --> 00:17:11.345 +how to build, how to run. + +00:17:11.345 --> 00:17:15.045 +We've really built a nice foundation + +00:17:15.045 --> 00:17:19.379 +for moving forward on our project + +00:17:19.379 --> 00:17:21.439 +and a nice way of breaking things +out + +00:17:21.439 --> 00:17:23.280 +and documenting further. + +00:17:23.280 --> 00:17:27.120 +The last piece that we need to + +00:17:27.120 --> 00:17:30.559 +take care of is the weave that + +00:17:30.559 --> 00:17:34.799 +I showed you in the diagram above. + +00:17:34.799 --> 00:17:38.640 +So one more time, we'll drop in + +00:17:38.640 --> 00:17:41.760 +some documentatio, this time on how + +00:17:41.760 --> 00:17:42.400 +to weave. + +00:17:42.400 --> 00:17:44.400 +It's really just an export function. + +00:17:44.400 --> 00:17:46.245 +it's not... There's not a separate + +00:17:46.245 --> 00:17:49.012 +weave command going on here. + +00:17:49.012 --> 00:17:50.640 +we're just going to export + +00:17:50.640 --> 00:17:53.512 +what we've got here into a Markdown +format. + +00:17:53.512 --> 00:17:57.045 +We're using org-gfm-export-to-markdown, + +00:17:57.045 --> 00:17:59.745 +which is the Github style markdown. + +00:17:59.745 --> 00:18:02.160 +You can use the other, + +00:18:02.160 --> 00:18:03.812 +more standard type as well. + +00:18:03.812 --> 00:18:08.479 +Hit C-c C-c. Now you see + +00:18:08.479 --> 00:18:11.312 +we've got a README file, + +00:18:11.312 --> 00:18:16.512 +and if you look in the file system, + +00:18:16.512 --> 00:18:19.120 +we've got that right there. + +00:18:19.120 --> 00:18:23.120 +If you go to something like ghostwriter + +00:18:23.120 --> 00:18:31.679 +and open that file, + +00:18:31.679 --> 00:18:32.879 +now you can see that + +00:18:32.879 --> 00:18:35.520 +it's generated some documentation. + +00:18:35.520 --> 00:18:37.645 +It puts a index at top at the top. + +00:18:39.679 --> 00:18:41.145 +I usually turn that off. + +00:18:41.145 --> 00:18:42.379 +It's easy to do that by + +00:18:42.379 --> 00:18:43.179 +putting a property at the + +00:18:43.179 --> 00:18:46.145 +top of your Org file, + +00:18:46.145 --> 00:18:46.880 +but some people like to + +00:18:46.880 --> 00:18:48.559 +have an index. + +00:18:48.559 --> 00:18:50.799 +Here you can see that it has generated + +00:18:50.799 --> 00:18:55.200 +pretty nicely and formatted +snippets well, + +00:18:55.200 --> 00:18:56.880 +put the diagram in there, and then + +00:18:58.240 --> 00:19:02.799 +it's preserved this +literate programming syntax, + +00:19:02.799 --> 00:19:04.960 +which is important because that's how we + +00:19:04.960 --> 00:19:06.112 +want to view the documentation. + +00:19:06.112 --> 00:19:11.312 +That's what the no-exports property + +00:19:11.312 --> 00:19:13.360 +was trying to maintain. + +00:19:13.360 --> 00:19:15.979 +no-exports means when you export, + +00:19:15.979 --> 00:19:18.400 +do not try to tangle. + +00:19:18.400 --> 00:19:20.559 +Hopefully that makes more sense now. + +00:19:20.559 --> 00:19:22.240 +Now you can see all the documentation. + +00:19:22.240 --> 00:19:26.080 +I think it demonstrates a + +00:19:26.080 --> 00:19:33.520 +pretty useful feature that's inside of +Emacs. + +00:19:33.520 --> 00:19:34.979 +Hopefully you'll have as much fun + +00:19:34.979 --> 00:19:39.919 +using that as I have. + +00:19:39.919 --> 00:19:43.600 +So thanks! diff --git a/2020/subtitles/emacsconf-2020--15-moving-from-jekyll-to-orgmode-an-experience-report--adolfo-villafiorita-autogen.vtt b/2020/subtitles/emacsconf-2020--15-moving-from-jekyll-to-orgmode-an-experience-report--adolfo-villafiorita-autogen.vtt deleted file mode 100644 index 21202a4a..00000000 --- a/2020/subtitles/emacsconf-2020--15-moving-from-jekyll-to-orgmode-an-experience-report--adolfo-villafiorita-autogen.vtt +++ /dev/null @@ -1,1183 +0,0 @@ -WEBVTT - -00:00:00.080 --> 00:00:03.120 -okay okay excellent sorry okay so - -00:00:03.120 --> 00:00:06.960 -uh hello everyone um and um - -00:00:06.960 --> 00:00:10.080 -uh nice meeting you and let me - -00:00:10.080 --> 00:00:12.400 -thank the the organizer for all the - -00:00:12.400 --> 00:00:13.920 -organization and all the work they are - -00:00:13.920 --> 00:00:15.200 -doing to support us - -00:00:15.200 --> 00:00:18.400 -my name is adolfo villaferita - -00:00:18.400 --> 00:00:19.920 -I'm teaching at the university of - -00:00:19.920 --> 00:00:21.920 -trenton I'm also - -00:00:21.920 --> 00:00:24.480 -work will shortly be working at - -00:00:24.480 --> 00:00:26.240 -shared.tech which is a comp - -00:00:26.240 --> 00:00:29.359 -a non-profit organization developing an - -00:00:29.359 --> 00:00:30.530 -applications to - -00:00:30.530 --> 00:00:32.399 -[Music] - -00:00:32.399 --> 00:00:35.680 -recover surplus food but the the - -00:00:35.680 --> 00:00:38.960 -reason of the talk today and the reason - -00:00:38.960 --> 00:00:40.079 -I'm here today - -00:00:40.079 --> 00:00:42.719 -is to talk about my experience in moving - -00:00:42.719 --> 00:00:44.000 -from jekyll uh - -00:00:44.000 --> 00:00:47.200 -static website generator to org mode and - -00:00:47.200 --> 00:00:49.200 -the reason - -00:00:49.200 --> 00:00:52.079 -I move to work mode is to have better - -00:00:52.079 --> 00:00:53.039 -support for - -00:00:53.039 --> 00:00:56.800 -literary programming on the websites - -00:00:56.800 --> 00:00:58.399 -at the university of trento where we - -00:00:58.399 --> 00:01:00.480 -make available the content for the - -00:01:00.480 --> 00:01:04.720 -the students okay so - -00:01:04.720 --> 00:01:08.000 -first of all what is a static website - -00:01:08.000 --> 00:01:10.080 -generator it is basically a tool which - -00:01:10.080 --> 00:01:11.360 -allows you to - -00:01:11.360 --> 00:01:15.360 -generate html files out of text files - -00:01:15.360 --> 00:01:17.439 -containing basically two types of - -00:01:17.439 --> 00:01:19.280 -information metadata - -00:01:19.280 --> 00:01:23.119 -and content metadata is let's say a - -00:01:23.119 --> 00:01:26.159 -set of key pairs describing the the - -00:01:26.159 --> 00:01:28.560 -content of the file such as the title - -00:01:28.560 --> 00:01:30.000 -author - -00:01:30.000 --> 00:01:31.759 -tags and so on and so forth and the - -00:01:31.759 --> 00:01:34.560 -content is what you actually want to to - -00:01:34.560 --> 00:01:37.040 -get published on the on the internet in - -00:01:37.040 --> 00:01:38.880 -the html file - -00:01:38.880 --> 00:01:41.439 -and usually the content is written in - -00:01:41.439 --> 00:01:44.560 -some kind of - -00:01:44.560 --> 00:01:47.520 -markup language such as markdown or - -00:01:47.520 --> 00:01:49.759 -possibly - -00:01:49.759 --> 00:01:53.200 -org mode and well jackie is a very - -00:01:53.200 --> 00:01:55.759 -popular website uh - -00:01:55.759 --> 00:01:58.719 -a static website generator it is written - -00:01:58.719 --> 00:01:59.840 -in a ruby - -00:01:59.840 --> 00:02:03.280 -and what it does it it it systematically - -00:02:03.280 --> 00:02:06.840 -let's say transforms all the input files - -00:02:06.840 --> 00:02:09.440 -by making the content into - -00:02:09.440 --> 00:02:11.599 -html and systematically applying a - -00:02:11.599 --> 00:02:14.000 -template in order to generate the - -00:02:14.000 --> 00:02:17.120 -html files which you can then deploy - -00:02:17.120 --> 00:02:19.840 -on your server of choice to make them - -00:02:19.840 --> 00:02:22.160 -available on the on the internet - -00:02:22.160 --> 00:02:26.160 -and one of the features uh most - -00:02:26.160 --> 00:02:28.480 -well I would say all static website - -00:02:28.480 --> 00:02:30.239 -generators have - -00:02:30.239 --> 00:02:32.560 -is a debt of being able to let's say - -00:02:32.560 --> 00:02:34.879 -collect the metadata information - -00:02:34.879 --> 00:02:38.400 -uh of the files being part of your of - -00:02:38.400 --> 00:02:39.440 -your project - -00:02:39.440 --> 00:02:45.280 -and the reason they do that is because - -00:02:45.280 --> 00:02:47.840 -you sometimes want to generate pages - -00:02:47.840 --> 00:02:49.280 -based on the content - -00:02:49.280 --> 00:02:53.200 -of your um of your projects - -00:02:53.200 --> 00:02:56.239 -such as for instance the the list of - -00:02:56.239 --> 00:02:59.040 -posts you have recently published or - -00:02:59.040 --> 00:03:00.400 -maybe the list of tags - -00:03:00.400 --> 00:03:03.840 -uh you uh have defined for your post and - -00:03:03.840 --> 00:03:07.280 -so on and so forth so so - -00:03:07.280 --> 00:03:09.760 -dracula gives the possibility of - -00:03:09.760 --> 00:03:12.400 -generating this kind of dynamic - -00:03:12.400 --> 00:03:15.760 -content by using liquid which is a - -00:03:15.760 --> 00:03:18.800 -templating language which - -00:03:18.800 --> 00:03:21.840 -looks like these - -00:03:21.840 --> 00:03:24.879 -so basically you you have all the - -00:03:24.879 --> 00:03:26.879 -constructs you can - -00:03:26.879 --> 00:03:29.120 -expect in a programming language this - -00:03:29.120 --> 00:03:29.920 -for instance - -00:03:29.920 --> 00:03:33.360 -is a fourth cycle which - -00:03:33.360 --> 00:03:37.440 -iterates over all the post or the - -00:03:37.440 --> 00:03:39.599 -files in a specific directory of the - -00:03:39.599 --> 00:03:41.040 -jacket project - -00:03:41.040 --> 00:03:45.040 -and for each post it takes the the title - -00:03:45.040 --> 00:03:48.400 -and the url and generates a link - -00:03:48.400 --> 00:03:51.840 -okay so dracule is - -00:03:51.840 --> 00:03:55.200 -nice and sweet but over the years - -00:03:55.200 --> 00:03:57.760 -I started using more and more - -00:03:57.760 --> 00:03:59.519 -systematically - -00:03:59.519 --> 00:04:02.959 -or mode to write all my files and I - -00:04:02.959 --> 00:04:05.439 -moved from markdown to word mode I am a - -00:04:05.439 --> 00:04:07.439 -long time Emacs user so I've been using - -00:04:07.439 --> 00:04:09.680 -imax for 30 years now so - -00:04:09.680 --> 00:04:12.799 -or mode is a more recent discovery - -00:04:12.799 --> 00:04:15.280 -but it is a very nice uh let's say - -00:04:15.280 --> 00:04:16.239 -discovery I - -00:04:16.239 --> 00:04:19.680 -I made and the reason I like org mode - -00:04:19.680 --> 00:04:22.320 -is because for instance you can write - -00:04:22.320 --> 00:04:23.600 -formulas using - -00:04:23.600 --> 00:04:26.639 -mac jacks and you can generate diagrams - -00:04:26.639 --> 00:04:30.320 -or plots with new plots and - -00:04:30.320 --> 00:04:32.240 -also important is the fact that you have - -00:04:32.240 --> 00:04:34.080 -the possibility of let's say publishing - -00:04:34.080 --> 00:04:35.919 -your documents - -00:04:35.919 --> 00:04:39.520 -to multiple ends backhands such as pdf - -00:04:39.520 --> 00:04:40.400 -or - -00:04:40.400 --> 00:04:43.600 -maybe a review presentations or - -00:04:43.600 --> 00:04:47.199 -or html and this is all made possible - -00:04:47.199 --> 00:04:50.479 -by bubble which is - -00:04:50.479 --> 00:04:52.560 -exactly what we just saw in the the - -00:04:52.560 --> 00:04:54.639 -previous talk - -00:04:54.639 --> 00:04:57.440 -namely the possibility of executing a - -00:04:57.440 --> 00:04:59.520 -snippet of code - -00:04:59.520 --> 00:05:02.560 -embedded in in your pages - -00:05:02.560 --> 00:05:06.400 -um and our model can also be used - -00:05:06.400 --> 00:05:09.600 -within let's say jackie and in fact - -00:05:09.600 --> 00:05:10.720 -there is a - -00:05:10.720 --> 00:05:15.199 -a nice gem a nice library called jackie - -00:05:15.199 --> 00:05:18.880 -org which allows you to use org modifies - -00:05:18.880 --> 00:05:19.680 -directly - -00:05:19.680 --> 00:05:22.880 -into jekyll but when you start using - -00:05:22.880 --> 00:05:26.560 -org mode when I started using - -00:05:26.560 --> 00:05:30.560 -mode I realized I could move - -00:05:30.560 --> 00:05:34.240 -all my workflow to or my publishing - -00:05:34.240 --> 00:05:36.840 -workflow to image - -00:05:36.840 --> 00:05:39.520 -and and and in fact - -00:05:39.520 --> 00:05:41.600 -org mode is also static website - -00:05:41.600 --> 00:05:42.880 -generator because - -00:05:42.880 --> 00:05:46.240 -it has got the possibility of publishing - -00:05:46.240 --> 00:05:50.880 -um projects made of org mode files - -00:05:50.880 --> 00:05:53.840 -and one of the nice things about let's - -00:05:53.840 --> 00:05:55.759 -say that the publishing features of work - -00:05:55.759 --> 00:05:56.479 -mode - -00:05:56.479 --> 00:05:58.880 -is that it allows you to define in the - -00:05:58.880 --> 00:05:59.840 -org publish - -00:05:59.840 --> 00:06:03.199 -project a list of the components - -00:06:03.199 --> 00:06:06.479 -which are part of your project and in a - -00:06:06.479 --> 00:06:07.520 -sense it is - -00:06:07.520 --> 00:06:10.479 -also more flexible than jackie lee's - -00:06:10.479 --> 00:06:12.400 -because it also allows you for instance - -00:06:12.400 --> 00:06:12.880 -to - -00:06:12.880 --> 00:06:15.120 -let's say publish a single file rather - -00:06:15.120 --> 00:06:17.440 -than having to recompile everything - -00:06:17.440 --> 00:06:20.080 -every time you want to publish your - -00:06:20.080 --> 00:06:23.919 -your project to your website however - -00:06:23.919 --> 00:06:25.840 -there are some short comments I would - -00:06:25.840 --> 00:06:27.120 -say or some some - -00:06:27.120 --> 00:06:29.520 -areas of improvement improvement let me - -00:06:29.520 --> 00:06:30.400 -say - -00:06:30.400 --> 00:06:32.720 -the first is that let's say support for - -00:06:32.720 --> 00:06:33.600 -templating - -00:06:33.600 --> 00:06:36.639 -is not so obvious as it is let's say - -00:06:36.639 --> 00:06:39.280 -in jackie or even though there are some - -00:06:39.280 --> 00:06:40.560 -let's say - -00:06:40.560 --> 00:06:44.560 -nice extensions such as argo t html - -00:06:44.560 --> 00:06:46.160 -for instance which allows you to use - -00:06:46.160 --> 00:06:48.400 -templates and - -00:06:48.400 --> 00:06:51.840 -more important to me was the fact that - -00:06:51.840 --> 00:06:54.080 -apparently there is little support for - -00:06:54.080 --> 00:06:55.520 -the creation of dynamic - -00:06:55.520 --> 00:06:58.240 -content so I was very curious and very - -00:06:58.240 --> 00:06:59.360 -keen to use - -00:06:59.360 --> 00:07:02.800 -or mode for let's say publishing my blog - -00:07:02.800 --> 00:07:05.440 -and my the the courses at the university - -00:07:05.440 --> 00:07:08.720 -but then uh I had to find a way - -00:07:08.720 --> 00:07:11.440 -to let's say being able to publish these - -00:07:11.440 --> 00:07:13.599 -dynamic pages finding some kind of - -00:07:13.599 --> 00:07:16.000 -replacement so to speak for uh the - -00:07:16.000 --> 00:07:16.720 -liquid - -00:07:16.720 --> 00:07:19.759 -the liquid engine and and the solution - -00:07:19.759 --> 00:07:20.160 -was - -00:07:20.160 --> 00:07:24.160 -that at hand actually because - -00:07:24.160 --> 00:07:27.280 -basically I realized I could use bubble - -00:07:27.280 --> 00:07:30.800 -for exactly this purpose so rather than - -00:07:30.800 --> 00:07:32.720 -using bubble for generating - -00:07:32.720 --> 00:07:35.759 -plots or let's say my other computation - -00:07:35.759 --> 00:07:37.919 -or whatever I was using them for - -00:07:37.919 --> 00:07:41.039 -I realized they could use bubble to - -00:07:41.039 --> 00:07:42.080 -generate - -00:07:42.080 --> 00:07:45.120 -html which could be let's say - -00:07:45.120 --> 00:07:48.960 -uh then published uh uh - -00:07:48.960 --> 00:07:52.720 -in the project so uh so all I needed to - -00:07:52.720 --> 00:07:53.680 -do then - -00:07:53.680 --> 00:07:56.240 -was defining some kind of functions some - -00:07:56.240 --> 00:07:58.319 -kind of code in order to read - -00:07:58.319 --> 00:08:01.840 -all the org mode uh the metadata of all - -00:08:01.840 --> 00:08:02.400 -the - -00:08:02.400 --> 00:08:05.759 -opmod files of my web project so that - -00:08:05.759 --> 00:08:09.680 -I could let's say then publish uh - -00:08:09.680 --> 00:08:13.280 -generate the dynamic content and - -00:08:13.280 --> 00:08:18.080 -this is a snippet taken from - -00:08:18.080 --> 00:08:21.759 -one of my html projects - -00:08:21.759 --> 00:08:24.800 -which basically shows the way in which - -00:08:24.800 --> 00:08:27.599 -I generate the um the list of posts on - -00:08:27.599 --> 00:08:29.360 -my on my page it is uh - -00:08:29.360 --> 00:08:32.560 -exactly how the the liquid that we saw - -00:08:32.560 --> 00:08:34.320 -in a couple of a couple of slides - -00:08:34.320 --> 00:08:35.680 -earlier that looks like - -00:08:35.680 --> 00:08:39.200 -uh in inner mode - -00:08:39.200 --> 00:08:42.320 -and basically what I'm doing I'm using I - -00:08:42.320 --> 00:08:46.720 -wrote a ruby script which - -00:08:46.720 --> 00:08:49.680 -reads all the metadata so this uh - -00:08:49.680 --> 00:08:51.040 -highlighted code - -00:08:51.040 --> 00:08:53.440 -basically loads the script which is - -00:08:53.440 --> 00:08:54.240 -stored - -00:08:54.240 --> 00:08:56.800 -externally and then it collects all the - -00:08:56.800 --> 00:08:58.320 -metadata from the - -00:08:58.320 --> 00:09:00.880 -org mode files in the current uh in the - -00:09:00.880 --> 00:09:02.240 -current directory - -00:09:02.240 --> 00:09:04.800 -and then the the following the the code - -00:09:04.800 --> 00:09:06.480 -you can see here - -00:09:06.480 --> 00:09:09.839 -basically iterate over all the - -00:09:09.839 --> 00:09:12.959 -past red the at the previous step - -00:09:12.959 --> 00:09:16.399 -and it generates um - -00:09:16.399 --> 00:09:19.519 -a list with the title and uh - -00:09:19.519 --> 00:09:22.959 -and the urls and so basically - -00:09:22.959 --> 00:09:27.440 -replicating what jackie does so - -00:09:27.440 --> 00:09:30.240 -okay so there are some some other things - -00:09:30.240 --> 00:09:32.399 -I have to to deal with in order to let's - -00:09:32.399 --> 00:09:33.200 -say - -00:09:33.200 --> 00:09:36.480 -accommodate my workflow and but that was - -00:09:36.480 --> 00:09:39.200 -relatively easy in the sense that one of - -00:09:39.200 --> 00:09:40.240 -the - -00:09:40.240 --> 00:09:43.279 -uh problem one of the issue I had to - -00:09:43.279 --> 00:09:45.360 -solve was that of let's say having - -00:09:45.360 --> 00:09:48.480 -a common navigation on all my - -00:09:48.480 --> 00:09:51.040 -pages uh but that was easily solved - -00:09:51.040 --> 00:09:51.920 -using - -00:09:51.920 --> 00:09:54.959 -uh the include feature so I basically - -00:09:54.959 --> 00:09:56.000 -made available - -00:09:56.000 --> 00:09:57.839 -and include with all the navigation - -00:09:57.839 --> 00:10:00.560 -which is uh embedded in all the pages of - -00:10:00.560 --> 00:10:01.839 -my websites - -00:10:01.839 --> 00:10:04.959 -uh through the could include and another - -00:10:04.959 --> 00:10:06.160 -nice feature which - -00:10:06.160 --> 00:10:08.560 -jackie las is the possibility of - -00:10:08.560 --> 00:10:09.760 -previewing - -00:10:09.760 --> 00:10:12.800 -a website before deploying it and but - -00:10:12.800 --> 00:10:13.200 -then - -00:10:13.200 --> 00:10:16.079 -Emacs also has got a node which allows - -00:10:16.079 --> 00:10:17.839 -you to - -00:10:17.839 --> 00:10:21.200 -launch a web server and in fact - -00:10:21.200 --> 00:10:24.320 -I wrote a quick ack - -00:10:24.320 --> 00:10:26.959 -which allows you to which allows to - -00:10:26.959 --> 00:10:28.000 -basically - -00:10:28.000 --> 00:10:31.519 -invoke a node on a on our - -00:10:31.519 --> 00:10:34.720 -mode project and start a local preview - -00:10:34.720 --> 00:10:37.920 -and then use rsync - -00:10:37.920 --> 00:10:44.839 -in order to deploy the the website - -00:10:44.839 --> 00:10:46.240 -um - -00:10:46.240 --> 00:10:48.720 -five minutes left okay okay more than - -00:10:48.720 --> 00:10:51.200 -enough okay - -00:10:51.200 --> 00:10:53.200 -thanks thank you thank you very much I'm - -00:10:53.200 --> 00:10:55.440 -nearly done so then I can take some some - -00:10:55.440 --> 00:10:56.480 -questions - -00:10:56.480 --> 00:11:00.560 -so okay just to give you maybe - -00:11:00.560 --> 00:11:03.680 -a slightly more in-depth uh - -00:11:03.680 --> 00:11:06.480 -view of what the pages look like so - -00:11:06.480 --> 00:11:07.200 -these are - -00:11:07.200 --> 00:11:11.120 -one of the pages or the source files - -00:11:11.120 --> 00:11:14.720 -of one of the websites it is - -00:11:14.720 --> 00:11:18.480 -in literate programming so basically uh - -00:11:18.480 --> 00:11:20.399 -you see there is some metadata here I - -00:11:20.399 --> 00:11:22.640 -mean this is a regular old mod file - -00:11:22.640 --> 00:11:26.640 -and this part here - -00:11:26.640 --> 00:11:29.920 -basically defines some common options - -00:11:29.920 --> 00:11:31.519 -for publication - -00:11:31.519 --> 00:11:35.920 -and these two includes here - -00:11:35.920 --> 00:11:41.120 -put some extra html in the head part and - -00:11:41.120 --> 00:11:44.480 -the navigation and here as you can see - -00:11:44.480 --> 00:11:48.079 -is the code generating the - -00:11:48.079 --> 00:11:50.160 -the list in chronological order it is - -00:11:50.160 --> 00:11:52.240 -slightly more complex than the example I - -00:11:52.240 --> 00:11:53.839 -made in the slide - -00:11:53.839 --> 00:11:56.240 -because uh there is some more - -00:11:56.240 --> 00:11:57.839 -elaboration to - -00:11:57.839 --> 00:11:59.760 -uh to do including putting some - -00:11:59.760 --> 00:12:01.839 -javascript to identify - -00:12:01.839 --> 00:12:05.120 -according to let's say the the tags - -00:12:05.120 --> 00:12:08.160 -so to go back to the to the presentation - -00:12:08.160 --> 00:12:11.200 -um so the okay so - -00:12:11.200 --> 00:12:13.600 -I I managed this migration uh a few - -00:12:13.600 --> 00:12:14.560 -months ago - -00:12:14.560 --> 00:12:17.680 -and then uh all my workflow is within - -00:12:17.680 --> 00:12:20.399 -with old mode and within imax and um - -00:12:20.399 --> 00:12:23.079 -I'm very happy with it because it's - -00:12:23.079 --> 00:12:24.240 -simplified - -00:12:24.240 --> 00:12:26.800 -uh quite a bit let's say my public - -00:12:26.800 --> 00:12:28.480 -publication process - -00:12:28.480 --> 00:12:31.839 -and uh one of the advantages so another - -00:12:31.839 --> 00:12:34.240 -advantage so the first advantage is that - -00:12:34.240 --> 00:12:36.959 -everything is in ork mode and dmax - -00:12:36.959 --> 00:12:38.160 -second advantage - -00:12:38.160 --> 00:12:41.680 -is that everything is based on the - -00:12:41.680 --> 00:12:44.880 -standard machinery provided by orb mode - -00:12:44.880 --> 00:12:47.760 -so in a sense it is kind of let's say - -00:12:47.760 --> 00:12:50.079 -more robust with respect to - -00:12:50.079 --> 00:12:53.040 -dependencies and possible errors and so - -00:12:53.040 --> 00:12:54.320 -on and so forth - -00:12:54.320 --> 00:12:56.639 -and um and the fact that the old mode - -00:12:56.639 --> 00:12:58.240 -allows you to publish - -00:12:58.240 --> 00:13:00.880 -a single file in a project is is also - -00:13:00.880 --> 00:13:03.839 -very interesting because - -00:13:03.839 --> 00:13:07.839 -it allows to let's say be more robust to - -00:13:07.839 --> 00:13:11.040 -problems you might introduce when - -00:13:11.040 --> 00:13:14.079 -you're changing when I'm changing the - -00:13:14.079 --> 00:13:14.959 -setup - -00:13:14.959 --> 00:13:16.880 -and another interesting thing which I - -00:13:16.880 --> 00:13:18.320 -realized that I - -00:13:18.320 --> 00:13:21.519 -uh I could have is that - -00:13:21.519 --> 00:13:23.600 -in a sense the specification of the - -00:13:23.600 --> 00:13:24.880 -website - -00:13:24.880 --> 00:13:27.360 -is uh can be embedded in the website - -00:13:27.360 --> 00:13:28.480 -itself - -00:13:28.480 --> 00:13:30.800 -so in a sense this is some kind of let's - -00:13:30.800 --> 00:13:31.839 -say self - -00:13:31.839 --> 00:13:35.120 -the command it's a real set documenting - -00:13:35.120 --> 00:13:37.200 -uh what I'm actually doing so for - -00:13:37.200 --> 00:13:38.560 -instance - -00:13:38.560 --> 00:13:43.199 -uh here on my - -00:13:43.199 --> 00:13:46.399 -website you can see let's say the - -00:13:46.399 --> 00:13:48.240 -specification of the - -00:13:48.240 --> 00:13:51.519 -of the of the project which is uh loaded - -00:13:51.519 --> 00:13:52.320 -from my - -00:13:52.320 --> 00:13:55.519 -initialization file but then it is also - -00:13:55.519 --> 00:13:56.320 -published - -00:13:56.320 --> 00:13:59.440 -together with my home page and it leaves - -00:13:59.440 --> 00:14:01.360 -with the repository where - -00:14:01.360 --> 00:14:05.360 -I keep all the sources of my website - -00:14:05.360 --> 00:14:08.079 -which is kind of nice because it - -00:14:08.079 --> 00:14:09.839 -basically isolates - -00:14:09.839 --> 00:14:14.079 -everything in a single in a single place - -00:14:14.079 --> 00:14:16.880 -okay so there are some examples I'm - -00:14:16.880 --> 00:14:18.000 -showing them - -00:14:18.000 --> 00:14:20.320 -more because of the let's say source - -00:14:20.320 --> 00:14:21.760 -code which - -00:14:21.760 --> 00:14:25.519 -you can grab from the git repositories - -00:14:25.519 --> 00:14:26.160 -if you are - -00:14:26.160 --> 00:14:28.399 -interested of course I'm also available - -00:14:28.399 --> 00:14:30.079 -to provide some - -00:14:30.079 --> 00:14:32.959 -support and help if you are interested - -00:14:32.959 --> 00:14:34.480 -in this kind of stuff - -00:14:34.480 --> 00:14:37.760 -the the next step for me will be that of - -00:14:37.760 --> 00:14:38.560 -let's say trying - -00:14:38.560 --> 00:14:41.600 -making this kind of machinery available - -00:14:41.600 --> 00:14:45.199 -for more general use at the moment - -00:14:45.199 --> 00:14:47.120 -if you are interested in trying out my - -00:14:47.120 --> 00:14:48.800 -suggestion is let's say grabbing the - -00:14:48.800 --> 00:14:49.839 -sources - -00:14:49.839 --> 00:14:52.959 -or one of the let's say websites to see - -00:14:52.959 --> 00:14:56.000 -what how they look like and maybe try - -00:14:56.000 --> 00:14:56.720 -and - -00:14:56.720 --> 00:15:00.160 -customize it for your purposes - -00:15:00.160 --> 00:15:02.720 -and this is basically the content of my - -00:15:02.720 --> 00:15:03.839 -talk so - -00:15:03.839 --> 00:15:06.959 -I'm open to two questions and thank you - -00:15:06.959 --> 00:15:07.279 -for - -00:15:07.279 --> 00:15:10.880 -your attention you are now unmuted uh - -00:15:10.880 --> 00:15:12.880 -thank you very much adolfo for your - -00:15:12.880 --> 00:15:14.480 -awesome presentation - -00:15:14.480 --> 00:15:17.360 -um I think we have time for maybe like - -00:15:17.360 --> 00:15:19.360 -one or two questions - -00:15:19.360 --> 00:15:21.279 -um and then the rest maybe you could - -00:15:21.279 --> 00:15:22.880 -take up um - -00:15:22.880 --> 00:15:26.639 -after the stream after sure - -00:15:26.639 --> 00:15:30.000 -uh I we should do um would you like me - -00:15:30.000 --> 00:15:31.839 -to read you the questions - -00:15:31.839 --> 00:15:35.199 -uh yeah probably better because - -00:15:35.199 --> 00:15:40.399 -I kind of lost there okay no problem um - -00:15:40.399 --> 00:15:42.480 -okay so someone asks do you have any - -00:15:42.480 --> 00:15:45.440 -opinion on fern - -00:15:45.440 --> 00:15:48.639 -fan I I don't know fans - -00:15:48.639 --> 00:15:51.839 -so I'll give it a try and uh and uh - -00:15:51.839 --> 00:15:55.040 -and check it out okay - -00:15:55.040 --> 00:15:57.839 -thanks and um people are also asking do - -00:15:57.839 --> 00:15:59.680 -you discuss this for example in a blog - -00:15:59.680 --> 00:16:01.279 -or anywhere else they could find more - -00:16:01.279 --> 00:16:02.800 -about it - -00:16:02.800 --> 00:16:05.600 -oh yes I'm going to publish the let's - -00:16:05.600 --> 00:16:08.560 -say the talk and the content on the - -00:16:08.560 --> 00:16:11.120 -on my website and then I'll link it from - -00:16:11.120 --> 00:16:12.320 -the max conf - -00:16:12.320 --> 00:16:14.720 -conference so that it will be easier for - -00:16:14.720 --> 00:16:15.680 -people to - -00:16:15.680 --> 00:16:19.040 -to reach it so I will shortly make it - -00:16:19.040 --> 00:16:22.880 -available right after the conference - -00:16:22.880 --> 00:16:25.440 -wonderful and I think that's all for the - -00:16:25.440 --> 00:16:26.160 -questions - -00:16:26.160 --> 00:16:28.560 -thank you very much okay thank you very - -00:16:28.560 --> 00:16:29.600 -much thank you - -00:16:29.600 --> 00:16:34.800 -and cheers bye cheers bye diff --git a/2020/subtitles/emacsconf-2020--15-moving-from-jekyll-to-orgmode-an-experience-report--adolfo-villafiorita.vtt b/2020/subtitles/emacsconf-2020--15-moving-from-jekyll-to-orgmode-an-experience-report--adolfo-villafiorita.vtt new file mode 100644 index 00000000..5d0b0b57 --- /dev/null +++ b/2020/subtitles/emacsconf-2020--15-moving-from-jekyll-to-orgmode-an-experience-report--adolfo-villafiorita.vtt @@ -0,0 +1,1057 @@ +WEBVTT + +00:00:00.080 --> 00:00:03.120 +Adolfo: Okay, excellent. + +00:00:03.120 --> 00:00:06.960 +Hello, everyone and + +00:00:06.960 --> 00:00:10.080 +nice meeting you. Let me + +00:00:10.080 --> 00:00:12.400 +thank the the organizer for all the + +00:00:12.400 --> 00:00:13.920 +organization and all the work they are + +00:00:13.920 --> 00:00:15.200 +doing to support us. + +00:00:15.200 --> 00:00:18.400 +My name is Adolfo Villafiorita. + +00:00:18.400 --> 00:00:20.733 +I'm teaching at the University of +Trento. + +00:00:20.733 --> 00:00:24.480 +I will shortly be working at + +00:00:24.480 --> 00:00:26.240 +shared.tech, which is + +00:00:26.240 --> 00:00:29.359 +a non-profit organization developing + +00:00:29.359 --> 00:00:30.530 +applications to + +00:00:32.399 --> 00:00:35.680 +recover surplus food. + +00:00:35.680 --> 00:00:38.600 +The reason of the talk today + +00:00:38.600 --> 00:00:40.079 +and the reason I'm here today + +00:00:40.079 --> 00:00:42.719 +is to talk about my experience in moving + +00:00:42.719 --> 00:00:47.200 +from Jekyll static website generator to +Org Mode. + +00:00:47.200 --> 00:00:50.700 +The reason I moved to Org Mode + +00:00:50.700 --> 00:00:53.100 +is to have better support for + +00:00:53.100 --> 00:00:56.800 +literate programming on the websites + +00:00:56.800 --> 00:00:58.399 +at the University of Trento, where we + +00:00:58.399 --> 00:01:00.480 +make available the content for the + +00:01:00.480 --> 00:01:04.720 +the students. + +00:01:04.720 --> 00:01:08.900 +First of all, what is a static +website generator? + +00:01:08.900 --> 00:01:10.080 +It is basically a tool which + +00:01:10.080 --> 00:01:11.360 +allows you to + +00:01:11.360 --> 00:01:15.360 +generate HTML files out of text files + +00:01:15.360 --> 00:01:17.439 +containing basically two types of + +00:01:17.439 --> 00:01:20.700 +information: metadata and content. + +00:01:20.700 --> 00:01:23.119 +Metadata is a + +00:01:23.119 --> 00:01:26.159 +set of key pairs describing the + +00:01:26.159 --> 00:01:28.560 +content of the file, such as the title, + +00:01:28.560 --> 00:01:31.733 +author, tags, and so on and so forth. + +00:01:31.733 --> 00:01:34.560 +The content is what you actually +want to + +00:01:34.560 --> 00:01:37.040 +get published on the Internet in + +00:01:37.040 --> 00:01:38.880 +the HTML file. + +00:01:38.880 --> 00:01:41.439 +Usually the content is written in + +00:01:41.439 --> 00:01:45.800 +some kind of markup language, + +00:01:45.800 --> 00:01:49.759 +such as Markdown or possibly + +00:01:49.759 --> 00:01:53.200 +Org Mode. Jekyll is a very + +00:01:53.200 --> 00:01:57.900 +popular static website generator. + +00:01:57.900 --> 00:01:59.840 +It is written in Ruby. + +00:01:59.840 --> 00:02:03.280 +What it does: it systematically + +00:02:03.280 --> 00:02:06.840 +transforms all the input files + +00:02:06.840 --> 00:02:09.440 +by making the content into + +00:02:09.440 --> 00:02:11.599 +HTML and systematically applying a + +00:02:11.599 --> 00:02:14.000 +template in order to generate the + +00:02:14.000 --> 00:02:17.120 +HTML files, which you can then deploy + +00:02:17.120 --> 00:02:19.840 +on your server of choice to make them + +00:02:19.840 --> 00:02:22.160 +available on the Internet. + +00:02:22.160 --> 00:02:26.160 +One of the features most-- + +00:02:26.160 --> 00:02:27.500 +well, I would say all + +00:02:27.500 --> 00:02:30.239 +static website generators have + +00:02:30.239 --> 00:02:32.560 +is that of being able to + +00:02:32.560 --> 00:02:34.879 +collect the metadata information + +00:02:34.879 --> 00:02:38.400 +of the files being part of + +00:02:38.400 --> 00:02:39.440 +your project. + +00:02:39.440 --> 00:02:45.280 +The reason they do that is because + +00:02:45.280 --> 00:02:47.840 +you sometimes want to generate pages + +00:02:47.840 --> 00:02:49.280 +based on the content + +00:02:49.280 --> 00:02:53.200 +of your projects, + +00:02:53.200 --> 00:02:56.239 +such as, for instance, the list of + +00:02:56.239 --> 00:02:59.040 +posts you have recently published, or + +00:02:59.040 --> 00:03:00.400 +maybe the list of tags + +00:03:00.400 --> 00:03:03.840 +you have defined for your post, + +00:03:03.840 --> 00:03:07.280 +and so on and so forth. + +00:03:07.280 --> 00:03:09.760 +Jekyll gives the possibility of + +00:03:09.760 --> 00:03:12.400 +generating this kind of dynamic + +00:03:12.400 --> 00:03:14.400 +content by using Liquid, + +00:03:14.400 --> 00:03:18.800 +which is a templating language which + +00:03:18.800 --> 00:03:21.840 +looks like this. + +00:03:21.840 --> 00:03:24.879 +So basically, you have all the + +00:03:24.879 --> 00:03:26.879 +constructs you can + +00:03:26.879 --> 00:03:28.800 +expect in a programming language. + +00:03:28.800 --> 00:03:29.920 +This, for instance, + +00:03:29.920 --> 00:03:33.360 +is a for cycle which + +00:03:33.360 --> 00:03:37.440 +iterates over all the posts or the + +00:03:37.440 --> 00:03:39.599 +files in a specific directory of the + +00:03:39.599 --> 00:03:41.040 +Jekyll project. + +00:03:41.040 --> 00:03:45.040 +For each post, it takes the title + +00:03:45.040 --> 00:03:48.400 +and the URL and generates a link. + +00:03:48.400 --> 00:03:52.867 +So Jekyll is nice and sweet, + +00:03:52.867 --> 00:03:55.200 +but over the years + +00:03:55.200 --> 00:03:57.760 +I started using more and more + +00:03:57.760 --> 00:03:59.519 +systematically + +00:03:59.519 --> 00:04:02.000 +Org Mode to write all my files. + +00:04:02.000 --> 00:04:04.833 +I moved from Markdown to Org Mode + +00:04:04.833 --> 00:04:07.200 +I am a long time Emacs user. + +00:04:07.200 --> 00:04:09.167 +I've been using Emacs for 30 years now, + +00:04:09.167 --> 00:04:12.799 +so Org Mode is a more recent discovery, + +00:04:12.799 --> 00:04:17.033 +but it is a very nice discovery I made. + +00:04:17.033 --> 00:04:19.680 +The reason I like Org Mode + +00:04:19.680 --> 00:04:22.320 +is because, for instance, you can write + +00:04:22.320 --> 00:04:24.933 +formulas using MathJax + +00:04:24.933 --> 00:04:26.639 +and you can generate diagrams + +00:04:26.639 --> 00:04:30.320 +or plots with Gnuplot. + +00:04:30.320 --> 00:04:32.240 +Also important is the fact that you have + +00:04:32.240 --> 00:04:34.080 +the possibility of publishing + +00:04:34.080 --> 00:04:39.520 +your documents to multiple backends +such as PDF, + +00:04:39.520 --> 00:04:43.600 +or maybe a Reveal presentation, + +00:04:43.600 --> 00:04:47.199 +or HTML. This is all made possible + +00:04:47.199 --> 00:04:50.479 +by Babel, which is + +00:04:50.479 --> 00:04:52.560 +exactly what we just saw in the + +00:04:52.560 --> 00:04:54.639 +previous talk: + +00:04:54.639 --> 00:04:57.440 +Namely, the possibility of executing a + +00:04:57.440 --> 00:04:59.520 +snippet of code + +00:04:59.520 --> 00:05:02.560 +embedded in in your pages. + +00:05:02.560 --> 00:05:06.400 +Our model can also be used + +00:05:06.400 --> 00:05:09.600 +within Jekyll. In fact, + +00:05:09.600 --> 00:05:13.667 +there is a a nice gem, a nice library, + +00:05:13.667 --> 00:05:17.233 +called jekyll-org which allows you + +00:05:17.233 --> 00:05:19.680 +to use Org Mode files directly + +00:05:19.680 --> 00:05:22.880 +into jekyll. But when you start using + +00:05:22.880 --> 00:05:26.560 +Org Mode... When I started using + +00:05:26.560 --> 00:05:30.560 +Org Mode, I realized I could move + +00:05:30.560 --> 00:05:34.240 +all my workflow, all my publishing + +00:05:34.240 --> 00:05:36.840 +workflow to Emacs. + +00:05:36.840 --> 00:05:41.100 +In fact, Org Mode is also a + +00:05:41.100 --> 00:05:42.880 +static website generator because + +00:05:42.880 --> 00:05:46.240 +it has got the possibility of publishing + +00:05:46.240 --> 00:05:50.880 +projects made of Org Mode files. + +00:05:50.880 --> 00:05:53.840 +One of the nice things about + +00:05:53.840 --> 00:05:56.479 +the publishing features of Org Mode + +00:05:56.479 --> 00:05:58.880 +is that it allows you to define in the + +00:05:58.880 --> 00:06:01.300 +org-publish-project-alist, + +00:06:01.300 --> 00:06:03.199 +all the the components + +00:06:03.199 --> 00:06:05.367 +which are part of your project. + +00:06:05.367 --> 00:06:07.520 +In a sense, it is + +00:06:07.520 --> 00:06:10.479 +also more flexible than Jekyll, + +00:06:10.479 --> 00:06:12.880 +because it also allows you, for instance, + +00:06:12.880 --> 00:06:15.120 +to publish a single file rather + +00:06:15.120 --> 00:06:17.440 +than having to recompile everything + +00:06:17.440 --> 00:06:20.080 +every time you want to publish your + +00:06:20.080 --> 00:06:22.333 +your project to your website. + +00:06:22.333 --> 00:06:25.333 +However, there are some short comments + +00:06:25.333 --> 00:06:29.520 +I would say, or some areas +of improvement. + +00:06:30.400 --> 00:06:33.600 +The first is that support for +templating + +00:06:33.600 --> 00:06:36.639 +is not so obvious as it is + +00:06:36.639 --> 00:06:39.280 +in Jekyll, even though there are some + +00:06:40.560 --> 00:06:44.560 +nice extensions such as org-thtml, + +00:06:44.560 --> 00:06:48.400 +for instance, which allows you to use +templates. + +00:06:48.400 --> 00:06:51.840 +More important to me was the fact that + +00:06:51.840 --> 00:06:54.080 +apparently, there is little support for + +00:06:54.080 --> 00:06:56.133 +the creation of dynamic content + +00:06:56.133 --> 00:06:57.900 +So I was very curious + +00:06:57.900 --> 00:06:59.360 +and very keen to use + +00:06:59.360 --> 00:07:02.800 +Org Mode for publishing my blog + +00:07:02.800 --> 00:07:05.440 +and the courses at the university, + +00:07:05.440 --> 00:07:08.720 +but then I had to find a way + +00:07:08.720 --> 00:07:11.440 +to being able to publish these + +00:07:11.440 --> 00:07:13.599 +dynamic pages, finding some kind of + +00:07:13.599 --> 00:07:16.000 +replacement, so to speak, + +00:07:16.720 --> 00:07:17.900 +for the liquid engine. + +00:07:17.900 --> 00:07:24.160 +The solution was there at hand, +actually, because + +00:07:24.160 --> 00:07:27.280 +basically, I realized I could use Babel + +00:07:27.280 --> 00:07:30.800 +for exactly this purpose. Rather than + +00:07:30.800 --> 00:07:32.720 +using Babel for generating + +00:07:32.720 --> 00:07:35.759 +plots or my other computations + +00:07:35.759 --> 00:07:37.919 +or whatever I was using them for, + +00:07:37.919 --> 00:07:41.039 +I realized I could use Babel to + +00:07:41.039 --> 00:07:45.120 +generate HTML which could be + +00:07:45.120 --> 00:07:49.967 +then published in the project + +00:07:49.967 --> 00:07:53.680 +All I needed to do then + +00:07:53.680 --> 00:07:56.100 +was defining some kind of functions, + +00:07:56.100 --> 00:07:58.319 +some kind of code in order to read + +00:07:58.319 --> 00:08:01.840 +the metadata of all + +00:08:01.840 --> 00:08:04.767 +the Org Mode files of my web project, + +00:08:04.767 --> 00:08:09.680 +so that I could then publish-- + +00:08:09.680 --> 00:08:13.280 +generate the dynamic content. + +00:08:13.280 --> 00:08:18.080 +This is a snippet taken from + +00:08:18.080 --> 00:08:21.759 +one of my HTML projects, + +00:08:21.759 --> 00:08:24.800 +which basically shows the way in which + +00:08:24.800 --> 00:08:27.599 +I generate the list of posts on + +00:08:27.599 --> 00:08:32.560 +my page. It is exactly how the +Liquid that we saw + +00:08:32.560 --> 00:08:35.680 +a couple of slides earlier that +looks like + +00:08:35.680 --> 00:08:39.200 +in Org Mode. + +00:08:39.200 --> 00:08:42.320 +Basically, what I'm doing... +I'm using... + +00:08:42.320 --> 00:08:46.720 +I wrote a Ruby script which + +00:08:46.720 --> 00:08:49.680 +reads all the metadata. So this + +00:08:49.680 --> 00:08:51.040 +highlighted code + +00:08:51.040 --> 00:08:53.100 +basically loads the script + +00:08:53.100 --> 00:08:55.300 +which is stored externally. + +00:08:55.300 --> 00:08:56.800 +Then it collects all the + +00:08:56.800 --> 00:08:58.320 +metadata from the + +00:08:58.320 --> 00:09:00.880 +Org Mode files in the + +00:09:00.880 --> 00:09:02.240 +current directory. + +00:09:02.240 --> 00:09:04.800 +And then the following... The code + +00:09:04.800 --> 00:09:06.480 +you can see here + +00:09:06.480 --> 00:09:09.839 +basically iterates over all the + +00:09:09.839 --> 00:09:12.959 +posts read at the previous step. + +00:09:12.959 --> 00:09:16.399 +It generates + +00:09:16.399 --> 00:09:19.519 +a list with the title + +00:09:19.519 --> 00:09:22.959 +and the URLS, basically + +00:09:22.959 --> 00:09:27.440 +replicating what Jekyll does. + +00:09:27.440 --> 00:09:30.240 +There are some other things + +00:09:30.240 --> 00:09:32.399 +I have to deal with in order to + +00:09:33.200 --> 00:09:36.480 +accommodate my workflow. But that was + +00:09:36.480 --> 00:09:39.200 +relatively easy in the sense that one of + +00:09:39.200 --> 00:09:43.279 +the problems, one of the issues I had to + +00:09:43.279 --> 00:09:45.360 +solve was that of having + +00:09:45.360 --> 00:09:48.480 +a common navigation on all my + +00:09:48.480 --> 00:09:51.040 +pages. That was easily solved + +00:09:51.040 --> 00:09:53.867 +using the #+INCLUDE feature. + +00:09:53.867 --> 00:09:54.959 +So I basically + +00:09:54.959 --> 00:09:56.000 +made available + +00:09:56.000 --> 00:09:57.839 +an #+INCLUDE with all the navigation + +00:09:57.839 --> 00:10:00.560 +which is embedded in all the pages of + +00:10:00.560 --> 00:10:01.839 +my websites + +00:10:01.839 --> 00:10:03.733 +through the #+INCLUDE. + +00:10:03.733 --> 00:10:06.160 +Another nice feature which + +00:10:06.160 --> 00:10:08.560 +Jekyll has is the possibility of + +00:10:08.560 --> 00:10:12.800 +previewing a website before deploying it. + +00:10:13.200 --> 00:10:16.079 +Emacs also has got a node which allows + +00:10:16.079 --> 00:10:21.200 +you to launch a web server. In fact, + +00:10:21.200 --> 00:10:24.320 +I wrote a quick hack + +00:10:24.320 --> 00:10:26.959 +which allows you to + +00:10:26.959 --> 00:10:31.519 +invoke a node on an Org Mode + +00:10:31.519 --> 00:10:34.720 +project, start a local preview, + +00:10:34.720 --> 00:10:37.920 +and then use rsync + +00:10:37.920 --> 00:10:44.839 +in order to deploy the the website. + +00:10:46.240 --> 00:10:48.720 +Five minutes left. More than + +00:10:48.720 --> 00:10:51.200 +enough. Okay. + +00:10:51.200 --> 00:10:52.967 +Thanks. Thank you, thank you very much. + +00:10:52.967 --> 00:10:56.480 +I'm nearly done. So then I can take +some questions. + +00:10:56.480 --> 00:11:00.560 +Just to give you maybe + +00:11:00.560 --> 00:11:03.680 +a slightly more in-depth + +00:11:03.680 --> 00:11:06.480 +view of what the pages look like, + +00:11:06.480 --> 00:11:07.200 +so these are + +00:11:07.200 --> 00:11:11.120 +one of the pages, or the source files + +00:11:11.120 --> 00:11:14.720 +of one of the websites. It is + +00:11:14.720 --> 00:11:18.480 +in literate programming. Basically, + +00:11:18.480 --> 00:11:20.399 +you see there is some metadata here. + +00:11:20.399 --> 00:11:22.640 +I mean this is a regular Org Mode file. + +00:11:22.640 --> 00:11:26.640 +This part here + +00:11:26.640 --> 00:11:29.920 +basically defines some common options + +00:11:29.920 --> 00:11:31.519 +for publication. + +00:11:31.519 --> 00:11:35.920 +These two includes here + +00:11:35.920 --> 00:11:41.120 +put some extra HTML in the head part and + +00:11:41.120 --> 00:11:44.480 +the navigation. Here, as you can see, + +00:11:44.480 --> 00:11:48.079 +is the code generating the + +00:11:48.079 --> 00:11:50.160 +the list in chronological order. It is + +00:11:50.160 --> 00:11:52.240 +slightly more complex than the example I + +00:11:52.240 --> 00:11:53.839 +made in the slide + +00:11:53.839 --> 00:11:56.240 +because there is some more + +00:11:56.240 --> 00:11:59.760 +elaboration to do, including +putting some + +00:11:59.760 --> 00:12:01.839 +Javascript to identify + +00:12:01.839 --> 00:12:05.120 +according to the tags. + +00:12:05.120 --> 00:12:08.160 +To go back to the presentation... + +00:12:11.200 --> 00:12:13.067 +I managed this migration + +00:12:13.067 --> 00:12:14.560 +a few months ago, + +00:12:14.560 --> 00:12:17.680 +and then all my workflow is within + +00:12:17.680 --> 00:12:20.399 +Org Mode and within Emacs. + +00:12:20.399 --> 00:12:23.079 +I'm very happy with it because it's + +00:12:23.079 --> 00:12:26.800 +simplified quite a bit + +00:12:26.800 --> 00:12:28.480 +my publication process. + +00:12:28.480 --> 00:12:31.839 +One of the advantages... Another + +00:12:31.839 --> 00:12:34.240 +advantage... So the first advantage is that + +00:12:34.240 --> 00:12:36.959 +everything is in Org Mode and Emacs. + +00:12:36.959 --> 00:12:38.160 +Second advantage + +00:12:38.160 --> 00:12:41.680 +is that everything is based on the + +00:12:41.680 --> 00:12:44.880 +standard machinery provided by Org Mode. + +00:12:44.880 --> 00:12:47.760 +So in a sense, it is + +00:12:47.760 --> 00:12:50.079 +more robust with respect to + +00:12:50.079 --> 00:12:53.040 +dependencies, possible errors, and so + +00:12:53.040 --> 00:12:54.320 +on and so forth. + +00:12:54.320 --> 00:12:56.639 +The fact that Org Mode + +00:12:56.639 --> 00:12:58.240 +allows you to publish + +00:12:58.240 --> 00:13:00.880 +a single file in a project is also + +00:13:00.880 --> 00:13:03.839 +very interesting because + +00:13:03.839 --> 00:13:07.839 +it allows to be more robust to + +00:13:07.839 --> 00:13:11.040 +problems you might introduce when + +00:13:11.040 --> 00:13:14.959 +you're changing--when I'm changing the +setup. + +00:13:14.959 --> 00:13:16.880 +Another interesting thing which I + +00:13:16.880 --> 00:13:21.519 +realized that I could have is that + +00:13:21.519 --> 00:13:23.600 +in a sense, the specification of the + +00:13:23.600 --> 00:13:28.480 +website can be embedded in the website +itself. + +00:13:28.480 --> 00:13:30.800 +In a sense this is some kind of + +00:13:30.800 --> 00:13:31.839 +self-documenting... + +00:13:31.839 --> 00:13:35.120 +It's a way of self-documenting + +00:13:35.120 --> 00:13:36.600 +what I'm actually doing. + +00:13:36.600 --> 00:13:44.133 +For instance, here on my website, + +00:13:44.133 --> 00:13:46.399 +you can see the + +00:13:46.399 --> 00:13:48.240 +specification of the + +00:13:48.240 --> 00:13:51.519 +project which is loaded + +00:13:51.519 --> 00:13:53.933 +from my initialization file, + +00:13:53.933 --> 00:13:56.320 +but then it is also published + +00:13:56.320 --> 00:13:59.440 +together with my home page. It lives + +00:13:59.440 --> 00:14:01.360 +with the repository where + +00:14:01.360 --> 00:14:05.360 +I keep all the sources of my website, + +00:14:05.360 --> 00:14:08.079 +which is kind of nice because it + +00:14:08.079 --> 00:14:09.839 +basically isolates + +00:14:09.839 --> 00:14:14.079 +everything in a single place. + +00:14:14.079 --> 00:14:16.880 +So there are some examples. I'm + +00:14:16.880 --> 00:14:19.433 +showing them more because of the + +00:14:19.433 --> 00:14:21.760 +source code which + +00:14:21.760 --> 00:14:25.519 +you can grab from the git repositories + +00:14:25.519 --> 00:14:26.933 +if you are interested. + +00:14:26.933 --> 00:14:28.399 +Of course I'm also available + +00:14:28.399 --> 00:14:31.600 +to provide some support and help + +00:14:31.600 --> 00:14:32.959 +if you are interested + +00:14:32.959 --> 00:14:34.480 +in this kind of stuff. + +00:14:34.480 --> 00:14:37.760 +The the next step for me will be that of + +00:14:37.760 --> 00:14:41.600 +trying, making this kind of +machinery available + +00:14:41.600 --> 00:14:45.199 +for more general use at the moment. + +00:14:45.199 --> 00:14:47.120 +If you are interested in trying out my + +00:14:47.120 --> 00:14:48.800 +suggestion, grabbing the + +00:14:48.800 --> 00:14:51.933 +sources for one of the websites + +00:14:51.933 --> 00:14:54.700 +to seehow they look like, + +00:14:54.700 --> 00:14:56.720 +and maybe try and + +00:14:56.720 --> 00:15:00.160 +customize it for your purposes... + +00:15:00.160 --> 00:15:03.839 +This is basically the content of my talk. + +00:15:03.839 --> 00:15:06.959 +I'm open to questions and thank you + +00:15:06.959 --> 00:15:10.880 +for your attention. + +00:15:10.880 --> 00:15:12.880 +(Amin: Thank you very much, Adolfo, for your + +00:15:12.880 --> 00:15:14.480 +awesome presentation. + +00:15:14.480 --> 00:15:17.360 +I think we have time for maybe like + +00:15:17.360 --> 00:15:19.360 +one or two questions, + +00:15:19.360 --> 00:15:21.279 +and then the rest maybe you could + +00:15:21.279 --> 00:15:26.639 +take up after the stream.) + +00:15:26.639 --> 00:15:28.033 +Adolfo: What should we do? + +00:15:28.033 --> 00:15:30.000 +(Amin: Would you like me + +00:15:30.000 --> 00:15:31.839 +to read you the questions?) + +00:15:31.839 --> 00:15:35.199 +Adolfo: Yeah, probably better because + +00:15:35.199 --> 00:15:36.700 +I'm kind of lost there. + +00:15:36.700 --> 00:15:40.399 +(Amin: Okay, no problem. + +00:15:40.399 --> 00:15:42.480 +So someone asks, "Do you have any + +00:15:42.480 --> 00:15:45.440 +opinion on Firn?") + +00:15:45.440 --> 00:15:48.639 +Adolfo: Firn. I don't know Firn, + +00:15:48.639 --> 00:15:51.839 +so I'll give it a try + +00:15:51.839 --> 00:15:55.040 +and check it out. + +00:15:55.040 --> 00:15:57.839 +(Amin: Thanks. People are also asking, + +00:15:57.839 --> 00:15:59.680 +do you discuss this, for example, in a blog + +00:15:59.680 --> 00:16:01.279 +or anywhere else they could find more + +00:16:01.279 --> 00:16:02.800 +about it?) + +00:16:02.800 --> 00:16:05.600 +Adolfo: Oh yes. I'm going to publish the + +00:16:05.600 --> 00:16:08.560 +the talk and the content + +00:16:08.560 --> 00:16:11.120 +on my website, and then I'll link it from + +00:16:11.120 --> 00:16:13.067 +the EmacsConf conference + +00:16:13.067 --> 00:16:14.720 +so that it will be easier for + +00:16:14.720 --> 00:16:16.533 +people to to reach it + +00:16:16.533 --> 00:16:19.040 +I will shortly make it + +00:16:19.040 --> 00:16:22.880 +available right after the conference. + +00:16:22.880 --> 00:16:26.160 +(Amin: Wonderful. I think that's all +for the questions. + +00:16:26.160 --> 00:16:27.667 +Thank you very much.) + +00:16:27.667 --> 00:16:29.600 +Adolfo: Thank you very much. Thank you. + +00:16:29.600 --> 00:16:34.800 +(Amin: Cheers.) Adolfo: Bye, cheers. (Amin: Bye.) |