1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
|
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.
|