WEBVTT 00:02.879 --> 00:05.424 Hello everyone! My name is Philip Beadling. 00:05.424 --> 00:06.944 Just to give you a bit of background, 00:06.944 --> 00:08.400 I'm the enterprise architect 00:08.400 --> 00:10.384 in a company called Quantile Technologies. 00:10.384 --> 00:12.799 I've been using Emacs 00:12.799 --> 00:14.560 certainly for the last four or five years 00:14.560 --> 00:16.800 as part of my day-to-day workflow, 00:16.800 --> 00:18.080 but I've used it on and off 00:18.080 --> 00:19.000 for the last 20 years 00:19.000 --> 00:21.320 depending on the jobs 00:21.320 --> 00:22.423 or the task at hand. 00:22.423 --> 00:24.800 Now, today I'm here in a personal capacity 00:24.800 --> 00:27.360 to talk about a use I had 00:27.360 --> 00:28.440 for Emacs last year 00:28.440 --> 00:31.000 where I had to record 00:31.000 --> 00:32.800 my continuous professional development, 00:32.800 --> 00:35.320 and I was required to be audited 00:35.320 --> 00:37.280 by my professional body on it. 00:37.280 --> 00:40.240 My CPD record is a bit of a mess, 00:40.240 --> 00:42.640 or certainly was. It was over 00:42.640 --> 00:44.640 various different services and systems 00:44.640 --> 00:46.160 that have been provided to me 00:46.160 --> 00:47.920 by previous employers. 00:47.920 --> 00:51.824 And, I had bits of it in Excel spreadsheets, 00:51.824 --> 00:52.640 and I was looking for like 00:52.640 --> 00:54.200 a one single golden source 00:54.200 --> 00:55.320 where I could store it all 00:55.320 --> 00:56.719 and use in the future. 00:56.719 --> 00:59.024 So, I had a look online. 00:59.024 --> 00:59.824 I didn't find anything I'd like, 00:59.824 --> 01:01.885 so I decided I would use Emacs, 01:01.885 --> 01:03.840 and I quickly came to the conclusion 01:03.840 --> 01:05.480 that using Org mode 01:05.480 --> 01:07.040 was a nice fit for this, 01:07.040 --> 01:08.160 you know, both the TODO lists 01:08.160 --> 01:09.080 and the properties 01:09.080 --> 01:10.920 seem to fit nicely 01:10.920 --> 01:12.890 with building a very basic database, 01:12.890 --> 01:14.159 which is what in effect this is, 01:14.159 --> 01:16.159 what this is. 01:16.159 --> 01:18.000 Without further ado, 01:18.000 --> 01:22.640 I will start by just downloading. 01:22.640 --> 01:24.640 This is available on my public Git, 01:24.640 --> 01:26.160 handle is falloutfill, 01:26.160 --> 01:28.146 and it's under a project called Misc. 01:28.146 --> 01:33.200 It's just a single file called cpd.org, 01:33.200 --> 01:35.080 I can stick that in the chat 01:35.080 --> 01:36.280 when we actually do this live, 01:36.280 --> 01:38.532 so that people will have a link to it. 01:38.532 --> 01:41.119 So, I'll start this up. 01:41.119 --> 01:44.560 Okay. To start with, I am just going to 01:44.560 --> 01:46.826 close down various Lisp stuff, 01:46.826 --> 01:48.566 and just give you a demo of 01:48.566 --> 01:50.560 how it actually works. 01:50.560 --> 01:55.040 Let's go up here. 01:55.040 --> 01:57.205 Okay, so, basically to make this work, 01:57.205 --> 01:58.640 the way I subdivide it 01:58.640 --> 01:59.200 is that I would have 01:59.200 --> 02:00.200 professional goals, 02:00.200 --> 02:01.040 and professional goals 02:01.040 --> 02:02.703 would be made up of activities, 02:02.703 --> 02:03.741 and each of those activities 02:03.741 --> 02:05.917 would contribute to the goal. 02:05.917 --> 02:07.713 So, in order to represent this, 02:07.713 --> 02:10.000 this is just a nested TODO list 02:10.000 --> 02:12.800 in Emacs Org mode. 02:12.800 --> 02:16.068 I sort of change things like the naming, 02:16.068 --> 02:18.247 Pending, In-Progress and Complete 02:18.247 --> 02:19.440 rather than TODO, DONE because 02:19.440 --> 02:21.360 that's more like what my professional 02:21.360 --> 02:23.244 body likes to categorize things, 02:23.244 --> 02:25.315 but essentially it's the same thing. 02:25.315 --> 02:28.212 So, I've got an Org capture template 02:28.212 --> 02:29.499 or two Org capture templates 02:29.499 --> 02:31.843 in order to grab this information, 02:31.843 --> 02:33.645 and then stick it in the TODO list, 02:33.645 --> 02:36.540 and also tabulate it using column view. 02:36.540 --> 02:39.304 I'll start off just by showing you 02:39.304 --> 02:40.090 an example here. 02:40.090 --> 02:40.879 So, what I'm going to do is 02:40.879 --> 02:41.965 create a new goal, 02:41.965 --> 02:42.849 and then under it, 02:42.849 --> 02:44.959 I will create a couple of activities 02:44.959 --> 02:46.511 relevant to that goal. 02:46.511 --> 02:49.360 For the goal I'm going to have, let's say, 02:49.360 --> 02:50.342 something relevant, 02:50.342 --> 02:54.000 so, 'Improve Public Speaking', 02:54.000 --> 02:55.680 and then I'm going to say, the type 02:55.680 --> 02:58.000 of that goal is, well, it's a 'Presentation' 02:58.000 --> 03:01.200 I suppose. The outcome of that goal is, 03:01.200 --> 03:02.560 well, I don't want to go into too much 03:02.560 --> 03:06.069 detail here, but it would be, you know, 03:06.069 --> 03:09.140 'Get feedback from colleagues', and so forth. 03:09.140 --> 03:11.200 I won't fully and completely [inaudible] 03:11.200 --> 03:12.538 about what the goal was. 03:12.538 --> 03:14.067 Now, the retrospective value, 03:14.067 --> 03:15.318 my understanding is that 03:15.318 --> 03:17.028 you fill that in afterwards, 03:17.028 --> 03:18.800 so you want to talk after completing the 03:18.800 --> 03:21.213 action, so this is not relevant for the day. 03:21.213 --> 03:23.120 I'm just going to leave it blank, 03:23.120 --> 03:24.541 although I'm sure you can imagine 03:24.541 --> 03:26.428 I could say: having completed this action 03:26.428 --> 03:28.959 I felt that, blah blah blah, and so forth. 03:28.959 --> 03:31.360 Okay, so I will add that, and then you 03:31.360 --> 03:33.760 will see that I now have a new goal, 03:33.760 --> 03:36.048 both in my column view and in my TODO list, 03:36.048 --> 03:38.159 and just to make it a little bit 03:38.159 --> 03:39.920 realistic, I'm going to then add two 03:39.920 --> 03:41.332 activities to that. 03:41.332 --> 03:43.433 When I come in to add an activity, 03:43.433 --> 03:44.560 I have to select a goal. 03:44.560 --> 03:49.120 I'm going to select 'Improve Public Speaking'. 03:49.120 --> 03:52.963 Yeah, so, the activity I'm going to say is, 03:52.963 --> 03:57.427 well, let's say, 'Speak at EmacsConf 2021', 03:57.427 --> 04:01.200 that we can use a type of 'Presentation', 04:01.200 --> 04:04.352 outcome of that is, stating the obvious, 04:04.352 --> 04:08.080 'Present on an Emacs idea'. 04:08.080 --> 04:09.680 Right, something along the lines of that. 04:09.680 --> 04:11.519 And, then retrospective, again I'm not 04:11.519 --> 04:14.135 going to fill that in at the moment. 04:14.135 --> 04:19.060 Then, last but not least, 04:19.060 --> 04:20.799 I will come up with a slightly different 04:20.799 --> 04:23.215 activity. So, again selecting 04:23.215 --> 04:24.889 'Improve Public Speaking', 04:24.889 --> 04:27.440 the activity would be 04:27.440 --> 04:31.257 'Watch lecture series on public speaking', 04:31.257 --> 04:33.426 you know, blah blah blah, so forth. 04:33.426 --> 04:34.720 Type value would be 04:34.720 --> 04:37.600 Lecture, for this outcome would maybe be 04:37.600 --> 04:43.252 'Use new knowledge in EmacsConf presentation'. 04:43.252 --> 04:45.350 Right, might be a good one there. 04:45.350 --> 04:46.720 Again, retrospective value, 04:46.720 --> 04:48.518 I'm just going to leave that blank, 04:48.518 --> 04:51.440 and I'm going to save that. 04:51.440 --> 04:52.960 Now, we're in a position where we've got 04:52.960 --> 04:54.960 a goal and two activities, which are 04:54.960 --> 04:57.520 represented here, you can see here that I 04:57.520 --> 05:00.160 can move an activity, cycle it forward to 05:00.160 --> 05:02.322 In-Progress. When I do that, 05:02.322 --> 05:05.104 I get a STARTED timestamp here. 05:05.104 --> 05:06.737 If I then cycle it again, 05:06.737 --> 05:09.869 I get the more familiar CLOSED timestamp here. 05:09.869 --> 05:11.635 The STARTED timestamp is a bit of 05:11.635 --> 05:13.918 custom code, I'll show you that in a moment. 05:13.918 --> 05:17.120 And then likewise, let's say that…, 05:17.120 --> 05:20.166 we'll move this one from PENDING to STARTED. 05:20.166 --> 05:22.960 Okay. Now, if I save the document, 05:22.960 --> 05:24.560 that will trigger the updating 05:24.560 --> 05:27.520 of the column view, you can see now 05:27.520 --> 05:29.360 that we have the various started and 05:29.360 --> 05:31.600 completed statuses, this is up to date. 05:31.600 --> 05:32.937 So, that's pretty much. 05:32.937 --> 05:34.211 You can imagine that we could add 05:34.211 --> 05:35.469 lots of goals and lots of activities, 05:35.469 --> 05:37.474 and this would grow into, you know, 05:37.474 --> 05:41.704 several sheets worth of a work, 05:41.704 --> 05:43.748 and then last but not least, 05:43.748 --> 00:05:45.440 is obviously the most important thing. 00:05:45.440 --> 00:05:46.720 How do you submit it? 05:46.720 --> 05:48.479 We could just use the standard 05:48.479 --> 05:50.856 export facility in Org mode for doing that. 05:50.856 --> 05:55.039 That's just Control c Control e l o (C-c C-e l o). 05:55.039 --> 00:06:03.440 And there you can see, 00:06:03.440 --> 00:06:06.586 there you've got the goals and activities. 06:06.586 --> 06:08.319 I spent a bit of time, I won't go too much 06:08.319 --> 06:10.000 in the LaTeX formatting, but coming up 06:10.000 --> 06:12.319 with something that I felt and got as 06:12.319 --> 06:14.720 much information compactly on a page 06:14.720 --> 06:17.840 without making it difficult to read, 06:17.840 --> 00:06:19.039 should we say, and it's always 00:06:19.039 --> 00:06:20.080 a find-the-balance thing. 00:06:20.080 --> 00:06:22.560 I'm not saying I'm an expert on it, 00:06:22.560 --> 00:06:24.400 but I thought what I came up with here 00:06:24.400 --> 00:06:25.905 was reasonably clear 06:25.905 --> 06:28.960 but allowed you to write enough information. 06:28.960 --> 06:31.039 The goals and activities were reasonably 06:31.039 --> 06:32.419 well explained. 06:32.419 --> 06:35.039 Okay, we can just kill that. 06:35.039 --> 06:37.402 So, how does all of that work? 06:37.402 --> 06:40.180 Well, underneath is config tab here, 06:40.180 --> 06:41.210 we have a bunch of Lisp 06:41.210 --> 06:43.276 that I'm going to sort of fly through here. 06:43.276 --> 06:45.898 You can ask me any questions afterwards. 06:45.898 --> 06:46.639 First thing is, 06:46.639 --> 06:48.371 we have the org-capture templates, 06:48.371 --> 06:50.101 which are here. 06:50.101 --> 06:53.178 The goal one is not doing anything special. 06:53.178 --> 06:55.605 It's just writing it back to this file, 06:55.605 --> 06:57.125 so there is a limitation there 06:57.125 --> 06:58.718 that you must have this file open 06:58.718 --> 06:59.840 when you add them, which is 06:59.840 --> 07:02.000 something I'd like to improve in future. 07:02.000 --> 07:04.952 For the activities, it specifies the file, 07:04.952 --> 07:06.560 but it also specifies this function 07:06.560 --> 07:09.926 set-activity-pos-from-goal, which (is) above here. 07:09.926 --> 07:12.720 What this does is, it iterates through the 07:12.720 --> 07:17.360 various Org entries looking for goals, 07:17.360 --> 00:07:20.720 and once it has a list of goals, 00:07:20.720 --> 00:07:21.919 it presents them to you 00:07:21.919 --> 00:07:23.599 using ido-completing-read, 07:23.599 --> 00:07:25.120 so that you can select the goal 00:07:25.120 --> 00:07:27.610 that you want the activity to live underneath, 07:27.610 --> 07:29.520 and it then searches forward, and it finds 07:29.520 --> 00:07:31.599 the appropriate spot in that goal 00:07:31.599 --> 00:07:33.919 that the Emacs can then dump 00:07:33.919 --> 00:07:36.000 the captured activity. 07:36.000 --> 07:39.210 Okay, the next one is pretty straightforward. 07:39.210 --> 00:07:40.479 Because I changed the names 00:07:40.479 --> 00:07:42.240 of the TODO, DONE, 00:07:42.240 --> 00:07:44.720 I now need a new way of aggregating 00:07:44.720 --> 00:07:46.691 the summary completion statuses. 07:46.691 --> 00:07:48.400 So, for this I'm just looking 00:07:48.400 --> 00:07:51.440 at the number of completed activities 07:51.440 --> 07:53.627 over the total number of activities, 07:53.627 --> 07:57.665 and I make that available on the C+ here, 07:57.665 --> 08:00.859 which we will see when I go and show you 08:00.859 --> 08:03.960 the top configuration in the Org document 08:03.960 --> 08:05.199 in two minutes. 08:05.199 --> 08:08.080 I mentioned that we needed to have our 08:08.080 --> 00:08:10.400 own start date. The way this works is 00:08:10.400 --> 00:08:11.870 we add a hook to 00:08:11.870 --> 00:08:14.996 org-after-todo-state-change-hook, 08:14.996 --> 00:08:17.199 which means that we test 00:08:17.199 --> 00:08:19.680 the state change results in 00:08:19.680 --> 00:08:21.599 one of the items being In-Progress, 00:08:21.599 --> 00:08:23.199 and if that's true 00:08:23.199 --> 00:08:25.360 and it already doesn't have a time stamp, 08:25.360 --> 00:08:26.639 then it creates a timestamp 00:08:26.639 --> 00:08:29.049 with the current time and date. 08:29.049 --> 00:08:31.199 The second hook here is just ensuring that 00:08:31.199 --> 00:08:32.663 when we save the document, 08:32.663 --> 08:34.898 that the column view is dynamically updated, 08:34.898 --> 08:36.578 so that everything is up to date. 08:36.578 --> 08:39.444 And then last but not least here, 08:39.444 --> 08:43.590 the tmp-f-timestamp, what this does is, 08:43.590 --> 08:46.690 on the export, it modifies the timestamps, 08:46.690 --> 08:48.336 so that it removes the angle brackets, 08:48.336 --> 08:50.367 and it removes the hours and minutes. 08:50.367 --> 00:08:51.839 That is a space-saving thing 00:08:51.839 --> 00:08:54.080 and a tidiness thing in the PDF. 00:08:54.080 --> 00:08:56.187 I'll show you in a second how that's used. 08:56.187 --> 08:58.121 We then allow bind-keywords. 08:58.121 --> 08:59.839 We use them above. 08:59.839 --> 00:09:01.200 Then we just have a simple key 00:09:01.200 --> 00:09:05.258 that allows us to hotkey for org-capture. 09:05.258 --> 00:09:06.800 And then at the start, 00:09:06.800 --> 00:09:07.327 when we evaluate the startup block 00:09:07.327 --> 00:09:10.160 that I have of Lisp, 00:09:10.160 --> 00:09:11.360 just so it's already there, 00:09:11.360 --> 00:09:13.519 and set the number of sublevels to one 00:09:13.519 --> 00:09:16.080 so only the top levels exist. 09:16.080 --> 00:09:19.360 Coming back over the top 00:09:19.360 --> 00:09:21.576 to put that all back together again. 09:21.576 --> 00:09:22.720 The startup just tells you 00:09:22.720 --> 00:09:24.926 that you want log times. 09:24.926 --> 09:27.023 The title, author, description, and…, 09:27.023 --> 09:28.536 they should be obvious, right, 09:28.536 --> 09:29.920 that's just text for the PDF. 09:29.920 --> 09:33.049 Options, we disable the table of contents, 09:33.049 --> 09:34.320 we do not want that. 09:34.320 --> 00:09:35.680 Now, the output config here, 00:09:35.680 --> 00:09:37.519 the first two are resulting 00:09:37.519 --> 00:09:40.160 in the timestamp formats, so, that was 00:09:40.160 --> 00:09:41.920 the tmp-f-timestamp function 00:09:41.920 --> 00:09:43.468 I showed you below. 09:43.468 --> 09:45.310 And, we got a better LaTeX stuff here, 09:45.310 --> 09:47.134 just saying that we want a landscape, 09:47.134 --> 09:49.150 and we want to use A4 paper size, 09:49.150 --> 09:50.560 and then the columns here. 09:50.560 --> 00:09:51.839 What we want is just to 00:09:51.839 --> 00:09:52.880 rename the properties 00:09:52.880 --> 00:09:54.160 to something which just looks 09:54.160 --> 09:55.572 a little bit nicer in the table. 09:55.572 --> 09:58.320 So you can see that: goals, activities, 09:58.320 --> 10:00.979 status, completed, and so forth. 10:00.979 --> 00:10:03.760 Then last but not least, 00:10:03.760 --> 00:10:04.640 on the actual thing, 00:10:04.640 --> 00:10:06.487 we use a longtable in LaTeX. 10:06.487 --> 00:10:09.360 We align, so we specify very exactly 00:10:09.360 --> 00:10:11.040 that we want five centimeters 10:11.040 --> 10:13.364 for the first and last two columns, 10:13.364 --> 00:10:15.680 and that we want all the other columns 00:10:15.680 --> 00:10:17.196 to use the remaining space. 10:17.196 --> 10:19.040 And that's it. 10:19.040 --> 00:10:21.440 Appreciate, I've absolutely whirlwinded 00:10:21.440 --> 00:10:24.160 through that, but please do feel free 00:10:24.160 --> 00:10:26.144 to ask me any questions, 10:26.144 --> 10:28.786 or speak to me offline. 10:28.786 --> 10:32.839 Thank you very much.