diff options
Diffstat (limited to '2020/info')
-rw-r--r-- | 2020/info/06.md | 185 | ||||
-rw-r--r-- | 2020/info/08.md | 375 | ||||
-rw-r--r-- | 2020/info/09.md | 147 | ||||
-rw-r--r-- | 2020/info/10.md | 99 | ||||
-rw-r--r-- | 2020/info/11.md | 374 | ||||
-rw-r--r-- | 2020/info/12.md | 488 | ||||
-rw-r--r-- | 2020/info/13.md | 379 | ||||
-rw-r--r-- | 2020/info/14.md | 436 | ||||
-rw-r--r-- | 2020/info/15.md | 1062 |
9 files changed, 3535 insertions, 10 deletions
diff --git a/2020/info/06.md b/2020/info/06.md index 7c187a0f..b9cc0a27 100644 --- a/2020/info/06.md +++ b/2020/info/06.md @@ -52,3 +52,188 @@ important problem space in free software, FWIW. - LISP wasn't on the list. - Disagreement is not the barrier. - Emacs is threatening as something that addresses many different needs/use-cases. + +<a name="transcript"></a> +# Transcript + +Following is a somewhat hasty self-transcription of my talk. Please +don't hesitate to [mailto:corwin@bru.st](ask for clarification) or to +add any clarifications you feel helpful back into the EmacsConf wiki. + + There is a visual gimmick underlaying the initial remarks. We are + looking at the first (first-slide ("Welcome") showing how the org + markdown looks on other editors, including cygwin emacs, Notepad++, + Sublime, VS Code, and cygwin vim. As each is closed we see the next, + until we reveal GUI Emacs running org-mode in a full-both frame. + +My name is Corwin Brust and I will be talking about getting started +with Emacs Today. I have been an Emacs user for a long time- + +First of all thanks and a huge welcome to the conference..(_15s_) + +On behalf of and back to the other organizers. It has been cool to +have a peek backstage. + +So. I've used a lot of different editors in my time. That's about 25 +years as a professional software engineer. And most of that +time I've been using Emacs. (~54s_) + +I'll talk a little bit in a minute (if I can ever find my slides) +about how I got into Emacs, but if you've used Emacs and a lot of +other editors for a long time, something that you notice right away is +that you get good with it in a way that stays meaningful. You learn +new things, those things stick with you. You learn how to- how to +make it do new tricks and then keep doing those tricks. (~1m26s_) + +I want to mention this conference isn't about (whoops: "this talk") +how to adjust your configuration specifically. I don't have a bunch +of good code samples in here. There are a bunch of other great talks, +especially Andrew's that I think may be aimed more at that "hey, I'm +just getting started with Emacs what are some things to try to make it +more comfortable for me starting?" [subject/audience? cezb]. (~2m07s_) + +This is about how to think about the problem space more. (_2m10s_) + +Hopefully a good way to warm up as we start thinking about some of the +lightning talks later on. (I'm going to bring up my IRC buffer +[offscreen] in case I run into time- I didn't get my stopwatch started +for this one.) (_2m25s_) + +So, alright: let's dive in. (_2m30s_) + +We assume that we want to install packages, and maybe configure some +features. This is particularly from the perspective of where we're +working with a bunch of others on a team and we want to get something +done. (_2m42s_) + +Some of us probably have mature Emacs workflows, others may be +installing it for the first time. (_2m50s_) + +So the first questions is, you know- in that context: what's the value +proposition? Why should I mess with my machine, my mature Emacs +configuration, impose my way of thinking and ideas over the way +somebody else is learning Emacs? (_3m09m_) + +It can be [laugh] I'm off my slides here a little bit.. (_3m13s_) + +It can be a little tricky to learn Emacs. One thing that helps us a +lot is if people that we are working with can tell us, kinda, +keystroke-for-keystroke at times what to do and explain what +everything is doing. (_3m30s_) + +And using the same packages as others can really help us working +together on a project. (_3m36s_) + +Speaking from my personal experience, it took me decades to get to the +point where I was excited to program in Emacs Lisp. (_3m26s_) + +I've programed in a lot of programming languages, but Lisp wasn't on +my list. I looked at my config, that I was copy-pasting around from +generation after generation of .emacs file or re-crafting it by hand +and from Internet searches, to get things that I needed when I would +quickly go install Emacs to start some new job or contract, and +quickly get though that work-flow that caused me to go install the +program. (_4m15s_) + +You know, just simple little one-liners that got committed to memory +over decades eventually just lead [me] to a sort of "hey, what's going +on here". (_4m27s_) + +And I credit my good friend Jeff Goff who died earlier in 2020 for my +lifelong love of Emacs. Perhaps Erik and I will talk a little more +about that at another talk we have scheduled but Jeff was a huge +influence on us in a number of ways and a huge contributer to the Raku +programming language which is very cool. (_4m52s_) + +So, understanding how to make a good decision about splitting up +configuration in a way to share it with people with really different +uses of Emacs. That's actually a complicated topic, and I want to off +and stare at it for a second: (_5m11s_) + +I think Emacs is about people, so that means it is about community. +And community means we're going to invite disagreement. In fact that +disagreement isn't necessarily a road-block to our project, in fact +that some of the work our project can invite us to do is to get closer +to each other by inviting those disagreements, by learning from people +of different styles, and from how they argue, and thinking about why +they have that perspective and what technical benefits that perhaps +radical point of view might carry away. Some people are really +aggressive arguers others are very passive and really couch their +ideas in distancing terms, "well probably this is a good idea" or +"please double check me". Those don't always indicate how certain a +person is. Because we're different. We have different ways of +communicating ideas such as certainty or excitement. (_6m23s_) + +When we thinking about a bunch of really diverse programmers +approaching Emacs probably one of our first really big challenges is +just to pick what we're going to go after. There are a number of +existing kit installs and things like this. My argument is that you +can get pretty far just trading files around. And maybe the more +value conversation to have is making the hard decisions, e.g. "should +we have vertical completion", should that be out of the box and those +that want the traditional splayed-out over a sing line such as the +mode line will have to add a line to their configuration. (_7m26s) + +The way to get there? + +How do we find out what works? + +We don't want to slow down the people who are super productive with +Emacs, and ask them to completely break their workflows to make it +easier for new folks, at the same time we do want to make sure those +new people. (_7m42s_) + +At the same time, we do want to make sure those new people arre +excited by Emacs and not turned off by having to learn the entire +jungle of Emacs history in the form of it's unique technical stylings +in terms of frames, buffers, and other unique Emacs viewpoints on +interface concepts, especially. (_8m15s_) + +The encouragement here is to keep using the project team as a +crucible. Rather than following the defaults of, um, finding the +simplest customizations that generally work, what if we tried to look +for fairly specific configuration that we'll expect basically all of +our developers to be using, at least when the submit bug +reports. (_8m48s_) + +In particular with this, I think that degree of experimentation can +drive back into the Emacs development process. In the development +mailing list.. [] In the context of Emacs development as a greater +entity, we see this struggle. We have the sense that some things can +"never" be change. I think one thing that can help us get there is +evidence that says "hey, my 30-40 person team is using this set of +bindings and here is what we learned about new Emacs users coming in +and trying that". (10m) + +So let's just recap real quick: in theory Emacs works out of the +box. That means we are free to throw it all away and start over. +[trouble with slides, again] + +Our goal is to enable users- to unlock our computers, to do as much +with them as possible. My work of encouragement is experiment with it. +And think really specifically about how the development users may be +different from each other, as you are configuring the development +environment of emacs for developing on a project. + +That's my talk, etc, answer any questions.(_12m09s_) + +Do you use Emacs as a Community Building Tool? (_13m15s_) + +Do /i/ use Emacs a community building tool? Or *how* do I use Emacs as a +community building tool. [amin: "it doesn't say"] + +Yes, absolutely. I think Emacs is an ambassador to the gnu +tool-chain. in the fullness of time we will see an Emacs that will +make others, Android and iOS, dream. That's why that mock us and say +that Emacs is an operating system. It's because it could be, if cared +for it to be. It's quite a threatening product in terms of the number +of problem spaces it can address, how many types of users it can +satisfy. (_13m01s_) + +And the things that we can do to make it robust in those environments. +We're always thinking about the weak points but is Emacs a community +building tool? Heck yeah. (_13m13s_) + +[we agree that I'll write my answers to the remaining questions, I say +thanks more, and we're done. ps, I'll get to your question or +comments I can find a response to within the next week, I expect] diff --git a/2020/info/08.md b/2020/info/08.md index 17769bd3..5494a68e 100644 --- a/2020/info/08.md +++ b/2020/info/08.md @@ -1,8 +1,9 @@ # Building reproducible Emacs Andrew Tropin -[[!template id=vid src="https://mirror.csclub.uwaterloo.ca/emacsconf/2020/emacsconf-2020--08-building-reproducible-emacs--andrew-tropin.webm"]] -[Download compressed .webm video (18.4M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--08-building-reproducible-emacs--andrew-tropin--vp9-q56-video-original-audio.webm) +[[!template id=vid src="https://mirror.csclub.uwaterloo.ca/emacsconf/2020/emacsconf-2020--08-building-reproducible-emacs--andrew-tropin.webm" subtitles="/2020/subtitles/emacsconf-2020--08-building-reproducible-emacs--andrew-tropin.vtt"]] +[Download compressed .webm video (18.4M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--08-building-reproducible-emacs--andrew-tropin--vp9-q56-video-original-audio.webm) +[View transcript](#transcript) It's not always easy to take part of someone's configuration and make it work, it's almost never easy to move your configuration to fresh OS @@ -57,3 +58,373 @@ Currently trying it, and also in-process of switching from Nix to Guix. - Reproducible development environment: <https://github.com/abcdw/rde> - Using Org-roam to demo how to config a Nix layer(?) - custom.el conflicts with Nix(?) + +<a name="transcript"></a> +# Transcript + +00:00:00.000 --> 00:00:24.056 +Hello, everyone. I am Andrew Tropin. I +am a professional software engineer I +was playing with NixOS It's an operating +system based on the Nix package manager. +I came up with this interesting approach +for configuring Emacs. I want to share +it with you. + +00:00:24.056 --> 00:01:31.389 +I will start with the bold statement +that Emacs configuration is almost the +same as system configuration. It's not +related to that Emacs joke about Emacs +being an operating system. It's more +about Emacs being integrated with so +many tools inside the environment. For +example, if you don't even use any fancy +workflows, you use only plain Emacs +without any configuration, dired uses +ls, grep.el uses grep, and info files +placed somewhere in your system. Also +Emacs can interact with gpg, git, make, +and other stuff. When you grow your +Emacs Lisp init.el file or other files +in your .emacs.d directory, you get much +more integration with underlying +operating system. + +00:01:31.389 --> 00:02:08.622 +The question is: how to manage such +configuration? Because you can't just +take a bunch of .el files and move to a +different machine and be sure that +everything will work. Because you didn't +move your executables. You didn't move +configuration of other programs. You +didn't move your service configurations. +And you can't even just create dotfiles +for each program and move it with your +.el files. The approach would be a +little broader. + +00:02:08.622 --> 00:02:23.722 +Everything that I am showing today is +available on Github. Any source code, +you can find here. but my copy of the +repository is on my local machine. + +00:02:23.722 --> 00:03:45.889 +As you can see, the font is a little +small. And also, my terminal font is +also a little small. I can do a quick +fix and increase the font. But imagine +how cool it will be if you can have a +file which contains the configuration +for a system. You change some value. +Here, for example, fontSize = 16 and run +some command and based on this file and +some other includes your operating +system is built and all your environment +is set up and ready for use. For example +here, we already built the new operating +system, and everything is already +installed in my SSD. Now I can run the +program and you can see that my alacrity +terminal has much bigger font and also +if I restart my Emacs instance it by +default uses a much bigger font for any +buffer. Practical, and as you can see, +it's already working, thanks to Nix and +NixOS. + +00:03:45.889 --> 00:04:44.556 +I will explain a little later how it +works inside, but for now, let's specify +a little more what happened right now. I +fed my... Oh. It doesn't work. Sorry. I +want... I have my whole operating system +defined in a few Nix files. For example, +here you saw the file which defines some +variables for my environment and then a +few more files for different programs. +There is a folder which contains all +Emacs-related configuration. Also, there +are package definitions defined in Nix +package repositories which is also +included for the function which +generates the operating system. + +00:04:44.556 --> 00:05:11.689 +Getting all my configurations written in +Nix language and a few firewalls in ?? +languages, everything is gathered +together, and from that input and only +from that input, the new operating +system is built. Emacs now is a part of +this operating system. I can distribute +this Emacs configuration with all the +environment that I want. + +00:05:11.689 --> 00:05:50.789 +Practical so far. Let's clarify which +problems does it solve. First of all, +the integration problem. For example, a +few minutes ago, you saw that I changed +one variable. That was to update... The +first one, for my terminal, and the +second one, for my Emacs. It's pretty +good that a few different programs can +share some data. For example, you can +have one of them for every application, +or something like that and you change +only one value in one place and the +whole operating system is updated. + +00:05:50.789 --> 00:06:20.856 +Also, another problem is +reproducibility. For example, when you +install your new instance of Emacs on +your laptop or something like that, you +can be sure that you will get the same +package versions and you can be sure +that the configuration of your work +results in newly-updated or +newly-installed packages. + +00:06:20.856 --> 00:06:43.256 +Also, if you update packages, sometimes +it's hard to revert, because it's the +way your package manager almost every +time works. You're just getting the +latest available packages. If they are +broken, you need to wait for the +maintainer to update them. + +00:06:43.256 --> 00:07:39.656 +And also, your basic configuration +almost always doesn't contain any native +dependencies, like executables or +something else. Recently, I saw some +attempts to make it possible to use +use-package for those needs, like +ensuring native dependencies or +something like that. It's obviously... +If your configuration isn't reproducible +and it doesn't have your whole +environment, placed in one repository, +it's very hard to share such +configuration. You can share part of +your configuration and some instruction +how to get a similar environment, but it +doesn't always work. Let's go closer to +actually Emacs configuration itself. + +00:07:39.656 --> 00:08:10.839 +I had some experience with Spacemacs and +Doom Emacs distributions. I also watched +a lot of videos and articles by +Protesilaos and a lot of other custom +configurations of many different cool +people. And also I was inspired by +use-package and decided that I will +create a folding structure for my Emacs +configuration. + +00:08:10.839 --> 00:09:01.306 +I will be using subconfigs. It's almost +the same as layers in Spacemacs, or +modules in Doom Emacs, which are +self-contained. They contain Emacs Lisp +code which configures all packages +necessary for this part of +configuration. It contains all Emacs +dependencies like Emacs packages. It +contains all native dependencies like +binaries or maybe info pages or +something like that. It also contains +variables that can be shared between +Emacs and other applications, and it can +contain service or system definitions +which configure your systemd service or +something like that that you use in your +workflow. For example, for synchronizing +your e-mails. + +00:09:01.306 --> 00:10:06.922 +Let's start from just the example that I +already am... I have a folding structure +for my configuration. I have some files +here. early-init just has this. Nothing +changes. It will be copied to that +.emacs.d directory later with some +exceptions that it will replace the Nix +dir and a symlink will be created to it. +I have use-package-init.el. It's part of +configuration that will be on top of +everything to be able to use use-package +in my subconfigurations. And actually +some Nix code to glue everything up and +config dirs which contain all my +subconfigs. + +00:10:06.922 --> 00:11:10.105 +Let's start from faces subconfig. Let's +start from config.el which can be +familiar for many people. Just +use-package definition for faces package +and some configuration for it which are +setting some attributes. It reads some +variables. Those variables are actually +defined in a different place. If I open +default.nix file, you can see that it +contains the definition or subconfig, +and it should contain a definition of +variables that it uses by... I forgot to +move it from my original default.nix +file somewhere here. You probably can +find definition of those variables just +right here. + +00:11:10.105 --> 00:11:38.422 +I took values from my Nix expressions. +Those values will be shared across my +alacrity, Emacs, and other applications. +Later, they will be placed in generated +Emacs configuration. They will be +available for faces config. Here I will +be referencing them just like Emacs +variables. + +00:11:38.422 --> 00:12:39.222 +Let's take a look at another more +complicated example. For example, +org-roam package. Just a basic +use-package configuration which uses a +variable and the definition. It's a +little more complex than the previous +one. Elisp configuration in the same +file. emacsPackages specified here. +Those two packages: org-roam and +company-org-roam. systemPackages: it's +something that should be available on +your host operating system. And for +emacsPackages, you need sqlite package, +and also the definition of the variable +which will be passed in my Emacs +configuration later. It's equal to my +workDir, which is defined in my +environment, and a subdirectory of it. + +00:12:39.222 --> 00:12:43.222 +([Amin:] Andrew, you have about five +minutes including questions.) + +00:12:43.222 --> 00:13:26.222 +Oh, okay. I'm almost finished. It was +last example. Let me open my Org file. +Okay. Right here. I won't give you an +introduction to Nix itself and the +underlying mechanism, but I can say that +there's already a proof of concept +framework for utilizing Nix and NixOS +for configuring Emacs and making a very +complex workflow reproducible on other +machines. It gives everything that we +saw right now. + +00:13:26.222 --> 00:14:05.389 +For the future work, I plan to +reimplement it in Guile, which is a +Scheme dialect, which is another Lisp +language, for the GNU Guix operating +system, because I like Lisp languages a +little more than Nix languages and I +want to make this project from proof of +concept to some state which will be +user-friendly and available for other +people. If I will have a lot of time, I +will make an operating system which will +be inspired by Lisp machines to make the +whole experience very Lispy. + +00:14:05.389 --> 00:14:22.622 +Thank you for your attention and now I +will answer questions. Oh. There is a +lot of... Okay. I see some questions. + +00:14:22.622 --> 00:14:29.222 +Did you release some config files such +as Emacs custom.el, some of which have +sensitive data? + +00:14:29.222 --> 00:14:59.456 +Ideally, in the folding way, I create a +separate directory called +local/share/emacs, and I place custom el +files here. It's not synchronized in any +way, and it will be just lost in case +you move to a separate machine. I do it +for a purpose, because I don't use +custom.el. It's hard to make it +reproducible if you're using such +mechanism as custom.el. + +00:14:59.456 --> 00:15:06.656 +How do you learn the Nix language +basics? Just from the manual? + +00:15:06.656 --> 00:15:32.989 +I read a lot of documentation. Also, I +saw the course like Learn Nix in 15 +minutes. And also there was another +resource. Better to ask this question in +Nix or NixOS channel in IRC, which will +be treated in more details. + +00:15:32.989 --> 00:15:38.909 +What are the main advantages besides +switching computers, which most people +rarely do? + +00:15:38.909 --> 00:16:10.556 +For example, the original idea was to +make part of configurations available +for projects. For example, you have some +project, you made the setup, and want +other developers to use the same setup +on their machine, but you implement only +the part of stuff, like one subconfig +especially for this language for this +project. With such approach, you can +easily share such subconfig with other +people. + +00:16:10.556 --> 00:16:15.239 +Have you tried Guix in place of Nix? + +00:16:15.239 --> 00:16:41.239 +Yes, I tried it, and currently I am in +the state of switching from Nix to Guix. +You can follow my Youtube channel, I +think, I do streams twice in a month +talking about reproducibility and +related stuff. Probably soon I will be +talking about installation of Guix and +configuration of it. + +00:16:41.239 --> 00:16:50.406 +In case you're watching this video +later, you can find me somewhere on the +network using those contacts. It's my +nickname and my e-mail address. + +00:16:54.072 --> 00:17:04.622 +([Amin:] Awesome. I think we're wrapping +up just on time. Thank you so much, +Andrew, for your great talk, and for +hanging out to answer the questions +live.) + +00:17:04.622 --> 00:17:18.000 +[Andrew:] Thank you for organizing the +conference and thank you all +participants for questions and +participation. See you soon! diff --git a/2020/info/09.md b/2020/info/09.md index fbefd155..90d9f731 100644 --- a/2020/info/09.md +++ b/2020/info/09.md @@ -2,7 +2,8 @@ Rainer König [[!template id=vid src="https://mirror.csclub.uwaterloo.ca/emacsconf/2020/emacsconf-2020--09-orgmode-your-life-in-plain-text--rainer-koenig.webm" subtitles="/2020/subtitles/https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--09-orgmode-your-life-in-plain-text--rainer-koenig.vtt"]] -[Download compressed .webm video (12M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--09-orgmode-your-life-in-plain-text--rainer-koenig--vp9-q56-video-original-audio.webm) +[Download compressed .webm video (12M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--09-orgmode-your-life-in-plain-text--rainer-koenig--vp9-q56-video-original-audio.webm) +[View transcript](#transcript) [[!template id=vid src="https://mirror.csclub.uwaterloo.ca/emacsconf/2020/emacsconf-2020--09-orgmode-your-life-in-plain-text--questions--rainer-konig.webm" download="Download Q&A video, 720p"]] [Download compressed Q&A .webm video (5.8M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--09-orgmode-your-life-in-plain-text--questions--rainer-konig--vp9-q56-video-original-audio.webm) @@ -137,3 +138,147 @@ which helps me to identify the tasks I procrastinate. ;-) customized setup. It's rather out-of-the-box only. - Org-mode tutorial YouTube playlist: <https://www.youtube.com/playlist?list=PLVtKhBrRV_ZkPnBtt_TD1Cs9PJlU0IIdE> + +<a name="transcript"></a> +# Transcript + +00:00:02.480 --> 00:00:22.560 +Hi there, this is Rainer. I have a +10-minute time slot at the EmacsConf and +I will show you a quick walk through my +GTD system in Org mode, so let's start +with capturing. We want to capture what +we do here. + +00:00:22.560 --> 00:01:03.600 +So the idea is I press F6 and I say: "I +want to make a small project because +this video will be a small project," so +the thing is: "Record a video for Emacs +Conf 2020." Video is recorded, edited, +and uploaded. We can also set the +timeline because we want to upload it. +The time, the deadline for uploads +is--we know it already--the 14th of +November. so let me put this in here. +See, this is done. + +00:01:03.600 --> 00:01:40.400 +Now, because it's a project... I mean, I +could say just one task to record a +video, but it's too much, so let's split +it down in a few small tasks. The next +one... + +00:01:40.400 --> 00:02:18.560 +So you see, I've just typed a few quick +tasks. We can see them if we look in the +capture file. You see, there's my +project entry and there are all my +tasks. Since it's a project, I can now +make it easy. I just indent every task +by one and then, so... + +00:02:18.560 --> 00:02:45.599 +Okay, so you see we have one project +here, and this one we refile now to our +backlog. So if we look in our backlog, +you see my project with all the tasks. + +00:02:45.599 --> 00:03:30.879 +So now, next one. I pretend now I'm +doing a weekly review. C-c x b. And I +already did some things, and now the +point where I am is scheduled tasks with +no date. Those are all those tasks. So I +have a weekly review helper that says, +okay, show me everything that I need to +schedule, plan. So schedule this class. +We do everything. + +00:03:30.879 --> 00:04:03.200 +So everything is scheduled now, and we +can check off that and so on. We can... +I have a plan for every day. That's my +free plan. I press F6, and I say p p +plan. Private things. You see there is +the first day, 12th of November, German. +And now I can look at what I have to do +today. + +00:04:04.239 --> 00:04:37.680 +My agenda view is very long, and I just +want to focus on a few tasks, so I +copied them to my daily plan. I just +want to show you. So I have a daily plan +for every day, and that means this one +is what I see, and this one is gone. + +00:04:37.680 --> 00:05:15.605 +So now, let's pretend we are working on +the first: we find the requirements for +the video. We had a look. Okay, I can +mark this task as done here because I +knew the requirements. C-c t. Done. +Format is 720p, webm codec. So this one +is done and I can mark it off here as +well. So now I have marked it off +everywhere. + +00:05:15.605 --> 00:05:24.639 +The good thing of my daily plan is that +I can really see it all the day. I stick +to this, what I decided in the morning +what I want to do. + +00:05:24.639 --> 00:05:58.319 +So let's go to the next one. Make a +quick test. Yeah, I did the test +already. I will do a small trick. I say, +okay, I record the video here. Video +recorded. Then let me do what to show. +Now I'm recording the video. + +00:05:58.319 --> 00:07:02.560 +Let's see. What we do: we had capture, +we had weekly review, we had daily +planning. How are we processing this? +Very nice. So let's pretend the video is +recorded C-c t done. Let me put this to +NEXT again. Start kdenlive to time +lapse. After recording it, I pretend +this is done now. C-c t done. Then I +have a video ready. Let's pretend I did +the upload as well. Done. Video +uploaded. So I can say everything now is +done. Save it, so tomorrow I see what I +did yesterday. Here I'm completely done. + +00:07:02.560 --> 00:07:40.455 +We have the weekly review. We put +another buffer here because I want to +show you the final step of my weekly +review. If you see, there's a final step +that says: select finished tasks and +make a bulk archive action. So if you +look at my EmacsConf thing, okay, the +project is done as well. Project C-c t +done. And then, what I can do is now see +a weekly review helper. Finished tasks. + +00:07:40.455 --> 00:08:00.320 +I could make a bulk operation that says +archive everything, but at the moment I +don't need to do that because we have a +tree structure, so it's C-c x a I have +this task away, and the task is done. So +that's it. + +00:08:00.320 --> 00:08:21.959 +That's my system you see: from capturing +tasks, to scheduling tasks, to putting +it on the daily plan, performing it, and +at the end, when everything is done, the +next weekly review they will go to the +archive file, because it's finished. +Thank you for watching. That's it. diff --git a/2020/info/10.md b/2020/info/10.md index c2728cb8..40bf9516 100644 --- a/2020/info/10.md +++ b/2020/info/10.md @@ -2,7 +2,8 @@ Andrea [[!template id=vid src="https://mirror.csclub.uwaterloo.ca/emacsconf/2020/emacsconf-2020--10-lead-your-future-with-org--andrea.webm" subtitles="/2020/subtitles/emacsconf-2020--10-lead-your-future-with-org--andrea.vtt"]] -[Download compressed .webm video (10.5M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--10-lead-your-future-with-org--andrea--vp9-q56-video-original-audio.webm) +[Download compressed .webm video (10.5M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--10-lead-your-future-with-org--andrea--vp9-q56-video-original-audio.webm) +[View transcript](#transcript) The world is full of possibilities. A person life is rather short though, and one can easily end up carry on without focus. @@ -39,6 +40,100 @@ in. And programming in OCaml was so nice in there :) - Blog: <https://ag91.github.io> - <https://ag91.github.io/blog/2020/09/27/org-agenda-and-your-future-or-how-to-keep-score-of-your-long-term-goals-with-org-mode/> +<a name="transcript"></a> # Transcript -Welcome to my talk, Lead Your Future with Org. Who am I? I'm Andrea. I work as a Scala software engineer somewhere in the Netherlands, and I inherited my passion for Emacs from my PhD supervisor. From that moment on, I got in synergy with it. You can find more about me and my interests at https://ag91.github.io. That is the place where I keep my blog and I blog on a weekly basis. Let's get into the bulk of the talk. Why I needed a vision. The main, main problem is that I have too many interests. I like a lot of things, and these things take time. Then I have too little time to do other things that are very important as well. And so I need priority. And the vision in my mind is both an ambition, something that I want to do with my life, and at the same time, it's a way to focus my efforts and get rid of some stuff that fundamentally is not something I really care so much about. Even if you come up with a vision and so with a smaller scope of things that you want to do, even then, you have to take this ambition of yours, this vision, and disassemble it in very small steps. Org Mode is very good at taking care of this because you can keep track of TODOs in Org Mode. So let me show you how I keep an agenda that also keeps track of my vision. For this talk, I have a running example. Vision will be "I want to bring joy to people." and "I want to live in synergy with the planet." Okay, so, given these two visions, let's open the agenda. You will see on the right that now I have some tasks, both on Tuesday and on Friday. Things to notice is that we said one of our visions is synergy with the planet, so some tasks are annotated on the left with this category and some with "Bring joy to people." In this way, you can distinguish where are my... In this day, where my effort is going in this day. The other thing is the specification of these tasks, and then at the end, you can notice a tag on the right that is essentially a guess of how long this task will have an effect over the future. So, for example, installing solar panel onto my roof is going to have an effect of 10 years over my life, if I manage to achieve that. That is my rough guess. You will notice that the ones that have a bigger amount, so 10 years over the 5 year one, because I order my day so that the tasks that are more important or that I believe are more effective over my future, I sort them so that they appear at the top. In this way, I can basically decide, okay, today, what should I... Find a video on Youtube, but I should take into consideration when I look at my agenda that I've traded that small fun for today with something that could have had an effect over a longer period of time. Let me show you how I also exploit the facilities that Org Mode comes with. I will... I have two templates available to me. I will choose one. The first thing that it asks to me is "How long will this affect your life?" So I like ... It will affect a long time, if I manage to produce only for myself. So I choose 10 years. And then I specify the task. So, "Learn how to keep bees." I collect this task. It will now appear in the middle because 10 years is between 20 years and 5 years. So I know that if I put some effort in learning how to keep bees, I should be quite happy for today. Okay. So, say that I do it, say that that's it... Once I've done this task, how can I be... How do I know how much progress I am doing? The way I can do that is by retrospecting weekly or monthly about the successes or the progress that I am doing. How I do it is simply by running this kind of snippet that shows me that for this month, I have done three tasks for bringing joy to people and three tasks for synergy with planet. This is useful because you can repeat it and it will be appended, so every time you run it again, you can compare if you are... how you are working towards your goal and if you're focusing more on bringing joy to people or if you're focusing more on synergy. Balance the effort. A thing that I want to share that I think will be useful to you is this function I use that I made for myself to create these statistics. It's a wrapper around the very enjoyable library org-ql, which allows you to query and group headings, do analysis on headings, or restructuring and view headings in a SQL fashion. The syntax is very similar to SQL. You can manipulate your headings and visualize them or just get statistics as I have done here. Finally, for this talk, say that you are doing progress, that progress most likely will generate some useful knowledge for yourself. My way to store this knowledge is through org-roam, another interesting mode that is very... that is becoming very relevant and known today. The idea is that I simply... If I learn how to make, how to install solar panels, that can be useful knowledge. I can link to some other knowledge that I have and so create my own knowledgebase, and save it for later use. My later use is typically, in this case, my blog. In here, I have a few notes that are basically a synthesis of knowledge that I have collected doing my tasks towards my vision. With this, this is all I wanted to show you for this talk. You can follow me on my blog at https://ag91.github.io . That is also where I am going to share a version of this Org Mode file that allows you basically to create the same kind of configuration I have here, and you can create an instance by running this snippet of Emacs in which you can just run this example. An extended example I will also add, to just play around safely with this kind of configuration. So enjoy the rest of the conference. Catch you later! Nice to meet you! +Welcome to my talk, Lead Your Future with Org. Who am I? I'm Andrea. I +work as a Scala software engineer somewhere in the Netherlands, and I +inherited my passion for Emacs from my PhD supervisor. From that +moment on, I got in synergy with it. You can find more about me and my +interests at https://ag91.github.io. That is the place where I keep my +blog and I blog on a weekly basis. Let's get into the bulk of the +talk. + +Why I needed a vision. The main, main problem is that I have too many +interests. I like a lot of things, and these things take time. Then I +have too little time to do other things that are very important as +well. And so I need priority. And the vision in my mind is both an +ambition, something that I want to do with my life, and at the same +time, it's a way to focus my efforts and get rid of some stuff that +fundamentally is not something I really care so much about. Even if +you come up with a vision and so with a smaller scope of things that +you want to do, even then, you have to take this ambition of yours, +this vision, and disassemble it in very small steps. Org Mode is very +good at taking care of this because you can keep track of TODOs in Org +Mode. + +So let me show you how I keep an agenda that also keeps track of my +vision. For this talk, I have a running example. Vision will be "I +want to bring joy to people." and "I want to live in synergy with the +planet." Okay, so, given these two visions, let's open the agenda. You +will see on the right that now I have some tasks, both on Tuesday and +on Friday. Things to notice is that we said one of our visions is +synergy with the planet, so some tasks are annotated on the left with +this category and some with "Bring joy to people." In this way, you +can distinguish where are my... In this day, where my effort is going +in this day. + +The other thing is the specification of these tasks, and then at the +end, you can notice a tag on the right that is essentially a guess of +how long this task will have an effect over the future. So, for +example, installing solar panel onto my roof is going to have an +effect of 10 years over my life, if I manage to achieve that. That is +my rough guess. You will notice that the ones that have a bigger +amount, so 10 years over the 5 year one, because I order my day so +that the tasks that are more important or that I believe are more +effective over my future, I sort them so that they appear at the top. +In this way, I can basically decide, okay, today, what should I... +Find a video on Youtube, but I should take into consideration when I +look at my agenda that I've traded that small fun for today with +something that could have had an effect over a longer period of time. + +Let me show you how I also exploit the facilities that Org Mode comes +with. I will... I have two templates available to me. I will choose +one. The first thing that it asks to me is "How long will this affect +your life?" So I like ... It will affect a long time, if I manage to +produce only for myself. So I choose 10 years. And then I specify the +task. So, "Learn how to keep bees." I collect this task. It will now +appear in the middle because 10 years is between 20 years and 5 years. +So I know that if I put some effort in learning how to keep bees, I +should be quite happy for today. Okay. So, say that I do it, say that +that's it... Once I've done this task, how can I be... + +How do I know how much progress I am doing? The way I can do that is +by retrospecting weekly or monthly about the successes or the progress +that I am doing. How I do it is simply by running this kind of snippet +that shows me that for this month, I have done three tasks for +bringing joy to people and three tasks for synergy with planet. This +is useful because you can repeat it and it will be appended, so every +time you run it again, you can compare if you are... how you are +working towards your goal and if you're focusing more on bringing joy +to people or if you're focusing more on synergy. Balance the effort. + +A thing that I want to share that I think will be useful to you is +this function I use that I made for myself to create these statistics. +It's a wrapper around the very enjoyable library org-ql, which allows +you to query and group headings, do analysis on headings, or +restructuring and view headings in a SQL fashion. The syntax is very +similar to SQL. You can manipulate your headings and visualize them or +just get statistics as I have done here. + +Finally, for this talk, say that you are doing progress, that progress +most likely will generate some useful knowledge for yourself. My way +to store this knowledge is through org-roam, another interesting mode +that is very... that is becoming very relevant and known today. The +idea is that I simply... If I learn how to make, how to install solar +panels, that can be useful knowledge. I can link to some other +knowledge that I have and so create my own knowledgebase, and save it +for later use. My later use is typically, in this case, my blog. In +here, I have a few notes that are basically a synthesis of knowledge +that I have collected doing my tasks towards my vision. + +With this, this is all I wanted to show you for this talk. You can +follow me on my blog at https://ag91.github.io . That is also where I +am going to share a version of this Org Mode file that allows you +basically to create the same kind of configuration I have here, and +you can create an instance by running this snippet of Emacs in which +you can just run this example. An extended example I will also add, to +just play around safely with this kind of configuration. So enjoy the +rest of the conference. Catch you later! Nice to meet you! diff --git a/2020/info/11.md b/2020/info/11.md index b04683b4..709efcf7 100644 --- a/2020/info/11.md +++ b/2020/info/11.md @@ -2,7 +2,8 @@ Aldric [[!template id=vid src="https://mirror.csclub.uwaterloo.ca/emacsconf/2020/emacsconf-2020--11-the-org-gtd-package-opinions-about-getting-things-done--aldric.webm" subtitles="/2020/subtitles/emacsconf-2020--11-the-org-gtd-package-opinions-about-getting-things-done--aldric.vtt"]] -[Download compressed .webm video (19MB)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--11-the-org-gtd-package-opinions-about-getting-things-done--aldric--vp9-q56-video-original-audio.webm) +[Download compressed .webm video (19MB)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--11-the-org-gtd-package-opinions-about-getting-things-done--aldric--vp9-q56-video-original-audio.webm) +[View transcript](#transcript) Come see how org-gtd leverages org-mode to automate the GTD inbox management. Stick around to see how the various org-mode tools get @@ -83,3 +84,374 @@ etc. - I'm using org-edna as well and I want to point others to <https://github.com/toshism/org-linker-edna> which is an enormous help when working with edna. + +<a name="transcript"></a> +# Transcript + +00:00:01.680 --> 00:00:29.199 +Hello, and welcome to my Org GTD talk. I +wrote this package because I was +overwhelmed with all the stuff I had to +manage working at home. I'd heard about +GTD. I saw someone using it with just a +small notebook. I wanted to do it in +Emacs because, well, Emacs can do +everything, right? + +00:00:29.199 --> 00:01:12.640 +I'm going to jump in quickly. Just so +you know, here's kind of a list of the +resources. Obviously, org-gtd, which you +can find there. You can open an issue, +ask me questions there about it. I use +org-edna, a package for state triggers. +I'm going to show this briefly when I +finish item in a project. +org-agenda-property, you will see in the +agenda. It's going to show to whom an +action has been delegated to. You will +see org-roam briefly as a reference +because that is what I have chosen for +my knowledge archival tool. You can +choose whatever you prefer. + +00:01:12.640 --> 00:01:57.520 +This is a quick, quick reminder on what +GTD is and how it works. This is not a +lesson on--a presentation on gtd because +that would be... Well, other people have +done it better than me. In short, +everything goes into the inbox. Then you +process the inbox, and you decide what +to do, if it could be actionable or not. +If it's actionable, it could be a +project or it could be a single action, +which you could delegate or schedule or +just do it. If it's not actionable, you +could just throw it away, incubate it +for later, or move it into your files, +reference. + +00:01:57.520 --> 00:02:27.200 +Over here, you can see the global +bindings for org-gtd. Those are the +actions, the functions I have made +available. This is in progress. There's +more to come. Some stuff is probably +missing. It's grown mostly from my own +personal use so far, so it doesn't have +things. In the bottom right, you can see +the agenda. + +00:02:27.200 --> 00:02:54.319 +One thing I wanted to do with this +package was leverage Org Mode as much as +possible. So I tried to not reinvent the +wheel as much as I could. That meant +reusing the agenda. You can see here a +couple of the things that are made +available or kind of customized or +configured for you, some of the opinions +that org-gtd has. + +00:02:54.319 --> 00:03:49.280 +Up here, for instance, you can see a +delegated action. So a delegated action +has someone to whom it's delegated. It's +my parents in this case. It has the name +of the action: ask parents what gift +they want. It's marked as the state of +WAIT because I'm waiting. It is +scheduled because you should ping people +or check on the status status of a task +when you're waiting for it, so you don't +forget about it or it gets lost forever. +I have a scheduled action to give a +talk. That's what I'm doing right now. I +have an incubated action which is also +scheduled: to make money through the +lottery. This is a thing to take a look +at for later, decide later what I want +to do. It might be actionable, it might +not be. I don't know right now, or I +didn't know when I processed it, so I +incubated it. + +00:03:49.280 --> 00:03:59.360 +Underneath, we have all the things that +are direct actions for me to take. + +00:03:59.360 --> 00:04:33.384 +All right. You see a little bit of the +preparation seeps through the actual +talk. I have here two... I have a single +action of "Steal Andrea's GTD +configuration" and an action to read the +GTD book. It's part of a project. So +most of the day-to-day operation with +with this package should come through +just having the agenda open and having +it be your source for the information +you need to know, so that you can do the +right thing. + +00:04:33.384 --> 00:05:18.960 +So let's take a look at what's +underneath all of this really quickly. +We have--There's three primary files. We +have the inbox. I'm gonna process it in +a second because there's two things +here. One thing to cancel, like an +action to not take. It's nothing. And +then something I will just put into +org-roam, just so you can see that there +is the incubate file. You can see here: +make money through the lottery, +captured, refiled here, and scheduled so +it would show up in the agenda right at +a given time. On the right, you have the +actionable file. This is the one that +has the most information, where most +things should go. + +00:05:18.960 --> 00:05:37.919 +So I have the single actions. They all +go underneath here. This is marked as +next because it's an action for me to +take. Delegated is marked as WAIT. It is +not an action for me to take. It's an +action for somebody else to take, but it +is scheduled because I may wanna... I +can check in at some point. + +00:05:38.400 --> 00:05:53.840 +Things that are scheduled, like "give a +talk," do not have a TODO or NEXT or +WAIT state because they are not bound +that way. They are time-bound, so they +will show up in the agenda when the time +comes. I shouldn't act on them or I +can't act on them beforehand. + +00:05:53.840 --> 00:06:07.520 +You can see here, I have two projects: a +test project (and I will do something +with this in a second) and then there's +this package "Make a GTD package." +There's a project here for me to create +this. It's made of a bunch of actions. + +00:06:07.520 --> 00:07:03.840 +I'm going to show you two things here. +One is: since I was trying to leverage +Org Mode as much as possible, I didn't +try to create very clever operations, +because Org Mode has a lot of very +powerful tools already. There's +automations I can add, but I thought it +might be better to leave more things in +the hands of the user. So here, in this +case, this test project we can just +archive. Right. That's just C-c C-x C-a +is the org-archive action. Save this. So +now if we go to... This will create an +archive file which will have this +information for later perusal if you're +interested. + +00:07:03.840 --> 00:07:27.680 +That's one thing. If we go back to the +agenda for a second, you can see these +things here. Org. So by the way, this +"parents" here was the org agenda +property. This is what shows here, +right? And here, if I finish "Read the +GTD book," I mark it as done. Now +refresh. + +00:07:27.680 --> 00:07:57.280 +You'll see that another item shows up, +and that is where org-edna comes in. +When an action is marked as done in a +project, the next to do action is +automatically marked as next, so your +agenda is automatically updated. This +was one of the nice things for me +because I didn't want to have to open my +file, go find the action, mark it as +done, find the next one, mark it as +next, and so forth. I didn't want to +bother with it. + +00:07:57.280 --> 00:08:20.720 +Oh, actually, you know what, let me show +you something else. This simple +project... I don't need this timestamp +to be here but I like having a capture +timestamp here, so I'm gonna make one +up. So this is the most convenient thing +that I think... This is one of the most +convenient things that I get out of this +binding. + +00:08:20.720 --> 00:09:00.080 +The next really convenient thing is the +way this gets processed. Let me show you +this. When you process the entire inbox, +what you see is the items one at a time, +so you can work with them. You can see +at the bottom... You can work with them +without being distracted. You can see at +the bottom the list of things you can +do, which are all the decisions you can +take from GTD, right? In this case, this +is one to throw out, so press t. You +have the option to make modifications to +this if you want to. If you have any +reason to store it, then you finish +editing. You can add a tag if you want +to, because this might still be +interesting, + +00:09:00.080 --> 00:09:37.457 +and then enter and it's done. Important +knowledge, I'm going to hit a for +archive it. I'm gonna start looking at +org-roam. So this is important +knowledge. I have to capture this. +That's it. I've captured it. It is done. +I go back to buffer, and I can mark it +with C-c. There's no archiving because +this is just knowledge. There's no +tagging. It's just knowledge. + +00:09:37.457 --> 00:10:15.440 +But then the simple project... I want to +show you this because there's some +automation that's pretty helpful. In the +simple project, I have my first action, +second action, third action. and you +see, this is all I'm writing. I'm not +adding any of the states, any of the +tags. They're going to be added by... +Here, I can add a tag if I want to this +project. I don't care right now, but you +know... I leave the tags to the user, so +they're not super relevant to me as a +package provider. + +00:10:15.440 --> 00:11:04.880 +This is where we are. This is the whole +thing. So now if we go back to the +agenda, I have a first action, right. +And if I go to the actionable file, and +now see, I have a simple project that +has my first action as NEXT, second +option TODO, third action as TODO. So +what I've... You know, as you can see... +I hope what I've tried to do is take all +of the tedium out of working with with +Emacs and Org Mode when working with +your actions so you could focus on what +you want to do, what you need to do, +what you care about, and the package +would take care of the rest. + +00:11:04.880 --> 00:12:32.000 +So the last thing I wanted to take a +quick look at was some of the the tests. +The code is available here. You can see +the code on... the code on Github if you +want. I've had some trouble writing good +tests for this because Org Mode was +written at a time before testing was +quite as important, I think, or valued +quite the same way, let's put it this +way. And as a result, a number of things +actually... It might also be a feature +of Emacs at the time, I don't know. But +a lot of things in Org Mode aren't very +testable, and so what I ended up doing +was just having an actual directory in +which I actually... with files, right? +So I don't have much mocking I can do. I +can't just do a bunch of fake files, +fake directories. So I actually go +through the process, actually create +files, and then actually have Emacs +pointing at this directory to process +and get the information. So I have to +define the key to test that it gets +bound properly. I have to set the +capture templates. The capture templates +are how things get added. I have a +wrapper control... org-gtd-capture +essentially is a wrapper around the +capture that makes sure the inbox is +there and then captures to the inbox. + +00:12:36.240 --> 00:13:45.360 +Making sure the items show in the agenda +when I'm done with the processing was a +little bit tricky. I had a bug and I had +to to fix it, so I just wrote this test, +but it's it's pretty convenient now to +have that, because it gives me a bunch +of sanity. So again, I have a capture, +and this is... I wanted to be able to do +this automatically but org-capture +itself is not super testable right now, +so the way it's... the way you test it +is just by programmatically calling it, +which is not exactly what I wanted, +because I wanted something more like the +user action, but I'll... You know, what +I can get. And then I can... I'll just +insert these words into the buffer and +then I'll finalize the capture. Then I +have another... I have a test package +here called with simulated input which +basically calls this and then enters +these user actions. Right, so like the +letter s, C-c c and then RET. And that +is, you know, choosing a single action, +then finishing the edit, and then adding +zero and not adding tags. + +00:13:46.480 --> 00:14:05.040 +As you can tell, there's a strong layer +of disconnect between the tests and what +they represent. That's a work in +progress. I have four tests. It's not a +lot, but I want to... I intend to add +more as I keep on adding more behavior. + +00:14:05.040 --> 00:14:34.880 +I would like this to be eventually a +sane starting point for GTD. There's a +lot of people like like Andrea, like +Rainer, like... I mean, if you search +for Org Mode and GTD, you'll find a lot +of blog entries, a lot of entries, a lot +of articles that explain how to connect +it together, how to think that way, how +to use all the tools that Org Mode makes +available. + +00:14:34.880 --> 00:15:20.560 +Hopefully, this package is a way to get +started without having to write too much +of your own code. Then eventually, you +can move away from the package if you +want, if you realize that you are +developing different opinions and you +don't want to... If GTD doesn't work +this way for you, if you have a +different way, it is a better fit for +the way you want to organize your life, +then move away from the package. In the +meanwhile, I welcome all thoughts. I +welcome contributions. I welcome +questions, bug reports, everything So, +you know, come say hi. Try the package. +And yeah, see you. I'll see you online! diff --git a/2020/info/12.md b/2020/info/12.md index d8d077c4..1f60436b 100644 --- a/2020/info/12.md +++ b/2020/info/12.md @@ -2,7 +2,8 @@ Leo Vivier [[!template id=vid src="https://mirror.csclub.uwaterloo.ca/emacsconf/2020/emacsconf-2020--12-one-big-ass-org-file-or-multiple-tiny-ones-finally-the-end-of-the-debate--leo-vivier.webm" subtitles="/2020/subtitles/emacsconf-2020--12-one-big-ass-org-file-or-multiple-tiny-ones-finally-the-end-of-the-debate--leo-vivier.vtt"]] -[Download compressed .webm video (22.3M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--12-one-big-ass-org-file-or-multiple-tiny-ones-finally-the-end-of-the-debate--leo-vivier--vp9-q56-video-original-audio.webm) +[Download compressed .webm video (22.3M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--12-one-big-ass-org-file-or-multiple-tiny-ones-finally-the-end-of-the-debate--leo-vivier--vp9-q56-video-original-audio.webm) +[View transcript](#transcript) Many discussions have been had over the years on the debate between using few big files versus many small files. However, more often than @@ -105,3 +106,488 @@ in many more. - "the problem is to let org-element to make sense of the item (?) …". +<a name="transcript"></a> +# Transcript + +00:00:24.160 --> 00:00:58.434 +Hello again, everyone! I hope you had, +well, quite a lot of talks ever since +the last one I did, and all more +interesting one after the other. You +know, I'm a bit in a bit of a weird spot +right now, because I'm supposed to be +presenting to you (as you can see on my +screen) "One big-ass Org file or +multiple tiny ones: finally, the end of +the debate," and it sounds about as +clickbaity as you can possibly get with +those topics. By the way, credit where +credit is due, the title is not mine. +It's actually from Bastien Guerry, the +current Org maintainer. + +00:00:58.434 --> 00:01:22.823 +Yeah, I wanted to talk to you a little +bit today about this question because if +you are used to going on +reddit.com/r/emacs , you know the +subreddit that we have, if you go on +Hacker News often, you know it's a +question that you see pop up every once +in a while. "Should I be using one big +file, or should I be using a lot of tiny +files?" + +00:01:22.823 --> 00:01:58.575 +I believe you know we've got defenders +on both sides. If I just show you one +example... We have Karl Voit. He's one +of the organizers for the conference. He +is the guy who probably has the biggest +Org Mode files right now in all the +people I know, and god knows I know +plenty of people use Org Mode. +But if you just look at this line--I hope +it's not too small; you just +make it a little larger--but +Karl basically has a file with +126,000 lines. + +00:01:58.575 --> 00:02:57.040 +I'm just going to pause and try to have +you imagine how large a file it actually +is. Just think about all of these lines +being tasks in your days. Think about +all those lines being about little +thoughts you know that you've had +throughout the day or project that you +were working on. It's massive. You know +one of the problems that Karl Voit +actually approaches on this topic is +that it takes him roughly 20 seconds to +get his Org agenda going, which is a +massive amount of time. I mean, we have +very fast computers now. You know, ever +since Emacs was created in 1976, +computers... I have no idea how much +faster they've gotten. And yet, you +know, for 100,000 lines, Emacs seems to +be choking. It's certainly not +reasonable, in a way, to have to wait 20 +seconds just for your entire file to be +parsed. So basically what I want to do-- + +00:02:57.040 --> 00:03:50.720 +By the way, I forgot to introduce the +presentation, but I'm Leo Vivier. I did +this before, for those who were around. +I help maintain a software which is +called org-roam, and that's the +expertise that I have on the topic. +Actually, if you go online, I do have a +Github page. I will make sure that you +have all the links available afterwards. +But I do publish my init files, and you +can see, if you scroll at the bottom, I +have a little demonstration which shows +you the fancy things that I can do with +my Org Mode setup. That might be even +interesting in light of the talk you've +just had about GTD stuff, because the +first one is about how I handle my +projects, the second one is about the +flow from a task as I work on it... So I +won't spend too much time on this, but +basically that's my expertise. I have +spent eight years working with Org Mode, +three of them actually thinking about +writing packages. + +00:03:50.720 --> 00:04:32.880 +The thing is, if I go into a little bit +of detail (and obviously it's only a +lighting talk, so I won't have time to +actually go really in depth about it), +but there is something in the Org Mode +library which is called org-element. You +have the name right there, +org-element.el, .el being for Elisp +file. As you can see, the page is on the +Worg wiki, so it's accessible by +everyone. It's basically the API that +Org Mode uses to parse Org Mode files. +For those who don't know, parsing means +basically checking a file, checking all +the contents of the file, and extracting +all the information that we need from +that file. + +00:04:32.880 --> 00:04:58.960 +As you can imagine, you all have Org +Mode files in your mind, well you know +they can be fairly complex. You can have +properties, you can have contextual +information, like if you write a line +which starts at column zero (which means +at the left), it doesn't have the same +meaning, whether or not it is before the +beginning of a headline or if it is +after the beginning of a headline. It's +going to be relatively different, +hierarchically speaking. + +00:04:58.960 --> 00:05:39.280 +So the problem, when it comes to the +question of many files versus one big +file or few big files, is that we always +have to keep in mind what org-element +wants you to do. The thing is, there are +plenty of problems when it comes to +parsing files, the first one being +obviously that Emacs is a single-thread +process (or has some threading +capabilities; we're not going to go into +the details right now, that's not my +goal). It makes it incredibly hard to +parallelize parsing processes with the +current technology. + +00:05:39.280 --> 00:07:03.759 +So you'd have to imagine that if you +have a very large file--if you go back +to the example of Karl Voit from before: +100,000 lines--that means that you have +to scan through every single line, +basically. Because sometimes... Let's +just say that you have a property +drawer, for instance, which tells you, +oh okay, this tree has the tag :foo:. So +the problem is, there are multiple ways +for you to define a tag. You can use the +usual way, which is about wrapping in +columns the :tag: at the end of a +heading. For instance, if I... (I'm not +going to switch to Emacs, that's going +to waste too much time) That's one way +to say your tag. But say, you have tag +inheritance, which means that when you +have a parent with a tag, you also want +the child to inherit the tag. If you +have first heading with the tag :foo:, +you have the first subheading, and the +tag :foo: is implied. Now imagine having +to do that with a file that is +completely nested, a file that has maybe +9, 10, 11 levels of depth to it. It's +mind-bogglingly complicated for the +software to do that, knowing that... +I've told you about tags, but any +property can be inheritable. Anything +like priorities, even. Though why would +you do this? You can have groups. You +can have all this. + +00:07:03.759 --> 00:07:21.957 +And as someone who went through the +trouble of optimizing his Org agenda... +So basically, if we go back to the +GIFs--oh god we've already had this +discussion between the "git" and "magit" +and now I've started "gif" and "gif" and +I only have one more minute left to do +so, so let's just +say I'm going to say "gif" +just to spite people... + +00:07:21.957 --> 00:07:41.360 +So if you go on the way I organize my +agenda, what I did in order to keep my +agenda build time under two seconds, is +that I've rewritten a whole lot of codes +to be able to parse my Org agenda files. +So the thing is, I'm going to be talking +more about this later. + +00:07:41.360 --> 00:07:44.479 +I only have, let's say, one minute to +conclude. + +00:07:44.479 --> 00:08:15.199 +So as you've gathered, I'm not going to +be giving you the answer right now. I'm +going to be talking about org-roam a +little later, which is about following +the principle of having many small +files. But as someone who has been using +one large file to manage my life, you +know, I'm sitting on the fence. I do not +know which one is the best, but I hope +that my presentation has given you a +little idea of what goes on behind the +principles. + +00:08:15.520 --> 00:08:52.000 +You also need to think about the +philosophy behind the organization of +your notes. I hope to be approaching +this topic with you in about two hours +or so (maybe one hour actually). I'm +actually finished. I've decided to leave +you two minutes of questions. If someone +could feed me the questions, that might +be best, because I don't want... oh +actually I can just open the pad. I can +just open it. Give me a second, okay. +Just loading up. I might stop showing my +screen. That might make it easier. So I +mean if you can make myself big now on +the screen, that would be splendid. +([Amin]: yeah sure) + +00:08:52.000 --> 00:09:13.920 +Thank you. Where are we... Question 12. +Okay, so what's better, one big file +or...? Is it a jab to tell me that I +haven't answered the question because +someone just +asked me the question? Well, personally, if +I were to give you a quick answer in +20 seconds, personally, I think it's a +question that is contextually based. + +00:09:13.920 --> 00:09:45.890 +Do you want something that is efficient +as far as optimization is concerned? +Then you need to think about this. +Personally, for all the organization +that I do, all this stuff, all the TODOs +that I handle, I like to do this in one +simple big file because you benefit from +all the refiling capabilities of Org +Mode, so I would do that. But for +knowledge management, for note-taking +and all this, well I'd much rather +follow the org-roam way of doing things, +which is about having many small files. + +00:09:45.890 --> 00:09:57.040 +I'm not getting any more questions. I'm +not sure if there is one on IRC that +could be fed to me. Otherwise, I'm happy +to pass over to the next speaker. + +00:09:57.040 --> 00:10:06.520 +By the way, just before I finish, your +world is a lie. It's not a three-piece +suit. I'm wearing jeans below, so I hope +that satisfies your curiosity. + +00:10:10.640 --> 00:10:35.680 +Okay, there's one more question +appearing. "but otherwise one big file +to have everything..." So I'm putting +you on the spot, I believe. It was such +a short talk. You know the problem is, I +just wanted to give you a little answer. +A little, you know, path of thinking on +this topic. Obviously it's a topic I +could be spending 40 minutes on, but I'm +going to be drained, you're going to be +drained, nobody's going to be happy if I +do this. + +00:10:39.440 --> 00:11:08.240 +Someone asked me if I switch between +British and French accents. A little +secret for you: when I'm stressed, I +tend to revert to a French accent, so +you can measure the amount of stress +that I'm feeling during this talk with +the amount of h's that I drop and the +amount of sheer fright that you can see +sometimes in my eyes, when I'm thinking +about what to say next. + +00:11:08.240 --> 00:11:17.040 +All right sir. So, Amin, do you believe +we can leave it at that? I'll be... +People will see plenty more of me later +on, anyway. + +00:11:17.040 --> 00:11:27.120 +([Amin:] So, looking at the schedule, I +think your talk has until like 2:02, +meaning like five or six minutes from +now.) + +00:11:27.120 --> 00:11:28.000 +Oh, right. + +00:11:28.000 --> 00:11:33.920 +([Amin:] So if you do like to take one +or two questions, to add two more +questions, by all means.) + +00:11:33.920 --> 00:12:20.555 +So someone has asked me what is the +Emacs icon (sorry, see, another French +accent) here in my status bar... Oh +sorry, I'm not sharing any more. I might +just share again just so that everyone +can catch a glimpse of that. There we +go. Allow... So it should be... So if +you could make me small again, Amin, I'm +not sure if it's going to do it by +itself, but I do have a little icon here +in my status bar which is basically a +way to interact with org-protocol. I'm +not going to look for it right now, but +it's a browser extension that is +developed by one of my friends over at +Ranger whose name is Li Fong (??) and +it's very useful. I'm someone who uses a +lot of Org protocols. + +00:12:20.555 --> 00:12:53.600 +And by the way, I used to teach English +to high schoolers, and they were +supremely worried when I showed them my +status line and they saw "kill" and +"explore" in my status line. As fellow +Emacs users, you know that obviously +kill means to kill a selection of text +and keep it inside your clipboard, but +for my students, they were very worried +about what their professor was up to +during his nights. + +00:12:53.600 --> 00:13:01.920 +So let's see if we've got more +questions. I'm showing you the questions +on the rainbow. Let's see if we've got +more. People are posting a lot of +questions now. + +00:13:01.920 --> 00:13:06.399 +So how do you feel about archiving files +in Org Mode and how can that work? + +00:13:06.399 --> 00:13:59.519 +So one of the things when we think about +optimization is: yes, archiving done +trees is a good idea because it means +that if we go back to the org-element, +the way it works (and we'll get into +technical details afterwards; I'm giving +a presentation about org-roam technical +aspects, sorry, so I'll have a chance to +expand a little more on this) but +basically, org-element needs to... Every +time it sees a TODO, it has to consider +it, even though it is a done TODO. Why? +Because let's say, for instance, that in +your agenda you want to activate log +mode, which is going to show the tasks +which are done... Now you could be +clever and say, oh okay, the Org agenda +does not need to show done items, so +it's not going to look for them, but the +problem is that org-element is always +called. It always needs to parse the +buffer. + +00:13:59.519 --> 00:14:22.079 +You know, Nicolas Goaziou, who is the +French developer who's worked a whole +lot on org-element has gone through a +lot of trouble to optimize org-element, +but the problem is there's just so much +that we can do with a concurrent +process. Right now it leaves somewhat +things to be desired, but we're working +on it. + +00:14:22.079 --> 00:14:32.639 +One more time... I feel like I spent +half of this talk teasing my next talks, +but I'll be talking more about this in +my future talks in about one to two +hours. + +00:14:32.639 --> 00:14:36.079 +So, continuing with questions, how big +are my Org files? + +00:14:36.079 --> 00:15:04.880 +So in the background, I'm just going to +check how many lines I have in my main +file. +In my own file, so the one I told you +about where I keep all +my TODO GTD stuff, I have +38,000 lines, which is... +It's sizable, definitely. +But I do archive a lot of stuff, +so that might be a slight difference +between myself and Karl Voit, +even though I don't remember if they +actually archive stuff. + +00:15:04.880 --> 00:15:12.560 +So does it not consume more resources +and time to load multiple files files +than a large file or the same content +now? + +00:15:12.560 --> 00:16:00.560 +Theoretically, yes, having many files +open concurrently is slightly slower +than having one main file opened. Now +the problem is for those of you who have +large files, you may have noticed that +when you are scrolling in a very large +file, it starts taking quite a bit of +time. Why? It's because in Org Mode, you +have a lot of content that is hidden, so +when you have the view mode which hides +as much stuff as possible, meaning that +you only see the top heading--and I'm +checking the time, Amin, don't worry, +I'm finished on this one-- when you're +hiding a whole lot of stuff, Org Mode +needs to keep track, or I should say, +Emacs needs to keep track of which areas +of text to show and which areas of text +to hide. + +00:16:00.560 --> 00:16:21.199 +The problem is that when you're hiding +stuff-- let's say you're moving from the +first heading to the second heading, but +you've got like 10,000 lines between +those two headings-- well, Emacs needs +to compute the difference between the +two passages, and that takes quite a lot +of time. That's why you might realize +that it's a little choppy when you start +scrolling in large files. + +00:16:21.199 --> 00:16:30.719 +Anyway I could be answering questions +about Org Mode for literally two hours +straight, +so I'm gonna hand it over to the next +speakers. I'll be seeing +you guys a little later. + +00:16:30.719 --> 00:16:33.440 +([Amin]: Thank you very much, Leo.) + +00:16:33.440 --> 00:16:34.889 +Oh, thank you. + +00:16:34.889 --> 00:16:36.959 +([Amin:] Yes. Bye.) + +00:16:36.959 --> 00:16:39.839 +Bye. diff --git a/2020/info/13.md b/2020/info/13.md index 3140b467..f98ef404 100644 --- a/2020/info/13.md +++ b/2020/info/13.md @@ -2,7 +2,8 @@ Joseph Corneli, Raymond Puzio, and Cameron Ray Smith [[!template id=vid src="https://mirror.csclub.uwaterloo.ca/emacsconf/2020/emacsconf-2020--13-experience-report-steps-to-emacs-hyper-notebooks--joseph-corneli-raymond-puzio-cameron-ray-smith.webm" subtitles="/2020/subtitles/emacsconf-2020--13-experience-report-steps-to-emacs-hyper-notebooks--joseph-corneli-raymond-puzio-cameron-ray-smith.vtt"]] -[Download compressed .webm video (8.6M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--13-experience-report-steps-to-emacs-hyper-notebooks--joseph-corneli-raymond-puzio-cameron-ray-smith--vp9-q56-video-original-audio.webm) +[Download compressed .webm video (8.6M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--13-experience-report-steps-to-emacs-hyper-notebooks--joseph-corneli-raymond-puzio-cameron-ray-smith--vp9-q56-video-original-audio.webm) +[View transcript](#transcript) We present a short experience report from the perspective of two long-time Emacs users and one relative newcomer. Our motivations @@ -52,3 +53,379 @@ I think he used org-tree-slides, like some earlier presentations. # Notes - <https://github.com/exp2exp/ob-servant> + +<a name="transcript"></a> +# Transcripts + +00:00:00.320 --> 00:00:30.800 +Joe: Hi, I'm Joe Corneli. This is work I +did with Ray Puzio and Cameron Smith. +They're the main protagonists in this +story. They are researchers who've been +working on theoretical biology. In a +typical project, they may use Maxima and +Julia. Their work combines biology, +physics and computer science. The latest +work-in-progress is on branching +processes for cancer modeling. + +00:00:30.800 --> 00:00:48.640 +How can Emacs possibly help? Let's have +a look. Moving code and data between +these different programs by hand is +annoying. Separate workflows for writing +up notes and preparing publications is +perhaps even more annoying. All of it is +time consuming and error-prone. + +00:00:48.640 --> 00:01:10.057 +So what about maybe using Jupyter? We +found something called Script of +Scripts. It solves some of those +problems because you can use Maxima and +Julia together, but we were quite happy +to explore Emacs-based solutions, being +Emacs enthusiasts. We even got Cameron to +be enthusiastic about doing Emacs, so +that went nice. + +00:01:10.057 --> 00:02:05.657 +Here's a little feature grid of Emacs + +Org versus your generic tools that are +in a different, more general ecosystem. +As you can see, it's quite +feature-complete. You've got your +maxima-mode, julia-mode. You can use +both of them inside of org-mode. You can +present things with org-tree-slide. You +can set up a wiki inside of org-roam. +This is one I found rather recently. You +can even use compatibly with org-roam, +something called logseq, which is in the +browser, so that's nice. You can do +real-time collaborative editing, either +in a kind of pairing style or in a more +Etherpad style. Obviously, you can +manage your references. You can typeset +whatever you want. You can publish work +in progress on a blog. Firn is another +one of these external Org Mode tools. +It's not actually in Emacs, but works +with Org Mode stuff. And, you know... So +we're good to go with all of that. + +00:02:05.657 --> 00:02:13.890 +So what does that look like? Well, +here's a little example from before they +were doing... before we started really +thinking seriously about this stuff. + +00:02:13.890 --> 00:02:45.280 +So this is just Maxima. Well, Maxima +doesn't have a long running process by +default. If you've ever used Python, you +have something called sessions. They +don't have that for Maxima, at least not +by default. So how... What was the +workaround? There's this thing called +solve-for-u here that shows up down +below again in these angle brackets, +which you've seen maybe in someone +else's talk, which means go to the +previous thing that was named +solve-for-u and do that all over again, +so they do that over again. + +00:02:45.280 --> 00:03:00.640 +Here's the little Maxima code for +defining usol, so you've now defined +usol, and then you can use it in the +next expression. You get out a nice +juicy zero at the end. It's a little bit +like a partridge in a pear tree to have +to redefine everything every time. + +00:03:00.640 --> 00:03:22.590 +So this is clearly at the level of +work-around. Maybe just one more time +looking through that stuff. Sorry. So, +looking through that stuff, this is... +We're going to need something like that, +probably, for stitching Maxima and Julia +together. so it's good to look a little +bit about how that might work. + +00:03:22.590 --> 00:03:46.923 +First of all, you can cache results, so +if you wanted to save the date out of +block one at a certain time and then use +it again later... At the time when I ran +this code, you can see I've got two +slightly different time stamps down +below. One's the cached result, and the +other was the result of reevaluating the +block. So you can move things around. +That's going to be useful. But you know, +that's not really the main problem. + +00:03:46.923 --> 00:04:11.760 +The main problem is making Maxima +long-running. The core of this talk is a +new observant facility, which is a +general purpose way to do that kind of +thing, which involves a very simple +change to ob-core. We'll give a quick +overview of that and show an example. So +here's the example, a very simple sort +of silly example. + +00:04:11.760 --> 00:04:30.240 +What does it mean to have a long-running +process? Here, I've set this display2d +to be false, which just means that +things are going to come come across in +1d. Then I ask it to expand something. I +get LaTeX by default. So that's what it +means. It's that I've sent something in +and it's going to come across in one +view, which is great. + +00:04:30.240 --> 00:04:40.320 +Maybe you'll also notice that there's no +semicolon, if you're a Maxima fan, and +things are coming across as TeX. So +those were some little bonus features. +I'll show you how that works later. + +00:04:41.040 --> 00:05:13.759 +The change to ob-core is as follows. +Actually, this should say... Instead of +stream here, it should say servant. +Sorry. We tried an experimental version +which was called stream, so now it's +called servant. But all it does is it +overrides org-babel-execute lang for +arbitrary lang if you have a servant in +your params. So that's the change that +hasn't been pushed out or sent as a +patch to anybody, but it's a pretty +minor change. + +00:05:13.759 --> 00:05:30.720 +Here's an overview without the code. +Just a high level overview of +observant.el. It stores information +about these processes in a hash table. +It can do pre-processing and +post-processing. It does all these +things. It stores the output. + +00:05:30.720 --> 00:05:40.639 +I mentioned here that, in principle, we +could store lots of output and have a +kind of browsable history, although we +don't do that presently. But that's what +observant does. It does what you might +expect. + +00:05:41.440 --> 00:06:16.960 +Here's the Maxima on-ramp to get Maxima +brought in. You have to obviously have a +Maxima process you can call. puthash... +this is the preprocessing thing I +mentioned, adding in some Tex and adding +in-- or deleting, rather--a substring. +Here is why you delete the substring. +It's because Maxima thinks it's a good +idea to tell you false once you run +check on things. You've got to delete +that back out to get something coherent +out of it. So this is how to set up +Maxima. + +00:06:16.960 --> 00:06:25.440 +That's enough, really, of the demo. It's +not really a demo for show and tell, but +as this is an experience report, I +wanted to talk about the experience of +doing this. + +00:06:25.440 --> 00:06:42.880 +Some negatives, like we tried to get +Emacs Jupyter working prior to working +on observant. We couldn't get it doing +everything we wanted, despite a bit of +heavy lifting and debugging and stuff. +So that's not finished. That was a bit +difficult. + +00:06:42.880 --> 00:07:11.695 +On the other hand, working on observant +was fun, pretty lightweight, and easy. +We got some experience co-editing things +with these real-time tools. Obviously, +the stack is somewhat work in progress. +I just wanted to give a shout out to +crdt which was really fun, and Qiantan +was making bug fixes for that as we go. +Similarly, for firn and logseq, the +maintainers were really responsive, so +that was nice. + +00:07:11.695 --> 00:07:27.120 +We did try to get Emacs running in the +browser, thinking it would be really +nice for people who didn't want to +install it to get a chance to just try +it, but actually, browsers capture +things like C-n, so that was a bit +annoying. + +00:07:27.120 --> 00:07:33.759 +But we did get lots of great feedback +and interaction with people, including +around this conference. Thank you to +those who we've had discussions with. + +00:07:35.599 --> 00:08:19.120 +So, future work. Okay, so... Maybe you +remember, I gave a talk a few years back +on Arxana. What might this have to do +with Org Mode? That's always the +question one asks about Arxana. +Arxana... One of the things it does is +transclusions, and so that could be +actually very helpful in connection with +this "combined notes and write-up" +workflow. So you might have an Org Mode. +Some of these results we got back as raw +results could go right into your +write-up in a convenient way, at a level +above-- transparently, a level above the +notebook. So you'd have the notebook +alongside the write-up in that case, +which is a variation on the literate +programming workflow. This is +speculative. Who knows? + +00:08:19.120 --> 00:08:33.357 +The other thought is, +it just relates to the idea of network +programming. So we can imagine these +networks of computational nodes +sitting inside of org-roam, +calling each other. +You would want to maintain some +kind of model of that process. + +00:08:33.357 --> 00:09:11.680 +A general question is: how do we have a +remote control for long-running +processes? You could do that in Lisp or +Clojure, but maybe we could have +something a little bit like that here. +Conclusions: what have we actually +addressed? Well, we addressed accessing +any long-running process with a simple +Org Mode interface. Obviously, we're not +the only people to think about +notebooks, but we think that Emacs has +some advantages related to reproducible +research and interdisciplinary +collaboration. Let's just say that we +think something is reproducible if it's +actually teachable to someone new and +they can do it. Org Mode seems very +useful for that. Many of the other talks +have touched on this. + +00:09:11.680 --> 00:09:27.857 +Interdisciplinary collaboration is +great. This was an interdisciplinary +collaboration on some level, but what +about future work for bringing in +scenario planners, simulation +scientists, and local farmers, and +building something that they can all use +that's more than the sum of the parts? + +00:09:27.857 --> 00:09:38.135 +So a little future work for everybody +else here. We think science should be +widely teachable, shareable, +semi-automated, transdisciplinary, and +real-time like EmacsConf. + +00:09:38.135 --> 00:10:00.240 +So you can get in touch via these +methods. The code--which is very much +early stage work in progress, as this +was meant to be an experience report, +not a "it's all done, here, it is +polished" report-- it's also online if +you'd like to have a look. That's the +end of the talk. I don't know if there's +time for questions or not, but um I'm at +your disposal now. Thank you. + +00:10:00.240 --> 00:10:14.240 +(Amin: Many thanks for the tough job. +Let's see. We have about I think four +minutes for questions, and we have a +couple of questions on the pad. Would +you like to read them yourself or should +I read them to you?) + +00:10:14.240 --> 00:10:18.079 +Just for the sake of easy management why +don't you read them out, if that's okay? + +00:10:18.079 --> 00:10:33.760 +(Amin: yeah, sure. They ask, "Have you +looked into trying Sage Math? I've long +wanted to use Sage Math in Org files.") + +00:10:33.760 --> 00:10:44.839 +Ray: Right. I wrote the answer that it +should be possible because one can call +it from a command. + +00:10:44.839 --> 00:11:00.640 +(Amin: okay, and I see there's another +Sage Math question that you seem to have +answered as well, so I guess I won't +repeat that. There's... "Let's not +forget about embedded Calc in Emacs.") + +00:11:00.640 --> 00:11:08.240 +Joe: So the first demos actually were +with Calc. That's useful. Although I +think it was a 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:57.290 +(Amin: Still looking for questions. +Okay, I think that's about it. I don't +see any questions on the Etherpad. And +let's see... Anything on irc? Nothing +but praises and everyone thanking you. +Thank you.) + +00:11:57.290 --> 00:11:59.120 +Ray: all right, you're welcome. + +00:11:59.120 --> 00:12:01.923 +Joe: Thanks a lot! +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/info/14.md b/2020/info/14.md index 9d7ee315..e6e4e127 100644 --- a/2020/info/14.md +++ b/2020/info/14.md @@ -2,7 +2,8 @@ Adam Ard [[!template id=vid src="https://mirror.csclub.uwaterloo.ca/emacsconf/2020/emacsconf-2020--14-readme-driven-design--adam-ard.webm" subtitles="/2020/subtitles/emacsconf-2020--14-readme-driven-design--adam-ard.vtt"]] -[Download compressed .webm video (21.4M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--14-readme-driven-design--adam-ard--vp9-q56-video-original-audio.webm) +[Download compressed .webm video (21.4M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--14-readme-driven-design--adam-ard--vp9-q56-video-original-audio.webm) +[View transcript](#transcript) Many source code projects these days begin with a README file. While most people use markdown, if you use org-mode, you can use literate @@ -104,3 +105,436 @@ from the talk is at: <https://github.com/adam-ard/literate-demo> - I am thinking about org-transclusion; similar ideas to deal with notes instead of codes. - FYI: <https://github.com/alphapapa/transclusion-in-emacs>. + +<a name="transcript"></a> +# Transcript + +00:00:03.600 --> 00:00:37.120 +Adam: Hello! Welcome to Readme Driven +Design in Emacs by Adam Aard. If you're +a programmer, you're accustomed to +putting a README file at the root of +your project. It's usually a Markdown +file But if you use an Org Mode file +instead, you can take advantage of the +great features that Org Mode provides, +including literate programming, which +lets you generate your source code and +Markdown documentation dynamically. +I want to walk you through a little bit +of what this looks like. + +00:00:37.120 --> 00:01:03.520 +When you start a project, especially if +if you use something like Github you +begin with an automatically generated +README.md file. So just delete that +and instead create a README.org file. +Starting with an empty Org file, +like you see here, you can begin +by recording important information about +your project goals. You can add diagrams, +code snippets, to-do lists, time tracking +and much more. + +00:01:03.520 --> 00:01:38.880 +I'm going to drop in some documentation +that I've written about about my project +here, so you can see what this would +look like. As you can see, I have a +title, and a description, and then a +subsection as well as some code +snippets. You can see that Org Mode does +a great job of formatting lists, code +sections, diagrams, and so forth. It's +as good or better than Markdown, but +when you use it in Emacs you can do a +lot more. + +00:01:38.880 --> 00:02:08.000 +For example, you can dynamically create +diagrams using Graphviz from a text +description. If you go to this source +block here and hit C-c C-c, you'll see +that we generate a diagram dynamically +You can run these code snippets in place +and get the results to show up inside of +your file, which is a really powerful +paradigm. + +00:02:08.000 --> 00:02:19.520 +But most importantly, for my purposes +here, Org Mode provides you the ability +to do literate programming. + +00:02:19.520 --> 00:02:34.720 +So take a quick look at this diagram +that I generated here. It gives you a +quick overview of what I mean by +literate programming and how I'm using +it. You can see that we start with a +README.org file on top. + +00:02:34.720 --> 00:03:17.120 +At this point, we can do one of two +things: tangle or weave. Tangle is used +to describe the process of generating +source code, while weave is the process +of generating documentation. These are +terms that Donald Knuth used. He's the +one that came up with the idea of +literate programming in the early 1980s. +But this is really all that there is to +it. You just... You are simply using a +literate source file, in this case the +README.org, to generate the rest of the +project files, basically. + +00:03:17.120 --> 00:03:59.479 +So let's dig in to the details of how +this works. I hope you... Hopefully +you'll see how cool this is. So +returning to the file here. Let's assume +we have enough documentation now, that +we want to get started coding. So maybe +we'll just start with like a Hello World +app, just so we can make sure that our +environment is set up correctly. Let's +get started with a code block. So I +created a little snippet to help me add +a source block for literate programming +quickly. There's not much to it, but +there are some important annotations +here. + +00:04:01.599 --> 00:04:55.360 +Excuse me. There's a property called +:tangle and that takes a value of a file +name. Then there's also a :noweb +property called no-export. Basically, +the noexport--we'll explain that a +little bit more later It has to do with +how the tangling is done in the tangle +step versus the weave step. I'll explain +that a little bit more. But the tangle +field just simply tells Emacs where it +needs to generate the main.go file and +where it needs to put it on the file +system. + +00:04:55.360 --> 00:05:21.520 +You'll notice that we're going to use +Go. That's just the language that I've +been using the most lately, but this +programming strategy is +language-agnostic. You could use any +language or any mix of languages. You +could create some files in Python, some +files in Go, some files in Lisp, or +whatever you want. + +00:05:24.720 --> 00:05:56.400 +Let's create just a little Hello World. +Let's use another snippet here to +generate the basics of a Go program. I'm +just going to print Hello World. So +that's... And then let's make it a +section in our file. So now you can see, +we've got this snippet. + +00:05:56.400 --> 00:06:42.319 +When you have a source block in inside +of Org Mode, you can easily pop into a +language-specific buffer by typing C-c ' +(single quote). So you can see, now I +have a buffer that's in go-mode and +gives you all the ability to edit like +you would normally. If you hit C-c ' +(single quote) again, it goes back and +any changes you make will be updated +there. But you can do quite a bit just +inside of here too. There's quite a bit +of language-specific functionality just +in place, so you don't always have to go +over to a separate buffer. It's a nice +option sometimes. + +00:06:42.319 --> 00:07:12.240 +Now that you have the code in here, +you're going to want to run it. Right +now, it just lives here in this +documentation. You need to get a copy of +it into a separate file, and that's the +tangle process that you you need to +follow there. So I'm gonna drop in a +little bit more doc, a little bit more +documentation really quick here. + +00:07:12.240 --> 00:07:44.879 +Okay, all right. So just as a side note, +I like to follow this process. Whenever +I have an operation to perform, I'd like +to document it here with a snippet that +can be executed inline. Then I don't +have to leave Org Mode, and I don't have +to try to remember what I did later. So +instead of just trying to do an +operation, the first time I do +something, I take the time to figure out +what it is and document it, so then it's +recorded. + +00:07:44.879 --> 00:08:14.400 +So here we find that to do a tangle +operation, you run the command +org-babel-tangle, which is an Elisp +command. If you hit C-c C-c to run it in +place, you get the result of main.go, +which basically is telling us that we've +tangled one file called main.go. You can +see that that's true if you go to the +file system and you look. + +00:08:14.400 --> 00:08:41.120 +Now in our demo directory, we have a +README.org, we have that PNG that we +generated, but we also have a main.go. +If you visit that file, you'll see that +it's just the source code that was in +our documentation, which is exactly what +we expected and what we wanted. So +that's good. +So if we return to where we were at... + +00:08:41.120 --> 00:09:43.012 +Now we're at the point where we have a +file on the file system. Now we need to +build it and to run it. So let's follow +the same philosophy, where let's +document these operations that we're +going to perform. I'm dropping in a a +build instruction section and a run +instruction section. As you can see +here, we have a little a bash source +block, and another bash source block. +This one compiles. The go build command +is what compiles a file. Then the file +that gets generated should be called +demo. So we just run it here. If I type +C-c C-c, we get an empty results block. +When you compile things, no news is good +news. It means there's no errors. + +00:09:43.012 --> 00:10:30.839 +So presumably, we've created an +executable that's called demo. Let's +look again at the file system and +regenerate... Yep. What we have here is +a demo executable, which is exactly what +we wanted. Let's go back. Now we should +be able to run it. C-c C-c, and we get +Hello World as a result, which was +exactly what we were expecting. So +that's already pretty cool. You can do +that much. + +00:10:33.040 --> 00:11:09.760 +That's really just the tip of the +iceberg. To really use the more +impressive features of literate +programming, we need to do a little bit +more at least. Really, to get the full +benefit of it, we need to add some +sections that will cause Emacs to have +to tangle or assemble this file from +different pieces. + +00:11:09.760 --> 00:11:36.240 +Imagine that we wanted to take this file +and maybe kind of templatize it. So, +using literature programming syntax, +this angle bracket syntax, let's say +that we want to create an imports +section, a functions section, and then +maybe just a main section. We'll get rid +of this. + +00:11:36.240 --> 00:11:56.639 +So now you see, we've created something +that looks a little bit like a template +or a scaffolding or outline for what our +file is going to be. It looks a little +bit like pseudocode. What we're going to +have literate programming do is +dynamically insert those things into +those slots. + +00:11:56.639 --> 00:12:36.639 +So the first thing we need to do is... +So let's create a section called "Say +Hello." We want to add some +functionality that makes our program say +hello. So using a different snippet that +I have for creating something that I +call like a literate section, basically, +we create a another source block that's +almost the same as the one for the file. +It just has a few differences. Say we +want to drop code into the import +section and we want it to be in Go. + +00:12:36.639 --> 00:13:14.399 +Here we use the same :noweb no-export +syntax, but then we've added this +:noweb-ref imports, and this ties that +slot to this reference. It tells Emacs +that when you tangle, we want to stick +whatever's in here in that spot. You +skip the tangle file name section +because you're not actually creating a +file name. You're putting information +into an existing file. So here, we would +just add the "fmt" for the imports. + +00:13:14.399 --> 00:14:10.320 +Let's add another section for functions. +Let's just create a function called +sayHello that doesn't have any +arguments. No return types. All it does +is pretty much the same thing as we did +before: just print something. Let's just +say "Hello EmacsConf" this time. Now we +have a function, and now the function +won't do anything unless we invoke it. +Let's do one last literate section +called main. Make that Go source block. +Then let's invoke that function. + +00:14:10.320 --> 00:14:39.839 +Now you can see that we've got our +scaffolding outline, and then we have +the sections that we want to get tangled +or inserted. I've used this syntax. It's +kinda borrowed from literate programming +a little bit with a +=, so really it's +just saying that I want to append this +item into the import section It's really +just to make a little bit more clear +what's going on. + +00:14:39.839 --> 00:14:57.760 +When you generate documentation, you +won't see these particular property +annotations, and so you won't know +immediately that this section goes in +the imports area. So I usually put a +little bit of documentation on top +there, so that it's easy to see. + +00:14:57.760 --> 00:15:21.120 +You would, probably, if this was very +complicated, you'd put some +documentation above to explain what you +were doing, maybe right here. You could +picture yourself maybe explaining a +complicated algorithm or something up +here and having a nice way to document +it. + +00:15:21.120 --> 00:15:28.045 +So now that we've got that here in the +documentation, we need to figure out... +We need to make sure that it's going to +tangle properly. + +00:15:28.045 --> 00:16:20.479 +Your best friend at this point is a +keyboard shortcut that lets you preview +the tangled operation. If you say C-c +C-v C-v, it will create a new buffer +with the tangled contents and so you can +see here that the fmt import went to the +right place, that function went to the +right place, the function invocation +went to the right place. We're feeling +good. You can nest these things many +layers deep. If you came into the +sayHello function, you could add more +sections. It'll go through and it'll +keep track of all that and tangle it for +you so you really get a lot of freedom +and flexibility for how you want to +document things by doing this. + +00:16:20.479 --> 00:16:57.645 +So now that we've previewed it and we +feel good about it, we need to tangle so +we get the file on the file system. so +C-c C-c and get... just main.go comes +back again. C-c C-c and no errors come +back. Then if we did this right, when we +run this, we should get "Hello, +EmacsConf." So C-c C-c, Hello EmacsConf. +I think that's pretty, pretty cool, +actually. + +00:16:57.645 --> 00:17:23.280 +So we've got the breadcrumbs of the +process we've gone through to get to +this point, this initial document that +has some tangling in it. We have +documentation for how to tangle, how to +build, how to run. We've really built a +nice foundation for moving forward on +our project and a nice way of breaking +things out and documenting further. + +00:17:23.280 --> 00:17:38.640 +The last piece that we need to +take care of is the weave that +I showed you in the diagram above. +So one more time, we'll drop in + +00:17:38.640 --> 00:18:35.520 +some documentation, this time on how to +weave. It's really just an export +function. it's not... There's not a +separate weave command going on here. +we're just going to export what we've +got here into a Markdown format. We're +using org-gfm-export-to-markdown, which +is the Github style markdown. You can +use the other, more standard type as +well. Hit C-c C-c. Now you see we've got +a README file, and if you look in the +file system, we've got that right there. +If you go to something like ghostwriter +and open that file, now you can see that +it's generated some documentation. + +00:18:35.520 --> 00:18:48.559 +It puts a index at top at the top. I +usually turn that off. It's easy to do +that by putting a property at the top of +your Org file, but some people like to +have an index. + +00:18:48.559 --> 00:19:22.802 +Here you can see that it has generated +pretty nicely and formatted snippets +well, put the diagram in there, and then +it's preserved this literate programming +syntax, which is important because +that's how we want to view the +documentation. That's what the +no-exports property was trying to +maintain. no-exports means when you +export, do not try to tangle. + +00:19:22.802 --> 00:19:43.600 +Hopefully that makes more sense now. Now +you can see all the documentation. I +think it demonstrates a pretty useful +feature that's inside of Emacs. +Hopefully you'll have as much fun using +that as I have. So thanks! diff --git a/2020/info/15.md b/2020/info/15.md index c61cd24f..98c711e1 100644 --- a/2020/info/15.md +++ b/2020/info/15.md @@ -2,7 +2,8 @@ Adolfo Villafiorita [[!template id=vid src="https://mirror.csclub.uwaterloo.ca/emacsconf/2020/emacsconf-2020--15-moving-from-jekyll-to-orgmode-an-experience-report--adolfo-villafiorita.webm" subtitles="/2020/subtitles/emacsconf-2020--15-moving-from-jekyll-to-orgmode-an-experience-report--adolfo-villafiorita.vtt"]] -[Download compressed .webm video (13.8M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--15-moving-from-jekyll-to-orgmode-an-experience-report--adolfo-villafiorita--vp9-q56-video-original-audio.webm) +[Download compressed .webm video (13.8M)](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/smaller/emacsconf-2020--15-moving-from-jekyll-to-orgmode-an-experience-report--adolfo-villafiorita--vp9-q56-video-original-audio.webm) +[View transcript](#transcript) I have been a long time user of static site generators, such as Jekyll. @@ -48,3 +49,1062 @@ website. - Org mode files support in Jekyll - <https://emacs.cc/jekyll-org/>. - Mentioned: <http://juanjose.garciaripoll.com/blog/org-mode-html-templates/index.html> (org-html). - Other static webpage generators: <https://github.com/novoid/lazyblorg/wiki/Similar-Projects>. + +<a name="transcript"></a> +# Transcript + +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.) |