summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main.vtt1354
-rw-r--r--2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main.vtt792
2 files changed, 2146 insertions, 0 deletions
diff --git a/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main.vtt b/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main.vtt
new file mode 100644
index 00000000..e2bd489c
--- /dev/null
+++ b/2022/captions/emacsconf-2022-haskell--haskell-code-exploration-with-emacs--yuchen-pei--main.vtt
@@ -0,0 +1,1354 @@
+WEBVTT captioned by anush
+
+00:00.000 --> 00:03.499
+Today, I will talk about Haskell code exploration for Emacs.
+
+00:03.500 --> 00:06.499
+What is Haskell? It is a purely functional language.
+
+00:06.500 --> 00:09.499
+For example, every value in Haskell is immutable.
+
+00:09.500 --> 00:12.999
+And it is the main compiler of Haskell, GHC.
+
+00:13.000 --> 00:15.999
+It provides API for the whole compilation pipeline.
+
+00:16.000 --> 00:00:18.324
+For example, the tools mentioned in this talk,
+
+00:00:18.424 --> 00:00:19.999
+including hcel and haddorg,
+
+00:20.000 --> 00:24.499
+they use, they heavily utilize the GHC front-end API
+
+00:24.500 --> 00:00:26.644
+for parsing and understanding
+
+00:00:26.744 --> 00:00:29.499
+the identifiers in Haskell source files.
+
+00:29.500 --> 00:00:31.444
+Roughly speaking,
+
+00:00:31.544 --> 00:00:34.564
+a Haskell program consists of several parts.
+
+00:00:34.664 --> 00:00:36.964
+it begins with some front matters, including,
+
+00:00:37.064 --> 00:00:39.924
+for example, language extensions,
+
+00:00:40.024 --> 00:00:43.964
+which are optional language features one might want to use
+
+00:00:44.064 --> 00:00:48.364
+for convenience.
+
+00:00:48.464 --> 00:00:52.499
+The front matters also contain module exports.
+
+00:52.500 --> 00:00:55.684
+So for example, here we define,
+
+00:00:55.784 --> 00:00:57.999
+we declare module F2Md.Config
+
+00:58.000 --> 00:01:00.884
+for this Haskell source file,
+
+00:01:00.984 --> 00:01:02.999
+which exports these four identifiers
+
+01:03.000 --> 01:07.499
+that other source files can use when importing F2Md.Config.
+
+01:07.500 --> 00:01:10.684
+And the next will be
+
+00:01:10.784 --> 00:01:13.999
+a block of imports so that we can use libraries
+
+01:14.000 --> 01:16.999
+and identifiers in these libraries.
+
+01:17.000 --> 00:01:21.644
+The bulk of a Haskell source file normally is
+
+00:01:21.744 --> 00:01:22.999
+a list of declarations,
+
+01:23.000 --> 01:25.999
+including values, types, and instances, and so on.
+
+01:26.000 --> 00:01:29.084
+The difference between a value and a type is that
+
+00:01:29.184 --> 00:01:30.499
+the type of a value is a type,
+
+01:30.500 --> 00:01:33.964
+and the type of a type is a kind.
+
+00:01:34.064 --> 00:01:38.484
+For example, here's a small block of Haskell source code.
+
+00:01:38.584 --> 00:01:41.404
+We define Range type
+
+00:01:41.504 --> 00:01:44.999
+from a lower-end integer to a higher-end integer.
+
+01:45.000 --> 00:01:51.364
+We also declare a value r of the type Range,
+
+00:01:51.464 --> 00:01:53.999
+which is Range from 2 to 7,
+
+01:54.000 --> 00:02:01.004
+because in Haskell, we like to--
+
+00:02:01.104 --> 00:02:03.999
+by default, functions can be curried,
+
+02:04.000 --> 00:02:09.804
+which basically means, by default, we want to utilize
+
+00:02:09.904 --> 00:02:11.999
+the partial application of functions.
+
+00:02:12.000 --> 00:02:17.284
+We don't require parens surrounding arguments
+
+00:02:17.384 --> 00:02:19.364
+when invoking a function.
+
+00:02:19.464 --> 00:02:22.724
+That makes it possible, if you want,
+
+00:02:22.725 --> 00:02:24.999
+to write Haskell like Lisp
+
+02:25.000 --> 02:27.999
+by adding a bit of redundant parens.
+
+02:28.000 --> 00:02:30.044
+So for example,
+
+00:02:30.144 --> 00:02:33.684
+here are two blocks of code, one Lisp, one Haskell,
+
+00:02:33.784 --> 00:02:35.999
+and they look quite similar to each other.
+
+02:36.000 --> 02:37.999
+What is a code explorer?
+
+02:38.000 --> 00:02:39.444
+A code explorer is a tool
+
+00:02:39.544 --> 00:02:42.624
+to browse its code base to its code comprehension.
+
+00:02:42.724 --> 00:02:45.324
+Code explorer commonly comes with
+
+00:02:45.424 --> 00:02:46.999
+several functionalities or features,
+
+02:47.000 --> 00:02:49.244
+including a cross-referencer,
+
+00:02:49.344 --> 00:02:52.999
+which allows going to definitions of an identifier at points
+
+02:53.000 --> 00:02:56.444
+or looking up references of an identifier,
+
+00:02:56.544 --> 00:02:57.999
+like where it is used.
+
+02:58.000 --> 03:03.999
+So the example in Emacs would be xref.
+
+03:04.000 --> 00:03:07.604
+Code explorer also would be able to show you
+
+00:03:07.704 --> 00:03:09.999
+documentation and signatures of identifiers at points.
+
+03:10.000 --> 00:03:13.884
+In Emacs, that would be eldoc.
+
+00:03:13.984 --> 00:03:16.999
+It also commonly allows you to search for identifiers.
+
+03:17.000 --> 00:03:19.884
+Something like that in Emacs
+
+00:03:19.984 --> 00:03:21.999
+could be describe-function and find-function.
+
+03:22.000 --> 00:03:24.684
+Code explorer is normally
+
+00:03:24.784 --> 00:03:27.364
+quite often implemented in two parts,
+
+00:03:27.464 --> 00:03:27.999
+the indexer and the server,
+
+03:28.000 --> 00:03:32.484
+where the indexer parses the source code files,
+
+00:03:32.584 --> 00:03:33.999
+indexes the identifiers,
+
+03:34.000 --> 00:03:36.284
+and stores the information of identifiers
+
+00:03:36.384 --> 00:03:37.999
+like the definition, size, and the currencies,
+
+03:38.000 --> 03:41.999
+either in databases or in files.
+
+03:42.000 --> 00:03:44.444
+The other part is the server,
+
+00:03:44.544 --> 00:03:48.999
+which uses the database created by the indexer
+
+03:49.000 --> 00:03:53.004
+to serve the information of the identifier.
+
+00:03:53.104 --> 00:03:57.004
+Before I present my solution to code exploring,
+
+00:03:57.104 --> 00:04:00.999
+some description of prior art is in order.
+
+04:01.000 --> 00:04:05.284
+There are several tools that you can use
+
+00:04:05.384 --> 00:04:07.999
+to aid code exploration,
+
+04:08.000 --> 00:04:13.444
+including tech-based tools like hasktags and hs-tags.
+
+00:04:13.544 --> 00:04:15.484
+The limitation with these tools
+
+00:04:15.584 --> 00:04:17.999
+is they are focused on the current projects only
+
+04:18.000 --> 00:04:19.604
+and do not work
+
+00:04:19.704 --> 00:04:25.999
+for cross-packaging reference and definition.
+
+04:26.000 --> 00:04:31.044
+Another problem with the tag-based tools is
+
+00:04:31.045 --> 00:04:34.684
+they might not handle symbols with the same name properly.
+
+00:04:34.784 --> 00:04:35.999
+Sometimes they get confused,
+
+04:36.000 --> 00:04:43.324
+and they ask you to choose which definition,
+
+00:04:43.424 --> 00:04:45.924
+what is the correct definition site,
+
+00:04:46.024 --> 00:04:49.244
+even though the occurrence of the symbol
+
+00:04:49.344 --> 00:04:54.999
+or the symbol at point has only one definition ambiguously.
+
+04:55.000 --> 04:57.999
+Another tool is the haskell-mode.
+
+04:58.000 --> 00:05:02.684
+It has some limited support for eldoc
+
+00:05:02.784 --> 00:05:06.604
+by displaying the signature of an identifier at points,
+
+00:05:06.704 --> 00:05:11.764
+but the identifier has to be something
+
+00:05:11.864 --> 00:05:14.999
+that is commonly known or sort of built-in
+
+05:15.000 --> 05:17.999
+or come from the base library of Haskell.
+
+05:18.000 --> 00:05:20.244
+So for example,
+
+00:05:20.344 --> 00:05:24.244
+it works for common functions like head and tail.
+
+00:05:24.344 --> 00:05:26.999
+And you can see that the signature is displayed here.
+
+05:27.000 --> 00:05:29.564
+However, it does not work for,
+
+00:05:29.664 --> 00:05:31.804
+let's say, IO. IO is a type.
+
+00:05:31.904 --> 00:05:32.999
+Maybe that's the reason.
+
+05:33.000 --> 00:05:37.324
+Let's find another function
+
+00:05:37.424 --> 00:05:39.999
+that's not from the base library.
+
+05:40.000 --> 05:41.999
+toJSON is from the Aeson library,
+
+05:42.000 --> 05:46.999
+so no signature is displayed here.
+
+05:47.000 --> 00:05:51.164
+It also provides
+
+00:05:51.264 --> 00:05:53.324
+some sort of goto-declaration functionality
+
+00:05:53.424 --> 00:05:56.324
+to jump to any declaration in a file.
+
+00:05:56.424 --> 00:06:00.564
+To do that, one has to first run haskell-decl-scan-mode
+
+00:06:00.664 --> 00:06:02.999
+to enter this minor mode.
+
+06:03.000 --> 00:06:08.044
+Then we can run imenu to go to any definition,
+
+00:06:08.144 --> 00:06:10.999
+to go to any declaration, like getHomeR.
+
+06:11.000 --> 00:06:13.724
+Apparently, after running that,
+
+00:06:13.824 --> 00:06:15.999
+we are able to go to definition.
+
+06:16.000 --> 06:18.999
+So for example, let's see,
+
+06:19.000 --> 06:21.999
+we want to find definition of getCityJR.
+
+06:22.000 --> 00:06:25.524
+And indeed, it works
+
+00:06:25.624 --> 00:06:28.524
+if it's within the same source file, of course.
+
+00:06:28.624 --> 00:06:31.999
+It still does not work for cross-packaging identifiers.
+
+06:32.000 --> 00:06:36.924
+So HandlerFor is probably an identifier from servant.
+
+00:06:37.024 --> 00:06:39.999
+Or no, not necessarily servant. Maybe WAI.
+
+06:40.000 --> 00:06:43.404
+Anyway, it's another library.
+
+00:06:43.504 --> 00:06:50.404
+And how about find-references?
+
+00:06:50.504 --> 00:07:01.124
+find-references also works somehow for this file.
+
+00:07:01.224 --> 00:07:06.684
+How about WidgetFor?
+
+00:07:06.784 --> 00:07:13.644
+It works for WidgetFor too.
+
+00:07:13.744 --> 00:07:17.999
+It has some support for goto-definition and find-references.
+
+07:18.000 --> 07:25.999
+But as usual, it does not support such things cross-package.
+
+07:26.000 --> 00:07:27.364
+And finally, we have
+
+00:07:27.365 --> 00:07:30.999
+the Sledgehammer HLS Haskell language server.
+
+07:31.000 --> 07:32.999
+It can be used with EGLOT.
+
+07:33.000 --> 00:07:40.804
+But the problem with HLS, HLS has many many features
+
+00:07:40.904 --> 00:07:42.844
+because it is a language server,
+
+00:07:42.944 --> 00:07:50.999
+like renaming, like eldoc for standard libraries, and so on.
+
+07:51.000 --> 07:56.999
+But the problem with HLS is, one, that it is very, very slow.
+
+07:57.000 --> 07:59.999
+And I wouldn't use it with my laptop.
+
+08:00.000 --> 08:04.999
+And two, it also does not support cross-package referencing.
+
+08:05.000 --> 08:07.999
+In fact, there's an outstanding GitHub issue about this.
+
+08:08.000 --> 00:08:12.964
+So cross-package referencing and goto-definition
+
+00:08:13.064 --> 00:08:17.164
+is sort of a common shortfall,
+
+00:08:17.264 --> 00:08:20.999
+a common problem for these existing Haskell code explorers.
+
+08:21.000 --> 08:22.999
+Then finally, we also have hoogle and hackage.
+
+08:23.000 --> 00:08:28.284
+Hoogle is a search engine for Haskell identifiers,
+
+00:08:28.384 --> 00:08:30.644
+and the results link to Hackage,
+
+00:08:30.744 --> 00:08:33.604
+which is the Haskell documentation website
+
+00:08:33.704 --> 00:08:34.999
+for all Haskell libraries.
+
+08:35.000 --> 00:08:40.004
+Haskell Hackage has functionality
+
+00:08:40.104 --> 00:08:44.999
+where you can jump to the source code file rendered in HTML,
+
+08:45.000 --> 00:08:49.444
+and you can click on the identifiers there
+
+00:08:49.544 --> 00:08:51.524
+to jump to definitions,
+
+00:08:51.624 --> 00:08:54.044
+but it does not support find references,
+
+00:08:54.144 --> 00:08:58.999
+and it is rather basic.
+
+08:59.000 --> 00:09:01.644
+Then I learned about haskell-code-explorer,
+
+00:09:01.744 --> 00:09:04.999
+which is a fully-fledged Haskell code explorer.
+
+09:05.000 --> 00:09:07.724
+It is written by someone else.
+
+00:09:07.824 --> 00:09:09.164
+It is a web application
+
+00:09:09.264 --> 00:09:11.999
+for exploring Haskell package codebases.
+
+09:12.000 --> 00:09:16.244
+The official reference instance for haskell-code-explorer
+
+00:09:16.344 --> 00:09:18.999
+is available at this URL, which I will demo soon.
+
+09:19.000 --> 09:24.999
+What I did with these packages... I ported it to GHC 9.2.
+
+09:25.000 --> 00:09:29.044
+I renamed it to hcel because I want to focus on Emacs clients
+
+00:09:29.144 --> 00:09:30.999
+rather than JavaScript clients, which I will explain later.
+
+09:31.000 --> 09:36.999
+And I also wrote an Emacs client package, of course.
+
+09:37.000 --> 00:09:41.404
+This is what haskell-code-explorer looks like.
+
+00:09:41.504 --> 00:09:46.924
+On the homepage, it is a list of indexed packages
+
+00:09:47.024 --> 00:09:50.044
+indexed by the indexer.
+
+00:09:50.144 --> 00:09:53.844
+One can filter it by the package name
+
+00:09:53.944 --> 00:10:04.999
+or look for identifiers directly across all packages.
+
+10:05.000 --> 00:10:09.884
+Let's have a look at base. There are three versions.
+
+00:10:09.984 --> 00:10:14.999
+Let's have a look at the latest version, 4.12.0.0.
+
+10:15.000 --> 00:10:18.964
+Once entering the package view,
+
+00:10:19.064 --> 00:10:24.444
+you are shown a list of all modules by their path,
+
+00:10:24.544 --> 00:10:28.999
+as well as a tree of these module files.
+
+10:29.000 --> 00:10:32.524
+You can filter by module name or file name,
+
+00:10:32.624 --> 00:10:34.324
+or you can search for identifier within the same package
+
+00:10:34.424 --> 00:10:35.999
+or in all packages.
+
+10:36.000 --> 00:10:43.204
+Let's say we want to learn about Control.Monad.
+
+00:10:43.304 --> 00:10:46.884
+Now we are in the module view.
+
+00:10:46.984 --> 00:10:49.804
+The source file is presented to you,
+
+00:10:49.904 --> 00:10:54.999
+and it has links to identifiers.
+
+10:55.000 --> 00:11:01.804
+When you hover over them, the documentation shows up,
+
+00:11:01.904 --> 00:11:04.999
+including the signature where it is defined.
+
+11:05.000 --> 00:11:10.244
+You can go to its definition or find references.
+
+00:11:10.344 --> 00:11:20.164
+Let's say we want to go to the definition of Monad.
+
+00:11:20.264 --> 00:11:25.484
+It jumps to the definition site of the monad type class.
+
+00:11:25.584 --> 00:11:28.004
+If we click at the definition site,
+
+00:11:28.104 --> 00:11:32.124
+it brings up a list of references.
+
+00:11:32.224 --> 00:11:33.644
+On the left, you can choose
+
+00:11:33.744 --> 00:11:38.999
+which package you want to find references of monad in.
+
+11:39.000 --> 11:46.999
+Let's look at the random one, avwx.
+
+11:47.000 --> 00:11:54.044
+Here is a list of results where Monad is used in avwx.
+
+00:11:54.144 --> 00:11:57.764
+This is a module path.
+
+00:11:57.864 --> 00:12:06.324
+One can go to any of these results.
+
+00:12:06.424 --> 00:12:07.844
+We can search for things in all packages
+
+00:12:07.944 --> 00:12:09.484
+or in the current package.
+
+00:12:09.584 --> 00:12:12.999
+Let’s say I want to search for "Read"
+
+12:13.000 --> 00:12:19.244
+I think this is the "Read" that is commonly used in Haskell,
+
+00:12:19.344 --> 00:12:24.999
+the read type class for parsing strings into values.
+
+12:25.000 --> 00:12:31.004
+I think that is more or less it.
+
+00:12:31.104 --> 00:12:34.524
+That is the Haskell Code Explorer web application
+
+00:12:34.624 --> 00:12:38.204
+in all its glory.
+
+00:12:38.304 --> 00:12:40.884
+Let's go back to the slides.
+
+00:12:40.984 --> 00:12:43.364
+That was the web application,
+
+00:12:43.464 --> 00:12:46.444
+which is basically a JavaScript client
+
+00:12:46.544 --> 00:12:48.644
+that talks to the server
+
+00:12:48.744 --> 00:12:50.964
+by sending requests and receiving
+
+00:12:51.064 --> 00:12:54.999
+and parsing the JSON results or JSON responses.
+
+12:55.000 --> 00:13:02.404
+Initially, I was interested in hacking the web client.
+
+00:13:02.504 --> 00:13:04.999
+It uses the ember.js web framework.
+
+13:05.000 --> 00:13:09.844
+The first thing to do was to npm install ember-cli.
+
+00:13:09.944 --> 00:13:16.124
+It gives me 12 vulnerabilities,
+
+00:13:16.224 --> 00:13:18.999
+4 low, 2 moderate, 3 high, 3 critical.
+
+13:19.000 --> 00:13:26.084
+I don't know how often it is the case
+
+00:13:26.184 --> 00:13:32.964
+when we don't really care about these nasty vulnerabilities
+
+00:13:33.064 --> 00:13:35.999
+from Node.js or npm because they are so common.
+
+13:36.000 --> 00:13:41.044
+I don't quite like that.
+
+00:13:41.144 --> 00:13:45.364
+Another reason for favoring Emacs clients
+
+00:13:45.464 --> 00:13:48.999
+over JavaScript clients is user freedom.
+
+13:49.000 --> 00:13:53.284
+Emacs is geared towards user freedom.
+
+00:13:53.384 --> 00:14:01.564
+It allows users maximum freedom to customize or mod Emacs.
+
+00:14:01.664 --> 00:14:07.164
+I think Emacs clients can be a way to fix JavaScript traps,
+
+00:14:07.264 --> 00:14:14.244
+like using user scripts to replace non-free JavaScript.
+
+00:14:14.344 --> 00:14:19.484
+There are tools to do that, for example, like Haketilo.
+
+00:14:19.584 --> 00:14:21.404
+Why write JavaScript replacement
+
+00:14:21.504 --> 00:14:25.164
+if we can write Elisp replacement?
+
+00:14:25.264 --> 00:14:31.684
+If we overwrite all kinds of front-ends in Emacs
+
+00:14:31.784 --> 00:14:34.404
+for commonly-used web applications
+
+00:14:34.504 --> 00:14:36.999
+like Reddit, Hacker News, what have you,
+
+14:37.000 --> 00:14:40.804
+then we have an Emacs app store
+
+00:14:40.904 --> 00:14:43.604
+where we can just install these applications
+
+00:14:43.704 --> 00:14:51.084
+and browse the web more freely.
+
+00:14:51.184 --> 00:14:56.044
+Back to hcel, which is the Emacs client I wrote.
+
+00:14:56.144 --> 00:14:59.084
+I tried to reuse as much of Emacs built-ins as possible,
+
+00:14:59.184 --> 00:15:03.044
+including eldoc, for showing documentation,
+
+00:15:03.144 --> 00:15:04.764
+xref for cross-referencer,
+
+00:15:04.864 --> 00:15:06.999
+compilation-mode for showing search results of identifiers,
+
+15:07.000 --> 00:15:11.604
+outline-mode for a hierarchical view
+
+00:15:11.704 --> 00:15:14.284
+of package module identifiers,
+
+00:15:14.384 --> 00:15:17.999
+sort of a cursor-mode for highlighting identifiers,
+
+15:18.000 --> 00:15:26.044
+help-mode for displaying quick help for Haskell identifiers,
+
+00:15:26.144 --> 00:15:27.604
+integration with haddorg,
+
+00:15:27.704 --> 00:15:31.204
+which I will mention later, etc.
+
+00:15:31.304 --> 00:15:37.999
+It is available as hcel without the dot on GNU ELPA.
+
+15:38.000 --> 00:15:40.084
+Time for a demo.
+
+00:15:40.184 --> 00:15:42.484
+To start using hc.el, surprise surprise,
+
+00:15:42.584 --> 00:15:45.084
+we run the hcel command.
+
+00:15:45.184 --> 00:15:46.884
+We are presented with a list of packages
+
+00:15:46.984 --> 00:15:51.999
+indexed by the hcel indexer.
+
+15:52.000 --> 00:15:53.964
+This is an outline mode,
+
+00:15:54.064 --> 00:15:58.724
+so we can tab to list all the modules
+
+00:15:58.824 --> 00:16:00.999
+represented by the module path.
+
+16:01.000 --> 00:16:03.404
+We can further tab into the list of identifiers
+
+00:16:03.504 --> 00:16:04.999
+declared in this module.
+
+16:05.000 --> 00:16:09.084
+Now it asks whether you want to open module source.
+
+00:16:09.184 --> 00:16:11.884
+This is because some module source code
+
+00:16:11.984 --> 00:16:13.999
+can be quite large and it can take a bit of time.
+
+16:14.000 --> 00:16:17.684
+In this case, the control monad is quite small,
+
+00:16:17.784 --> 00:16:19.844
+so let's say yes.
+
+00:16:19.944 --> 00:16:24.004
+We see the list of identifiers.
+
+00:16:24.104 --> 00:16:27.999
+One can jump to an identifier forever.
+
+16:28.000 --> 16:32.999
+As you can see, the identifiers at points are highlighted.
+
+16:33.000 --> 00:16:36.124
+This can be particularly useful
+
+00:16:36.224 --> 00:16:38.604
+in a large function declaration
+
+00:16:38.704 --> 00:16:39.999
+where you come to see, for example,
+
+16:40.000 --> 00:16:44.204
+all the occurrences of an identifier
+
+00:16:44.304 --> 00:16:47.999
+inside the body of the declaration.
+
+16:48.000 --> 00:16:50.724
+These are declarations
+
+00:16:50.824 --> 00:16:52.999
+which in Haskell mode are listed in imenu.
+
+16:53.000 --> 16:59.999
+We can do the same here in hcel source mode.
+
+17:00.000 --> 17:05.999
+It lists all the declarations with their signature.
+
+17:06.000 --> 17:12.999
+Let's say we want to jump to this funny operator.
+
+17:13.000 --> 00:17:20.324
+It worked and you can also go back and forth
+
+00:17:20.424 --> 00:17:25.999
+within the declarations by pressing "n" and "p".
+
+17:26.000 --> 00:17:30.804
+Similarly, you can do something similar in the outline mode
+
+00:17:30.904 --> 00:17:37.999
+by toggling the follow mode, just like in org-agenda.
+
+17:38.000 --> 00:17:40.124
+Let's turn it off.
+
+00:17:40.224 --> 00:17:45.999
+Now, how about find definition references?
+
+17:46.000 --> 00:17:48.964
+Using xref,
+
+00:17:49.064 --> 00:17:52.999
+we can jump to the definition of Int and jump back.
+
+17:53.000 --> 17:55.999
+Jump to Maybe, jump back.
+
+17:56.000 --> 00:18:00.924
+Let's have a look at references of replicateM.
+
+00:18:01.024 --> 00:18:03.364
+There are plenty of them.
+
+00:18:03.464 --> 00:18:08.999
+Maybe we want to check out ghc-lib.
+
+18:09.000 --> 00:18:11.244
+Here are all the references
+
+00:18:11.344 --> 00:18:15.999
+and you can of course jump to any of them in the results.
+
+18:16.000 --> 18:18.999
+Cool.
+
+18:19.000 --> 00:18:21.764
+You may have already noticed
+
+00:18:21.864 --> 00:18:27.084
+the eldoc displaying the documentation
+
+00:18:27.184 --> 00:18:34.804
+and signature of identifiers.
+
+00:18:34.904 --> 00:18:44.004
+For example, here it shows the signature of replicateM,
+
+00:18:44.104 --> 00:18:46.999
+where it is defined, and its documentation.
+
+18:47.000 --> 18:55.999
+We can bring up the eldoc buffer.
+
+18:56.000 --> 00:18:58.164
+In the eldoc buffer,
+
+00:18:58.264 --> 00:19:00.084
+there are also links to other identifiers,
+
+00:19:00.184 --> 00:19:04.444
+which takes you to the definition of these identifiers,
+
+00:19:04.544 --> 00:19:07.524
+like minBound.
+
+00:19:07.624 --> 00:19:10.764
+Apparently, this is not working.
+
+00:19:10.864 --> 00:19:13.004
+I'm pretty sure it maybe works.
+
+00:19:13.104 --> 00:19:16.999
+Let's go to nothing or just...
+
+19:17.000 --> 00:19:19.764
+I think those didn't work because
+
+00:19:19.864 --> 00:19:24.044
+the module source for those identifiers is not open.
+
+00:19:24.144 --> 00:19:30.204
+Of course, you can search
+
+00:19:30.304 --> 00:19:32.924
+for any identifiers across all indexed packages
+
+00:19:33.024 --> 00:19:37.999
+by invoking hcel-global-ids.
+
+19:38.000 --> 19:41.999
+Let's say we want to search for Read.
+
+19:42.000 --> 00:19:47.364
+We are presented with a list of results,
+
+00:19:47.464 --> 00:19:53.999
+which are identifiers starting with Read with capital R.
+
+19:54.000 --> 00:19:57.204
+They also show where they are defined
+
+00:19:57.304 --> 00:20:06.999
+and the documentation, just like in eldoc.
+
+20:07.000 --> 00:20:13.844
+One can also directly jump to the identifier
+
+00:20:13.944 --> 00:20:19.999
+in the mini-buffer results.
+
+20:20.000 --> 00:20:21.924
+For example, we want to check out this Read2
+
+00:20:22.024 --> 00:20:27.999
+defined in base-4.12.0.0 Data.Functor.Classes
+
+20:28.000 --> 20:33.999
+There we go.
+
+20:34.000 --> 00:20:37.764
+Another functionality of hcel
+
+00:20:37.864 --> 00:20:40.999
+is the help buffer integration.
+
+20:41.000 --> 00:20:46.564
+We can do hcel-help and then let's say
+
+00:20:46.565 --> 00:20:52.644
+we want to learn about the read type class.
+
+00:20:52.744 --> 00:20:55.084
+This is a help buffer
+
+00:20:55.184 --> 00:21:00.804
+and you can jump to other definitions
+
+00:21:00.904 --> 00:21:02.364
+within the help buffer
+
+00:21:02.464 --> 00:21:06.999
+to read the documentation like readsPrec.
+
+21:07.000 --> 21:10.999
+It says Server version cannot be satistifed. Actual version.
+
+21:11.000 --> 00:21:14.684
+This means we need to tell hecl
+
+00:21:14.784 --> 00:21:16.999
+that the server has the correct version.
+
+21:17.000 --> 00:21:21.644
+hecl-fetch-server-version.
+
+00:21:21.744 --> 00:21:25.604
+Wait a bit for it to update
+
+00:21:25.704 --> 00:21:26.999
+the knowledge of the server version.
+
+21:27.000 --> 21:32.999
+Now you can follow the links, Read, readsPrec.
+
+21:33.000 --> 21:37.999
+You can do the "l" and "r" to navigate within the history.
+
+21:38.000 --> 21:42.999
+ReadS, ReadP.
+
+21:43.000 --> 00:21:45.924
+Just like in the help buffer for elisp code,
+
+00:21:46.024 --> 00:21:52.999
+you can jump to the definition.
+
+21:53.000 --> 21:59.999
+I believe that is everything, more or less.
+
+22:00.000 --> 22:04.999
+That concludes the demo.
+
+22:05.000 --> 00:22:07.044
+Now let's turn to haddorg,
+
+00:22:07.144 --> 00:22:08.999
+which is an Org backend for Haddock.
+
+22:09.000 --> 22:12.999
+Haddock is the documentation generator for Haskell packages.
+
+22:13.000 --> 00:22:15.044
+For example,
+
+00:22:15.144 --> 00:22:21.999
+the official Haskell package documentation website Hackage,
+
+22:22.000 --> 00:22:25.804
+all the documentation there is generated by Haddock
+
+00:22:25.904 --> 00:22:27.999
+into the HTML format.
+
+22:28.000 --> 00:22:31.324
+Haddock has several backends
+
+00:22:31.424 --> 00:22:34.284
+that convert the intermediate representation
+
+00:22:34.384 --> 00:22:36.964
+called interface to various output formats,
+
+00:22:37.064 --> 00:22:41.764
+including HTML, LaTeX, and Hugo.
+
+00:22:41.864 --> 00:22:44.804
+HTML is the main format with a lot of features.
+
+00:22:44.904 --> 00:22:48.999
+LaTeX is less so, and I don't think it is widely used.
+
+22:49.000 --> 22:52.999
+Let's have a look at an HTML example.
+
+22:53.000 --> 00:23:01.084
+This is a PDF because these HTML files can be rather large
+
+00:23:01.184 --> 00:23:06.999
+and slow down EWW significantly.
+
+23:07.000 --> 00:23:10.164
+It's faster to convert it to PDF
+
+00:23:10.264 --> 00:23:16.999
+and read it from pdf-tools.
+
+23:17.000 --> 00:23:20.764
+Looks like this is as big as it goes.
+
+00:23:20.864 --> 00:23:26.044
+I hope you can still see it.
+
+00:23:26.144 --> 00:23:30.044
+Can I still enlarge it a bit more? Maybe.
+
+00:23:30.144 --> 00:23:32.964
+This is Servant.Server.
+
+00:23:33.064 --> 00:23:35.999
+It is a module in the servant-server package.
+
+23:36.000 --> 23:41.999
+It is a widely used package for writing servers.
+
+23:42.000 --> 00:23:49.804
+It starts with a heading, which is the name of the module,
+
+00:23:49.904 --> 00:23:52.684
+and the table of contents.
+
+00:23:52.784 --> 00:23:55.999
+Then a heading: Run an wai application from an API.
+
+23:56.000 --> 00:24:00.804
+Under this heading, there are all the relevant identifiers
+
+00:24:00.904 --> 00:24:08.524
+that is concerned with running a WAI application from API,
+
+00:24:08.624 --> 00:24:13.204
+including serve, which is one of the main entry points
+
+00:24:13.304 --> 00:24:15.524
+for a Servant.Server.
+
+00:24:15.624 --> 00:24:21.604
+It has a signature linkable to the other identifiers,
+
+00:24:21.704 --> 00:24:23.004
+the documentation,
+
+00:24:23.104 --> 00:24:26.644
+an example with a Haskell source code block.
+
+00:24:26.744 --> 00:24:30.999
+That's what HTML output looks like.
+
+24:31.000 --> 00:24:33.924
+As I mentioned,
+
+00:24:34.024 --> 00:24:35.804
+there are several downsides or drawbacks with that,
+
+00:24:35.904 --> 00:24:40.999
+like the HTML files can be huge and slow down EWW.
+
+24:41.000 --> 00:24:46.124
+Also, every module is an HTML of itself,
+
+00:24:46.224 --> 00:24:48.284
+and there's also an HTML for the package
+
+00:24:48.384 --> 00:24:49.999
+with a list of all the modules.
+
+24:50.000 --> 00:24:54.644
+Whereas the Org backend
+
+00:24:54.744 --> 00:25:04.164
+is better in that it is much more compact.
+
+00:25:04.264 --> 00:25:07.404
+All the modules under the same package
+
+00:25:07.504 --> 00:25:10.684
+are included in one Org file
+
+00:25:10.784 --> 00:25:12.999
+as sub-headings, level 2 headings.
+
+25:13.000 --> 00:25:19.404
+So, servant-server, Servant.Server, that is the module.
+
+00:25:19.504 --> 00:25:21.844
+So basically, this level 2 heading
+
+00:25:21.944 --> 00:25:24.999
+contains all the information in this PDF.
+
+25:25.000 --> 25:28.999
+Run the WAI application from API, serve.
+
+25:29.000 --> 00:25:39.124
+It has a signature that links to other identifiers
+
+00:25:39.224 --> 00:25:41.999
+and the documentation that's also linkable.
+
+25:42.000 --> 00:25:47.124
+The Haskell source block is now an Org source block,
+
+00:25:47.224 --> 00:25:49.404
+and you can do all sorts of interesting things
+
+00:25:49.504 --> 00:25:52.644
+with it using org-babel.
+
+00:25:52.744 --> 00:25:55.999
+Let's check the links as server.
+
+25:56.000 --> 25:59.999
+Right, so the link works.
+
+26:00.000 --> 00:26:05.284
+Application, right, Request.
+
+00:26:05.384 --> 00:26:08.284
+It also supports cross-packaging package linking,
+
+00:26:08.384 --> 00:26:12.204
+so following the link to request
+
+00:26:12.304 --> 00:26:17.524
+takes us from servant-server package Org documentation
+
+00:26:17.624 --> 00:26:24.684
+to the WAI Org documentation.
+
+00:26:24.784 --> 00:26:27.444
+Another nice thing with Org documentation
+
+00:26:27.544 --> 00:26:32.644
+is that you can use Org functions
+
+00:26:32.744 --> 00:26:40.444
+like org-goto to jump to any identifiers.
+
+00:26:40.544 --> 00:26:45.804
+Let's say we want to jump to application.
+
+00:26:45.904 --> 00:26:49.999
+We have toApplication. So it jumpts to toApplication.
+
+26:50.000 --> 00:26:53.924
+I guess application is not an identifier,
+
+00:26:54.024 --> 00:26:55.724
+yes, it is more like a type alias,
+
+00:26:55.824 --> 00:26:58.564
+that's why we couldn't find it.
+
+00:26:58.664 --> 00:27:00.999
+So that is haddorg.
+
+27:01.000 --> 00:27:06.004
+And of course, I implemented a bit of integration
+
+00:27:06.104 --> 00:27:08.444
+between haddorg and hcel
+
+00:27:08.544 --> 00:27:11.204
+so that we can jump from one to the other.
+
+00:27:11.304 --> 00:27:14.999
+Let's go back to servant.
+
+27:15.000 --> 27:23.999
+Let's see, ServerT.
+
+27:24.000 --> 00:27:27.004
+Maybe we want to check out
+
+00:27:27.104 --> 00:27:31.844
+the source code definition of ServerT.
+
+00:27:31.944 --> 00:27:36.164
+To find out exactly what sort of type alias it is,
+
+00:27:36.264 --> 00:27:43.084
+like what is the alias (or type synonym)
+
+00:27:43.184 --> 00:27:49.404
+We run hcel-identifier-at-point--
+
+00:27:49.504 --> 00:27:52.244
+sorry, hcel-haddorg-to-hcel-definition...
+
+00:27:52.344 --> 00:27:54.999
+Oh, we have an HTTP error.
+
+27:55.000 --> 27:58.999
+Typ ServerT not found in module src/Servant/Server.hs
+
+27:59.000 --> 00:28:01.124
+Why? Well, this is because
+
+00:28:01.125 --> 00:28:04.844
+the HCEL server only understands,
+
+00:28:04.944 --> 00:28:07.724
+it only has knowledge of identifiers
+
+00:28:07.824 --> 00:28:11.999
+that is defined in the original source file.
+
+28:12.000 --> 00:28:17.084
+So, it is not aware of, say,
+
+00:28:17.184 --> 00:28:20.999
+identifiers that are re-exported in the module.
+
+28:21.000 --> 00:28:25.724
+Most likely, Servant.Server module re-exports ServerT
+
+00:28:25.824 --> 00:28:28.604
+from another module.
+
+00:28:28.704 --> 00:28:29.644
+We will probably have better luck
+
+00:28:29.744 --> 00:28:34.999
+looking into some internal modules like this one.
+
+28:35.000 --> 28:38.999
+Let's try this type class HasContextEntry.
+
+28:39.000 --> 28:41.999
+So this time it worked.
+
+28:42.000 --> 00:28:44.244
+And, of course, we can go the other direction
+
+00:28:44.344 --> 00:28:47.999
+from hecl to haddorg.
+
+28:48.000 --> 00:28:51.484
+Let's say if we want to display named context
+
+00:28:51.584 --> 00:28:53.999
+in the haddorg documentation
+
+28:54.000 --> 00:29:01.524
+so that we can read about, other identifiers documentation
+
+00:29:01.624 --> 00:29:03.999
+that is related to named context.
+
+29:04.000 --> 29:07.999
+We do hecl-identifier-at-point-to-haddorg
+
+29:08.000 --> 29:13.999
+And it does take us to the server-server old file.
+
+29:14.000 --> 29:17.999
+Okay.
+
+29:18.000 --> 29:20.999
+And that concludes my presentation.
+
+29:21.000 --> 00:29:23.484
+You can find hecl in GNU Elpa,
+
+00:29:23.584 --> 00:29:24.999
+and you can also find the source code,
+
+29:25.000 --> 00:29:27.364
+as well as the source of haddorg
+
+00:29:27.464 --> 00:29:29.764
+and instructions on how to generate org documentation
+
+00:29:29.864 --> 00:29:32.999
+using haddorg in my cgit instance.
+
+29:33.000 --> 00:29:36.684
+Thank you for your attention.
+
+00:29:36.784 --> 00:29:37.999
+I hope you enjoy the rest of the conference.
+
+29:38.000 --> 29:51.000
+Thank you.
diff --git a/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main.vtt b/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main.vtt
new file mode 100644
index 00000000..e51ef23b
--- /dev/null
+++ b/2022/captions/emacsconf-2022-jupyter--edit-live-jupyter-notebook-cells-with-emacs--blaine-mooers--main.vtt
@@ -0,0 +1,792 @@
+WEBVTT captioned by sachac
+
+NOTE Introduction
+
+00:00:00.000 --> 00:00:03.839
+Hi, my name is Blaine Mooers.
+
+00:00:03.840 --> 00:00:05.399
+I'm an associate professor of biochemistry
+
+00:00:05.400 --> 00:00:08.199
+at the University of Oklahoma Health Sciences Center
+
+00:00:08.200 --> 00:00:09.759
+in Oklahoma City.
+
+00:00:09.760 --> 00:00:11.999
+I'm going to talk about the use of Emacs
+
+00:00:12.000 --> 00:00:16.239
+to edit live Jupyter notebook cells
+
+00:00:16.240 --> 00:00:20.519
+as well as text areas on web pages.
+
+00:00:20.520 --> 00:00:22.519
+So like a lot of technical workers,
+
+00:00:22.520 --> 00:00:24.879
+I find myself having to write prose
+
+00:00:24.880 --> 00:00:28.679
+in text areas on web pages,
+
+00:00:28.680 --> 00:00:31.719
+as well as working with code
+
+00:00:31.720 --> 00:00:36.999
+in Jupyter notebooks and Colab notebooks,
+
+00:00:37.000 --> 00:00:39.319
+and often I have wished for
+
+00:00:39.320 --> 00:00:43.479
+the full power of Emacs while doing so.
+
+NOTE GhostText and Atomic Chrome
+
+00:00:43.480 --> 00:00:45.319
+Well, now that is possible.
+
+00:00:45.320 --> 00:00:46.799
+Actually, there are several solutions
+
+00:00:46.800 --> 00:00:49.039
+that have been available for some time.
+
+00:00:49.040 --> 00:00:50.399
+I'm going to talk about one solution
+
+00:00:50.400 --> 00:00:55.319
+that I'm familiar with and has worked out for me.
+
+00:00:55.320 --> 00:00:58.119
+So this requires the use of two software packages,
+
+00:00:58.120 --> 00:01:01.599
+GhostText and Atomic Chrome.
+
+00:01:01.600 --> 00:01:04.239
+GhostText is an extension for the web browser,
+
+00:01:04.240 --> 00:01:07.279
+whereas Atomic Chrome is a package for Emacs.
+
+00:01:07.280 --> 00:01:10.879
+You have to have both of these.
+
+00:01:10.880 --> 00:01:13.399
+So Chrome is for the editor side
+
+00:01:13.400 --> 00:01:18.919
+and GhostText handles the browser side.
+
+NOTE GhostText
+
+00:01:18.920 --> 00:01:22.479
+The GhostText extension is available
+
+00:01:22.480 --> 00:01:26.799
+in the Chrome web store.
+
+00:01:26.800 --> 00:01:29.519
+And GhostText is represented by this icon,
+
+00:01:29.520 --> 00:01:31.519
+which has a ghost in front of the capital letter T.
+
+00:01:31.520 --> 00:01:36.399
+It is being developed by Federico Brigante.
+
+00:01:36.400 --> 00:01:41.239
+He is a very prolific JavaScript developer.
+
+00:01:41.240 --> 00:01:44.279
+He has a web page committed to GhostText,
+
+00:01:44.280 --> 00:01:47.199
+as well as a GitHub site.
+
+00:01:47.200 --> 00:01:50.159
+So here's an example of GhostText.
+
+00:01:50.160 --> 00:01:54.839
+This is a snapshot from a session
+
+00:01:54.840 --> 00:02:01.279
+that I had while editing LaTeX on the Overleaf website.
+
+00:02:01.280 --> 00:02:03.759
+Overleaf is this web service
+
+00:02:03.760 --> 00:02:09.719
+that empowers the editing of LaTeX documents on the web.
+
+00:02:09.720 --> 00:02:14.039
+So I have clicked on this GhostText icon in the toolbar.
+
+00:02:14.040 --> 00:02:17.039
+I had already opened up Emacs,
+
+00:02:17.040 --> 00:02:19.879
+and I had the Atomic Chrome server running.
+
+00:02:19.880 --> 00:02:21.799
+So a connection was established,
+
+00:02:21.800 --> 00:02:28.599
+as indicated by this blue border around this text area.
+
+00:02:28.600 --> 00:02:30.519
+And as soon as that appeared,
+
+00:02:30.520 --> 00:02:35.319
+the text appeared in a buffer inside of Emacs.
+
+00:02:35.320 --> 00:02:40.159
+So I have overlaid the area where normally the compiled PDF
+
+00:02:40.160 --> 00:02:43.919
+would appear in an Overleaf session.
+
+00:02:43.920 --> 00:02:47.679
+So I'm using a configuration for LaTeX that I developed,
+
+00:02:47.680 --> 00:02:52.159
+which is available through the MooersLab GitHub site.
+
+00:02:52.160 --> 00:02:55.919
+I also gave a talk about how I use LaTeX in Emacs
+
+00:02:55.920 --> 00:02:58.839
+at the Berlin Emacs meetup in August.
+
+00:02:58.840 --> 00:03:00.039
+This talk was not recorded,
+
+00:03:00.040 --> 00:03:05.119
+but the slides are available on this website.
+
+NOTE Live coding demo
+
+00:03:05.120 --> 00:03:09.519
+So I would like to now switch to a little live coding
+
+00:03:09.520 --> 00:03:12.359
+to make this a little more interesting.
+
+00:03:12.360 --> 00:03:22.439
+So I start my day at this other website called 750Words.
+
+00:03:22.440 --> 00:03:25.279
+This site just takes plain text,
+
+00:03:25.280 --> 00:03:28.559
+but I like to write in LaTeX.
+
+00:03:28.560 --> 00:03:31.519
+So GhostText came to my rescue
+
+00:03:31.520 --> 00:03:34.479
+when I started using this everyday last May.
+
+00:03:34.480 --> 00:03:37.239
+So I clicked on the GhostText icon.
+
+00:03:37.240 --> 00:03:39.759
+It highlighted that area in blue.
+
+00:03:39.760 --> 00:03:41.839
+There's some boilerplate
+
+00:03:41.840 --> 00:03:45.919
+that I like to start my day with.
+
+00:03:45.920 --> 00:03:50.599
+I like to get a list of my deadlines
+
+00:03:50.600 --> 00:03:54.239
+that are coming up, as shown here,
+
+00:03:54.240 --> 00:03:55.839
+for the next several months.
+
+00:03:55.840 --> 00:03:59.399
+And then I have landed at this tab stop.
+
+00:03:59.400 --> 00:04:04.239
+And so I had issued a tab trigger
+
+00:04:04.240 --> 00:04:09.519
+which inserted this almost 50 lines of text
+
+00:04:09.520 --> 00:04:13.639
+from a snippet through Yasnippet.
+
+00:04:13.640 --> 00:04:17.479
+And then I'll change this text to whatever.
+
+00:04:17.480 --> 00:04:29.279
+And then I can hit TAB to move to the next site.
+
+00:04:29.280 --> 00:04:38.439
+I was dead tired last night, so I fell asleep at my desk,
+
+00:04:38.440 --> 00:04:42.439
+and whatever. So I just keep on going
+
+00:04:42.440 --> 00:04:47.319
+and then hit TAB again and enter my "To Be Done" items.
+
+00:04:47.320 --> 00:04:50.239
+And then what I love about Emacs is that
+
+00:04:50.240 --> 00:04:56.119
+you can hit C-c C-j to insert a new item and so forth,
+
+00:04:56.120 --> 00:05:03.239
+so you can extend the list.
+
+00:05:03.240 --> 00:05:05.079
+Initially, I just have 10 items.
+
+00:05:05.080 --> 00:05:08.839
+I'm going to have more. And on I go,
+
+00:05:08.840 --> 00:05:12.359
+using the full power of LaTeX.
+
+00:05:12.360 --> 00:05:16.119
+So I have configured Atomic Chrome
+
+00:05:16.120 --> 00:05:19.999
+so it will recognize this website as a –
+
+00:05:20.000 --> 00:05:21.399
+it will open up this website –
+
+00:05:21.400 --> 00:05:26.159
+the connection to this website with this buffer
+
+00:05:26.160 --> 00:05:36.559
+in the LaTeX major mode. To turn this off,
+
+00:05:36.560 --> 00:05:40.319
+we can close – simply just close the buffer
+
+00:05:40.320 --> 00:05:42.959
+and that will shut things down.
+
+00:05:42.960 --> 00:05:46.399
+On the browser side, you can right-click on the icon
+
+00:05:46.400 --> 00:05:49.039
+and disconnect GhostText on this page.
+
+NOTE Editing code cells
+
+00:05:49.040 --> 00:05:53.639
+Okay, let's go to a different situation.
+
+00:05:53.640 --> 00:05:57.359
+This is not a feature that's advertised by the developer,
+
+00:05:57.360 --> 00:06:00.119
+but I discovered that you can edit code cells
+
+00:06:00.120 --> 00:06:02.799
+(or any kind of cell for that matter)
+
+00:06:02.800 --> 00:06:04.439
+in a Jupyter Notebook.
+
+00:06:04.440 --> 00:06:05.719
+However, we have a challenge here.
+
+00:06:05.720 --> 00:06:09.319
+We have three text areas open – three code cells.
+
+00:06:09.320 --> 00:06:14.759
+So if we click on the GhostText icon,
+
+00:06:14.760 --> 00:06:17.479
+these three areas will show up in green
+
+00:06:17.480 --> 00:06:19.119
+and we'll be prompted to select the one
+
+00:06:19.120 --> 00:06:20.279
+that we want to activate.
+
+00:06:20.280 --> 00:06:22.359
+We want to activate the one with text.
+
+00:06:22.360 --> 00:06:31.399
+So then we can go in here and make edits, of course,
+
+00:06:31.400 --> 00:06:33.359
+and you can do this in Emacs
+
+00:06:33.360 --> 00:06:35.639
+or we can do it in the browser. It doesn't matter.
+
+00:06:35.640 --> 00:06:38.359
+You saw me editing in Emacs,
+
+00:06:38.360 --> 00:06:40.359
+but we can also make the edits
+
+00:06:40.360 --> 00:06:44.879
+in the text area of the browser
+
+00:06:44.880 --> 00:06:47.519
+and they will show up immediately in Emacs.
+
+00:06:47.520 --> 00:06:54.439
+So we could change the case of that M and that's going to –
+
+00:06:54.440 --> 00:06:59.279
+shows up over here. Okay, we can run this code.
+
+00:06:59.280 --> 00:07:03.439
+So this is R, one of the three major
+
+00:07:03.440 --> 00:07:05.159
+programming languages for data science.
+
+00:07:05.160 --> 00:07:07.319
+At least, Jupyter is supposed to be
+
+00:07:07.320 --> 00:07:13.479
+a combination of Julia, Python, and R.
+
+00:07:13.480 --> 00:07:17.559
+So we're running mcmc to get the posterior distribution
+
+00:07:17.560 --> 00:07:21.119
+and we're going to plot those out with this pyplots package,
+
+00:07:21.120 --> 00:07:24.079
+and we have these beautiful plots showing the median
+
+00:07:24.080 --> 00:07:27.039
+of the posterior distribution for four variables in –
+
+00:07:27.040 --> 00:07:31.559
+four parameters in the CARS data set,
+
+00:07:31.560 --> 00:07:38.039
+which is available – built into the R package.
+
+00:07:38.040 --> 00:07:45.559
+And then these shaded areas are the 80% interval.
+
+00:07:45.560 --> 00:07:49.159
+Okay. Oops.
+
+NOTE Python
+
+00:07:49.160 --> 00:08:07.639
+So now for the Python side,
+
+00:08:07.640 --> 00:08:13.359
+here's an example in which I'm going to actually
+
+00:08:13.360 --> 00:08:18.679
+insert a snippet of that cell
+
+00:08:18.680 --> 00:08:27.279
+and then I'm going to enter nvlig for nglview ligand,
+
+00:08:27.280 --> 00:08:43.319
+and just hit enter. Oops. Hit TAB, excuse me,
+
+00:08:43.320 --> 00:08:47.999
+and we don't need this line of code, so delete that.
+
+00:08:48.000 --> 00:08:52.199
+Yep, we want to load up this pdb file
+
+00:08:52.200 --> 00:08:54.279
+that's in this subdirectory.
+
+00:08:54.280 --> 00:08:56.919
+So the pdb file is a plain text file
+
+00:08:56.920 --> 00:08:58.839
+that contains atomic coordinates
+
+00:08:58.840 --> 00:09:00.159
+of protein crystal structure.
+
+00:09:00.160 --> 00:09:02.999
+This protein happens to be important in cancer
+
+00:09:03.000 --> 00:09:09.079
+and we have – we screened by docking 55,000 compounds
+
+00:09:09.080 --> 00:09:10.679
+on a supercomputer
+
+00:09:10.680 --> 00:09:12.743
+and then we did MD [molecular dynamics] simulations
+
+00:09:12.744 --> 00:09:14.159
+of the top 10 [actually 20] leads.
+
+00:09:14.160 --> 00:09:18.319
+Twelve of them had the compound remain bound
+
+00:09:18.320 --> 00:09:19.679
+during the period of the simulation,
+
+00:09:19.680 --> 00:09:22.559
+so those have some potential for –
+
+00:09:22.560 --> 00:09:25.159
+and require experimental validation.
+
+00:09:25.160 --> 00:09:28.639
+So we'll run this chunk of code,
+
+00:09:28.640 --> 00:09:30.839
+and this will give a view of the molecule
+
+00:09:30.840 --> 00:09:36.479
+that we can interact with by using the mouse.
+
+00:09:36.480 --> 00:09:39.879
+But I want to share this with my colleague.
+
+00:09:39.880 --> 00:09:42.919
+My colleague is not set up to use Jupyter,
+
+00:09:42.920 --> 00:09:46.959
+but instead we can write this out to a HTML file,
+
+00:09:46.960 --> 00:09:48.319
+which I have loaded up already.
+
+00:09:48.320 --> 00:09:55.319
+And so we can actually – perhaps.
+
+00:09:55.320 --> 00:10:01.679
+We click on these two arrows pointing at each other,
+
+00:10:01.680 --> 00:10:05.159
+and we can get a full screen view of this molecule
+
+00:10:05.160 --> 00:10:10.439
+and he can identify each atom in this structure.
+
+00:10:10.440 --> 00:10:12.719
+Over a thousand atoms present.
+
+00:10:12.720 --> 00:10:14.959
+We're just hovering over a specific atom.
+
+00:10:14.960 --> 00:10:27.759
+So shown in gray is the ligand that is bound. Okay.
+
+00:10:27.760 --> 00:10:32.079
+So we still have this box selected
+
+00:10:32.080 --> 00:10:36.559
+and we still have these two different –
+
+00:10:36.560 --> 00:10:40.519
+so for each of the – our selected text areas
+
+00:10:40.520 --> 00:11:03.839
+we have a separate – we have a separate buffer open. Okay.
+
+NOTE Julia
+
+00:11:03.840 --> 00:11:06.839
+To wrap things up here, here's an example of using –
+
+00:11:06.840 --> 00:11:08.919
+with evolving Julia code.
+
+00:11:08.920 --> 00:11:12.919
+And so this Julia code in this cell is in a Emacs buffer.
+
+00:11:12.920 --> 00:11:19.279
+So you've got an idea now, I think.
+
+00:11:19.280 --> 00:11:23.759
+So in terms of plain text areas like in Overleaf
+
+00:11:23.760 --> 00:11:27.519
+and then these cells in Jupyter Notebooks,
+
+00:11:27.520 --> 00:11:30.959
+these are other areas that can be edited
+
+00:11:30.960 --> 00:11:37.919
+like in the text areas within Outlook Webmail and Gmail.
+
+00:11:37.920 --> 00:11:42.639
+Instead of having to point with the mouse
+
+00:11:42.640 --> 00:11:43.519
+or click with the mouse,
+
+00:11:43.520 --> 00:11:48.079
+one can also use keybindings or keyboard shortcuts.
+
+00:11:48.080 --> 00:11:51.599
+So here are the ones for three major operating systems.
+
+NOTE How does GhostText work?
+
+00:11:51.600 --> 00:11:54.639
+So how does GhostText work?
+
+00:11:54.640 --> 00:11:57.199
+Main thing is you have to open up Emacs
+
+00:11:57.200 --> 00:11:59.679
+and get this Atomic Chrome server running.
+
+00:11:59.680 --> 00:12:03.119
+And then with it up and going,
+
+00:12:03.120 --> 00:12:06.679
+GhostText will be able to – has to be activated
+
+00:12:06.680 --> 00:12:09.639
+and it will find the GhostText server
+
+00:12:09.640 --> 00:12:15.079
+through the localhost port 4001.
+
+00:12:15.080 --> 00:12:19.039
+Put that into the web browser.
+
+00:12:19.040 --> 00:12:21.639
+If you navigate to that port,
+
+00:12:21.640 --> 00:12:23.719
+you'll get output that looks like this
+
+00:12:23.720 --> 00:12:25.639
+if everything's working well.
+
+00:12:25.640 --> 00:12:27.919
+Otherwise, you'll get a error message
+
+00:12:27.920 --> 00:12:30.519
+and it should have a port socket –
+
+00:12:30.520 --> 00:12:34.319
+a web socket port number.
+
+00:12:34.320 --> 00:12:36.319
+It will not be the same every time.
+
+NOTE Supported web browsers
+
+00:12:36.320 --> 00:12:42.319
+So these are the supported web browsers
+
+00:12:42.320 --> 00:12:45.359
+in addition to Chrome. These are supported
+
+00:12:45.360 --> 00:12:47.279
+and likewise anything in these –
+
+00:12:47.280 --> 00:12:49.879
+any browser related to these
+
+00:12:49.880 --> 00:12:53.079
+can probably use these extensions.
+
+00:12:53.080 --> 00:12:56.359
+For example, the Brave browser will use Chrome extension
+
+00:12:56.360 --> 00:13:01.679
+and the Firefox browser extension works with WaterFox.
+
+00:13:01.680 --> 00:13:05.239
+These are the supported editors.
+
+00:13:05.240 --> 00:13:10.199
+Each editor has its own extension
+
+00:13:10.200 --> 00:13:15.719
+and this GhostText was initially developed for SublimeText.
+
+00:13:15.720 --> 00:13:17.919
+So if you have SublimeText,
+
+00:13:17.920 --> 00:13:21.959
+then you can use its smooth operation as positive control
+
+00:13:21.960 --> 00:13:24.999
+when things go wrong with Emacs.
+
+NOTE Atomic Chrome configuration
+
+00:13:25.000 --> 00:13:29.479
+This is Atomic. This is a GitHub site for Atomic Chrome.
+
+00:13:29.480 --> 00:13:33.159
+Atomic Chrome is available for installation through Melpa.
+
+00:13:33.160 --> 00:13:40.319
+This is my configuration for Atomic Chrome.
+
+00:13:40.320 --> 00:13:45.519
+So I have this setup so the server starts whenever I log in,
+
+00:13:45.520 --> 00:13:50.319
+and I have it set up so that default major mode is Python
+
+00:13:50.320 --> 00:13:55.559
+to deal with the Jupyter notebooks and Colab notebooks.
+
+00:13:55.560 --> 00:13:57.719
+And then I have major modes
+
+00:13:57.720 --> 00:13:59.839
+for these other websites defined below.
+
+00:13:59.840 --> 00:14:06.079
+This is a testing site so the developer has made
+
+00:14:06.080 --> 00:14:08.119
+to help with troubleshooting.
+
+00:14:08.120 --> 00:14:11.159
+He also has a protocol on his website
+
+00:14:11.160 --> 00:14:13.559
+to follow during troubleshooting.
+
+NOTE Precautions
+
+00:14:13.560 --> 00:14:16.639
+So here are some precautions.
+
+00:14:16.640 --> 00:14:19.079
+You'll find that GhostText doesn't work with Pluto.
+
+00:14:19.080 --> 00:14:21.239
+Pluto is a new computational notebook
+
+00:14:21.240 --> 00:14:23.479
+for working with Julia.
+
+00:14:23.480 --> 00:14:27.039
+My suggestion would be just to run IJulia in Jupyter.
+
+00:14:27.040 --> 00:14:31.999
+It also doesn't work, of course, with RStudio.
+
+00:14:32.000 --> 00:14:35.199
+Even though RStudio sort of resembles
+
+00:14:35.200 --> 00:14:38.999
+a web page, web browser, it's not.
+
+00:14:39.000 --> 00:14:41.359
+Of course, you can always run R,
+
+00:14:41.360 --> 00:14:48.239
+as you've just seen, using the IPy kernel.
+
+00:14:48.240 --> 00:14:52.239
+I will also caution you that if you use the Emacs server,
+
+00:14:52.240 --> 00:14:53.519
+you may run into issues
+
+00:14:53.520 --> 00:14:57.999
+with the server competing with the port 4001.
+
+00:14:58.000 --> 00:15:01.919
+So instead, you should probably configure the Emacs server
+
+00:15:01.920 --> 00:15:04.999
+to use a specific port.
+
+00:15:05.000 --> 00:15:07.639
+So far – although I haven't done that myself –
+
+00:15:07.640 --> 00:15:10.999
+so far, I haven't found any conflicts
+
+00:15:11.000 --> 00:15:13.479
+with the Org Roam user interface.
+
+NOTE Conclusions
+
+00:15:13.480 --> 00:15:20.919
+So my conclusions are: GhostText allows you to edit prose
+
+00:15:20.920 --> 00:15:24.439
+with your favorite major mode
+
+00:15:24.440 --> 00:15:28.119
+in the text areas of web pages
+
+00:15:28.120 --> 00:15:31.079
+and in the cells of Jupyter notebooks.
+
+00:15:31.080 --> 00:15:34.359
+This allows you to tap into snippets
+
+00:15:34.360 --> 00:15:37.519
+and thereby save time as you have – probably have –
+
+00:15:37.520 --> 00:15:39.719
+hopefully got an idea of.
+
+NOTE Thanks
+
+00:15:39.720 --> 00:15:44.039
+I'd like to thank my friends and mentors
+
+00:15:44.040 --> 00:15:46.599
+who've helped me out during my second year
+
+00:15:46.600 --> 00:15:49.359
+in my Emacs learning spiral.
+
+00:15:49.360 --> 00:15:55.839
+These include my local colleagues.
+
+00:15:55.840 --> 00:15:58.679
+We meet once a month in the Oklahoma Data Science Workshop.
+
+00:15:58.680 --> 00:16:01.719
+Last July, I gave a presentation about GhostText.
+
+00:16:01.720 --> 00:16:08.359
+And then also my friends at Berlin and Austin Emacs meetups
+
+00:16:08.360 --> 00:16:12.959
+and in the UK research software engineer
+
+00:16:12.960 --> 00:16:17.599
+Emacs research Slack channel.
+
+00:16:17.600 --> 00:16:18.919
+So I don't attend these every month,
+
+00:16:18.920 --> 00:16:21.439
+but I try to make the meetings as often as I can.
+
+00:16:21.440 --> 00:16:25.399
+Then I'm supported by the following grants,
+
+00:16:25.400 --> 00:16:28.359
+which allow me to spend
+
+00:16:28.360 --> 00:16:30.679
+at least some time each day in Emacs.
+
+00:16:30.680 --> 00:16:34.960
+I'll be happy to take any questions.