<!-- 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=""""This page requires JavaScript and cookies to continue,"""" 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 "hello emacs"""" 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 -->