summaryrefslogtreecommitdiffstats
path: root/2022
diff options
context:
space:
mode:
authorSacha Chua <sacha@sachachua.com>2022-12-03 13:24:42 -0500
committerSacha Chua <sacha@sachachua.com>2022-12-03 13:24:42 -0500
commitf2d2926a26d25dcc05c196148b5284c200fa67e6 (patch)
tree5a81240acd0967ea8c3e3b599eba2386e2690de8 /2022
parent76a367a0a4c81c39d1a2849a78b8d63959bc0de9 (diff)
downloademacsconf-wiki-f2d2926a26d25dcc05c196148b5284c200fa67e6.tar.xz
emacsconf-wiki-f2d2926a26d25dcc05c196148b5284c200fa67e6.zip
Update
Diffstat (limited to '2022')
-rw-r--r--2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main.vtt1309
1 files changed, 1309 insertions, 0 deletions
diff --git a/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main.vtt b/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main.vtt
new file mode 100644
index 00000000..4c3792aa
--- /dev/null
+++ b/2022/captions/emacsconf-2022-sqlite--using-sqlite-as-a-data-source-a-framework-and-an-example--andrew-hyatt--main.vtt
@@ -0,0 +1,1309 @@
+WEBVTT captioned by sachac
+
+00:00:00.000 --> 00:00:08.555
+Hello. I'm Andrew Hyatt. I've been working on Emacs,
+
+00:00:08.556 --> 00:00:10.539
+with Emacs, and to some extent
+
+00:00:10.540 --> 00:00:15.272
+on Emacs for a while. I've written the WebSockets library
+
+00:00:15.273 --> 00:00:20.045
+and Emacs calc tutorials. I've enjoyed use of
+
+00:00:20.046 --> 00:00:24.640
+many of everyone's incredible packages.
+
+00:00:24.640 --> 00:00:27.132
+So my thesis for this talk, why I'm giving this talk,
+
+00:00:27.133 --> 00:00:29.060
+is that I'm interested in SQLite.
+
+00:00:29.061 --> 00:00:34.953
+I think we should be exploring SQLite for applications
+
+00:00:34.954 --> 00:00:37.482
+in ways I think the community has shied away from.
+
+00:00:37.483 --> 00:00:41.950
+I'd like to introduce the triples package as a way,
+
+00:00:41.951 --> 00:00:47.664
+both easy and with interesting functionality,
+
+00:00:47.665 --> 00:00:49.153
+that will allow us to build extensible databases
+
+00:00:49.154 --> 00:00:52.582
+in a way that is, I think,
+
+00:00:52.583 --> 00:00:56.220
+a little bit unusual and perhaps compelling, I hope.
+
+00:00:56.220 --> 00:00:59.226
+So first of all, why SQLite?
+
+00:00:59.227 --> 00:01:06.080
+Why is this good? Well, SQLite is now built into Emacs.
+
+00:01:06.080 --> 00:01:12.216
+So you get a few things out of this when you use it for data.
+
+00:01:12.217 --> 00:01:14.580
+First of all, it's a database.
+
+00:01:14.580 --> 00:01:16.369
+It's extremely good for data, of course.
+
+00:01:16.370 --> 00:01:19.918
+There's a simplicity to data manipulation
+
+00:01:19.919 --> 00:01:22.027
+using a database, compared to data manipulation,
+
+00:01:22.028 --> 00:01:25.196
+that is, manipulating data in a text file.
+
+00:01:25.197 --> 00:01:31.033
+Text files are really not built for data.
+
+00:01:31.034 --> 00:01:33.140
+So when typically when you need to do this,
+
+00:01:33.140 --> 00:01:35.026
+like I know Org Mode is--
+
+00:01:35.027 --> 00:01:38.116
+which I'm a huge, huge Org Mode fan--
+
+00:01:38.117 --> 00:01:41.044
+it's all about sort of data in text.
+
+00:01:41.045 --> 00:01:45.375
+It does work, but you certainly would be
+
+00:01:45.376 --> 00:01:47.360
+hard pressed to make sweeping changes
+
+00:01:47.360 --> 00:01:51.953
+to your database that is represented in text.
+
+00:01:51.954 --> 00:01:53.060
+It's just not well suited for this sort of thing.
+
+00:01:53.061 --> 00:01:54.963
+It would take a long time,
+
+00:01:54.964 --> 00:02:00.220
+where the speed of SQL is incredibly impressive.
+
+00:02:00.220 --> 00:02:04.429
+I think certainly Emacs is not known
+
+00:02:04.430 --> 00:02:06.752
+for being extremely speedy.
+
+00:02:06.753 --> 00:02:11.905
+I think the overuse of text
+
+00:02:11.906 --> 00:02:14.613
+is part of this. Of course, text and using text,
+
+00:02:14.614 --> 00:02:18.467
+using files has awesome advantages as well.
+
+00:02:18.468 --> 00:02:20.510
+I'm really here to talk about
+
+00:02:20.511 --> 00:02:22.717
+the other side of the coin, right?
+
+00:02:22.718 --> 00:02:23.961
+Everyone can judge
+
+00:02:23.962 --> 00:02:24.645
+those advantages and disadvantages
+
+00:02:24.646 --> 00:02:25.416
+and make their own trade-offs,
+
+00:02:25.417 --> 00:02:26.020
+but I want to kind of
+
+00:02:26.021 --> 00:02:29.869
+make the pitch for SQLite.
+
+00:02:29.870 --> 00:02:32.860
+So let's talk about the triples package.
+
+00:02:32.860 --> 00:02:35.488
+The triples package is a package
+
+00:02:35.489 --> 00:02:40.419
+that is designed to give you a very generic schema.
+
+00:02:40.420 --> 00:02:42.005
+You don't have to do,
+
+00:02:42.006 --> 00:02:43.291
+for most of the common operations,
+
+00:02:43.292 --> 00:02:45.516
+you don't have to write SQL yourself.
+
+00:02:45.517 --> 00:02:47.924
+A lot of stuff is built in
+
+00:02:47.925 --> 00:02:51.035
+and is based on a very generic schema.
+
+00:02:51.036 --> 00:02:53.840
+That is, it's a single table.
+
+00:02:53.840 --> 00:02:55.229
+That table has, of course, fixed schema.
+
+00:02:55.230 --> 00:02:57.478
+It basically has three columns.
+
+00:02:57.479 --> 00:03:00.867
+It actually has four columns.
+
+00:03:00.868 --> 00:03:01.193
+In this talk, I'm not going to get into
+
+00:03:01.194 --> 00:03:04.123
+the fourth column and why, but it's useful.
+
+00:03:04.124 --> 00:03:07.710
+So the three columns are subject, predicate,
+
+00:03:07.711 --> 00:03:10.361
+and object. This is what it's related to
+
+00:03:10.362 --> 00:03:13.908
+what we call an RDF format.
+
+00:03:13.909 --> 00:03:17.139
+These things basically describe a link.
+
+00:03:17.140 --> 00:03:20.007
+The link is from the subject to the object.
+
+00:03:20.008 --> 00:03:23.955
+The link type is a predicate.
+
+00:03:23.956 --> 00:03:26.085
+That sounds overly theoretical,
+
+00:03:26.086 --> 00:03:28.032
+but the point is that you can describe
+
+00:03:28.033 --> 00:03:32.005
+a lot of things with this format.
+
+00:03:32.006 --> 00:03:33.329
+You probably describe everything with it.
+
+00:03:33.330 --> 00:03:39.226
+It's very simple because the schema is fixed.
+
+00:03:39.227 --> 00:03:42.773
+It's only this kind of data. That means
+
+00:03:42.774 --> 00:03:44.140
+for your application, you define a schema
+
+00:03:44.140 --> 00:03:47.326
+in subject, predicate, object format.
+
+00:03:47.327 --> 00:03:50.072
+That defines what data you can use,
+
+00:03:50.073 --> 00:03:56.069
+what types there are, what properties they have,
+
+00:03:56.070 --> 00:03:57.214
+how you can use the system,
+
+00:03:57.215 --> 00:04:01.006
+and what is legal to do. And this is stored as data.
+
+00:04:01.007 --> 00:04:03.890
+I think as Lisp people,
+
+00:04:03.891 --> 00:04:07.540
+I think we're all very onboard
+
+00:04:07.540 --> 00:04:13.912
+with the fact that you have a simple way
+
+00:04:13.913 --> 00:04:17.660
+to express everything, and you don't have these
+
+00:04:17.660 --> 00:04:18.924
+two systems. In this way,
+
+00:04:18.925 --> 00:04:20.871
+you don't have to have code as a system.
+
+00:04:20.872 --> 00:04:24.825
+Do you have to load code to use the triples package
+
+00:04:24.826 --> 00:04:27.916
+to make sure your schema is obeyed?
+
+00:04:27.917 --> 00:04:35.213
+No, it's all just built in to this database.
+
+00:04:35.214 --> 00:04:37.036
+I'll describe this. As I said,
+
+00:04:37.037 --> 00:04:39.860
+it's a little bit abstract right now,
+
+00:04:39.860 --> 00:04:42.048
+but it will become a lot clearer
+
+00:04:42.049 --> 00:04:46.778
+when we go through an example,
+
+00:04:46.779 --> 00:04:50.208
+which we're going to do now.
+
+00:04:50.209 --> 00:04:56.660
+As an exercise, let's create Emacs bookmarks,
+
+00:04:56.660 --> 00:04:57.345
+which basically are three things:
+
+00:04:57.346 --> 00:05:01.038
+a name, a file, and an annotation.
+
+00:05:01.039 --> 00:05:02.364
+I may be missing out on functionality.
+
+00:05:02.365 --> 00:05:04.772
+Of course, everything in Emacs,
+
+00:05:04.773 --> 00:05:05.140
+everything has lots and lots of functionality,
+
+00:05:05.140 --> 00:05:08.049
+but let's just start with this simple thing.
+
+00:05:08.050 --> 00:05:11.100
+First of all, we're going to open up a database.
+
+00:05:11.100 --> 00:05:12.103
+Pretty simple.
+
+00:05:12.104 --> 00:05:15.014
+I think there's nothing to explain there.
+
+00:05:15.015 --> 00:05:19.106
+But here on this line that I'm on right now,
+
+00:05:19.107 --> 00:05:21.432
+we are saying, okay, there's going to be
+
+00:05:21.433 --> 00:05:24.839
+a type called bookmark.
+
+00:05:24.840 --> 00:05:26.826
+It's going to have the following properties.
+
+00:05:26.827 --> 00:05:29.178
+First, a file, which is unique and a string.
+
+00:05:29.179 --> 00:05:31.764
+The second is an annotation,
+
+00:05:31.765 --> 00:05:34.317
+which is again unique and a string.
+
+00:05:34.318 --> 00:05:37.864
+Then we're going to have another type called named.
+
+00:05:37.865 --> 00:05:39.808
+First of all, why is it named as part of bookmark?
+
+00:05:39.809 --> 00:05:45.562
+As I'll get into, it's interesting
+
+00:05:45.563 --> 00:05:48.511
+when you start sharing this database
+
+00:05:48.512 --> 00:05:51.365
+with other things, not just bookmarks, but other types.
+
+00:05:51.366 --> 00:05:54.616
+Bookmarks are very similar to many other things
+
+00:05:54.617 --> 00:05:56.723
+that you might want to expand into.
+
+00:05:56.724 --> 00:05:57.086
+Those other things have names,
+
+00:05:57.087 --> 00:05:58.269
+but they're not bookmarks.
+
+00:05:58.270 --> 00:06:04.123
+It's nice to separate these concerns out
+
+00:06:04.124 --> 00:06:08.372
+and just have another type called named,
+
+00:06:08.373 --> 00:06:12.780
+which just basically has a name.
+
+00:06:12.780 --> 00:06:15.746
+We can execute this.
+
+00:06:15.747 --> 00:06:21.798
+It's not interesting to look at these.
+
+00:06:21.440 --> 00:06:25.907
+that is not all that useful for anything,
+
+00:06:21.799 --> 00:06:21.439
+It outputs something
+
+00:06:25.908 --> 00:06:28.014
+but that's okay. What's done is, actually,
+
+00:06:28.015 --> 00:06:32.262
+it's created a database
+
+00:06:32.263 --> 00:06:34.045
+and it's populated it with the schema.
+
+00:06:34.046 --> 00:06:41.478
+We can look at this.
+
+00:06:41.479 --> 00:06:43.602
+We won't go through all of this
+
+00:06:43.603 --> 00:06:44.188
+because it's a little bit too much
+
+00:06:44.189 --> 00:06:46.036
+for a short presentation like this,
+
+00:06:46.037 --> 00:06:48.185
+but you could see that there's something here
+
+00:06:48.186 --> 00:06:52.500
+that's like, oh, we have a subject bookmark.
+
+00:06:52.500 --> 00:06:56.031
+We have a property base/type.
+
+00:06:56.032 --> 00:06:58.878
+That just means that there's a property
+
+00:06:58.879 --> 00:07:00.562
+that's defined by the base.
+
+00:07:00.563 --> 00:07:02.248
+This means this is from the triples package itself.
+
+00:07:02.249 --> 00:07:08.940
+It's not some other package.
+
+00:07:08.940 --> 00:07:11.525
+Third is, what is the type of this object?
+
+00:07:11.526 --> 00:07:17.060
+It's a schema. This thing could be many types.
+
+00:07:17.060 --> 00:07:19.150
+As I said, if you have a--
+
+00:07:19.151 --> 00:07:20.235
+we haven't seen an example yet,
+
+00:07:20.236 --> 00:07:21.100
+but if you have a bookmark,
+
+00:07:21.100 --> 00:07:23.686
+it's going to have a name type
+
+00:07:23.687 --> 00:07:25.694
+and a bookmark type.
+
+00:07:25.695 --> 00:07:26.719
+Everything is multi-typed
+
+00:07:26.720 --> 00:07:28.146
+and that's kind of a feature
+
+00:07:28.147 --> 00:07:32.137
+of this kind of storage system.
+
+00:07:32.138 --> 00:07:33.140
+I'm not going to go through everything,
+
+00:07:33.140 --> 00:07:35.865
+but you can see it's all there in triples,
+
+00:07:35.866 --> 00:07:40.740
+the whole schema, everything we just did.
+
+00:07:40.740 --> 00:07:42.645
+Let's create a bookmark. Again,
+
+00:07:42.646 --> 00:07:46.997
+we're going to connect to our database
+
+00:07:46.998 --> 00:07:49.246
+and we're going to basically set
+
+00:07:49.247 --> 00:07:52.552
+an entire subject.
+
+00:07:52.553 --> 00:07:54.239
+The subject is, it's basically like an entity.
+
+00:07:54.240 --> 00:07:56.105
+We're going to define a whole entity
+
+00:07:56.106 --> 00:08:00.676
+or you could refer to it as an object.
+
+00:08:00.677 --> 00:08:03.909
+That's a perfectly fine way to look at it, I think.
+
+00:08:03.910 --> 00:08:04.356
+It's going to have some identifier.
+
+00:08:04.357 --> 00:08:06.723
+That identifier could be anything.
+
+00:08:06.724 --> 00:08:07.431
+It doesn't have to be a string.
+
+00:08:07.432 --> 00:08:09.260
+It could really be anything, but we're going
+
+00:08:09.260 --> 00:08:11.369
+to give it a string called emacs-init.
+
+00:08:11.370 --> 00:08:13.298
+It does not matter what this identifier is,
+
+00:08:13.299 --> 00:08:17.808
+at least for our purposes.
+
+00:08:17.809 --> 00:08:19.914
+It does matter when you're linking to it,
+
+00:08:19.915 --> 00:08:22.263
+but I think nothing that I'm about to show you.
+
+00:08:22.264 --> 00:08:25.830
+This could truly be anything
+
+00:08:25.831 --> 00:08:28.180
+because it has a separate name.
+
+00:08:28.180 --> 00:08:32.131
+I'm giving it a name here, which is init.
+
+00:08:32.133 --> 00:08:34.917
+I'm just specifying the named type here
+
+00:08:34.918 --> 00:08:38.047
+and I'm specifying the bookmark type here
+
+00:08:38.048 --> 00:08:43.219
+and its values. We're going to do that.
+
+00:08:43.220 --> 00:08:47.769
+Now, if we look, we see everything we saw before,
+
+00:08:47.770 --> 00:08:52.246
+but now we have subject emacs-init.
+
+00:08:52.247 --> 00:08:55.973
+It has a type and it's named.
+
+00:08:55.974 --> 00:08:57.220
+We also see the same thing two lines down.
+
+00:08:57.220 --> 00:08:58.264
+This type is also a bookmark,
+
+00:08:58.265 --> 00:09:02.819
+but the name is init in the named/name,
+
+00:09:02.820 --> 00:09:05.966
+which is like the type is name, named,
+
+00:09:05.967 --> 00:09:08.752
+and the property is name. It's init.
+
+00:09:08.753 --> 00:09:12.661
+As you can see, this is just
+
+00:09:12.662 --> 00:09:16.331
+how everything looks.
+
+00:09:16.332 --> 00:09:18.356
+It's pretty straightforward
+
+00:09:18.357 --> 00:09:19.318
+and you can retrieve it.
+
+00:09:19.319 --> 00:09:21.603
+Now, we're looking at the database,
+
+00:09:21.604 --> 00:09:22.689
+but you don't really have to
+
+00:09:22.690 --> 00:09:23.218
+look at the database for... In fact,
+
+00:09:23.219 --> 00:09:24.222
+I think we're done looking
+
+00:09:24.223 --> 00:09:25.105
+at the triples format,
+
+00:09:25.106 --> 00:09:29.718
+because I think it's very simple.
+
+00:09:29.719 --> 00:09:31.365
+You've already got the hang of it, I think.
+
+00:09:31.366 --> 00:09:33.069
+Let's retrieve that just to make sure, yes,
+
+00:09:33.070 --> 00:09:37.980
+we can retrieve it.
+
+00:09:37.981 --> 00:09:38.247
+We're going to retrieve it and say, okay,
+
+00:09:38.248 --> 00:09:43.286
+what do we get when we load the emacs-init subject?
+
+00:09:43.287 --> 00:09:48.697
+Well, we get a plist of all of its properties,
+
+00:09:48.698 --> 00:09:55.630
+which then you can use in your application.
+
+00:09:55.631 --> 00:09:57.455
+There's many more ways to retrieve
+
+00:09:57.456 --> 00:09:59.379
+and there's many more ways to save.
+
+00:09:59.380 --> 00:10:01.904
+In fact, I think the way I did it here
+
+00:10:01.905 --> 00:10:04.015
+with set subject is probably not
+
+00:10:04.016 --> 00:10:06.781
+the right way to do it most of the time.
+
+00:10:06.782 --> 00:10:08.127
+It's usually because it'll erase everything.
+
+00:10:08.128 --> 00:10:13.740
+It's only really to be used when
+
+00:10:13.740 --> 00:10:15.710
+you're sure you control all the data,
+
+00:10:15.711 --> 00:10:16.399
+but you're never sure because there could be
+
+00:10:16.400 --> 00:10:19.610
+other packages that are also using this database,
+
+00:10:19.611 --> 00:10:20.695
+they could have their own data.
+
+00:10:20.696 --> 00:10:21.342
+You don't want to erase
+
+00:10:21.343 --> 00:10:25.014
+all the other Emacs init subject data.
+
+00:10:25.015 --> 00:10:27.699
+In this case, we did because
+
+00:10:27.700 --> 00:10:30.810
+we are confident it was a new entity,
+
+00:10:30.811 --> 00:10:31.335
+but in most cases, the right thing to do is
+
+00:10:31.336 --> 00:10:34.289
+just set it by type. Just say,
+
+00:10:34.290 --> 00:10:36.676
+we're just going to set the bookmark type,
+
+00:10:36.677 --> 00:10:37.222
+which is... The properties are this,
+
+00:10:37.223 --> 00:10:38.104
+and then the name type
+
+00:10:38.105 --> 00:10:42.814
+and the properties are that.
+
+00:10:42.815 --> 00:10:44.900
+That's a way that you could do things.
+
+00:10:44.900 --> 00:10:48.526
+There's also many retrieval types.
+
+00:10:48.527 --> 00:10:53.755
+The retrieval types:
+
+00:10:53.756 --> 00:10:56.403
+you can retrieve by a number of different ways,
+
+00:10:56.404 --> 00:10:58.869
+which I'm not going to get into,
+
+00:10:58.870 --> 00:11:01.241
+but you can read about in either the source
+
+00:11:01.242 --> 00:11:10.033
+or the readme in the package.
+
+00:11:10.034 --> 00:11:14.539
+We have backlinks as well.
+
+00:11:14.540 --> 00:11:15.862
+Let me explain what backlinks are.
+
+00:11:15.863 --> 00:11:17.172
+There's another feature of the triples.
+
+00:11:17.173 --> 00:11:19.860
+As I mentioned, these things
+
+00:11:19.861 --> 00:11:21.849
+can be thought about as links,
+
+00:11:21.850 --> 00:11:23.797
+but what could be a link in one direction
+
+00:11:23.798 --> 00:11:25.804
+could also be a link in the other direction,
+
+00:11:25.805 --> 00:11:28.395
+and we basically get this for free.
+
+00:11:28.396 --> 00:11:33.807
+Here's an example where we are again
+
+00:11:33.808 --> 00:11:35.752
+connecting toward bookmark. Here we're going to
+
+00:11:35.753 --> 00:11:38.223
+add a new type called tagged.
+
+00:11:38.224 --> 00:11:41.613
+We're going to give everything in tags.
+
+00:11:41.614 --> 00:11:45.524
+Here we're saying, okay, there's a type called tagged
+
+00:11:45.525 --> 00:11:49.234
+and it has a property called tags.
+
+00:11:49.235 --> 00:11:52.060
+This is not unique, so it's a list basically.
+
+00:11:52.060 --> 00:11:54.326
+It's a list of string.
+
+00:11:54.327 --> 00:11:58.675
+There also is a type called tag.
+
+00:11:58.676 --> 00:12:01.402
+This is for things that are tags themselves.
+
+00:12:01.403 --> 00:12:06.127
+Then it has a type called numbers
+
+00:12:06.128 --> 00:12:18.003
+and it has what we call a virtual reversed property.
+
+00:12:18.004 --> 00:12:21.075
+It's virtual because it's not actually stored.
+
+00:12:21.076 --> 00:12:23.741
+We just compute it by reversing
+
+00:12:23.742 --> 00:12:24.306
+the subject and the object.
+
+00:12:24.307 --> 00:12:29.260
+This is on tagged tags. When we query this,
+
+00:12:29.260 --> 00:12:32.006
+we can just say, okay,
+
+00:12:32.007 --> 00:12:33.268
+what are all the subjects
+
+00:12:33.269 --> 00:12:38.859
+that have tagged tags of me, the tag?
+
+00:12:38.860 --> 00:12:39.365
+In fact, let me demonstrate that for you.
+
+00:12:39.366 --> 00:12:42.139
+We're going to set the type on emacs-init.
+
+00:12:42.140 --> 00:12:45.070
+We're going to add the "tagged" type.
+
+00:12:45.071 --> 00:12:47.017
+This is the alternate way of setting data
+
+00:12:47.018 --> 00:12:48.740
+that I mentioned.
+
+00:12:48.740 --> 00:12:49.924
+This won't erase anything else.
+
+00:12:49.925 --> 00:12:51.752
+We're just adding something here.
+
+00:12:51.753 --> 00:12:54.742
+We're adding this type "tagged"
+
+00:12:54.743 --> 00:12:59.953
+to our previous bookmark emacs-init.
+
+00:12:59.954 --> 00:13:01.058
+We're going to add emacs and config
+
+00:13:01.059 --> 00:13:06.866
+as the tags. We're going to then
+
+00:13:06.867 --> 00:13:11.095
+set emacs as a tag and config as a tag.
+
+00:13:11.096 --> 00:13:15.385
+That just lets us have this virtual property.
+
+00:13:15.386 --> 00:13:16.389
+You have to do something.
+
+00:13:16.390 --> 00:13:18.733
+You can't get it out of thin air.
+
+00:13:18.734 --> 00:13:23.426
+The design decision we've made is:
+
+00:13:23.427 --> 00:13:25.508
+you at least need to tag it
+
+00:13:25.509 --> 00:13:32.660
+before you get the free property.
+
+00:13:32.660 --> 00:13:35.631
+What you should see... Let's try it out.
+
+00:13:35.632 --> 00:13:36.037
+We got the subject config,
+
+00:13:36.038 --> 00:13:37.261
+which we've set no data on.
+
+00:13:37.262 --> 00:13:40.668
+You can tell we're not sending any data.
+
+00:13:40.669 --> 00:13:44.820
+If I get that subject, the result is that
+
+00:13:44.821 --> 00:13:46.068
+it says its members are emacs-init.
+
+00:13:46.069 --> 00:13:49.878
+That's what a virtual reverse property.
+
+00:13:49.879 --> 00:13:53.606
+As we tag more things, this just
+
+00:13:53.607 --> 00:13:55.151
+continues to work because it's just doing
+
+00:13:55.152 --> 00:13:59.380
+a SQL query here.
+
+00:13:59.380 --> 00:14:01.985
+Besides showing off the backlinks function,
+
+00:14:01.986 --> 00:14:04.175
+this also shows off the general way
+
+00:14:04.176 --> 00:14:07.863
+you can have extensible entities.
+
+00:14:07.864 --> 00:14:09.391
+That is, it's possible that someone writes
+
+00:14:09.392 --> 00:14:13.062
+a bookmarks package that stores everything
+
+00:14:13.063 --> 00:14:18.054
+in a database, in the triples database,
+
+00:14:18.055 --> 00:14:21.521
+but then someone else can come and say,
+
+00:14:21.522 --> 00:14:23.590
+okay, I'm going to define my own types
+
+00:14:23.591 --> 00:14:25.739
+that's meant to work with this database,
+
+00:14:25.740 --> 00:14:28.507
+just like someone could do what I did here,
+
+00:14:28.508 --> 00:14:30.874
+just to add simple tagging.
+
+00:14:30.875 --> 00:14:32.900
+It's very easy to do.
+
+00:14:32.901 --> 00:14:35.931
+This stuff is not that easy to do otherwise.
+
+00:14:35.932 --> 00:14:38.961
+To do this in Lisp, I would say it's a little awkward.
+
+00:14:38.962 --> 00:14:42.673
+With databases, again, it's not only possible,
+
+00:14:42.674 --> 00:14:43.498
+it's relatively trivial,
+
+00:14:43.499 --> 00:14:49.828
+especially with this kind of database.
+
+00:14:49.829 --> 00:14:53.056
+The benefit is it's super easy to work with.
+
+00:14:53.057 --> 00:14:56.041
+With this kind of generic database,
+
+00:14:56.042 --> 00:15:00.311
+the drawback is it's not all that efficient
+
+00:15:00.312 --> 00:15:04.381
+as a special purpose table
+
+00:15:04.382 --> 00:15:06.191
+that is really built for efficiencies.
+
+00:15:06.192 --> 00:15:08.820
+A lot of times you have to do multiple lookups
+
+00:15:08.820 --> 00:15:09.442
+and things like that.
+
+00:15:09.443 --> 00:15:11.985
+Again, it's a trade-off for various things.
+
+00:15:11.986 --> 00:15:19.900
+As you can see, this is like
+
+00:15:19.901 --> 00:15:22.066
+one database for everything.
+
+00:15:22.067 --> 00:15:29.178
+That means that we don't have to all
+
+00:15:29.179 --> 00:15:31.944
+contribute to one giant database.
+
+00:15:31.945 --> 00:15:33.052
+All the packages that use triples,
+
+00:15:33.053 --> 00:15:35.180
+it doesn't have to be one database,
+
+00:15:35.180 --> 00:15:37.086
+but it's cool if it does.
+
+00:15:37.087 --> 00:15:39.393
+I don't know what I want to happen
+
+00:15:39.394 --> 00:15:41.220
+or what I expect to happen,
+
+00:15:41.220 --> 00:15:43.068
+but I think an interesting property is that
+
+00:15:43.069 --> 00:15:45.400
+this is a way for lots of data to live together
+
+00:15:45.400 --> 00:15:49.606
+and build off each other in ways that I think
+
+00:15:49.607 --> 00:15:55.780
+are hard to do with other forms of table layouts
+
+00:15:55.780 --> 00:15:57.007
+and things like that.
+
+00:15:57.008 --> 00:15:59.653
+Let's talk about a use of it,
+
+00:15:59.654 --> 00:16:02.643
+which is the EKG package.
+
+00:16:02.644 --> 00:16:04.589
+The EKG package is something I've written
+
+00:16:04.590 --> 00:16:07.780
+to demonstrate the triples library
+
+00:16:07.780 --> 00:16:09.409
+and use it for something I think is interesting,
+
+00:16:09.410 --> 00:16:12.420
+which is personal knowledge management systems
+
+00:16:12.420 --> 00:16:14.384
+of the same type, of the same genre
+
+00:16:14.385 --> 00:16:15.286
+that Org Roam is,
+
+00:16:15.287 --> 00:16:18.433
+but with different design decisions.
+
+00:16:18.434 --> 00:16:26.531
+I'll show it in action for a little bit.
+
+00:16:26.532 --> 00:16:28.359
+Let's just look at... it's all tag-based,
+
+00:16:28.360 --> 00:16:30.185
+same kind of tags we saw before
+
+00:16:30.186 --> 00:16:32.232
+when we were playing around
+
+00:16:32.233 --> 00:16:35.560
+with the bookmarks example application,
+
+00:16:35.224 --> 00:16:37.475
+What I want to show is: I can look at a tag.
+
+00:16:35.560 --> 00:16:35.223
+but everything here is...
+
+00:16:37.476 --> 00:16:40.287
+I could see notes with that tag.
+
+00:16:40.288 --> 00:16:42.632
+Everything you see here is in the database,
+
+00:16:42.633 --> 00:16:43.198
+no files involved.
+
+00:16:43.199 --> 00:16:46.404
+All of this is just a thing
+
+00:16:46.405 --> 00:16:49.390
+that's an entire object, the entire string.
+
+00:16:49.391 --> 00:16:56.081
+It works. It has tags.
+
+00:16:56.082 --> 00:16:59.229
+You can see not only this tag,
+
+00:16:59.230 --> 00:17:01.354
+but all the other tags associated with it
+
+00:17:01.355 --> 00:17:04.860
+and their notes.
+
+00:17:04.860 --> 00:17:10.255
+It's kind of an interesting way to do things.
+
+00:17:10.256 --> 00:17:12.260
+When you capture it, I think it's interesting.
+
+00:17:12.260 --> 00:17:22.275
+There's a lot of interesting design elements here.
+
+00:17:22.276 --> 00:17:25.819
+This tags thing is not part of the buffer.
+
+00:17:25.819 --> 00:17:28.751
+It's not like Org Roam.
+
+00:17:28.752 --> 00:17:29.116
+You see here in this other tags,
+
+00:17:29.117 --> 00:17:31.924
+these are things I've imported from Org Roam.
+
+00:17:31.925 --> 00:17:32.230
+This is why they look like they do.
+
+00:17:32.231 --> 00:17:34.020
+They have their own titles because
+
+00:17:34.020 --> 00:17:37.889
+I just wrote them all in Org Roam.
+
+00:17:37.890 --> 00:17:39.457
+What it looks like, really, for these notes
+
+00:17:39.458 --> 00:17:41.023
+is that it's just text.
+
+00:17:41.024 --> 00:17:44.615
+You really don't have to bother with this metadata.
+
+00:17:44.616 --> 00:17:46.282
+If I want another tag like pancakes,
+
+00:17:46.283 --> 00:17:53.654
+I can just add it here. Again, these tags
+
+00:17:53.655 --> 00:17:56.740
+will turn into data, triple data.
+
+00:17:56.740 --> 00:17:59.825
+The text is just a triple date[??] as well,
+
+00:17:59.826 --> 00:18:01.969
+but different to triple data.
+
+00:18:01.970 --> 00:18:08.362
+All these things are like that.
+
+00:18:08.363 --> 00:18:12.771
+You can open up any of these things, et cetera.
+
+00:18:12.772 --> 00:18:16.682
+I think the interesting thing here
+
+00:18:16.683 --> 00:18:22.596
+is to see the code. It's not super interesting
+
+00:18:22.597 --> 00:18:23.980
+to look at code for too long,
+
+00:18:23.980 --> 00:18:26.991
+but we don't have that long.
+
+00:18:26.992 --> 00:18:27.654
+Whenever we connect--
+
+00:18:27.655 --> 00:18:28.819
+I just want to point out a few things.
+
+00:18:28.820 --> 00:18:29.205
+Whenever we connect, we have a schema.
+
+00:18:29.206 --> 00:18:31.175
+We just do this. Every time we connect,
+
+00:18:31.176 --> 00:18:33.163
+we just make sure it has the right schema.
+
+00:18:33.164 --> 00:18:36.314
+This way, the user is up to date.
+
+00:18:36.315 --> 00:18:38.300
+This schema just looks exactly like
+
+00:18:38.301 --> 00:18:41.687
+stuff I showed you in the triples
+
+00:18:41.688 --> 00:18:43.532
+when we were looking at bookmarks.
+
+00:18:43.533 --> 00:18:45.100
+It's not complicated.
+
+00:18:45.100 --> 00:18:48.210
+I even have stuff here with people
+
+00:18:48.211 --> 00:18:51.538
+to use this as a person database.
+
+00:18:51.539 --> 00:18:52.104
+I haven't figured out how I'm going to use this yet,
+
+00:18:52.105 --> 00:18:54.273
+but you can see just to do this,
+
+00:18:54.274 --> 00:19:01.913
+it's really trivial and it's pretty easy.
+
+00:19:01.914 --> 00:19:02.498
+Let's show a few other things,
+
+00:19:02.499 --> 00:19:05.844
+like getting all the tags.
+
+00:19:05.845 --> 00:19:07.990
+Here, we could just say,
+
+00:19:07.991 --> 00:19:10.379
+let's get the subjects of type tag.
+
+00:19:10.380 --> 00:19:12.902
+We have all the triples,
+
+00:19:12.903 --> 00:19:15.849
+all the ones that are of type tag,
+
+00:19:15.850 --> 00:19:18.777
+all the things that have a subject.
+
+00:19:18.778 --> 00:19:22.145
+All the subjects that have links,
+
+00:19:22.146 --> 00:19:28.337
+that have this type, this tag in it,
+
+00:19:28.338 --> 00:19:30.660
+we can return them all.
+
+00:19:30.426 --> 00:19:32.674
+of all these objects.
+
+00:19:30.660 --> 00:19:30.425
+Basically, it just gives you a list
+
+00:19:32.675 --> 00:19:33.243
+Again, you can think of these things as objects.
+
+00:19:33.244 --> 00:19:35.433
+All the objects of type tag,
+
+00:19:35.434 --> 00:19:37.320
+we'll just get them all. Super, super simple.
+
+00:19:37.321 --> 00:19:39.585
+Triples gives you this functionality
+
+00:19:39.586 --> 00:19:43.780
+out of the box. It's not that complicated.
+
+00:19:43.780 --> 00:19:45.167
+What I would like to show,
+
+00:19:45.168 --> 00:19:49.518
+and that shows my thesis for this whole talk,
+
+00:19:49.519 --> 00:19:52.785
+is this rename tag. Now, think about
+
+00:19:52.786 --> 00:19:54.150
+how you would rename a tag in Org Roam
+
+00:19:54.151 --> 00:20:03.013
+or anything where the tag is part of the files.
+
+00:20:03.014 --> 00:20:05.280
+It's like how you would re-tag everything
+
+00:20:05.280 --> 00:20:09.869
+in Org Mode. It's complicated and error-prone
+
+00:20:09.870 --> 00:20:12.556
+and slow. This is anything,
+
+00:20:12.557 --> 00:20:14.763
+this is instantaneous and super easy.
+
+00:20:14.764 --> 00:20:17.255
+Look, that's it. There's not that many places
+
+00:20:17.256 --> 00:20:19.540
+for an error to live here.
+
+00:20:19.540 --> 00:20:21.507
+One thing I would like to point out
+
+00:20:21.508 --> 00:20:23.337
+is that we are doing direct,
+
+00:20:23.338 --> 00:20:24.320
+not everything has to go through
+
+00:20:24.321 --> 00:20:28.292
+the triples package. Maybe it should,
+
+00:20:28.293 --> 00:20:31.660
+but the triples package is a fixed format,
+
+00:20:31.660 --> 00:20:33.906
+which is why it's okay--
+
+00:20:33.907 --> 00:20:34.069
+whether it's a good idea, I'm not sure,
+
+00:20:34.070 --> 00:20:39.863
+but it's okay for client packages
+
+00:20:39.864 --> 00:20:42.833
+to just directly manipulate the tables.
+
+00:20:42.834 --> 00:20:43.937
+Here, we're just doing it just to
+
+00:20:43.938 --> 00:20:45.265
+update all the tags
+
+00:20:45.266 --> 00:20:47.891
+and then remove and set types
+
+00:20:47.892 --> 00:20:49.119
+so that the correct thing happens.
+
+00:20:49.120 --> 00:20:52.146
+As you can see, it's super, super simple.
+
+00:20:52.147 --> 00:20:55.374
+I think this proves my thesis about
+
+00:20:55.375 --> 00:21:01.526
+the advantages of applications with SQLite.
+
+00:21:01.527 --> 00:21:02.430
+Thank you for listening.
+
+00:21:02.431 --> 00:21:05.876
+I hope this puts ideas in your minds
+
+00:21:05.877 --> 00:21:09.827
+about taking advantage of this functionality.
+
+00:21:09.828 --> 00:21:11.935
+I hope to see more things
+
+00:21:11.936 --> 00:21:12.180
+using the triples library
+
+00:21:12.180 --> 00:21:16.017
+or otherwise that take advantage of this.
+
+00:21:16.018 --> 00:21:17.660
+Thank you for your time.