[HN Gopher] Unix as a tool forge and how Emacs fits in Unix phil...
       ___________________________________________________________________
        
       Unix as a tool forge and how Emacs fits in Unix philosophy
        
       Author : ashton314
       Score  : 73 points
       Date   : 2022-11-08 18:53 UTC (4 hours ago)
        
 (HTM) web link (lambdaland.org)
 (TXT) w3m dump (lambdaland.org)
        
       | namaria wrote:
       | I don't think you need to shoehorn every piece of software you
       | like into one worldview. It's OK to like two different things.
       | Contradiction is a fact of nature when discourse is linear but
       | reality is anything but. Unix philosophy was amazing in the 70s,
       | modern linuxes are great work environments now, EMACS is super
       | cool, vim is a great little piece of text editing beauty. One
       | thing is clear tho, Windows users have a severe case of Stockholm
       | syndrome.
        
       | pjmlp wrote:
       | Emacs is a survivor from the days of Lisp Machines, hardly a
       | UNIX.
       | 
       | "Evolution of Emacs Lisp"
       | 
       | https://dl.acm.org/doi/abs/10.1145/3386324
       | 
       | Also the UNIX "philosophy" besides its quote on a book, has been
       | hardly a thing on commercial UNIXes.
        
         | whartung wrote:
         | The funny thing is that I put vi more in the "UNIX Philosophy"
         | camp.
         | 
         | Specifically, as a user of vi, especially with normal vi (vs
         | vim), a routine workflow for me is !command some block of text,
         | or the entire file to some utility or another.
         | 
         | And the idea here is that with little effort, the entirety of
         | the UNIX environment (at least the CLI tools environment) is at
         | my beck and call. I've munged gobs of text through most any
         | utility imaginable. I've use vi as an interactive pipeline.
         | Running data through one sequence, then running it through
         | another, or a 3rd. It's like an interactive pipeline debugger
         | with undo.
         | 
         | It's not that emacs can not do it, of course it can. You can
         | run a region through a shell command as easily as anything.
         | 
         | But, folks don't. Rather they rely on the extensive, emacs
         | universe to solve those problems. There's lisp for that. Like
         | the Java and JavaScript eco-systems, where "everything" gets
         | rewritten into that world, the drive has been to port the
         | essential utilities into the whole of emacs, rather than having
         | it work with the system surrounding it. There's all sorts of
         | good reasons for this, but at the same time, all of those
         | routines and such are cut off from "unix". While its
         | straightforward to leverage grep, sort, awk, et al from within
         | emacs, it's less so the other way around. I'm sure it's
         | possible, but it's not trivial.
         | 
         | In a world of composite solution development, a monolith stands
         | out because it acts more as an unscalable tower rather than a
         | thing to touch for enlightenment.
        
           | anthk wrote:
           | nvi, entr, xargs, awk, sed, perl...
        
           | gw98 wrote:
           | Completely agree with this.
           | 
           | Unix is centred around composing lots of individual tools
           | that do one job well. Emacs is the antithesis of this. It's
           | closer to Visual Studio.
           | 
           | Honestly in the 30 years I've been using Unixes I have never
           | needed anything but vi/vim with a few lines of configuration,
           | mostly to satisfy some of the newer fussier language indent
           | requirements (yaml, python). Most of the non trivial data
           | processing is done with external tools (sed, grep, awk etc)
           | where the knowledge and power is reusable for other tasks
           | external to editing things!
           | 
           | Only on Windows have I had to leverage anything more
           | complicated.
        
             | agumonkey wrote:
             | I think there's strange rotation. Emacs being based on lisp
             | is all about composing lots of individual bits. Unix too.
        
               | gw98 wrote:
               | Indeed. But it's a nested abstraction.
        
           | jrumbut wrote:
           | Exactly, because of bad habits developed elsewhere I
           | sometimes find myself puzzling (as an example) "how do I
           | remove HTML tags in vim?" rather than "how do I remove HTML
           | tags? OK, now do that in vim."
        
           | BlueTemplar wrote:
           | Why vi vs vim ? (I have no experience with vi, only vim.)
        
             | shagie wrote:
             | vim is the improved version of vi, which is the visual
             | interface to ex, which is the extended editor ed... the one
             | true editor ( https://www.gnu.org/fun/jokes/ed-msg.txt )
             | 
             | You will not infrequently find vim and vi links to the same
             | executable.                   /usr/bin % ls -l ex vi vim
             | lrwxr-xr-x  1 root  wheel        3 Aug 24 03:59 ex -> vim
             | lrwxr-xr-x  1 root  wheel        3 Aug 24 03:59 vi -> vim
             | -rwxr-xr-x  1 root  wheel  5155568 Aug 24 03:59 vim
             | 
             | The difference between which way you have argv[0] slightly
             | changes the functionality... but it's the same thing.
             | 
             | ed remains its own thing.                   /bin % ls -l ed
             | -rwxr-xr-x  1 root  wheel  235296 Aug 24 03:59 ed
             | 
             | THE MIGHTY ED HAS SPOKEN!!!
             | 
             | ?
        
             | jrumbut wrote:
             | In vim there are a lot of emacs-like plug-ins that
             | reimplement functionality found elsewhere.
             | 
             | You can still use the vi style workflow though.
        
         | anthk wrote:
         | I was about to say that. Emacs not just the LISP machines.
         | Emacs' comes from ITS, an OS praised by RMS, basically the
         | anithesis of Unix. Everything was hackable and shareable. No
         | perms.
         | 
         | The closest in philosophy may be Guix(SD), but, for that, the
         | Unix utilities should be converted into optional tools and make
         | Scheme both the command line prompt shell, the configuration
         | tool and the API.
        
           | thrown_22 wrote:
           | I've ran chsh on top of a (virtual) Guix(SD) installation. It
           | was rather nice but is still _not_ a lisp machine:
           | https://www.youtube.com/watch?v=o4-YnLpLgtk
        
         | AnimalMuppet wrote:
         | > Emacs is a survivor from the days of Lisp Machines, hardly a
         | UNIX.
         | 
         | So? Did the author claim otherwise? Not that I could see. Does
         | the OS of origin negate any of the author's claims about Emacs?
         | No, it doesn't. Emacs on Unix gave the author a tool that fit
         | their workflow and their mindset. Who cares what OS it
         | originated on?
         | 
         | > Also the UNIX "philosophy" besides its quote on a book, has
         | been hardly a thing on commercial UNIXes.
         | 
         | The UNIX philosophy, as quoted by the author, was supported by
         | every commercial OS I have ever seen. (They added some other
         | stuff, but they all provided the environment where the
         | philosophy could play out well.)
        
           | pjmlp wrote:
           | Given the architecture of commercial UNIXes, and the plethora
           | of options in every command, hardly.
        
           | anthk wrote:
           | No. Emacs' a huge REPL with zillions of ELISP modules for
           | lots of cases.
           | 
           | Emacs and its grandpa ITS (and Emacs for ITS) are very
           | different beasts.
           | 
           | Get SIMH and emulate ITS on it.
           | https://gunkies.org/wiki/Installing_ITS_on_SIMH
        
       | ok_dad wrote:
       | I use VSCode right now, with lots of little extensions to do
       | stuff like lint my code, format my code, color my code, highlight
       | TODO and FIXME comments, 3-way merges, debugging with conditional
       | breakpoints and watches and stuff, etc.
       | 
       | How do I get started using Emacs, if I wanted to use this
       | awesome-sounding tool, while still being friendly to the fact
       | that I have to get stuff done and still need the tools I
       | mentioned above? (Also, how to have my cake and eat it, too.) I
       | am sure the Emacs community has built everything under the sun,
       | but is it as easy to setup and easy to find as VSCode?
       | 
       | I really want to know how I can transition from using VSCode to
       | Emacs, because I'm starting to realize that VSCode is always
       | going to be a "product" of a BigCo and will continue to add anti-
       | features, tracking, and other stuff that I don't want. I'm also
       | starting to realize that I want to be a bit more strict about my
       | open source software usage, and try to support communities rather
       | than coprorations.
        
         | gropius wrote:
         | Don't forget to check out the MELPA (melpa.org) repository,
         | which has a staggering array of packages for Emacs. If people
         | do something on computers, chances are someone does it in Emacs
         | and there's a package on MELPA to support it.
         | 
         | Also, the road to Emacs proficiency will be a journey, and
         | you'll want to think about Emacs as something you'll gradually
         | tinker with and tweak to get to a set up and understanding that
         | is satisfying. It's not shiny nor whiz-bang by any means, but
         | path through the learning curve can be extremely rewarding.
        
           | ok_dad wrote:
           | Thanks for that link, very useful for me to be able to find
           | that stuff in one place. I want to treat my software
           | development more like I do with physical hobbies and start to
           | learn to use advanced-yet-powerful tools that are well-made.
           | VSCode is perfectly fine, but I see it as something that
           | won't last long in one form, constantly changing things for
           | the flavor of the year tech.
        
         | vinceguidry wrote:
         | I found the ebook Mastering Emacs, and the accompanying blog to
         | be extremely useful, even after going through both Spacemacs
         | and Doom Emacs. I may go back to a modal workflow in the
         | future, but for now I'm embracing Emacs' built-in ways of doing
         | things, with a few exceptions.
         | 
         | http://www.masteringemacs.org
         | 
         | You may balk at the $50 pricing, but it gives the most complete
         | picture of how Emacs works than anything else.
        
         | vincent-manis wrote:
         | To get started with Emacs: (1) install it, either from a
         | package repository or from www.gnu.org/software/emacs; (2)
         | start it up (3) type Control-H t to run the tutorial. Those new
         | to Emacs might prefer to use a customized distribution such as
         | Doom Emacs, but the official Emacs system is quite usable.
         | Don't expect to become an Emacs Master quickly, but doing these
         | 3 steps will get you to the point where you can use Emacs for
         | basic text editing. Emacs comes with lots of documentation,
         | both on the core system and on the many packages it includes,
         | but you can defer reading it until you are comfortable with the
         | basics.
         | 
         | The two hurdles you'll need to overcome are: (1) the antique
         | terminology, so "window" doesn't mean what you might expect it
         | to, and (2) the key bindings, which don't match up with more
         | modern systems. (1) is something you just have to get used to,
         | while (2) is infinitely flexible. A vi user might prefer Doom
         | Emacs or Spacemacs, which come with vi-compatible key-bindings;
         | I'm not aware of something similar for the VSCode user. As you
         | become more comfortable with Emacs, you will be able to make
         | your own key bindings.
        
           | ok_dad wrote:
           | Thanks! That actually is what I found in the past, that (1)
           | is hard to get through in order to setup an environment with
           | the cool tools I want to use, and (2) is hard because I'm
           | used to VSCode bindings. I think this time, though, I'm going
           | to stage my use of Emacs because you gave me a good idea:
           | 
           | > doing these 3 steps will get you to the point where you can
           | use Emacs for _basic text editing_
           | 
           | So, I'm going to replace my use of VSCode for text editing
           | with Emacs for a while to start learning how to work with it,
           | just not code stuff yet, and I'll replace my keybindings in
           | VSCode with Emacs keybindings since VSCode is super easy to
           | find extensions for and there happens to be a few "Emacs
           | keybinding" extensions.
           | 
           | Thanks for the tips, I also didn't know about `Ctrl+H t` and
           | so I'll try that out, too!
           | 
           | I'm actually pretty excited, I've had a ton of issues with
           | VSCode updating the way they do things recently causing my
           | workflows to get fucked up and have to change. I doubt I'll
           | have that issue with Emacs!
        
             | G3rn0ti wrote:
             | Before you actually dive into coding in Emacs may I suggest
             | to do the following:
             | 
             | 1) Get yourself a copy of https://www.masteringemacs.org/
             | and read it. That gives you a very good overview on the
             | design philosophy of Emacs and many practical tips.
             | 
             | 2) Explore vanilla Emacs a little bit. Run the built-in
             | tutorial. Explore Emacs's customization UI. Play tetris.
             | 
             | 3) Familiarize yourself with how you install Emacs packages
             | from ELPA and MELPA. On your first steps you can use Emacs'
             | built-in UI. But, ideally, you want to learn "use-
             | package.el" as quickly as possible because that will
             | simplify your configuration _a lot_.
             | 
             | Coming from VScode you might feel a little bit overwhelmed
             | at this point as you will be starting to use a Lisp macro
             | routinely (!) to install editor extensions. Check out the
             | "Emacs from scratch" series on YouTube for a helpful guide.
             | 
             | 4) What programming languages are you using? For React
             | projects you might need to use "webmode.el" which is not
             | built-in. Similar situation with Clojure or Rust. If you
             | want more convenience, you also might want to take a look
             | on "lsp-mode.el" that adds more code introspection
             | features. It is not crazily complicated to install and
             | setup but definitely not beginner friendly.
             | 
             | 5) Try to identify your most important extensions you are
             | using right now in VScode. What are the features you cannot
             | live without? Then embark on a google search what the most
             | suitable replacements are in Emacs. For example, VSCode's
             | "Restclient" extensions is paralleled by Emacs'
             | "restclient.el" and it works quite well (if you use it
             | together with "restclient-jq.el" that is).
             | 
             | 6) For your dev work flow, checkout Emacs' built-in
             | "compile-mode" (C-l) -- you can paste any shell command in
             | there that will compile your code, run tests or synchronize
             | with a remote dev server (everything that goes inside a
             | bash script). Line errors will be clickable in the output
             | window and help you jump in the offending code line. It's
             | simple and effective. This will make you stop using the
             | shell too often.
             | 
             | 7) I recommend installing "which-key.el" which makes Emacs'
             | display a cheat sheet of possible keyboard combos upon
             | hitting control keys (after some delay). This way you'll
             | learn keyboard commands more quickly.
             | 
             | 8) However, don't let anyone tell you what the right way of
             | using Emacs is. If you find the mouse menus convenient, by
             | all means use them and don't listen to people who turn off
             | the menu bar. (I even added a custom menu for Emacs modes I
             | happen to use sometimes but not everyday.) Use CUA mode if
             | you are used to "C-c C-v". Don't use the terminal version
             | of Emacs. Ignore the extremists. However, definitely check
             | out "magit.el" for version control.
        
             | gumby wrote:
             | The GP gave great advice that, in light of your response,
             | I'll augment.
             | 
             | 1 - Sometimes the worst helpers are the enthusiastic fans,
             | not just with bands but with software. Most emacs advice
             | starts by talking about customization. The GP was smart not
             | to: just get comfortable with the model of emacs: a
             | modeless editor. c-f goes forward a character, m-f a word.
             | In code: c-f forward a character, m-f a symbol, c-m-f a
             | structure (depends on the language).
             | 
             | You can always type c-H (^H) at any time for help. It's
             | context-sensitive so if you're typing a long command (m-x
             | find file) it will show you the completions. If you can't
             | remember a command c-H a (apropos) will show you matches.
             | etc. All explained when you start with c-H t
             | 
             | All of the stuff above has been true for more than 40
             | years. A lot of rough edges have been knocked off over that
             | time! Even back then people who claimed that they "couldn't
             | do anything with a computer" were writing documents with
             | Emacs, even writing macros and such.
             | 
             | For more modern times: you'll find in most programming
             | languages, markdown, etc syntax highlighting is automatic.
             | 
             | Once you are comfortable editing text or code, you can see
             | how to add, say, LSP support, or investigating how to
             | compile your code and why that's easier in Emacs, and just
             | incrementally make your environment more comfortable and
             | powerful. I've been using Emacs since 1978 (when it was
             | written in TECO, not a form of Lisp) and still I learn
             | something new every week or so.
             | 
             | Remember that "EMACS" stands for "Emacs Makes All Computing
             | Simple"
        
         | kagevf wrote:
         | I second the suggestion to start off with org mode. You get a
         | low stakes note taking utility to use while getting comfortable
         | with emacs. From there spread out to learn other features at
         | your own pace.
        
         | dbtc wrote:
         | Treat it like a game for a while. Don't even try to be
         | productive, just play with it and see how the pieces fit
         | together.
        
           | namaria wrote:
           | That's pretty much my whole approach to life
        
             | ok_dad wrote:
             | I totally get that, I've recently started on a toy
             | programming project that has literally no purpose other
             | than to play around, and it's great! It's such a breath of
             | fresh air instead of working on actual _work_.
        
               | namaria wrote:
               | Beats stressing out about imaginary money on a race to
               | kill the planet.
        
         | allarm wrote:
         | Not exactly what you're asking for, but check some articles and
         | videos about org-mode. There's a chance you'll get hooked on it
         | and the following learning will be much easier because damn,
         | it's worth all the pain. Well, at least that was my case.
        
         | Lownin wrote:
         | The way I did it was by not using it for my entire workflow
         | right away. The trojan horse for me was org-mode. Doom Emacs
         | got me started in what felt to be a more modern UX, and I used
         | org-mode not for coding outright, but for note taking and
         | personal project management. After a while, I started to use
         | org-mode's built in ability to run code via org-babel to
         | experiment with ideas in code. Eventually I was comfortable
         | enough that I just started using it to code some times instead
         | of VS Code, because I was already there. I still dual-use VS
         | Code and Emacs because VS Code is still better at some things
         | (working with files on remote server is still kinda slow via
         | TRAMP some times) but I'm about 85% in Emacs now, since I like
         | it better for text traversal, org-mode has become more
         | integrated into my workflow with things like tangle, and I like
         | magit better than VS Code's built-in git interface.
        
         | kuehle wrote:
         | I moved from VSCode to Emacs with the help of Doom Emacs. You
         | can check it out online. It's a distribution and configuration
         | management solution.
         | 
         | Generally people like to recommend writing your config from
         | scratch but that didn't work for me.
         | 
         | It comes with pretty much all you requested out of the box.
         | 
         | One thing I liked more than with the default Emacs setup is
         | that I could "activate" support for a Language just by un-
         | commenting a line in the well organized config.
        
           | Quekid5 wrote:
           | Seconded, Doom Emacs is _such_ a huge QoL improvement over
           | the DYI solution with a basic Emacs.
           | 
           | (I did use the upstream vanilla Emacs, but the pain of LSP
           | support, etc. etc. was just too much until I tried Doom
           | Emacs... and suddenly Emacs is usable again!)
        
           | ok_dad wrote:
           | Ooh, thanks! That sounds like something that will help me. I
           | tend to do better when I can get something running like
           | someone else has done in the past, then slowly tweak things
           | as I learn more about it. My current VSCode setup and all my
           | dotfiles have been slowly cribbed and edited from various
           | sources who knew more than me about those things.
        
         | comfypotato wrote:
         | Picking eMacs up as a replacement for VSCode while having to
         | get stuff done is risky. I would venture to say that it's not
         | realistic as far as your conceptualization. I say this because
         | you venture to ask if the setup process is similar. The answer
         | is a resounding no. VSCode is incredibly easy to "get
         | productive" and eMacs is on the other end of the spectrum.
         | 
         | That being said, if you can work some time into your schedule
         | to learn eMacs, your goal can be realized. (Also, it's totally
         | worth it.) I was a VSCode user and made some time to learn
         | eMacs exclusively for org mode (possibly eMacs's coolest
         | feature). Once I was comfortable, I just played around with a
         | dev environment in eMacs (for fun) and loved it so much that I
         | left VSCode.
        
           | ok_dad wrote:
           | Thanks for a realistic view! I'm trying out Doom Emacs, per
           | another user's suggestion, and I'm going to try it out for
           | non-code text editing for a while, since I do a lot of that
           | still anyways.
        
             | comfypotato wrote:
             | That sounds like a great approach!
             | 
             | I think some of the magic stems from ubiquitous conventions
             | regarding bindings throughout eMacs. If you use evil mode,
             | the conventions become a little murkier. I'd recommend
             | sticking with the vanilla bindings (I haven't used Doom, so
             | I'm not actually sure if evil mode is default). This is
             | just my two cents. Doom will be a great introduction either
             | way.
        
       | jrm4 wrote:
       | This is an incredibly underutilized idea. It still feels like
       | there's ample room for interoperability in the realm of "I write
       | a short piece of code for someone I'm working with, and then they
       | take it and use it for something else" in a way that could be
       | very specific to one project.
       | 
       | I'd venture to say that essentially no one thinks like this, but
       | there's no good reason they shouldn't?
        
       | dale_glass wrote:
       | That's great, but I think sometimes "Unix Philosophy" looks too
       | much like a religion.
       | 
       | Programs are tools, and if they do the work they need to do, who
       | cares if they comply with some ancient ideal or not? Yes,
       | certainly composability is a worthy feature to have if it fits,
       | but sometimes it's not there and nobody cares because the tool
       | still does the job.
       | 
       | I'm also of the view of that the ideal might be almost obsolete
       | in its original form. Yeah, "grep | awk | sort | uniq" style
       | chains are neat and all, but in modern times they're actually
       | quite inflexible. Modern data is likely to have a complex
       | structure many of those tools are ill-equipped to deal with. Most
       | any time I write anything of even slight complexity, I end up
       | doing it in Perl or Python, and it works almost exactly the way
       | the same code under Windows would.
       | 
       | I've also got to admit that Microsoft got a leg up here with
       | PowerShell, because rather than holding up to tradition from the
       | 70s, they applied new modern thought to the problem and came up
       | with something better. I think it's unfortunate that Linux has
       | acquired a considerable amount of traditionalism, because that
       | risks making it slow to adapt and improve.
        
       | BeetleB wrote:
       | The article doesn't really do justice to the composability - it
       | provides little to no examples. So I'll try to provide some:
       | 
       | Emacs has a lot of functionality on displaying email, handling
       | attachments, etc. This made it almost trivial for notmuch[1] to
       | make a frontend for their tool. If you think about it, notmuch is
       | merely a stand alone _indexer_. But they quickly made a full
       | blown email client in Emacs revolving around notmuch by borrowing
       | most of the functionality from packages like Gnus, etc.
       | 
       | magit has a neat menu based interface. Now many other packages
       | make use of its interface even though they have nothing to do
       | with git.
       | 
       | There are multiple completion frameworks, and it's always
       | gratifying to utilize one of them for your own needs. As an
       | example, I wanted to keep a directory of contacts. I used org-
       | roam to create a node for each contact, and freely put any
       | information I wanted in there (notes about the person, etc).
       | However, I sometimes keep meeting minutes at work (in org mode)
       | and whenever I mention a person, I want a link to his/her contact
       | page. So I hacked up some elisp functions to:
       | 
       | 1. Insert a new person (and return a link to him/her)
       | 
       | 2. Select an existing person (this is where using a completion
       | framework comes in).
       | 
       | Think of all the different pieces I used:
       | 
       | 1. Org mode
       | 
       | 2. Org-roam
       | 
       | 3. A completion framework like vertico to show me _only_ nodes
       | that are people, and not all my notes nodes.
       | 
       | 4. Calendar functionality to specify times/dates (really I'm
       | using the functionality in org mode, which builds on the Emacs
       | calendar functionality).
       | 
       | Basically I built a minutes taking tool + contacts management by
       | using various components of packages. It was not a lot of code -
       | perhaps 1-2 screenfuls.
       | 
       | I once had a directory with a lot of video files. I wanted to
       | share some with friends, but needed to go through each one to
       | decide if it's relevant to them. I wrote some simple elisp that,
       | within dired (Emac's file manager), when I hit Enter on an mp4
       | file, would play the file using mplayer. If I wanted to share it,
       | with another keybinding, it would put a link to the file in a
       | particular org document.
       | 
       | This is a typical example, of utilizing several different Emacs
       | packages to achieve a custom task.
       | 
       | [1] https://notmuchmail.org/
        
       | DonHopkins wrote:
       | This document describes UniPress Emacs 2.20, the Unix version
       | written in C by James Gosling and distributed by UniPress (who
       | RMS referrers to as "Evil Software Hoarders"), based on the
       | MockLisp extension language. Version 2.20 included multi-window
       | support for SunView, X-Windows, and the NeWS window system. The
       | document goes on to describe the future plans for SoftWire (a
       | networked PostScript interpreter like NeWS but for managing text
       | file and streams and sub-processes instead of drawing graphics),
       | which UniPress developed but by never released.
       | 
       | UniPress Emacs Newsletter, February 1988: What is Emacs?
       | 
       | https://www.donhopkins.com/home/ties/scans/WhatIsEmacs.pdf
        
       | ashton314 wrote:
       | Hi all, author here.
       | 
       | Thanks for all the comments. I was not expecting to get on the
       | front page with this little thought I had in the shower this
       | weekend!
       | 
       | Someone reached out to me with the following links, and I thought
       | they'd be good to share:
       | 
       | - https://amodernist.com/texts/emacs-unix.html
       | 
       | - https://protesilaos.com/codelog/2021-09-22-live-stream-emacs...
       | 
       | - https://tilde.town/~ramin_hal9001/articles/emacs-fulfills-th...
       | 
       | I haven't watched the video by Prot yet, but I felt like these
       | all belonged here to add to the conversation.
        
       ___________________________________________________________________
       (page generated 2022-11-08 23:00 UTC)