summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--2020/info/08.md2
-rw-r--r--2020/subtitles/emacsconf-2020--08-building-reproducible-emacs--andrew-tropin.vtt839
2 files changed, 840 insertions, 1 deletions
diff --git a/2020/info/08.md b/2020/info/08.md
index 17769bd3..f7e1241a 100644
--- a/2020/info/08.md
+++ b/2020/info/08.md
@@ -1,7 +1,7 @@
# 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"]]
+[[!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)
It's not always easy to take part of someone's configuration and make
diff --git a/2020/subtitles/emacsconf-2020--08-building-reproducible-emacs--andrew-tropin.vtt b/2020/subtitles/emacsconf-2020--08-building-reproducible-emacs--andrew-tropin.vtt
new file mode 100644
index 00000000..c0dc4397
--- /dev/null
+++ b/2020/subtitles/emacsconf-2020--08-building-reproducible-emacs--andrew-tropin.vtt
@@ -0,0 +1,839 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:04.556
+Hello, everyone. I am Andrew Tropin.
+
+00:00:04.556 --> 00:00:06.622
+I am a professional software engineer
+
+00:00:06.622 --> 00:00:11.622
+I was playing with NixOS
+
+00:00:11.622 --> 00:00:15.322
+It's an operating system based on the
+Nix package manager.
+
+00:00:15.322 --> 00:00:21.089
+I came up with this interesting
+approach for configuring Emacs.
+
+00:00:21.089 --> 00:00:24.056
+I want to share it with you.
+
+00:00:24.056 --> 00:00:27.756
+I will start with the bold statement that
+
+00:00:27.756 --> 00:00:30.822
+Emacs configuration is almost the same
+
+00:00:30.822 --> 00:00:33.022
+as system configuration.
+
+00:00:33.022 --> 00:00:37.262
+It's not related to that Emacs joke
+
+00:00:37.262 --> 00:00:39.922
+about Emacs being an operating system.
+
+00:00:39.922 --> 00:00:44.489
+It's more about Emacs being integrated
+
+00:00:44.489 --> 00:00:48.589
+with so many tools inside the environment.
+
+00:00:48.589 --> 00:00:53.089
+For example, if you don't even use any
+fancy workflows,
+
+00:00:53.089 --> 00:00:57.256
+you use only plain Emacs without any
+configuration,
+
+00:00:57.256 --> 00:01:02.556
+dired uses ls, grep.el uses grep,
+
+00:01:02.556 --> 00:01:09.356
+and info files placed
+somewhere in your system.
+
+00:01:09.356 --> 00:01:15.489
+Also Emacs can interact with gpg, git,
+make, and other stuff.
+
+00:01:15.489 --> 00:01:20.789
+When you grow your Emacs Lisp
+
+00:01:20.789 --> 00:01:23.189
+init.el file
+
+00:01:23.189 --> 00:01:27.222
+or other files in your .emacs.d directory,
+
+00:01:27.222 --> 00:01:29.989
+you get much more integration
+
+00:01:29.989 --> 00:01:31.389
+with underlying operating system.
+
+00:01:31.389 --> 00:01:36.922
+The question is: how to manage such configuration?
+
+00:01:36.922 --> 00:01:40.922
+Because you can't just take a bunch of
+.el files
+
+00:01:40.922 --> 00:01:43.456
+and move to a different machine
+
+00:01:43.456 --> 00:01:47.122
+and be sure that everything will work.
+
+00:01:47.122 --> 00:01:50.577
+Because you didn't move your
+executables.
+
+00:01:50.577 --> 00:01:53.522
+You didn't move configuration
+of other programs.
+
+00:01:53.522 --> 00:01:55.089
+You didn't move your service configurations.
+
+00:01:55.089 --> 00:02:01.889
+And you can't even just create dotfiles
+for each program
+
+00:02:01.889 --> 00:02:05.022
+and move it with your .el files.
+
+00:02:05.022 --> 00:02:08.622
+The approach would be a little broader.
+
+00:02:08.622 --> 00:02:13.056
+Everything that I am showing today
+
+00:02:13.056 --> 00:02:15.322
+is available on Github.
+
+00:02:15.322 --> 00:02:18.022
+Any source code, you can find here.
+
+00:02:18.022 --> 00:02:21.589
+but my copy of the repository
+
+00:02:21.589 --> 00:02:23.722
+is on my local machine.
+
+00:02:23.722 --> 00:02:27.722
+As you can see, the font is a little small.
+
+00:02:27.722 --> 00:02:31.122
+And also, my terminal font is also a
+little small.
+
+00:02:31.122 --> 00:02:36.756
+I can do a quick fix and increase the font.
+
+00:02:36.756 --> 00:02:40.789
+But imagine how cool it will be
+
+00:02:40.789 --> 00:02:45.756
+if you can have a file which contains
+the configuration for a system.
+
+00:02:45.756 --> 00:02:52.489
+You change some value. Here, for
+example, fontSize = 16
+
+00:02:52.489 --> 00:02:54.589
+and run some command
+
+00:02:54.589 --> 00:02:58.489
+and based on this file
+
+00:02:58.489 --> 00:03:00.322
+and some other includes
+
+00:03:00.322 --> 00:03:02.422
+your operating system is built
+
+00:03:02.422 --> 00:03:06.389
+and all your environment is set up
+
+00:03:06.389 --> 00:03:07.656
+and ready for use.
+
+00:03:07.656 --> 00:03:11.622
+For example here, we already built
+the new operating system,
+
+00:03:11.622 --> 00:03:17.856
+and everything is already installed in
+my SSD.
+
+00:03:17.856 --> 00:03:21.322
+Now I can run the program and you can
+see that
+
+00:03:21.322 --> 00:03:29.422
+my alacrity terminal has much bigger font
+
+00:03:29.422 --> 00:03:31.789
+and also if I restart my Emacs instance
+
+00:03:31.789 --> 00:03:34.089
+it by default uses
+
+00:03:34.089 --> 00:03:36.889
+a much bigger font for any buffer.
+
+00:03:36.889 --> 00:03:41.089
+Practical, and as you can see, it's
+already working,
+
+00:03:41.089 --> 00:03:45.889
+thanks to Nix and NixOS.
+
+00:03:45.889 --> 00:03:50.722
+I will explain a little later how it
+works inside,
+
+00:03:50.722 --> 00:03:57.089
+but for now, let's specify a little more
+
+00:03:57.089 --> 00:04:00.789
+what happened right now.
+
+00:04:00.789 --> 00:04:08.156
+I fed my... Oh. It doesn't work. Sorry.
+I want...
+
+00:04:08.156 --> 00:04:13.056
+I have my whole operating system
+
+00:04:13.056 --> 00:04:15.589
+defined in a few Nix files.
+
+00:04:15.589 --> 00:04:18.689
+For example, here you saw the file
+
+00:04:18.689 --> 00:04:22.522
+which defines some variables for my environment
+
+00:04:22.522 --> 00:04:24.256
+and then a few more files
+
+00:04:24.256 --> 00:04:25.722
+for different programs.
+
+00:04:25.722 --> 00:04:30.056
+There is a folder which contains all
+Emacs-related configuration.
+
+00:04:30.056 --> 00:04:36.989
+Also, there are package definitions
+defined in Nix package repositories
+
+00:04:36.989 --> 00:04:42.522
+which is also included for the function
+which generates
+
+00:04:42.522 --> 00:04:44.556
+the operating system.
+
+00:04:44.556 --> 00:04:47.622
+Getting all my configurations
+written in Nix language
+
+00:04:47.622 --> 00:04:51.174
+and a few firewalls in ?? languages,
+
+00:04:51.174 --> 00:04:54.700
+everything is gathered together,
+
+00:04:54.700 --> 00:04:56.722
+and from that input
+
+00:04:56.722 --> 00:04:58.322
+and only from that input,
+
+00:04:58.322 --> 00:05:00.489
+the new operating system is built.
+
+00:05:00.489 --> 00:05:03.856
+Emacs now is a part of this operating system.
+
+00:05:03.856 --> 00:05:08.422
+I can distribute this Emacs configuration
+
+00:05:08.422 --> 00:05:11.689
+with all the environment that I want.
+
+00:05:11.689 --> 00:05:18.389
+Practical so far. Let's clarify which
+problems does it solve.
+
+00:05:18.389 --> 00:05:21.756
+First of all, the integration problem.
+
+00:05:21.756 --> 00:05:27.389
+For example, a few minutes ago, you saw
+that I changed one variable.
+
+00:05:27.389 --> 00:05:31.348
+That was to update... The first one, for
+my terminal,
+
+00:05:31.348 --> 00:05:33.889
+and the second one, for my Emacs.
+
+00:05:33.889 --> 00:05:40.322
+It's pretty good that a few different
+programs can share some data.
+
+00:05:40.322 --> 00:05:43.822
+For example, you can have one of them
+for every application,
+
+00:05:43.822 --> 00:05:45.222
+or something like that
+
+00:05:45.222 --> 00:05:48.356
+and you change only one value in one place
+
+00:05:48.356 --> 00:05:50.789
+and the whole operating system is updated.
+
+00:05:50.789 --> 00:05:56.422
+Also, another problem is reproducibility.
+
+00:05:56.422 --> 00:06:00.156
+
+
+00:06:00.156 --> 00:06:06.600
+For example, when you install
+your new instance of Emacs
+
+00:06:06.600 --> 00:06:11.089
+on your laptop or something like that,
+
+00:06:11.089 --> 00:06:14.289
+you can be sure that you will get the
+same package versions
+
+00:06:14.289 --> 00:06:17.189
+and you can be sure that the
+configuration of your work
+
+00:06:17.189 --> 00:06:20.856
+results in newly-updated or
+newly-installed packages.
+
+00:06:20.856 --> 00:06:25.056
+Also, if you update packages
+
+00:06:25.056 --> 00:06:27.656
+sometimes it's hard to revert,
+
+00:06:27.656 --> 00:06:36.289
+because it's the way your package
+manager almost every time works.
+
+00:06:36.289 --> 00:06:38.722
+You're just getting the latest
+available packages.
+
+00:06:38.722 --> 00:06:43.256
+If they are broken, you need to wait for
+the maintainer to update them.
+
+00:06:43.256 --> 00:06:50.989
+And also, your basic configuration
+almost always doesn't contain
+
+00:06:50.989 --> 00:06:56.156
+any native dependencies, like
+executables or something else.
+
+00:06:56.156 --> 00:07:00.689
+Recently, I saw some attempts to make it
+possible to
+
+00:07:00.689 --> 00:07:03.089
+use use-package for those needs,
+
+00:07:03.089 --> 00:07:06.356
+like ensuring native dependencies
+or something like that.
+
+00:07:06.356 --> 00:07:11.134
+It's obviously... If
+your configuration isn't reproducible
+
+00:07:11.134 --> 00:07:15.322
+and it doesn't have
+your whole environment,
+
+00:07:15.322 --> 00:07:19.522
+placed in one repository,
+
+00:07:19.522 --> 00:07:22.322
+it's very hard to share such
+configuration.
+
+00:07:22.322 --> 00:07:27.089
+You can share part of your configuration
+and some instruction
+
+00:07:27.089 --> 00:07:32.222
+how to get a similar environment,
+but it doesn't always work.
+
+00:07:32.222 --> 00:07:39.656
+Let's go closer to actually Emacs
+configuration itself.
+
+00:07:39.656 --> 00:07:45.306
+I had some experience with Spacemacs and
+Doom Emacs distributions.
+
+00:07:45.306 --> 00:07:50.414
+I also watched a lot of videos and
+articles by Protesilaos
+
+00:07:50.414 --> 00:07:56.756
+and a lot of other custom configurations
+of many different cool people.
+
+00:07:56.756 --> 00:08:03.039
+And also I was inspired by use-package
+
+00:08:03.039 --> 00:08:10.839
+and decided that I will create a folding
+structure for my Emacs configuration.
+
+00:08:10.839 --> 00:08:16.172
+I will be using subconfigs. It's almost
+the same as layers in Spacemacs,
+
+00:08:16.172 --> 00:08:20.972
+or modules in Doom Emacs, which are
+self-contained.
+
+00:08:20.972 --> 00:08:26.287
+They contain Emacs Lisp code which
+configures all packages necessary
+
+00:08:26.287 --> 00:08:28.789
+for this part of configuration.
+
+00:08:28.789 --> 00:08:33.493
+It contains all Emacs dependencies like
+Emacs packages.
+
+00:08:33.493 --> 00:08:36.572
+It contains all native dependencies
+
+00:08:36.572 --> 00:08:40.039
+like binaries or maybe info pages or
+something like that.
+
+00:08:40.039 --> 00:08:45.115
+It also contains variables
+that can be shared between
+
+00:08:45.115 --> 00:08:47.989
+Emacs and other applications,
+
+00:08:47.989 --> 00:08:52.072
+and it can contain service
+or system definitions
+
+00:08:52.072 --> 00:08:56.072
+which configure your systemd service or
+something like that
+
+00:08:56.072 --> 00:09:01.306
+that you use in your workflow. For
+example, for synchronizing your e-mails.
+
+00:09:01.306 --> 00:09:06.239
+Let's start from just the example
+
+00:09:06.239 --> 00:09:16.618
+that I already am... I have a folding
+structure for my configuration.
+
+00:09:16.618 --> 00:09:25.789
+I have some files here.
+early-init just has this.
+
+00:09:25.789 --> 00:09:33.006
+Nothing changes. It will be copied to
+that .emacs.d directory later
+
+00:09:33.006 --> 00:09:37.306
+with some exceptions that
+
+00:09:37.306 --> 00:09:40.789
+it will replace the Nix dir and a
+symlink will be created to it.
+
+00:09:40.789 --> 00:09:47.889
+I have use-package-init.el.
+It's part of configuration
+
+00:09:47.889 --> 00:09:51.522
+that will be on top of everything
+
+00:09:51.522 --> 00:09:55.589
+to be able to use use-package in my
+subconfigurations.
+
+00:09:55.589 --> 00:10:01.156
+And actually some Nix code to glue
+everything up
+
+00:10:01.156 --> 00:10:06.922
+and config dirs which contain all my subconfigs.
+
+00:10:06.922 --> 00:10:11.389
+Let's start from faces subconfig.
+
+00:10:11.389 --> 00:10:14.556
+Let's start from config.el
+
+00:10:14.556 --> 00:10:20.022
+which can be familiar for many people.
+
+00:10:20.022 --> 00:10:23.556
+Just use-package definition
+for faces package
+
+00:10:23.556 --> 00:10:24.122
+and some configuration for it
+
+00:10:24.122 --> 00:10:29.589
+which are setting some attributes.
+
+00:10:29.589 --> 00:10:32.156
+It reads some variables.
+
+00:10:32.156 --> 00:10:36.922
+Those variables are actually defined in
+a different place.
+
+00:10:36.922 --> 00:10:44.422
+If I open default.nix file, you can see
+that it contains
+
+00:10:44.422 --> 00:10:52.689
+the definition or subconfig, and it
+should contain a definition of variables
+
+00:10:52.689 --> 00:10:55.322
+that it uses by... I forgot to move it from
+
+00:10:55.322 --> 00:11:01.889
+my original default.nix file somewhere
+here.
+
+00:11:01.889 --> 00:11:10.105
+You probably can find definition of
+those variables just right here.
+
+00:11:10.105 --> 00:11:13.722
+I took values from my
+Nix expressions.
+
+00:11:13.722 --> 00:11:23.956
+Those values will be shared across my
+alacrity, Emacs, and other applications.
+
+00:11:23.956 --> 00:11:27.789
+Later, they will be placed in generated
+Emacs configuration.
+
+00:11:27.789 --> 00:11:32.856
+They will be available for faces config.
+
+00:11:32.856 --> 00:11:38.422
+Here I will be referencing them just
+like Emacs variables.
+
+00:11:38.422 --> 00:11:43.356
+Let's take a look at another more
+complicated example.
+
+00:11:43.356 --> 00:11:45.922
+For example, org-roam package.
+
+00:11:45.922 --> 00:11:49.922
+Just a basic use-package configuration
+
+00:11:49.922 --> 00:11:54.607
+which uses a variable and
+the definition.
+
+00:11:54.607 --> 00:12:00.322
+It's a little more complex than the
+previous one.
+
+00:12:00.322 --> 00:12:04.222
+Elisp configuration in the same file.
+
+00:12:04.222 --> 00:12:08.856
+emacsPackages specified here.
+
+00:12:08.856 --> 00:12:12.289
+Those two packages: org-roam and company-org-roam.
+
+00:12:12.289 --> 00:12:16.956
+systemPackages: it's something that
+should be available
+
+00:12:16.956 --> 00:12:18.456
+on your host operating system.
+
+00:12:18.456 --> 00:12:24.756
+And for emacsPackages, you need sqlite
+package,
+
+00:12:24.756 --> 00:12:27.922
+and also the definition of the variable
+
+00:12:27.922 --> 00:12:31.556
+which will be passed in my Emacs
+configuration later.
+
+00:12:31.556 --> 00:12:37.722
+It's equal to my workDir, which is
+defined in my environment,
+
+00:12:37.722 --> 00:12:39.222
+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:12:50.822
+Oh, okay. I'm almost finished. It was
+last example.
+
+00:12:50.822 --> 00:12:56.556
+Let me open my Org file. Okay.
+
+00:12:56.556 --> 00:13:02.222
+Right here. I won't give you an
+introduction to Nix itself
+
+00:13:02.222 --> 00:13:06.922
+and the underlying mechanism,
+
+00:13:06.922 --> 00:13:11.140
+but I can say that there's already a
+proof of concept framework
+
+00:13:11.140 --> 00:13:14.622
+for utilizing Nix and NixOS
+
+00:13:14.622 --> 00:13:18.389
+for configuring Emacs
+and making a very complex workflow
+
+00:13:18.389 --> 00:13:22.056
+reproducible on other machines.
+
+00:13:22.056 --> 00:13:26.222
+It gives everything that we
+saw right now.
+
+00:13:26.222 --> 00:13:31.522
+For the future work, I plan to
+reimplement it in Guile,
+
+00:13:31.522 --> 00:13:36.189
+which is a Scheme dialect,
+which is another Lisp language,
+
+00:13:36.189 --> 00:13:39.199
+for the GNU Guix operating system,
+
+00:13:39.199 --> 00:13:41.856
+because I like Lisp languages
+
+00:13:41.856 --> 00:13:46.822
+a little more than Nix languages and I
+want to make
+
+00:13:46.822 --> 00:13:50.089
+this project from proof of concept
+to some state which
+
+00:13:50.089 --> 00:13:54.189
+will be user-friendly and
+available for other people.
+
+00:13:54.189 --> 00:13:59.156
+If I will have a lot of time,
+I will make an operating system
+
+00:13:59.156 --> 00:14:01.356
+which will be inspired by Lisp machines
+
+00:14:01.356 --> 00:14:05.389
+to make the whole experience very Lispy.
+
+00:14:05.389 --> 00:14:08.556
+Thank you for your attention
+
+00:14:08.556 --> 00:14:12.189
+and now I will answer questions.
+
+00:14:12.189 --> 00:14:22.622
+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:39.922
+Ideally, in the folding way, I create a
+separate directory called local/share/emacs,
+
+00:14:39.922 --> 00:14:45.089
+and I place custom el files here. It's
+not synchronized in any way,
+
+00:14:45.089 --> 00:14:48.922
+and it will be just lost in case you
+move to a separate machine.
+
+00:14:48.922 --> 00:14:52.456
+I do it for a purpose, because I don't
+use custom.el.
+
+00:14:52.456 --> 00:14:59.456
+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:10.141
+I read a lot of documentation.
+
+00:15:10.141 --> 00:15:15.989
+Also, I saw the course like Learn Nix in
+15 minutes.
+
+00:15:15.989 --> 00:15:19.289
+And also there was another resource.
+
+00:15:19.289 --> 00:15:25.689
+Better to ask this question in Nix or
+NixOS channel in IRC,
+
+00:15:25.689 --> 00:15:32.989
+which will be treated in more details.
+
+00:15:32.989 --> 00:15:36.656
+What are the main advantages besides
+switching computers,
+
+00:15:36.656 --> 00:15:38.909
+which most people rarely do?
+
+00:15:38.909 --> 00:15:44.422
+For example, the original idea was to
+make part of configurations
+
+00:15:44.422 --> 00:15:46.422
+available for projects.
+
+00:15:46.422 --> 00:15:48.156
+For example, you have some project,
+
+00:15:48.156 --> 00:15:51.914
+you made the setup,
+and want other developers
+
+00:15:51.914 --> 00:15:55.256
+to use the same setup
+on their machine,
+
+00:15:55.256 --> 00:15:58.122
+but you implement only the part of
+stuff,
+
+00:15:58.122 --> 00:16:01.156
+like one subconfig especially for
+this language
+
+00:16:01.156 --> 00:16:05.389
+for this project. With such approach,
+you can easily
+
+00:16:05.389 --> 00:16:10.556
+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:22.272
+Yes, I tried it, and currently I am in
+the state of switching from Nix to Guix.
+
+00:16:22.272 --> 00:16:26.739
+You can follow my Youtube channel, I think,
+
+00:16:26.739 --> 00:16:32.522
+I do streams twice in a month
+
+00:16:32.522 --> 00:16:35.922
+talking about reproducibility and
+related stuff.
+
+00:16:35.922 --> 00:16:39.306
+Probably soon I will be talking
+about installation of Guix
+
+00:16:39.306 --> 00:16:41.239
+and configuration of it.
+
+00:16:41.239 --> 00:16:44.956
+In case you're watching this video later,
+
+00:16:44.956 --> 00:16:47.972
+you can find me somewhere on the network
+using those contacts.
+
+00:16:47.972 --> 00:16:50.406
+It's my nickname and my e-mail address.
+
+00:16:54.072 --> 00:16:56.556
+([Amin:] Awesome. I think we're wrapping
+up just on time.
+
+00:16:56.556 --> 00:17:00.889
+Thank you so much, Andrew, for your
+great talk,
+
+00:17:00.889 --> 00:17:04.622
+and for hanging out to answer the
+questions live.)
+
+00:17:04.622 --> 00:17:08.022
+[Andrew:] Thank you for organizing the
+conference
+
+00:17:08.022 --> 00:17:11.572
+and thank you all participants for
+questions and participation.
+
+00:17:11.572 --> 00:17:18.000
+See you soon!