1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
|
<!-- 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 -->
|