Hello everyone! My name is Philip Beadling.
Just to give you a bit of background,
I'm the enterprise architect
in a company called Quantile Technologies.
I've been using Emacs
certainly for the last four or five years
as part of my day-to-day workflow,
but I've used it on and off
for the last 20 years
depending on the jobs
or the task at hand.
Now, today I'm here in a personal capacity
to talk about a use I had
for Emacs last year
where I had to record
my continuous professional development,
and I was required to be audited
by my professional body on it.
My CPD record is a bit of a mess,
or certainly was. It was over
various different services and systems
that have been provided to me
by previous employers.
And, I had bits of it in Excel spreadsheets,
and I was looking for like
a one single golden source
where I could store it all
and use in the future.
So, I had a look online.
I didn't find anything I'd like,
so I decided I would use Emacs,
and I quickly came to the conclusion
that using Org mode
was a nice fit for this,
you know, both the TODO lists
and the properties
seem to fit nicely
with building a very basic database,
which is what in effect this is,
what this is.
Without further ado,
I will start by just downloading.
This is available on my public Git,
handle is falloutfill,
and it's under a project called Misc.
It's just a single file called cpd.org,
I can stick that in the chat
when we actually do this live,
so that people will have a link to it.
So, I'll start this up.
Okay. To start with, I am just going to
close down various Lisp stuff,
and just give you a demo of
how it actually works.
Let's go up here.
Okay, so, basically to make this work,
the way I subdivide it
is that I would have
professional goals,
and professional goals
would be made up of activities,
and each of those activities
would contribute to the goal.
So, in order to represent this,
this is just a nested TODO list
in Emacs Org mode.
I sort of change things like the naming,
Pending, In-Progress and Complete
rather than TODO, DONE because
that's more like what my professional
body likes to categorize things,
but essentially it's the same thing.
So, I've got an Org capture template
or two Org capture templates
in order to grab this information,
and then stick it in the TODO list,
and also tabulate it using column view.
I'll start off just by showing you
an example here.
So, what I'm going to do is
create a new goal,
and then under it,
I will create a couple of activities
relevant to that goal.
For the goal I'm going to have, let's say,
something relevant,
so, 'Improve Public Speaking',
and then I'm going to say, the type
of that goal is, well, it's a 'Presentation'
I suppose. The outcome of that goal is,
well, I don't want to go into too much
detail here, but it would be, you know,
'Get feedback from colleagues', and so forth.
I won't fully and completely [inaudible]
about what the goal was.
Now, the retrospective value,
my understanding is that
you fill that in afterwards,
so you want to talk after completing the
action, so this is not relevant for the day.
I'm just going to leave it blank,
although I'm sure you can imagine
I could say: having completed this action
I felt that, blah blah blah, and so forth.
Okay, so I will add that, and then you
will see that I now have a new goal,
both in my column view and in my TODO list,
and just to make it a little bit
realistic, I'm going to then add two
activities to that.
When I come in to add an activity,
I have to select a goal.
I'm going to select 'Improve Public Speaking'.
Yeah, so, the activity I'm going to say is,
well, let's say, 'Speak at EmacsConf 2021',
that we can use a type of 'Presentation',
outcome of that is, stating the obvious,
'Present on an Emacs idea'.
Right, something along the lines of that.
And, then retrospective, again I'm not
going to fill that in at the moment.
Then, last but not least,
I will come up with a slightly different
activity. So, again selecting
'Improve Public Speaking',
the activity would be
'Watch lecture series on public speaking',
you know, blah blah blah, so forth.
Type value would be
Lecture, for this outcome would maybe be
'Use new knowledge in EmacsConf presentation'.
Right, might be a good one there.
Again, retrospective value,
I'm just going to leave that blank,
and I'm going to save that.
Now, we're in a position where we've got
a goal and two activities, which are
represented here, you can see here that I
can move an activity, cycle it forward to
In-Progress. When I do that,
I get a STARTED timestamp here.
If I then cycle it again,
I get the more familiar CLOSED timestamp here.
The STARTED timestamp is a bit of
custom code, I'll show you that in a moment.
And then likewise, let's say that…,
we'll move this one from PENDING to STARTED.
Okay. Now, if I save the document,
that will trigger the updating
of the column view, you can see now
that we have the various started and
completed statuses, this is up to date.
So, that's pretty much.
You can imagine that we could add
lots of goals and lots of activities,
and this would grow into, you know,
several sheets worth of a work,
and then last but not least,
is obviously the most important thing.
How do you submit it?
We could just use the standard
export facility in Org mode for doing that.
That's just Control c Control e l o (C-c C-e l o).
And there you can see,
there you've got the goals and activities.
I spent a bit of time, I won't go too much
in the LaTeX formatting, but coming up
with something that I felt and got as
much information compactly on a page
without making it difficult to read,
should we say, and it's always
a find-the-balance thing.
I'm not saying I'm an expert on it,
but I thought what I came up with here
was reasonably clear
but allowed you to write enough information.
The goals and activities were reasonably
well explained.
Okay, we can just kill that.
So, how does all of that work?
Well, underneath is config tab here,
we have a bunch of Lisp
that I'm going to sort of fly through here.
You can ask me any questions afterwards.
First thing is,
we have the org-capture templates,
which are here.
The goal one is not doing anything special.
It's just writing it back to this file,
so there is a limitation there
that you must have this file open
when you add them, which is
something I'd like to improve in future.
For the activities, it specifies the file,
but it also specifies this function
set-activity-pos-from-goal, which (is) above here.
What this does is, it iterates through the
various Org entries looking for goals,
and once it has a list of goals,
it presents them to you
using ido-completing-read,
so that you can select the goal
that you want the activity to live underneath,
and it then searches forward, and it finds
the appropriate spot in that goal
that the Emacs can then dump
the captured activity.
Okay, the next one is pretty straightforward.
Because I changed the names
of the TODO, DONE,
I now need a new way of aggregating
the summary completion statuses.
So, for this I'm just looking
at the number of completed activities
over the total number of activities,
and I make that available on the C+ here,
which we will see when I go and show you
the top configuration in the Org document
in two minutes.
I mentioned that we needed to have our
own start date. The way this works is
we add a hook to
org-after-todo-state-change-hook,
which means that we test
the state change results in
one of the items being In-Progress,
and if that's true
and it already doesn't have a time stamp,
then it creates a timestamp
with the current time and date.
The second hook here is just ensuring that
when we save the document,
that the column view is dynamically updated,
so that everything is up to date.
And then last but not least here,
the tmp-f-timestamp, what this does is,
on the export, it modifies the timestamps,
so that it removes the angle brackets,
and it removes the hours and minutes.
That is a space-saving thing
and a tidiness thing in the PDF.
I'll show you in a second how that's used.
We then allow bind-keywords.
We use them above.
Then we just have a simple key
that allows us to hotkey for org-capture.
And then at the start,
when we evaluate the startup block
that I have of Lisp,
just so it's already there,
and set the number of sublevels to one
so only the top levels exist.
Coming back over the top
to put that all back together again.
The startup just tells you
that you want log times.
The title, author, description, and…,
they should be obvious, right,
that's just text for the PDF.
Options, we disable the table of contents,
we do not want that.
Now, the output config here,
the first two are resulting
in the timestamp formats, so, that was
the tmp-f-timestamp function
I showed you below.
And, we got a better LaTeX stuff here,
just saying that we want a landscape,
and we want to use A4 paper size,
and then the columns here.
What we want is just to
rename the properties
to something which just looks
a little bit nicer in the table.
So you can see that: goals, activities,
status, completed, and so forth.
Then last but not least,
on the actual thing,
we use a longtable in LaTeX.
We align, so we specify very exactly
that we want five centimeters
for the first and last two columns,
and that we want all the other columns
to use the remaining space.
And that's it.
Appreciate, I've absolutely whirlwinded
through that, but please do feel free
to ask me any questions,
or speak to me offline.
Thank you very much.