<!-- Automatically generated by emacsconf-publish-after-page -->
<div class="transcript transcript-mainVideo"><a name="pgmacs-mainVideo-transcript"></a><h1>Transcript</h1>
<div class="transcript-heading">[[!template new="1" text="""Introduction""" start="00:00:01.260" video="mainVideo-pgmacs" id="subtitle"]]</div>[[!template text="""Hi, this is a short presentation about PGmacs,""" start="00:00:01.260" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""which is a browsing and editing interface for""" start="00:00:04.180" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Postgres databases.""" start="00:00:07.100" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""My name is Eric Marsden, and I'm the""" start="00:00:08.920" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""developer of this Emacs Lisp library.""" start="00:00:11.320" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""PGmacs was inspired by sqlite-mode, which is a""" start="00:00:14.800" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""great feature available from Emacs 29 onwards.""" start="00:00:17.420" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""It allows you to view and modify SQLite""" start="00:00:21.060" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""databases you might have lying around.""" start="00:00:24.560" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""It's a really great feature.""" start="00:00:26.760" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""It would be even better, however, if it""" start="00:00:28.140" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""were able to use a real database.""" start="00:00:30.840" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""And I happen to know that was possible""" start="00:00:34.540" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""because a few years ago, I wrote an""" start="00:00:36.200" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Emacs Lisp library, pg.el, which implements the wire""" start="00:00:38.120" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""protocol used for communication over the network between""" start="00:00:42.920" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""a Postgres client and the Postgres backend, the""" start="00:00:46.280" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Postgres server.""" start="00:00:49.600" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""I've included here an example of what it""" start="00:00:51.580" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""looks like to use this library.""" start="00:00:53.560" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""You connect to the database by specifying the""" start="00:00:54.820" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""database name, your username, your password, potentially the""" start="00:00:58.240" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""hostname that you're connecting to.""" start="00:01:01.520" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Once you're connected, you can then execute SQL""" start="00:01:03.800" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""statements, for example, to create a new table,""" start="00:01:06.680" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""to insert values into that table, and to""" start="00:01:10.180" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""count the number of rows in a table.""" start="00:01:13.860" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""And pg.el does automatic type conversion to""" start="00:01:17.100" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""and from Emacs Lisp types and Postgres types for""" start="00:01:20.300" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""you.""" start="00:01:24.180" video="mainVideo-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Demo""" start="00:01:26.710" video="mainVideo-pgmacs" id="subtitle"]]</div>[[!template text="""Probably the best is to jump straight into""" start="00:01:26.710" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""a demo of PGmacs.""" start="00:01:29.170" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""When we connect to a database, we see""" start="00:01:31.210" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""up the top of the buffer, some information""" start="00:01:34.130" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""about the backend that we're connected to, some""" start="00:01:36.330" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""version information and the total database size on""" start="00:01:39.070" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""disk.""" start="00:01:42.010" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""There are some shortcuts to some commands we""" start="00:01:43.090" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""can run on the database, and there's a""" start="00:01:45.170" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""list of tables that we have access to,""" start="00:01:47.370" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""with again, metainformation about their size on""" start="00:01:50.230" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""disk and their owner.""" start="00:01:52.650" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Now, we can enter a table by pressing""" start="00:01:53.650" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""return.""" start="00:01:56.490" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Here we again see some metainformation about""" start="00:01:58.510" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""the table, such as the list of columns,""" start="00:02:01.230" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""the SQL type of each column, any defaults""" start="00:02:05.510" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""that might be present and any SQL constraints.""" start="00:02:08.490" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We see any indexes that might be present""" start="00:02:11.970" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""on this table, and then we see the""" start="00:02:14.370" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""list of rows of data in the table.""" start="00:02:16.790" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""If we see any information which is incorrect""" start="00:02:19.830" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""or incomplete, we can easily fix it by""" start="00:02:22.870" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""pressing enter again, and this updates the information""" start="00:02:26.710" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""present in the database.""" start="00:02:36.300" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""PGmacs shows us this in the minibuffer""" start="00:02:38.200" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""it has updated one row.""" start="00:02:39.840" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can look at help for the key""" start="00:02:43.540" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""bindings that are present in this type of""" start="00:02:45.440" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""buffer.""" start="00:02:47.440" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""If we scroll down, we can see that""" start="00:02:48.120" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""we can upcase the value of a cell""" start="00:02:49.580" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""with M-u.""" start="00:02:51.580" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Let's try that out.""" start="00:02:52.920" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Okay, here we have updated the value of""" start="00:02:56.430" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""the cell in the database.""" start="00:02:58.950" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can now lowercase it, and we can""" start="00:03:00.830" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""put it back to the initial""" start="00:03:03.330" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""title case of the value.""" start="00:03:06.510" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can also run a shell command on""" start="00:03:09.010" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""a cell value, to count the number of""" start="00:03:11.550" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""characters, for example.""" start="00:03:14.570" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can run a shell command with a""" start="00:03:17.570" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""prefix argument, which updates the value in the""" start="00:03:20.390" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""database with the output from the shell command.""" start="00:03:22.990" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""So that has updated the database.""" start="00:03:27.470" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""If we do that again, that will reverse""" start="00:03:30.270" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""the value. If we come back""" start="00:03:32.790" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""to the list of tables, we see""" start="00:03:39.750" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""that there is a table which is called""" start="00:03:41.590" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""deleteme.""" start="00:03:43.010" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can try renaming this table with R,""" start="00:03:43.890" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""we can look at what is in this""" start="00:03:50.380" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""table.""" start="00:03:52.880" video="mainVideo-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Deletion""" start="00:03:53.960" video="mainVideo-pgmacs" id="subtitle"]]</div>[[!template text="""Okay, there is only one row of information""" start="00:03:53.960" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""that doesn't seem very important, so let's delete""" start="00:03:56.600" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""that.""" start="00:03:59.280" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Let's now delete the table with DEL.""" start="00:04:02.160" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""PGmacs asks for confirmation, and we've deleted the""" start="00:04:07.980" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""table.""" start="00:04:11.000" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Now when we have a big table with""" start="00:04:13.390" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""a lot of data, PGmacs is going to""" start="00:04:15.470" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""show us the results paginated, so we can""" start="00:04:18.250" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""go chunk by chunk through the table.""" start="00:04:21.150" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can implement a where filter on the""" start="00:04:24.370" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""rows to only show the rows that match""" start="00:04:28.070" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""a certain SQL clause.""" start="00:04:30.570" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""So for example, here we have some temperature""" start="00:04:33.110" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""measurements.""" start="00:04:35.450" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We want to focus on measurements that are""" start="00:04:36.490" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""more than 40 degrees Celsius, for example.""" start="00:04:38.690" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Okay, we have now filtered on a certain""" start="00:04:45.980" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""number of rows.""" start="00:04:48.120" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""The filter is shown to us just up""" start="00:04:49.540" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""here, and we see here that we have""" start="00:04:51.240" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""some values that look anomalous.""" start="00:04:53.540" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""There's one, 140, and one is 61.""" start="00:04:56.500" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We probably want to delete them, they represent""" start="00:04:59.840" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""errors.""" start="00:05:02.980" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can mark them for deletion with d,""" start="00:05:04.080" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""and then really delete them, expunge them, as""" start="00:05:06.560" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""in Dired, with x.""" start="00:05:09.680" video="mainVideo-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Export""" start="00:05:12.880" video="mainVideo-pgmacs" id="subtitle"]]</div>[[!template text="""We can export this table in CSV format,""" start="00:05:12.880" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""thanks to this little button up here.""" start="00:05:16.480" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Here we have our table conveniently formatted as""" start="00:05:19.860" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""CSV.""" start="00:05:22.760" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can also export a particular row to""" start="00:05:23.400" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""JSON by typing j, let's look at""" start="00:05:28.480" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""what that looks like.""" start="00:05:32.080" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Okay, here's the JSON for one of the""" start="00:05:37.810" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""rows in the table.""" start="00:05:40.230" video="mainVideo-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""HStore""" start="00:05:42.250" video="mainVideo-pgmacs" id="subtitle"]]</div>[[!template text="""Now let's look at a table that contains""" start="00:05:42.250" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""a column of type HStore.""" start="00:05:44.270" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""This is a Postgres-specific key-value map.""" start="00:05:46.430" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Then the attributes column is of type""" start="00:05:49.110" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""JSON, which can be stored natively in Postgres.""" start="00:05:51.170" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""It's possible to edit these values using a""" start="00:05:54.750" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""widget-based interface by typing w, and here""" start="00:05:56.910" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""we have a convenient interface for modifying these""" start="00:06:00.490" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""types of values.""" start="00:06:03.630" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Likewise, for the JSON type parameter, we can""" start="00:06:05.410" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""update using a widget-based interface.""" start="00:06:08.390" video="mainVideo-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Connecting to a different database""" start="00:06:11.510" video="mainVideo-pgmacs" id="subtitle"]]</div>[[!template text="""Let's connect to a different database.""" start="00:06:11.510" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We do that with a M-x pgmacs, and""" start="00:06:14.490" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""then enter our username and password.""" start="00:06:18.910" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Here we have the list of tables present""" start="00:06:27.310" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""in this database.""" start="00:06:29.390" video="mainVideo-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""SchemaSpy""" start="00:06:31.110" video="mainVideo-pgmacs" id="subtitle"]]</div>[[!template text="""PGmacs has some support for running the SchemaSpy""" start="00:06:31.110" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""utility, which generates a graphical representation of the""" start="00:06:33.690" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""relationships between tables in this database, which can""" start="00:06:37.950" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""be useful when you're discovering the database.""" start="00:06:41.710" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Here is the SVG that's output by this""" start="00:06:45.170" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""utility.""" start="00:06:47.870" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""This is a test database containing information about""" start="00:06:50.860" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""a digital media store.""" start="00:06:53.840" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""It has a table with information about the""" start="00:06:55.880" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""tracks that are available.""" start="00:06:58.160" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""If we look at this table, we""" start="00:07:00.960" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""see that we have the name of the""" start="00:07:03.480" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""track, a reference to the album, album ID.""" start="00:07:04.780" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""This is a reference to a foreign key,""" start="00:07:09.240" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""a key in the table which is called""" start="00:07:11.660" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""album.""" start="00:07:13.520" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Now we can follow this foreign key reference""" start="00:07:14.820" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""simply by pressing Enter, and here we find""" start="00:07:16.840" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""it's the album called For Those About To""" start="00:07:20.580" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Rock.""" start="00:07:23.100" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""And in the same way, here we have""" start="00:07:24.260" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""a foreign key reference to the relevant artist""" start="00:07:26.420" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""which we can follow.""" start="00:07:28.780" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""That's, of course, AC/DC.""" start="00:07:30.080" video="mainVideo-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Convenience queries""" start="00:07:32.620" video="mainVideo-pgmacs" id="subtitle"]]</div>[[!template text="""And finally, PGmacs has some convenience queries that""" start="00:07:32.620" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""allows us to list the procedures which are""" start="00:07:35.720" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""defined in this database.""" start="00:07:38.280" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Here we have the built-in procedures, mostly""" start="00:07:40.260" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""used by the PostGIS extension.""" start="00:07:42.820" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can also display some more information about""" start="00:07:48.430" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""our backend.""" start="00:07:52.110" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Here we have the list of extensions which""" start="00:07:53.090" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""are available.""" start="00:07:56.450" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can load one of these extensions if""" start="00:07:57.470" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""we have the rights to do that.""" start="00:08:00.250" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Here we've loaded the relevant extension.""" start="00:08:02.350" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can show some information about the Postgres""" start="00:08:06.210" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""settings also, and update them if we have""" start="00:08:08.850" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""the rights to do that.""" start="00:08:16.650" video="mainVideo-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Emacs as an application development platform""" start="00:08:18.850" video="mainVideo-pgmacs" id="subtitle"]]</div>[[!template text="""Now I'm preaching to the converted, but Emacs""" start="00:08:18.850" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""is a really great application development platform.""" start="00:08:21.650" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""PGmacs is currently around 3000 lines of code.""" start="00:08:25.510" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""A first point of comparison, PGCLI, which is""" start="00:08:29.630" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""a text user interface for accessing Postgres implemented""" start="00:08:32.510" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""in Python, is 17,000 lines of code.""" start="00:08:36.409" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""PGAdmin4, which is a well-known Python GUI""" start="00:08:40.390" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""for administrating Postgres databases, is almost half a""" start="00:08:43.190" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""million lines of code.""" start="00:08:47.010" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""And DBeaver, implemented in Java, is almost a""" start="00:08:48.410" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""million lines of code.""" start="00:08:51.450" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Developing things on Emacs, you get for""" start="00:08:53.130" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""free portability between different platforms.""" start="00:08:56.030" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""As I'm showing you, it works great on""" start="00:08:58.470" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Linux, which is where I developed this library.""" start="00:09:00.130" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""It also works perfectly in the terminal, except""" start="00:09:03.070" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""for some of the functionality I showed, which""" start="00:09:06.530" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""requires SVG support.""" start="00:09:08.530" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""It also works well, if you're into that""" start="00:09:10.970" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""kind of thing, on MacOS and on Windows.""" start="00:09:12.630" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""And it even works perfectly on Haiku, which""" start="00:09:15.830" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""is a free BeOS clone.""" start="00:09:19.130" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Emacs is actually really pretty on this operating""" start="00:09:21.300" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""system, so congratulations to the people who did""" start="00:09:23.870" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""the port there.""" start="00:09:26.590" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Now, of course, the main advantage of building""" start="00:09:27.530" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""on the Emacs development platform, is that the""" start="00:09:29.350" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""application is easy for the user to extend.""" start="00:09:32.430" video="mainVideo-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Extending pgmacs""" start="00:09:36.250" video="mainVideo-pgmacs" id="subtitle"]]</div>[[!template text="""To illustrate that, previously we were looking at""" start="00:09:36.250" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""a table of temperature measurements.""" start="00:09:38.690" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Imagine we want to highlight rows in this""" start="00:09:42.070" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""table, which look anomalous, where the value looks""" start="00:09:44.510" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""a bit extreme.""" start="00:09:48.430" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""That's quite easy to do with a bit""" start="00:09:50.090" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""of Emacs Lisp.""" start="00:09:52.150" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We define a function, which, if the cell""" start="00:09:54.610" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""value is bigger than 40, is going to""" start="00:09:58.410" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""display it in a face which has a""" start="00:10:01.570" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""dark red foreground.""" start="00:10:03.850" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can now register this display function for""" start="00:10:05.950" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""the measurement column in the temperatures table.""" start="00:10:08.890" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""And if we reopen the table now, we""" start="00:10:12.190" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""see that the anomalous measurements are indeed highlighted""" start="00:10:16.490" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""in red.""" start="00:10:19.950" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Another example, imagine we have a table which""" start="00:10:24.100" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""contains image data.""" start="00:10:27.320" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""There's a column which is of BYTEA type,""" start="00:10:29.200" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""which contains images in binary form.""" start="00:10:31.740" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can display these inline as follows.""" start="00:10:35.340" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We create an inline image display function, using""" start="00:10:40.340" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Emacs' image support.""" start="00:10:44.900" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""And then we'd register this function to display""" start="00:10:47.080" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""the image column in the inline image table.""" start="00:10:49.540" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""If we now reopen the inline image table,""" start="00:10:52.780" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""we see the images are displayed inline.""" start="00:10:56.060" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""And as a final example of customisation, here's""" start="00:10:59.660" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""how to bind a key to a specific""" start="00:11:03.160" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""function, in the row-list buffer.""" start="00:11:05.440" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Let's define a function that does a DuckDuckGo""" start="00:11:08.800" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""lookup for a particular value in""" start="00:11:12.080" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""the Emacs web browser.""" start="00:11:15.500" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""We can define a function which does a""" start="00:11:18.080" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""funcall on the cell value for this""" start="00:11:22.140" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""DuckDuckGo lookup function.""" start="00:11:24.400" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""And finally we can define a key, the""" start="00:11:27.100" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""capital D key, in the row-list map,""" start="00:11:30.060" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""which calls this function that does a""" start="00:11:33.540" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""DuckDuckGo lookup.""" start="00:11:35.480" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""And now if I'm browsing information in a""" start="00:11:37.240" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""table that I want to do a web""" start="00:11:39.600" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""search on, I can use my D shortcut""" start="00:11:41.580" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""and see some web results concerning the cell.""" start="00:11:45.380" video="mainVideo-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Conclusion""" start="00:11:49.400" video="mainVideo-pgmacs" id="subtitle"]]</div>[[!template text="""So to conclude, the source and installation instructions""" start="00:11:49.400" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""for PGmacs are available on GitHub.""" start="00:11:53.880" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""It requires Emacs 29.""" start="00:11:56.680" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""There is a prebuilt container image which you""" start="00:11:59.260" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""can use for testing.""" start="00:12:01.620" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""It's a Docker image.""" start="00:12:02.980" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""The Docker image only works in terminal mode.""" start="00:12:04.580" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""And of course that's a recommended way of""" start="00:12:06.160" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""testing Emacs Lisp code that you load""" start="00:12:08.380" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""into your Emacs before having read it.""" start="00:12:11.020" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""It works with any recent version of Postgres""" start="00:12:13.360" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""over the past 10 years, including the latest""" start="00:12:15.720" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""release, Postgres 17.""" start="00:12:18.580" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""It does work with a certain number of""" start="00:12:20.440" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""databases that are compatible with Postgres, such as""" start="00:12:22.700" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""ParadeDB, TimescaleDB and IvorySQL.""" start="00:12:26.440" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""However, it doesn't work with all databases that""" start="00:12:30.940" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""claim to be Postgres compatible.""" start="00:12:33.560" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""It doesn't work, for example, with CrateDB or""" start="00:12:35.340" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""with CockroachDB or some others that you see""" start="00:12:37.840" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""listed here.""" start="00:12:39.960" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""The reason for that is that these databases""" start="00:12:40.760" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""don't implement the system tables that PGmacs queries""" start="00:12:42.660" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""to obtain information about the columns present in""" start="00:12:46.440" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""a table, the size on disk, the ownership""" start="00:12:49.600" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""of tables, etc.""" start="00:12:52.220" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""PGmacs supports TLS encrypted connections to the database,""" start="00:12:54.600" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""as well as local Unix socket connections.""" start="00:12:58.380" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""And in terms of stability, I would classify""" start="00:13:02.040" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""it as beta status.""" start="00:13:04.600" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""I do use it myself in production on""" start="00:13:06.680" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""some not very important data.""" start="00:13:09.200" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Really, it works quite well.""" start="00:13:11.560" video="mainVideo-pgmacs" id="subtitle"]]
[[!template text="""Thanks for your attention.""" start="00:13:14.300" video="mainVideo-pgmacs" id="subtitle"]]
</div>
Captioner: eric
<div class="transcript transcript-qanda"><a name="pgmacs-qanda-transcript"></a><h1>Q&A transcript (unedited)</h1>
[[!template text="""And I believe we are live. Hi, Eric, how are you doing? Very""" start="00:00:00.000" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""well, thanks. It's a pleasure to have you as one of our""" start="00:00:10.840" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""speakers but it's also very nice to see you present about""" start="00:00:15.600" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""pgmacs because I found your talk to be very didactic and very""" start="00:00:19.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""visual. So thank you for taking the time to do a very nice""" start="00:00:24.240" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""presentation. I wanted to give the opportunity as I do with""" start="00:00:26.480" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""other speakers to maybe talk about some stuff that you could""" start="00:00:31.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""not include into the talk because of the format. So is there""" start="00:00:36.280" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""anything you'd like to share with the viewers that you""" start="00:00:39.280" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""weren't able to include?""" start="00:00:41.320" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Oh, I think I gave most of the most of the relevant""" start="00:00:45.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""information. This is a fairly young application. I've been""" start="00:00:50.720" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""developing this since roughly the beginning of the year. So""" start="00:00:54.760" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""there are probably some rough edges that people will run""" start="00:00:58.160" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""into if they use Postgres differently from what I do. Or they""" start="00:01:02.880" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""hear maybe conflicts with some other Emacs packages that""" start="00:01:07.480" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""people use that I don't use. So I would really welcome people""" start="00:01:10.920" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""trying it out and sending out bug reports if they do""" start="00:01:14.960" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""encounter some. Yeah, I mean, it's usually... Go on,""" start="00:01:19.360" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""please. Yeah, that would certainly help to make sure it's""" start="00:01:23.480" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""nice and robust. And of course, if you're letting this loose""" start="00:01:29.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""on some production database that you might have, you want""" start="00:01:31.600" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""this to be quite robust, obviously. Yeah, indeed. Because""" start="00:01:35.960" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""usually, you know, when you start publishing packages like""" start="00:01:41.240" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""this, that's when you realize that it has bad interaction""" start="00:01:43.880" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""with other modes in the Emacs of other persons. But""" start="00:01:46.600" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""especially when you're dealing with databases, you also""" start="00:01:49.760" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""realize that the domain space of what you're trying to do""" start="00:01:52.040" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""with your mode also is hugely dependent on what people have""" start="00:01:54.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""in their database, which schema they have. So, indeed, if""" start="00:01:59.000" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""you have been interested, and I think plenty of people have""" start="00:02:03.840" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""been interested by what you've presented, part of the""" start="00:02:05.840" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""reason a software becomes great is that you've got plenty of""" start="00:02:09.040" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""people making bug reports and making sure that all the""" start="00:02:11.680" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""faults have been ironed out. So, you know what your task is. I""" start="00:02:14.760" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""will also ask you, particularly right now, people""" start="00:02:18.800" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""currently viewing, to add your questions on the pad as""" start="00:02:21.320" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""usual, because you've had plenty of nice reactions, but I'm""" start="00:02:24.520" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""sure you have plenty of questions as well. So Eric, what I'll""" start="00:02:27.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""be doing, I'll be reading you the questions so that it's a""" start="00:02:30.800" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""little more didactic. Starting with the first one. This is""" start="00:02:33.760" video="qanda-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Q: Do you know if PGmacs works with TRAMP?""" start="00:02:37.440" video="qanda-pgmacs" id="subtitle"]]</div>[[!template text="""brilliant, thank you. Do you know if pgmacs works with TRAMP?""" start="00:02:37.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""I often use TRAMP multi-hop to access databases both""" start="00:02:41.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""remotely when accessing via bastion server and locally""" start="00:02:44.120" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""when using OCI containers. I believe you've already""" start="00:02:46.960" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""answered but if you could just perhaps read your answer as""" start="00:02:49.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""well for everyone to benefit from it. Yep, sure, that's my""" start="00:02:53.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""comment indeed. So I haven't currently implemented any""" start="00:02:58.800" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""TRAMP support. I'm not sure that TRAMP is really useful for""" start="00:03:02.320" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""this type of situation, because as I understand it, TRAMP is""" start="00:03:07.560" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""establishing SSH connections itself to remote servers.""" start="00:03:11.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""pgmacs is doing the same thing, so it doesn't currently have""" start="00:03:17.160" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""any support for hooking in with the TRAMP support. Right.""" start="00:03:22.520" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Pardon me if I missed the presentation. Oh, go on, please. I""" start="00:03:27.400" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""guess you could set up an SSH tunnel. It does work with an SSH""" start="00:03:31.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""tunnel, obviously, but there's no support for hooking into""" start="00:03:34.360" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""an SSH tunnel that TRAMP might be able to create. I'm not sure""" start="00:03:39.920" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""TRAMP actually uses SSH tunnels rather than direct""" start="00:03:43.800" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""commands, but anyway. Yeah, I think that might be useful.""" start="00:03:46.960" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Yeah, I don't know either. I don't have the answer whether""" start="00:03:51.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""TRAMP actually can create tunnels like this. I'm usually""" start="00:03:54.760" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""used to TRAMP connecting to an endpoint, be it a directory or""" start="00:03:59.040" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""a file, and the tunnel is just you accessing the file. But""" start="00:04:02.040" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""usually, if you're trying to access a remote Postgres""" start="00:04:06.240" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""database, you would probably manage the port forwarding in""" start="00:04:08.960" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""a separate terminal just to be able to make sure that""" start="00:04:12.040" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""everything maps correctly to your machine, and then you""" start="00:04:15.200" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""would launch pgmacs with the forward port information.""" start="00:04:17.760" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""That's, I assume, how you would do it anyway. But yeah, I""" start="00:04:21.960" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""mean, if you could specify what you mean by TRAMP support and""" start="00:04:25.520" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""if you have something specific in mind, I'm talking to the""" start="00:04:29.120" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""questioner, feel free to specify and we'll see if you can""" start="00:04:31.840" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""answer it. But in the meantime, moving to the next question.""" start="00:04:35.120" video="qanda-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Q: How did you come up with this brilliant idea?""" start="00:04:38.240" video="qanda-pgmacs" id="subtitle"]]</div>[[!template text="""Great work, I'm impressed. How did you come up with this""" start="00:04:38.240" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""brilliant idea, I assume, to create pgmacs? Well, thanks for""" start="00:04:42.000" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""the compliment. It's a lot of fun developing something""" start="00:04:49.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""which is, as I said, such a small amount of code and which""" start="00:04:52.840" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""provides quite a bit of useful functionality. In""" start="00:04:57.800" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""particular, if you compare it with existing Terminal mode""" start="00:05:02.360" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""applications for manipulating Postgres data, they are""" start="00:05:06.840" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""not as extensible as Emacs is naturally. So I actually got""" start="00:05:12.800" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""the idea for developing this when I first tested out the""" start="00:05:19.280" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""SQLite mode, which is available in Emacs 29.1.""" start="00:05:23.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""And I thought, well, that's really quite impressive. And it""" start="00:05:27.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""allows you to delete rows and insert content and so on. And I""" start="00:05:31.880" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""was thinking, yeah, Emacs is a, is a useful environment to do""" start="00:05:37.360" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""that. And since several years ago, when I was doing my PhD, so""" start="00:05:42.360" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""to avoid doing my PhD, I was developing Emacs, I was""" start="00:05:50.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""developing stuff in Emacs Lisp and one of the libraries I""" start="00:05:54.000" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""developed was an interface to Postgres over the network. So""" start="00:05:58.400" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""that's the library called pg.el, which is used by pgmacs to""" start="00:06:02.960" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""access Postgres and to do all the parsing of data which""" start="00:06:08.040" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""arrives in Postgres formats into the Emacs Lisp into the""" start="00:06:14.240" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Emacs corresponding versions. So, for example, integers""" start="00:06:19.280" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""are passed as Emacs integers, floating point numbers as""" start="00:06:23.000" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""floating point numbers, and so on. Right, yeah. I mean, it's""" start="00:06:25.400" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""pretty needed, obviously, when you have such a tooling like""" start="00:06:30.840" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""this, to make sure that the type conversion works properly,""" start="00:06:34.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""because the types that you have in Postgres do not""" start="00:06:37.360" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""necessarily map over to what we have in Emacs. Like, I'm""" start="00:06:39.880" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""interested, how would you handle g's and b columns in pgmacs?""" start="00:06:43.880" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""JSON is mapped to an edis dict, a dictionary.""" start="00:06:49.240" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""It depends on the top level object type for your JSON column.""" start="00:06:55.040" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""If it's an array, it's mapped to an Emacs Lisp array. If it's a""" start="00:07:03.760" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""dict, which is most common, it's mapped to an Emacs Lisp""" start="00:07:07.600" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""dictionary. All right, well it makes perfect sense. So I can""" start="00:07:12.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""break in with a question. Thanks, I just helped myself to the""" start="00:07:17.680" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""BBB privilege of kind of running around backstage, being a""" start="00:07:21.840" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""helper backstage. So thanks for your awesome talk, Eric. I""" start="00:07:26.160" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""super appreciated it. You know, I noticed that you that""" start="00:07:31.680" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""you're on a slightly older version of Emacs that I deal with""" start="00:07:36.720" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""in helping with producing the Windows binaries I run into""" start="00:07:43.160" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""and with some other stuff I do. I'm dealing with that""" start="00:07:49.520" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""friction of sometimes I've got some work of my own that""" start="00:07:53.840" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""applies against a specific version of Emacs and it's a bunch""" start="00:07:56.920" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""of work to think about moving it forward. Just curious if you""" start="00:07:59.720" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""started thinking about that or if you routine, if that's a""" start="00:08:02.520" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""routine that you haven't done or there's something maybe""" start="00:08:06.480" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""specifically going on with, you know, with trunk""" start="00:08:09.920" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""development that looks intimidating to deal with. Thanks""" start="00:08:14.600" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""for the comment. I'm not sure I'm using a really old version""" start="00:08:20.600" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""for Windows. I don't really develop often on Windows, but I I""" start="00:08:24.960" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""occasionally check that it works, and I took a screenshot""" start="00:08:29.240" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""that I included in the slides here, but I think I'm using""" start="00:08:32.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""29.4, the current version on Windows. I thought I saw 29.1,""" start="00:08:34.800" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""so that's probably my, I probably missed it when it went by.""" start="00:08:40.560" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""My bad. No, no, I use it via the choco package updater so that""" start="00:08:48.840" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""updates the Emacs version quite easily on Windows. So""" start="00:08:54.880" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""thanks for your work on maintaining Windows binaries. I""" start="00:08:58.480" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""realize that was- I sit downstream at the end of a lot of other""" start="00:09:03.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""people's hard work and then just focus on trying to QA well""" start="00:09:07.520" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""and help catch problems early. It's really fun. But of""" start="00:09:11.400" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""course, my pleasure.""" start="00:09:15.560" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Coming back to the previous question, so the the""" start="00:09:16.400" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""questionnaire actually provided a little more context. So""" start="00:09:21.800" video="qanda-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""TRAMP continued""" start="00:09:26.920" video="qanda-pgmacs" id="subtitle"]]</div>[[!template text="""with docker.el, kubel, etc, it's often possible to, for""" start="00:09:26.920" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""example, select a container pod or whatever that is hosted""" start="00:09:30.600" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""on the machine you've connected to via TRAMP, such as""" start="00:09:33.920" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Podman, colon image colon path and trigger a terminal shell""" start="00:09:36.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""as well as pull forward on other similar things. It'd be nice""" start="00:09:41.800" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""to be able to use this tool in a similar way since it would open""" start="00:09:44.960" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""up the ability to use it with complex connection""" start="00:09:47.680" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""configuration. Doing SSH tunnel manually is of course""" start="00:09:49.920" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""totally fine in practice and if it is actually the case""" start="00:09:53.680" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""personally when I need to remote into a kubernetes machine I""" start="00:09:56.880" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""use POSIX script that I use on most of my machines but I don't""" start="00:10:01.320" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""do it inside Emacs. But yeah, if such a thing is possible via""" start="00:10:05.240" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""TRAMP, it definitely feels like it would be possible to do""" start="00:10:08.600" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""something similar in pgmacs. So perhaps that's a path of""" start="00:10:11.040" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""investigation for you that has opened up. Yeah, thanks for""" start="00:10:14.920" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""these comments. I'll look into that indeed if people have""" start="00:10:19.560" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""some shortcuts registered in TRAMP. So not for a terminal,""" start="00:10:22.760" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""because pgmacs won't work through a terminal, but through a""" start="00:10:26.160" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""port forward, then that would be convenient. I'll see how""" start="00:10:29.600" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""easy that is to set up. Yeah, I'm pretty sure the way it works""" start="00:10:33.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""is that it starts some processes in the background in Emacs""" start="00:10:38.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""just to either maintain the port forward or to maybe remap""" start="00:10:41.280" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""some kubecon things or whatever. So with pgmacs,""" start="00:10:45.360" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""considering complex pipelines to get to the end""" start="00:10:49.240" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""destination, it feels like it would be possible to do""" start="00:10:51.880" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""something. But perhaps it's not the responsibility of""" start="00:10:54.680" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""pgmacs, perhaps it's the responsibility of another,""" start="00:10:57.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""perhaps something that would target TRAMP more so than""" start="00:11:00.200" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""pgmacs. But it's nice to see again how the beauty of Emacs""" start="00:11:03.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""is that everything is Elisp at the end, and the way they""" start="00:11:08.400" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""interact, you might want to question yourself whether this""" start="00:11:12.120" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""belongs more to pgmacs or more to TRAMP, but at the end of the""" start="00:11:16.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""day, both applications will be able to benefit from the""" start="00:11:18.920" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""functions of the other. So that's the beauty of the""" start="00:11:22.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""philosophy right here. I do see... Absolutely, I agree.""" start="00:11:24.760" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Sorry, before we move to different questions, an""" start="00:11:29.160" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""additional point. I should point out that to warn people""" start="00:11:32.280" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""that probably running over an SSH tunnel is going to be a bit""" start="00:11:36.760" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""slow. I mostly use it on my own machine via a local Unix""" start="00:11:41.160" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""connection. And for some reason that I haven't understood,""" start="00:11:46.840" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""pgmacs is quite a bit slower when it's even connecting to the""" start="00:11:50.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""same database on the local machine, but via Emacs' network""" start="00:11:55.120" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""support instead of via the Unix socket support. There is""" start="00:12:00.360" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""like a factor 10 difference in throughput and in latency. I""" start="00:12:05.040" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""don't really understand why currently, because it's using""" start="00:12:11.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""exactly the same Emacs Lisp level primitives. And when you""" start="00:12:15.840" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""do this using other libraries like libpq, which is the""" start="00:12:21.920" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Postgres standard official library for connecting to""" start="00:12:24.800" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Postgres, there's not such a performance difference. So""" start="00:12:30.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""there's probably something that is not working perfectly""" start="00:12:34.320" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""in the Emacs network support. I'll have to see whether I can""" start="00:12:39.760" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""investigate how to improve that performance. Yeah, I'm""" start="00:12:43.880" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""going to say it sounds like a great bug to have because it""" start="00:12:48.680" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""feels like it will allow you to dig deeper into Emacs to""" start="00:12:53.000" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""understand what is going on here. Because as you said,""" start="00:12:57.320" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""normally it's supposed to work exactly the same,""" start="00:12:59.680" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""especially if it's still in your local machine, but it""" start="00:13:01.520" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""doesn't. Personally, that's the kind of bug that I really""" start="00:13:04.320" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""like and that I'd like to spend more time investigating. So""" start="00:13:07.920" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""perhaps you might think otherwise, but I wish you luck on the""" start="00:13:11.200" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""debugging with this particular matter. All right, moving""" start="00:13:14.760" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""to the last question that we have and then we'll probably go""" start="00:13:18.600" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""on a little bit of a break.""" start="00:13:21.520" video="qanda-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Q: Is sqlite-mode also capable of all of this functionality (table relations, etc)? If not, will it be possible to abstract out this functionality from pgmacs somehow?""" start="00:13:22.966" video="qanda-pgmacs" id="subtitle"]]</div>[[!template text="""Question. Is SQLite mode also""" start="00:13:22.966" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""capable of all of this functionality, table relations,""" start="00:13:25.400" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""etc.? If not, would it be possible to abstract out this""" start="00:13:28.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""functionality from pgmacs somehow?""" start="00:13:31.560" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""So I'm not very familiar with SQLite because I don't really""" start="00:13:33.280" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""use it very much myself. I'm not sure I can answer that""" start="00:13:41.320" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""question. Sorry about that. I think it is probably a bit more""" start="00:13:46.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""basic because SQLite itself is quite a bit more basic in""" start="00:13:53.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""terms of the types of indexes it's able to support and the""" start="00:13:56.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""types of constraints it's able to support. Is it relevant to""" start="00:14:01.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""create an abstract API for connecting to databases? I think""" start="00:14:09.200" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""there is already actually a library that abstracts out from""" start="00:14:13.800" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""SQLite and Postgres. Postgres, when you connect to it via a""" start="00:14:19.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""PSQL subsystem,""" start="00:14:25.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""it might be worthwhile doing that, but there are often a few""" start="00:14:29.160" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""minor differences in SQL syntax and so on between""" start="00:14:38.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""databases. So it might be difficult to have something that""" start="00:14:42.280" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""really works with generic queries in an effective way. All""" start="00:14:45.880" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""these SQL dialects are a little bit different,""" start="00:14:53.160" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""unfortunately. So there was another question about I was""" start="00:14:58.240" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""just going to read out the next question.""" start="00:15:02.320" video="qanda-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Q: Would it be possible to move it into Emacs tree? Are the maintainers interested in it?""" start="00:15:06.511" video="qanda-pgmacs" id="subtitle"]]</div>[[!template text="""So have you thought""" start="00:15:06.511" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""about integrating your work into the Emacs tree? Do you know""" start="00:15:07.520" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""if people are interested? This was a question from the past.""" start="00:15:12.560" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Yeah, I think it's probably a bit young to do so, so far.""" start="00:15:17.600" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""I'm updating it quite regularly. Maybe once it's more""" start="00:15:24.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""stabilized, I wouldn't necessarily object to this. I have""" start="00:15:30.120" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""some sort of philosophical objections to giving away my""" start="00:15:35.400" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""copyright, so I'm not sure that will actually be possible.""" start="00:15:38.560" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Oh, that'd be interesting. I'd love to get you on maybe a""" start="00:15:42.520" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""panel talk about that sometime. Something I'd think about.""" start="00:15:48.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Well, from a very simple point of view, I think that the""" start="00:15:51.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""copyright and the system works well with the existing""" start="00:15:56.000" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""license and without a license transfer, so I don't feel that""" start="00:16:01.160" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""the, sorry, without a copyright transfer,""" start="00:16:05.320" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""I don't feel that the copyright transfer is really a necessary step for""" start="00:16:07.767" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""taking things away from maintainers. It feels like asking""" start="00:16:14.680" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""the maintainers to give up on some of their copyright...""" start="00:16:21.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Indeed. Yeah, I see where that's a little beyond our scope,""" start="00:16:26.560" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""but it's a fascinating topic and I appreciate your sharing""" start="00:16:30.000" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""your views there. I mean, that sounds like a whole topic of""" start="00:16:33.520" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""its own, frankly.""" start="00:16:36.960" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Yeah. Corwin, do you want to fill the last question? Sure. So""" start="00:16:41.600" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""the question was, I almost missed this one, so glad I didn't.""" start="00:16:47.040" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""This may have been answered already.""" start="00:16:52.040" video="qanda-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Q: What do you use for the in-buffer tables? Vtable?""" start="00:16:53.850" video="qanda-pgmacs" id="subtitle"]]</div>[[!template text="""What do you use for""" start="00:16:53.850" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""in-buffer tables? Do you use vtable? Yep. Thanks for the""" start="00:16:55.160" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""question. It is indeed vtable. However, it's not really""" start="00:17:00.040" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""vtable. It's a fork that I made, which is called pgmix table.""" start="00:17:04.600" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""because Vtable doesn't have exactly the right""" start="00:17:10.920" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""functionality in particular for recoloring rows when you""" start="00:17:17.200" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""add a row. So I've currently forked this. I'm thinking about""" start="00:17:22.120" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""giving those back as patches to Vtable, plausibly.""" start="00:17:28.240" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""I know that there is some ongoing work also on vTable in the""" start="00:17:36.360" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""core. So I'll have to look at what is plausible to feed back""" start="00:17:40.720" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""into the main version.""" start="00:17:45.840" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""All right, great. I think we are nearing the end of the Q&A. We""" start="00:17:46.720" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""are due to move to the next talk in about three minutes now. I""" start="00:17:55.200" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""can fill 30 seconds or a minute of that with I guess one more""" start="00:17:59.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""maybe back and forth and I'll try to be quicker this time.""" start="00:18:02.720" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""First of all, thanks for your kind remarks. But my question""" start="00:18:05.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""wasn't really about Windows so much, it was just how I'm""" start="00:18:08.880" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""relating... So have you, let me put it more simply, have you""" start="00:18:11.840" video="qanda-pgmacs" id="subtitle"]]
<div class="transcript-heading">[[!template new="1" text="""Integrating with Emacs 30?""" start="00:18:16.640" video="qanda-pgmacs" id="subtitle"]]</div>[[!template text="""started looking at integrating with Emacs 30 or with the""" start="00:18:16.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""master branch at all? Do you have any sense of how much work""" start="00:18:20.640" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""it's going to be for you to carry things forward there? I've""" start="00:18:24.680" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""tested it with the pre-release, yes. I mean, just a very""" start="00:18:27.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""basic testing and everything works perfectly. There's""" start="00:18:31.040" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""really no... There was no difference that I have noticed""" start="00:18:35.080" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""between 29.4 and the 30 pre-release on the aspects that I use""" start="00:18:39.800" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""at least in Emacs. Neato.""" start="00:18:46.280" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""That was it, Leo. Thanks for letting me back in for one more""" start="00:18:48.960" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""bite at the apple there. And I appreciate everybody tuning""" start="00:18:56.440" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""in and participating in the Q&A and this awesome talk.""" start="00:18:58.800" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""Thanks for your questions. That was great. Yeah, and thank""" start="00:19:03.480" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""you for answering them and for the presentation as well. So""" start="00:19:06.880" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""we'll be moving in about two minutes to the next talk, which""" start="00:19:10.320" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""is pre-recorded as well. Well, we didn't really give you the""" start="00:19:14.200" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""chance, Eric, to have the last word. So do you have any last""" start="00:19:20.160" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""word?""" start="00:19:29.400" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""please try it out, try out pgmacs and send some feedback""" start="00:19:29.800" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""that'll help improve it over time. Sure, great. Well, thank""" start="00:19:34.480" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""you so much, Eric, for taking the time to come to the""" start="00:19:39.280" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""conference, and we'll see you soon. Thank you. Bye,""" start="00:19:41.560" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""everyone. Bye. And we'll be live with the next talk in about 1""" start="00:19:46.000" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""minute 30. So we'll take a little bit of a breather, go make""" start="00:19:50.280" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""some coffee, go take a bio break. We'll be back soon. See you""" start="00:19:53.120" video="qanda-pgmacs" id="subtitle"]]
[[!template text="""in a bit.""" start="00:19:56.600" video="qanda-pgmacs" id="subtitle"]]
</div>Questions or comments? Please e-mail [eric.marsden@risk-engineering.org](mailto:eric.marsden@risk-engineering.org?subject=Comment%20for%20EmacsConf%202023%20pgmacs%3A%20PGmacs%3A%20browsing%20and%20editing%20PostgreSQL%20databases%20from%20Emacs)
<!-- End of emacsconf-publish-after-page -->