From dd3abff950a4a3082a572defe7bc9149587b790d Mon Sep 17 00:00:00 2001 From: Sacha Chua Date: Sat, 27 Nov 2021 15:00:41 -0500 Subject: Update --- ...e-to-teach-programming--daniel-german--main.vtt | 1663 ++++++++++++++++++++ 1 file changed, 1663 insertions(+) create mode 100644 2021/captions/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt diff --git a/2021/captions/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt b/2021/captions/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt new file mode 100644 index 00000000..aee8f7ba --- /dev/null +++ b/2021/captions/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt @@ -0,0 +1,1663 @@ +WEBVTT + +00:01.040 --> 00:03.520 +Hello, everybody. My name is Daniel German. + +00:03.520 --> 00:00:04.799 +I'm a professor of computer science + +00:00:04.799 --> 00:00:06.080 +at the University of Victoria, + +00:00:06.080 --> 00:00:07.680 +and I have been teaching programming + +00:00:07.680 --> 00:00:12.080 +for more than 10 years. + +00:12.080 --> 00:00:14.639 +I want to tell you today + +00:00:14.639 --> 00:00:15.759 +about how I have been + +00:00:15.759 --> 00:00:17.680 +using Emacs effectively + +00:00:17.680 --> 00:00:20.000 +during the last 10 years, + +00:00:20.000 --> 00:00:22.880 +and to try to improve how I not only + +00:00:22.880 --> 00:00:24.720 +create content for my students, + +00:24.720 --> 00:00:26.480 +but also how I deliver it, + +00:00:26.480 --> 00:00:27.680 +and particularly how, + +00:00:27.680 --> 00:00:29.119 +within the last five years, + +00:00:29.119 --> 00:00:31.599 +I have been using Org mode + +00:00:31.599 --> 00:00:33.200 +in a very effective way + +00:33.200 --> 00:00:35.600 +that benefits both + +00:00:35.600 --> 00:00:38.239 +my students and myself + +00:38.239 --> 00:00:40.480 +in the creation and the delivery + +00:00:40.480 --> 00:00:42.399 +of content. + +00:42.399 --> 00:00:45.200 +Let me switch to my computer. + +00:00:45.200 --> 00:00:46.480 +I'm going to remove myself + +00:00:46.480 --> 00:00:47.840 +because I can use + +00:00:47.840 --> 00:00:50.800 +all the real-estate screen. + +00:51.840 --> 00:54.079 +The goal of my presentation today + +00:54.079 --> 00:00:55.600 +is really to give you + +00:00:55.600 --> 00:00:59.280 +a little bit of an overview + +00:00:59.280 --> 00:01:03.440 +of how I have been able to + +01:03.440 --> 00:01:06.240 +combine the use of Org mode + +00:01:06.240 --> 00:01:08.560 +and with some other tools. + +00:01:08.560 --> 00:01:10.880 +I'll talk about specifically about them + +00:01:10.880 --> 00:01:13.680 +and then also offer some suggestions + +00:01:13.680 --> 00:01:14.640 +and recommendations + +00:01:14.640 --> 00:01:16.240 +in how to get it started. + +01:16.240 --> 00:01:18.799 +I have created a configuration, + +00:01:18.799 --> 00:01:20.080 +a set of configuration files + +00:01:20.080 --> 00:01:20.799 +that you can use. + +00:01:20.799 --> 00:01:22.880 +I will describe them towards the end. + +01:22.880 --> 00:01:28.240 +Hopefully, it will make it easy + +00:01:28.240 --> 00:01:31.439 +for all of you to get started on using it. + +01:31.439 --> 01:33.200 +So we start talking a little bit + +01:33.200 --> 00:01:34.079 +about the challenges + +00:01:34.079 --> 00:01:35.119 +of teaching programming. + +00:01:35.119 --> 00:01:37.200 +I think that the fundamental one + +00:01:37.200 --> 00:01:41.680 +is that keeping the content + +00:01:41.680 --> 00:01:45.280 +and the slides up to date is hard, + +00:01:45.280 --> 00:01:46.960 +because the content is programs. + +00:01:46.960 --> 00:01:47.840 +There are programs + +00:01:47.840 --> 00:01:50.399 +that sometimes have errors, + +00:01:50.399 --> 00:01:53.759 +and sometimes the slides are + +00:01:53.759 --> 00:01:58.079 +incomplete snippets of code, and that + +00:01:58.079 --> 00:02:00.240 +once they go into the slides software, + +00:02:00.240 --> 00:02:01.840 +like Google Slides or PowerPoint, + +00:02:01.840 --> 00:02:04.159 +they're essentially static objects. + +02:05.520 --> 00:02:07.439 +If we need to update them, + +00:02:07.439 --> 00:02:09.920 +we basically don't know + +00:02:09.920 --> 00:02:12.160 +whether the update code actually works, + +00:02:12.160 --> 00:02:13.440 +or does it work? + +00:02:13.440 --> 00:02:16.000 +Also, we cannot insert automatically + +00:02:16.000 --> 00:02:16.400 +the output. + +00:02:16.400 --> 00:02:18.480 +We'll have to run the snippet outside, + +00:02:18.480 --> 00:02:20.560 +and run it, and then insert that code. + +00:02:20.560 --> 00:02:22.080 +So that's very cumbersome. + +00:02:22.080 --> 00:02:23.200 +It's really, really one of the + +00:02:23.200 --> 00:02:26.080 +major challenges of using a slide software + +00:02:26.080 --> 00:02:29.360 +to teach programming. + +02:29.360 --> 00:02:30.879 +The other thing is that + +00:02:30.879 --> 00:02:32.000 +during the presentation, + +00:02:32.000 --> 00:02:33.440 +there's nothing you can do with the code. + +00:02:33.440 --> 00:02:34.480 +You might be able to edit it, + +00:02:34.480 --> 00:02:35.440 +but you cannot run it. + +00:02:35.440 --> 00:02:37.360 +You have to move outside of the + +00:02:37.360 --> 00:02:38.640 +presentation software + +00:02:38.640 --> 00:02:41.200 +to be able to execute the code. + +02:42.800 --> 00:02:44.640 +The last one is kind of related to + +00:02:44.640 --> 00:02:46.959 +the previous two. + +02:46.959 --> 00:02:48.800 +You don't have a single file + +00:02:48.800 --> 00:02:51.121 +and your information is spread across + +00:02:51.121 --> 00:02:52.879 +many, many different files, + +00:02:52.879 --> 00:02:54.080 +especially if you have lots of + +00:02:54.080 --> 00:02:55.760 +different snippets in your slides. + +00:02:55.760 --> 00:02:56.959 +You probably have a lot of + +00:02:56.959 --> 00:02:59.440 +different small files, each of them + +02:59.440 --> 03:01.599 +contributing something to your slides, + +03:01.599 --> 03:06.239 +and so it becomes a pain to manage. + +03:07.280 --> 00:03:10.080 +All of this is where Org mode + +00:03:10.080 --> 00:03:12.640 +really excels. Org mode is capable of + +00:03:12.640 --> 00:03:15.840 +doing everything, and it needs + +00:03:15.840 --> 00:03:18.400 +a little bit of help from some friends. + +00:03:18.400 --> 00:03:22.159 +I will describe what I mean by that. + +00:03:22.159 --> 00:03:23.040 +But the other thing + +00:03:23.040 --> 00:03:24.480 +that is also very valuable + +03:24.480 --> 00:03:27.440 +is that it's within the magic of Emacs. + +00:03:27.440 --> 00:03:30.480 +I absolutely love to be able to + +03:30.480 --> 00:03:32.879 +work with text within Emacs. + +00:03:32.879 --> 00:03:34.799 +I enjoy actually creating my notes + +00:03:34.799 --> 00:03:36.640 +in Org mode way more than if I was + +00:03:36.640 --> 00:03:39.360 +making them in Google Slides. + +03:39.360 --> 00:03:42.400 +Let me start by giving you a short demo. + +00:03:42.400 --> 00:03:46.400 +I have been teaching programming in C++ + +00:03:46.400 --> 00:03:47.519 +for around five years, + +00:03:47.519 --> 00:03:50.159 +and this was really the trigger towards + +03:50.159 --> 00:03:53.280 +trying to do everything within Org mode. + +00:03:53.280 --> 00:03:58.159 +So I have a repository in GitHub, + +00:03:58.159 --> 00:03:59.439 +and I think that GitHub + +00:03:59.439 --> 00:04:00.560 +is an excellent tool + +00:04:00.560 --> 00:04:04.480 +that works collaboration with Org mode. + +04:04.480 --> 00:04:05.439 +I'll describe actually + +00:04:05.439 --> 00:04:07.680 +what I mean by that. + +00:04:07.680 --> 00:04:09.680 +My lectures are essentially Org files. + +00:04:09.680 --> 00:04:12.480 +So, for example, let's go into + +00:04:12.480 --> 00:04:15.040 +one of these files. + +04:15.040 --> 00:04:16.799 +This is a an Org file. + +00:04:16.799 --> 00:04:21.199 +You can actually see it in the extension. + +04:21.199 --> 04:26.160 +I get a table of contents. + +04:26.160 --> 00:04:28.000 +GitHub creates or give us actually + +00:04:28.000 --> 00:04:31.280 +the ability to quickly jump, and it creates + +00:04:31.280 --> 00:04:32.880 +a dynamic table of contents, + +00:04:32.880 --> 00:04:33.759 +but I also can actually + +00:04:33.759 --> 00:04:35.280 +create it automatically, + +00:04:35.280 --> 00:04:36.800 +and then here it goes. + +00:04:36.800 --> 00:04:38.479 +This is the code that i have. + +00:04:38.479 --> 00:04:41.440 +This is a snippet + +00:04:41.440 --> 00:04:44.240 +that I present in the class. + +04:44.240 --> 00:04:45.680 +Let me actually show you + +00:04:45.680 --> 00:04:48.400 +how I do it within Emacs. + +04:48.400 --> 00:04:52.160 +So what I will do is the following. + +00:04:52.160 --> 00:04:55.440 +Let me try to open that file. + +04:57.919 --> 04:59.440 +Here's the file, + +04:59.440 --> 00:05:00.880 +and it's exactly the same + +00:05:00.880 --> 00:05:03.759 +that we were browsing in GitHub. + +00:05:03.759 --> 00:05:08.720 +What I do is I simply just scroll through + +05:08.720 --> 00:05:10.160 +the document. It's almost like + +00:05:10.160 --> 00:05:13.440 +movie credits at the end of the movie. + +00:05:13.440 --> 00:05:15.360 +I don't break them into chunks + +00:05:15.360 --> 00:05:16.639 +that I show in the screen. + +00:05:16.639 --> 00:05:18.320 +I see no point in doing that. + +00:05:18.320 --> 00:05:20.880 +What I do is I simply scroll through + +00:05:20.880 --> 00:05:24.160 +the text. The students are able to see + +00:05:24.160 --> 00:05:26.560 +the same information in GitHub + +00:05:26.560 --> 00:05:27.759 +on their computer, + +05:27.759 --> 00:05:29.680 +or they can print it if they want, + +00:05:29.680 --> 00:05:31.039 +and they are able to actually + +00:05:31.039 --> 00:05:32.560 +follow with me, and then having + +00:05:32.560 --> 00:05:33.759 +a much bigger picture + +05:33.759 --> 05:36.320 +than if i just show a very small snippet. + +05:36.320 --> 00:05:38.800 +In the case that the snippet is too big, + +00:05:38.800 --> 00:05:40.800 +for example, let's say this one + +00:05:40.800 --> 00:05:42.240 +actually doesn't cover the... + +00:05:42.240 --> 00:05:43.759 +covers more than full screen, + +00:05:43.759 --> 00:05:45.360 +I actually reduce the size + +00:05:45.360 --> 00:05:48.000 +and then give a little bit of + +00:05:48.000 --> 00:05:49.759 +an explanation of the whole thing, + +00:05:49.759 --> 00:05:51.600 +and then focus and say this is the line + +00:05:51.600 --> 00:05:53.600 +where we have to pay attention. + +05:53.600 --> 00:05:55.600 +Notice actually how I use color for that. + +00:05:55.600 --> 00:05:57.759 +I think that the ability to use color + +00:05:57.759 --> 00:05:59.759 +and typesetting is fundamental + +00:05:59.759 --> 00:06:01.520 +to be able to do this effectively, + +00:06:01.520 --> 00:06:02.720 +and the nice thing is that + +00:06:02.720 --> 00:06:04.160 +we can configure Org mode + +00:06:04.160 --> 00:06:05.840 +to be able to do most of this + +06:05.840 --> 06:08.160 +automatically. + +06:08.160 --> 00:06:09.360 +As I said before, + +00:06:09.360 --> 00:06:10.960 +one of the great advantages is that + +00:06:10.960 --> 00:06:13.600 +I can actually run the code dynamically. + +00:06:13.600 --> 00:06:15.360 +So let's say that the student says, + +00:06:15.360 --> 00:06:17.360 +"But what if I change that value to 10?" + +00:06:17.360 --> 00:06:18.560 +Well, let's try it. + +00:06:18.560 --> 00:06:20.560 +Let's change it, run it, + +06:20.560 --> 00:06:21.840 +and then you can see here + +00:06:21.840 --> 00:06:24.720 +that it has a 10. + +00:06:24.720 --> 00:06:26.960 +That's really powerful because + +00:06:26.960 --> 00:06:29.280 +you're not tied to + +00:06:29.280 --> 00:06:30.560 +what is the content you have + +00:06:30.560 --> 00:06:33.120 +on the slides. If you find an error + +00:06:33.120 --> 00:06:34.880 +or an omission, or you want to talk about + +06:34.880 --> 00:06:36.880 +something else, you can very quickly + +00:06:36.880 --> 00:06:40.720 +do it. You can add comments + +00:06:40.720 --> 00:06:42.080 +and then make some suggestions + +00:06:42.080 --> 00:06:43.840 +specifically to that, + +06:43.840 --> 00:06:45.680 +or worst-case scenario, + +00:06:45.680 --> 00:06:48.880 +if you really, really, need it, + +06:48.880 --> 00:06:55.440 +you can say, "Let's load it into..." + +00:06:55.440 --> 00:06:58.400 +Let's actually do some hand annotation. + +00:06:58.400 --> 00:07:00.319 +Let's actually say, "look at this thing, + +00:07:00.319 --> 00:07:01.840 +this is the value that I want you to + +07:01.840 --> 00:07:02.800 +concentrate on." + +00:07:02.800 --> 00:07:03.599 +It's not perfect. + +00:07:03.599 --> 00:07:04.960 +I'm not doing it with an Emacs. + +00:07:04.960 --> 00:07:06.960 +I wish there was a way to do it, + +00:07:06.960 --> 00:07:09.120 +but it is absolutely effective + +00:07:09.120 --> 00:07:10.720 +because I'm actually able to + +00:07:10.720 --> 00:07:12.800 +use the power. Notice that all that is + +07:12.800 --> 07:15.520 +exported is just the block, and also + +07:15.520 --> 07:22.400 +the color and typesetting, + +07:22.400 --> 00:07:24.560 +the typesetting of the content. + +00:07:24.560 --> 00:07:25.759 +So this is actually great. + +00:07:25.759 --> 00:07:30.639 +I have the colors red, purple, etc. etc. + +00:07:30.639 --> 00:07:34.160 +I love being able to do that. + +07:34.160 --> 00:07:35.919 +This is just a temporary file. + +00:07:35.919 --> 00:07:36.880 +I can actually discard it, + +00:07:36.880 --> 00:07:39.680 +and it doesn't really matter. + +07:39.680 --> 07:41.919 +Let me go back to the presentation. + +07:41.919 --> 00:07:43.360 +So that's the delivery. + +00:07:43.360 --> 00:07:44.639 +So the delivery is great, + +00:07:44.639 --> 00:07:46.400 +and I can tell the students + +00:07:46.400 --> 00:07:48.080 +now you're actually in GitHub, + +00:07:48.080 --> 00:07:50.160 +if you want to test the code, + +07:50.160 --> 00:07:51.360 +just cut and paste. + +00:07:51.360 --> 00:07:54.240 +Notice that I clicked on the little icon. + +00:07:54.240 --> 00:07:56.639 +Now it's copied. It's now part of + +00:07:56.639 --> 00:07:57.440 +the kill buffer ([kill-ring]), + +00:07:57.440 --> 00:07:59.520 +so if I want to actually create a file + +00:07:59.520 --> 00:08:00.560 +that has that content, + +00:08:00.560 --> 00:08:02.560 +I can very quickly do it. + +08:02.560 --> 00:08:05.840 +Try that with PowerPoint. + +00:08:05.840 --> 00:08:08.160 +You will have to have the text + +00:08:08.160 --> 00:08:10.000 +without any nice typesetting, + +00:08:10.000 --> 00:08:11.280 +or you will have to have a picture + +00:08:11.280 --> 00:08:13.120 +that is impossible to cut and paste. + +00:08:13.120 --> 00:08:14.400 +So that's something that the students + +00:08:14.400 --> 00:08:17.440 +really, really appreciate of this. + +00:08:17.440 --> 00:08:18.879 +They can try it on the computer. + +00:08:18.879 --> 00:08:19.919 +They can load it into + +00:08:19.919 --> 00:08:22.319 +their favorite editor. + +00:08:22.319 --> 00:08:24.720 +I don't force them to use Emacs, + +00:08:24.720 --> 00:08:26.879 +but I have to say that some of them + +00:08:26.879 --> 00:08:28.479 +really get intrigued by this power + +00:08:28.479 --> 00:08:30.000 +that they want to try Emacs + +08:30.000 --> 08:31.440 +because they see that they can do things, + +08:31.440 --> 08:33.760 +that I can do things that they cannot do + +08:33.760 --> 08:35.919 +with other tools. + +08:35.919 --> 08:39.039 +Okay, so let's go back to presentation. + +08:39.039 --> 00:08:40.080 +The other half of it is + +00:08:40.080 --> 00:08:41.039 +preparing the notes. + +00:08:41.039 --> 00:08:44.640 +I think the preparatory notes + +08:44.640 --> 00:08:46.320 +is something that I want to do + +00:08:46.320 --> 00:08:48.240 +as easy as possible. + +00:08:48.240 --> 00:08:52.560 +I want to be able to reduce the time + +00:08:52.560 --> 00:08:53.760 +that I waste on things, + +00:08:53.760 --> 00:08:55.120 +that they are done. + +08:55.120 --> 08:57.519 +They're not part of the actual thinking + +08:57.519 --> 00:09:01.760 +or the delivery of the presentation. + +00:09:01.760 --> 00:09:03.440 +So let me create a file. + +09:03.440 --> 00:09:05.720 +Let's call it rip2.org. + +00:09:05.720 --> 00:09:07.839 +Well, I have this one, + +00:09:07.839 --> 00:09:09.519 +so let's call it rip.org. + +00:09:09.519 --> 00:09:10.480 +Oh, I have this one too, + +00:09:10.480 --> 00:09:12.800 +so let's call it rip4.org. + +09:12.800 --> 09:15.040 +So it's empty. + +09:15.040 --> 00:09:17.200 +I use yasnippets. I think yasnippets + +00:09:17.200 --> 00:09:17.920 +are very important, + +00:09:17.920 --> 00:09:19.040 +and I'll go through this + +00:09:19.040 --> 00:09:19.760 +in a little bit later. + +00:09:19.760 --> 00:09:21.200 +It's important to set up + +00:09:21.200 --> 00:09:23.440 +the properties for each language + +00:09:23.440 --> 00:09:24.399 +that I use properly. + +09:24.399 --> 09:26.320 +I'll describe this a little bit later. + +09:26.320 --> 00:09:28.000 +Unfortunately, the properties + +00:09:28.000 --> 00:09:30.080 +have to be evaluated one at a time, + +00:09:30.080 --> 00:09:33.839 +and so I'm just going to + +00:09:33.839 --> 00:09:35.040 +kill the buffer and open it again. + +00:09:35.040 --> 00:09:36.480 +So now all of these properties + +00:09:36.480 --> 00:09:38.000 +are properly set. + +09:40.560 --> 00:09:43.760 +As I said before, I have some yasnippets, + +00:09:43.760 --> 00:09:46.560 +so I can actually do very quickly... + +00:09:46.560 --> 00:09:55.200 +This is C++, cout << "hello world", + +09:55.200 --> 09:58.080 +std::endl. + +09:58.080 --> 00:10:00.080 +And then I run it, + +00:10:00.080 --> 00:10:02.720 +and then it's inserted down here, + +00:10:02.720 --> 00:10:04.000 +so nothing special. + +10:04.000 --> 10:06.160 +Let's assume that I make a mistake + +10:06.160 --> 00:10:08.480 +and I type a double l here. + +00:10:08.480 --> 00:10:10.720 +I will get an error. + +10:10.720 --> 00:10:12.399 +These line numbers unfortunately + +00:10:12.399 --> 00:10:13.600 +don't perfectly match + +00:10:13.600 --> 00:10:15.040 +with the line numbers + +10:15.040 --> 10:17.839 +in the little snippet + +10:17.839 --> 00:10:18.959 +because there's some code + +00:10:18.959 --> 00:10:22.160 +that org-babel inserts, + +00:10:22.160 --> 00:10:23.040 +so that shifts them. + +00:10:23.040 --> 00:10:25.440 +So that's something to be aware of. + +10:25.440 --> 00:10:27.680 +I can correct it, run it, + +00:10:27.680 --> 00:10:30.160 +and then it inserts the result. + +10:30.160 --> 00:10:36.079 +Let's do one in C. + +10:36.079 --> 00:10:37.680 +I'll explain the exports both + +00:10:37.680 --> 00:10:38.640 +a little bit. + +00:10:38.640 --> 00:10:40.079 +So let's assume that I don't want to + +10:40.079 --> 00:10:41.519 +have a full main program. + +00:10:41.519 --> 00:10:42.560 +Let's assume that i just want to + +00:10:42.560 --> 00:10:45.200 +demonstrate how to use a printf + +00:10:45.200 --> 00:10:54.959 +"hello world %s\n", "my friend". + +10:54.959 --> 10:56.800 +Let's run it. + +10:56.800 --> 00:10:58.800 +I get a bunch of errors. Why? + +00:10:58.800 --> 00:11:00.480 +Because I don't have a main program, + +00:11:00.480 --> 00:11:03.279 +so I have to actually tell org-babel + +00:11:03.279 --> 00:11:05.200 +that I want a main product, + +00:11:05.200 --> 00:11:07.360 +so yes put a main around it. + +00:11:07.360 --> 00:11:09.040 +So now I run it and it says, oh, + +11:09.040 --> 00:11:09.760 +in the function main, + +00:11:09.760 --> 00:11:10.959 +we have an implicit declaration + +00:11:10.959 --> 00:11:12.640 +for function printf. + +00:11:12.640 --> 00:11:14.000 +I'm very, very stringent + +00:11:14.000 --> 00:11:16.959 +on my compilation options, + +00:11:16.959 --> 00:11:18.959 +so I want to have every single + +11:18.959 --> 00:11:21.279 +potential error displayed , + +00:11:21.279 --> 00:11:22.959 +so that's actually why. + +00:11:22.959 --> 00:11:24.640 +In this case, I actually need include, + +00:11:24.640 --> 00:11:29.040 +so I can say :includes <stdio.h>, + +11:29.040 --> 00:11:31.040 +and I'll run it and it runs perfectly. + +00:11:31.040 --> 00:11:32.480 +So why is this important? + +00:11:32.480 --> 00:11:35.440 +Well, it allows me to just have + +00:11:35.440 --> 00:11:37.600 +the snippet that I'm concerned about. + +00:11:37.600 --> 00:11:39.920 +I don't have to have all the overhead + +00:11:39.920 --> 00:11:43.279 +of having to have the include, main, etc., + +00:11:43.279 --> 00:11:44.000 +if I want to show + +00:11:44.000 --> 00:11:45.440 +just one specific concept + +00:11:45.440 --> 00:11:46.560 +and I can do it + +00:11:46.560 --> 00:11:48.079 +in very few lines of code. + +00:11:48.079 --> 00:11:50.240 +I can do that immediately, of course. + +00:11:50.240 --> 00:11:51.279 +The students will not be able to + +00:11:51.279 --> 00:11:53.600 +cut and paste it without the main file, + +00:11:53.600 --> 00:11:54.320 +but that's something + +00:11:54.320 --> 00:11:56.800 +that we can explain to them. + +11:57.600 --> 00:11:59.440 +We can do all the languages. + +00:11:59.440 --> 00:12:02.079 +So I can say print, + +12:02.079 --> 12:07.680 +let's print just a list, + +12:07.680 --> 12:10.000 +or let's actually keep updating it, + +12:10.000 --> 00:12:16.000 +and let's do a map of a lambda x, + +00:12:16.000 --> 00:12:19.279 +x multiplied by x, + +12:19.279 --> 00:12:22.079 +and then we run it. Okay. + +00:12:22.079 --> 00:12:23.200 +The thing that is important + +00:12:23.200 --> 00:12:25.120 +is that if we also have + +00:12:25.120 --> 00:12:26.720 +the full power of the environment, + +00:12:26.720 --> 00:12:28.320 +right, so we can actually edit it + +00:12:28.320 --> 00:12:31.519 +in the native mode of the language, + +00:12:31.519 --> 00:12:34.560 +and wherever we actually want to use + +00:12:34.560 --> 00:12:36.720 +specific features, that they are available + +00:12:36.720 --> 00:12:38.800 +in the particular mode. + +12:38.800 --> 00:12:40.720 +But for most of the cases, + +00:12:40.720 --> 00:12:41.519 +I don't need that, + +00:12:41.519 --> 00:12:44.160 +because my examples are relatively simple. + +12:44.160 --> 12:46.720 +Let's do one more. + +12:46.720 --> 00:12:48.399 +This is a little bit different: SQLite. + +00:12:48.399 --> 00:12:49.760 +In the previous examples, + +00:12:49.760 --> 00:12:51.200 +the output that is inserted + +00:12:51.200 --> 00:12:52.720 +is a standard output. + +00:12:52.720 --> 00:12:54.320 +In SQLite, I want to actually see + +00:12:54.320 --> 00:12:55.279 +the tables. I want to see + +00:12:55.279 --> 00:12:56.720 +how the tables are, + +00:12:56.720 --> 00:12:58.880 +what the results are. + +00:12:58.880 --> 00:13:04.000 +So let's create table s. + +13:04.000 --> 00:13:08.399 +Let's call it r, a int, b int, + +13:08.399 --> 00:13:09.200 +and let's run it. + +00:13:09.200 --> 00:13:10.639 +This is-- oh, the table already exists. + +00:13:10.639 --> 00:13:16.240 +Okay. So drop table if exists r, + +13:16.240 --> 00:13:17.440 +and then we run it. Okay. + +00:13:17.440 --> 00:13:21.120 +So now it's created. sqlite... + +00:13:21.120 --> 00:13:25.920 +So we can say create a table, + +00:13:25.920 --> 00:13:27.760 +and let's actually add SQL, + +00:13:27.760 --> 00:13:32.079 +and here we're actually going to add... + +13:32.079 --> 00:13:34.240 +This is an example in C, + +00:13:34.240 --> 00:13:38.240 +and here we're going to have C++. + +00:13:38.240 --> 00:13:42.160 +Okay. So, SQL, + +00:13:42.160 --> 00:13:43.920 +and then we create a table, + +00:13:43.920 --> 00:13:47.839 +and then we populate + +00:13:47.839 --> 00:13:51.360 +and then insert into R + +00:13:51.360 --> 00:13:57.839 +values 1,2 2,3 3,4. + +13:57.839 --> 00:13:59.519 +Okay. So now I have a table, + +00:13:59.519 --> 00:14:01.600 +I have values, + +00:14:01.600 --> 00:14:04.560 +and I can do "select * from here," + +14:04.560 --> 14:07.040 +and then I get the result. Okay. + +14:07.040 --> 00:14:07.920 +It's almost magic + +00:14:07.920 --> 00:14:10.399 +because I can actually get, formatted, + +00:14:10.399 --> 00:14:13.040 +the output in the way that I expected. + +14:13.040 --> 14:15.279 +Obviously, if my result is too big, + +14:15.279 --> 00:14:18.399 +then it will basically just create + +00:14:18.399 --> 00:14:20.880 +a huge, huge buffer, or Org will say + +00:14:20.880 --> 00:14:21.920 +the output is too big. + +00:14:21.920 --> 00:14:24.079 +So often with databases, + +00:14:24.079 --> 00:14:26.480 +I actually narrow my output, right, + +00:14:26.480 --> 00:14:28.639 +or I might do it with a clause, + +00:14:28.639 --> 00:14:32.800 +"where a > 1". + +14:34.959 --> 00:14:36.959 +If the language is supported by Org Babel, + +00:14:36.959 --> 00:14:39.920 +then you can do all of this. + +14:39.920 --> 00:14:42.079 +Let me go back to the presentation. + +00:14:42.079 --> 00:14:43.760 +I'm running out of time. + +00:14:43.760 --> 00:14:45.680 +Let me give you a short tour + +00:14:45.680 --> 00:14:47.279 +of how this is done. + +14:47.279 --> 00:14:53.279 +I have created a repository that has + +00:14:53.279 --> 00:14:54.800 +all the configuration that I have. + +00:14:54.800 --> 00:14:56.639 +Everything is self-contained. + +14:56.639 --> 14:59.600 +You can just download it and run it. + +14:59.600 --> 00:15:01.360 +You will have to replace + +00:15:01.360 --> 00:15:03.760 +your ~/.emacs.d directory, + +00:15:03.760 --> 00:15:07.440 +and then you can explore it, test it, + +00:15:07.440 --> 00:15:11.039 +and then pick things out of it, + +00:15:11.039 --> 00:15:14.639 +choose, etc. + +15:14.639 --> 00:15:16.800 +Let me go through the README. + +00:15:16.800 --> 00:15:17.920 +I think that the README + +00:15:17.920 --> 00:15:19.600 +is actually useful. + +00:15:19.600 --> 00:15:21.760 +I have a function called actually start. + +00:15:21.760 --> 00:15:22.480 +That is the one + +00:15:22.480 --> 00:15:24.000 +that creates indentation + +00:15:24.000 --> 00:15:28.399 +and sets up the mode, etc. + +15:28.399 --> 00:15:29.440 +Let me talk about GitHub. + +00:15:29.440 --> 00:15:31.839 +So GitHub is a great resource. Why? + +00:15:31.839 --> 00:15:32.880 +Well its publishing, + +00:15:32.880 --> 00:15:34.240 +as i mentioned before, + +00:15:34.240 --> 00:15:35.519 +is very simple. + +00:15:35.519 --> 00:15:37.120 +To publish, you basically just + +00:15:37.120 --> 00:15:37.920 +push your changes + +00:15:37.920 --> 00:15:43.199 +and it automatically renders the code. + +15:43.199 --> 00:15:46.800 +It's something that is quite useful. + +15:46.800 --> 00:15:48.720 +But it is not perfect, + +00:15:48.720 --> 00:15:50.399 +and it's not able to understand + +00:15:50.399 --> 00:15:52.880 +the full Org. But for most of the things + +00:15:52.880 --> 00:15:53.680 +that I use for teaching, + +00:15:53.680 --> 00:15:55.600 +it's sufficiently good. + +00:15:55.600 --> 00:15:57.360 +It would be better if it was full + +00:15:57.360 --> 00:16:00.720 +at compliance, but it's not bad as it is. + +16:00.720 --> 00:16:02.463 +Version control. I think + +00:16:02.463 --> 00:16:03.839 +it's extremely valuable + +00:16:03.839 --> 00:16:05.199 +to have version control. + +00:16:05.199 --> 00:16:08.079 +It allows to actually use + +00:16:08.079 --> 00:16:08.959 +different computers + +00:16:08.959 --> 00:16:10.560 +or keep track of my changes, + +00:16:10.560 --> 00:16:11.920 +collaborate with authors, + +00:16:11.920 --> 00:16:13.040 +even have pull requests + +00:16:13.040 --> 00:16:13.759 +from the students. + +16:13.759 --> 16:16.320 +Actually it's very empowering + +16:16.320 --> 16:18.800 +for the students. + +16:18.800 --> 00:16:20.480 +Navigation, links, cut and paste + +00:16:20.480 --> 00:16:21.920 +between code blocks, + +00:16:21.920 --> 00:16:23.199 +you can even edit in place + +16:23.199 --> 16:26.160 +if you want to. + +16:26.160 --> 16:27.920 +In a pinch, you can actually use GitHub + +16:27.920 --> 00:16:30.000 +to do the editing of your file. + +00:16:30.000 --> 00:16:33.199 +Of course, it will not update your buffers. + +16:33.199 --> 00:16:35.199 +:exports both. This is very important. + +00:16:35.199 --> 00:16:40.160 +If we have a block, by default, + +16:40.160 --> 16:43.199 +GitHub will not typeset + +16:43.199 --> 00:16:44.399 +the output of that block. + +00:16:44.399 --> 00:16:45.839 +It will only put the source code, + +00:16:45.839 --> 00:16:47.199 +but not its output. + +16:47.199 --> 00:16:50.079 +In this case, if I actually showed this + +00:16:50.079 --> 00:16:52.720 +in GitHub, "hello world" will not appear. + +00:16:52.720 --> 00:16:55.120 +So what we need to do is for every block, + +00:16:55.120 --> 00:16:57.040 +we have to do :exports both. + +16:57.040 --> 00:16:58.720 +okay that's unfortunate, + +00:16:58.720 --> 00:17:01.120 +but we can deal with that. + +17:01.120 --> 00:17:03.920 +Once it's done, then the output + +00:17:03.920 --> 00:17:06.079 +is actually typeset. + +17:06.079 --> 00:17:07.520 +I mentioned that header args + +00:17:07.520 --> 00:17:09.039 +are very important, + +00:17:09.039 --> 00:17:10.079 +because those are the ones + +00:17:10.079 --> 00:17:12.799 +that set the parameters + +00:17:12.799 --> 00:17:14.640 +for each one of the blocks that you have. + +17:14.640 --> 17:16.000 +You don't want to have to type every + +17:16.000 --> 00:17:19.120 +single one of them at once. + +00:17:19.120 --> 00:17:20.880 +For example, let me go back to + +00:17:20.880 --> 00:17:22.880 +my presentation. + +17:23.839 --> 17:26.160 +Here's actually the parameters for C. + +17:26.160 --> 00:17:28.880 +C, I say, I don't want you to + +00:17:28.880 --> 00:17:30.000 +automatically add a main. + +00:17:30.000 --> 00:17:31.120 +I want to provide my main, + +00:17:31.120 --> 00:17:34.160 +and these are the flags to the compiler. + +17:34.160 --> 00:17:37.280 +With C++, similar. With SQLite, + +00:17:37.280 --> 00:17:38.720 +I said this is my database, + +17:38.720 --> 00:17:39.600 +this is the data, + +00:17:39.600 --> 00:17:41.360 +the file where the database lives, + +00:17:41.360 --> 00:17:44.559 +and for the results, I want you to insert + +17:44.559 --> 00:17:46.160 +the column names. I want to see + +00:17:46.160 --> 00:17:48.400 +the names of the columns in the result. + +17:48.400 --> 17:50.960 +So those are actually why + +17:50.960 --> 17:53.840 +the headers are important. + +17:53.840 --> 00:17:55.520 +There's one in general. + +00:17:55.520 --> 00:17:56.880 +That's :results output. + +00:17:56.880 --> 00:17:59.039 +If you're interested on showing + +00:17:59.039 --> 00:18:01.760 +the standard output of your snippet, + +00:18:01.760 --> 00:18:03.600 +then you have to use :results output. + +00:18:03.600 --> 00:18:04.799 +Otherwise, it will insert + +00:18:04.799 --> 00:18:06.720 +the result of the last expression. + +00:18:06.720 --> 00:18:08.000 +It just depends on what you want to show, + +18:08.000 --> 00:18:08.720 +but it's important + +00:18:08.720 --> 00:18:11.200 +that you are aware of that. + +18:11.200 --> 18:13.440 +I'm almost running out of time. + +18:13.440 --> 00:18:15.919 +There are some things that are C-specific + +00:18:15.919 --> 00:18:18.400 +and that I sort of covered + +00:18:18.400 --> 00:18:23.919 +during the demo. + +18:23.919 --> 00:18:26.000 +You can use advanced Org features, + +00:18:26.000 --> 00:18:29.039 +and you can actually use noweb. + +00:18:29.039 --> 00:18:30.640 +Now that's confusing for students, + +00:18:30.640 --> 00:18:33.600 +so i will suggest that you actually do it + +18:33.600 --> 00:18:34.880 +but then inform the students + +00:18:34.880 --> 00:18:37.760 +very clearly of that. + +18:37.760 --> 00:18:39.280 +Some potential issues: + +00:18:39.280 --> 00:18:42.400 +_ (underscore). _ is used everywhere. + +00:18:42.400 --> 00:18:44.640 +By default, it will try to export it-- + +00:18:44.640 --> 00:18:46.960 +Org will try to export it as circumflex, + +00:18:46.960 --> 00:18:48.400 +the same as with GitHub. + +00:18:48.400 --> 00:18:52.480 +So we want to inform Org and GitHub + +00:18:52.480 --> 00:18:53.840 +not to do anything with them, + +00:18:53.840 --> 00:18:55.520 +and this is via the circumflex. + +00:18:55.520 --> 00:18:57.440 +So we said in #+OPTIONS: ^:nil , + +00:18:57.440 --> 00:18:58.720 +and that actually takes care + +00:18:58.720 --> 00:19:01.679 +of the circumflex and also the underscore. + +00:19:01.679 --> 00:19:02.720 +It's kind of confusing + +00:19:02.720 --> 00:19:04.080 +because it's both, + +00:19:04.080 --> 00:19:05.120 +but it's actually named + +00:19:05.120 --> 00:19:06.720 +after the circumflex. + +19:06.720 --> 00:19:07.840 +The pipe character + +00:19:07.840 --> 00:19:08.880 +is one of those characters + +00:19:08.880 --> 00:19:10.640 +that is actually very, very common + +00:19:10.640 --> 00:19:12.799 +in programming, but if you put in a table, + +00:19:12.799 --> 00:19:14.480 +there's no way to do it. Like, okay, + +00:19:14.480 --> 00:19:16.559 +I wish I had this table nicely + +19:16.559 --> 00:19:19.520 +where I can say || here, + +00:19:19.520 --> 00:19:21.280 +but if I put this ||, + +00:19:21.280 --> 00:19:22.799 +it will actually interpret it + +00:19:22.799 --> 00:19:23.919 +as the separator. + +00:19:23.919 --> 00:19:25.760 +So that's one of the few things + +00:19:25.760 --> 00:19:27.679 +that's kind of annoying. + +19:27.679 --> 00:19:31.679 +Final words. See my configuration file, + +19:31.679 --> 00:19:35.520 +and try to typeset the code, + +00:19:35.520 --> 00:19:37.520 +the buffer as close as possible + +00:19:37.520 --> 00:19:38.720 +to what you want to present. + +00:19:38.720 --> 00:19:40.000 +As you can see here, + +00:19:40.000 --> 00:19:42.240 +I'm actually using colors to highlight + +00:19:42.240 --> 00:19:44.320 +by using the current line. + +19:44.320 --> 19:46.960 +Use yasnippets. + +19:46.960 --> 19:48.480 +They're amazing, and they will actually + +19:48.480 --> 19:51.440 +make your life much more useful. + +19:51.440 --> 19:53.280 +Experiment. + +19:53.280 --> 19:56.720 +Just a conclusion. + +19:56.720 --> 00:19:58.400 +Org mode and Emacs really make + +00:19:58.400 --> 00:20:01.039 +a wonderful, amazing environment + +00:20:01.039 --> 00:20:03.360 +for teaching programming. + +20:03.360 --> 20:06.640 +I just want to end by saying that + +20:06.640 --> 00:20:10.320 +I'm very grateful to all the Emacs community + +20:10.320 --> 00:20:14.159 +because I have benefited tremendously + +00:20:14.159 --> 00:20:16.080 +over the years. I have been using Emacs + +00:20:16.080 --> 00:20:18.960 +since 1991, so this is essentially + +00:20:18.960 --> 00:20:22.240 +my 30th year that have been using Emacs. + +00:20:22.240 --> 00:20:24.640 +I think that is the most important, + +00:20:24.640 --> 00:20:26.980 +most fundamental tool that I use + +00:20:26.980 --> 00:20:29.760 +day-to-day, from reading email, + +00:20:29.760 --> 00:20:32.480 +to doing my teaching, doing my papers, + +00:20:32.480 --> 00:20:34.960 +my research... it's everything. + +00:20:34.960 --> 00:20:37.039 +So thank you all + +20:37.039 --> 20:40.799 +and I hope that you find this useful. + +20:40.799 --> 00:20:42.799 +Bye. + +00:20:42.799 --> 00:20:43.799 +[captions by sachac] -- cgit v1.2.3