WEBVTT captioned by eduardo
Kind: captions:
Language: en-GB

00:00:00.000 --> 00:00:04.000
Hi! My name is Eduardo Ochs. I'm the author

00:00:04.000 --> 00:00:06.000
of an Emacs package called eev...

00:00:06.000 --> 00:00:10.000
and eev is about taking executable notes

00:00:10.000 --> 00:00:13.000
of everything that you do, and this

00:00:13.000 --> 00:00:16.000
presentation is about how I use this...

00:00:16.000 --> 00:00:18.000
how I finally found a way to take

00:00:18.000 --> 00:00:22.000
executable notes of what the python docs

00:00:22.000 --> 00:00:23.000
say.

00:00:23.000 --> 00:00:28.000
Let me explain that in another way. I've

00:00:28.000 --> 00:00:31.000
try to Learn Python many times, but

00:00:31.000 --> 00:00:34.000
hm, my brain is wired in a weird way, so

00:00:34.000 --> 00:00:37.000
it didn't work... and finally a few

00:00:37.000 --> 00:00:40.000
months ago I found a way of studying

00:00:40.000 --> 00:00:44.000
Python that finally clicked for me.

00:00:44.000 --> 00:00:47.000
The idea is that... well, it's here in

00:00:47.000 --> 00:00:50.000
the title - is a way to create short

00:00:50.000 --> 00:00:52.000
hyperlinks to the

00:00:52.000 --> 00:00:54.000
documentation of python.

00:00:54.000 --> 00:00:56.000
Here's an example.

00:00:56.000 --> 00:01:00.000
This file contains some some chunks

00:01:00.000 --> 00:01:03.000
of code from the Python tutorial and

00:01:03.000 --> 00:01:05.000
some links to the places in which

00:01:05.000 --> 00:01:07.000
I found these chunks of code.

00:01:07.000 --> 00:01:12.000
for example, if I run this link here

00:01:12.000 --> 00:01:14.000
it opens a certain page of the Python

00:01:14.000 --> 00:01:18.000
tutorial in my browser - note that it

00:01:18.000 --> 00:01:19.000
opens the local copy of the

00:01:19.000 --> 00:01:22.000
documentation -

00:01:22.000 --> 00:01:25.000
and if I

00:01:25.000 --> 00:01:29.000
run this link here it opens the source

00:01:29.000 --> 00:01:30.000
in .rst

00:01:30.000 --> 00:01:34.000
of the same page. So the first link opens

00:01:34.000 --> 00:01:37.000
the HTML and this one opens the

00:01:37.000 --> 00:01:39.000
RST. This is useful because in the

00:01:39.000 --> 00:01:40.000
beginning

00:01:40.000 --> 00:01:44.000
I was copying these chunks of code in

00:01:44.000 --> 00:01:46.000
the obvious way - I would simply

00:01:46.000 --> 00:01:50.000
visit the the documentation in HTML and

00:01:50.000 --> 00:01:51.000
I would mark

00:01:51.000 --> 00:01:54.000
a chunk... a snippet of code here and I

00:01:54.000 --> 00:01:58.000
would copy it to my notes.

00:01:58.000 --> 00:02:01.000
And then after a while I

00:02:01.000 --> 00:02:03.000
realized that it was much easier to

00:02:03.000 --> 00:02:07.000
simply go to the RST sources and to copy

00:02:07.000 --> 00:02:10.000
the chunks of code from there... and

00:02:10.000 --> 00:02:14.000
note that these links look quite similar.

00:02:14.000 --> 00:02:17.000
There's one difference here, that is

00:02:17.000 --> 00:02:20.000
this `r` that is prepended to the name

00:02:20.000 --> 00:02:23.000
of the function... the `r` means

00:02:23.000 --> 00:02:26.000
"open the RST"...

00:02:26.000 --> 00:02:30.000
and if I use the suffix `w` it means

00:02:30.000 --> 00:02:32.000
use the documentation on the web instead

00:02:32.000 --> 00:02:34.000
of using the local copy.

00:02:34.000 --> 00:02:36.000
So this one

00:02:36.000 --> 00:02:38.000
opens a local copy

00:02:38.000 --> 00:02:42.000
and this one

00:02:42.000 --> 00:02:46.000
takes a while

00:02:46.000 --> 00:02:49.000
and opens the

00:02:49.000 --> 00:02:52.000
the page of the documentation in the

00:02:52.000 --> 00:02:56.000
site of Python blah blah...

00:02:56.000 --> 00:02:58.000
and this thing here is

00:02:58.000 --> 00:03:02.000
executable in the usual eev sense, that

00:03:02.000 --> 00:03:05.000
we ca... if we type f8 several times here

00:03:05.000 --> 00:03:08.000
the f8s on the lines that start

00:03:08.000 --> 00:03:12.000
with red stars create a target buffer

00:03:12.000 --> 00:03:14.000
here... and in this case it creates a

00:03:14.000 --> 00:03:17.000
target buffer running Python, and if I

00:03:17.000 --> 00:03:20.000
type f8 on these other lines these are

00:03:20.000 --> 00:03:23.000
the lines are sent

00:03:23.000 --> 00:03:25.000
to that REPL.

00:03:25.000 --> 00:03:30.000
But anyway, let me go back.

00:03:30.000 --> 00:03:32.000
Most of the things that I'm going to

00:03:32.000 --> 00:03:35.000
present here are in the tutorial of this...

00:03:35.000 --> 00:03:37.000
package...

00:03:37.000 --> 00:03:41.000
we can go to the source code

00:03:41.000 --> 00:03:44.000
here in the eev directory - it's a file

00:03:44.000 --> 00:03:50.000
called eev-rstdoc.el but the best

00:03:50.000 --> 00:03:53.000
docs are in the tutorial, here...

00:03:53.000 --> 00:03:56.000
and the tutorial also has some

00:03:56.000 --> 00:03:58.000
executable

00:03:58.000 --> 00:04:02.000
chunks... some snippets of python

00:04:02.000 --> 00:04:05.000
code that are executable, but they

00:04:05.000 --> 00:04:07.000
don't have those nice colors... so

00:04:07.000 --> 00:04:11.000
apologies for that.

00:04:11.000 --> 00:04:13.000
We need to run this thing here to make

00:04:13.000 --> 00:04:15.000
everything work.

00:04:15.000 --> 00:04:17.000
This thing will define some functions

00:04:17.000 --> 00:04:19.000
with funny names that I will

00:04:19.000 --> 00:04:26.000
explain later.

00:04:26.000 --> 00:04:30.000
Let me explain something new.

00:04:30.000 --> 00:04:35.000
let's compare all these

00:04:35.000 --> 00:04:38.000
links here. They take this argument

00:04:38.000 --> 00:04:41.000
here and they expand the the argument in

00:04:41.000 --> 00:04:44.000
a certain way. For example this string is

00:04:44.000 --> 00:04:49.000
expanded to this long URL here... note that

00:04:49.000 --> 00:04:52.000
it got a prefix here,

00:04:52.000 --> 00:04:56.000
that's quite long... it got the .html here,

00:04:56.000 --> 00:04:59.000
and then the hash and the anchor here...

00:04:59.000 --> 00:05:03.000
and each one of the functions in the

00:05:03.000 --> 00:05:06.000
pydoc family expands this

00:05:06.000 --> 00:05:09.000
argument in a different way.

00:05:09.000 --> 00:05:12.000
The one that that opens the doc in the

00:05:12.000 --> 00:05:16.000
web uses another prefix -

00:05:16.000 --> 00:05:20.000
this one - and the one that opens the rst

00:05:20.000 --> 00:05:24.000
file ignores the part after the hash

00:05:24.000 --> 00:05:28.000
for technical reasons... I was never

00:05:28.000 --> 00:05:30.000
able to to find a good way to convert

00:05:30.000 --> 00:05:33.000
this hash into a string to search for,

00:05:33.000 --> 00:05:35.000
so to make something that goes to

00:05:35.000 --> 00:05:38.000
the right section in the link to the rst

00:05:38.000 --> 00:05:42.000
doc I have to convert by hand, and by

00:05:42.000 --> 00:05:46.000
trial and error, this thing here into a

00:05:46.000 --> 00:05:48.000
pointer to that section, like

00:05:48.000 --> 00:05:50.000
this one...

00:05:50.000 --> 00:05:55.000
in which the "_numeric-types:"

00:05:55.000 --> 00:05:58.000
is here.

00:05:58.000 --> 00:06:02.000
So all these links here are based on

00:06:02.000 --> 00:06:04.000
expansion, and this is easy to

00:06:04.000 --> 00:06:05.000
understand...

00:06:05.000 --> 00:06:08.000
but suppose that I want to

00:06:08.000 --> 00:06:11.000
create a link like this, or suppose that

00:06:11.000 --> 00:06:16.000
I'm browsing the docs here

00:06:16.000 --> 00:06:21.000
and I just I follow some some links...

00:06:21.000 --> 00:06:31.000
let me do something random here...

00:06:31.000 --> 00:06:34.000
suppose that I decide that this

00:06:34.000 --> 00:06:35.000
section is very interesting. How can I

00:06:35.000 --> 00:06:39.000
create a link to that? I can

00:06:39.000 --> 00:06:44.000
use this pilcrow symbol and the

00:06:44.000 --> 00:06:45.000
"Copy link address",

00:06:45.000 --> 00:06:49.000
and copy the link to

00:06:49.000 --> 00:06:51.000
my notes...

00:06:51.000 --> 00:06:55.000
and then the Python family...

00:06:55.000 --> 00:06:58.000
well, we saw the the functions in the

00:06:58.000 --> 00:07:00.000
Python family have a certain way - have

00:07:00.000 --> 00:07:03.000
several ways of expanding these

00:07:03.000 --> 00:07:06.000
short arguments... and they also have a

00:07:06.000 --> 00:07:07.000
certain way of

00:07:07.000 --> 00:07:11.000
shortening URLs like this one. If I type

00:07:11.000 --> 00:07:12.000
`M-x pdk` the message is this one.

00:07:12.000 --> 00:07:17.000
`pdk` is a mnemonic for

00:07:17.000 --> 00:07:20.000
"Python doc kill", and this

00:07:20.000 --> 00:07:23.000
"kill" means "copy to the kill ring"

00:07:23.000 --> 00:07:27.000
so if I type `M-x pdk` here it

00:07:27.000 --> 00:07:31.000
considers that this thing is a link

00:07:31.000 --> 00:07:34.000
to the python Docs, and it

00:07:34.000 --> 00:07:36.000
shortens this link in a certain way, and

00:07:36.000 --> 00:07:42.000
it kills a short link.

00:07:42.000 --> 00:07:45.000
I can insert the short link with C-y

00:07:45.000 --> 00:07:46.000
(yank)

00:07:46.000 --> 00:07:49.000
and then I can test this link to be sure

00:07:49.000 --> 00:07:52.000
that it points to where I want, and

00:07:52.000 --> 00:07:55.000
then I can delete this thing, and ta-da,

00:07:55.000 --> 00:07:57.000
now I have a short link, and of course I

00:07:57.000 --> 00:08:00.000
can modify this link by adding a suffix

00:08:00.000 --> 00:08:02.000
here...

00:08:02.000 --> 00:08:06.000
and in this case here

00:08:06.000 --> 00:08:09.000
I will have to change the identifier

00:08:09.000 --> 00:08:12.000
to something else...

00:08:12.000 --> 00:08:18.000
but I'm not going to do that now.

00:08:18.000 --> 00:08:20.000
This module of eev comes with three

00:08:20.000 --> 00:08:24.000
families predefined. One is a family that

00:08:24.000 --> 00:08:26.000
points to the the documentation of

00:08:26.000 --> 00:08:28.000
Python itself, another one points the

00:08:28.000 --> 00:08:30.000
documentation of SymPy, that is a program

00:08:30.000 --> 00:08:34.000
for symbolic computation, like for doing

00:08:34.000 --> 00:08:37.000
mathematics equations...

00:08:37.000 --> 00:08:40.000
and the other one points to the

00:08:40.000 --> 00:08:43.000
documentation of MatPlotLib.

00:08:43.000 --> 00:08:47.000
How do these families work?

00:08:47.000 --> 00:08:51.000
Each family has to be defined in two

00:08:51.000 --> 00:08:53.000
parts.

00:08:53.000 --> 00:08:55.000
Remember that

00:08:55.000 --> 00:08:58.000
eev has lots of functions

00:08:58.000 --> 00:09:03.000
like this one... this one

00:09:03.000 --> 00:09:06.000
is the most basic, and it is explained

00:09:06.000 --> 00:09:08.000
here, in this section of the main

00:09:08.000 --> 00:09:13.000
tutorial. This section explains that

00:09:13.000 --> 00:09:16.000
a sexp like this one produces lots of

00:09:16.000 --> 00:09:19.000
functions - produces a family of

00:09:19.000 --> 00:09:23.000
functions - and it does that by producing

00:09:23.000 --> 00:09:25.000
a certain chunk of code and then

00:09:25.000 --> 00:09:28.000
executing this chunk of code... and if we

00:09:28.000 --> 00:09:31.000
add a certain prefix here... `find-` and we

00:09:31.000 --> 00:09:35.000
execute this we can... instead of executing

00:09:35.000 --> 00:09:37.000
that chunk of code we can see what is

00:09:37.000 --> 00:09:39.000
that chunk of code. In the case of `code-c-d`

00:09:39.000 --> 00:09:43.000
it is this. It is a `setq`, several

00:09:43.000 --> 00:09:47.000
`defun`s, and some comments here, with

00:09:47.000 --> 00:09:49.000
links to the documentation.

00:09:49.000 --> 00:09:52.000
In the case of rstdoc it's the same.

00:09:52.000 --> 00:09:54.000
We have this function here that defines

00:09:54.000 --> 00:09:56.000
the function in the python family...

00:09:56.000 --> 00:09:59.000
and we can run this to understand what

00:09:59.000 --> 00:10:03.000
this `code-rstdoc` does.

00:10:03.000 --> 00:10:05.000
It creates this temporary buffer here...

00:10:05.000 --> 00:10:09.000
with lots of `defun`s, a `code-c-d` here,

00:10:09.000 --> 00:10:10.000
and lots of comments here... and the

00:10:10.000 --> 00:10:13.000
comments include some tests. For example

00:10:13.000 --> 00:10:16.000
we can use these functions here to test

00:10:16.000 --> 00:10:21.000
how the expansion works.

00:10:21.000 --> 00:10:23.000
And

00:10:23.000 --> 00:10:26.000
note that in this buffer here we don't

00:10:26.000 --> 00:10:28.000
have the paths that that this family

00:10:28.000 --> 00:10:31.000
uses. We don't have for example

00:10:31.000 --> 00:10:33.000
the URL that points to the site of

00:10:33.000 --> 00:10:36.000
Python, to the directory that contains

00:10:36.000 --> 00:10:40.000
the reference manual, or whatever... all

00:10:40.000 --> 00:10:42.000
these things are in another part of the

00:10:42.000 --> 00:10:44.000
definition of that family - that is a

00:10:44.000 --> 00:10:45.000
variable.

00:10:45.000 --> 00:10:48.000
If we execute this we go to the

00:10:48.000 --> 00:10:50.000
source code of eev-rstdoc,

00:10:50.000 --> 00:10:54.000
to the parts in which

00:10:54.000 --> 00:10:57.000
this variable is defined...

00:10:57.000 --> 00:10:59.000
and

00:10:59.000 --> 00:11:01.000
for each family we have a variable like

00:11:01.000 --> 00:11:02.000
this,

00:11:02.000 --> 00:11:05.000
whose value is a property

00:11:05.000 --> 00:11:07.000
list with several fields...

00:11:07.000 --> 00:11:09.000
these first fields are very easy to

00:11:09.000 --> 00:11:10.000
understand - they are used in the

00:11:10.000 --> 00:11:16.000
expansion... this one too. And these

00:11:16.000 --> 00:11:19.000
two fields are used in the shrinking -

00:11:19.000 --> 00:11:21.000
in the shortening - and

00:11:21.000 --> 00:11:25.000
this field here

00:11:25.000 --> 00:11:28.000
tells what is the name of the

00:11:28.000 --> 00:11:30.000
killing function

00:11:30.000 --> 00:11:33.000
so the fields of this thing here are

00:11:33.000 --> 00:11:34.000
used

00:11:34.000 --> 00:11:36.000
to generate...

00:11:36.000 --> 00:11:39.000
some fields are used to generate the

00:11:39.000 --> 00:11:41.000
code that appears here, and some fields

00:11:41.000 --> 00:11:44.000
are simply

00:11:44.000 --> 00:11:47.000
read by functions like this one, that

00:11:47.000 --> 00:11:51.000
consults the variable.

00:11:51.000 --> 00:11:53.000
Now the natural question is: how can we

00:11:53.000 --> 00:11:57.000
define new families? Or: how can we change

00:11:57.000 --> 00:11:59.000
a family like this one to point to

00:11:59.000 --> 00:12:03.000
another version of Python?

00:12:03.000 --> 00:12:06.000
There are some template-based functions

00:12:06.000 --> 00:12:09.000
for doing that. They are explained in

00:12:09.000 --> 00:12:10.000
this section of the tutorial...

00:12:10.000 --> 00:12:14.000
where is that?...

00:12:14.000 --> 00:12:17.000
oh God, it's far away...

00:12:17.000 --> 00:12:20.000
here.

00:12:20.000 --> 00:12:23.000
Suppose that we have a package foo, that

00:12:23.000 --> 00:12:25.000
we want to create a family that points

00:12:25.000 --> 00:12:27.000
to the docs

00:12:27.000 --> 00:12:31.000
of that package foo... so, we

00:12:31.000 --> 00:12:32.000
can execute this thing here, and it

00:12:32.000 --> 00:12:34.000
generates this

00:12:34.000 --> 00:12:37.000
this thing from a template.

00:12:37.000 --> 00:12:40.000
If we just want to modify a current

00:12:40.000 --> 00:12:42.000
definition we can run something like

00:12:42.000 --> 00:12:44.000
this - note that the family `:py`

00:12:44.000 --> 00:12:47.000
already exists, and instead of using

00:12:47.000 --> 00:12:51.000
placeholders in some of these

00:12:51.000 --> 00:12:53.000
URLs it will use the current values of

00:12:53.000 --> 00:12:55.000
the fields...

00:12:55.000 --> 00:12:59.000
so we can also use this modify

00:12:59.000 --> 00:13:01.000
existing families.

00:13:01.000 --> 00:13:05.000
Well these are the technical details.

00:13:05.000 --> 00:13:08.000
Now the natural question is: why do I

00:13:08.000 --> 00:13:12.000
want this? This doesn't

00:13:12.000 --> 00:13:14.000
any sense to me! Why should I

00:13:14.000 --> 00:13:15.000
try this?

00:13:15.000 --> 00:13:18.000
And the best answer: is for most people

00:13:18.000 --> 00:13:21.000
this way of using

00:13:21.000 --> 00:13:24.000
executable notes do not make any sense

00:13:24.000 --> 00:13:27.000
at all at first sight...

00:13:27.000 --> 00:13:30.000
so what I'm trying to do is: I'm trying

00:13:30.000 --> 00:13:33.000
to write to these tutorials with

00:13:33.000 --> 00:13:35.000
many examples that are very easy to run,

00:13:35.000 --> 00:13:38.000
and that examine data structures,

00:13:38.000 --> 00:13:40.000
and functions, and test things,

00:13:40.000 --> 00:13:46.000
and so on... so my main argument

00:13:46.000 --> 00:13:48.000
for convincing people to

00:13:48.000 --> 00:13:52.000
test this is: this is trivial to test -

00:13:52.000 --> 00:13:54.000
simply install eev and run this thing

00:13:54.000 --> 00:13:56.000
here, and run the examples, and probably

00:13:56.000 --> 00:13:58.000
you're going to find that this

00:13:58.000 --> 00:14:01.000
tutorial is fun to follow.

00:14:01.000 --> 00:14:03.000
So that's it! =)