diff options
author | Sacha Chua <sacha@sachachua.com> | 2021-11-29 09:45:57 -0500 |
---|---|---|
committer | Sacha Chua <sacha@sachachua.com> | 2021-11-29 09:45:57 -0500 |
commit | e8e25c3c457b30b34bbae4c93ebd08ae48d1d710 (patch) | |
tree | a00344b4b26f2afe6842d2971b08832d27f6b4d5 /2021 | |
parent | 51620ae048f47c88b163fbb8844a5575c6b35c4e (diff) | |
download | emacsconf-wiki-e8e25c3c457b30b34bbae4c93ebd08ae48d1d710.tar.xz emacsconf-wiki-e8e25c3c457b30b34bbae4c93ebd08ae48d1d710.zip |
Update
Diffstat (limited to '2021')
10 files changed, 7089 insertions, 0 deletions
diff --git a/2021/captions/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt b/2021/captions/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt new file mode 100644 index 00000000..c3d95a56 --- /dev/null +++ b/2021/captions/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt @@ -0,0 +1,457 @@ +WEBVTT + +00:00.950 --> 00:03.225 +Hello, my name is Dhavan, + +00:03.225 --> 00:05.500 +also known as codingquark! + +00:05.500 --> 00:08.041 +I started out learning Emacs + +00:08.041 --> 00:12.540 +without knowing I had to plug things in + +00:12.540 --> 00:13.629 +to make it work. + +00:13.629 --> 00:14.849 +Eventually I had to learn to set up ELPA. + +00:14.849 --> 00:16.850 +Since then I’ve used MELPA + +00:16.850 --> 00:21.030 +and Debian apt sources. + +00:21.030 --> 00:21.054 +Recent discussions about ELPA, + +00:21.054 --> 00:21.054 +NonGNU ELPA, MELPA, etc. + +00:21.054 --> 00:21.054 +made me reconsider + +00:21.054 --> 00:21.054 +what I was doing + +00:21.054 --> 00:28.590 +with my Emacs. + +00:28.590 --> 00:30.887 +I am not the kind of person + +00:30.887 --> 00:34.290 +to mindlessly ram things into my emacs. + +00:34.290 --> 00:36.041 +I like to ponder, + +00:36.041 --> 00:37.500 +to understand, + +00:37.500 --> 00:40.128 +to have a level of control + +00:40.128 --> 00:42.069 +and mindfulness + +00:42.069 --> 00:43.890 +about my Emacs. + +00:43.890 --> 00:45.730 +It is not just a matter + +00:45.730 --> 00:47.340 +of trying things out, + +00:47.340 --> 00:50.909 +it is about living an examined life + +00:50.909 --> 00:53.387 +as the Greeks would say; + +00:53.387 --> 00:57.040 +or sutta as Buddhists would say. + +00:57.040 --> 00:59.860 +Such an Emacs is an Emacs worth having. + +00:59.860 --> 01:01.414 +This pursuit of mine + +01:01.414 --> 01:03.710 +brought me to learn about borg. + +01:03.710 --> 01:05.595 +And I am going to share with you + +01:05.595 --> 01:06.479 +how to use it. + +01:06.479 --> 01:09.018 +I believe the approach of using borg + +01:09.018 --> 01:10.597 +for package management + +01:10.597 --> 01:12.710 +is not for everyone. + +01:12.710 --> 01:14.307 +It involves knowing git, + +01:14.307 --> 01:16.648 +it involves looking into source code + +01:16.648 --> 01:18.229 +and reading makefiles. + +01:18.229 --> 01:20.170 +Sure, anyone can learn + +01:20.170 --> 01:22.617 +should they be motivated so, + +01:22.617 --> 01:25.740 +but people have different priorities. + +01:25.740 --> 01:29.056 +This is what is working for me right now. + +01:29.056 --> 01:32.826 +Here is what we are going to do. + +01:32.826 --> 01:35.696 +We'll set up Debian, install dependencies, + +01:35.696 --> 01:39.032 +set up borg, install a package, + +01:39.032 --> 01:42.090 +and make sure it installs all the docs. + +01:42.090 --> 01:47.240 +Let’s get started! + +01:47.240 --> 01:48.342 +Would it not be amazing + +01:48.342 --> 01:49.560 +if we could start out with + +01:49.560 --> 01:52.399 +just Debian and basic tools? + +01:52.399 --> 01:54.848 +For borg, we need git, + +01:54.848 --> 01:55.916 +build-essential, + +01:55.916 --> 01:57.384 +and something to build docs. + +01:57.384 --> 02:00.499 +Nothing more! + +02:00.499 --> 02:04.658 +Now that we have the OS setup, + +02:04.658 --> 02:06.226 +it is time to clone + +02:06.226 --> 02:09.429 +what is called a “seed”. + +02:09.429 --> 02:11.431 +A seed will speed our process up + +02:11.431 --> 02:13.379 +by providing things like + +02:13.379 --> 02:15.500 +magit, epkg, auto-compile, etc. + +02:15.500 --> 02:20.430 +We will soon be using epkg and magit. + +02:20.430 --> 02:22.642 +The docs cover how to start + +02:22.642 --> 02:23.477 +without a seed, + +02:23.477 --> 02:25.779 +but for the purposes of a short demo, + +02:25.779 --> 02:27.770 +seeds are better. + +02:27.770 --> 02:28.682 +I started with a seed + +02:28.682 --> 02:30.083 +for my own dot emacs. + +02:30.083 --> 02:32.890 +It is fairly slim. + +02:32.890 --> 02:33.854 +As you can see, + +02:33.854 --> 02:35.088 +borg uses git URLs + +02:35.088 --> 02:37.290 +and /not/ HTTPS URLs. + +02:37.290 --> 02:38.992 +Make sure you have your ssh keys + +02:38.992 --> 02:43.989 +set up on GitHub, GitLab, etc. + +02:43.989 --> 02:45.899 +Bootstrapping is like cloning a dot emacs, + +02:45.899 --> 02:47.310 +but it only comes with a + +02:47.310 --> 02:51.400 +useful dot git submodules file. + +02:51.400 --> 02:54.841 +We get a Makefile that has targets + +02:54.841 --> 02:57.739 +like help and bootstrap-borg. + +02:57.739 --> 02:59.880 +There will be more targets + +02:59.880 --> 03:02.115 +after we finish the bootstrapping process. + +03:30.110 --> 03:35.582 +Then, we need to clone all the git modules, + +03:35.582 --> 03:38.310 +which is also done by a make target. + +03:38.310 --> 03:40.754 +This time, it will not just pull + +03:40.754 --> 03:42.656 +the git submodules, + +03:42.656 --> 03:44.658 +but will also run various things + +03:44.658 --> 03:45.826 +like auto-compilation, + +03:45.826 --> 03:48.030 +Info doc installation, etc. + +03:48.030 --> 04:08.680 +Good thing we installed texinfo earlier! + +04:08.282 --> 04:10.884 +Now that we have borg bootstrapped, + +04:10.884 --> 04:14.520 +let’s see how to “assimilate” a drone. + +04:14.520 --> 04:17.090 +Well, that’s just a borg way of saying + +04:17.090 --> 04:19.900 +how to install a new package. + +04:19.900 --> 04:22.910 +We get to work from inside Emacs now. + +04:22.910 --> 04:26.366 +Borg has excellent info docs, + +04:26.366 --> 04:28.450 +should you ever be having questions. + +04:28.450 --> 04:32.240 +I earlier talked about using a seed. + +04:32.240 --> 04:34.830 +Borg docs go into details of what that means. + +04:34.830 --> 04:40.190 +I encourage you to read the docs. + +04:40.190 --> 04:51.500 +Let’s try to install lsp-mode. + +04:51.500 --> 04:52.459 +Examining lsp-mode + +04:52.459 --> 04:54.694 +with epkg’s helper function, + +04:54.694 --> 04:57.280 +we can see details of the package, + +04:57.280 --> 05:00.200 +dependencies required, and so on. + +05:00.200 --> 05:02.470 +epkg uses sqlite database. + +05:02.470 --> 05:04.871 +Now you know why I installed sqlite + +05:04.871 --> 05:12.350 +in the OS preparation step! + +05:20.820 --> 05:22.622 +Well, lsp-mode has + +05:22.622 --> 05:24.057 +way too many dependencies + +05:24.057 --> 05:25.830 +for this demo. + +05:25.830 --> 05:28.795 +Note how one is naturally led + +05:28.795 --> 05:32.332 +to take a peek at the innards of the packages + +05:32.332 --> 05:34.780 +in this simple workflow. + +05:34.780 --> 05:37.270 +As I said, it is about being mindful! + +05:37.270 --> 05:39.573 +Okay, instead of lsp-mode, + +05:39.573 --> 05:41.308 +let’s take a look at + +05:41.308 --> 05:45.400 +Prot’s excellent modus-themes. + +05:45.400 --> 05:47.247 +No extra dependencies needed. + +05:47.247 --> 05:49.870 +That is perfect! + +05:49.870 --> 05:52.018 +The themes have great docs + +05:52.018 --> 05:53.620 +and our philosopher friend + +05:53.620 --> 05:56.000 +is good at writing. + +05:56.000 --> 06:02.930 +Alright, first, we clone the package. + +06:02.930 --> 06:04.664 +This allows us to inspect the code, + +06:04.664 --> 06:06.330 +should we want to. + +06:06.330 --> 06:23.000 +Well, you /should/. + +06:23.000 --> 06:25.552 +Upon inspecting the code, + +06:25.552 --> 06:30.620 +we ask borg to assimilate the package. + +06:30.620 --> 06:33.927 +This will load the code in our Emacs + +06:33.927 --> 06:37.270 +and make the package available for use. + +06:39.799 --> 06:42.135 +Wait, I was praising all the docs, + +06:42.135 --> 06:43.690 +but where are they? + +06:43.690 --> 06:44.571 +To install the docs, + +06:44.571 --> 06:46.273 +we need to instruct borg + +06:46.273 --> 06:48.020 +about where to find them. + +06:48.020 --> 06:51.978 +To do this, we edit the gitmodules file + +06:51.978 --> 06:53.910 +and add the details. + +06:53.910 --> 06:58.310 +There they are! + +06:58.310 --> 07:04.170 +We have our docs! + +07:04.170 --> 07:09.940 +Alright, we have assimilated a package. + +07:09.940 --> 07:11.398 +After sufficient testing, + +07:11.398 --> 07:14.234 +we can commit it as a part of our own dot emacs, + +07:14.234 --> 07:19.272 +which is a drone of our borg collective. + +07:19.272 --> 07:21.741 +Since all the packages are git submodules, + +07:21.741 --> 07:23.810 +we get to use magit + +07:23.810 --> 07:25.245 +(all hail magit!) + +07:25.245 --> 07:27.514 +and borg’s helper functions + +07:27.514 --> 07:29.530 +to commit the code. + +07:29.530 --> 07:31.818 +Now create your own dot el file + +07:31.818 --> 07:38.758 +and hack away! + +07:38.758 --> 07:39.793 +So that is it. + +00:07:39.793 --> 00:07:41.661 +I hope you enjoyed the talk + +07:41.661 --> 07:45.131 +and I will be hanging out in IRC + +07:45.131 --> 07:46.666 +if you have any questions. + +07:46.666 --> 07:48.330 +Thank you, and bye. diff --git a/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt b/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt new file mode 100644 index 00000000..b10e834a --- /dev/null +++ b/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt @@ -0,0 +1,457 @@ +WEBVTT + +00:00.240 --> 00:00:02.639 +hi my name is eduardox i'm the author of + +00:02.639 --> 00:00:05.040 +an mx package called ev and this talk is + +00:05.040 --> 00:00:07.200 +about a new feature of ev called test + +00:07.200 --> 00:00:08.400 +blocks + +00:08.400 --> 00:00:10.320 +let's start by demo + +00:10.320 --> 00:00:12.559 +this is a file in lua that defines these + +00:12.559 --> 00:00:14.160 +two functions here + +00:14.160 --> 00:00:16.720 +and with it if we type f8 several times + +00:16.720 --> 00:00:18.000 +here + +00:18.000 --> 00:00:20.880 +the f8s create a lower apple here and + +00:20.880 --> 00:00:24.400 +then they send these lines to the rebel + +00:24.400 --> 00:00:27.039 +where this line here loads this file + +00:27.039 --> 00:00:29.679 +into the repo and these other lines here + +00:29.679 --> 00:00:33.200 +are tests for these lines + +00:33.200 --> 00:00:35.120 +there's a lot of information here so let + +00:35.120 --> 00:00:40.480 +me organize them in a more visual way + +00:40.480 --> 00:00:42.960 +this is our file in lua + +00:42.960 --> 00:00:45.760 +lua sees this thing as a as a multi-line + +00:45.760 --> 00:00:47.760 +comment but we are going to see it as a + +00:47.760 --> 00:00:51.920 +test block and eev mode is active and so + +00:51.920 --> 00:00:54.480 +f8 does the right thing + +00:54.480 --> 00:00:57.360 +uh these three lines here set up the + +00:57.360 --> 00:01:00.079 +target buffer running a lower apple you + +01:00.079 --> 00:01:03.520 +can see the the prompt of the rebel here + +01:03.520 --> 00:01:05.360 +and these lines here are sent to the + +01:05.360 --> 00:01:07.200 +rebel + +01:07.200 --> 00:01:09.680 +and when we type f8 on the line that + +01:09.680 --> 00:01:10.720 +starts + +01:10.720 --> 00:01:13.600 +with the red star like these lines here + +01:13.600 --> 00:01:15.759 +what if it does is that it sends the + +01:15.759 --> 00:01:18.240 +rest of the line sorry it + +01:18.240 --> 00:01:21.119 +executes the rest of the line as lisp + +01:21.119 --> 00:01:23.920 +so it executes the three effects here + +01:23.920 --> 00:01:26.240 +executes these lines as lisp and they + +01:26.240 --> 00:01:29.520 +set up the target buffer here + +01:29.520 --> 00:01:31.759 +and when we type f8 on the line that + +01:31.759 --> 00:01:34.159 +does not start with the red star + +01:34.159 --> 00:01:36.640 +the f8 sends the line to the target + +01:36.640 --> 00:01:38.799 +buffer and moves down + +01:38.799 --> 00:01:41.040 +and this line loads this file under + +01:41.040 --> 00:01:45.200 +apple and these lines are tests + +01:45.200 --> 00:01:47.520 +so we just saw how to use an existing + +01:47.520 --> 00:01:50.000 +test block let's now see how to create a + +01:50.000 --> 00:01:52.640 +new test block we just have to run this + +01:52.640 --> 00:01:55.680 +meta x e insert test block + +01:55.680 --> 00:01:58.079 +or meta x euat + +01:58.079 --> 00:02:01.439 +and the result depends on the major mode + +02:01.439 --> 00:02:03.920 +uh let's see let's understand that that + +02:03.920 --> 00:02:06.079 +by looking at the source code + +02:06.079 --> 00:02:08.720 +eeit is an alias to this function here + +02:08.720 --> 00:02:10.640 +and this function is just five lines of + +02:10.640 --> 00:02:12.800 +code plus a dot string + +02:12.800 --> 00:02:14.560 +and the dot string explains that if the + +02:14.560 --> 00:02:16.480 +major mode is full mode then this + +02:16.480 --> 00:02:18.800 +function tries to call + +02:18.800 --> 00:02:21.360 +a function called e insert test plot + +02:21.360 --> 00:02:24.800 +test full mode if that function exists + +02:24.800 --> 00:02:27.280 +and that if that function does not exist + +02:27.280 --> 00:02:29.680 +then it yields an error + +02:29.680 --> 00:02:32.080 +and here's an example of one such + +02:32.080 --> 00:02:34.239 +function that's a function that + +02:34.239 --> 00:02:37.280 +inserts a test block in haskell mode + +02:37.280 --> 00:02:40.319 +and here we can see two functions like + +02:40.319 --> 00:02:42.480 +this one for haskell mode and one for + +02:42.480 --> 00:02:46.080 +javascript mode + +02:46.080 --> 00:02:48.560 +uh these functions look quite similar + +02:48.560 --> 00:02:49.440 +but + +02:49.440 --> 00:02:52.720 +their effects look quite different + +02:52.720 --> 00:02:55.760 +to make this comparison here i started + +02:55.760 --> 00:02:57.280 +by writing + +02:57.280 --> 00:02:59.680 +by creating seven files each one in a + +02:59.680 --> 00:03:01.120 +different language + +03:01.120 --> 00:03:03.040 +and initially each one of these files + +03:03.040 --> 00:03:04.959 +only had a comment with the name of the + +03:04.959 --> 00:03:08.239 +language so c haskell javascript org + +03:08.239 --> 00:03:10.560 +mode etc + +03:10.560 --> 00:03:13.040 +and in each one of these files i typed + +03:13.040 --> 00:03:16.959 +meta x eeit to insert the test block + +03:16.959 --> 00:03:18.800 +so here we can see that these test + +03:18.800 --> 00:03:20.319 +blocks are different + +03:20.319 --> 00:03:22.080 +for example the syntax for multi-line + +03:22.080 --> 00:03:24.000 +comments is different depending on the + +03:24.000 --> 00:03:25.200 +language + +03:25.200 --> 00:03:27.760 +uh this block here that selects which + +03:27.760 --> 00:03:30.319 +rebel to run is also different + +03:30.319 --> 00:03:33.200 +this line here that shows how that + +03:33.200 --> 00:03:34.879 +tells the repo to + +03:34.879 --> 00:03:37.680 +load the current file is also different + +03:37.680 --> 00:03:39.680 +depending on the language + +03:39.680 --> 00:03:41.840 +in some cases i had to improvise a bit + +03:41.840 --> 00:03:43.360 +for example + +03:43.360 --> 00:03:46.400 +uh to implement test blocks in shell + +03:46.400 --> 00:03:48.560 +mode i had to use this + +03:48.560 --> 00:03:52.560 +this with syntax using a rear document + +03:52.560 --> 00:03:55.280 +in tcl i also had to improvise a bit and + +03:55.280 --> 00:03:57.840 +in some cases i had to improvise a lot + +03:57.840 --> 00:04:01.120 +for example in org mode there isn't an + +04:01.120 --> 00:04:03.360 +obvious rebel to run and there isn't an + +04:03.360 --> 00:04:05.280 +obvious way to load the + +04:05.280 --> 00:04:08.080 +the current org file into the repo so + +04:08.080 --> 00:04:11.680 +the default action of meta x eeit + +04:11.680 --> 00:04:14.400 +in log mode is just to insert this thing + +04:14.400 --> 00:04:15.439 +here + +04:15.439 --> 00:04:17.519 +that we can use to run a + +04:17.519 --> 00:04:22.320 +shell in a rebel + +04:22.320 --> 00:04:23.199 +so + +04:23.199 --> 00:04:25.680 +these functions are quite similar and in + +04:25.680 --> 00:04:27.440 +the beginning i was writing all of them + +04:27.440 --> 00:04:29.680 +by hand but then i got bored and i wrote + +04:29.680 --> 00:04:32.320 +a function to help you write functions + +04:32.320 --> 00:04:33.840 +like that + +04:33.840 --> 00:04:35.759 +this function is called + +04:35.759 --> 00:04:38.080 +find e-uit-links and it creates a + +04:38.080 --> 00:04:39.919 +temporary buffer + +04:39.919 --> 00:04:41.680 +and the contents of this temporary + +04:41.680 --> 00:04:43.440 +buffer depends on the major mode for + +04:43.440 --> 00:04:45.680 +example if the current mode is python + +04:45.680 --> 00:04:48.880 +mode then running this function here + +04:48.880 --> 00:04:51.840 +creates a temporary buffer that lets me + +04:51.840 --> 00:04:53.840 +write the support for + +04:53.840 --> 00:04:56.880 +test blocks into python mode or rewrite + +04:56.880 --> 00:04:59.040 +the function that supports test blocks + +04:59.040 --> 00:05:00.880 +and python mode + +05:00.880 --> 00:05:03.600 +so if i'm in python mode and i run this + +05:03.600 --> 00:05:06.639 +i get a temporary buffer like this + +05:06.639 --> 00:05:08.800 +in which this thing is my template for + +05:08.800 --> 00:05:11.120 +the function usually this thing is + +05:11.120 --> 00:05:13.039 +totally wrong i have to rewrite to this + +05:13.039 --> 00:05:13.919 +string + +05:13.919 --> 00:05:16.400 +but the rest is right you can see python + +05:16.400 --> 00:05:18.720 +mode here in the name of the function so + +05:18.720 --> 00:05:21.360 +we have to edit this and save that to + +05:21.360 --> 00:05:22.840 +our home + +05:22.840 --> 00:05:25.520 +slash.mx and by the way these things + +05:25.520 --> 00:05:28.880 +here hyperlinks to many different things + +05:28.880 --> 00:05:31.600 +this elias piper link here + +05:31.600 --> 00:05:34.160 +points to the source code to the section + +05:34.160 --> 00:05:35.280 +in which + +05:35.280 --> 00:05:36.400 +these + +05:36.400 --> 00:05:38.400 +functions are defined + +05:38.400 --> 00:05:40.320 +so you can see this here the function + +05:40.320 --> 00:05:41.759 +that supports c + +05:41.759 --> 00:05:43.440 +the function for haskell the function + +05:43.440 --> 00:05:46.400 +for javascript etc + +05:46.400 --> 00:05:49.440 +and that's it this is a five-minute talk + +05:49.440 --> 00:05:50.960 +so i can't say much + +05:50.960 --> 00:05:52.639 +if you want more information or if you + +05:52.639 --> 00:05:55.120 +want to see real world examples how i + +05:55.120 --> 00:05:58.000 +use test blocks etc etc see this page + +05:58.000 --> 00:06:00.479 +here and i do not have time to explain + +06:00.479 --> 00:06:02.560 +this by the way here + +06:02.560 --> 06:06.080 +so that's it thanks diff --git a/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt b/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt new file mode 100644 index 00000000..77133079 --- /dev/null +++ b/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt @@ -0,0 +1,622 @@ +WEBVTT + +00:03.040 -->00:00:05.206 +Hi, my name is Matthew Zeng, + +00:00:05.206 --> 00:00:07.526 +aka MT or Mingde. + +00:00:07.526 --> 00:00:10.766 +Welcome to EmacsConf2021. + +00:00:10.766 --> 00:00:12.846 +I hope everyone is enjoying + +00:00:12.846 --> 00:00:14.286 +the conference so far. + +00:00:14.286 --> 00:00:16.766 +I am one of the maintainers + +00:00:16.766 --> 00:00:18.566 +of the Emacs Application Framework. + +00:00:18.566 --> 00:00:22.606 +I was also here last year during EmacsConf2020 + +00:00:22.606 --> 00:00:24.366 +and did a 20 minute presentation + +00:00:24.366 --> 00:00:26.606 +on the overall architecture of EAF + +00:00:26.606 --> 00:00:28.486 +as well as a small demo. + +00:00:28.486 --> 00:00:31.966 +A lot of things had changed since 2020, + +00:00:31.966 --> 00:00:34.406 +and that's why today I'm here to present: + +00:00:34.406 --> 00:00:38.045 +Emacs Application Framework, A 2021 Update. + +00:00:38.046 --> 00:00:41.086 +So we all know Emacs, + +00:00:41.086 --> 00:00:42.326 +and we definitely know that + +00:00:42.326 --> 00:00:44.486 +Emacs is not just a text editor, + +00:00:44.486 --> 00:00:46.926 +but a text-centric work environment, + +00:00:46.926 --> 00:00:48.606 +and it lacks *efficient* + +00:00:48.606 --> 00:00:50.686 +multimedia rendering capabilities + +00:00:50.686 --> 00:00:53.126 +such as website, PDF, and video rendering. + +00:00:53.126 --> 00:00:55.361 +We all want that, right? + +00:00:55.361 --> 00:00:58.366 +Therefore the EAF project wants to + +00:00:58.366 --> 00:01:00.286 +solve this problem while also + +00:01:00.286 --> 00:01:02.806 +retaining the rich Emacs ecosystem + +00:01:02.806 --> 00:01:06.046 +and its customizability and extensibility. + +00:01:06.046 --> 00:01:10.726 +The solution is to outsource the hard part + +00:01:10.726 --> 00:01:12.486 +to Python and NodeJS + +00:01:12.486 --> 00:01:14.366 +by bridging Elisp with them + +00:01:14.366 --> 00:01:16.126 +so that Python and JavaScript + +00:01:16.126 --> 00:01:17.926 +can do the hard work + +00:01:17.926 --> 00:01:20.126 +and minimize the Elisp workload, + +00:01:20.126 --> 00:01:21.926 +which ultimately speeds up + +00:01:21.926 --> 00:01:24.446 +our end-user experience using Emacs. + +00:01:24.446 --> 00:01:27.646 +Do note that Python and JavaScript + +00:01:27.646 --> 00:01:30.406 +already have a very mature ecosystem + +00:01:30.406 --> 00:01:32.206 +that provides a foundation + +00:01:32.206 --> 00:01:34.366 +to modern multimedia applications, + +00:01:34.366 --> 00:01:38.006 +so basically, EAF enables Emacs to extend + +00:01:38.006 --> 00:01:40.406 +to Python and JavaScript ecosystems, + +00:01:40.406 --> 00:01:42.286 +therefore extending to + +00:01:42.286 --> 00:01:44.366 +modern multimedia apps too. + +00:01:44.366 --> 00:01:47.606 +As we're on a tight schedule today, + +00:01:47.606 --> 00:01:49.726 +I can't go into every detail + +00:01:49.726 --> 00:01:51.486 +about how EAF achieves this. + +00:01:51.486 --> 00:01:53.606 +I did go through a lot of things + +00:01:53.606 --> 00:01:54.886 +during last year's presentation, + +00:01:54.886 --> 00:01:57.326 +so I highly recommend anyone interested + +00:01:57.326 --> 00:01:59.206 +to check out that presentation, + +00:01:59.206 --> 00:02:01.686 +and the project repository itself. + +00:02:01.686 --> 00:02:05.725 +Today we're focusing on *what changed*. + +00:02:05.726 --> 00:02:09.606 +Now the first change + +00:02:09.606 --> 00:02:10.926 +that you'll definitely notice + +00:02:10.926 --> 00:02:12.686 +is that we have a new logo! + +00:02:12.686 --> 00:02:15.926 +This logo uses gearwheels + +00:02:15.926 --> 00:02:18.486 +to symbolize how EAF extends Emacs + +00:02:18.486 --> 00:02:20.886 +to web and multimedia applications + +00:02:20.886 --> 00:02:23.286 +that bring new possibilities to Emacs. + +00:02:23.286 --> 00:02:28.726 +Since last year, EAF has replaced + +00:02:28.726 --> 00:02:30.886 +the DBus communication technology + +00:02:30.886 --> 00:02:33.446 +with the cross-platform EPC, + +00:02:33.446 --> 00:02:35.286 +the Emacs RPC stack, + +00:02:35.286 --> 00:02:37.526 +which has an Elisp implementation + +00:02:37.526 --> 00:02:39.246 +and a Python implementation, + +00:02:39.246 --> 00:02:41.006 +exactly what we need. + +02:42.160 --> 00:02:43.760 +This and some other changes + +00:02:43.760 --> 00:02:46.080 +enable EAF to support Windows, + +00:02:46.080 --> 00:02:49.519 +Windows 10 and Windows Subsystem for Linux, + +00:02:49.519 --> 00:02:51.840 +as well as all distros that support + +00:02:51.840 --> 00:02:54.319 +pacman, apt, dnf, pkg, + +00:02:54.319 --> 00:02:56.959 +zypper package installer commands, + +02:56.959 --> 00:02:59.840 +which includes Arch-based, Debian, + +00:02:59.840 --> 00:03:04.720 +or Ubuntu-based, Fedora, etc. + +03:04.720 --> 00:03:08.239 +However, do note that the maOS support + +03:08.239 --> 00:03:10.319 +works with some known issues. + +00:03:10.319 --> 00:03:15.359 +Have a look if you want to try out. + +03:15.360 --> 00:03:18.400 +Previously, EAF was able to make Elisp + +03:18.400 --> 00:03:20.720 +communicate with Python, as well as + +00:03:20.720 --> 00:03:23.280 +Python to communicate with JavaScript, + +03:23.280 --> 00:03:24.959 +meaning that Elisp can call + +00:03:24.959 --> 00:03:27.280 +Python functions and vice versa, + +00:03:27.280 --> 00:03:29.680 +and Python can call JavaScript functions + +00:03:29.680 --> 00:03:32.560 +and vice versa, but if you want Elisp + +00:03:32.560 --> 00:03:34.720 +to communicate with JavaScript, + +00:03:34.720 --> 00:03:36.239 +you have to go through Python, + +00:03:36.239 --> 00:03:38.879 +which is rather troublesome. + +03:38.879 --> 00:03:41.120 +Now, thanks to the EPC, + +00:03:41.120 --> 00:03:42.400 +Elisp can communicate + +00:03:42.400 --> 00:03:43.840 +with JavaScript directly + +03:43.840 --> 00:03:45.519 +using =eval_js= function + +00:03:45.519 --> 00:03:47.040 +and =eval_emacs_function= + +00:03:47.040 --> 00:03:49.840 +in Elisp and Python respectively. + +03:49.840 --> 00:03:51.840 +This greatly simplifies the code + +00:03:51.840 --> 00:03:52.640 +that will be needed + +00:03:52.640 --> 00:03:56.958 +to write a web app in EAF. + +03:56.959 --> 00:03:59.120 +Speaking of web applications, + +00:03:59.120 --> 00:04:01.200 +VueJS is a web framework + +00:04:01.200 --> 00:04:03.840 +that's been gaining a lot of popularity + +00:04:03.840 --> 00:04:04.720 +in recent years + +00:04:04.720 --> 00:04:08.959 +for its simplicity and functionality. + +04:08.959 --> 00:04:11.840 +In the past, you were only able to write + +04:11.840 --> 00:04:14.319 +simple JavaScript and HTML web apps + +00:04:14.319 --> 00:04:17.280 +for EAF. It was quite some work + +04:17.280 --> 00:04:20.880 +to create a full-featured web application. + +04:20.880 --> 00:04:23.360 +Now you can write new apps using EAF + +04:23.360 --> 00:04:27.919 +that work seamlessly with Emacs and Elisp. + +00:04:27.919 --> 00:04:30.880 +There are a few existing EAF apps + +04:30.880 --> 00:04:32.800 +written with Vue already + +04:32.800 --> 00:04:34.639 +to demonstrate the possibilities + +00:04:34.639 --> 00:04:38.720 +of Vue-based extensions in Emacs. + +04:38.720 --> 00:04:41.520 +The first one is the EAF File Manager, + +04:41.520 --> 00:04:44.160 +written by ManateeLazycat himself, + +00:04:44.160 --> 00:04:46.400 +as an alternative option to dired, + +00:04:46.400 --> 00:04:47.919 +as he found dired's performance + +00:04:47.919 --> 00:04:49.280 +to lag considerably + +04:49.280 --> 00:04:52.240 +when there are way too many files. + +04:52.240 --> 00:04:56.080 +It supports wdired and fd functionality, + +00:04:56.080 --> 00:05:01.600 +and let me demonstrate that to you. + +05:01.600 --> 00:05:06.160 +See? And this is the app. + +05:06.160 --> 00:05:08.639 +Go back here. + +05:08.639 --> 00:05:12.240 +Another one is the EAF RSS Reader, + +05:12.240 --> 00:05:15.039 +written by our Summer of Code 2021 student + +00:05:15.039 --> 00:05:18.240 +ShaoChenHeng. It is a fast RSS reader + +00:05:18.240 --> 00:05:21.600 +that uses the EAF browser for previews, + +05:21.600 --> 00:05:32.479 +and let me demo that to you as well. + +05:32.479 --> 00:05:35.039 +Pragmatic Emacs. + +05:35.039 --> 00:05:37.199 +And you can view every site + +00:05:37.199 --> 00:05:45.359 +in the EAF Browser. + +05:45.360 --> 00:05:46.880 +To ease the process + +00:05:46.880 --> 00:05:49.840 +of creating a new EAF application, + +00:05:49.840 --> 00:05:52.880 +we've separated the EAF core and its apps, + +00:05:52.880 --> 00:05:54.479 +so that EAF apps now have + +00:05:54.479 --> 00:05:56.800 +their individual repositories. + +00:05:56.800 --> 00:05:58.000 +You can find them under + +00:05:58.000 --> 00:06:02.000 +the emacs-eaf GitHub organization. + +06:02.000 --> 00:06:04.560 +Because of the number of EAF apps + +00:06:04.560 --> 00:06:05.840 +and their dependencies + +00:06:05.840 --> 00:06:08.319 +that vary from system to system, + +06:08.319 --> 00:06:10.080 +we've also introduced a new + +00:06:10.080 --> 00:06:12.639 +=M-x eaf-install-and-update= command + +00:06:12.639 --> 00:06:14.560 +which is a wrapper around the new + +00:06:14.560 --> 00:06:17.039 +install-eaf python script + +00:06:17.039 --> 00:06:19.280 +dedicated to installing, updating, + +00:06:19.280 --> 00:06:20.720 +and maintaining EAF apps + +00:06:20.720 --> 00:06:21.680 +and their dependencies + +00:06:21.680 --> 00:06:24.160 +for the end user. + +06:24.160 --> 00:06:25.600 +Now it is very easy + +00:06:25.600 --> 00:06:27.440 +to create a new EAF app. + +00:06:27.440 --> 00:06:29.039 +You just need to do it. + +00:06:29.039 --> 00:06:31.120 +You can just do it in your own repository, + +00:06:31.120 --> 00:06:34.720 +such as in GitHub, GitLab, or wherever. + +06:34.720 --> 00:06:36.160 +The first thing to do is + +00:06:36.160 --> 00:06:39.520 +to fork the eaf-demo or the eaf-vue-demo + +00:06:39.520 --> 00:06:41.280 +as a starting template, + +00:06:41.280 --> 00:06:43.520 +then update the dependencies.json file + +00:06:43.520 --> 00:06:46.400 +to list the new dependencies you introduced + +06:46.400 --> 00:06:48.560 +on various systems. + +06:48.560 --> 00:06:51.199 +Afterwards, once your app is finished, + +00:06:51.199 --> 00:06:53.039 +you simply need to submit a PR + +00:06:53.039 --> 00:06:54.000 +to the EAF core + +06:54.000 --> 00:06:56.720 +that modifies the applications.json list + +06:56.720 --> 00:07:03.039 +to include your new app. And that's it. + +07:03.039 --> 00:07:04.720 +Come try it out and write your own + +00:07:04.720 --> 00:07:09.598 +EAF extensions today! + +07:09.599 --> 00:07:11.840 +There are many other new updates. + +00:07:11.840 --> 00:07:13.919 +To list a few: we reached + +00:07:13.919 --> 00:07:17.199 +more than 60 contributors, hooray! + +07:17.199 --> 00:07:19.759 +And also, you can now use the familiar + +07:19.759 --> 00:07:22.160 +Control s and Control r isearch + +00:07:22.160 --> 00:07:23.280 +for real-time search, + +00:07:23.280 --> 00:07:24.560 +functioning very similar + +00:07:24.560 --> 00:07:27.039 +to the Emacs isearch, + +07:27.039 --> 00:07:29.759 +in the EAF Browser, PDF Viewer, + +00:07:29.759 --> 00:07:32.080 +and many other applications. + +07:32.080 --> 00:07:34.000 +Additionally, you can also create + +00:07:34.000 --> 00:07:35.680 +EAF PDF annotations + +00:07:35.680 --> 00:07:44.318 +either inline or as a pop-up, etc. etc. etc. + +07:44.319 --> 00:07:47.680 +Finally, let's talk about Popweb. + +07:47.680 --> 00:07:50.080 +Popweb is a very, very new project + +00:07:50.080 --> 00:07:52.639 +that started like exactly two weeks ago, + +00:07:52.639 --> 00:07:55.199 +that focuses particularly on the + +00:07:55.199 --> 00:07:55.919 +multimedia pop-up functionality in Emacs. + +00:07:55.919 --> 00:08:02.080 +Pop is considered to be a sister project + +00:08:02.080 --> 00:08:04.879 +and lightweight version of EAF. + +08:04.879 --> 00:08:07.039 +They both share a very similar design + +08:07.039 --> 00:08:09.039 +and some code, and they are maintained + +00:08:09.039 --> 00:08:10.080 +by the same people, + +00:08:10.080 --> 00:08:13.680 +which is me and ManateeLazycat. + +08:13.680 --> 00:08:15.599 +Here's a quick demo to see the + +08:15.599 --> 00:08:23.840 +responsiveness of its preview. + +08:23.840 --> 00:08:27.919 +Here we go. On the right, see... + +00:08:27.919 --> 00:08:30.720 +Oh, here we go. Yes. + +08:30.720 --> 00:08:32.560 +And these are the LaTeX preview. + +00:08:32.560 --> 00:08:44.800 +I can quickly show the next one. + +08:44.800 --> 00:08:48.160 +So this is the end of my presentation. + +08:48.160 --> 00:08:50.000 +Feel free to post questions + +00:08:50.000 --> 00:08:52.160 +on the collaborative pad, IRC, + +00:08:52.160 --> 00:08:53.519 +or directly send me an email. + +00:08:53.519 --> 00:08:55.680 +I'll be around all this, + +00:08:55.680 --> 00:08:57.839 +at all these places, + +08:57.839 --> 00:08:59.519 +and if you found any issue, + +00:08:59.519 --> 00:09:01.200 +please submit an issue + +00:09:01.200 --> 00:09:04.160 +to the EAF official issues, + +00:09:04.160 --> 00:09:08.880 +and don't forget to check out the wiki. + +09:08.880 --> 00:09:10.160 +Thank you and enjoy + +00:09:10.160 --> 00:09:13.680 +the rest of EmacsConf 2021. + +00:09:13.680 --> 00:09:14.680 +[captions by sachac] diff --git a/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt b/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt new file mode 100644 index 00000000..083f2278 --- /dev/null +++ b/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt @@ -0,0 +1,820 @@ +WEBVTT + +00:00.240 --> 00:00:02.320 +Hello, everyone, my name is Spencer, + +00:00:02.320 --> 00:00:03.600 +and today I'm going to tell you all + +00:00:03.600 --> 00:00:05.296 +a little bit about how to typeset + +00:00:05.296 --> 00:00:06.640 +Gregorian chant sheet music + +00:00:06.640 --> 00:00:10.000 +using Emacs and a tool called Gregorio. + +00:10.000 --> 00:00:12.160 +Now I expect many, if not all, of you + +00:00:12.160 --> 00:00:14.000 +are unfamiliar with Gregorio, + +00:00:14.000 --> 00:00:14.719 +so we'll start off + +00:00:14.719 --> 00:00:16.240 +with a brief overview of the tool + +00:16.240 --> 00:18.080 +and the appropriate syntax. + +00:18.080 --> 00:19.760 +Next, I'll show you how I've automated + +00:19.760 --> 00:00:20.720 +some of the workflow + +00:00:20.720 --> 00:00:22.480 +using some Emacs Lisp functions + +00:00:22.480 --> 00:00:23.920 +which I've slowly been turning into + +00:00:23.920 --> 00:00:26.080 +a package called `gregorian-mode`. + +00:26.080 --> 00:00:26.720 +This will include + +00:00:26.720 --> 00:00:28.320 +some live typesetting examples + +00:00:28.320 --> 00:00:29.359 +to give you a better idea + +00:00:29.359 --> 00:00:31.279 +of how this all works. + +00:31.279 --> 00:00:32.079 +Finally, I'll share + +00:00:32.079 --> 00:00:33.120 +some information with you + +00:00:33.120 --> 00:00:34.480 +about how you can contribute + +00:34.480 --> 00:00:35.680 +to the package if you'd like, + +00:00:35.680 --> 00:00:38.000 +and how you can learn more about + +00:38.000 --> 00:39.600 +both Gregorio and `gregorian-mode`. + +00:39.600 --> 00:00:41.120 +And of course, all of the examples + +00:00:41.120 --> 00:00:42.320 +from this presentation today + +00:00:42.320 --> 00:00:44.079 +have been available online + +00:00:44.079 --> 00:00:44.879 +so you can review them + +00:00:44.879 --> 00:00:46.800 +all at your own pace. + +00:46.800 --> 00:49.440 +Gregorio is a tool that takes + +00:49.440 --> 00:51.500 +a `gabc` text file and compiles it + +00:51.500 --> 00:52.879 +into a LaTeX document. + +00:52.879 --> 00:00:54.719 +Gregorio is included by default + +00:00:54.719 --> 00:00:56.559 +with many LaTeX distributions, + +00:00:56.559 --> 00:00:58.079 +so you may already have it installed + +00:00:58.079 --> 00:01:01.120 +on your machine if you are a user of LaTeX. + +01:01.120 --> 01:02.879 +You can see here on the left an example + +01:02.879 --> 00:01:04.960 +of some input `gabc` text, + +00:01:04.960 --> 00:01:05.600 +and on the right, + +00:01:05.600 --> 00:01:08.080 +what the compiled score will look like. + +01:08.080 --> 01:10.080 +Looking at the `gabc`, we can see that + +01:10.080 --> 01:12.640 +it starts with the clef in parentheses, + +01:12.640 --> 00:01:13.600 +and then following this + +00:01:13.600 --> 00:01:15.119 +are the syllables of the lyrics + +00:01:15.119 --> 00:01:18.080 +and the corresponding notes in parentheses. + +01:18.080 --> 01:21.119 +For example, you can see that "EX," + +01:21.119 --> 00:01:22.240 +the first syllable, + +00:01:22.240 --> 00:01:24.080 +corresponds to a `d` note + +00:01:24.080 --> 00:01:25.920 +in parentheses there, + +00:01:25.920 --> 00:01:27.119 +and if you look at the right, + +00:01:27.119 --> 00:01:28.560 +you can easily verify that + +00:01:28.560 --> 00:01:30.320 +in the output. + +01:30.320 --> 00:01:31.040 +Now the last thing + +00:01:31.040 --> 00:01:31.680 +that I want to note here + +01:31.680 --> 01:34.079 +is that `gabc` files are all plain text, + +01:34.079 --> 01:36.320 +meaning they can easily be shared + +01:36.320 --> 01:38.000 +and can easily be tracked using + +01:38.000 --> 01:40.400 +your favorite version-control software. + +01:40.400 --> 01:41.920 +Since these are plain text, + +01:41.920 --> 01:43.520 +it's really pretty easy to integrate + +01:43.520 --> 01:46.079 +them into your existing workflows. + +01:46.079 --> 00:01:48.079 +The `gabc` format also supports + +00:01:48.079 --> 00:01:49.439 +many optional header fields + +00:01:49.439 --> 00:01:50.560 +for adding more information + +00:01:50.560 --> 00:01:51.920 +about your score. + +01:51.920 --> 01:53.520 +You can see all the supported fields + +01:53.520 --> 00:01:54.799 +listed below, along with + +00:01:54.799 --> 00:01:56.479 +some placeholder text. + +01:56.479 --> 00:01:57.360 +These fields are placed + +00:01:57.360 --> 00:01:58.399 +at the top of a file + +00:01:58.399 --> 00:02:01.000 +and are separated from the actual score + +02:01.000 --> 00:02:01.439 +by the two percent symbols + +00:02:01.439 --> 00:02:03.000 +seen at the bottom. + +02:03.000 --> 02:04.399 +After these symbols, you would have the + +02:04.399 --> 00:02:05.600 +lines of your score, + +00:02:05.600 --> 00:02:07.080 +similar to what you saw + +00:02:07.080 --> 00:02:08.560 +on the previous slide. + +02:08.560 --> 00:02:09.599 +As I said earlier, + +00:02:09.599 --> 00:02:10.560 +I've automated some of + +02:10.560 --> 02:12.959 +the score build steps using Emacs Lisp, + +02:12.959 --> 00:02:14.000 +and have started turning them + +00:02:14.000 --> 00:02:16.480 +into a package called `gregorian-mode`. + +02:16.480 --> 00:02:18.160 +This is my first Emacs package, + +00:02:18.160 --> 00:02:20.400 +so the code is rather messy at the moment, + +00:02:20.400 --> 00:02:22.160 +and for the most part is just a wrapper + +02:22.160 --> 02:24.319 +around the Gregorio build process. + +02:24.319 --> 00:02:25.536 +However, I have made some + +00:02:25.536 --> 00:02:26.720 +quality-of-life improvements + +00:02:26.720 --> 00:02:27.920 +to the score writing, + +00:02:27.920 --> 00:02:30.239 +and have some more planned for the future. + +02:30.239 --> 00:02:31.360 +You'll get to see some of that + +00:02:31.360 --> 00:02:32.480 +in some live examples + +00:02:32.480 --> 00:02:34.319 +in just a little bit. + +02:34.319 --> 02:36.000 +This package is not currently on MELPA + +02:36.000 --> 00:02:37.760 +at the time of recording, + +00:02:37.760 --> 00:02:38.640 +so if you want it, + +00:02:38.640 --> 00:02:40.000 +you will have to clone it manually + +00:02:40.000 --> 00:02:41.920 +from GitHub, but it is planned + +02:41.920 --> 02:44.080 +to be on MELPA in the near future. + +02:44.080 --> 00:02:44.959 +It just needs to go through + +00:02:44.959 --> 00:02:46.400 +a little more rigorous cleanup + +00:02:46.400 --> 00:02:48.640 +and testing. + +02:48.640 --> 02:50.400 +Now that we've covered the basics, + +02:50.400 --> 02:52.560 +let's take a look at an actual example. + +02:52.560 --> 02:54.319 +In this example, I'm assuming that + +02:54.319 --> 02:56.480 +my `gregorian-mode` package is installed. + +02:56.480 --> 02:57.920 +However, there is nothing in these steps + +02:57.920 --> 00:02:59.200 +that cannot be done manually + +00:02:59.200 --> 00:03:01.120 +by just following the official + +03:01.120 --> 03:02.480 +Gregorio documentation. + +03:02.480 --> 03:04.000 +So if you don't want to use a package, + +03:04.000 --> 03:05.840 +you can do all of this pretty easily + +03:05.840 --> 03:07.280 +on your own just by following + +03:07.280 --> 03:10.000 +their documentation. + +03:10.000 --> 00:03:11.680 +So first we'll open up Emacs, + +00:03:11.680 --> 00:03:12.480 +and in my case, + +00:03:12.480 --> 00:03:14.560 +I'm using the GUI version. + +03:14.560 --> 03:16.640 +So now that Emacs is open, we can call + +03:16.640 --> 03:21.440 +the function `gregorian-create-new-gabc`, + +03:21.440 --> 03:23.680 +and this will prompt us for a file name. + +03:23.680 --> 03:25.599 +So we need to pick out a name + +03:25.599 --> 03:26.799 +for our new score. + +03:26.799 --> 00:03:28.239 +So I think I'm going to go ahead + +00:03:28.239 --> 00:03:33.280 +and name ours `emacsconf2021`. + +03:33.280 --> 03:34.959 +So you can see here that we now have + +03:34.959 --> 00:03:36.879 +a new `gabc` file with all of the + +00:03:36.879 --> 00:03:38.720 +optional header fields added, + +00:03:38.720 --> 00:03:40.400 +and we can keep whichever of these + +00:03:40.400 --> 00:03:41.120 +that we would like, + +03:41.120 --> 03:43.200 +and we can modify them as needed. + +03:43.200 --> 03:45.360 +So for right now, all I'm going to change + +03:45.360 --> 03:47.360 +is this commentary; I'm going to update + +03:47.360 --> 00:03:52.560 +this source of words to `emacsconf`, + +03:52.560 --> 00:03:53.760 +and then at the bottom here, + +00:03:53.760 --> 00:03:55.040 +this is where we'd go ahead + +00:03:55.040 --> 00:03:56.959 +and add our score. + +03:56.959 --> 03:58.799 +So I don't have time today to typeset + +03:58.799 --> 04:01.040 +an entire score, and I think that would + +04:01.040 --> 00:04:02.239 +probably be rather boring + +00:04:02.239 --> 00:04:03.760 +for most of you to watch, + +00:04:03.760 --> 00:04:05.680 +so I'll just demonstrate very briefly + +00:04:05.680 --> 00:04:08.500 +with a few syllables and notes here. + +04:15.840 --> 04:17.680 +Okay, so now that we have our first few + +04:17.680 --> 04:19.840 +syllables and notes down, let's take a + +04:19.840 --> 04:21.759 +look at what our score actually looks + +04:21.759 --> 04:23.520 +like so far. + +04:23.520 --> 04:25.040 +So in order to do this, we're going to + +04:25.040 --> 04:29.600 +call the function `gregorian-build`, + +04:29.600 --> 00:04:31.199 +and what this function does is + +00:04:31.199 --> 00:04:32.320 +it takes this score + +00:04:32.320 --> 00:04:33.680 +and creates a LaTeX file for it + +04:33.680 --> 04:36.080 +and then goes ahead and compiles it + +04:36.080 --> 04:38.160 +into a PDF file that we can actually + +04:38.160 --> 04:39.840 +take a look at. + +04:39.840 --> 04:42.479 +And this does take a few seconds to run... + +04:42.479 --> 04:44.320 +and there it goes... + +04:44.320 --> 04:47.040 +so we can see here we have a new buffer + +04:47.040 --> 04:48.560 +with all of the output + +04:48.560 --> 04:50.320 +from that build process, + +04:50.320 --> 00:04:51.840 +but what we really care about + +00:04:51.840 --> 00:04:54.000 +is that PDF. + +04:56.080 --> 04:58.479 +So opening that up, you can see + +04:58.479 --> 05:00.560 +we have a very short score. + +05:00.560 --> 05:02.320 +So far we haven't done a whole lot, + +05:02.320 --> 05:03.919 +but if you go ahead and compare the + +05:03.919 --> 05:05.000 +score on the right + +05:05.000 --> 05:06.479 +with the file on the left, + +05:06.479 --> 05:08.080 +you can really pretty clearly see that + +05:08.080 --> 05:10.080 +those are, in fact, the lyrics + +05:10.080 --> 05:11.199 +that we wrote. + +05:11.199 --> 05:13.280 +You can see at the top right there, + +05:13.280 --> 05:14.300 +the source has, in fact, + +05:14.300 --> 05:16.000 +changed to `emacsconf` + +05:16.000 --> 00:05:18.240 +so at this point, we could go ahead + +00:05:18.240 --> 00:05:20.000 +and just keep adding more lines, + +00:05:20.000 --> 00:05:22.240 +more notes, and so on, + +05:22.240 --> 05:24.080 +and we would end up with + +05:24.080 --> 05:25.919 +a completed score. + +05:25.919 --> 00:05:27.919 +Now this process is great and all, + +00:05:27.919 --> 00:05:29.120 +but as you can imagine, + +00:05:29.120 --> 00:05:30.880 +more complex `gabc` files + +05:30.880 --> 05:32.720 +can quickly become pretty difficult + +05:32.720 --> 05:34.479 +to read with the notes and the syllables + +05:34.479 --> 05:36.080 +all bunched together. + +05:36.080 --> 05:37.840 +So to get around this, I've been playing + +05:37.840 --> 05:39.840 +around with an alternative format + +05:39.840 --> 05:41.000 +called a `greg` file. + +05:41.000 --> 05:42.160 +I have an example of that + +05:42.160 --> 05:43.919 +for you right here. + +05:43.919 --> 05:45.919 +So here we can see there are + +05:45.919 --> 05:48.000 +two files side-by-side: + +05:48.000 --> 05:50.000 +on the left, we have a `gabc` file, + +05:50.000 --> 00:05:51.022 +and then on the right, + +00:05:51.022 --> 00:05:52.000 +we have a `greg` file, + +05:52.000 --> 05:53.360 +both of them for the same score. + +05:53.360 --> 05:55.600 +Now in my opinion, the `gabc` on the left + +05:55.600 --> 00:05:57.199 +is really rather difficult to read + +00:05:57.199 --> 00:05:58.319 +at a glance. + +00:05:58.319 --> 00:05:59.280 +You can see there + +00:05:59.280 --> 00:06:00.880 +the notes and the syllables + +00:06:00.880 --> 00:06:02.160 +are really all grouped together + +00:06:02.160 --> 00:06:03.919 +pretty tightly. + +06:03.919 --> 00:06:05.520 +Looking at the `greg` on the right, + +00:06:05.520 --> 00:06:06.560 +you can see that all of the + +00:06:06.560 --> 00:06:08.479 +header information is the same, + +00:06:08.479 --> 00:06:09.680 +but the score itself + +00:06:09.680 --> 00:06:11.840 +is split across several lines. + +06:11.840 --> 00:06:13.039 +The idea here is that + +00:06:13.039 --> 00:06:15.039 +the notes and the corresponding syllables + +00:06:15.039 --> 00:06:16.560 +will be on separate lines, + +00:06:16.560 --> 00:06:17.600 +one after the other, + +06:17.600 --> 06:20.639 +to help improve readability. + +06:20.639 --> 00:06:21.906 +Now the `greg` file format + +00:06:21.906 --> 00:06:23.800 +is still a work-in-progress. + +06:23.800 --> 06:24.960 +It's really not + +06:24.960 --> 06:27.520 +set in stone at all, + +06:27.520 --> 06:29.840 +but already I think this is a pretty + +06:29.840 --> 06:32.560 +substantial quality-of-life improvement, + +06:32.560 --> 06:34.720 +and already `gregorian-mode` can, in fact, + +06:34.720 --> 00:06:36.720 +build scores from `greg` files + +00:06:36.720 --> 00:06:38.300 +as long as they follow the conventions + +06:38.300 --> 06:40.400 +that you see in this file here, + +06:40.400 --> 00:06:42.560 +and I'm planning to have that + +00:06:42.560 --> 00:06:44.240 +quite a bit more well-defined + +00:06:44.240 --> 00:06:45.360 +moving forward. + +06:45.360 --> 06:47.360 +Like I said, this is really still + +06:47.360 --> 06:49.520 +a work-in-progress. + +06:49.520 --> 00:06:51.039 +Finally, I want to end today + +00:06:51.039 --> 00:06:52.319 +by sharing some resources + +00:06:52.319 --> 00:06:53.840 +where you can learn more. + +06:53.840 --> 00:06:55.039 +First, you can learn more about + +00:06:55.039 --> 00:06:56.319 +the Gregorio project + +00:06:56.319 --> 00:06:57.500 +on their official website, + +06:57.500 --> 06:58.960 +and I have the link for that + +06:58.960 --> 07:00.720 +on this slide here, + +07:00.720 --> 07:02.319 +and this site has several detailed examples + +07:02.319 --> 07:04.080 +and a lot of additional information + +07:04.080 --> 00:07:05.840 +about the project + +00:07:05.840 --> 00:07:07.500 +and about chant notation in general. + +07:07.500 --> 07:09.500 +It goes into much more depth + +07:09.500 --> 00:07:12.000 +than what we covered in this presentation, + +00:07:12.000 --> 00:07:13.199 +and overall, it's really + +00:07:13.199 --> 00:07:14.960 +a fantastic resource + +07:14.960 --> 07:16.560 +for learning more about how to use + +07:16.560 --> 07:19.360 +the Gregorio software and more about + +07:19.360 --> 07:21.840 +the specifics of chant notation. + +07:21.840 --> 00:07:23.680 +Second, if you're interested in using + +00:07:23.680 --> 00:07:25.840 +or contributing to `gregorian-mode`, + +00:07:25.840 --> 00:07:28.240 +you can check out the project on GitHub + +07:28.240 --> 07:30.400 +with the link here on this slide. + +07:30.400 --> 07:31.919 +And if you're interested in helping out + +07:31.919 --> 07:34.080 +in any way, feel free to open an issue, + +07:34.080 --> 07:36.560 +and we can discuss further. + +07:36.560 --> 00:07:38.160 +And finally, all of the examples + +00:07:38.160 --> 00:07:40.400 +from today are also available on GitHub, + +07:40.400 --> 07:42.479 +and that's the last link on this slide, + +07:42.479 --> 07:44.160 +and you can feel free to experiment + +07:44.160 --> 07:45.919 +with these and really just use them + +07:45.919 --> 07:48.560 +in any way that you'd like. + +07:48.560 --> 07:50.319 +Now that's all that I had for today, + +07:50.319 --> 00:07:51.360 +but I do want to take a moment + +00:07:51.360 --> 00:07:52.000 +to thank you all + +07:52.000 --> 07:54.160 +for checking out my presentation, + +07:54.160 --> 07:55.680 +and I want to thank the organizers + +07:55.680 --> 00:07:56.400 +for giving me some time + +00:07:56.400 --> 00:07:57.759 +to speak with you all. + +07:57.759 --> 00:07:59.120 +I hope that this was at least + +00:07:59.120 --> 00:08:01.120 +a little bit interesting to some of you, + +00:08:01.120 --> 00:08:02.319 +and I hope that you all enjoy + +00:08:02.319 --> 00:08:02.800 +the rest of the conference. + +08:02.800 --> 00:08:06.520 +Thank you for your time today. + +00:08:06.520 --> 00:08:07.520 +[captions by Hannah Miller] diff --git a/2021/captions/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt b/2021/captions/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt new file mode 100644 index 00000000..7e9e4bb8 --- /dev/null +++ b/2021/captions/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt @@ -0,0 +1,1780 @@ +WEBVTT + +00:01.520 --> 00:04.400 +Hello, my name is Stefan Monnier, + +00:04.400 --> 00:06.799 +and I'm going to talk to you about-- + +00:06.799 --> 00:08.240 +well, I'm going to present a bit + +00:08.240 --> 00:11.840 +of the life of a janitor. + +00:11.840 --> 00:14.050 +So by and large, there's just + +00:14.050 --> 00:16.299 +nothing to see here, + +00:16.299 --> 00:17.199 +and that's probably + +00:17.199 --> 00:18.240 +not super interesting, + +00:18.240 --> 00:19.920 +but some of you might actually like to + +00:19.920 --> 00:00:23.050 +see how I work, so I figured why not. + +00:25.359 --> 00:27.279 +Usually what I do just doesn't make any + +00:27.279 --> 00:00:29.920 +any significant difference, + +00:00:29.920 --> 00:00:32.160 +and so I basically take existing code + +00:00:32.160 --> 00:00:35.040 +that's working, and I try to change it + +00:00:35.040 --> 00:00:37.680 +hopefully without breaking it too much + +00:00:37.680 --> 00:00:40.079 +and make it slightly more... + +00:40.079 --> 00:42.719 +you know, following some of the more + +00:42.719 --> 00:44.640 +modern style, let's say, + +00:44.640 --> 00:00:46.719 +and sometimes along the way, + +00:00:46.719 --> 00:00:50.399 +it actually fixes some bugs. + +00:50.399 --> 00:00:51.983 +More concretely, the kind of things + +00:00:51.983 --> 00:00:54.079 +that I do is basically activate + +00:00:54.079 --> 00:00:54.480 +lexical scoping-- + +00:54.480 --> 00:56.239 +that's really my main goal usually-- + +00:56.239 --> 00:58.960 +but also do things like convert + +00:58.960 --> 00:01:00.719 +from `cl` to `cl-lib`, + +00:01:00.719 --> 00:01:01.440 +sometimes I have to + +01:01.440 --> 01:03.760 +fix some compilation dependencies, + +01:03.760 --> 01:07.280 +I might convert from `defadvice` to `advice-add`, + +01:07.280 --> 01:11.439 +and many of the things-- + +01:11.439 --> 00:01:13.119 +in terms of number of changes, + +00:01:13.119 --> 00:01:14.000 +most of them are actually + +00:01:14.000 --> 00:01:16.560 +changing `quote fun` to `hash quote fun` + +00:01:16.560 --> 00:01:17.360 +because I prefer it, + +01:17.360 --> 00:01:19.920 +but also it often helps me + +00:01:19.920 --> 00:01:21.439 +have a better understanding + +00:01:21.439 --> 00:01:23.920 +of which function is called where, + +01:23.920 --> 01:26.799 +and so the warnings I get from it + +01:26.799 --> 01:28.799 +sometimes help me. You look concretely... + +01:28.799 --> 00:01:30.880 +it's not nothing really clear; + +00:01:30.880 --> 00:01:33.360 +it's more in terms of helping me + +00:01:33.360 --> 00:01:35.759 +have a mental image + +00:01:35.759 --> 00:01:39.439 +of how the package works. + +01:39.439 --> 01:42.880 +So let's take a look. + +01:42.880 --> 00:01:45.840 +I'm going to start with + +00:01:45.840 --> 00:01:46.799 +the package `heap`, + +00:01:46.799 --> 00:01:50.560 +which I saw had a few weird things in it, + +00:01:50.560 --> 00:01:53.680 +so I'm going to compile it. + +01:53.680 --> 01:55.600 +That's basically the way the way I work, + +01:55.600 --> 00:01:57.840 +right. I take a package. + +00:01:57.840 --> 00:02:00.479 +I just pass it to the byte compiler. + +00:02:00.479 --> 00:02:02.159 +I do that by just having + +02:02.159 --> 02:04.560 +a clone of the whole + +02:04.560 --> 00:02:06.799 +GNU ELPA repository, + +00:02:06.799 --> 00:02:10.000 +and so that's why I built them. + +02:10.000 --> 02:11.520 +I use the build rules + +02:11.520 --> 02:15.120 +from the GNU ELPA repository. + +02:15.120 --> 00:02:16.720 +These build rules enforce-- + +00:02:16.720 --> 00:02:17.680 +make sure that the files + +00:02:17.680 --> 00:02:19.680 +are compiled in a clean environment + +00:02:19.680 --> 00:02:21.920 +so you get fairly good warnings. + +00:02:21.920 --> 00:02:23.680 +If you look at the warnings you see here, + +00:02:23.680 --> 00:02:24.720 +there's a lot of things + +00:02:24.720 --> 00:02:26.480 +which are completely irrelevant, + +00:02:26.480 --> 00:02:28.400 +which are due to details + +00:02:28.400 --> 00:02:30.319 +of the way I have my Emacs set up + +00:02:30.319 --> 00:02:31.599 +and some of the local changes + +00:02:31.599 --> 00:02:34.319 +I had in it so, you know, + +00:02:34.319 --> 00:02:35.280 +there's no point + +00:02:35.280 --> 00:02:37.920 +paying too much attention to it, + +02:37.920 --> 02:40.400 +but here we have a first warning. + +02:40.400 --> 02:42.959 +We see that this is using `cl`, + +02:42.959 --> 02:45.040 +so we want to change this to `cl-lib`, + +02:45.040 --> 00:02:46.879 +but that also means + +00:02:46.879 --> 00:02:48.400 +that we may have a new dependency + +00:02:48.400 --> 00:02:49.920 +on the `cl-lib` package, + +00:02:49.920 --> 00:02:51.120 +so we have to go check + +00:02:51.120 --> 00:02:52.000 +the start of the file + +00:02:52.000 --> 00:02:54.080 +to see if it already declares + +00:02:54.080 --> 00:02:56.800 +some dependency, and we see it doesn't, + +02:56.800 --> 00:03:00.640 +not even on a on a recent-enough Emacs, + +00:03:00.640 --> 00:03:02.325 +so we have to add-- + +00:03:02.325 --> 00:03:05.360 +sorry, that's not going very well... + +03:05.360 --> 03:06.480 +oh... + +03:06.480 --> 03:08.560 +okay, we're going to get there somewhere... + +03:08.560 --> 03:13.200 +somehow... + +03:13.200 --> 03:18.020 +oh, that still wasn't it, wow, okay-- + +03:20.480 --> 03:22.159 +and along the way... + +03:22.159 --> 00:03:24.159 +Of course, since we converted to `cl-lib`, + +00:03:24.159 --> 00:03:26.159 +we have to update the uses + +00:03:26.159 --> 00:03:29.840 +so `defstruct` shouldn't be used anymore. + +03:29.840 --> 03:31.599 +We may want to reindent this + +03:31.599 --> 03:36.000 +to get something a bit cleaner. + +03:37.040 --> 00:03:40.589 +We have here a missing quote... + +00:03:40.589 --> 00:03:41.920 +hash, sorry. + +03:41.920 --> 00:03:46.480 +We have `decf`, so `decf` is here, + +03:46.480 --> 00:03:48.000 +and that needs to be replaced + +00:03:48.000 --> 00:03:49.920 +with `cl-decf`. + +00:03:49.920 --> 00:03:51.120 +Sometimes it's worth doing + +00:03:51.120 --> 00:03:53.360 +a search-and-replace. + +00:03:53.360 --> 00:03:54.799 +Here I see there's only two, + +00:03:54.799 --> 00:03:57.760 +so it's not worth the trouble; + +03:57.760 --> 00:04:00.711 +I just do it by hand, and that's it. + +00:04:00.711 --> 00:04:02.000 +Well, that was easy. + +04:02.000 --> 04:05.000 +So let's recompile, see what it says. + +04:10.159 --> 04:12.959 +Ah, this is clean. Perfect! + +04:12.959 --> 04:15.000 +Let's.. we can go see... + +04:15.000 --> 04:17.280 +There is another one I had. + +04:17.280 --> 04:20.239 +Was it `counsel`, I think. Yes. + +04:20.239 --> 00:04:24.160 +So also I saw some funny things + +00:04:24.160 --> 00:04:24.320 +going on here. + +04:24.320 --> 00:04:26.479 +So I'm going to do + +00:04:26.479 --> 00:04:31.040 +the same procedure as before: + +00:04:31.040 --> 00:04:32.800 +I just compile the file + +00:04:32.800 --> 00:04:35.000 +and look at the warnings. + +04:38.000 --> 04:40.479 +Oh, we have many more here. + +04:40.479 --> 04:43.120 +So let's see... + +04:43.120 --> 00:04:46.504 +Okay, so we have missing quotes-- + +00:04:46.504 --> 00:04:49.240 +oh, hashes. They're not really missing; + +04:49.240 --> 04:54.639 +it's just a personal preference. + +04:54.639 --> 04:57.440 +Oh, here... here's an important one: + +04:57.440 --> 04:59.280 +so as you know, + +04:59.280 --> 05:00.639 +if you look at the top of the file, + +05:00.639 --> 00:05:02.240 +you see that here + +00:05:02.240 --> 00:05:04.960 +it says it's using lexical binding, + +05:04.960 --> 05:07.120 +yet it's not fully using lexical binding, + +05:07.120 --> 00:05:08.960 +because as we just saw, + +00:05:08.960 --> 00:05:11.039 +there's a call to the `eval` function + +00:05:11.039 --> 00:05:11.680 +with only one argument, + +05:11.680 --> 05:13.280 +which means the second argument is nil, + +05:13.280 --> 05:16.880 +which means that the expression read + +05:16.880 --> 00:05:19.520 +by `read` here is going to be evaluated + +05:19.520 --> 00:05:22.160 +using the old dialects, + +00:05:22.160 --> 00:05:24.240 +which is only dynamic scoping. + +00:05:24.240 --> 00:05:25.680 +So here I like to just change this + +00:05:25.680 --> 00:05:26.800 +to use lexical scoping, + +05:26.800 --> 00:05:28.080 +which in most cases + +00:05:28.080 --> 00:05:29.680 +just doesn't make any difference. + +00:05:29.680 --> 00:05:30.870 +It just makes me feel better. + +05:35.919 --> 05:40.160 +So there's lots of those hashes + +05:40.160 --> 05:41.759 +all over the place. + +05:43.680 --> 05:45.680 +It's not strictly necessary, as you know, + +05:45.680 --> 05:51.500 +but I'm just going to add them anyway. + +05:52.479 --> 00:05:53.199 +Here we see + +00:05:53.199 --> 00:05:54.800 +it's not going to warn me here + +00:05:54.800 --> 00:05:55.759 +because it doesn't know + +00:05:55.759 --> 00:05:57.600 +that `ivy-make-magic-action` + +00:05:57.600 --> 00:05:58.400 +takes a function, + +00:05:58.400 --> 00:06:02.319 +but it's a pretty good guess that it does. + +06:12.319 --> 06:14.479 +And here's some more. + +06:14.479 --> 06:16.080 +What else do we have? + +06:16.080 --> 06:19.120 +Is that all we have here? + +06:19.120 --> 06:21.440 +Well, looks like it. Oh, I see a few... + +06:21.440 --> 06:27.680 +a few more here... + +06:27.680 --> 06:30.639 +and one more. + +06:30.639 --> 06:33.039 +And oh, this is more interesting. + +06:33.039 --> 06:35.280 +So here we have a use of `defadvice`, + +06:35.280 --> 06:37.440 +so if we go back + +06:37.440 --> 06:38.479 +to the beginning of the file, + +06:40.720 --> 06:42.880 +we see that it actually depends + +06:42.880 --> 00:06:47.360 +on Emacs 24.5, so it actually has + +06:47.360 --> 00:06:49.280 +the new advice system available + +00:06:49.280 --> 00:06:51.520 +without having to add any dependency, + +00:06:51.520 --> 00:06:53.599 +so there's really no good reason + +00:06:53.599 --> 00:06:54.880 +to keep this. + +06:54.880 --> 00:06:56.160 +So we just convert this + +00:06:56.160 --> 00:06:58.560 +to an `advice-add`, + +06:58.560 --> 00:06:59.840 +so it just says, you know, + +00:06:59.840 --> 00:07:02.319 +this is the function that's advised. + +07:02.319 --> 07:04.560 +This was a `before` advice. + +07:04.560 --> 07:05.500 +The `before` advice, sometimes, + +07:05.500 --> 07:08.479 +when we convert it to `advice-add`, + +07:08.479 --> 07:11.199 +need to be converted to `around` advice. + +07:11.199 --> 07:13.280 +This is when the function + +07:13.280 --> 07:15.840 +looks or modifies the argument. + +07:15.840 --> 07:18.639 +In this case, if I look at it, + +07:18.639 --> 07:20.319 +I see it doesn't seem to be using + +07:20.319 --> 07:21.280 +the arguments at all. + +07:21.280 --> 00:07:25.280 +So I'm just going to keep it + +00:07:25.280 --> 00:07:27.520 +as a `before` advice. + +07:27.520 --> 00:07:28.672 +And we have to give it a name. + +00:07:28.672 --> 00:07:30.880 +Well, we don't really have to, + +07:30.880 --> 07:32.800 +but it's convenient to give it a name + +07:32.800 --> 07:34.800 +to the new function. + +07:34.800 --> 00:07:36.880 +So here, they actually had + +00:07:36.880 --> 00:07:38.080 +given a name to the advice, + +00:07:38.080 --> 00:07:39.599 +so we're going to keep it, + +00:07:39.599 --> 00:07:41.440 +and indeed it's the only function. + +00:07:41.440 --> 00:07:43.360 +This name is not used as a function, + +00:07:43.360 --> 00:07:44.160 +so we can use it + +00:07:44.160 --> 00:07:46.960 +as the name of the function. + +07:46.960 --> 00:07:49.039 +I'm going to add a dash here + +00:07:49.039 --> 00:07:51.120 +because I think this function + +00:07:51.120 --> 00:07:53.039 +is really fundamentally + +00:07:53.039 --> 00:07:54.639 +an internal function. + +07:54.639 --> 07:56.720 +So here I just said I add the advice, + +07:56.720 --> 07:58.000 +but I still need to actually + +07:58.000 --> 07:59.800 +define the function. + +08:02.879 --> 00:08:04.160 +So that's what I do here, + +00:08:04.160 --> 00:08:06.500 +and we need here to list the arguments + +08:06.500 --> 08:08.240 +that are going to be taken. + +08:08.240 --> 00:08:09.199 +I don't know what these are, + +00:08:09.199 --> 00:08:10.960 +but I know we're not using them, + +00:08:10.960 --> 00:08:13.759 +so we'll just accept anything, + +08:13.759 --> 08:16.560 +and that will do the trick. + +08:16.560 --> 08:19.199 +It's a future-proof as well, + +08:19.199 --> 08:22.240 +so that should work. + +08:22.240 --> 00:08:24.160 +Oh, here we have another, so it's + +00:08:24.160 --> 00:08:29.919 +basically the same story, I think. + +08:29.919 --> 00:08:31.599 +It's a `before` advice as well. + +00:08:31.599 --> 00:08:32.959 +It doesn't seem to be using + +00:08:32.959 --> 00:08:35.599 +the argument at all, + +08:35.599 --> 00:08:38.596 +and let's see if this name is not taken. + +00:08:38.596 --> 00:08:43.360 +Yeah, good, so we can just do the same: + +08:43.360 --> 08:46.880 +turn this into an `advice-add`... + +08:46.880 --> 08:48.300 +`before`... + +08:53.040 --> 08:55.000 +I just add a dash here. + +09:02.480 --> 00:09:05.440 +And same thing-- + +00:09:05.440 --> 00:09:06.959 +a function that just takes... + +09:06.959 --> 09:08.240 +because I don't know which arguments + +09:08.240 --> 09:10.480 +these are so... + +09:10.480 --> 09:14.640 +I think that should do the trick. + +09:14.640 --> 00:09:16.080 +Actually, we see that this function + +00:09:16.080 --> 00:09:18.560 +is very similar to the other one. + +09:18.560 --> 09:23.000 +Let's look at the two side-by-side... + +09:31.519 --> 00:09:33.055 +...it really is-- + +00:09:33.055 --> 00:09:36.097 +oh, it's not exactly identical... + +00:09:36.097 --> 00:09:39.120 +it's, you know, we could try + +09:39.120 --> 09:41.680 +to merge them into a single function, + +09:41.680 --> 09:43.279 +but it's probably not worth the trouble + +09:43.279 --> 09:45.920 +so we can keep it this way. + +09:45.920 --> 09:48.720 +Okay, next warning: an `eval` again, + +09:48.720 --> 09:50.640 +so I could just add `t` here, + +09:50.640 --> 00:09:55.120 +but if you look at it a bit more, + +00:09:55.120 --> 00:09:56.000 +you see that the code + +00:09:56.000 --> 00:09:57.760 +we're going to evaluate + +09:57.760 --> 00:09:59.279 +using either lexical scoping + +00:09:59.279 --> 00:10:00.560 +or dynamic scoping + +00:10:00.560 --> 00:10:03.440 +is actually just evaluating a symbol, + +00:10:03.440 --> 00:10:06.240 +since we just call an `intern` here. + +10:06.240 --> 00:10:07.839 +So instead of replacing this + +00:10:07.839 --> 00:10:09.279 +by adding an argument, + +00:10:09.279 --> 00:10:11.680 +I'm just going to call `symbol-value` + +00:10:11.680 --> 00:10:12.640 +because that's exactly + +00:10:12.640 --> 00:10:14.480 +what we need to do here, right. + +00:10:14.480 --> 00:10:16.320 +I call this "strength reduction," + +00:10:16.320 --> 00:10:17.200 +and I'm using + +00:10:17.200 --> 00:10:19.680 +a more primitive function instead, + +00:10:19.680 --> 00:10:23.200 +which does just what we need, + +10:23.200 --> 10:25.680 +and this one knows that it has to be + +10:25.680 --> 00:10:30.640 +accessed by dynamic scoping, of course. + +10:30.640 --> 00:10:32.959 +Here I have a `kmacro-ring`, + +00:10:32.959 --> 00:10:35.600 +so here I have a function that uses-- + +10:35.600 --> 00:10:37.360 +`kmacro-ring` comes from + +00:10:37.360 --> 00:10:39.760 +the `kmacro` package, obviously, + +10:39.760 --> 10:41.600 +and we probably don't want to + +10:41.600 --> 10:42.959 +`require` `kmacro` package + +10:42.959 --> 00:10:48.560 +all over the place in `counsel` itself, + +10:48.560 --> 00:10:50.240 +because `counsel` can be used + +00:10:50.240 --> 00:10:53.279 +without `kmacro`. + +10:53.279 --> 00:10:55.200 +So I think we're just going to add + +00:10:55.200 --> 00:11:04.000 +a `defvar` to silence the warning. + +11:05.519 --> 00:11:10.720 +And we have several more. So we have + +11:10.720 --> 00:11:14.000 +`initial-counter-value`. (Sorry.) + +11:20.480 --> 11:23.360 +We have `kmacro-counter`. + +11:23.360 --> 11:25.760 +Do we have more? + +11:25.760 --> 11:28.560 +Oh, yes, we do. + +11:28.560 --> 11:35.040 +We have `kmacro-counter-value-start` + +11:35.040 --> 11:40.839 +and `kmacro-counter-format-start`. + +11:40.839 --> 11:43.920 +Okay. + +11:45.040 --> 11:50.160 +I hope this is it. + +11:50.160 --> 11:52.880 +`kmacro-ring`, `counter`, `ring`... + +11:52.880 --> 11:54.959 +blah blah blah. + +11:54.959 --> 00:12:00.240 +Here we have another one, `quote`. + +12:00.240 --> 12:03.279 +Here we have another hash missing. + +12:03.279 --> 12:06.079 +It's not missing... + +12:06.079 --> 12:08.000 +but same thing here. + +12:12.079 --> 00:12:16.560 +Okay, this is a function from `kmacro`. + +12:16.560 --> 00:12:18.079 +We could declare it + +00:12:18.079 --> 00:12:20.880 +just to silence the warning + +12:20.880 --> 00:12:22.320 +although we don't actually... + +00:12:22.320 --> 00:12:24.480 +normally, when we declare such things-- + +12:24.480 --> 00:12:25.279 +same thing with variables-- + +00:12:25.279 --> 00:12:27.300 +we should try to make sure that indeed + +12:27.300 --> 12:28.760 +by the time the code is executed, + +12:28.760 --> 12:30.800 +the function will be available, + +12:30.800 --> 00:12:32.800 +and then very often is + +00:12:32.800 --> 00:12:34.320 +because there's a `require` + +00:12:34.320 --> 00:12:35.680 +sometimes inside a function, + +00:12:35.680 --> 00:12:36.399 +and so we should put + +00:12:36.399 --> 00:12:37.680 +the `declare` function + +00:12:37.680 --> 00:12:39.920 +right after the `require`, + +00:12:39.920 --> 00:12:41.839 +but I don't think it's the case here. + +12:41.839 --> 00:12:46.399 +So I'm just going to to add this. + +12:46.399 --> 12:49.040 +I know this comes from `kmacro`, + +12:49.040 --> 00:12:53.500 +and I could actually check the arguments. + +12:56.320 --> 00:12:58.480 +It's just taking an optional argument + +00:12:58.480 --> 00:13:00.880 +so I'm going to put it there, + +00:13:00.880 --> 00:13:06.720 +so we have it complete. + +13:06.720 --> 13:10.800 +Okay, we can just recompile, + +13:10.800 --> 00:13:14.800 +see what is left + +00:13:14.800 --> 00:13:17.760 +from those warnings we've fixed, + +00:13:17.760 --> 00:13:21.360 +and we may have new warnings, in any case, + +00:13:21.360 --> 00:13:25.440 +because especially when we add the hashes, + +00:13:25.440 --> 00:13:29.519 +it tends to give us more warnings. + +13:29.519 --> 00:13:31.200 +So we have two more functions + +00:13:31.200 --> 00:13:34.560 +which are not known. + +13:34.560 --> 13:39.440 +You can just add them here... + +13:39.440 --> 13:44.720 +`set-format "kmacro"` + +13:44.720 --> 13:48.160 +and same thing for `set-counter`. + +13:48.160 --> 13:50.000 +Okay, whatever. + +13:54.959 --> 00:13:57.120 +This just takes a `format` argument, + +00:13:57.120 --> 00:14:05.920 +and this one just takes an `arg` argument. + +14:05.920 --> 14:10.800 +Okay, so let's see what this says now. + +14:10.800 --> 14:15.519 +Hopefully, there's no warnings anymore. + +14:15.519 --> 14:17.839 +We're done. Okay! + +14:17.839 --> 00:14:20.079 +Okay, the last one we're going to see + +00:14:20.079 --> 00:14:23.440 +is in `enwc`, I saw the other day... + +14:23.440 --> 14:26.240 +I think I have it here... + +14:27.760 --> 14:29.680 +here we go, yes... + +14:29.680 --> 14:32.800 +so `enwc` is an interesting package here + +14:32.800 --> 14:35.680 +because it has-- as you can see it has-- + +14:35.680 --> 14:37.760 +it's lexical binding, + +14:37.760 --> 14:39.760 +but actually some of the files in it + +14:39.760 --> 14:42.320 +do not use lexical binding, + +14:42.320 --> 14:44.320 +so it has been partly converted + +14:44.320 --> 14:46.160 +but not completely. + +14:46.160 --> 00:14:49.920 +So here I'm going to + +00:14:49.920 --> 00:14:54.160 +enable lexical binding. + +14:54.160 --> 14:58.880 +I have also, I think, in `cm`... + +14:58.880 --> 15:01.199 +yes... + +15:01.199 --> 15:04.000 +so I enable it here, + +15:04.000 --> 15:07.360 +and also, I think, `test`. + +15:07.360 --> 00:15:09.360 +The test files are often + +00:15:09.360 --> 00:15:11.839 +somewhat problematic + +00:15:11.839 --> 00:15:15.199 +because very often they're not quite + +15:15.199 --> 15:18.880 +as heavily tested themselves, actually, + +15:18.880 --> 00:15:20.320 +or they only run + +00:15:20.320 --> 00:15:22.160 +in very specific contexts, + +00:15:22.160 --> 00:15:24.399 +and so they may have problems + +00:15:24.399 --> 00:15:27.360 +with missing `requires` or using packages + +00:15:27.360 --> 00:15:29.199 +which are not explicitly in the dependencies + +15:29.199 --> 15:31.279 +and those kinds of things. + +15:31.279 --> 15:33.360 +I think this is not the case here, + +15:33.360 --> 15:35.440 +but we'll see. + +15:35.440 --> 15:38.880 +`enwc`... + +15:38.880 --> 15:42.320 +Yes, I want to save this one and that one. + +15:42.320 --> 15:45.000 +Let's see what it says. + +15:47.199 --> 15:51.440 +Okay, unused lexical variable `x`... + +15:51.440 --> 15:52.240 +`x`... + +15:52.240 --> 15:57.120 +Yes, so here we have an unused variable, + +15:57.120 --> 15:58.320 +and indeed, it's not used. + +15:58.320 --> 16:00.880 +It probably had to be named before + +16:00.880 --> 16:04.079 +because it was... + +16:04.079 --> 00:16:05.120 +with dynamic scoping, + +00:16:05.120 --> 00:16:06.399 +the `dotimes` requires + +00:16:06.399 --> 00:16:08.160 +the variable to be named, actually, + +00:16:08.160 --> 00:16:10.399 +because it's used internally somehow, + +16:10.399 --> 00:16:11.600 +but with lexical scoping, + +00:16:11.600 --> 00:16:12.320 +that's not the case, + +00:16:12.320 --> 00:16:14.079 +so we can just put an underscore. + +16:14.079 --> 00:16:15.199 +I'm going to change this + +00:16:15.199 --> 00:16:16.880 +because I really don't like + +16:16.880 --> 16:19.000 +this three-part `dotimes`. + +16:19.000 --> 00:16:21.360 +I prefer to have + +00:16:21.360 --> 00:16:23.040 +the return value at the end. + +16:23.040 --> 00:16:26.480 +It's sort of stashed hidden in the middle. + +16:26.480 --> 16:29.680 +That's just a personal preference. + +16:29.680 --> 16:31.920 +Okay, what else... we have a `widget`. + +16:31.920 --> 16:34.000 +Okay, this argument here says that + +16:34.000 --> 16:37.000 +it's not used, so if we look at... + +16:44.320 --> 00:16:47.040 +We were here, right? Yes. Right here. + +00:16:47.040 --> 00:16:50.480 +Indeed, `widget` is really not used. + +16:50.480 --> 16:51.230 +(Sorry.) + +16:53.600 --> 00:16:55.279 +Here's what I get for using + +00:16:55.279 --> 00:16:58.320 +a somewhat vanilla configuration of Emacs, + +16:58.320 --> 17:01.279 +compared to the one I use... + +17:01.279 --> 17:04.000 +the personally tricked one. + +17:04.000 --> 17:05.439 +Actually, I can... + +17:05.439 --> 17:07.919 +so we can just mark this argument + +17:07.919 --> 17:09.360 +as unused, + +17:09.360 --> 17:11.199 +and we don't want to remove the argument + +17:11.199 --> 00:17:12.480 +probably, or maybe we could; + +00:17:12.480 --> 00:17:15.679 +we could see where the function is used, + +17:15.679 --> 00:17:18.542 +and here we see that it's passed + +00:17:18.542 --> 00:17:20.959 +to a higher-order function, + +17:20.959 --> 17:24.480 +basically, so it's going to be... + +17:24.480 --> 00:17:25.360 +We can't really change + +00:17:25.360 --> 00:17:25.760 +the calling convention + +17:25.760 --> 17:27.120 +so we have to mark the argument + +17:27.120 --> 17:29.600 +as being just an unused argument, + +17:29.600 --> 17:34.000 +but we're going to still receive it. + +17:34.000 --> 00:17:35.360 +And here it says same thing: + +00:17:35.360 --> 00:17:38.240 +that `widget` is not used in this function. + +17:38.240 --> 17:40.000 +Let's take a look at the function. + +17:40.000 --> 17:42.400 +Indeed it seems it's not used, + +17:42.400 --> 17:44.000 +and so we're just going to mark it + +17:44.000 --> 17:46.480 +as unused. + +17:46.480 --> 00:17:48.320 +This is the part of the conversion + +00:17:48.320 --> 00:17:49.200 +to lexical scoping + +00:17:49.200 --> 00:17:51.280 +that's somewhat tricky sometimes + +00:17:51.280 --> 00:17:53.760 +because we don't really know + +00:17:53.760 --> 00:17:56.240 +whether this variable should be using + +00:17:56.240 --> 00:17:58.559 +lexical scoping or dynamic scoping. + +17:58.559 --> 00:18:00.480 +The fact that it's not used + +00:18:00.480 --> 00:18:02.320 +is a hint that there's probably + +00:18:02.320 --> 00:18:03.679 +something going on, + +18:03.679 --> 00:18:04.960 +so either it's not used + +00:18:04.960 --> 00:18:06.400 +because it should be using + +00:18:06.400 --> 00:18:07.200 +dynamic scoping-- + +00:18:07.200 --> 00:18:08.080 +it is going to be used + +00:18:08.080 --> 00:18:10.480 +by some other code somewhere else-- + +18:10.480 --> 00:18:11.840 +or it's really not used + +00:18:11.840 --> 00:18:14.000 +because it's just not used, right, + +00:18:14.000 --> 00:18:16.320 +and so we need to distinguish the two, + +00:18:16.320 --> 00:18:20.880 +and for that, I basically use + +00:18:20.880 --> 00:18:22.240 +my own judgment. + +18:22.240 --> 18:24.880 +This is based typically on the fact that + +18:24.880 --> 00:18:27.760 +this is just a very short name, + +00:18:27.760 --> 00:18:32.000 +and most local identifiers use short names, + +18:32.000 --> 18:34.400 +whereas item values used for dynamic scoping + +18:34.400 --> 18:36.720 +typically have a package prefix + +18:36.720 --> 00:18:37.679 +or something like this. + +00:18:37.679 --> 00:18:38.960 +So the fact that it's a short name + +00:18:38.960 --> 00:18:40.880 +gives me a good idea. + +18:40.880 --> 00:18:41.520 +Here in this case, + +00:18:41.520 --> 00:18:42.640 +I actually look at the code, + +00:18:42.640 --> 00:18:45.600 +and we see that there's nothing in here + +18:45.600 --> 00:18:47.039 +that may actually refer + +00:18:47.039 --> 00:18:48.080 +to this variable `widget`, + +00:18:48.080 --> 00:18:49.280 +so I think it's safe, + +18:49.280 --> 00:18:51.360 +but in the general case, + +00:18:51.360 --> 00:18:54.400 +we may look here and be surprised, + +18:54.400 --> 00:18:55.760 +or, you know, you may call out + +00:18:55.760 --> 00:18:58.320 +the functions which may themselves end up + +18:58.320 --> 19:00.080 +referring to this variable. + +19:00.080 --> 19:02.640 +So sometimes we need to investigate a + +19:02.640 --> 19:03.840 +little more. + +19:03.840 --> 19:05.919 +We are most of the time not completely sure + +19:05.919 --> 19:07.520 +whether the result is correct or not, + +19:07.520 --> 00:19:09.520 +of course, so the other thing + +00:19:09.520 --> 00:19:10.640 +you may want to check + +00:19:10.640 --> 00:19:12.160 +is also uses of things + +00:19:12.160 --> 00:19:14.400 +like `eval` or `symbol-value`. + +19:14.400 --> 19:17.200 +So it's often a good idea to search, + +19:17.200 --> 00:19:18.799 +and you do a search of `eval`, + +00:19:18.799 --> 00:19:21.490 +and you see here it's using `eval`. + +00:19:21.490 --> 00:19:24.160 +Hmmm... Okay, so what does this `eval` do? + +19:24.160 --> 00:19:25.760 +It's evaluating expressions + +00:19:25.760 --> 00:19:28.240 +that appear in `args` here + +19:28.240 --> 19:31.840 +so you can see where those args come from, + +19:31.840 --> 00:19:35.120 +and we see here, these are expressions + +00:19:35.120 --> 00:19:36.840 +that don't do anything very special. + +19:36.840 --> 19:41.520 +It's just using `make-supplicant-choice`, + +19:41.520 --> 19:44.960 +and `make-supplicant-choice` itself + +19:44.960 --> 19:47.120 +just doesn't refer to `widget`, for example, + +19:47.120 --> 19:50.000 +so you know we should be safe, + +19:50.000 --> 19:52.559 +but while I'm here... + +19:52.559 --> 19:53.840 +okay, well, then we can do that later. + +19:53.840 --> 19:55.679 +Well, that's actually the next warning, + +19:55.679 --> 00:19:58.080 +exactly. So here we see that this is + +00:19:58.080 --> 00:20:00.000 +using the dynamically-scoped dialect, + +00:20:00.000 --> 00:20:02.799 +so we convert it to lexical-scoped. + +20:02.799 --> 20:04.559 +Of course, this may introduce errors, + +20:04.559 --> 20:07.200 +but we hope it doesn't. + +20:07.200 --> 20:08.880 +And actually, it was a good change here, + +20:08.880 --> 20:12.080 +because if you see again, + +20:12.080 --> 00:20:14.240 +this actually evals expressions + +00:20:14.240 --> 00:20:16.159 +that appear here in `args`, + +20:16.159 --> 20:18.480 +and so these are expressions + +20:18.480 --> 20:21.039 +that are passed here. + +20:21.039 --> 20:23.679 +So this expression here used to be + +20:23.679 --> 00:20:24.480 +evaluated with dynamic scoping, + +00:20:24.480 --> 00:20:28.000 +even though it appears to be normal code + +00:20:28.000 --> 00:20:29.760 +within this file, which says + +00:20:29.760 --> 00:20:32.559 +it's using lexical scoping, + +20:32.559 --> 20:34.400 +and so there are some remnants + +20:34.400 --> 20:36.640 +of dynamic scoping all over the place + +20:36.640 --> 00:20:37.840 +in Emacs still, because we have + +00:20:37.840 --> 00:20:43.679 +those calls of `eval` with a nil argument. + +20:44.880 --> 20:47.039 +Here we have `cons`... + +20:47.039 --> 20:50.400 +that needs to be `hash quoted`. + +20:52.400 --> 00:20:54.080 +Oh, and we have a reference + +00:20:54.080 --> 00:20:56.720 +to this variable `enwc-edit-id'. + +00:20:56.720 --> 00:20:57.520 +So this is clearly + +00:20:57.520 --> 00:21:00.400 +a dynamic-scoped variable. + +21:00.400 --> 21:02.000 +We can either add a `defvar` + +21:02.000 --> 21:03.440 +to silence the warning, + +21:03.440 --> 00:21:06.799 +or maybe we can `require` the package. + +21:06.799 --> 21:10.080 +The file that defines it... + +21:14.080 --> 21:17.360 +So let's see where it's defined. + +21:17.360 --> 21:21.200 +Here it's defined in `enwc.el`, + +21:21.200 --> 00:21:23.440 +so I'm going to try just to add + +00:21:23.440 --> 00:21:25.039 +the dependency. + +21:25.039 --> 00:21:27.840 +I'm going to `require` here. This is risky. + +21:27.840 --> 21:30.159 +We'll see when we compile a file later, + +21:30.159 --> 21:32.320 +we may get a circular dependency + +21:32.320 --> 21:34.720 +because of it. + +21:34.720 --> 21:36.320 +If that's the case, we're going to + +21:36.320 --> 00:21:38.320 +have to remove this `require` + +00:21:38.320 --> 00:21:42.000 +and instead put `defvar`s. + +21:42.000 --> 21:42.559 +Sometimes it's worth actually + +21:42.559 --> 21:44.640 +looking further at the various files + +21:44.640 --> 00:21:48.080 +to see how to redefine the dependencies + +21:48.080 --> 21:49.840 +to break those circular dependencies, + +21:49.840 --> 21:52.320 +but it's often not really + +21:52.320 --> 21:54.720 +worth the trouble. + +21:55.679 --> 00:21:58.400 +Oh, no, that's not what-- + +00:21:58.400 --> 00:22:01.440 +I'm not going to the right place... + +00:22:01.440 --> 00:22:07.039 +Here I was. So here `edit-map`. + +22:07.039 --> 22:09.760 +Well, we can probably... + +22:09.760 --> 22:12.159 +it may disappear or... + +22:12.159 --> 22:13.760 +oh, I see. + +22:13.760 --> 22:16.320 +Okay, so this `edit-map` actually is + +22:16.320 --> 22:18.559 +defined in this very file. + +22:18.559 --> 00:22:20.240 +It's just that it's defined later. + +00:22:20.240 --> 00:22:21.600 +So all we need to do + +00:22:21.600 --> 00:22:24.320 +is to move this definition + +00:22:24.320 --> 00:22:27.200 +to before its first use, + +22:27.200 --> 22:28.960 +since otherwise it's going to be taken + +22:28.960 --> 22:33.520 +as lexically-scoped, which we don't want. + +22:33.520 --> 22:35.360 +And while I'm here, I see this `copy-keymap`. + +22:35.360 --> 22:38.400 +I don't like `copy-keymap`, + +22:38.400 --> 22:40.960 +so I'm going to change this + +22:40.960 --> 22:44.080 +to a normal keymap, + +22:44.080 --> 22:46.159 +and then I'm just going to use + +22:46.159 --> 22:50.080 +`set-keymap-parent` instead of `copy-keymap` + +22:50.080 --> 00:22:51.600 +to get basically the same result, + +00:22:51.600 --> 00:22:55.280 +but without having copied anything. + +22:55.280 --> 22:57.760 +And this one will disappear... + +22:57.760 --> 23:00.240 +this one as well-- or should hopefully, + +23:00.240 --> 23:03.360 +thanks to the `require`. + +23:03.360 --> 23:09.840 +Here we have a `hash` missing, + +23:09.840 --> 00:23:11.840 +and we have some functions + +00:23:11.840 --> 00:23:14.000 +which are unknown, + +23:14.000 --> 00:23:14.666 +so let's see... + +00:23:14.666 --> 00:23:18.240 +Where is this function defined? + +23:18.240 --> 23:21.679 +Nowhere. Huh, wonderful, okay. + +23:21.679 --> 00:23:25.200 +So we'll just leave it like it is, + +00:23:25.200 --> 00:23:27.120 +and that's going to be + +00:23:27.120 --> 00:23:31.360 +for the author of the package to fix. + +23:31.360 --> 23:37.120 +How about this one? + +23:37.120 --> 23:40.240 +Oh, okay, so it's defined in `enwc.el` + +23:40.240 --> 00:23:41.679 +so presumably, + +00:23:41.679 --> 00:23:44.559 +this is going to disappear as well. + +23:50.159 --> 23:51.030 +One more... + +23:56.159 --> 23:58.640 +Okay, so this one + +23:58.640 --> 23:59.919 +is just like the previous one. + +23:59.919 --> 24:04.000 +We're going to leave it at that. + +24:04.000 --> 24:06.720 +And this is it! Huh, wonderful. + +24:06.720 --> 24:10.000 +So let's recompile. + +24:16.080 --> 24:23.520 +Oh, we have a warning for `fin`. + +24:25.679 --> 00:24:28.640 +This variable seems not to be used + +00:24:28.640 --> 00:24:32.000 +anywhere in the file, so we're just + +24:32.000 --> 00:24:33.440 +going to remove it. + +00:24:33.440 --> 00:24:34.880 +I leave it there just in case + +00:24:34.880 --> 00:24:36.000 +someone needs later on + +00:24:36.000 --> 00:24:37.679 +to look for a `fin` variable + +00:24:37.679 --> 00:24:39.760 +to see where it used to be. + +24:39.760 --> 24:41.600 +Again, you know, maybe it's actually used... + +24:41.600 --> 24:43.519 +yeah, dynamic scoping somehow, + +24:43.519 --> 24:46.159 +but given the short name, + +24:46.159 --> 24:48.960 +I presume this is not the case. + +24:48.960 --> 24:51.200 +Here, oh, that's the code removed + +24:51.200 --> 24:52.559 +that had a hash missing. + +24:52.559 --> 24:54.159 +That's the one that's not defined. + +24:54.159 --> 24:56.799 +This one is not defined, + +24:56.799 --> 24:58.000 +and this is it. + +24:58.000 --> 25:03.039 +Let's make a last recompilation + +25:03.039 --> 25:06.080 +to see if we missed yet something else. + +25:06.080 --> 25:07.919 +Nope, and that's it, okay. + +25:07.919 --> 25:11.200 +Well, here we go; we're done. + +25:11.200 --> 00:25:14.240 +Okay so this was it. + +00:25:14.240 --> 00:25:15.440 +You've seen, I think, + +25:15.440 --> 25:18.000 +pretty much examples of all of those, + +25:18.000 --> 25:20.159 +and I hope you enjoyed it. + +25:20.960 --> 25:22.580 +Lessons to take home: + +25:22.580 --> 25:23.919 +use the byte compiler. + +25:23.919 --> 25:26.000 +You can also use `flymake-mode` instead. + +25:26.000 --> 00:25:31.600 +I recommend enabling it as much as you can, + +25:31.600 --> 25:33.520 +and head the warnings. + +25:33.520 --> 25:35.440 +Follow the warnings. Try to fix them. + +25:35.440 --> 25:37.200 +If you can fix all of the warnings, + +25:37.200 --> 00:25:38.080 +it's always much better, + +00:25:38.080 --> 00:25:39.200 +because then the new warnings + +00:25:39.200 --> 00:25:40.960 +really show up. + +25:40.960 --> 25:42.880 +And once you've done it, it's really + +25:42.880 --> 00:25:44.559 +kind of-- because there's always + +00:25:44.559 --> 00:25:46.799 +new things coming up. + +25:46.799 --> 25:48.799 +And I think this is it. + +25:48.799 --> 00:25:50.720 +I hope you liked it, and thank you + +00:25:50.720 --> 00:25:56.000 +for attending this presentation. Bye. + +00:25:56.000 --> 00:25:57.000 +[captions by Hannah Miller] diff --git a/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt b/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt new file mode 100644 index 00000000..c47bf7d2 --- /dev/null +++ b/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt @@ -0,0 +1,730 @@ +WEBVTT + +00:00.799 --> 00:00:02.734 +Hello, I'm Bastien Guerry, + +00:00:02.734 --> 00:00:04.701 +and I'm happy to be here. + +00:00:04.701 --> 00:00:07.734 +I've been the Org-mode maintainer + +00:00:07.734 --> 00:00:09.501 +for the last 10 years, + +00:00:09.501 --> 00:00:11.368 +and I would like to ask the question + +00:00:11.368 --> 00:00:14.034 +how to help GNU Emacs maintainers in general. + +00:14.400 --> 00:00:15.519 +By GNU Emacs, I mean + +00:00:15.519 --> 00:00:18.080 +the whole GNU Emacs ecosystem, + +00:00:18.080 --> 00:00:19.520 +including packages, + +00:00:19.520 --> 00:00:21.039 +not just the core GNU Emacs + +00:00:21.039 --> 00:00:24.880 +that we all love. + +00:00:24.880 --> 00:00:28.268 +After a decade of dealing with + +00:00:28.268 --> 00:00:29.368 +the Org community, + +00:00:29.368 --> 00:00:32.934 +my view of what a maintainer is changed. + +00:00:32.934 --> 00:00:35.101 +I'd like to share some ideas with you + +00:00:35.101 --> 00:00:37.234 +as I think they could be useful + +00:00:37.234 --> 00:00:39.201 +to help Emacs maintainers in general. + +00:00:39.201 --> 00:00:41.968 +And hopefully, these ideas also apply + +00:00:41.968 --> 00:00:43.601 +to other free software projects, + +00:00:43.601 --> 00:00:45.901 +at least those where contributors + +00:00:45.901 --> 00:00:47.568 +are all volunteers. + +00:00:47.568 --> 00:00:51.368 +First of all, what is a free software maintainer? + +00:00:51.368 --> 00:00:54.601 +- Obviously this is some rich dude + +00:00:54.601 --> 00:00:56.268 +with a lot of free time + +00:00:56.268 --> 00:00:58.968 +- Acting both as a supersmart hacker + +00:00:58.968 --> 00:01:02.401 +and a super-patient community manager + +00:01:02.401 --> 00:01:05.101 +- Someone who acts as the central hotline + +00:01:05.101 --> 00:01:06.901 +for users and contributors + +00:01:06.901 --> 00:01:09.568 +- Who knows how to write many emails, + +00:01:09.568 --> 00:01:11.468 +probably at the same time + +00:01:11.468 --> 00:01:14.101 +- Who does not hesitate + +00:01:14.101 --> 00:01:16.934 +to publicly scold annoying users + +00:01:16.934 --> 00:01:19.801 +- and someone narcissistic enough + +00:01:19.801 --> 00:01:22.668 +to seek credits for community efforts + +00:01:22.668 --> 00:01:26.034 +- But really looking for a job + +00:01:26.034 --> 00:01:27.768 +in some big IT company + +00:01:27.768 --> 00:01:32.234 +Right? Well... no. That was a joke. + +00:01:32.234 --> 00:01:34.601 +But maybe you did smile + +00:01:34.601 --> 00:01:36.634 +and that's probably + +00:01:36.634 --> 00:01:39.401 +because there is some truth to it. + +00:01:39.401 --> 00:01:43.834 +Why? Because our culture encourages + +00:01:43.834 --> 00:01:45.634 +free software users and casual contributors + +00:01:45.634 --> 00:01:47.868 +to think about maintainers this way. + +00:01:47.868 --> 00:01:51.568 +Don't we continue to use the expression + +00:01:51.568 --> 00:01:54.001 +"Benevolent Dictator For Life"? + +00:01:54.001 --> 00:01:56.434 +This is what I'd call + +00:01:56.434 --> 00:01:58.068 +the "Spiderman syndrome": + +00:01:58.068 --> 00:02:01.268 +maintenance is perceived in terms of + +00:02:01.268 --> 00:02:04.168 +great power and great responsibility. + +00:02:04.168 --> 00:02:07.268 +But I believe our culture of superheroes + +00:02:07.268 --> 00:02:09.101 +is not helpful here: + +00:02:09.101 --> 00:02:11.301 +it does not reflect the truth, + +00:02:11.301 --> 00:02:14.134 +it does not set the right expectations, + +00:02:14.134 --> 00:02:16.334 +and it prevents contributors + +00:02:16.334 --> 00:02:17.601 +to properly understand + +00:02:17.601 --> 00:02:19.601 +how to help maintainers. + +00:02:19.601 --> 00:02:21.334 +So let's start again. + +00:02:21.334 --> 00:02:24.968 +Instead of asking what a maintainer is, + +00:02:24.968 --> 00:02:27.068 +let me take the list of + +00:02:27.068 --> 00:02:30.001 +what I do as the Org maintainer. + +00:02:30.001 --> 00:02:31.034 +Here is my TODO-list: + +00:02:31.034 --> 00:02:33.934 +- First of all, I take care of + +00:02:33.934 --> 00:02:35.201 +the orgmode.org website. + +00:02:35.201 --> 00:02:37.401 +- I also take care of the + +00:02:37.401 --> 00:02:41.434 +org-contrib NonGNU ELPA package. + +00:02:41.434 --> 00:02:44.034 +- I do gardening on the + +00:02:44.034 --> 00:02:46.168 +community-driven documentation, Worg. + +00:02:46.168 --> 00:02:48.401 +- I do add contributors to Worg. + +00:02:48.401 --> 00:02:51.134 +- I read emails on emacs-orgmode@, + +00:02:51.134 --> 00:02:54.134 +emacs-devel@ and bug-gnu-emacs@. + +00:02:54.134 --> 00:02:56.868 +- I contribute to email moderation + +00:02:56.868 --> 00:02:59.801 +of the emacs-orgmode@ list + +00:02:59.801 --> 00:03:02.468 +with a bunch of other contributors. + +00:03:02.468 --> 00:03:05.134 +- I reply to private emails + +00:03:05.134 --> 00:03:06.834 +asking me for help about org-mode. + +00:03:06.834 --> 00:03:10.168 +- I coordinate with GNU Emacs maintainers + +00:03:10.168 --> 00:03:12.934 +and thanks to them for Emacs/Org integration. + +00:03:12.934 --> 00:03:16.034 +- I contribute with public emails + +00:03:16.034 --> 00:03:17.801 +on the Org mailing list. + +00:03:17.801 --> 00:03:20.501 +- I release new versions of Org-mode. + +00:03:20.501 --> 00:03:22.634 +- and sometimes, sometimes, + +00:03:22.634 --> 00:03:24.601 +I contribute with code. + +00:03:24.601 --> 00:03:27.168 +Do you see a pattern here? + +00:03:27.168 --> 00:03:30.468 +Yes. I bet the last three tasks + +00:03:30.468 --> 00:03:31.801 +is what most people have in mind + +00:03:31.801 --> 00:03:34.201 +when they think of a maintainer: + +00:03:34.201 --> 00:03:35.534 +it's all about hacking + +00:03:35.534 --> 00:03:37.734 +and being an efficient hotline. + +00:03:37.734 --> 00:03:39.734 +But in fact, these tasks + +00:03:39.734 --> 00:03:41.601 +are only a superficial part + +00:03:41.601 --> 00:03:43.201 +of what I do as a maintainer. + +00:03:43.201 --> 00:03:47.001 +Some would consider that these core tasks + +00:03:47.001 --> 00:03:48.501 +are the /interesting/ ones, + +00:03:48.501 --> 00:03:51.634 +while the others are the /boring/ ones. + +00:03:51.634 --> 00:03:53.901 +I don't see it that way: + +00:03:53.901 --> 00:03:56.534 +some tasks are about the product, + +00:03:56.534 --> 00:03:58.801 +others are about the project. + +00:03:58.801 --> 00:04:00.834 +Without a good product, + +00:04:00.834 --> 00:04:02.168 +there is little chance + +00:04:02.168 --> 00:04:03.401 +you will have a good project, + +00:04:03.401 --> 00:04:07.534 +but maintaining a project requires thinking + +00:04:07.534 --> 00:04:09.301 +in terms of infrastructure, + +00:04:09.301 --> 00:04:11.068 +not in terms of bugs, + +00:04:11.068 --> 00:04:13.334 +thinking in terms of resources + +00:04:13.334 --> 00:04:16.701 +that enable both users and contributors, + +00:04:16.701 --> 00:04:18.401 +not in terms of commits. + +00:04:18.401 --> 00:04:21.001 +So let me try to define again + +00:04:21.001 --> 00:04:23.334 +what a free software maintainer is + +00:04:23.334 --> 00:04:24.434 +or should be. + +00:04:24.434 --> 00:04:26.234 +A free software maintainer + +00:04:26.234 --> 00:04:28.368 +is someone who cares about + +00:04:28.368 --> 00:04:30.968 +enabling users and contributors + +00:04:30.968 --> 00:04:32.768 +so that they collectively + +00:04:32.768 --> 00:04:34.201 +take care of the project. + +00:04:34.201 --> 00:04:36.734 +See another pattern here? + +00:04:36.734 --> 00:04:40.301 +That's all about the /project/, + +00:04:40.301 --> 00:04:41.501 +versus the product. + +00:04:41.501 --> 00:04:43.634 +It's about /taking care of it/, + +00:04:43.634 --> 00:04:46.934 +versus being a direct hotline for users, + +00:04:46.934 --> 00:04:49.901 +caring about the project infrastructure + +00:04:49.901 --> 00:04:52.134 +and about empowering users + +00:04:52.134 --> 00:04:54.234 +with tools and incentives + +00:04:54.234 --> 00:04:55.268 +so that they care too. + +00:04:55.268 --> 00:04:58.434 +How can you help such a maintainer? + +00:04:58.434 --> 00:05:00.901 +By focusing on the project + +00:05:00.901 --> 00:05:03.901 +and becoming an enabler yourself. + +00:05:03.901 --> 00:05:06.934 +Let's pause and summarize: + +00:05:06.934 --> 00:05:08.801 +our culture wants heroes + +00:05:08.801 --> 00:05:12.434 +and this leads us to expect maintainers + +00:05:12.434 --> 00:05:15.234 +to be superhackers and superactive hotlines. + +00:05:15.234 --> 00:05:19.568 +This is the HOT mindset of maintenance, + +00:05:19.568 --> 00:05:23.368 +where the maintainers are Headmasters Of Tweaks + +00:05:23.368 --> 00:05:26.901 +and soon becomes the Headmaster Of Troubles. + +00:05:26.901 --> 00:05:29.501 +To resist this HOT mindset, + +00:05:29.501 --> 00:05:33.201 +I suggest to redefine maintenance as ACDC: + +00:05:33.201 --> 00:05:36.534 +*Asynchronous Collective Distributed Care*: + +00:05:36.534 --> 00:05:38.968 +- /Asynchronous/ because time management + +00:05:38.968 --> 00:05:40.168 +is a private matter + +00:05:40.168 --> 00:05:41.968 +and we are all volunteers. + +00:05:41.968 --> 00:05:44.168 +- /Collective/ because, well, + +00:05:44.168 --> 00:05:45.634 +no man is an island. + +00:05:45.634 --> 00:05:49.201 +- /Distributed/: because the more power + +00:05:49.201 --> 00:05:51.601 +to the "edges", the more resilient + +00:05:51.601 --> 00:05:53.534 +the system and the project is. + +00:05:53.534 --> 00:05:56.368 +- /Care/ because this is all about care: + +00:05:56.368 --> 00:05:58.501 +with each other as users + +00:05:58.501 --> 00:06:00.134 +or as contributors, + +00:06:00.134 --> 00:06:02.101 +with the project's infrastructure + +00:06:02.101 --> 00:06:05.301 +(servers, websites, bug trackers, etc.) + +00:06:05.301 --> 00:06:08.701 +and care about having a useful product. + +00:06:08.701 --> 00:06:13.901 +/Enabling/ users and contributors means + +00:06:13.901 --> 00:06:16.468 +encouraging them to take ownership, + +00:06:16.468 --> 00:06:19.801 +which is more than just delegating tasks. + +00:06:19.801 --> 00:06:22.068 +Let your users and contributors know + +00:06:22.068 --> 00:06:23.901 +that they need to tap into + +00:06:23.901 --> 00:06:26.434 +the collective attention pool with care: + +00:06:26.434 --> 00:06:28.801 +the more autonomous they are, the better. + +00:06:28.801 --> 00:06:33.801 +So, with this ACDC definition in mind, + +00:06:33.801 --> 00:06:37.534 +how can /you/ help Emacs maintainers? + +00:06:37.534 --> 00:06:41.268 +- First of all, by *becoming a maintainer + +00:06:41.268 --> 00:06:44.334 +for your own project*, however small. + +00:06:44.334 --> 00:06:47.001 +Think in terms of project (vs product). + +00:06:47.001 --> 00:06:49.034 +Empower users and contributors. + +00:06:49.034 --> 00:06:50.668 +This will help you understand + +00:06:50.668 --> 00:06:54.068 +how to help other maintainers. + +00:06:54.068 --> 00:06:56.501 +("More power to the edges!") + +00:06:56.501 --> 00:07:00.001 +- *Volunteer as a contributor steward + +00:07:00.001 --> 00:07:02.201 +for another project*: you don't need to + +00:07:02.201 --> 00:07:03.868 +be a supersmart hacker + +00:07:03.868 --> 00:07:05.634 +to help others to contribute. + +00:07:05.634 --> 00:07:07.701 +(For Org-mode, we are lucky to have + +00:07:07.701 --> 00:07:10.901 +two great contributor stewards.) + +00:07:10.901 --> 00:07:12.868 +- *Learn how to teach*, + +00:07:12.868 --> 00:07:16.468 +because pedagogical skills are invaluable. + +00:07:16.468 --> 00:07:18.301 +(Taking the time to explain + +00:07:18.301 --> 00:07:20.868 +how to write a bug report or a patch + +00:07:20.868 --> 00:07:23.834 +is invaluable and this is a core part + +00:07:23.834 --> 00:07:25.401 +of the Org culture.) + +00:07:25.401 --> 00:07:27.801 +- *Test and enhance the project's + +00:07:27.801 --> 00:07:30.001 +contribution process*. (For Org-mode, + +00:07:30.001 --> 00:07:33.268 +you would read and suggest contributions to + +00:07:33.268 --> 00:07:35.634 +the org-contribute pages on Worg.) + +00:07:35.634 --> 00:07:38.601 +- *Take care of the project's calls for help*. + +00:07:38.601 --> 00:07:40.968 +(For Org-mode, this would be this list + +07:40.560 --> 00:07:43.599 +that we have on updates.orgmode.org + +07:43.599 --> 00:07:47.234 +For Emacs, this would be =etc/TODO= file.) + +00:07:47.234 --> 00:07:50.834 +If the calls for help are not explicit enough, + +00:07:50.834 --> 00:07:52.834 +try to contribute some. + +00:07:52.834 --> 00:07:56.701 +- *Encourage users from outside the project + +00:07:56.701 --> 00:07:58.434 +to contribute to the core forum*. + +00:07:58.434 --> 00:08:01.434 +(For Org-mode, there are many hacks and fixes + +00:08:01.434 --> 00:08:03.901 +being shared on reddit and stackoverflow: + +00:08:03.901 --> 00:08:05.401 +and that's fine, but we we should not + +00:08:05.401 --> 00:08:07.401 +wait for months before having this + +00:08:07.401 --> 00:08:08.801 +shared on the list.) + +00:08:08.801 --> 00:08:11.434 +- *Let the core forum know about + +00:08:11.434 --> 00:08:13.701 +what happens in this outside world* + +00:08:13.701 --> 00:08:16.601 +by sharing important information yourself. + +00:08:16.601 --> 00:08:19.868 +- *Propose your help for non-code tasks*: + +00:08:19.868 --> 00:08:21.368 +maintain a website, + +00:08:21.368 --> 00:08:23.734 +enhance the (community-driven) documentation, + +00:08:23.734 --> 00:08:26.101 +help with bug triage, etc. + +00:08:26.101 --> 00:08:29.568 +- *If you expect someone else to fix your bug, + +00:08:29.568 --> 00:08:33.234 +try fixing someone else's bug too*: + +00:08:33.234 --> 00:08:36.234 +that's how you'll learn Emacs Lisp + +00:08:36.234 --> 00:08:37.668 +and that's how you'll concretely + +00:08:37.668 --> 00:08:40.501 +train your empathy, your sense of taking care. + +00:08:40.501 --> 00:08:42.068 +That is so critical. + +00:08:42.068 --> 00:08:44.101 +- *Don't expect the maintainer + +00:08:44.101 --> 00:08:45.168 +to be a hotline*, + +00:08:45.168 --> 00:08:46.801 +especially a private one. + +00:08:46.801 --> 00:08:49.234 +Address yourself to the community. + +00:08:49.234 --> 00:08:51.968 +- and last but not least, + +00:08:51.968 --> 00:08:53.120 +*complete this list*. + +00:08:53.120 --> 00:08:54.959 +I'm trying to open a conversation here, + +00:08:54.959 --> 00:08:57.168 +so don't be shy. + +00:08:57.168 --> 00:09:01.760 +That's it. Is it hard? Yes, this is hard, + +00:09:01.760 --> 00:09:04.640 +and that's because helping maintainers + +00:09:04.640 --> 00:09:07.760 +by becoming such a enabler + +00:09:07.760 --> 00:09:09.839 +in this ACDC mindset + +00:09:09.839 --> 00:09:12.080 +is not immediately rewarding, + +00:09:12.080 --> 00:09:15.168 +whereas fixing a bug clearly, clearly is. + +00:09:15.168 --> 00:09:17.701 +But if you start thinking of the project + +00:09:17.701 --> 00:09:19.301 +as something that enables you + +00:09:19.301 --> 00:09:21.440 +to do amazing things, and I believe + +00:09:21.440 --> 00:09:23.434 +Org is this kind of project, + +00:09:23.434 --> 00:09:25.034 +and if you start thinking + +00:09:25.034 --> 00:09:26.634 +of the maintenance as something + +00:09:26.634 --> 00:09:28.934 +that enables more contributions, + +00:09:28.934 --> 00:09:31.734 +you will see how important and rewarding + +00:09:31.734 --> 00:09:35.668 +it is to become such an enabler. + +00:09:35.668 --> 00:09:39.701 +So, definitely grateful to all enablers + +00:09:39.701 --> 00:09:41.401 +that we have in Org's community! + +00:09:41.401 --> 00:09:43.734 +And to everyone who maintains + +00:09:43.734 --> 00:09:45.701 +a culture of teaching and learning + +00:09:45.701 --> 00:09:49.068 +through polite and respectful interactions + +00:09:49.068 --> 00:09:50.801 +on the mailing list and elsewhere: + +00:09:50.801 --> 00:09:55.001 +we always need more "power to the edges". + +00:09:55.001 --> 00:09:57.168 +And I'm also very grateful + +00:09:57.168 --> 00:09:59.034 +to the EmacsConf 2021 organizers, + +00:09:59.034 --> 00:10:02.568 +because that's really taking care + +00:10:02.568 --> 00:10:03.568 +of the community! Thanks very much. + +00:10:03.568 --> 00:10:04.000 +[captions by sachac] diff --git a/2021/captions/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt b/2021/captions/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt new file mode 100644 index 00000000..99d8802b --- /dev/null +++ b/2021/captions/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt @@ -0,0 +1,673 @@ +WEBVTT + +00:00.240 --> 00:00:02.800 +Hello. This is Kevin Haddock + +00:00:02.800 --> 00:00:05.839 +to announce the introduction of N-Angulator, + +00:00:05.839 --> 00:00:07.759 +hereafter called NA. + +00:07.759 --> 00:00:10.240 +NA allows you, the user, to supply + +00:00:10.240 --> 00:00:11.679 +the meaning to your data + +00:00:11.679 --> 00:00:13.599 +in a concise, efficient way. + +00:00:13.599 --> 00:00:14.880 +How does it work? + +00:14.880 --> 00:00:16.880 +Your files are stored on your hard disk + +00:00:16.880 --> 00:00:18.160 +in what technically is called + +00:00:18.160 --> 00:00:20.640 +a hierarchical file system. + +00:20.640 --> 00:00:22.240 +What this means is that + +00:00:22.240 --> 00:00:24.560 +the root of the directory tree can be + +00:00:24.560 --> 00:00:27.760 +not only files, or what we call leaves, + +00:00:27.760 --> 00:00:30.720 +but also other folders/branches + +00:00:30.720 --> 00:00:33.680 +that themselves contain other files, leaves, + +00:00:33.680 --> 00:00:36.000 +and/or branches. + +00:36.000 --> 00:00:37.680 +This structure is supposed to + +00:00:37.680 --> 00:00:40.079 +make it easy to locate your data, + +00:00:40.079 --> 00:00:42.079 +but as anyone knows who has worked with this + +00:00:42.079 --> 00:00:43.600 +single-dimensional file system + +00:00:43.600 --> 00:00:45.280 +for any length of time, + +00:45.280 --> 00:00:46.800 +it can get quite frustrating + +00:00:46.800 --> 00:00:48.960 +when your file would fit equally well + +00:00:48.960 --> 00:00:52.079 +on more than one branch of the tree. + +00:52.079 --> 00:00:53.920 +What are you to do? + +00:53.920 --> 00:00:55.920 +Create multiple copies everywhere + +00:00:55.920 --> 00:00:57.840 +it might appropriately fit. + +00:00:57.840 --> 00:00:59.039 +What if the file was something + +00:00:59.039 --> 00:01:01.120 +people would occasionally modify, + +00:01:01.120 --> 00:01:04.879 +like a spreadsheet or a computer source file? + +01:04.879 --> 00:01:07.760 +You would have to hunt it down in every place + +00:01:07.760 --> 00:01:11.840 +and apply those changes everywhere by hand. + +01:11.840 --> 00:01:14.720 +Also, let's say not only did you want + +00:01:14.720 --> 00:01:17.040 +to put the file in multiple places, + +00:01:17.040 --> 00:01:18.799 +but it was also more appropriate + +00:01:18.799 --> 00:01:21.280 +to give it different names? + +01:21.280 --> 00:01:23.280 +Plus, let's say in different areas + +00:01:23.280 --> 00:01:25.119 +of the tree, there were files + +00:01:25.119 --> 00:01:26.560 +with the same name + +01:26.560 --> 00:01:29.280 +that had totally different content? + +01:29.280 --> 00:01:31.280 +Then updating all the different instances + +00:01:31.280 --> 00:01:32.640 +of the file you need + +00:01:32.640 --> 00:01:35.200 +would become more and more of a nightmare. + +01:35.200 --> 00:01:37.920 +In addition, wouldn't it be great + +00:01:37.920 --> 00:01:39.520 +if we could all speed up + +00:01:39.520 --> 00:01:42.479 +the actual searching for a particular file + +01:42.479 --> 00:01:45.680 +by selecting multiple branches in the tree + +00:01:45.680 --> 00:01:47.200 +and simply asking the computer + +00:01:47.200 --> 00:01:49.680 +to tell us which branches under those + +01:49.680 --> 00:01:52.560 +contain the same file and which do not? + +01:52.560 --> 00:01:54.000 +This would be especially great + +00:01:54.000 --> 00:01:56.719 +if it were instantaneous. + +01:56.719 --> 00:01:58.640 +Well, believe it or not, this is what NA + +01:58.640 --> 00:02:00.079 +brings to the table. + +02:00.079 --> 00:02:03.040 +In fact, this is how NA got its name. + +02:03.040 --> 00:02:05.040 +Your data is located by a process + +00:02:05.040 --> 00:02:06.960 +very similar to the triangulation + +00:02:06.960 --> 00:02:09.119 +used to locate radio signals, + +00:02:09.119 --> 00:02:10.160 +only we are not limited + +00:02:10.160 --> 00:02:12.000 +to just two or three angles, + +00:02:12.000 --> 00:02:14.720 +but instead, many dozens can be used, + +02:14.720 --> 00:02:16.879 +this makes NA appear to be + +00:02:16.879 --> 00:02:18.640 +what is known in computer lingo + +00:02:18.640 --> 00:02:21.760 +as an n-dimensional sparse array. + +02:21.760 --> 00:02:23.599 +If that sounds complex, don't worry. + +00:02:23.599 --> 00:02:25.280 +It will become clear when you see it + +00:02:25.280 --> 00:02:28.720 +in operation in a couple of minutes. + +02:28.720 --> 00:02:32.560 +To start out, here we see the NA main screen. + +02:32.560 --> 00:02:36.080 +There are two vital aspects of mastering NA. + +00:02:36.080 --> 00:02:37.760 +First is the actual mechanics + +00:02:37.760 --> 00:02:39.120 +of using the program, + +00:02:39.120 --> 00:02:40.480 +which should be second nature + +00:02:40.480 --> 00:02:41.920 +for most anyone familiar with + +02:41.920 --> 00:02:46.160 +either a Windows or Unix/apple file system. + +02:46.160 --> 00:02:48.080 +We have the same operations + +00:02:48.080 --> 00:02:50.400 +as one might do with Windows Explorer + +02:50.400 --> 00:02:52.560 +or any number of other file tools, + +00:02:52.560 --> 00:02:54.560 +but what we also do + +00:02:54.560 --> 00:02:56.080 +that generally they do not + +00:02:56.080 --> 00:02:58.000 +is place a leaf on a branch, + +00:02:58.000 --> 00:03:00.560 +then cruise around adding links to that leaf + +03:00.560 --> 00:03:02.720 +on a multitude of other branches, + +00:03:02.720 --> 00:03:05.120 +which could include creating, renaming, + +00:03:05.120 --> 00:03:07.360 +or restructuring more branches on the fly + +03:07.360 --> 00:03:10.480 +as needed. Plus, when we find ourselves + +00:03:10.480 --> 00:03:12.319 +hunting for that file, + +00:03:12.319 --> 00:03:13.840 +we can incrementally select + +00:03:13.840 --> 00:03:15.120 +a stack of branches + +00:03:15.120 --> 00:03:17.200 +while seeking what the latter branches + +00:03:17.200 --> 00:03:19.920 +have in common with the earlier ones, + +03:19.920 --> 00:03:22.720 +to make putting one's finger on exactly + +00:03:22.720 --> 00:03:26.239 +the item they're looking for a snap. + +03:26.239 --> 00:03:28.319 +Secondly, you have the actual art + +00:03:28.319 --> 00:03:29.680 +of organizing your data, + +00:03:29.680 --> 00:03:31.120 +and NA doesn't really put + +00:03:31.120 --> 00:03:32.640 +any limitations on this, + +00:03:32.640 --> 00:03:34.799 +other than the underlying limitations + +00:03:34.799 --> 00:03:36.560 +of the file system. + +03:36.560 --> 00:03:39.760 +Let's get started, shall we? + +03:39.760 --> 00:03:41.920 +Right-clicking the mouse button here + +03:41.920 --> 00:03:43.760 +will bring up what we call + +00:03:43.760 --> 00:03:46.000 +a branch navigation menu, + +00:03:46.000 --> 00:03:46.959 +because it allows you + +00:03:46.959 --> 00:03:48.239 +to move around the tree + +00:03:48.239 --> 00:03:50.159 +or commence a new angle. + +03:50.159 --> 00:03:52.480 +We have chosen to organize our data + +00:03:52.480 --> 00:03:55.519 +with a hopper to put new items in, + +00:03:55.519 --> 00:03:57.360 +and the initial branches representing + +00:03:57.360 --> 00:03:59.519 +who, what, where, why, and how. + +00:03:59.519 --> 00:04:01.280 +We right-click on the root + +00:04:01.280 --> 00:04:03.439 +and select 0hopper, + +04:03.439 --> 00:04:06.000 +and that branch is added to the display. + +04:06.000 --> 00:04:08.080 +If we middle-click on the branch, + +04:08.080 --> 00:04:09.360 +we get what is called + +00:04:09.360 --> 00:04:11.280 +the branch command menu, + +00:04:11.280 --> 00:04:12.959 +which gives us many options, + +00:04:12.959 --> 00:04:13.920 +not the least of which + +00:04:13.920 --> 00:04:15.920 +is to create a leaf here. + +04:15.920 --> 00:04:18.000 +Remember this item as we progress, + +04:18.000 --> 00:04:20.320 +because it will become important. + +04:20.320 --> 00:04:22.960 +Next we pick what we know is a leaf item, + +04:22.960 --> 00:04:24.720 +due to the fact that it does not have + +00:04:24.720 --> 00:04:30.960 +a trailing slash. + +04:30.960 --> 00:04:32.960 +Now, when we right-click on it, + +04:32.960 --> 00:04:35.040 +notice the navigation menu is limited to + +00:04:35.040 --> 00:04:37.040 +the two items: New Angle + +00:04:37.040 --> 00:04:40.960 +and the leaf name itself. + +04:40.960 --> 00:04:43.680 +If we want to view or edit that leaf item, + +00:04:43.680 --> 00:04:45.440 +we can select that item. + +04:45.440 --> 00:04:47.280 +Now that we have selected a leaf, + +00:04:47.280 --> 00:04:48.560 +let's middle-click on it + +00:04:48.560 --> 00:04:49.520 +to bring up what we call + +00:04:49.520 --> 00:04:51.600 +the leaf command menu. + +04:51.600 --> 00:04:54.080 +This shows us a bunch of standard options + +00:04:54.080 --> 00:04:56.160 +one might do in a typical file tool + +00:04:56.160 --> 00:04:58.320 +like Microsoft Explorer. + +04:58.320 --> 00:05:00.479 +Since we want to do what they cannot do, + +05:00.479 --> 00:05:01.680 +let's right-click the leaf + +00:05:01.680 --> 00:05:04.639 +and select New Angle. + +05:04.639 --> 00:05:06.400 +Notice that another slash has appeared + +00:05:06.400 --> 00:05:09.840 +below the displayed path of the leaf. + +05:09.840 --> 00:05:11.520 +Right-click on it, and you will see + +00:05:11.520 --> 00:05:14.639 +the root branch navigation menu appears again, + +05:14.639 --> 00:05:19.039 +but now 0hopper entry has a line + +00:05:19.039 --> 00:05:20.960 +both above and below it. + +05:20.960 --> 00:05:23.199 +Items in between these two lines + +00:05:23.199 --> 00:05:24.560 +are called members, + +00:05:24.560 --> 00:05:27.520 +and items below them are called others. + +05:27.520 --> 00:05:29.680 +What this is saying is that + +00:05:29.680 --> 00:05:32.160 +the previously selected angle, + +05:32.160 --> 00:05:34.160 +which can be a single leaf + +05:34.160 --> 00:05:35.840 +as in this instance, + +05:35.840 --> 00:05:37.360 +or can be all of the leaves + +00:05:37.360 --> 00:05:38.960 +under a particular branch + +00:05:38.960 --> 00:05:43.039 +chosen to navigate new angle from, + +05:43.039 --> 00:05:44.880 +shares content with the items + +00:05:44.880 --> 00:05:47.680 +under the member area of the menu, + +00:05:47.680 --> 00:05:50.880 +but items in the others area do not. + +05:50.880 --> 00:05:53.600 +Since the first angle is 0hopper, + +05:53.600 --> 00:05:56.800 +of course it shares content with itself, + +05:56.800 --> 00:05:59.199 +and so it appears in members. + +05:59.199 --> 00:06:01.199 +Now let's click the middle button + +00:06:01.199 --> 00:06:02.960 +on the root branch, and see what + +00:06:02.960 --> 00:06:07.360 +the branch command menu has to say. + +06:07.360 --> 00:06:09.280 +Notice that the entry that used to say + +06:09.280 --> 00:06:13.120 +Create a New Leaf now says Add a Link. + +06:13.120 --> 00:06:15.039 +This is because we have already selected + +06:15.039 --> 00:06:17.360 +a leaf, and now we want to add links + +00:06:17.360 --> 00:06:20.479 +to it rather than create a new one. + +06:20.479 --> 00:06:21.840 +If you go back to the root + +00:06:21.840 --> 00:06:24.319 +and reselect 0hopper, + +06:24.319 --> 00:06:29.039 +that option will revert back again. + +06:29.039 --> 00:06:40.880 +So let's add a link under person. + +06:40.880 --> 00:06:42.720 +We right-click the root, + +00:06:42.720 --> 00:06:46.720 +select person, and let's add a link. + +06:46.720 --> 00:06:50.560 +Notice the bottom area (called the minibuffer) + +00:06:50.560 --> 00:06:53.360 +gives us the proposed name of the link, + +06:53.360 --> 00:06:55.680 +and we choose to accept it by hitting enter, + +00:06:55.680 --> 00:07:09.759 +or edit it to taste first. + +07:09.759 --> 00:07:10.960 +Now let's go back up to + +00:07:10.960 --> 00:07:13.120 +the end of the prior angle, + +07:13.120 --> 00:07:15.360 +select New Angle again, + +07:15.360 --> 00:07:18.319 +and then click the resultant /, + +00:07:18.319 --> 00:07:20.240 +and see what are members + +00:07:20.240 --> 00:07:21.840 +and what are others. + +07:21.840 --> 00:07:24.319 +Notice that the 0hopper and person + +07:24.319 --> 00:07:25.759 +are members. + +07:25.759 --> 00:07:28.319 +NA knows you added content to the person, + +00:07:28.319 --> 00:07:32.160 +so it moves to members. + +07:32.160 --> 00:07:33.599 +Now let's add some more links + +00:07:33.599 --> 00:07:35.360 +and perhaps a few subdirectories + +00:07:35.360 --> 00:08:06.960 +for this item. + +08:06.960 --> 00:08:08.960 +Notice how we can even eliminate + +00:08:08.960 --> 00:08:11.039 +the file name extension. + +08:11.039 --> 00:08:13.680 +It will still know how to display the item + +00:08:13.680 --> 00:08:15.440 +as it actually analyzes the file + +00:08:15.440 --> 00:08:17.120 +to determine its type. + +08:17.120 --> 00:08:19.120 +This greatly cleans up your metadata + +00:08:19.120 --> 00:08:40.719 +and makes it more human. + +08:40.719 --> 00:08:41.839 +Now let's pick a branch + +00:08:41.839 --> 00:08:43.519 +from one of the menus. + +08:43.519 --> 00:08:44.880 +For instance, let's look and see + +00:08:44.880 --> 00:08:54.880 +where any events broadcast were done from. + +08:54.880 --> 00:09:06.640 +We select event, broadcast, then New Angle, + +09:06.640 --> 00:09:09.600 +and we can see California is in members. + +09:09.600 --> 00:09:11.600 +Now we can also do New Angle + +00:09:11.600 --> 00:09:13.920 +and select person, + +09:13.920 --> 00:09:16.160 +and we can see who did them. + +09:16.160 --> 00:09:18.720 +Another thing we can do is pick a leaf + +09:18.720 --> 00:09:19.920 +and quickly display + +00:09:19.920 --> 00:09:21.920 +all angles or links for it, + +00:09:21.920 --> 00:09:24.160 +or if we are willing to wait a little longer, + +00:09:24.160 --> 00:09:26.720 +have NA construct all the display items + +00:09:26.720 --> 00:09:28.320 +with Edit All Angles, + +00:09:28.320 --> 00:09:30.160 +so we can manipulate them + +00:09:30.160 --> 00:09:31.440 +just as if we had entered + +00:09:31.440 --> 00:09:44.320 +or selected them by hand. + +09:44.320 --> 00:09:46.080 +There are many more tools in NA + +00:09:46.080 --> 00:09:47.440 +to handle sets of leaves + +00:09:47.440 --> 00:09:50.320 +such as scanned pages of a book, + +09:50.320 --> 00:09:53.040 +promoting /, demoting nodes, + +09:53.040 --> 00:09:54.560 +and so forth. + +09:54.560 --> 00:09:55.560 +Thanks for watching. + +00:09:55.560 --> 00:09:58.040 +[captions by sachac] diff --git a/2021/captions/emacsconf-2021-pattern--edit--main.vtt b/2021/captions/emacsconf-2021-pattern--edit--main.vtt new file mode 100644 index 00000000..ecff1823 --- /dev/null +++ b/2021/captions/emacsconf-2021-pattern--edit--main.vtt @@ -0,0 +1,13 @@ +WEBVTT + +00:00.000 --> 06:13.400 +#+START: 00:00:00.000 +#+END: 00:06:13.400 +#+VIDEO_SUBTITLES: 1 +[[file:emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.webm]] + +06:55.120 --> 23:43.480 +#+START: 00:06:55.120 +#+END: 00:23:43.480 +#+VIDEO_SUBTITLES: 1 +[[file:emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.webm]] diff --git a/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt b/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt new file mode 100644 index 00000000..0a977036 --- /dev/null +++ b/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt @@ -0,0 +1,768 @@ +WEBVTT + +00:00.000 --> 00:01.599 +Hello, my name is Gabriele, + +00:01.599 --> 00:03.439 +and today I'm going to tell you about Telega + +00:03.439 --> 00:05.600 +and the Emacs community on Telegram. + +00:05.600 --> 00:08.400 +I'm not affiliated with Telegram or Telega, + +00:08.400 --> 00:10.719 +and opinions are my own in general. + +00:10.719 --> 00:14.160 +I'm going to give you my personal spin about these topics. + +00:14.160 --> 00:16.160 +The plan for the talk is the following. + +00:16.160 --> 00:18.800 +First, I'm going to talk about what is Telegram. + +00:18.800 --> 00:19.840 +Next, I'm going to tell you + +00:19.840 --> 00:21.840 +about the Emacs community on Telegram. + +00:21.840 --> 00:24.720 +And finally, I'm going to discuss telega.el, + +00:24.720 --> 00:26.560 +an Emacs package for Telegram. + +00:26.560 --> 00:29.359 +In all of these, I'm now going to dive into details. + +00:29.359 --> 00:30.880 +My goal here is to give you + +00:30.880 --> 00:33.120 +some exposure about these topics. + +00:33.120 --> 00:35.840 +You can find out more online, if you want. + +00:35.840 --> 00:38.960 +Let's get started with what is +Telegram. + +00:38.960 --> 00:41.100 +Telegram is a cloud-based + +00:41.100 --> 00:42.879 +instant messaging platform. + +00:42.879 --> 00:44.079 +It's a popular one. + +00:44.079 --> 00:46.559 +It has more than half a billion users. + +00:46.559 --> 00:47.840 +I think one of the reasons + +00:47.840 --> 00:49.600 +why it's so popular, it's because + +00:49.600 --> 00:51.360 +it's really rich in features + +00:51.360 --> 00:52.960 +while being user friendly. + +00:52.960 --> 00:54.640 +Hence, in some regions, + +00:54.640 --> 00:56.960 +Telegram has good market penetration. + +00:56.960 --> 00:59.039 +And of course, because of network effects, + +00:59.039 --> 01:01.120 +this brings even more users. + +01:01.120 --> 01:02.239 +The details of the features + +01:02.239 --> 01:03.680 +is not particularly important. + +01:03.680 --> 01:04.879 +What I want to emphasize, though, + +01:04.879 --> 01:08.400 +is that while Telegram is mostly text-based, + +01:08.400 --> 01:12.000 +there's also support for audio/video calls and notes, + +01:12.000 --> 01:13.600 +and there's also a lot of features + +01:13.600 --> 01:15.119 +which typically you find + +01:15.119 --> 01:17.360 +in other instant messaging platforms: + +01:17.360 --> 01:18.479 +you can chat with yourself, + +01:18.479 --> 01:19.360 +you can make polls, + +01:19.360 --> 01:20.159 +you can make quizzes, + +01:20.159 --> 01:21.280 +you can schedule messages, + +01:21.280 --> 01:23.280 +you can send attachments of any kind, + +01:23.280 --> 01:25.759 +even big ones, and you can send stickers. + +01:25.759 --> 01:27.759 +Telegram, overall, is quite customizable, + +01:27.759 --> 01:30.560 +and I would say that the platform is, overall, hackable. + +01:30.560 --> 01:32.799 +You can expand it with bots + +01:32.799 --> 01:35.280 +and the clients are open source. + +01:35.280 --> 01:37.280 +In all of this, we shouldn't forget, though, + +01:37.280 --> 01:38.448 +the Telegram is centralized + +01:38.448 --> 01:39.840 +and it is not free software. + +01:39.840 --> 01:42.720 +Nonetheless, it's still used by a number of people, + +01:42.720 --> 01:45.200 +and people use Telegram for different reasons. + +01:45.200 --> 01:47.200 +For example, some people use it to stay in touch + +01:47.200 --> 01:48.399 +with friends and families. + +01:48.399 --> 01:50.560 +For this, Telegram offers private chats + +01:50.560 --> 01:53.600 +or group chats with a restricted number of people. + +01:53.600 --> 01:55.040 +A lot of people use it + +01:55.040 --> 01:57.600 +for engaging in online communities. + +01:57.600 --> 01:59.439 +For this, Telegram has super groups, + +01:59.439 --> 02:00.719 +which are groups with up to + +02:00.719 --> 02:02.159 +hundreds of thousands of users, + +02:02.159 --> 02:03.360 +and has also channels, + +02:03.360 --> 02:07.119 +which are one-to-many ways of communicating, + +02:07.119 --> 02:09.280 +so these are ideally suited for, + +02:09.280 --> 02:10.959 +for example, following news, + +02:10.959 --> 02:12.167 +all sorts of news. + +02:12.167 --> 02:13.680 +Telegram also has bots + +02:13.680 --> 02:15.840 +which can be useful by themselves. + +02:15.840 --> 02:17.040 +They provide value. + +02:17.040 --> 02:18.400 +And the chat with oneself + +02:18.400 --> 02:20.400 +can be used for sending links, + +02:20.400 --> 02:23.440 +making notes, or sending reminders. + +02:23.440 --> 02:24.959 +So overall, there's multiple ways + +02:24.959 --> 02:26.560 +in which you can use Telegram. + +02:26.560 --> 02:28.239 +When it comes to instant messaging, + +02:28.239 --> 02:30.000 +many people call Telegram home. + +02:30.000 --> 02:31.840 +It shouldn't come as a surprise, then, + +02:31.840 --> 02:34.480 +that Emacs users want to meet + +02:34.480 --> 02:35.680 +on Telegram as well. + +02:35.680 --> 02:38.480 +And indeed, there's an Emacs community on Telegram. + +02:38.480 --> 02:41.519 +Here I'm listing a few super groups +about Emacs. + +02:41.519 --> 02:43.040 +There are language groups, + +02:43.040 --> 02:45.599 +so there's Emacs English, Emacs Russian, + +02:45.599 --> 02:48.800 +Emacs Spanish, Emacs Mandarin, Portuguese... + +02:48.800 --> 02:51.440 +There are groups which are specific to starter packs. + +02:51.440 --> 02:53.040 +For example, there are Doom Emacs, + +02:53.040 --> 02:54.879 +Spacemacs, and there are groups + +02:54.879 --> 02:57.280 +which are specific to packages like telega + +02:57.280 --> 02:58.720 +which I'm going to discuss later. + +02:58.720 --> 03:00.159 +These are what you would expect + +03:00.159 --> 03:02.800 +from traditional internet chat rooms. + +03:02.800 --> 03:04.319 +So they're used for shared links, + +03:04.319 --> 03:06.959 +they're used for discussing, troubleshooting, + +03:06.959 --> 03:09.120 +giving each other recommendations... + +03:09.120 --> 03:10.879 +I think there are healthy communities + +03:10.879 --> 03:12.239 +with typically a hundred + +03:12.239 --> 03:13.519 +to a thousand members. + +03:13.519 --> 03:15.280 +An example of an initiative that's put forth + +03:15.280 --> 03:16.879 +by the Emacs community on Telegram + +03:16.879 --> 03:18.720 +is @emacs_stories. @emacs_stories + +03:18.720 --> 03:21.680 +collects links and messages and pictures + +03:21.680 --> 03:24.080 +that can showcase what Emacs can do. + +03:24.080 --> 03:25.680 +One of the goals here is + +03:25.680 --> 03:28.239 +to show people that are new to emacs + +03:28.239 --> 03:29.120 +what you can achieve + +03:29.120 --> 03:31.200 +if you spend time with your editor. + +03:31.200 --> 03:32.480 +And here, what I'm showing you + +03:32.480 --> 03:34.159 +is a screenshot from Telega. + +03:34.159 --> 03:36.080 +So let's move on to the final topic + +03:36.080 --> 03:37.040 +of this discussion, + +03:37.040 --> 03:39.200 +which is telega.el. + +03:39.200 --> 03:41.440 +Telega is a terrific piece of software. + +03:41.440 --> 03:45.280 +Telega is a interface to telegram within Emacs. + +03:45.280 --> 03:46.959 +It's developed by @zevlg, + +03:46.959 --> 03:49.680 +which is a long-time Emacs hacker, + +03:49.680 --> 03:51.280 +and it's very actively developed. + +03:51.280 --> 03:54.000 +Telegram itself is under active development, + +03:54.000 --> 03:55.840 +and telega has to implement + +03:55.840 --> 03:57.200 +all these new features + +03:57.200 --> 03:58.720 +that Telegram implements. + +03:58.720 --> 04:00.400 +Indeed, Telega implements + +04:00.400 --> 04:01.360 +almost all the features + +04:01.360 --> 04:02.319 +available in Telegram, + +04:02.319 --> 04:04.159 +even things like live location, + +04:04.159 --> 04:05.439 +except for audio/video calls + +04:05.439 --> 04:07.040 +but these are work in progress. + +04:07.040 --> 04:08.000 +Just to give you an idea + +04:08.000 --> 04:09.040 +of the size of this effort, + +04:09.040 --> 04:09.680 +we're talking about + +04:09.680 --> 04:11.280 +30,000 lines of code, + +04:11.280 --> 04:12.720 +which doesn't tell you much, + +04:12.720 --> 04:14.080 +but maybe you can get a sense + +04:14.080 --> 04:16.000 +that this is a significant project. + +04:16.000 --> 04:18.400 +In fact, I think Telega is a really remarkable + +04:18.400 --> 04:19.199 +piece of software. + +04:19.199 --> 04:20.639 +Not only it implements all the features + +04:20.639 --> 04:21.680 +available in Telegram, + +04:21.680 --> 04:22.960 +but implements new ones, + +04:22.960 --> 04:25.120 +which are only available to Emacs users. + +04:25.120 --> 04:26.800 +Here I'm blinking the documentation + +04:26.800 --> 04:28.560 +for you to read if you're interested. + +04:28.560 --> 04:29.759 +What I want to mention, though, + +04:29.759 --> 04:31.360 +is that Telega is available on MELPA, + +04:31.360 --> 04:34.160 +but it requires an external library, TDlib. + +04:34.160 --> 04:35.759 +Most distributions do not pack + +04:35.759 --> 04:37.360 +a recent version of TDlib. + +04:37.360 --> 04:39.600 +Such you have to compile yourself. + +04:39.600 --> 04:41.280 +if you don't want to compile TDlib, + +04:41.280 --> 04:43.120 +you can use the officially supported + +04:43.120 --> 04:44.560 +Dockerfile or guix file + +04:44.560 --> 04:46.080 +so that you can get everything + +04:46.080 --> 04:48.000 +without too much worry. + +04:48.000 --> 04:50.720 +Now let me tell you more about Telegram. + +04:50.720 --> 04:52.080 +Of course, the best way is to just + +04:52.080 --> 04:53.520 +experiment with it yourself. + +04:53.520 --> 04:54.800 +And here I just want to give you + +04:54.800 --> 04:56.720 +a glimpse of how Telega works. + +04:56.720 --> 04:57.840 +When you start Telega, + +04:57.840 --> 05:00.000 +what you see is a root buffer. + +05:00.000 --> 05:01.280 +The root buffer is essentially + +05:01.280 --> 05:02.960 +the list of all the chats that you have, + +05:02.960 --> 05:05.199 +and, by itself, is a really powerful tool. + +05:05.199 --> 05:06.639 +You can use it for sorting + +05:06.639 --> 05:07.680 +and filtering your chats, + +05:07.680 --> 05:10.639 +or you can create groups which are thematic. + +05:10.639 --> 05:12.720 +There's sophisticated search functions. + +05:12.720 --> 05:14.240 +For example, if you want to search only + +05:14.240 --> 05:16.800 +for specific type of media, + +05:16.800 --> 05:18.240 +you can start new chats, + +05:18.240 --> 05:19.680 +you can get info about the chats, + +05:19.680 --> 05:22.479 +and you can even change Telegram settings + +05:22.479 --> 05:24.720 +which are applied across the board. + +05:24.720 --> 05:26.479 +Here I'm showing you an example + +05:26.479 --> 05:27.520 +of what it looks like. + +05:27.520 --> 05:30.720 +As you see, we're enjoying the support for emoji + +05:30.720 --> 05:33.039 +that Emacs has been improving upon + +05:33.039 --> 05:34.320 +over the past years. + +05:34.320 --> 05:36.400 +Once you select one of these charts, + +05:36.400 --> 05:38.880 +you're brought to the chat buffer. + +05:38.880 --> 05:40.400 +Here I'm showing an example of + +05:40.400 --> 05:42.320 +what a chat buffer looks like. + +05:42.320 --> 05:43.360 +So this is a screenshot + +05:43.360 --> 05:45.520 +from the Emacs English group + +05:45.520 --> 05:47.840 +where people were discussing about + +05:47.840 --> 05:49.039 +compiling Emacs. + +05:49.039 --> 05:52.000 +As you can see, we see the conversation. + +05:52.000 --> 05:53.280 +We see the avatars. + +05:53.280 --> 05:54.639 +We see that there's a thread. + +05:54.639 --> 05:55.440 +We also see that + +05:55.440 --> 05:57.360 +I'm going to send a message, + +05:57.360 --> 05:58.240 +message with emoji, + +05:58.240 --> 05:59.440 +a message with formatting, + +05:59.440 --> 06:01.120 +and I'm attaching an object. + +06:01.120 --> 06:03.680 +I can format my messages + +06:03.680 --> 06:05.520 +using Markdown or Org Mode + +06:05.520 --> 06:06.720 +or whatever I prefer + +06:06.720 --> 06:09.199 +and I can attach any kind of attachment + +06:09.199 --> 06:10.560 +I like. For example... + +06:10.560 --> 06:11.520 +What I can also do is, + +06:11.520 --> 06:13.120 +if I'm editing a buffer, + +06:13.120 --> 06:15.680 +I can send that buffer through Telega, + +06:15.680 --> 06:17.199 +which I find quite useful + +06:17.199 --> 06:18.720 +especially when I'm sending code. + +06:18.720 --> 06:20.240 +And again, just to show you that + +06:20.240 --> 06:22.319 +Telegram is not just text messages + +06:22.319 --> 06:25.199 +and Telega supports all the features in Telegram, + +06:25.199 --> 06:27.199 +here at the bottom, I'm showing + +06:27.199 --> 06:29.759 +a voice note being played through Emacs, + +06:29.759 --> 06:31.919 +and as you see, there are some buttons + +06:31.919 --> 06:33.199 +which are functional. + +06:33.199 --> 06:36.240 +If I hit the two times button, + +06:36.240 --> 06:38.160 +the playback speed will be twice, + +06:38.160 --> 06:39.600 +which is really neat. + +06:39.600 --> 06:40.800 +Telega and Emacs can even + +06:40.800 --> 06:43.039 +reproduce videos or gifs, + +06:43.039 --> 06:45.280 +at least for a recent version of Emacs. + +06:45.280 --> 06:47.520 +Finally, I want to emphasize that Telega + +06:47.520 --> 06:49.280 +integrates really well with Emacs. + +06:49.280 --> 06:51.039 +For example, we are showing you + +06:51.039 --> 06:54.319 +how you can use a transient interface + +06:54.319 --> 06:56.720 +to Telega, or on the other side, + +06:56.720 --> 06:59.280 +I'm showing you how Telega integrates + +06:59.280 --> 07:00.080 +with dashboard, + +07:00.080 --> 07:01.440 +so that we have recent chats + +07:01.440 --> 07:03.120 +and we have the Emacs stories. + +07:03.120 --> 07:03.840 +Because, you know, + +07:03.840 --> 07:05.759 +who doesn't like Emacs with stories. + +07:05.759 --> 07:06.880 +On top, on the other hand, + +07:06.880 --> 07:08.880 +I'm showing you that we can have + +07:08.880 --> 07:09.919 +syntax highlighting, + +07:09.919 --> 07:11.759 +which is something that Telegram by itself + +07:11.759 --> 07:14.240 +doesn't have, this Emacs-only feature, + +07:14.240 --> 07:15.919 +and we can edit this + +07:15.919 --> 07:17.599 +in the same way we edit + +07:17.599 --> 07:19.759 +Org Mode source blocks, + +07:19.759 --> 07:20.880 +so we can edit this + +07:20.880 --> 07:22.800 +with the minor mode for, + +07:22.800 --> 07:24.080 +in this case, Emacs Lisp. + +07:24.080 --> 07:26.240 +So, to conclude, I wanted to show you + +07:26.240 --> 07:27.759 +that the Emacs community + +07:27.759 --> 07:29.120 +also meets on Telegram, + +07:29.120 --> 07:31.360 +and we're an active and healthy community, + +07:31.360 --> 07:32.880 +and I want to present Telega + +07:32.880 --> 07:35.759 +as a really amazing piece of software, + +07:35.759 --> 07:37.919 +one of the best clients available for + +07:37.919 --> 07:39.599 +Telegram with Emacs. + +07:39.599 --> 07:41.680 +Even if you don't use Telegram, + +07:41.680 --> 07:43.599 +I think you should have a look at Telega + +07:43.599 --> 07:46.080 +just to appreciate how amazing + +07:46.080 --> 07:47.280 +a piece of software it is. + +07:47.280 --> 07:49.680 +And with this, I thank you for your attention, + +07:49.680 --> 07:50.960 +and if you like Telega, + +07:50.960 --> 07:52.720 +please consider donating + +07:52.720 --> 07:54.800 +to support the development of the package. + +07:54.800 --> 07:57.599 +Thanks. diff --git a/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla-and-evgeny-zajcev--main.vtt b/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla-and-evgeny-zajcev--main.vtt new file mode 100644 index 00000000..87161e3d --- /dev/null +++ b/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla-and-evgeny-zajcev--main.vtt @@ -0,0 +1,769 @@ +WEBVTT + +00:00.000 --> 00:01.599 +Hello, my name is Gabriele, + +00:01.599 --> 00:03.439 +and today I'm going to tell you about Telega + +00:03.439 --> 00:05.600 +and the Emacs community on Telegram. + +00:05.600 --> 00:08.400 +I'm not affiliated with Telegram or Telega, + +00:08.400 --> 00:10.719 +and opinions are my own in general. + +00:10.719 --> 00:14.160 +I'm going to give you my personal spin about these topics. + +00:14.160 --> 00:16.160 +The plan for the talk is the following. + +00:16.160 --> 00:18.800 +First, I'm going to talk about what is Telegram. + +00:18.800 --> 00:19.840 +Next, I'm going to tell you + +00:19.840 --> 00:21.840 +about the Emacs community on Telegram. + +00:21.840 --> 00:24.720 +And finally, I'm going to discuss telega.el, + +00:24.720 --> 00:26.560 +an Emacs package for Telegram. + +00:26.560 --> 00:29.359 +In all of these, I'm now going to dive into details. + +00:29.359 --> 00:30.880 +My goal here is to give you + +00:30.880 --> 00:33.120 +some exposure about these topics. + +00:33.120 --> 00:35.840 +You can find out more online, if you want. + +00:35.840 --> 00:38.960 +Let's get started with what is +Telegram. + +00:38.960 --> 00:41.100 +Telegram is a cloud-based + +00:41.100 --> 00:42.879 +instant messaging platform. + +00:42.879 --> 00:44.079 +It's a popular one. + +00:44.079 --> 00:46.559 +It has more than half a billion users. + +00:46.559 --> 00:47.840 +I think one of the reasons + +00:47.840 --> 00:49.600 +why it's so popular, it's because + +00:49.600 --> 00:51.360 +it's really rich in features + +00:51.360 --> 00:52.960 +while being user friendly. + +00:52.960 --> 00:54.640 +Hence, in some regions, + +00:54.640 --> 00:56.960 +Telegram has good market penetration. + +00:56.960 --> 00:59.039 +And of course, because of network effects, + +00:59.039 --> 01:01.120 +this brings even more users. + +01:01.120 --> 01:02.239 +The details of the features + +01:02.239 --> 01:03.680 +is not particularly important. + +01:03.680 --> 01:04.879 +What i want to emphasize, though, + +01:04.879 --> 01:08.400 +is that while telegram is mostly text-based + +01:08.400 --> 01:12.000 +there's also support for audio/video calls and notes, + +01:12.000 --> 01:13.600 +and there's also a lot of features + +01:13.600 --> 01:15.119 +which typically you find + +01:15.119 --> 01:17.360 +in other instant messaging platforms: + +01:17.360 --> 01:18.479 +you can chat with yourself, + +01:18.479 --> 01:19.360 +you can make polls, + +01:19.360 --> 01:20.159 +you can make quizzes, + +01:20.159 --> 01:21.280 +you can schedule messages, + +01:21.280 --> 01:23.280 +you can send attachments of any kind, + +01:23.280 --> 01:25.759 +even big ones, and you can send stickers. + +01:25.759 --> 01:27.759 +Telegram, overall, is quite customizable, + +01:27.759 --> 01:30.560 +and I would say that the platform is, overall, hackable. + +01:30.560 --> 01:32.799 +You can expand it with bots + +01:32.799 --> 01:35.280 +and the clients are open source. + +01:35.280 --> 01:37.280 +In all of this, we shouldn't forget, though, + +01:37.280 --> 01:38.448 +the Telegram is centralized + +01:38.448 --> 01:39.840 +and it is not free software. + +01:39.840 --> 01:42.720 +Nonetheless, it's still used by a number of people, + +01:42.720 --> 01:45.200 +and people use telegram for different reasons. + +01:45.200 --> 01:47.200 +For example, some people use it to stay in touch + +01:47.200 --> 01:48.399 +with friends and families. + +01:48.399 --> 01:50.560 +For this, Telegram offers private chats + +01:50.560 --> 01:53.600 +or group chats with a restricted number of people. + +01:53.600 --> 01:55.040 +A lot of people use it + +01:55.040 --> 01:57.600 +for engaging in online communities. + +01:57.600 --> 01:59.439 +For this, Telegram has super groups, + +01:59.439 --> 02:00.719 +which are groups with up to + +02:00.719 --> 02:02.159 +hundreds of thousands of users, + +02:02.159 --> 02:03.360 +and has also channels, + +02:03.360 --> 02:07.119 +which are one-to-many ways of communicating, + +02:07.119 --> 02:09.280 +so these are ideally suited for, + +02:09.280 --> 02:10.959 +for example, following news, + +02:10.959 --> 02:12.167 +all sorts of news. + +02:12.167 --> 02:13.680 +Telegram also has bots + +02:13.680 --> 02:15.840 +which can be useful by themselves. + +02:15.840 --> 02:17.040 +They provide value. + +02:17.040 --> 02:18.400 +And the chat with oneself + +02:18.400 --> 02:20.400 +can be used for sending links, + +02:20.400 --> 02:23.440 +making notes, or sending reminders. + +02:23.440 --> 02:24.959 +So overall, there's multiple ways + +02:24.959 --> 02:26.560 +in which you can use telegram. + +02:26.560 --> 02:28.239 +When it comes to instant messaging, + +02:28.239 --> 02:30.000 +many people call Telegram home. + +02:30.000 --> 02:31.840 +It shouldn't come as a surprise, then, + +02:31.840 --> 02:34.480 +that Emacs users want to +meet + +02:34.480 --> 02:35.680 +on Telegram as well. + +02:35.680 --> 02:38.480 +And indeed, there's an Emacs community on Telegram. + +02:38.480 --> 02:41.519 +Here I'm listing a few super groups +about Emacs. + +02:41.519 --> 02:43.040 +There are language groups, + +02:43.040 --> 02:45.599 +so there's Emacs English, Emacs Russian, + +02:45.599 --> 02:48.800 +Emacs Spanish, Emacs Mandarin, Portuguese... + +02:48.800 --> 02:51.440 +There are groups which are specific to starter packs. + +02:51.440 --> 02:53.040 +For example, there are Doom Emacs, + +02:53.040 --> 02:54.879 +Spacemacs, and there are groups + +02:54.879 --> 02:57.280 +which are specific to packages like telega + +02:57.280 --> 02:58.720 +which I'm going to discuss later. + +02:58.720 --> 03:00.159 +These are what you would expect + +03:00.159 --> 03:02.800 +from traditional internet chat rooms. + +03:02.800 --> 03:04.319 +So they're used for shared links, + +03:04.319 --> 03:06.959 +they're used for discussing, troubleshooting, + +03:06.959 --> 03:09.120 +giving each other recommendations... + +03:09.120 --> 03:10.879 +I think there are healthy communities + +03:10.879 --> 03:12.239 +with typically a hundred + +03:12.239 --> 03:13.519 +to a thousand members. + +03:13.519 --> 03:15.280 +An example of an initiative that's put forth + +03:15.280 --> 03:16.879 +by the Emacs community on Telegram + +03:16.879 --> 03:18.720 +is @emacs_stories. @emacs_stories + +03:18.720 --> 03:21.680 +collects links and messages and pictures + +03:21.680 --> 03:24.080 +that can showcase what Emacs can do. + +03:24.080 --> 03:25.680 +One of the goals here is + +03:25.680 --> 03:28.239 +to show people that are new to emacs + +03:28.239 --> 03:29.120 +what you can achieve + +03:29.120 --> 03:31.200 +if you spend time with your editor. + +03:31.200 --> 03:32.480 +And here, what I'm showing you + +03:32.480 --> 03:34.159 +is a screenshot from Telega. + +03:34.159 --> 03:36.080 +So let's move on to the final topic + +03:36.080 --> 03:37.040 +of this discussion, + +03:37.040 --> 03:39.200 +which is telega.el. + +03:39.200 --> 03:41.440 +Telega is a terrific piece of software. + +03:41.440 --> 03:45.280 +Telega is a interface to telegram within Emacs. + +03:45.280 --> 03:46.959 +It's developed by @zevlg, + +03:46.959 --> 03:49.680 +which is a long-time Emacs hacker, + +03:49.680 --> 03:51.280 +and it's very actively developed. + +03:51.280 --> 03:54.000 +Telegram itself is under active development, + +03:54.000 --> 03:55.840 +and telega has to implement + +03:55.840 --> 03:57.200 +all these new features + +03:57.200 --> 03:58.720 +that Telegram implements. + +03:58.720 --> 04:00.400 +Indeed, Telega implements + +04:00.400 --> 04:01.360 +almost all the features + +04:01.360 --> 04:02.319 +available in Telegram, + +04:02.319 --> 04:04.159 +even things like live location, + +04:04.159 --> 04:05.439 +except for audio/video calls + +04:05.439 --> 04:07.040 +but these are work in progress. + +04:07.040 --> 04:08.000 +Just to give you an idea + +04:08.000 --> 04:09.040 +of the size of this effort, + +04:09.040 --> 04:09.680 +we're talking about + +04:09.680 --> 04:11.280 +30,000 lines of code, + +04:11.280 --> 04:12.720 +which doesn't tell you much, + +04:12.720 --> 04:14.080 +but maybe you can get a sense + +04:14.080 --> 04:16.000 +that this is a significant project. + +04:16.000 --> 04:18.400 +In fact, I think Telega is a really remarkable + +04:18.400 --> 04:19.199 +piece of software. + +04:19.199 --> 04:20.639 +Not only it implements all the features + +04:20.639 --> 04:21.680 +available in Telegram, + +04:21.680 --> 04:22.960 +but implements new ones, + +04:22.960 --> 04:25.120 +which are only available to Emacs users. + +04:25.120 --> 04:26.800 +Here I'm blinking the documentation + +04:26.800 --> 04:28.560 +for you to read if you're interested. + +04:28.560 --> 04:29.759 +What I want to mention, though, + +04:29.759 --> 04:31.360 +is that Telega is available on MELPA, + +04:31.360 --> 04:34.160 +but it requires an external library, TDlib. + +04:34.160 --> 04:35.759 +Most distributions do not pack + +04:35.759 --> 04:37.360 +a recent version of TDlib. + +04:37.360 --> 04:39.600 +Such you have to compile yourself. + +04:39.600 --> 04:41.280 +if you don't want to compile TDlib, + +04:41.280 --> 04:43.120 +you can use the officially supported + +04:43.120 --> 04:44.560 +Dockerfile or guix file + +04:44.560 --> 04:46.080 +so that you can get everything + +04:46.080 --> 04:48.000 +without too much worry. + +04:48.000 --> 04:50.720 +Now let me tell you more about Telegram. + +04:50.720 --> 04:52.080 +Of course, the best way is to just + +04:52.080 --> 04:53.520 +experiment with it yourself. + +04:53.520 --> 04:54.800 +And here I just want to give you + +04:54.800 --> 04:56.720 +a glimpse of how Telega works. + +04:56.720 --> 04:57.840 +When you start Telega, + +04:57.840 --> 05:00.000 +what you see is a root buffer. + +05:00.000 --> 05:01.280 +The root buffer is essentially + +05:01.280 --> 05:02.960 +the list of all the chats that you have, + +05:02.960 --> 05:05.199 +and, by itself, is a really powerful tool. + +05:05.199 --> 05:06.639 +You can use it for sorting + +05:06.639 --> 05:07.680 +and filtering your chats, + +05:07.680 --> 05:10.639 +or you can create groups which are thematic. + +05:10.639 --> 05:12.720 +There's sophisticated search functions. + +05:12.720 --> 05:14.240 +For example, if you want to search only + +05:14.240 --> 05:16.800 +for specific type of media, + +05:16.800 --> 05:18.240 +you can start new chats, + +05:18.240 --> 05:19.680 +you can get info about the chats, + +05:19.680 --> 05:22.479 +and you can even change Telegram settings + +05:22.479 --> 05:24.720 +which are applied across the board. + +05:24.720 --> 05:26.479 +Here I'm showing you an example + +05:26.479 --> 05:27.520 +of what it looks like. + +05:27.520 --> 05:30.720 +As you see, we're enjoying the support for emoji + +05:30.720 --> 05:33.039 +that Emacs has been improving upon + +05:33.039 --> 05:34.320 +over the past years. + +05:34.320 --> 05:36.400 +Once you select one of these charts, + +05:36.400 --> 05:38.880 +you're brought to the chat buffer. + +05:38.880 --> 05:40.400 +Here I'm showing an example of + +05:40.400 --> 05:42.320 +what a chat buffer looks like. + +05:42.320 --> 05:43.360 +So this is a screenshot + +05:43.360 --> 05:45.520 +from the Emacs English group + +05:45.520 --> 05:47.840 +where people were discussing about + +05:47.840 --> 05:49.039 +compiling Emacs. + +05:49.039 --> 05:52.000 +As you can see, we see the conversation. + +05:52.000 --> 05:53.280 +We see the avatars. + +05:53.280 --> 05:54.639 +We see that there's a thread. + +05:54.639 --> 05:55.440 +We also see that + +05:55.440 --> 05:57.360 +I'm going to send a message, + +05:57.360 --> 05:58.240 +message with emoji, + +05:58.240 --> 05:59.440 +a message with formatting, + +05:59.440 --> 06:01.120 +and I'm attaching an object. + +06:01.120 --> 06:03.680 +I can format my messages + +06:03.680 --> 06:05.520 +using Markdown or Org Mode + +06:05.520 --> 06:06.720 +or whatever I prefer + +06:06.720 --> 06:09.199 +and I can attach any kind of attachment + +06:09.199 --> 06:10.560 +I like. For example... + +06:10.560 --> 06:11.520 +What I can also do is, + +06:11.520 --> 06:13.120 +if I'm editing a buffer, + +06:13.120 --> 06:15.680 +I can send that buffer through Telega, + +06:15.680 --> 06:17.199 +which I find quite useful + +06:17.199 --> 06:18.720 +especially when I'm sending code. + +06:18.720 --> 06:20.240 +And again, just to show you that + +06:20.240 --> 06:22.319 +Telegram is not just text messages + +06:22.319 --> 06:25.199 +and Telega supports all the features in Telegram, + +06:25.199 --> 06:27.199 +here at the bottom, I'm showing + +06:27.199 --> 06:29.759 +a voice note being played through Emacs, + +06:29.759 --> 06:31.919 +and as you see, there are some buttons + +06:31.919 --> 06:33.199 +which are functional. + +06:33.199 --> 06:36.240 +If I hit the two times button, + +06:36.240 --> 06:38.160 +the playback speed will be twice, + +06:38.160 --> 06:39.600 +which is really neat. + +06:39.600 --> 06:40.800 +Telega and Emacs can even + +06:40.800 --> 06:43.039 +reproduce videos or gifs, + +06:43.039 --> 06:45.280 +at least for a recent version of Emacs. + +06:45.280 --> 06:47.520 +Finally, I want to emphasize that Telega + +06:47.520 --> 06:49.280 +integrates really well with Emacs. + +06:49.280 --> 06:51.039 +For example, we are showing you + +06:51.039 --> 06:54.319 +how you can use a transient interface + +06:54.319 --> 06:56.720 +to Telega, or on the other side, + +06:56.720 --> 06:59.280 +I'm showing you how Telega integrates + +06:59.280 --> 07:00.080 +with dashboard, + +07:00.080 --> 07:01.440 +so that we have recent chats + +07:01.440 --> 07:03.120 +and we have the Emacs stories. + +07:03.120 --> 07:03.840 +Because, you know, + +07:03.840 --> 07:05.759 +who doesn't like Emacs with stories. + +07:05.759 --> 07:06.880 +On top, on the other hand, + +07:06.880 --> 07:08.880 +I'm showing you that we can have + +07:08.880 --> 07:09.919 +syntax highlighting, + +07:09.919 --> 07:11.759 +which is something that Telegram by itself + +07:11.759 --> 07:14.240 +doesn't have, this Emacs-only feature, + +07:14.240 --> 07:15.919 +and we can edit this + +07:15.919 --> 07:17.599 +in the same way we edit + +07:17.599 --> 07:19.759 +Org Mode source blocks, + +07:19.759 --> 07:20.880 +so we can edit this + +07:20.880 --> 07:22.800 +with the minor mode for, + +07:22.800 --> 07:24.080 +in this case, Emacs Lisp. + +07:24.080 --> 07:26.240 +So, to conclude, I wanted to show you + +07:26.240 --> 07:27.759 +that the Emacs community + +07:27.759 --> 07:29.120 +also meets on Telegram, + +07:29.120 --> 07:31.360 +and we're an active and healthy community, + +07:31.360 --> 07:32.880 +and I want to present Telega + +07:32.880 --> 07:35.759 +as a really amazing piece of software, + +07:35.759 --> 07:37.919 +one of the best clients available for + +07:37.919 --> 07:39.599 +Telegram with Emacs. + +07:39.599 --> 07:41.680 +Even if you don't use Telegram, + +07:41.680 --> 07:43.599 +I think you should have a look at Telega + +07:43.599 --> 07:46.080 +just to appreciate how amazing + +07:46.080 --> 07:47.280 +a piece of software it is. + +07:47.280 --> 07:49.680 +And with this, I thank you for your attention, + +07:49.680 --> 07:50.960 +and if you like Telega, + +07:50.960 --> 07:52.720 +please consider donating + +07:52.720 --> 07:54.800 +to support the development of the package. + +07:54.800 --> 07:57.599 +Thanks. |