summaryrefslogtreecommitdiffstats
path: root/2023/info/web-after.md
blob: 96ebb81b860614555b07b3a3a188992d6937018d (plain) (blame)
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
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
<!-- Automatically generated by emacsconf-publish-after-page -->


<a name="web-mainVideo-transcript"></a>
# Transcript


[[!template new="1" text="""Overview""" start="00:00:00.000" video="mainVideo-web" id="subtitle"]]

[[!template text="""Hello, I am Yuchen, and I will be talking about""" start="00:00:00.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""how Emacs may be used to save user freedom on the web.""" start="00:00:03.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""I will begin by describing the background issues,""" start="00:00:06.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""followed by solutions outside of Emacs.""" start="00:00:09.680" video="mainVideo-web" id="subtitle"]]
[[!template text="""Then I will move into the main business of describing""" start="00:00:12.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""several ways to address the issues using Emacs,""" start="00:00:14.880" video="mainVideo-web" id="subtitle"]]
[[!template text="""including free clients in Emacs, web browsers,""" start="00:00:17.800" video="mainVideo-web" id="subtitle"]]
[[!template text="""also known as universal clients in Emacs,""" start="00:00:20.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""approaches using Emacs web server and Emacs web framework,""" start="00:00:23.400" video="mainVideo-web" id="subtitle"]]
[[!template text="""which allows one to write an Emacs package""" start="00:00:27.120" video="mainVideo-web" id="subtitle"]]
[[!template text="""and get a web app for free,""" start="00:00:29.320" video="mainVideo-web" id="subtitle"]]
[[!template text="""as well as using Emacs as a Firefox extension.""" start="00:00:30.760" video="mainVideo-web" id="subtitle"]]

[[!template new="1" text="""Background problems""" start="00:00:35.680" video="mainVideo-web" id="subtitle"]]

[[!template text="""OK, let's now move on to""" start="00:00:35.680" video="mainVideo-web" id="subtitle"]]
[[!template text="""the background issues for this topic.""" start="00:00:37.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""Many of you probably already know what is free software.""" start="00:00:39.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""It is software that respects four user freedoms,""" start="00:00:42.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""including freedom 0, which is the freedom to use,""" start="00:00:45.481" video="mainVideo-web" id="subtitle"]]
[[!template text="""freedom 1 is the freedom to study and modify a program,""" start="00:00:49.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""freedom 2 is the freedom to""" start="00:00:52.279" video="mainVideo-web" id="subtitle"]]
[[!template text="""distribute exact copies of a program,""" start="00:00:54.488" video="mainVideo-web" id="subtitle"]]
[[!template text="""and freedom 3 is the freedom to distribute modified copies.""" start="00:00:57.240" video="mainVideo-web" id="subtitle"]]
[[!template text="""Different environments have different norms""" start="00:01:01.680" video="mainVideo-web" id="subtitle"]]
[[!template text="""with regards to user freedom.""" start="00:01:04.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""For example, GNU/Linux distributions""" start="00:01:06.820" video="mainVideo-web" id="subtitle"]]
[[!template text="""default to free software,""" start="00:01:11.240" video="mainVideo-web" id="subtitle"]]
[[!template text="""even though the official kernel Linux""" start="00:01:13.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""contains non-free code, like non-free firmware.""" start="00:01:15.520" video="mainVideo-web" id="subtitle"]]
[[!template text="""What I mean is, people generally expect free software""" start="00:01:18.420" video="mainVideo-web" id="subtitle"]]
[[!template text="""in these environments.""" start="00:01:23.060" video="mainVideo-web" id="subtitle"]]
[[!template text="""There's plenty of free software""" start="00:01:25.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""built on other free software,""" start="00:01:27.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""so generally people can accomplish tasks""" start="00:01:29.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""using free software only.""" start="00:01:31.220" video="mainVideo-web" id="subtitle"]]
[[!template text="""Emacs, by comparison, is even better.""" start="00:01:33.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""It has freedom built-in, as it is highly customizable""" start="00:01:37.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""with self-documenting configurations.""" start="00:01:41.220" video="mainVideo-web" id="subtitle"]]
[[!template text="""When a Lisp form is evaluated by the user in Emacs,""" start="00:01:44.680" video="mainVideo-web" id="subtitle"]]
[[!template text="""the change is instantly reflected in the environment.""" start="00:01:49.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""Thus, it converts users to hackers effortlessly.""" start="00:01:53.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""From writing setq statements,""" start="00:01:56.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""which is similar to configurations""" start="00:01:58.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""in the majority of other programs,""" start="00:02:00.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""to writing functions,""" start="00:02:01.960" video="mainVideo-web" id="subtitle"]]
[[!template text="""which are building blocks of Elisp features,""" start="00:02:03.400" video="mainVideo-web" id="subtitle"]]
[[!template text="""to writing features and publishing packages,""" start="00:02:05.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""it is a natural progression.""" start="00:02:08.140" video="mainVideo-web" id="subtitle"]]
[[!template text="""In this sense, Emacs perhaps has""" start="00:02:10.099" video="mainVideo-web" id="subtitle"]]
[[!template text="""the most gentle learning curve for hackers.""" start="00:02:15.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""On the other hand, the default license""" start="00:02:18.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""in the Emacs community""" start="00:02:21.100" video="mainVideo-web" id="subtitle"]]
[[!template text="""is GNU General Public License version 3 or later,""" start="00:02:22.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""which is the best free software license""" start="00:02:26.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""apart from the Affero license.""" start="00:02:29.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""Now let's move on to web browsers,""" start="00:02:32.300" video="mainVideo-web" id="subtitle"]]
[[!template text="""which by contrast does not default to freedom.""" start="00:02:35.020" video="mainVideo-web" id="subtitle"]]
[[!template text="""For one thing, free software JavaScript projects""" start="00:02:39.240" video="mainVideo-web" id="subtitle"]]
[[!template text="""default to Expat license,""" start="00:02:42.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""which is also commonly known as the MIT license,""" start="00:02:45.780" video="mainVideo-web" id="subtitle"]]
[[!template text="""which is a lax permissive license that could be exploited""" start="00:02:49.400" video="mainVideo-web" id="subtitle"]]
[[!template text="""as developers could write non-free derivatives""" start="00:02:53.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""and subjugate user freedom.""" start="00:02:55.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""This also contributes to the JavaScript trap.""" start="00:02:59.680" video="mainVideo-web" id="subtitle"]]
[[!template text="""Most popular web browsers nowadays simply download and run""" start="00:03:03.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""any JavaScript code requested by the web page.""" start="00:03:06.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""Generally speaking, there are two camps on this issue.""" start="00:03:10.820" video="mainVideo-web" id="subtitle"]]
[[!template text="""One side would say JavaScript is simply part of life,""" start="00:03:15.320" video="mainVideo-web" id="subtitle"]]
[[!template text="""and an integral part of the so-called modern web.""" start="00:03:19.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""Just accept it, and there is no point in fighting it.""" start="00:03:22.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""Indeed, it can be frustrating when greeted by""" start="00:03:25.300" video="mainVideo-web" id="subtitle"]]
[[!template text="""&quot;This page requires JavaScript and cookies to continue,&quot;""" start="00:03:28.388" video="mainVideo-web" id="subtitle"]]
[[!template text="""or even a blank page when opening a web page""" start="00:03:31.800" video="mainVideo-web" id="subtitle"]]
[[!template text="""while disabling JavaScript.""" start="00:03:34.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""The other camp takes a more principled position""" start="00:03:38.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""and says JavaScript is unnecessary.""" start="00:03:42.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""I mean, people use the web mainly for""" start="00:03:44.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""database-like operations""" start="00:03:47.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""to interact with data stored on other people's computers,""" start="00:03:48.520" video="mainVideo-web" id="subtitle"]]
[[!template text="""like querying, creating, updating, deleting.""" start="00:03:51.680" video="mainVideo-web" id="subtitle"]]
[[!template text="""I mean, 99% of the things happen in getting data,""" start="00:03:55.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""including reading news, watching videos,""" start="00:03:58.960" video="mainVideo-web" id="subtitle"]]
[[!template text="""downloading images, etc.,""" start="00:04:01.240" video="mainVideo-web" id="subtitle"]]
[[!template text="""and posting data, including publishing""" start="00:04:03.340" video="mainVideo-web" id="subtitle"]]
[[!template text="""this sort of materials, publishing news comments, videos.""" start="00:04:06.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""Why does this need any programs""" start="00:04:10.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""to do funny computations, right?""" start="00:04:12.400" video="mainVideo-web" id="subtitle"]]
[[!template text="""Modern web browsers are also a pain to use.""" start="00:04:16.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""They are the opposite to Emacs""" start="00:04:19.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""in terms of customization capabilities.""" start="00:04:21.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""Such problems on the client side""" start="00:04:26.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""is the main focus of this talk.""" start="00:04:29.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""On the server side, the issue is known as SaaSS,""" start="00:04:31.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""service as a software substitute.""" start="00:04:34.320" video="mainVideo-web" id="subtitle"]]
[[!template text="""It is about doing computing for users""" start="00:04:38.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""on other people's computers,""" start="00:04:42.421" video="mainVideo-web" id="subtitle"]]
[[!template text="""which the user has no visibility, let alone control.""" start="00:04:44.541" video="mainVideo-web" id="subtitle"]]
[[!template text="""Examples include translation or photo editing""" start="00:04:48.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""in so-called web applications.""" start="00:04:51.941" video="mainVideo-web" id="subtitle"]]
[[!template text="""Another example would be web applications""" start="00:04:55.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""make recommendations based on user data""" start="00:04:59.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""and suggest what the users read or watch next.""" start="00:05:02.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""On the one hand, SaaSS is an intractable problem""" start="00:05:05.960" video="mainVideo-web" id="subtitle"]]
[[!template text="""because free software is all about user freedom""" start="00:05:09.960" video="mainVideo-web" id="subtitle"]]
[[!template text="""on one's own computer,""" start="00:05:11.800" video="mainVideo-web" id="subtitle"]]
[[!template text="""not someone else's computer.""" start="00:05:13.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""On the other hand, this is also a lesser problem""" start="00:05:16.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""because it has trivial solutions,""" start="00:05:18.880" video="mainVideo-web" id="subtitle"]]
[[!template text="""which is self-hosting and keeping computations local.""" start="00:05:21.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""Wouldn't it be nice to use a photo editing web application,""" start="00:05:25.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""but without the web?""" start="00:05:28.680" video="mainVideo-web" id="subtitle"]]

[[!template new="1" text="""Solutions outside of Emacs""" start="00:05:31.940" video="mainVideo-web" id="subtitle"]]

[[!template text="""Right, now let's move on to solutions outside of Emacs""" start="00:05:31.940" video="mainVideo-web" id="subtitle"]]
[[!template text="""that tackle these problems.""" start="00:05:36.401" video="mainVideo-web" id="subtitle"]]
[[!template text="""There are generally two ways to fix this issue.""" start="00:05:39.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""One is blocking non-free JavaScript,""" start="00:05:42.960" video="mainVideo-web" id="subtitle"]]
[[!template text="""and the other is substituting with free programs.""" start="00:05:45.400" video="mainVideo-web" id="subtitle"]]
[[!template text="""Let's start with blocking.""" start="00:05:48.980" video="mainVideo-web" id="subtitle"]]
[[!template text="""LibreJS, for example, is a Firefox extension""" start="00:05:50.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""blocking non-free, non-trivial JavaScript.""" start="00:05:54.860" video="mainVideo-web" id="subtitle"]]
[[!template text="""It works by intercepting, filtering""" start="00:05:56.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""all requests for JavaScript,""" start="00:05:59.821" video="mainVideo-web" id="subtitle"]]
[[!template text="""recognizing the ones that are trivial or free,""" start="00:06:01.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""and blocking the execution of the others.""" start="00:06:05.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""As an experiment, I logged the LibreJS output""" start="00:06:11.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""for about two weeks,""" start="00:06:13.880" video="mainVideo-web" id="subtitle"]]
[[!template text="""and during which, of all the web pages I loaded,""" start="00:06:15.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""23 domains have at least some LibreJS-compliant scripts.""" start="00:06:19.740" video="mainVideo-web" id="subtitle"]]
[[!template text="""That is not much, though I did use other means""" start="00:06:25.001" video="mainVideo-web" id="subtitle"]]
[[!template text="""to reduce the scenarios""" start="00:06:28.680" video="mainVideo-web" id="subtitle"]]
[[!template text="""where I need to load web pages with JavaScript in Firefox,""" start="00:06:30.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""like using a text browser like Lynx.""" start="00:06:35.400" video="mainVideo-web" id="subtitle"]]
[[!template text="""Then there's also NoScript, which is like LibreJS,""" start="00:06:40.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""but it blocks all scripts, whether free or non-free,
trivial or non-trivial.""" start="00:06:44.240" video="mainVideo-web" id="subtitle"]]
[[!template text="""So the problem with blocking is that""" start="00:06:49.500" video="mainVideo-web" id="subtitle"]]
[[!template text="""blocking with certain scripts and accepting others,""" start="00:06:54.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""there are like... I can think of two problems.""" start="00:06:57.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""One is that it does not help with Freedom 1,""" start="00:07:00.679" video="mainVideo-web" id="subtitle"]]
[[!template text="""which is the freedom to allow users to modify a program""" start="00:07:02.879" video="mainVideo-web" id="subtitle"]]
[[!template text="""and use it in place of the original program.""" start="00:07:07.960" video="mainVideo-web" id="subtitle"]]
[[!template text="""And also it does not help""" start="00:07:13.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""when the non-free JavaScript is mandatory""" start="00:07:15.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""for the functioning of the web page.""" start="00:07:18.860" video="mainVideo-web" id="subtitle"]]
[[!template text="""For example, some pages are blank""" start="00:07:20.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""when non-free JavaScript is not executed.""" start="00:07:22.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""So now let's move on to the substitution, the other method.""" start="00:07:27.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""Let's start with userscript.""" start="00:07:36.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""It is a script, it is a user-specified JavaScript""" start="00:07:38.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""injected to a web page.""" start="00:07:41.761" video="mainVideo-web" id="subtitle"]]
[[!template text="""A typical example of userscript tool is GreaseMonkey.""" start="00:07:43.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""Another idea is a proxy that replaces scripts in place,""" start="00:07:48.481" video="mainVideo-web" id="subtitle"]]
[[!template text="""that is, sending user-specified scripts""" start="00:07:53.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""as a response to requests for such scripts.""" start="00:07:55.919" video="mainVideo-web" id="subtitle"]]
[[!template text="""So one example would be Haketilo, however you pronounce it.""" start="00:08:00.900" video="mainVideo-web" id="subtitle"]]
[[!template text="""It's a tool that's built on top of mitmproxy.""" start="00:08:04.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""It is supposed to do this.""" start="00:08:09.620" video="mainVideo-web" id="subtitle"]]
[[!template text="""I haven't used GreaseMonkey nor Haketilo""" start="00:08:11.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""for these purposes yet,""" start="00:08:14.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""so I can't say much about these options.""" start="00:08:16.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""So then there are also free clients""" start="00:08:20.780" video="mainVideo-web" id="subtitle"]]
[[!template text="""which replace the whole frontend,""" start="00:08:24.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""instead of a script requested by web pages""" start="00:08:26.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""from the official web clients.""" start="00:08:30.661" video="mainVideo-web" id="subtitle"]]
[[!template text="""People often refer to them as alternative frontend.""" start="00:08:32.500" video="mainVideo-web" id="subtitle"]]
[[!template text="""YouTube is perhaps the best example""" start="00:08:37.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""as there are so many free clients,""" start="00:08:39.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""including Invidious for the web,""" start="00:08:41.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""youtube-dl and yt-dlp on the command line,""" start="00:08:43.622" video="mainVideo-web" id="subtitle"]]
[[!template text="""MPV and VLC as GUI desktop, LibreTube""" start="00:08:46.240" video="mainVideo-web" id="subtitle"]]
[[!template text="""and NewPipe for Android and so on.""" start="00:08:50.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""Youtube-dl and yt-dlp are especially versatile""" start="00:08:53.260" video="mainVideo-web" id="subtitle"]]
[[!template text="""as they work with many video and audio sites""" start="00:08:56.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""with extractors written in Python,""" start="00:08:59.460" video="mainVideo-web" id="subtitle"]]
[[!template text="""so people can add extractors like extensions.""" start="00:09:02.620" video="mainVideo-web" id="subtitle"]]
[[!template text="""A similar tool would be woob,""" start="00:09:06.300" video="mainVideo-web" id="subtitle"]]
[[!template text="""short for web outside of the browsers.""" start="00:09:09.422" video="mainVideo-web" id="subtitle"]]
[[!template text="""It is a command-line and GUI program""" start="00:09:12.740" video="mainVideo-web" id="subtitle"]]
[[!template text="""that interacts with many web services, even banks.""" start="00:09:16.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""And there are browser extensions""" start="00:09:23.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""that automatically redirect to these clients.""" start="00:09:25.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""For example, Redirector and Libredirect""" start="00:09:28.860" video="mainVideo-web" id="subtitle"]]
[[!template text="""redirect to the free web clients.""" start="00:09:31.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""One could use OpenWith, another extension,""" start="00:09:35.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""to redirect to free non-web clients,""" start="00:09:39.700" video="mainVideo-web" id="subtitle"]]
[[!template text="""for example by opening YouTube links with MPV.""" start="00:09:42.160" video="mainVideo-web" id="subtitle"]]

[[!template new="1" text="""Emacs solutions""" start="00:09:46.480" video="mainVideo-web" id="subtitle"]]

[[!template text="""Now let us move to Emacs-based solutions.""" start="00:09:46.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""They are based on the same ideas but using Emacs.""" start="00:09:51.000" video="mainVideo-web" id="subtitle"]]

[[!template new="1" text="""Free clients in Emacs""" start="00:09:54.600" video="mainVideo-web" id="subtitle"]]

[[!template text="""First, free clients in Emacs.""" start="00:09:54.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""Basically alternative frontends written in Elisp.""" start="00:09:57.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""There are several advantages.""" start="00:10:00.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""For example, integration with other Emacs tools,""" start="00:10:03.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""good for archiving, making use of Emacs libraries,""" start="00:10:06.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""extensibility, thanks to Emacs' own""" start="00:10:09.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""extensibility and customizability.""" start="00:10:12.489" video="mainVideo-web" id="subtitle"]]
[[!template text="""Examples include mastodon.el for mastodon,""" start="00:10:15.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""or mastorg for viewing and archiving toots with org,""" start="00:10:18.620" video="mainVideo-web" id="subtitle"]]
[[!template text="""sx for Stack Exchange, buildbot.el for buildbot, etc.""" start="00:10:22.680" video="mainVideo-web" id="subtitle"]]
[[!template text="""Here's an example of mastorg displaying""" start="00:10:28.900" video="mainVideo-web" id="subtitle"]]
[[!template text="""the hierarchy of a toot in org.""" start="00:10:31.901" video="mainVideo-web" id="subtitle"]]
[[!template text="""Just wait. Right.""" start="00:10:34.520" video="mainVideo-web" id="subtitle"]]
[[!template text="""So this is the toot itself, this is a first reply,""" start="00:10:39.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""this is a reply to the reply, and so on.""" start="00:10:44.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""And here is an example of""" start="00:10:48.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""opening a Stack Exchange link using sx.""" start="00:10:53.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""Let's check out the tag.""" start="00:11:05.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""So we can browse the Stack Exchange Emacs site
with ease.""" start="00:11:11.120" video="mainVideo-web" id="subtitle"]]
[[!template text="""The idea is quite simple.""" start="00:11:28.400" video="mainVideo-web" id="subtitle"]]
[[!template text="""Just use APIs to get data and display it in Emacs,""" start="00:11:31.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""or just to scrape, like requesting HTML and processing it.""" start="00:11:35.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""An example of scraping is hnreader,""" start="00:11:40.820" video="mainVideo-web" id="subtitle"]]
[[!template text="""which scrapes Hacker News web pages""" start="00:11:44.180" video="mainVideo-web" id="subtitle"]]
[[!template text="""and renders them in Org buffers.""" start="00:11:47.299" video="mainVideo-web" id="subtitle"]]
[[!template text="""Here's how hnreader fetches""" start="00:11:49.780" video="mainVideo-web" id="subtitle"]]
[[!template text="""and displays the Hacker News front page.""" start="00:11:52.380" video="mainVideo-web" id="subtitle"]]
[[!template text="""And one could go into the comments,""" start="00:11:58.520" video="mainVideo-web" id="subtitle"]]
[[!template text="""which shows a similar hierarchy to mastorg's output.""" start="00:12:04.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""And of course, there are limitations for this method,""" start="00:12:14.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""which is not limited to Emacs.""" start="00:12:19.001" video="mainVideo-web" id="subtitle"]]
[[!template text="""There are basically limitations""" start="00:12:22.540" video="mainVideo-web" id="subtitle"]]
[[!template text="""to any ad hoc bespoke clients,""" start="00:12:24.522" video="mainVideo-web" id="subtitle"]]
[[!template text="""which is catch-up games with remote server,""" start="00:12:28.420" video="mainVideo-web" id="subtitle"]]
[[!template text="""which may change the API interface endpoints""" start="00:12:31.520" video="mainVideo-web" id="subtitle"]]
[[!template text="""or even structure of the responses.""" start="00:12:34.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""This brings us to web browsers in Emacs.""" start="00:12:37.540" video="mainVideo-web" id="subtitle"]]

[[!template new="1" text="""Web browsers in Emacs""" start="00:12:43.021" video="mainVideo-web" id="subtitle"]]

[[!template text="""Web browsers are universal clients""" start="00:12:43.021" video="mainVideo-web" id="subtitle"]]
[[!template text="""because all sites support browsers.""" start="00:12:45.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""So in a world of no JavaScript,""" start="00:12:47.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""there will be no need to write bespoke clients.""" start="00:12:48.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""In such a world,""" start="00:12:52.740" video="mainVideo-web" id="subtitle"]]
[[!template text="""instead of using JavaScript code to fetch JSON,""" start="00:12:53.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""web developers make server do the heavy lifting""" start="00:12:56.740" video="mainVideo-web" id="subtitle"]]
[[!template text="""and just send the complete HTML over.""" start="00:13:00.120" video="mainVideo-web" id="subtitle"]]
[[!template text="""Okay, back to reality.""" start="00:13:02.860" video="mainVideo-web" id="subtitle"]]
[[!template text="""EWW, the default Emacs browser,""" start="00:13:05.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""is what people refer to as a text browser,""" start="00:13:07.660" video="mainVideo-web" id="subtitle"]]
[[!template text="""even though it is not text only and it supports images too.""" start="00:13:11.380" video="mainVideo-web" id="subtitle"]]
[[!template text="""It is a good solid browser that supports forms, etc.""" start="00:13:16.900" video="mainVideo-web" id="subtitle"]]
[[!template text="""The downside is that it does not support CSS,""" start="00:13:20.680" video="mainVideo-web" id="subtitle"]]
[[!template text="""so the formatting could be a bit ugly sometimes.""" start="00:13:24.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""There are some other browsers in Emacs too,""" start="00:13:28.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""like emacs-w3m, which is backed by w3m,""" start="00:13:30.120" video="mainVideo-web" id="subtitle"]]
[[!template text="""and Luwak, which is backed by Lynx.""" start="00:13:34.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""Sorry for the naming, by the way.""" start="00:13:36.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""They often consist of a backend""" start="00:13:39.100" video="mainVideo-web" id="subtitle"]]
[[!template text="""that fetches URL and parses HTML.""" start="00:13:41.520" video="mainVideo-web" id="subtitle"]]
[[!template text="""For example, the built-in URL package""" start="00:13:44.880" video="mainVideo-web" id="subtitle"]]
[[!template text="""and the libxml2 binding in Emacs are decent enough.""" start="00:13:47.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""And the frontend that renders the HTML,""" start="00:13:50.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""like shr or lynx, etc.""" start="00:13:53.189" video="mainVideo-web" id="subtitle"]]
[[!template text="""There is also an xwidget-webkit,""" start="00:13:56.699" video="mainVideo-web" id="subtitle"]]
[[!template text="""but this browser executes JavaScript,""" start="00:14:04.740" video="mainVideo-web" id="subtitle"]]
[[!template text="""so it does not really help in this case.""" start="00:14:07.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""Browser extensions on Emacs are effortless,""" start="00:14:10.540" video="mainVideo-web" id="subtitle"]]
[[!template text="""as they can be written as Emacs packages.""" start="00:14:14.240" video="mainVideo-web" id="subtitle"]]
[[!template text="""For example, one could easily write""" start="00:14:17.460" video="mainVideo-web" id="subtitle"]]
[[!template text="""Elisp scripts with similar functionalities""" start="00:14:19.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""to libredirect and openwith""" start="00:14:21.960" video="mainVideo-web" id="subtitle"]]
[[!template text="""to redirect links, to rewrite URLs,""" start="00:14:24.922" video="mainVideo-web" id="subtitle"]]
[[!template text="""or to open, say, a YouTube URL with MPV,""" start="00:14:30.181" video="mainVideo-web" id="subtitle"]]
[[!template text="""but with even more flexibility.""" start="00:14:37.061" video="mainVideo-web" id="subtitle"]]
[[!template text="""For example, here's how one could""" start="00:14:39.800" video="mainVideo-web" id="subtitle"]]
[[!template text="""transform a Zoom link to a dial-in number""" start="00:14:41.780" video="mainVideo-web" id="subtitle"]]
[[!template text="""so that it is easier to join a Zoom meeting""" start="00:14:44.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""without running non-free JavaScript.""" start="00:14:47.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""This might still be bad for privacy,""" start="00:14:50.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""but at least it's good for freedom.""" start="00:14:53.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""As mentioned before,""" start="00:14:58.699" video="mainVideo-web" id="subtitle"]]
[[!template text="""one shortcoming of these Emacs-based browsers,""" start="00:15:00.379" video="mainVideo-web" id="subtitle"]]
[[!template text="""Emacs web browsers, is no support for CSS,""" start="00:15:03.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""so the formatting could leave a lot to be desired.""" start="00:15:08.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""Maybe someone would write""" start="00:15:11.320" video="mainVideo-web" id="subtitle"]]
[[!template text="""an Emacs browser package backed by wkhtmltopdf,""" start="00:15:12.960" video="mainVideo-web" id="subtitle"]]
[[!template text="""which, when opening a URL,""" start="00:15:17.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""it calls wkhtmltopdf to convert the web page to PDF""" start="00:15:20.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""and opens in, say, pdf-view-mode of the pdf-tools,""" start="00:15:26.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""thus containing formatting,""" start="00:15:29.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""and all the URL clicks resolve to the same actions.""" start="00:15:31.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""Also, wkhtmltopdf contains a flag that disables JavaScript.""" start="00:15:34.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""Another idea would be to use Firefox""" start="00:15:43.300" video="mainVideo-web" id="subtitle"]]
[[!template text="""as a processor to fetch URLs.""" start="00:15:45.240" video="mainVideo-web" id="subtitle"]]
[[!template text="""Maybe it can be used to pass back the HTML""" start="00:15:50.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""after executing free JavaScript,""" start="00:15:54.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""say, if Firefox has LibreJS installed.""" start="00:15:56.520" video="mainVideo-web" id="subtitle"]]
[[!template text="""This requires Firefox to send back the DOM,""" start="00:16:01.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""which could be achieved using native messaging.""" start="00:16:05.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""More on that later.""" start="00:16:08.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""Alternatively, one could also write a Firefox extension""" start="00:16:09.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""that sends the DOM in an existing tab back to Emacs.""" start="00:16:14.240" video="mainVideo-web" id="subtitle"]]
[[!template text="""But thinking more about it,""" start="00:16:17.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""I don't think this is actually a useful idea,""" start="00:16:20.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""because most of the sites that work under LibreJS""" start="00:16:23.059" video="mainVideo-web" id="subtitle"]]
[[!template text="""also are useful when all JavaScript is blocked.""" start="00:16:27.139" video="mainVideo-web" id="subtitle"]]
[[!template text="""So, this means these sites are viewable""" start="00:16:34.420" video="mainVideo-web" id="subtitle"]]
[[!template text="""under EWW, Luwak, etc.""" start="00:16:37.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""And another issue is that""" start="00:16:42.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""this could also make running non-free JavaScript easier,""" start="00:16:43.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""which is harmful to user freedom.""" start="00:16:46.560" video="mainVideo-web" id="subtitle"]]

[[!template new="1" text="""emacs-web-server - overview""" start="00:16:52.380" video="mainVideo-web" id="subtitle"]]

[[!template text="""OK, let's move on to the idea""" start="00:16:52.380" video="mainVideo-web" id="subtitle"]]
[[!template text="""of running Emacs as a web server,""" start="00:16:54.240" video="mainVideo-web" id="subtitle"]]
[[!template text="""so that Emacs client packages are web apps""" start="00:16:55.680" video="mainVideo-web" id="subtitle"]]
[[!template text="""serving as alternative frontends.""" start="00:16:58.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""Why would we want to do this?""" start="00:17:00.320" video="mainVideo-web" id="subtitle"]]
[[!template text="""Well, as much as one wants to be always in Emacs,""" start="00:17:02.240" video="mainVideo-web" id="subtitle"]]
[[!template text="""it is not always feasible.""" start="00:17:06.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""For example, one may be on the go""" start="00:17:08.340" video="mainVideo-web" id="subtitle"]]
[[!template text="""and needs to look up something on the phone.""" start="00:17:10.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""On the other hand, Emacs client packages""" start="00:17:12.520" video="mainVideo-web" id="subtitle"]]
[[!template text="""are just alternative frontends""" start="00:17:14.880" video="mainVideo-web" id="subtitle"]]
[[!template text="""but written in Elisp and run in Emacs.""" start="00:17:16.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""With the help of emacs-web-server package,""" start="00:17:18.120" video="mainVideo-web" id="subtitle"]]
[[!template text="""we can access Emacs packages on the web.""" start="00:17:20.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""emacs-web-server package is not something new,""" start="00:17:23.580" video="mainVideo-web" id="subtitle"]]
[[!template text="""but seems to be underused in the community somehow.""" start="00:17:26.440" video="mainVideo-web" id="subtitle"]]

[[!template new="1" text="""emacs-web-server - hello emacs!""" start="00:17:30.380" video="mainVideo-web" id="subtitle"]]

[[!template text="""OK, let's start with a simple example called hello-emacs.""" start="00:17:30.380" video="mainVideo-web" id="subtitle"]]
[[!template text="""It is pretty straightforward.""" start="00:17:33.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""Just require the web server feature""" start="00:17:35.240" video="mainVideo-web" id="subtitle"]]
[[!template text="""and run ws-start to start a server process""" start="00:17:38.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""and send the string &quot;hello emacs&quot;""" start="00:17:41.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""to the process regardless of the request.""" start="00:17:43.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""As you can see, it is going to be available""" start="00:17:45.540" video="mainVideo-web" id="subtitle"]]
[[!template text="""at port 9000 of localhost.""" start="00:17:48.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""Let's try it out.""" start="00:17:51.319" video="mainVideo-web" id="subtitle"]]
[[!template text="""We need to first evaluate this code block.""" start="00:17:53.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""And it works.""" start="00:18:01.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""To stop a server, just run ws-stop on the web server object.""" start="00:18:03.940" video="mainVideo-web" id="subtitle"]]
[[!template text="""Let's evaluate.""" start="00:18:10.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""Yep, it stopped.""" start="00:18:14.960" video="mainVideo-web" id="subtitle"]]

[[!template new="1" text="""emacs-web-server - yolo""" start="00:18:17.580" video="mainVideo-web" id="subtitle"]]

[[!template text="""OK, now let's move on to something funny""" start="00:18:17.580" video="mainVideo-web" id="subtitle"]]
[[!template text="""that you should never run on the public web.""" start="00:18:20.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""I call it yolo.el.""" start="00:18:22.220" video="mainVideo-web" id="subtitle"]]
[[!template text="""It uses htmlize""" start="00:18:23.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""to make any Emacs buffer available on the web.""" start="00:18:25.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""Let's try it out.""" start="00:18:28.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""Just require the thing and start the server by yolo-start.""" start="00:18:29.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""And it's available at port 9999.""" start="00:18:33.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""By default, the root domain shows the splash screen""" start="00:18:38.120" video="mainVideo-web" id="subtitle"]]
[[!template text="""which needs to be available.""" start="00:18:41.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""Running display-splash-screen ensures that,""" start="00:18:42.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""but here I've already run it.""" start="00:18:47.219" video="mainVideo-web" id="subtitle"]]
[[!template text="""So let's have a look.""" start="00:18:48.939" video="mainVideo-web" id="subtitle"]]
[[!template text="""And here we have the splash screen.""" start="00:18:54.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""Emacs tutorial and such.""" start="00:18:56.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""Unfortunately, none of these links work,""" start="00:19:00.240" video="mainVideo-web" id="subtitle"]]
[[!template text="""which is something we will revisit later.""" start="00:19:05.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""So, to show an arbitrary buffer,""" start="00:19:10.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""just use the buffer name as a path.""" start="00:19:15.481" video="mainVideo-web" id="subtitle"]]
[[!template text="""For example, the slide has the buffer named web.org,""" start="00:19:20.081" video="mainVideo-web" id="subtitle"]]
[[!template text="""so we can display it.""" start="00:19:24.861" video="mainVideo-web" id="subtitle"]]
[[!template text="""Let's try something fancier,""" start="00:19:34.581" video="mainVideo-web" id="subtitle"]]
[[!template text="""like the man page of ffmpeg.""" start="00:19:36.941" video="mainVideo-web" id="subtitle"]]
[[!template text="""So this is the man page of ffmpeg.""" start="00:19:40.880" video="mainVideo-web" id="subtitle"]]
[[!template text="""And the buffer name is a bit more complicated.""" start="00:19:45.120" video="mainVideo-web" id="subtitle"]]
[[!template text="""I have the URL available here.""" start="00:19:48.520" video="mainVideo-web" id="subtitle"]]
[[!template text="""It's missing a star.""" start="00:19:59.140" video="mainVideo-web" id="subtitle"]]
[[!template text="""It's pretty neat if you ask me.""" start="00:20:05.980" video="mainVideo-web" id="subtitle"]]
[[!template text="""And, yeah, what else?""" start="00:20:12.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""Well, we can also browse EWW in Firefox.""" start="00:20:14.880" video="mainVideo-web" id="subtitle"]]
[[!template text="""For example, let's check out gnu.org,""" start="00:20:22.700" video="mainVideo-web" id="subtitle"]]
[[!template text="""and note that the buffer name is EWW with stars.""" start="00:20:30.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""So, ah, it works.""" start="00:20:39.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""And it has all the graphics even.""" start="00:20:41.979" video="mainVideo-web" id="subtitle"]]
[[!template text="""Now, how about we do it the other way around?""" start="00:20:50.900" video="mainVideo-web" id="subtitle"]]
[[!template text="""So we load the current slide web.org using this funny thing.""" start="00:20:55.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""And it works.""" start="00:21:10.780" video="mainVideo-web" id="subtitle"]]
[[!template text="""Not as nice as the Org buffer, though.""" start="00:21:14.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""Right, and now that gives me some funny idea.""" start="00:21:19.940" video="mainVideo-web" id="subtitle"]]
[[!template text="""So I'm a firm believer that memes are meant to be enjoyed""" start="00:21:27.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""in silence rather than read out loud.""" start="00:21:31.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""So I will jump straight to trying this idea,""" start="00:21:33.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""which is loading the EWW buffer URL with EWW itself.""" start="00:21:38.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""Loading, loading, loading.""" start="00:21:49.860" video="mainVideo-web" id="subtitle"]]
[[!template text="""Spoiler alert, it never loads.""" start="00:21:53.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""So that concludes the demo.""" start="00:21:59.100" video="mainVideo-web" id="subtitle"]]
[[!template text="""And so we can stop the server, web server, with `yolo-stop`.""" start="00:22:03.220" video="mainVideo-web" id="subtitle"]]
[[!template text="""So one could extend yolo to serve arbitrary Emacs commands,""" start="00:22:06.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""making it even more dangerous.""" start="00:22:13.400" video="mainVideo-web" id="subtitle"]]
[[!template text="""That is, for example, `localhost:9000/m-x/magit-status`""" start="00:22:15.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""would run `magit-status`""" start="00:22:26.119" video="mainVideo-web" id="subtitle"]]
[[!template text="""and show the magit-status buffer in the web browser.""" start="00:22:27.820" video="mainVideo-web" id="subtitle"]]
[[!template text="""Or localhost:9000/m-x/eww/""" start="00:22:34.500" video="mainVideo-web" id="subtitle"]]
[[!template text="""any arbitrary URL to browse arbitrary URL""" start="00:22:43.120" video="mainVideo-web" id="subtitle"]]
[[!template text="""with EWW inside of Firefox.""" start="00:22:46.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""It can serve as a way to block all JavaScript,""" start="00:22:50.820" video="mainVideo-web" id="subtitle"]]
[[!template text="""because EWW does not support JavaScript.""" start="00:22:53.880" video="mainVideo-web" id="subtitle"]]
[[!template text="""And enforce preferred colorscheme in Firefox,""" start="00:22:56.800" video="mainVideo-web" id="subtitle"]]
[[!template text="""since htmlize, as you have noticed,""" start="00:23:00.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""faithfully reflects the theme used in Emacs.""" start="00:23:02.840" video="mainVideo-web" id="subtitle"]]

[[!template new="1" text="""emacs-web-server - emacs web framework""" start="00:23:07.940" video="mainVideo-web" id="subtitle"]]

[[!template text="""Okay, so we know that yolo is unsafe""" start="00:23:07.940" video="mainVideo-web" id="subtitle"]]
[[!template text="""and needs to be refined.""" start="00:23:10.339" video="mainVideo-web" id="subtitle"]]
[[!template text="""In fact, we don't necessarily want""" start="00:23:11.540" video="mainVideo-web" id="subtitle"]]
[[!template text="""to run Emacs on a web browser.""" start="00:23:13.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""After all, a modern web browser is""" start="00:23:15.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""something one has to fight all the time""" start="00:23:17.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""and should be avoided whenever possible.""" start="00:23:19.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""We want to instead be able to access things""" start="00:23:21.601" video="mainVideo-web" id="subtitle"]]
[[!template text="""when forced to be in a web browser,""" start="00:23:24.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""in which case only the motivations""" start="00:23:26.460" video="mainVideo-web" id="subtitle"]]
[[!template text="""of an alternative frontend apply.""" start="00:23:28.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""Moreover, the ideal situation is an Emacs web framework,""" start="00:23:31.300" video="mainVideo-web" id="subtitle"]]
[[!template text="""a tool that automatically""" start="00:23:35.460" video="mainVideo-web" id="subtitle"]]
[[!template text="""transforms Emacs packages to web apps,""" start="00:23:36.800" video="mainVideo-web" id="subtitle"]]
[[!template text="""so that one does not need to write extra code""" start="00:23:39.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""to get a web app that does the same thing as the package.""" start="00:23:41.800" video="mainVideo-web" id="subtitle"]]
[[!template text="""We also need all links in the web pages to work.""" start="00:23:45.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""As noted before, the links on the yolo Emacs splash screen""" start="00:23:49.100" video="mainVideo-web" id="subtitle"]]
[[!template text="""do not work.""" start="00:23:52.400" video="mainVideo-web" id="subtitle"]]
[[!template text="""So here's a proof-of-concept example. It's called bom.el.""" start="00:23:53.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""It gets some weather forecast data""" start="00:23:58.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""from the Australian Bureau of Meteorology""" start="00:24:00.120" video="mainVideo-web" id="subtitle"]]
[[!template text="""and displays it in an org buffer.""" start="00:24:03.080" video="mainVideo-web" id="subtitle"]]
[[!template text="""So let's try it out. One could do `M-x bom`,""" start="00:24:05.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""which shows an org buffer with links to each state.""" start="00:24:09.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""So based in Melbourne, naturally,""" start="00:24:15.220" video="mainVideo-web" id="subtitle"]]
[[!template text="""I would like to find out the weather of Victoria.""" start="00:24:17.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""And yes, to execute this command. Wait, wait, wait. Right.""" start="00:24:21.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""And we are at a buffer that shows""" start="00:24:27.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""the weather forecast of the whole of Victoria""" start="00:24:33.460" video="mainVideo-web" id="subtitle"]]
[[!template text="""in the hierarchy. Note that this back button""" start="00:24:36.120" video="mainVideo-web" id="subtitle"]]
[[!template text="""takes you to the previous page.""" start="00:24:39.479" video="mainVideo-web" id="subtitle"]]
[[!template text="""So here are the regions of Victoria.""" start="00:24:46.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""I think Melbourne is in Central.""" start="00:24:47.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""And yeah, it shows""" start="00:24:53.800" video="mainVideo-web" id="subtitle"]]
[[!template text="""the seven-day weather forecast of Melbourne.""" start="00:24:54.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""You can also reach this page by running,""" start="00:24:57.260" video="mainVideo-web" id="subtitle"]]
[[!template text="""let's see, directly `M-x bom-state`.""" start="00:25:00.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""Vic.""" start="00:25:08.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""OK. So this works.""" start="00:25:13.960" video="mainVideo-web" id="subtitle"]]
[[!template text="""And this is bom as an Emacs package.""" start="00:25:18.400" video="mainVideo-web" id="subtitle"]]
[[!template text="""Now let's check out bom as a web app""" start="00:25:21.380" video="mainVideo-web" id="subtitle"]]
[[!template text="""transformed by Emacs web framework.""" start="00:25:23.981" video="mainVideo-web" id="subtitle"]]
[[!template text="""So start the web server with bom-start.""" start="00:25:28.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""And let's try it out. It's at 9000 again.""" start="00:25:33.020" video="mainVideo-web" id="subtitle"]]
[[!template text="""Oops. Invalid path. Oh, that's because""" start="00:25:39.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""it makes exactly one command to one path.""" start="00:25:42.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""So remember that we used the bom command""" start="00:25:46.120" video="mainVideo-web" id="subtitle"]]
[[!template text="""to show the landing page.""" start="00:25:49.301" video="mainVideo-web" id="subtitle"]]
[[!template text="""So here we need the bom in the path as well.""" start="00:25:50.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""And it shows the same landing page, except in HTML.""" start="00:25:54.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""Let's check out Victoria weather forecast as before.""" start="00:26:00.680" video="mainVideo-web" id="subtitle"]]
[[!template text="""And it shows an HTML converted from the org buffer""" start="00:26:07.260" video="mainVideo-web" id="subtitle"]]
[[!template text="""using ox export HTML, whatever.""" start="00:26:12.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""And you can see even the back button is here.""" start="00:26:17.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""That takes you to /bom.""" start="00:26:20.359" video="mainVideo-web" id="subtitle"]]
[[!template text="""So let's have a look at Melbourne. Here it is.""" start="00:26:26.220" video="mainVideo-web" id="subtitle"]]
[[!template text="""Hooray, it works.""" start="00:26:29.140" video="mainVideo-web" id="subtitle"]]
[[!template text="""So, yeah, as usual,""" start="00:26:31.380" video="mainVideo-web" id="subtitle"]]
[[!template text="""you can stop the web server with `M-x bom-stop`.""" start="00:26:33.960" video="mainVideo-web" id="subtitle"]]
[[!template text="""Right. And alternatively,""" start="00:26:40.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""it can also be deployed directly in terminal""" start="00:26:43.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""in a dedicated Emacs daemon.""" start="00:26:48.500" video="mainVideo-web" id="subtitle"]]
[[!template text="""So you can see that there's a one-one correspondence""" start="00:26:56.100" video="mainVideo-web" id="subtitle"]]
[[!template text="""between the Emacs package interface and the web interface.""" start="00:26:58.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""And that implies some restrictions to the Emacs package""" start="00:27:03.100" video="mainVideo-web" id="subtitle"]]
[[!template text="""for the Emacs web framework to be able to do its job. Right.""" start="00:27:06.040" video="mainVideo-web" id="subtitle"]]
[[!template text="""For example, the package needs to have an Org interface""" start="00:27:09.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""and the links that trigger other commands""" start="00:27:13.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""need to be in Elisp links""" start="00:27:15.520" video="mainVideo-web" id="subtitle"]]
[[!template text="""so that the Emacs web framework""" start="00:27:17.800" video="mainVideo-web" id="subtitle"]]
[[!template text="""can translate it to web server URL path.""" start="00:27:20.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""Note that Emacs web server framework is not a real package.""" start="00:27:24.800" video="mainVideo-web" id="subtitle"]]
[[!template text="""I wrote some functions in bom.el serving the purpose,""" start="00:27:28.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""and they should be separated out eventually""" start="00:27:33.340" video="mainVideo-web" id="subtitle"]]
[[!template text="""without much trouble.""" start="00:27:35.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""One could get weather forecast""" start="00:27:37.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""without running JavaScript anyway,""" start="00:27:40.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""which makes bom.el less important""" start="00:27:42.220" video="mainVideo-web" id="subtitle"]]
[[!template text="""as an alternative web client.""" start="00:27:45.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""Though it does provide, dare I say,""" start="00:27:48.320" video="mainVideo-web" id="subtitle"]]
[[!template text="""a clean and minimal interface""" start="00:27:50.520" video="mainVideo-web" id="subtitle"]]
[[!template text="""compared to common weather forecast web pages.""" start="00:27:52.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""Other more relevant use cases could be Mastodon,""" start="00:27:55.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""whose official web client requires JavaScript""" start="00:27:58.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""to display a post.""" start="00:28:01.320" video="mainVideo-web" id="subtitle"]]
[[!template text="""The mastorg package that shows an Org hierarchy of toots""" start="00:28:03.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""rooted as a given toot could be a low-hanging fruit.""" start="00:28:08.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""The limitation of Org interface requirements""" start="00:28:12.179" video="mainVideo-web" id="subtitle"]]
[[!template text="""can also be relaxed in further work,""" start="00:28:15.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""if one could extend Emacs web framework""" start="00:28:17.880" video="mainVideo-web" id="subtitle"]]
[[!template text="""to translate back and forth between Emacs widgets,""" start="00:28:21.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""say, including buttons and web page widgets,""" start="00:28:24.200" video="mainVideo-web" id="subtitle"]]
[[!template text="""including links.""" start="00:28:28.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""Another more far-fetched idea would be""" start="00:28:30.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""to translate to other types of interfaces,""" start="00:28:32.600" video="mainVideo-web" id="subtitle"]]
[[!template text="""like GNU/Linux or Android GUI.""" start="00:28:35.800" video="mainVideo-web" id="subtitle"]]
[[!template text="""How about animations? Say, M-x butterfly,""" start="00:28:44.020" video="mainVideo-web" id="subtitle"]]
[[!template text="""or even web games from Emacs games?""" start="00:28:47.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""Possibilities are unlimited in this, as always, in Emacs.""" start="00:28:54.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""I also noticed some limitations""" start="00:29:00.100" video="mainVideo-web" id="subtitle"]]
[[!template text="""when trying to actually host bom.el on the public web.""" start="00:29:03.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""Given the limited access to the Emacs server,""" start="00:29:07.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""I was comfortable enough to give bom.el a go""" start="00:29:13.540" video="mainVideo-web" id="subtitle"]]
[[!template text="""to serve it on the public web.""" start="00:29:16.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""However, I immediately stopped""" start="00:29:18.800" video="mainVideo-web" id="subtitle"]]
[[!template text="""after noticing how slow it is.""" start="00:29:20.560" video="mainVideo-web" id="subtitle"]]
[[!template text="""It can take more than 30 seconds""" start="00:29:22.880" video="mainVideo-web" id="subtitle"]]
[[!template text="""to load a page of weather forecast for a state.""" start="00:29:24.720" video="mainVideo-web" id="subtitle"]]
[[!template text="""I am also not sure how many simultaneous connections""" start="00:29:27.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""it can handle.""" start="00:29:31.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""In any case, I think the package emacs-web-server""" start="00:29:32.380" video="mainVideo-web" id="subtitle"]]
[[!template text="""could do with some performance enhancement.""" start="00:29:36.440" video="mainVideo-web" id="subtitle"]]

[[!template new="1" text="""Firefox with emacs for extensions""" start="00:29:40.420" video="mainVideo-web" id="subtitle"]]

[[!template text="""Right. Because of the time constraints,""" start="00:29:40.420" video="mainVideo-web" id="subtitle"]]
[[!template text="""I will briefly touch one final idea,""" start="00:29:44.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""which is to use Emacs as a Firefox browser extension.""" start="00:29:45.760" video="mainVideo-web" id="subtitle"]]
[[!template text="""We already have org-protocol,""" start="00:29:50.420" video="mainVideo-web" id="subtitle"]]
[[!template text="""which allows Firefox to communicate""" start="00:29:52.900" video="mainVideo-web" id="subtitle"]]
[[!template text="""with a running Emacs server""" start="00:29:54.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""by sending an org-protocol URL to the latter.""" start="00:29:55.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""It can be used not just for capturing or storing links,""" start="00:29:59.780" video="mainVideo-web" id="subtitle"]]
[[!template text="""but to execute arbitrary code on any component of the URL.""" start="00:30:03.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""However, it is fire and forget,""" start="00:30:10.120" video="mainVideo-web" id="subtitle"]]
[[!template text="""and Emacs cannot tell Firefox what to do.""" start="00:30:11.680" video="mainVideo-web" id="subtitle"]]
[[!template text="""There may be a length restriction, too.""" start="00:30:16.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""For example, Firefox may not be able to send back""" start="00:30:17.920" video="mainVideo-web" id="subtitle"]]
[[!template text="""the whole DOM.""" start="00:30:20.400" video="mainVideo-web" id="subtitle"]]
[[!template text="""This claim needs to be verified, though.""" start="00:30:22.420" video="mainVideo-web" id="subtitle"]]
[[!template text="""Native messaging is one solution to this problem.""" start="00:30:26.220" video="mainVideo-web" id="subtitle"]]
[[!template text="""It is a two-way communication channel""" start="00:30:30.020" video="mainVideo-web" id="subtitle"]]
[[!template text="""between a Firefox web extension and a local system process""" start="00:30:31.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""started by the web extension.""" start="00:30:35.320" video="mainVideo-web" id="subtitle"]]
[[!template text="""The process could be an Emacs server,""" start="00:30:37.840" video="mainVideo-web" id="subtitle"]]
[[!template text="""which would make Emacs effectively""" start="00:30:40.400" video="mainVideo-web" id="subtitle"]]
[[!template text="""a Firefox web browser extension.""" start="00:30:42.400" video="mainVideo-web" id="subtitle"]]
[[!template text="""In this case, Elisp would be the main extension language,""" start="00:30:48.680" video="mainVideo-web" id="subtitle"]]
[[!template text="""rather than JavaScript.""" start="00:30:52.000" video="mainVideo-web" id="subtitle"]]
[[!template text="""However, JavaScript is still needed at the Firefox end""" start="00:30:53.620" video="mainVideo-web" id="subtitle"]]
[[!template text="""of the communication channel.""" start="00:30:56.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""As a simple example of this idea,""" start="00:30:59.320" video="mainVideo-web" id="subtitle"]]
[[!template text="""Firefox could ask Emacs to redirect a URL""" start="00:31:01.160" video="mainVideo-web" id="subtitle"]]
[[!template text="""by removing tracking and using alternative frontend, etc.""" start="00:31:04.440" video="mainVideo-web" id="subtitle"]]
[[!template text="""However, I was not able to implement this""" start="00:31:08.320" video="mainVideo-web" id="subtitle"]]
[[!template text="""due to some tricky business""" start="00:31:12.480" video="mainVideo-web" id="subtitle"]]
[[!template text="""with enforcing synchronicity""" start="00:31:14.280" video="mainVideo-web" id="subtitle"]]
[[!template text="""that allows the web extension""" start="00:31:15.640" video="mainVideo-web" id="subtitle"]]
[[!template text="""to wait for responses from Emacs.""" start="00:31:17.120" video="mainVideo-web" id="subtitle"]]
[[!template text="""Some further work, I suppose.""" start="00:31:20.200" video="mainVideo-web" id="subtitle"]]

[[!template new="1" text="""Thank you""" start="00:31:25.360" video="mainVideo-web" id="subtitle"]]

[[!template text="""That concludes my talk.""" start="00:31:25.360" video="mainVideo-web" id="subtitle"]]
[[!template text="""Thank you for your attention.""" start="00:31:28.254" video="mainVideo-web" id="subtitle"]]



Captioner: ken

<a name="web-qanda-transcript"></a>
# Q&A transcript (unedited)

[[!template text="""[Speaker 0]: 2 seconds. And I think we are live.""" start="00:00:04.740" video="qanda-web" id="subtitle"]]
[[!template text="""Hi Yuchen, how are you doing?""" start="00:00:05.980" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: I'm gonna just walk off.""" start="00:00:08.720" video="qanda-web" id="subtitle"]]
[[!template text="""I'm not sure if I... Yeah,""" start="00:00:10.840" video="qanda-web" id="subtitle"]]
[[!template text="""I mean, brain not working well at this""" start="00:00:13.440" video="qanda-web" id="subtitle"]]
[[!template text="""moment. How about you?""" start="00:00:14.660" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: Well, mine is about to get fried because""" start="00:00:18.420" video="qanda-web" id="subtitle"]]
[[!template text="""EmacsConf is a very taxing process and I can""" start="00:00:21.040" video="qanda-web" id="subtitle"]]
[[!template text="""tell you we could have a race to know who's""" start="00:00:24.599" video="qanda-web" id="subtitle"]]
[[!template text="""more more tired right now between you and""" start="00:00:26.720" video="qanda-web" id="subtitle"]]
[[!template text="""myself but I guess we'll find out at the end""" start="00:00:29.480" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: All right, sounds good.""" start="00:00:32.080" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: of the Q&A. And thank you for...""" start="00:00:34.200" video="qanda-web" id="subtitle"]]
[[!template text="""How late or how early I should say is it for""" start="00:00:37.760" video="qanda-web" id="subtitle"]]
[[!template text="""you right now? It should be like 6am or""" start="00:00:39.480" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: Thanks. It's 7.45 but I normally get up at""" start="00:00:43.860" video="qanda-web" id="subtitle"]]
[[!template text="""like 8.30 or something.""" start="00:00:45.020" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: something? Right, okay.""" start="00:00:46.560" video="qanda-web" id="subtitle"]]
[[!template text="""Well, anyway, thank you for the sacrifice""" start="00:00:48.380" video="qanda-web" id="subtitle"]]
[[!template text="""just to answer some of the questions.""" start="00:00:50.200" video="qanda-web" id="subtitle"]]
[[!template text="""All right, so I'll be displaying the""" start="00:00:56.160" video="qanda-web" id="subtitle"]]
[[!template text="""questions. I'll be, let me just maximize this""" start="00:00:59.180" video="qanda-web" id="subtitle"]]
[[!template text="""on the stream so that people can read""" start="00:01:01.440" video="qanda-web" id="subtitle"]]
[[!template text="""everything on my screen.""" start="00:01:02.280" video="qanda-web" id="subtitle"]]
[[!template text="""So what I'm going to do,""" start="00:01:03.400" video="qanda-web" id="subtitle"]]
[[!template text="""Yuchen, as usual, I'm going to start reading""" start="00:01:05.340" video="qanda-web" id="subtitle"]]
[[!template text="""the questions on the pad.""" start="00:01:06.540" video="qanda-web" id="subtitle"]]
[[!template text="""I'm going to ask Sasha to open the Q&A.""" start="00:01:12.160" video="qanda-web" id="subtitle"]]
[[!template text="""Yes, it's already open.""" start="00:01:13.620" video="qanda-web" id="subtitle"]]
[[!template text="""Cool. So if you want to join us,""" start="00:01:15.280" video="qanda-web" id="subtitle"]]
[[!template text="""people, Feel free to click on the link on the""" start="00:01:19.360" video="qanda-web" id="subtitle"]]
[[!template text="""talk or on IRC to join us on BBB and to ask""" start="00:01:21.820" video="qanda-web" id="subtitle"]]
[[!template text="""your questions. Otherwise just leave them on""" start="00:01:23.440" video="qanda-web" id="subtitle"]]
[[!template text="""the pad. Alright, Yuchen,""" start="00:01:24.320" video="qanda-web" id="subtitle"]]
[[!template text="""starting with the first question.""" start="00:01:25.440" video="qanda-web" id="subtitle"]]
[[!template text="""I like the idea of using org-mode to display""" start="00:01:28.260" video="qanda-web" id="subtitle"]]
[[!template text="""data from the web. Are there many different""" start="00:01:30.300" video="qanda-web" id="subtitle"]]
[[!template text="""packages that do not, I assume.""" start="00:01:33.220" video="qanda-web" id="subtitle"]]
[[!template text="""I'm new to Emacs, so maybe this is obvious to""" start="00:01:35.560" video="qanda-web" id="subtitle"]]
[[!template text="""everyone else.""" start="00:01:36.040" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: Yeah, I think so. I mean...""" start="00:01:43.860" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: Yeah, I think it's a little complicated to""" start="00:01:49.240" video="qanda-web" id="subtitle"]]
[[!template text="""specify what is it to display data from the""" start="00:01:51.480" video="qanda-web" id="subtitle"]]
[[!template text="""web. Just reading it like this,""" start="00:01:53.360" video="qanda-web" id="subtitle"]]
[[!template text="""I'm reminded of Adam, Arthur Pappa,""" start="00:01:55.900" video="qanda-web" id="subtitle"]]
[[!template text="""I mean, Code All Capture Web,""" start="00:01:58.260" video="qanda-web" id="subtitle"]]
[[!template text="""which technically captures the web and allows""" start="00:02:00.860" video="qanda-web" id="subtitle"]]
[[!template text="""you to embed it in the page,""" start="00:02:02.120" video="qanda-web" id="subtitle"]]
[[!template text="""but is it really displaying data from the""" start="00:02:04.280" video="qanda-web" id="subtitle"]]
[[!template text="""web? Are we implying live transmission?""" start="00:02:06.340" video="qanda-web" id="subtitle"]]
[[!template text="""Do you see what I'm talking about?""" start="00:02:07.720" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: Yeah, I suspect the question is asking,""" start="00:02:10.680" video="qanda-web" id="subtitle"]]
[[!template text="""like, having Emacs as a client that's sort of""" start="00:02:17.040" video="qanda-web" id="subtitle"]]
[[!template text="""getting data from the web and then displays""" start="00:02:19.740" video="qanda-web" id="subtitle"]]
[[!template text="""in Emacs, like using API or using web script.""" start="00:02:25.120" video="qanda-web" id="subtitle"]]
[[!template text="""So yeah, like the hreader package or a few""" start="00:02:35.220" video="qanda-web" id="subtitle"]]
[[!template text="""packages mentioned in my talk.""" start="00:02:37.580" video="qanda-web" id="subtitle"]]
[[!template text="""Yeah, that's a good question.""" start="00:02:39.920" video="qanda-web" id="subtitle"]]
[[!template text="""I mean, I really don't know how many.""" start="00:02:46.220" video="qanda-web" id="subtitle"]]
[[!template text="""So from my experience,""" start="00:02:48.060" video="qanda-web" id="subtitle"]]
[[!template text="""maybe I use like 10, less than 10 packages""" start="00:02:55.960" video="qanda-web" id="subtitle"]]
[[!template text="""that do these things. And among these""" start="00:03:01.220" video="qanda-web" id="subtitle"]]
[[!template text="""packages, maybe it's half of them are org,""" start="00:03:03.840" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: So you mean half of them are org-based?""" start="00:03:09.480" video="qanda-web" id="subtitle"]]
[[!template text="""Is that what you said?""" start="00:03:10.840" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: half of them don't. Yeah,""" start="00:03:11.840" video="qanda-web" id="subtitle"]]
[[!template text="""but that's just based on the packages I use.""" start="00:03:16.920" video="qanda-web" id="subtitle"]]
[[!template text="""I haven't done a survey about this.""" start="00:03:22.440" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: I think it's okay, you don't need to have all""" start="00:03:25.520" video="qanda-web" id="subtitle"]]
[[!template text="""the answers. I mean, you already demonstrate""" start="00:03:26.880" video="qanda-web" id="subtitle"]]
[[!template text="""a lot of competence and you talk about all""" start="00:03:29.380" video="qanda-web" id="subtitle"]]
[[!template text="""the things you approach with your particular""" start="00:03:31.100" video="qanda-web" id="subtitle"]]
[[!template text="""setup, So you don't need to have all the""" start="00:03:33.040" video="qanda-web" id="subtitle"]]
[[!template text="""answers. Okay. All right,""" start="00:03:36.040" video="qanda-web" id="subtitle"]]
[[!template text="""moving on to the next question.""" start="00:03:37.160" video="qanda-web" id="subtitle"]]
[[!template text="""Have you tried EAF, i.e.""" start="00:03:39.340" video="qanda-web" id="subtitle"]]
[[!template text="""The Emacs application framework and its""" start="00:03:41.680" video="qanda-web" id="subtitle"]]
[[!template text="""browser? If yes, what is your opinion about""" start="00:03:43.940" video="qanda-web" id="subtitle"]]
[[!template text="""it?""" start="00:03:44.120" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: Oh, I haven't tried it.""" start="00:03:47.520" video="qanda-web" id="subtitle"]]
[[!template text="""I try to remember why I haven't tried it.""" start="00:03:53.760" video="qanda-web" id="subtitle"]]
[[!template text="""It has a browser. I assume the browser""" start="00:04:03.520" video="qanda-web" id="subtitle"]]
[[!template text="""executes JavaScript by default.""" start="00:04:06.840" video="qanda-web" id="subtitle"]]
[[!template text="""I have to check. Emacs.daf""" start="00:04:12.320" video="qanda-web" id="subtitle"]]
[[!template text="""slash daf browser.""" start="00:04:15.820" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: It's also OK if you want to have a look later""" start="00:04:25.520" video="qanda-web" id="subtitle"]]
[[!template text="""and you know whenever you want to report to""" start="00:04:27.380" video="qanda-web" id="subtitle"]]
[[!template text="""the pad you know you write a little blurb""" start="00:04:28.940" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: Yeah sure yeah so yeah I know about EAF but I""" start="00:04:34.700" video="qanda-web" id="subtitle"]]
[[!template text="""haven't tried it.""" start="00:04:35.460" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: about it. Okay well that's already an answer""" start="00:04:38.060" video="qanda-web" id="subtitle"]]
[[!template text="""that's cool. We're gonna move on to a""" start="00:04:41.400" video="qanda-web" id="subtitle"]]
[[!template text="""question that is a little bit off topic,""" start="00:04:42.720" video="qanda-web" id="subtitle"]]
[[!template text="""but I've also been interested about your""" start="00:04:44.700" video="qanda-web" id="subtitle"]]
[[!template text="""nickname on IRC. This is not really relevant""" start="00:04:47.420" video="qanda-web" id="subtitle"]]
[[!template text="""to the talk, quoting the question,""" start="00:04:48.900" video="qanda-web" id="subtitle"]]
[[!template text="""but I'm curious about your nickname.""" start="00:04:50.400" video="qanda-web" id="subtitle"]]
[[!template text="""You have some connection to Norway.""" start="00:04:52.020" video="qanda-web" id="subtitle"]]
[[!template text="""Your nick indicates an interest in the""" start="00:04:54.480" video="qanda-web" id="subtitle"]]
[[!template text="""architectural style inspired by the""" start="00:04:56.040" video="qanda-web" id="subtitle"]]
[[!template text="""decoration on Viking ships that was popular""" start="00:04:58.280" video="qanda-web" id="subtitle"]]
[[!template text="""in the early 20th century because""" start="00:05:00.460" video="qanda-web" id="subtitle"]]
[[!template text="""Dragonsteel, I assume in Norwegian,""" start="00:05:01.880" video="qanda-web" id="subtitle"]]
[[!template text="""is Dragon style. Are you familiar with this?""" start="00:05:04.860" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: Yeah, it's just my favorite architecture""" start="00:05:10.760" video="qanda-web" id="subtitle"]]
[[!template text="""style, I think. I mean,""" start="00:05:15.560" video="qanda-web" id="subtitle"]]
[[!template text="""I lived in Sweden for like 2,""" start="00:05:19.040" video="qanda-web" id="subtitle"]]
[[!template text="""1 half years and yeah I went to Norway once""" start="00:05:25.900" video="qanda-web" id="subtitle"]]
[[!template text="""and I saw like this church in Lofoten Island,""" start="00:05:32.520" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 0]: was amazing. In Luton Island,""" start="00:05:36.766" video="qanda-web" id="subtitle"]]
[[!template text="""on Luton Island. Right.""" start="00:05:36.820" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: on Lofoten Island. Yeah it Yeah,""" start="00:05:36.833" video="qanda-web" id="subtitle"]]
[[!template text="""it was amazing. So, yeah,""" start="00:05:40.280" video="qanda-web" id="subtitle"]]
[[!template text="""that's exactly why I chose that as my""" start="00:05:43.780" video="qanda-web" id="subtitle"]]
[[!template text="""nickname, because it's my favorite""" start="00:05:46.520" video="qanda-web" id="subtitle"]]
[[!template text="""architecture style.""" start="00:05:47.540" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: Okay, well, that was a very astute remark by""" start="00:05:51.940" video="qanda-web" id="subtitle"]]
[[!template text="""the viewers, so I hope you feel validated in""" start="00:05:54.760" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 0]: assumptions. Moving on""" start="00:05:58.480" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: your to another question.""" start="00:05:58.980" video="qanda-web" id="subtitle"]]
[[!template text="""Yuchen, do you have any thoughts about Nixed,""" start="00:06:01.960" video="qanda-web" id="subtitle"]]
[[!template text="""about its name, its approach,""" start="00:06:03.880" video="qanda-web" id="subtitle"]]
[[!template text="""its relevance? About Nixed,""" start="00:06:08.560" video="qanda-web" id="subtitle"]]
[[!template text="""the browser, N-Y-X-T. Oh,""" start="00:06:11.500" video="qanda-web" id="subtitle"]]
[[!template text="""Nixed.""" start="00:06:11.720" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: About what? Yeah, I have tried it.""" start="00:06:17.220" video="qanda-web" id="subtitle"]]
[[!template text="""Well, I mean, it's not Emacs.""" start="00:06:21.360" video="qanda-web" id="subtitle"]]
[[!template text="""It's kind of similar. I think it tries to do""" start="00:06:26.140" video="qanda-web" id="subtitle"]]
[[!template text="""something similar to Emacs,""" start="00:06:27.440" video="qanda-web" id="subtitle"]]
[[!template text="""but The problem with Nix is that very early""" start="00:06:33.860" video="qanda-web" id="subtitle"]]
[[!template text="""on I encountered an issue with keybinding.""" start="00:06:37.180" video="qanda-web" id="subtitle"]]
[[!template text="""So the first thing I want to do is to make""" start="00:06:43.040" video="qanda-web" id="subtitle"]]
[[!template text="""all its keybindings emax-y.""" start="00:06:44.300" video="qanda-web" id="subtitle"]]
[[!template text="""So that's obviously...""" start="00:06:46.920" video="qanda-web" id="subtitle"]]
[[!template text="""So what was the problem?""" start="00:06:51.200" video="qanda-web" id="subtitle"]]
[[!template text="""So yeah, I couldn't even do that.""" start="00:06:53.040" video="qanda-web" id="subtitle"]]
[[!template text="""I thought, I was expecting that it could...""" start="00:06:56.120" video="qanda-web" id="subtitle"]]
[[!template text="""There shouldn't be any issues with setting up""" start="00:07:02.660" video="qanda-web" id="subtitle"]]
[[!template text="""whatever key binding you want.""" start="00:07:03.960" video="qanda-web" id="subtitle"]]
[[!template text="""So I, the, the issue was that when I tried to""" start="00:07:08.680" video="qanda-web" id="subtitle"]]
[[!template text="""do when I tried to bind Ctrl S Ctrl R to the""" start="00:07:15.400" video="qanda-web" id="subtitle"]]
[[!template text="""prompt going up and down,""" start="00:07:17.380" video="qanda-web" id="subtitle"]]
[[!template text="""so I use I was I complete and I'm used to""" start="00:07:22.900" video="qanda-web" id="subtitle"]]
[[!template text="""like the control S and control R to go,""" start="00:07:26.760" video="qanda-web" id="subtitle"]]
[[!template text="""to cycle through the selections.""" start="00:07:28.980" video="qanda-web" id="subtitle"]]
[[!template text="""And so I want it the same in next in its""" start="00:07:35.560" video="qanda-web" id="subtitle"]]
[[!template text="""prompt like when, for example,""" start="00:07:38.460" video="qanda-web" id="subtitle"]]
[[!template text="""typing a URL and get completion from history.""" start="00:07:43.620" video="qanda-web" id="subtitle"]]
[[!template text="""But it has a conflict with the...""" start="00:07:48.900" video="qanda-web" id="subtitle"]]
[[!template text="""And also, I try to bind the hint.""" start="00:07:55.680" video="qanda-web" id="subtitle"]]
[[!template text="""So when I want to follow a link,""" start="00:08:00.440" video="qanda-web" id="subtitle"]]
[[!template text="""So I press a hint key and then like all these""" start="00:08:05.800" video="qanda-web" id="subtitle"]]
[[!template text="""links are highlighted with like little""" start="00:08:10.120" video="qanda-web" id="subtitle"]]
[[!template text="""letters that I can like choose which 1 I want""" start="00:08:13.660" video="qanda-web" id="subtitle"]]
[[!template text="""which link I want to follow.""" start="00:08:14.820" video="qanda-web" id="subtitle"]]
[[!template text="""So I try to bind that 1 to J sort of like""" start="00:08:20.140" video="qanda-web" id="subtitle"]]
[[!template text="""Control C, Control J, or mode.""" start="00:08:23.560" video="qanda-web" id="subtitle"]]
[[!template text="""But apparently there's a conflict here.""" start="00:08:28.780" video="qanda-web" id="subtitle"]]
[[!template text="""So when I do both these prompt mode binding""" start="00:08:33.320" video="qanda-web" id="subtitle"]]
[[!template text="""and the document mode binding,""" start="00:08:36.260" video="qanda-web" id="subtitle"]]
[[!template text="""Yeah, the prompt no longer works.""" start="00:08:39.960" video="qanda-web" id="subtitle"]]
[[!template text="""And I reported the bug to Nixt.""" start="00:08:43.840" video="qanda-web" id="subtitle"]]
[[!template text="""And yeah, and there was response but there""" start="00:08:50.500" video="qanda-web" id="subtitle"]]
[[!template text="""are so many bugs there,""" start="00:08:52.580" video="qanda-web" id="subtitle"]]
[[!template text="""and I don't think that bug is very high""" start="00:08:55.640" video="qanda-web" id="subtitle"]]
[[!template text="""priority. So yeah, I basically stopped trying""" start="00:09:00.540" video="qanda-web" id="subtitle"]]
[[!template text="""that because key mining is very important to""" start="00:09:03.500" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: Right, but, sorry, please finish.""" start="00:09:07.600" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: me. Yeah, so I mean, yeah,""" start="00:09:15.620" video="qanda-web" id="subtitle"]]
[[!template text="""without key bindings I can't like,""" start="00:09:17.320" video="qanda-web" id="subtitle"]]
[[!template text="""I won't. So, okay, I feel this is a very""" start="00:09:23.940" video="qanda-web" id="subtitle"]]
[[!template text="""basic functionality. I'm kind of reluctant to""" start="00:09:29.280" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: Without key bindings, they are.""" start="00:09:31.220" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: continue trying what These are pieces.""" start="00:09:32.020" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: It reminds me of 2 points.""" start="00:09:34.200" video="qanda-web" id="subtitle"]]
[[!template text="""So yesterday with Stefan we were talking""" start="00:09:35.840" video="qanda-web" id="subtitle"]]
[[!template text="""about sane defaults and when he was sleeping""" start="00:09:37.540" video="qanda-web" id="subtitle"]]
[[!template text="""today we talked about it again with a""" start="00:09:39.440" video="qanda-web" id="subtitle"]]
[[!template text="""speaker. We did the mentor talk.""" start="00:09:41.400" video="qanda-web" id="subtitle"]]
[[!template text="""Feel free to re-watch it afterwards.""" start="00:09:43.020" video="qanda-web" id="subtitle"]]
[[!template text="""But it's funny how, you know,""" start="00:09:48.320" video="qanda-web" id="subtitle"]]
[[!template text="""regardless of how big the package actually""" start="00:09:50.920" video="qanda-web" id="subtitle"]]
[[!template text="""is, they always provide some kind of sane""" start="00:09:54.520" video="qanda-web" id="subtitle"]]
[[!template text="""default and with Nixed,""" start="00:09:55.640" video="qanda-web" id="subtitle"]]
[[!template text="""obviously, it's built with a Vim mentality""" start="00:09:58.620" video="qanda-web" id="subtitle"]]
[[!template text="""and modality of key bindings.""" start="00:10:02.020" video="qanda-web" id="subtitle"]]
[[!template text="""And for us, we are more used to the Emacs way""" start="00:10:05.860" video="qanda-web" id="subtitle"]]
[[!template text="""of doing things. It's a complete blocker.""" start="00:10:08.040" video="qanda-web" id="subtitle"]]
[[!template text="""No matter how great the pieces of""" start="00:10:10.320" video="qanda-web" id="subtitle"]]
[[!template text="""functionality behind Nixed are,""" start="00:10:12.280" video="qanda-web" id="subtitle"]]
[[!template text="""just the fact that UX-wise we cannot get into""" start="00:10:15.060" video="qanda-web" id="subtitle"]]
[[!template text="""it or we cannot have it behave nicely with""" start="00:10:18.220" video="qanda-web" id="subtitle"]]
[[!template text="""what we do. It's a massive block that is""" start="00:10:20.280" video="qanda-web" id="subtitle"]]
[[!template text="""preventing appropriation of such tools.""" start="00:10:22.040" video="qanda-web" id="subtitle"]]
[[!template text="""So it might seem very basic to bounce a""" start="00:10:25.940" video="qanda-web" id="subtitle"]]
[[!template text="""package at the level of key bindings but""" start="00:10:28.300" video="qanda-web" id="subtitle"]]
[[!template text="""that's what we all do.""" start="00:10:29.620" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: Yeah, I totally agree.""" start="00:10:32.800" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: Right, if I can just interrupt,""" start="00:10:36.180" video="qanda-web" id="subtitle"]]
[[!template text="""we have about 2 more minutes of questions and""" start="00:10:38.520" video="qanda-web" id="subtitle"]]
[[!template text="""I see people are writing more questions.""" start="00:10:40.940" video="qanda-web" id="subtitle"]]
[[!template text="""Did you want to add something,""" start="00:10:42.180" video="qanda-web" id="subtitle"]]
[[!template text="""Yucheng? On what we're saying?""" start="00:10:43.780" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: No, no, no, Let's continue.""" start="00:10:47.620" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: had plenty of time. Okay,""" start="00:10:51.340" video="qanda-web" id="subtitle"]]
[[!template text="""I'm going to ask you to be quick about this""" start="00:10:53.100" video="qanda-web" id="subtitle"]]
[[!template text="""1. I'm going to read the question,""" start="00:10:53.860" video="qanda-web" id="subtitle"]]
[[!template text="""which is slightly long,""" start="00:10:54.620" video="qanda-web" id="subtitle"]]
[[!template text="""and you're going to have about 30 seconds to""" start="00:10:56.320" video="qanda-web" id="subtitle"]]
[[!template text="""answer it. Do you feel capable of this?""" start="00:10:57.720" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: I thought we Yeah, let's try it.""" start="00:10:59.860" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: Let's try it. At least try it.""" start="00:11:02.860" video="qanda-web" id="subtitle"]]
[[!template text="""Okay, so quoting, I find the JavaScript trap""" start="00:11:05.208" video="qanda-web" id="subtitle"]]
[[!template text="""almost impossible to avoid since I like to""" start="00:11:06.680" video="qanda-web" id="subtitle"]]
[[!template text="""buy used stuff online and use my online bank.""" start="00:11:10.360" video="qanda-web" id="subtitle"]]
[[!template text="""How do you deal with a JavaScript trap?""" start="00:11:13.140" video="qanda-web" id="subtitle"]]
[[!template text="""I use NoScript and compromise on a few things""" start="00:11:15.400" video="qanda-web" id="subtitle"]]
[[!template text="""I really feel I cannot live without.""" start="00:11:16.760" video="qanda-web" id="subtitle"]]
[[!template text="""EWW is nice for a lot of things,""" start="00:11:19.080" video="qanda-web" id="subtitle"]]
[[!template text="""especially with R for less noise,""" start="00:11:21.260" video="qanda-web" id="subtitle"]]
[[!template text="""but I need Firefox for those GS and trapped""" start="00:11:23.760" video="qanda-web" id="subtitle"]]
[[!template text="""pages. So do you have a quick answer to this?""" start="00:11:25.760" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: Yeah, I don't have a good answer,""" start="00:11:29.500" video="qanda-web" id="subtitle"]]
[[!template text="""but I have a quick answer.""" start="00:11:30.640" video="qanda-web" id="subtitle"]]
[[!template text="""So I use VPN and like a more,""" start="00:11:38.140" video="qanda-web" id="subtitle"]]
[[!template text="""what do you call it, move out the Swedish VPN""" start="00:11:41.680" video="qanda-web" id="subtitle"]]
[[!template text="""browser, move out browser.""" start="00:11:43.480" video="qanda-web" id="subtitle"]]
[[!template text="""Yeah, so I unfortunately I have to use""" start="00:11:48.960" video="qanda-web" id="subtitle"]]
[[!template text="""JavaScript in these cases as well,""" start="00:11:50.660" video="qanda-web" id="subtitle"]]
[[!template text="""but I try to minimize the use of these""" start="00:11:53.800" video="qanda-web" id="subtitle"]]
[[!template text="""things.""" start="00:11:54.020" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: How long do you think it will take for us to""" start="00:11:56.920" video="qanda-web" id="subtitle"]]
[[!template text="""save the world with Emacs,""" start="00:11:58.140" video="qanda-web" id="subtitle"]]
[[!template text="""or save the web at least?""" start="00:11:59.340" video="qanda-web" id="subtitle"]]
[[!template text="""5 years, 10 years, maybe a little less than""" start="00:12:01.360" video="qanda-web" id="subtitle"]]
[[!template text="""this?""" start="00:12:01.560" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: Well I think it's, unfortunately it's""" start="00:12:06.600" video="qanda-web" id="subtitle"]]
[[!template text="""probably independent of Emacs,""" start="00:12:08.300" video="qanda-web" id="subtitle"]]
[[!template text="""like it will only be saved when,""" start="00:12:12.180" video="qanda-web" id="subtitle"]]
[[!template text="""like it's saved on like the normal,""" start="00:12:14.860" video="qanda-web" id="subtitle"]]
[[!template text="""the more popular browsers like Firefox.""" start="00:12:18.960" video="qanda-web" id="subtitle"]]
[[!template text="""I have no clue how long it will take for,""" start="00:12:23.680" video="qanda-web" id="subtitle"]]
[[!template text="""I don't know, for example,""" start="00:12:25.120" video="qanda-web" id="subtitle"]]
[[!template text="""Tala to pick up so that you can buy things""" start="00:12:28.660" video="qanda-web" id="subtitle"]]
[[!template text="""without running JavaScript.""" start="00:12:30.020" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: Right. Well, I guess we'll have to cross our""" start="00:12:33.220" video="qanda-web" id="subtitle"]]
[[!template text="""fingers then for Firefox to save the world.""" start="00:12:35.380" video="qanda-web" id="subtitle"]]
[[!template text="""All right Yuchen, we're about out of time,""" start="00:12:37.260" video="qanda-web" id="subtitle"]]
[[!template text="""we're moving on to the next talk in 20""" start="00:12:38.800" video="qanda-web" id="subtitle"]]
[[!template text="""seconds. Thank you so much for your""" start="00:12:40.200" video="qanda-web" id="subtitle"]]
[[!template text="""presentation and for waking up early and""" start="00:12:41.940" video="qanda-web" id="subtitle"]]
[[!template text="""answering the question,""" start="00:12:42.540" video="qanda-web" id="subtitle"]]
[[!template text="""and I can tell you, you were very alert and""" start="00:12:44.820" video="qanda-web" id="subtitle"]]
[[!template text="""definitely more energetic than I was.""" start="00:12:47.020" video="qanda-web" id="subtitle"]]
[[!template text="""All right, see you later.""" start="00:12:52.600" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 1]: Thank you. See you.""" start="00:12:53.940" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 2]: Bye. And we go to the next talk right now.""" start="00:12:58.400" video="qanda-web" id="subtitle"]]
[[!template text="""[Speaker 0]: You are currently""" start="00:13:02.620" video="qanda-web" id="subtitle"]]
[[!template text="""you""" start="00:13:15.260" video="qanda-web" id="subtitle"]]

Questions or comments? Please e-mail [id@ypei.org](mailto:id@ypei.org?subject=Comment%20for%20EmacsConf%202023%20web%3A%20Emacs%20saves%20the%20Web%20%28maybe%29)


<!-- End of emacsconf-publish-after-page -->