- [MUSIC PLAYING] -
- [MUSIC PLAYING] +NOTE Introduction
- And so this little application-- +And so this little application--
- well, I'll skip that and just kind of jump right +00:00:42.480 --> 00:00:42.503 +well, I'll skip that and just kind of
- into my thesis for those of you that +00:00:42.504 --> 00:00:49.142 +jump right into my thesis for those of you
- might be planning to duck out for the RMS talk, +00:00:49.143 --> 00:00:53.360 +that might be planning to duck out for the RMS talk,
- starting in a little bit. +starting in a little bit.
- So essentially, my thesis here is really +00:00:55.520 --> 00:00:55.545 +So essentially, my thesis here is really that
- that the Emacs toolchain can easily +00:00:55.546 --> 00:00:59.378 +the Emacs toolchain can easily be combined
- be combined with other skills and used in kind of a Unix +00:00:59.379 --> 00:01:08.793 +with other skills and used in kind of
- paradigm of having sort of different tools +00:01:08.794 --> 00:01:13.280 +a Unix paradigm of having sort of different tools
- to do different steps. +to do different steps.
- We might actually use the same tool +We might actually use the same tool
- to implement a couple of steps. +to implement a couple of steps.
- But with that paradigm, each step +But with that paradigm, each step
- is an individual item that can be sort of dropped in +00:01:22.080 --> 00:01:22.086 +is an individual item that can be sort of
- and replaced. +00:01:22.087 --> 00:01:26.400 +dropped in and replaced.
- So over the course of the talk, hopefully I'll +00:01:26.400 --> 00:01:26.420 +So over the course of the talk,
- come back to that thesis. +00:01:26.421 --> 00:01:31.080 +hopefully I'll come back to that thesis.
- But I'll now jump back and start walking through what is +NOTE What is orgvm?
- orgvm? +00:01:31.080 --> 00:01:31.086 +But I'll now jump back and start walking through
- So this is a very simple proof of concept program. +00:01:31.087 --> 00:01:37.040 +what is orgvm?
- We'll just jump over to perhaps a prettier view of the +00:01:37.040 --> 00:01:39.560 +So this is a very simple proof of concept program.
- source +00:01:39.560 --> 00:01:39.586 +We'll just jump over to perhaps
- code for it. +00:01:39.587 --> 00:01:45.520 +a prettier view of the source code for it.
- This is implemented-- oops. +This is implemented-- oops.
- There's some cruft, I think, in my local. +There's some cruft, I think, in my local.
- All right, so there's config block at the top. +All right, so this config block at the top...
- And we'll be jumping back and forth +And we'll be jumping back and forth
- between the code and the documentation. +between the code and the documentation. + +NOTE Nodejs
- So the first thing I want to point out +So the first thing I want to point out
- is that this is written in Node.js. +is that this is written in Node.js,
- But I think you'll find it'd be pretty trivial to implement +but I think you'll find it'd be pretty trivial to implement
- in any language. +in any language.
- Certainly, you're more than welcome to use this. +Certainly, you're more than welcome to use this.
- I'd be happy to accept your patches or feature requests +I'd be happy to accept your patches or feature requests
- and things like that. +and things like that.
- Of course, bug reports. +Of course, bug reports.
- But I'd also encourage others to roll their own. +But I'd also encourage others to roll their own.
- You might well come up with a different version of this +You might well come up with a different version of this
- that's even cooler. +that's even cooler.
- And we can learn from each other. +And we can learn from each other.
- If you heard one of my talks before, +If you heard one of my talks before,
- you probably recognize a common theme. +you probably recognize a common theme.
- I'm a big fan of head-first development +I'm a big fan of head-first development
- as a way to get invested in both the tool chain and a +00:02:40.320 --> 00:02:40.336 +as a way to get invested in both
- culture. +00:02:40.337 --> 00:02:44.120 +the tool chain and a culture.
- All right, so let's come back to orgvm. +All right, so let's come back to orgvm. + +NOTE The itch I was trying to scratch
- First of all, we'll start with the itch I was trying to +00:02:49.560 --> 00:02:49.586 +First of all, we'll start with
- scratch. +00:02:49.587 --> 00:02:52.840 +the itch I was trying to scratch.
- I wanted to be able to quickly use a web browser +I wanted to be able to quickly use a web browser
- to browse my org documents. +to browse my Org documents.
- It's particularly handy when the documents are full of +00:03:00.680 --> 00:03:01.420 +It's particularly handy when the documents
- cross -
- links to each other. +00:03:01.421 --> 00:03:05.640 +are full of cross links to each other.
- That meant I wanted to automatically export, +That meant I wanted to automatically export,
- particularly to HTML. +particularly to HTML.
- But it made sense for me to include Markdown, PDF, +But it made sense for me to include Markdown, PDF,
- or whatever format I want. +or whatever format I want.
- Because many times, I'm going to look at that file +Because many times, I'm going to look at that file
- and then pop it into an email or upload it somewhere. +and then pop it into an email or upload it somewhere.
- And then finally, it should be, therefore, +And then finally, it should be, therefore, + +00:03:33.240 --> 00:03:33.753 +pretty easy to download the document
- pretty easy to download the document rather than view it +00:03:33.754 --> 00:03:38.320 +rather than view it, once I'm done.
- once I'm done. +NOTE Demo
- So let's just run a quick demo. +So let's just run a quick demo.
- You'll see I'm still a Windows user. +You'll see I'm still a Windows user.
- Yeah, I'm working on it. +Yeah, I'm working on it.
- So all right, first thing that we're going to do +So all right, first thing that we're going to do
- is fire up the program. +is fire up the program.
- Actually, for simplicity, let's just +Actually, for simplicity, let's just
- admit we live in a DOS world. +admit we live in a DOS world.
- And as you can see, there's not much to it +And as you can see, there's not much to it
- to get the application running. -
+to get the application running.
- So with that done, then, I can run out to my local host. +So with that done, then, I can run out to my localhost.
- And we'll just start by plugging in the name of an org file -
-. +And we'll just start by plugging in the name of an Org file.
- So I've got a little org file that I prepared that just +00:04:37.560 --> 00:04:37.586 +So I've got a little Org file that I prepared
- kind -
- of provides a proof of concept to this. +00:04:37.587 --> 00:04:49.040 +that just kind of provides a proof of concept to this.
- And you can see, as imagined, we're automatically +And you can see, as imagined, we're automatically
- turning that org file. +turning that Org file...
- Let's just take a quick look at it. +Let's just take a quick look at it.
- And here's that file now. +And here's that file now.
- But you can see nothing up my sleeve. +You can see, nothing up my sleeve.
- This is a very basic org file that I +00:05:11.960 --> 00:05:11.961 +This is a very basic Org file
- use for testing this program. +00:05:11.962 --> 00:05:16.560 +that I use for testing this program.
- Images work. +Images work.
- We've got some nicely syntax highlighted code +00:05:17.640 --> 00:05:21.836 +We've got some nicely syntax-highlighted code blocks
- blocks in a couple different languages. +00:05:21.837 --> 00:05:25.560 +in a couple different languages,
- And not really that much going on there. +and not really that much going on there. + +NOTE Needs a relatively recent version of Emacs
- All right, let's come back to the documentation. +All right, let's come back to the documentation.
- I pretty well covered this, I think. +I pretty well covered this, I think.
- But you'll need a relatively recent version of Emacs. +But you'll need a relatively recent version of Emacs.
- I haven't taken any pains to make this backward compatible. +I haven't taken any pains to make this backward compatible.
- To be fair, I haven't tested it extensively. +To be fair, I haven't tested it extensively.
- It may well work on Emacs 26 or older versions. +It may well work on Emacs 26 or older versions.
- I'm personally running 27.1 and 28, +I'm personally running 27.1 and 28,
- as well as recent builds of 29. +as well as recent builds of 29.
- There's some quick start instructions here, +There's some quick start instructions here,
- which I'm going to take as read. +which I'm going to take as read.
- You probably saw the key element of this, which +00:06:03.900 --> 00:06:08.600 +You probably saw the key element of this,
- involves starting the program. +00:06:08.601 --> 00:06:11.920 +which involves starting the program.
- You do-- I will call out Yale. +You do-- I will call out Yale.
- If you're trying to play with this yourself, +If you're trying to play with this yourself,
- don't forget to run the npm install command. +don't forget to run the npm install command. + +00:06:20.080 --> 00:06:20.086 +That'll bring in express.js,
- That'll bring in express.js, which the JavaScript we're +00:06:20.087 --> 00:06:24.920 +which the JavaScript we're about to look at is built on.
- about to look at is built on. +NOTE Usage patterns
- So let's just take a look at the usage patterns real quick. +So let's just take a look at the usage patterns real quick.
- To use this, we're simply giving the document name +To use this, we're simply giving the document name
- without the org extension in whatever file path-- +without the .org extension in whatever file path--
- or I'm sorry, whatever we've configured the server +or I'm sorry, whatever we've configured the server
- to run on, in this case, port 3000. +to run on, in this case, port 3000.
- I also want to call attention to the fact +I also want to call attention to the fact
- that nothing in this program protects you +that nothing in this program protects you
- from damaging yourself. +from damaging yourself.
- This isn't meant as a production capability. +This isn't meant as a production capability.
- This is something that's used to publish your own note +00:07:00.560 --> 00:07:00.586 +This is something that's used to publish
- files +00:07:00.587 --> 00:07:04.840 +your own note files
- and roll them up to yourself. +and roll them out to yourself.
- That's something I'll definitely look at adding, +That's something I'll definitely look at adding,
- but I want people to be careful of it +but I want people to be careful of it
- while this is in an alpha state. +while this is in an alpha state.
- So the default response is HTML, and we saw that here. +So the default response is HTML, and we saw that here.
- But we also can modify the response format. +But we also can modify the response format.
- We're currently supporting HTML, Markdown, and PDF. +We're currently supporting HTML, Markdown, and PDF.
- And that's really enough to select a different format. -
- That's really nothing more than adding-- -
- [AUDIO OUT] +And that's really enough to select a different format.
- --type, OK. +00:07:34.280 --> 00:07:48.040 +That's really nothing more than adding type. Okay.
- Not sure what's going on there. +Not sure what's going on there.
- OK, well, there goes my demo. +Okay, well, there goes my demo.
- Shows me for doing my talk live. +Shows me for doing my talk live.
- But this, fortunately, this error message +But this, fortunately, this error message
- is a nice segue to the part of the talk +is a nice segue to the part of the talk
- that I'd really like to focus on, +that I'd really like to focus on,
- hopefully bringing me back to that thesis. +hopefully bringing me back to that thesis. + +NOTE Emacs Lisp
- So as we start to look at code, what we're looking for +So as we start to look at code, what we're looking for
- is really this Emacs Lisp that's getting generated here. +is really this Emacs Lisp that's getting generated here.
- And you'll notice that's the stuff +And you'll notice that's the stuff
- I thought was important to produce as diagnostics +I thought was important to produce as diagnostics
- for the programs running as well. +for the programs running as well.
- So spoiler, this e-lisp is dynamically +So, spoiler, this Elisp is dynamically
- generated by the program. +generated by the program.
- And that's really the core of the way +And that's really the core of the way
- org VM or my org VM works. +orgvm or my orgvm works.
- So this should look pretty similar to the view of the code +So this should look pretty similar to the view of the code
- we had a moment ago. +we had a moment ago.
- You can see I've got some bases. +You can see I've got some bases.
- This is all hard-coded into the program, +This is all hard-coded into the program,
- nothing fancy going on here. +nothing fancy going on here.
- The debug is simply controlling that diagnostic output +The debug is simply controlling that diagnostic output
- that we looked at. +that we looked at.
- There's some other, hopefully fairly self-explanatory +There's some other, hopefully fairly self-explanatory
- programs or properties, where to find Emacs and so forth. +programs or properties, where to find Emacs and so forth. + +NOTE Variables
- And then finally, we come in to the meat of it, +And then finally, we come in to the meat of it,
- the variables that are used to control what e-lisp we +00:09:16.320 --> 00:09:16.336 +the variables that are used to control what Elisp
- can generate dynamically. +00:09:16.337 --> 00:09:24.280 +we can generate dynamically.
- So here, we're controlling the extension +So here, we're controlling the extension
- that it should look for org files. +that it should look for Org files.
- Hopefully not too many people out there +Hopefully not too many people out there
- with a weird extension for the org files, +with a weird extension for the Org files,
- but this should support that. +but this should support that.
- I'm afraid that is something I've been known to do. +I'm afraid that is something I've been known to do.
- Then we define a list of additional export types. +Then we define a list of additional export types.
- Here's one that ought to work. +Here's one that ought to work.
- Let's take a look at type equals org. -
+Let's take a look at type=org.
- And, aha, it's giving us the file. +And, aha, it's giving us the file.
- So I'm not going to open that up, +So I'm not going to open that up,
- but now we can see that that's definitely +00:10:00.680 --> 00:10:02.420 +but now we can see that that's definitely working,
- working for certain versions of working. +00:10:02.421 --> 00:10:09.200 +for certain versions of working.
- So this list of type parameters is +So this list of type parameters is
- controlling the supported types. +controlling the supported types.
- Hopefully it should be fairly easy to add in different ones -
-. +Hopefully it should be fairly easy to add in different ones.
- The fancy footwork here is just a list +The fancy footwork here is just a list
- of the types that we're going to be using. +of the types that we're going to be using.
- The fancy footwork here involves, first of all, +The fancy footwork here involves, first of all,
- there's the extension and the MIME type. +there's the extension and the MIME type.
- That's, as you might guess, used to control the response +00:10:32.240 --> 00:10:32.253 +That's, as you might guess, used to control
- content +00:10:32.254 --> 00:10:38.720 +the response content type.
- type. +NOTE Replace
- We also have this replace variable. +We also have this replace variable.
- This prevents-- there's an optimization +This prevents-- there's an optimization
- to send an existing PDF or HTML file if that's already +00:10:44.000 --> 00:10:48.836 +to send an existing PDF or HTML file
- there, but only if the original source org file hasn't +00:10:48.837 --> 00:10:50.463 +if that's already there,
- been modified since. +00:10:50.464 --> 00:10:51.003 +but only if the original source Org file + +00:10:51.004 --> 00:10:56.240 +hasn't been modified since.
- This replace effectively can turn that off. +This `replace` effectively can turn that off.
- If I remove the replace equals true attribute, +If I remove the `replace: true` attribute,
- then I'll be prevented from overwriting that. +then I'll be prevented from overwriting that.
- In other words, I'll always send a cached version. -
- That might be helpful if, for example, you've +In other words, I'll always send a cached version.
- got hand-tuned PDFs and you don't want to accidentally +00:11:10.320 --> 00:11:13.878 +That might be helpful if, for example,
- overwrite them. +00:11:13.879 --> 00:11:15.065 +you've got hand-tuned PDFs
+00:11:15.066 --> 00:11:17.200 +and you don't want to accidentally overwrite them. +NOTE Getting into the code some more
- All right, let's get into the code a little bit more. +All right, let's get into the code a little bit more.
- I'm going to skip past the really good stuff +I'm going to skip past the really good stuff
- and jump into the boring parts so that we have them +00:11:28.280 --> 00:11:28.295 +and jump into the boring parts
- as context. +00:11:28.296 --> 00:11:34.240 +so that we have them as context.
- Here's the default path. +Here's the default path.
- And it is going to send me the readme from the project-- +And it is going to send me the readme from the project--
- from the project repo if I don't specify a path. +from the project repo if I don't specify a path.
- And then we have a couple of different endpoints +And then we have a couple of different endpoints
- that we support. +that we support.
- We'll come back to this first one. +We'll come back to this first one.
- For now, let's start with the more normal one, which +00:11:55.560 --> 00:11:55.586 +For now, let's start with the more normal one,
- is just giving us a file name. +00:11:55.587 --> 00:12:01.760 +which is just giving us a file name.
- So we can see we start by figuring out +So we can see we start by figuring out
- what the physical file name should be called. +what the physical file name should be called.
- And assuming that that exists-- +And assuming that that exists--
- sorry, I've confused myself. +sorry, I've confused myself.
- So this is the caching or the optimization +So this is the caching or the optimization
- that I mentioned, sending the existing file. +that I mentioned, sending the existing file.
- This file exists is where the optimization is +This file exists is where the optimization is
- that regenerates the file if the source +that regenerates the file if the source
- or document for the HTML generator has changed. +or document for the HTML generator has changed.
- Again, this is a short talk, so I'm not +Again, this is a short talk, so I'm not
- going to go into all the nuances of this JavaScript code. +going to go into all the nuances of this JavaScript code.
- It's pretty far from an Emacs-related thing. +It's pretty far from an Emacs-related thing.
- So with that said, then, the rest of this program +So with that said, then, the rest of this program
- is really mostly just handling the different error. +is really mostly just handling the different errors:
- I didn't understand that type. +"I didn't understand that type."
- I don't know the document. +"I don't know the document."
- I failed. +"I failed."
- Otherwise, there's the caching. +Otherwise, there's the caching. + +NOTE Generating Elisp
- And here's really where things get interesting, +And here's really where things get interesting,
- where we've generated some ELISP, +where we've generated some Elisp,
- and then we're calling Emacs with that ELISP. +and then we're calling Emacs with that Elisp.
- If everything works, we'll send the file. +If everything works, we'll send the file.
- If it doesn't, we'll send the 500. +If it doesn't, we'll send the 500.
- And we've already seen the 500, so we know that works. +And we've already seen the 500, so we know that works.
- All right, let's get to the interesting part. +All right, let's get to the interesting part.
- Sorry, one more footnote. +Sorry, one more footnote. + +NOTE Org blocks
- There is a capability built in that will +There is a capability built in that will
- allow us to execute an org block. +allow us to execute an Org block.
- Let's see if that's working in our local. -
+Let's see if that's working in our local.
- I'll remind myself how to do it. +I'll remind myself how to do it.
- It's run. +It's run.
- I think it's called test. +I think it's called test.
- And that's returning a 500. +And that's returning a 500.
- I'm suspecting that's running because I'm running +I'm suspecting that's running because I'm running
- in command instead of bash. +in command instead of bash.
- Oh, yeah, so the failure is happening +Oh, yeah, so the failure is happening
- after I generate the ELISP. +after I generate the Elisp.
- I'm pretty confident that is what the actual problem is. +I'm pretty confident that is what the actual problem is.
- If we have time, I'll jump back over there +If we have time, I'll jump back over there
- and relaunch it in mingity-bash. +and relaunch it in mingw bash.
- And we can see it actually work. +And we can see it actually work.
- But this works pretty well for me on my work laptop. +But this works pretty well for me on my work laptop.
- I didn't have to make any changes to it. +I didn't have to make any changes to it.
- So I have a fairly high amount of confidence, +So I have a fairly high amount of confidence,
- at least in trivial cases, this works pretty well. +at least in trivial cases, this works pretty well. + +NOTE Building some Lisp
- All right, so what I actually wanted to talk about today-- +All right, so what I actually wanted to talk about today--
- and I'm going to be kind of hand-waving around this ES5 +00:14:37.800 --> 00:14:41.730 +and I'm going to be kind of hand-waving around
- class that I've got and kind of the way that works. +00:14:41.731 --> 00:14:46.480 +this ES5 class that I've got and kind of the way that works.
- Hopefully, this will be pretty familiar to you +Hopefully, this will be pretty familiar to you
- if you are a JavaScript programmer. +if you are a JavaScript programmer.
- The interesting stuff comes when we want to build some LISP -
-. +The interesting stuff comes when we want to build some Lisp.
- Here, you can see that I really don't have a whole lot of +00:15:01.960 --> 00:15:01.961 +Here, you can see that I really don't have
- code -
- around formatting LISP. +00:15:01.962 --> 00:15:11.280 +a whole lot of code around formatting LISP.
- You can see that I've special-cased +You can see that I've special-cased
- whether the arguments that were passed +whether the arguments that were passed
- happen to be a function. +happen to be a function.
- If they are, I'm going to call that function. +If they are, I'm going to call that function.
- And then the result will be formatted as LISP. +And then the result will be formatted as Lisp.
- So this would be a recursive call here. +So this would be a recursive call here.
- Otherwise, I'm just going to return the arguments. +Otherwise, I'm just going to return the arguments.
- Sorry, otherwise, I will slap a pair of parentheses +Sorry, otherwise, I will slap a pair of parentheses
- around the result of walking that list +00:15:48.440 --> 00:15:57.878 +around the result of walking that list if I get...
- if I get formatting each element of the list of arguments +00:15:57.879 --> 00:15:57.880 +formatting each element of the list of arguments
- that this format LISP process calls +that this `formatLisp` process calls
- and separating them with spaces. +and separating them with spaces.
- So in short form, this program walks through a list. +So in short form, this program walks through a list.
- If the list it receives is a function, +If the list it receives is a function,
- it calls that function. +it calls that function.
- Once that's handled or otherwise, +Once that's handled or otherwise,
- we simply walk the list, taking the arguments, +we simply walk the list, taking the arguments,
- concatenating them on strings, and finally, +concatenating them on strings, and finally,
- wrap the results in parentheses. +wrap the results in parentheses.
- So what I didn't mention there but might be obvious +So what I didn't mention there but might be obvious
- is if I have a nested list, the inner list +is if I have a nested list, the inner list
- will be subjected to the same treatment. +will be subjected to the same treatment.
- So this is a recursive sort of algorithm. +So this is a recursive sort of algorithm. + +NOTE How Elisp gets encoded
- All right, so now when I go to export, +All right, so now when I go to export,
- actually, in the interest of time, +actually, in the interest of time,
- I'm going to avoid walking through that piece of code +I'm going to avoid walking through that piece of code
- and let's focus instead on the more interesting part +and let's focus instead on the more interesting part
- of how that LISP gets encoded. +of how that Lisp gets encoded.
- So coming back to the PDF is a good example here +So coming back to the PDF is a good example here,
- because it's got a special case. +because it's got a special case.
- You can see I've specified this export fun or export +00:17:10.320 --> 00:17:10.336 +You can see I've specified this `exportFun`
- function. +00:17:10.337 --> 00:17:15.320 +or export function.
- That's a property none of these other types have. +That's a property none of these other types have.
- And you can see it contains a meat LISP telling us +And you can see it contains some Elisp telling us
- how to call the export for it. +how to call the export for it.
- Let's go see how that's used. +Let's go see how that's used.
- At the very end of what I just skipped over, +At the very end of what I just skipped over,
- the detailed how the org export process works, +the detailed "how the Org export process works,"
- you'll see that I am ending with a step +you'll see that I am ending with a step
- to call the export function. +to call the export function.
- Here, I look to see whether I have an export function +00:17:48.000 --> 00:17:48.003 +Here, I look to see whether I have
- property. +00:17:48.004 --> 00:17:55.400 +an export function property.
- If I do, I call that function. +If I do, I call that function.
- And if I don't, I build this list with the default org +00:18:00.920 --> 00:18:00.920 +And if I don't, I build this list with the default
- export to file function using the file name and an output +00:18:00.921 --> 00:18:07.071 +`org-export-to-file` function
- file name. +00:18:07.072 --> 00:18:15.640 +using the filename and an output filename.
- So this, hopefully, is pretty familiar to anybody +So this, hopefully, is pretty familiar to anybody
- that's manually messed around with calling org export to +00:18:18.480 --> 00:18:18.503 +that's manually messed around
- file. +00:18:18.504 --> 00:18:23.560 +with calling `org-export-to-file`.
- If it isn't, you can pretty well trust me for it. +If it isn't, you can pretty well trust me for it.
- There's nothing very special going on. +There's nothing very special going on.
- This looks rather like-- +This looks rather like...
- poor example there. +Poor example there.
- Let's go back to our markdown. -
- [AUDIO OUT] +Let's go back to our markdown.
- And there, we can see-- +And there, we can see--
- - I'm going to make a quick announcement. +[Leo]: I'm going to make a quick announcement.
- Can you hear me? +Can you hear me?
- - Yes, go for it. +[Corwin]: Yes, go for it.
- - OK, let me just show my face. +[Leo]: OK, let me just show my face.
- Oh, I'm not showing my face. +Oh, I'm not showing my face.
- Damn it. +Damn it.
- OK, I'll make the announcement. +OK, I'll make the announcement.
- You won't see my face quite yet. +You won't see my face quite yet.
- We are about to get started. +We are about to get started.
- Well, we actually just got started on dev +Well, we actually just got started on dev
- with the talk by RMS. +with the talk by RMS.
- So if you want to hop over to watch the talk by RMS, +So if you want to hop over to watch the talk by RMS,
- feel free to do so. +feel free to do so.
- Otherwise, we will be continuing on Gen with Corwin +Otherwise, we will be continuing on Gen with Corwin
- to finish his talk and have a Q&A. Corwin, +00:19:12.240 --> 00:19:12.253 +to finish his talk and have a Q&A.
- you can feel free to go now. +00:19:12.254 --> 00:19:16.080 +Corwin, you can feel free to go now.
- - OK, bye, everybody. +[Corwin]: Okay, bye, everybody. + +00:19:18.560 --> 00:19:22.795 +And for those sticking around,
- And for those sticking around, I'm +00:19:22.796 --> 00:19:25.040 +I'm just going to keep pressing on with this.
- just going to keep pressing on with this. +NOTE How the export works
- In fact, I'm going to dive back into the part +In fact, I'm going to dive back into the part
- that I skipped here, which is the rest of how +that I skipped here, which is the rest of how
- this export functionality works. +this export functionality works.
- So just to make sure the dot is tied together, +So just to make sure the dot is tied together,
- the core of how this program works +the core of how this program works
- is generating some ELISP and then passing it +is generating some Elisp and then passing it
- to Emacs in batch mode. +to Emacs in batch mode.
- So if that wasn't perfectly clear, +So if that wasn't perfectly clear,
- that's really what's going on with this program. +that's really what's going on with this program.
- The rest of the implementation is just +The rest of the implementation is just
- a way to do that or certain features that +a way to do that or certain features that
- are supported in that generated ELISP, if you will. +are supported in that generated Elisp, if you will.
- So this is, you could say, the minimum implementation -
- I could come up with to create a web server for my local +So this is, you could say, the minimum implementation
- org +00:20:11.720 --> 00:20:11.753 +I could come up with to create a web server
- documents. +00:20:11.754 --> 00:20:17.320 +for my local Org documents.
- And I will also interrupt myself to just pull up +And I will also interrupt myself to just pull up
- the etherpad real quick. +the Etherpad real quick.
- Actually, if somebody is listening +Actually, if somebody is listening
- and can share a link to that, I closed my browser window +and can share a link to that, I closed my browser window
- with my links in it. +with my links in it.
- But sure, I'm happy to take questions at any point, Leo, +But sure, I'm happy to take questions at any point, Leo,
- if there are any questions for me. +if there are any questions for me.
- Are you hanging out with me? +Are you hanging out with me,
- Instead of watching RMS, you can go. +instead of watching RMS? You can go.
- I'm teasing. +I'm teasing.
- No, I mean, we know that some people can +[Leo]: No, I mean, we know that some people can
- have both streams open. +have both streams open.
- It's fine. +It's fine.
- And right now, it's not the Q&A with RMS. +And right now, it's not the Q&A with RMS.
- It's just the presentation. +It's just the presentation.
- So feel free to hang out a little longer +So feel free to hang out a little longer
- if you just want the live stuff. +if you just want the live stuff.
- Don't worry about it. +Don't worry about it.
- You're fine. +You're fine.
- Yeah, and forgive me, everybody. +[Corwin]: Yeah, and forgive me, everybody,
- If you were hoping for a quick, succinct talk, +if you were hoping for a quick, succinct talk.
- I happen to know I was going to be opposite RMS. +I happen to know I was going to be opposite RMS,
- So I awarded myself the liberty of rambling. +so I awarded myself the liberty of rambling.
- So if you do have a question, something that I alluded to +So if you do have a question, something that I alluded to
- and haven't come back to yet, you should, by all means, +and haven't come back to yet, you should, by all means,
- prompt me. +prompt me.
- A comment I might do-- +[Leo]: Corwin, I might do--
- I'm just giving you a little heads up. +I'm just giving you a little heads up.
- I might need to go help at some point of a dev. +I might need to go help at some point of dev.
- So if I need to do so, I will let you know right now +So if I need to do so, I will let you know right now
- inside the BBB room. +inside the BBB room,
- And you'll be on your own to manage the chat. +and you'll be on your own to manage the chat.
- And you can just talk backstage to us +And you can just talk backstage to us
- to manage what we do with the stream, OK? +to manage what we do with the stream, OK?
- Yep, that should be no problem at all. +[Corwin]: Yep, that should be no problem at all.
- I've got my pad up now. +I've got my pad up now.
- Thank you, Chancellor. +Thank you, ??.
- And I'm sorry about butchering your name there. +And I'm sorry about butchering your name there.
- And yep, I've got my chat open. +And yep, I've got my chat open.
- And I think I'm pretty well set to self-manage. +And I think I'm pretty well set to self-manage.
- Oh, I don't have a camera on. +Oh, I don't have a camera on.
- So you can't see me giving you the thumbs up. +So you can't see me giving you the thumbs up.
- OK, good. +[Leo]: Okay, good. + +NOTE Walking through the code
- All right, so let's just walk through, +All right, so let's just walk through,
- because it's sort of an interesting code. +because it's sort of an interesting code.
- Let's just take a look real quick +Let's just take a look real quick
- at how we generated our e-list here, +at how we generated our Elisp here,
- because it is-- +because it is--
- there we go. +there we go.
- It is a little bit interesting. +It is a little bit interesting.
- So here is the method. +So here is the method.
- So I didn't get into detail on this. +So I didn't get into detail on this.
- But there's an ES5 class that represents an org mode +00:22:34.080 --> 00:22:34.086 +But there's an ES5 class that represents
- document. +00:22:34.087 --> 00:22:38.920 +an Org mode document.
- It has the static debug property that, as you might imagine +00:22:38.920 --> 00:22:38.920 +It has the static debug property that,
-, +00:22:38.921 --> 00:22:42.400 +as you might imagine,
- can be overridden by that debug setting +can be overridden by that debug setting
- we looked at in the defaults. +we looked at in the defaults.
- We also have a static variable that-- +We also have a static variable that--
- a static property that does nothing more than getting +a static property that does nothing more than getting
- the path to emacs out of those defaults. +the path to Emacs out of those defaults.
- Similarly, we have a class method +Similarly, we have a class method
- to spawn out an emacs, as I mentioned, in batch mode, +to spawn out an Emacs, as I mentioned, in batch mode,
- eval-ing some arbitrary list that's passed in. +eval-ing some arbitrary Lisp that's passed in.
- All right, so the type-- +All right, so the type--
- this is where things start to get interesting. +this is where things start to get interesting.
- So this is an implementation detail, +So this is an implementation detail,
- but-- that it's written as a static method. +but-- that it's written as a static method.
- But essentially, what's going on here +But essentially, what's going on here
- is looking up from that type list +is looking up from that type list
- to try to find a type that's passed in, +to try to find a type that's passed in,
- and that's returning one of these blocks. +and that's returning one of these blocks.
- Let's say I requested HTML, which would be the default. +Let's say I requested HTML, which would be the default.
- Then I'm going to get this set of properties back. -
+Then I'm going to get this set of properties back.
- All right. +All right.
- Essentially, this program generates a program +Essentially, this program generates a program
- or a little block of executable elisp. +or a little block of executable elisp.
- However, in some cases, where if the load path has +However, in some cases, where if the `load-path` has
- been customized in that type block, +been customized in that type block,
- or I think that's the only case I supported. +or I think that's the only case I supported.
- There was another complexity I removed. +There was another complexity I removed.
- So in that case, then I can simply +So in that case, then I can simply
- replace that program with a let. +replace that program with a let.
- Either way, I'm going to have everything I generate +Either way, I'm going to have everything I generate
- be encapsulated in a single block. +be encapsulated in a single block.
- The-- then I'm calling that format list process +The-- then I'm calling that formatLisp process
- that we talked about, appending to that-- +that we talked about, appending to that--
- or inserting into, you could say, the outer scope. +or inserting into, you could say, the outer scope.
- And we start by finding the file. +And we start by finding the file.
- We then load any libraries that might be needed. +We then load any libraries that might be needed.
- In some cases, the type might not +In some cases, the type might not
- have any external libraries. +have any external libraries.
- So we just-- so that's a no op. +So we just-- so that's a no-op.
- And then finally, we're going to execute +And then finally, we're going to execute
- that logic I mentioned before about selecting +that logic I mentioned before about selecting
- either the default or export to file, +either the default org-export-to-file,
- or else whatever elisp we've staged for exporting +or else whatever Elisp we've staged for exporting
- that particular file type. +that particular file type.
- And again, in the case of PDF, there's +00:25:38.160 --> 00:25:43.112 +And again, in the case of PDF, there's a special function
- a special function that's used to trigger that export. +00:25:43.113 --> 00:25:46.240 +that's used to trigger that export.
- Or you may be aware that that's a little more complicated. +Or you may be aware that that's a little more complicated.
- There's intermediate forms there. +There's intermediate forms there.
- All right. +All right.
- So just reminding myself if there's anything else +So just reminding myself if there's anything else
- I have to cover on background. +I have to cover on background.
- And I think that pretty well covers the basics. +And I think that pretty well covers the basics. + +NOTE Executing the source block
- All right, let's look at that source block execute. +All right, let's look at that source block execute.
- This is the other use of the format list function. +This is the other use of the format list function.
- So here, rather than looking at the type +So here, rather than looking at the type
- and passing that through our org export method, +and passing that through our Org export method,
- and then that type is used to get the list +and then that type is used to get the list
- that we want to create. +that we want to create.
- In the case of source block execute, +In the case of source block execute,
- we're kind of rolling it a lot more by hand. +we're kind of rolling it a lot more by hand.
- So this gives us a good chance to sort of unwind +So this gives us a good chance to sort of unwind
- how that list looks when it's staged as JavaScript data. +how that list looks when it's staged as JavaScript data.
- So here again, I wrap everything in a progon. +So here again, I wrap everything in a `progn`.
- I start by preventing an interactive prompt +I start by preventing an interactive prompt
- for the Babel execution. +for the Babel execution.
- And then we load languages. +And then we load languages.
- This relates to another piece of our configuration +This relates to another piece of our configuration
- where we've specified a set of languages +where we've specified a set of languages
- that it's OK to execute. +that it's OK to execute.
- So if that type isn't in this list, +So if that type isn't in this list,
- then we won't be able to execute it in line +then we won't be able to execute it in line
- through our trivial little web server. +through our trivial little web server.
- All right. +All right.
- With that done, then, loading the selected language, +With that done, then, loading the selected language,
- we then once again open the file. +we then once again open the file.
- And we're-- whoops. +And we're-- whoops.
- Let bind a return value, which is +Let-bind a return value, which is
- calculated by using org source block execute on the name +00:27:51.800 --> 00:27:55.166 +calculated by using Org source block execute [`org-sbe`]
- of the block that's given. +00:27:55.167 --> 00:27:58.040 +on the name of the block that's given.
- And then we use a temp buffer to write that out +And then we use a temp buffer to write that out
- to a temporary file. +to a temporary file.
- This is actually a little clumsy, +This is actually a little clumsy,
- but I haven't put the effort in to have this written out +but I haven't put the effort in to have this written out
- to the standard output cleanly instead of using a temp file -
-. +to the standard output cleanly instead of using a temp file.
- So under-- this is another example of where it may not +So under-- this is another example of where it may not
- be production-- well, it definitely +be production-- well, it definitely
- is not production-worthy code in that under heavy load, +is not production-worthy code in that under heavy load,
- this would certainly break with collisions on the Babel +00:28:27.680 --> 00:28:30.166 +this would certainly break with collisions
- file, +00:28:30.167 --> 00:28:32.040 +on the Babel file,
- the name of the Babel file. +the name of the Babel file.
- In any case, once we've staged up our ELISP, which is-- +In any case, once we've staged up our Elisp, which is--
- this is basically variable interpolation, +this is basically variable interpolation,
- then we just call emacs on that. +then we just call Emacs on that.
- And if we look down to where that's called, +And if we look down to where that's called,
- you can see that the org Babel file name calculated here. -
- [AUDIO OUT] +you can see that the Org Babel filename calculated here.
- Is there a problem? +00:29:12.795 --> 00:29:15.000 +[Leo]: Is there a problem?
- No, I'm fine. +[Corwin]: No, I'm fine.
- I'm just lost in my code. +I'm just lost in my code.
- OK, cool. +[Leo]: OK, cool.
- Oh, means, oh, I need to intervene. +Uh-oh means, oh, I need to intervene.
- What is going on? +What is going on?
- Carry on, please. +Carry on, please.
- No, I'm fine, Leo. +[Corwin]: No, I'm fine, Leo.
- Thank you. +Thank you.
- All right, so then-- +All right, so then--
- so you can see we get-- +so you can see we get--
- we send the Babel file here, which +00:29:28.680 --> 00:29:35.537 +we send the Babel file here,
- is calculated manually. +00:29:35.538 --> 00:29:41.640 +which is calculated manually.
- A bit sloppy there, since I have essentially the same-- +A bit sloppy there, since I have essentially the same--
- I have two different places where +I have two different places where
- I'm calculating the org doc file in two different ways. +I'm calculating the Org doc file in two different ways.
- Have I encouraged you to write your own yet? +Have I encouraged you to write your own yet?
- Or send patches. +Or send patches.
- All right, so that's pretty much the nuts and bolts +All right, so that's pretty much the nuts and bolts
- of this program. +of this program.
- Let's go back to just seeing if we can't make it run. +Let's go back to just seeing if we can't make it run.
- All right. +All right.
- All right, well, I apologize for not +All right, well, I apologize for not
- having taken the time to stage my demo this morning. +having taken the time to stage my demo this morning.
- I'm going to try to make it better for you. +I'm going to try to make it better for you.
- But apparently, it's going to be non-trivial +But apparently, it's going to be non-trivial
- to make the program work. +to make the program work.
- Let's just-- before I completely give up, +Let's just-- before I completely give up,
- let's go ahead and try our Babel execute. +let's go ahead and try our Babel execute.
- And that, too, is failing. +And that, too, is failing.
- So there's something unhappy in my local world. +So there's something unhappy in my local world.
- There it goes. +There it goes.
- But in any case, let's go ahead and just take a look at +But in any case, let's go ahead and just take a look at
- that. +that.
- Let's see. +Let's see.
- Control Enter. +Control Enter.
- Let's take a look at that generated ELS +00:31:36.628 --> 00:31:40.200 +Let's take a look at that generated .el
- and compare it to-- whoa-- +and compare it to-- whoa--
- and compare it to-- +and compare it to--
- I'm just going to format this manually, +I'm just going to format this manually,
- because I've forgotten my key bindings to auto-format it. +because I've forgotten my key bindings to auto-format it.
- There we go. +There we go.
- All right. +All right.
- So now we can see, as promised, there's really +So now we can see, as promised, there's really
- nothing going on here other than the interpolation +nothing going on here other than the interpolation
- of the variables in. +of the variables in.
- We're inserting-- we're using an insert and write file +We're inserting-- we're using an insert and write file
- method, which is, again, rather sloppy, +method, which is, again, rather sloppy,
- to generate the text file. +to generate the text file.
- All right. +All right.
- Let's come back to our documentation +Let's come back to our documentation
- and see if we can put a bow on the project. +and see if we can put a bow on the project. + +NOTE Conclusion
- So I hope I've convinced you that this was actually +So I hope I've convinced you that this was actually
- rather easy to do. +rather easy to do.
- The entirety of my index.js file is 262 lines, +The entirety of my index.js file is 262 lines,
- and that includes a good 40 of whitespace and configuration -
-. +and that includes a good 40 of whitespace and configuration.
- It has only one dependency, the Express, which +00:33:03.760 --> 00:33:06.505 +It has only one dependency, the Express,
- really builds the web server. +00:33:06.506 --> 00:33:08.240 +which really builds the web server.
- Any language you'd rather implement this in +Any language you'd rather implement this in
- will have a similar capability for building +will have a similar capability for building
- some type of trivial web server. +some type of trivial web server.
- And I think you may find-- +And I think you may find--
- I certainly found that a large portion of the code base +I certainly found that a large portion of the code base
- is really making the errors meaningful, +is really making the errors meaningful,
- in that, in some cases, sending an appropriate HTTP status +in that, in some cases, sending an appropriate HTTP status
- based on what happened. -
- In other cases-- let's see if I've got an explicit throw +based on what happened.
- left +00:33:34.360 --> 00:33:38.002 +In other cases-- let's see if
- in here-- +00:33:38.003 --> 00:33:42.640 +I've got an explicit `throw` left in here--
- in other cases, just trapping different types +in other cases, just trapping different types
- of failure conditions. +of failure conditions.
- I'm going to look at my pad, and I do see a question here. +I'm going to look at my pad, and I do see a question here.
- So let me jump in here. +So let me jump in here.
- [VIDEO PLAYBACK] +NOTE Questions and answers
- - Cohen, just to make sure, are you switching to Q&A? +[Leo]: Corwin, just to make sure, are you switching to Q&A?
- Are you finished with your presentation? +Are you finished with your presentation?
- - Well, as I said, I'm happy to take Q&A throughout. +[Corwin]: Well, as I said, I'm happy to take Q&A throughout.
- But yes, let's say yes to that. +But yes, let's say yes to that.
- - OK, so Cohen, what I'm going to need to do now-- +[Leo]: Okay, so Corwin, what I'm going to need to do now--
- you are in charge of the room. +you are in charge of the room.
- We are going to open up the room so +We are going to open up the room so
- that if people have questions watching right now on Gen, +that if people have questions watching right now on Gen,
- feel free to come in. +feel free to come in.
- And there was something else I needed to say. +And there was something else I needed to say.
- Yes, Cohen, if there's any problem, +Yes, Corwin, if there's any problem,
- whisper to us on Mumble. +whisper to us on Mumble.
- So you might want to unmute Mumble +So you might want to unmute Mumble
- and be able to listen to us over there. +and be able to listen to us over there.
- - I can't do that, Leo. +[Corwin]: I can't do that, Leo.
- If I unmute, Mumble is going to bleed through. +If I unmute, Mumble is going to bleed through.
- - OK, sure. +[Leo]: Okay, sure.
- Well, if you have any problem, type in emacsconf-org.ch +00:34:36.960 --> 00:34:39.416 +Well, if you have any problem,
-annel, +00:34:39.417 --> 00:34:41.160 +type in #emacsconf-org channel,
- and we'll be with you, OK? +and we'll be with you, OK?
- - Or I'll PM somebody. +[Corwin]: Or I'll PM somebody.
- But I don't anticipate having any problems. +But I don't anticipate having any problems.
- I'll put something in org when I run out of steam here. +I'll put something in -org when I run out of steam here.
- How's that? +How's that?
- - Amazing, cool. +[Leo]: Amazing, cool.
- So I will have to leave the room, though. +So I will have to leave the room, though.
- I'm leaving the recording going so that we have your Q&A. +I'm leaving the recording going so that we have your Q&A.
- And whenever you're available-- +And whenever you're available--
- - I'll shut off the recording when I close the room. +[Corwin]: I'll shut off the recording when I close the room.
- - OK, great. +[Leo]: Okay, great.
- Good luck, Cohen. +Good luck, Corwin.
- - Thank you. +[Corwin]: Thank you.
- All right, and if you're still with me, well, thanks. +All right, and if you're still with me, well, thanks.
- I appreciate that. +I appreciate that.
- I did offer to be opposite RMS. +I did offer to be opposite RMS.
- And I'm in no way offended if people do want to jump over, +And I'm in no way offended if people do want to jump over,
- especially as that starts to shift over to Q&A. +especially as that starts to shift over to Q&A.
- I'm taking Leo's leaving as a pretty good indication +I'm taking Leo's leaving as a pretty good indication
- that that's happening now-ish. +that that's happening now-ish.
- So I totally understand if folks are more excited to do +00:35:28.780 --> 00:35:31.385 +So I totally understand
- that. +00:35:31.386 --> 00:35:35.020 +if folks are more excited to do that.
- Meanwhile, let me just jump over to the question +Meanwhile, let me just jump over to the question
- that I received. +that I received.
- I'll show the pad here so that I save myself +I'll show the pad here so that I save myself
- reading the question out. +reading the question out.
- But I'll paraphrase it. +But I'll paraphrase it. + +NOTE Why am I not running the web server in Emacs?
- Why am I not running the web server in emacs? +Why am I not running the web server in Emacs?
- That would be a great way to do it. +That would be a great way to do it. + +00:35:54.380 --> 00:35:56.340 +I chose to build it in Node.js
- I chose to build it in Node.js because that +00:35:56.341 --> 00:35:58.460 +because that was trivially easy for me.
- was trivially easy for me. +NOTE Is this using org-info-js?
- And then finally, am I using org info.js? +And then finally, am I using org-info-js?
- No, I learned about this essentially at this conference. +No, I learned about this essentially at this conference.
- So that's something I'll be learning more about. +So that's something I'll be learning more about.
- And it could well influence this project. -
- [TYPING] +And it could well influence this project.
- All right, and thanks for the questions. +All right, and thanks for the questions.
- All right, I'm going to slow my roll just a little bit here +All right, I'm going to slow my roll just a little bit here
- because I think I kind of have all the time in the world. +because I think I kind of have all the time in the world.
- I will be wrapping up within about 15 or 20 minutes +I will be wrapping up within about 15 or 20 minutes
- at the latest just to avoid stressing out +at the latest just to avoid stressing out
- my fellow organizers, especially Leo and Sasha that +00:37:15.620 --> 00:37:18.827 +my fellow organizers, especially Leo and Sacha
- have the bulk of the heavy lifting this year. +00:37:18.828 --> 00:37:22.260 +that have the bulk of the heavy lifting this year,
- And amen, and really, thanks all to everybody. +and Amin, and really, thanks all to everybody.
- God, the nicest part of doing my own talk +God, the nicest part of doing my own talk
- is that I get to say that. +is that I get to say that.
- It's just so much fun to contribute to emacsConf. +It's just so much fun to contribute to EmacsConf. + +NOTE EmacsConf
- And if you're at all interested, there's +And if you're at all interested, there's
- plenty of completely backstage, behind the curtain role. +plenty of completely backstage, behind the curtain role.
- Behind the curtain roles doesn't mean +Behind the curtain roles doesn't mean
- you have to be somebody that likes talking or being +00:37:45.340 --> 00:37:47.865 +you have to be somebody that likes
- on webcam. +00:37:47.866 --> 00:37:50.060 +talking or being on webcam.
- Sorry that my camera isn't working this year. +Sorry that my camera isn't working this year.
- I spent quite a while fussing with that +I spent quite a while fussing with that
- and lost all my time to get my prereq working. +and lost all my time to get my prerec working.
- All right, so trying to think where I can take us +All right, so trying to think where I can take us
- without my demo working. +without my demo working.
- I was really hoping to show the org Babel piece. +I was really hoping to show the Org Babel piece.
- That's really fun. +That's really fun. + +NOTE How I'm using this at work
- So let me just mention briefly how I'm using this at work. +So let me just mention briefly how I'm using this at work.
- So at work, I'll have some type of org document. +So at work, I'll have some type of Org document.
- And usually, it's a project. +And usually, it's a project.
- So the title of the document is My Project. +So the title of the document is My Project.
- And then I'll have a requirements section. +And then I'll have a requirements section.
- And I'll have a meeting notes section. +And I'll have a meeting notes section.
- That's probably the key thing. +That's probably the key thing.
- And then as the project goes on, I'll start having-- +And then as the project goes on, I'll start having--
- I'm a solutions architect. +I'm a solutions architect.
- So my job is formalizing design in large part. +So my job is formalizing design in large part.
- So then I'll have a design documents section. +So then I'll have a design documents section.
- And this is where I'll be doing a lot of my work. +And this is where I'll be doing a lot of my work.
- So I'll start out saying-- -
- [AUDIO OUT] +So I'll start out saying--
- And maybe Bob is a subject matter expert +And maybe Bob is a subject matter expert
- whose buy-in I need to have on how we're going +whose buy-in I need to have on how we're going
- to do the high-level design. -
- Maybe a lead engineer or a dev manager or something like +to do the high-level design.
- that. +00:39:34.820 --> 00:39:37.296 +Maybe a lead engineer or a dev manager
- All right, as my work goes on, then this +00:39:37.297 --> 00:39:39.460 +or something like that.
- will start getting into more detail. +00:39:39.460 --> 00:39:42.653 +All right, as my work goes on,
- [AUDIO OUT] +00:39:42.654 --> 00:39:47.620 +then this will start getting into more detail.
- And things of this nature. +And things of this nature.
- As things get further and further, +As things get further and further,
- I'll actually have documentation +I'll actually have documentation
- that I'm adding in here. +that I'm adding in here.
- Oh, I see. +Oh, I see.
- It's a big mess. +It's a big mess.
- All right, well, we'll just reuse this. +All right, well, we'll just reuse this.
- So I can insert those all in line. +So I can insert those all in line.
- And now for the fun part, let's see if the most trivial +00:40:40.380 --> 00:40:42.157 +And now for the fun part,
- case +00:40:42.158 --> 00:40:44.460 +let's see if the most trivial case
- is working here. -
-
- [CLICK] +is working here.
- No. +No.
- All right, completely broken. +All right, completely broken.
- Let me drag. +Let me drag.
- All right, well, apologies again for the poor quality +All right, well, apologies again for the poor quality
- of my demo today. +of my demo today.
- And let me just look real quick at my Etherpad once more. +And let me just look real quick at my Etherpad once more.
- And I'll glance at BBB to see if there's anybody +And I'll glance at BBB to see if there's anybody
- jumping in with questions. +jumping in with questions.
- And then I'll go back to IRC and look for questions there. +And then I'll go back to IRC and look for questions there.
- OK, and I don't see any additional questions on the pad. +OK, and I don't see any additional questions on the pad.
- I'm just going to scan IRC real quick. +I'm just going to scan IRC real quick.
- I suspect that the TreeSitter comment isn't for me. -
- [CHUCKLES] +I suspect that the TreeSitter comment isn't for me.
- All right, and I'm not seeing a lot of questions there. +All right, and I'm not seeing a lot of questions there.
- So I'm just going to vamp for just a minute or two. +So I'm just going to vamp for just a minute or two. + +NOTE Volunteering for EmacsConf
- As I mentioned, I'm a conference volunteer. +As I mentioned, I'm a conference volunteer.
- This is my third year volunteering +This is my third year volunteering
- with the conference. +with the conference.
- And probably if you take one thing away from my talk, +And probably if you take one thing away from my talk,
- it should be I really like volunteering +it should be I really like volunteering
- for the conference. +for the conference.
- It's fun. +It's fun.
- It makes me feel sort of close to the pulse. +It makes me feel sort of close to the pulse.
- And it gives me a chance to just interact +00:42:23.500 --> 00:42:27.296 +And it gives me a chance to just interact with people
- with people that have very different perspectives +00:42:27.297 --> 00:42:30.106 +that have very different perspectives on Emacs,
- on Emacs, which is something that I really value a lot. +00:42:30.107 --> 00:42:32.740 +which is something that I really value a lot.
- Emacs, like anything else sort of in the internet world, +Emacs, like anything else sort of in the internet world,
- has a real echo chamber factor. +has a real echo chamber factor.
- If you do or don't use Package, you probably +00:42:42.940 --> 00:42:46.504 +If you do or don't like use-package,
- interact with a lot of people that +00:42:46.505 --> 00:42:49.135 +you probably interact with a lot of people
- feel the same way about that. +00:42:49.136 --> 00:42:53.500 +that feel the same way about that.
- And so I really recommend volunteering for EmacsConf +And so I really recommend volunteering for EmacsConf
- as a way to sort of mix it up and get +as a way to sort of mix it up and get
- to know people that may not use Emacs the same way that you +00:43:01.340 --> 00:43:03.858 +to know people that may not use Emacs
- do. +00:43:03.859 --> 00:43:05.540 +the same way that you do. + +NOTE It's easy to build a program that uses Emacs in the pipeline
- Or perhaps more on topic, though, +Or perhaps more on topic, though,
- the log line for this talk is it's really quite easy +the log line for this talk is it's really quite easy
- to build a program that uses Emacs in a pipeline capability -
-. +to build a program that uses Emacs in a pipeline capability.
- I think there's a ton of opportunity in this space. +I think there's a ton of opportunity in this space.
- This particular example is just a trivial web server +This particular example is just a trivial web server
- written +00:43:27.700 --> 00:43:30.780 +written using Node.js.
- using Node.js. +00:43:30.780 --> 00:43:31.545 +But as was pointed out, we could have used elnode
- But as was pointed out, we could have used LNode as a web -
- server +00:43:31.546 --> 00:43:40.060 +as a web server
- and done the entire thing within Emacs Lisp. +and done the entire thing within Emacs Lisp.
- Or really, almost any technology would get us this +00:43:44.060 --> 00:43:48.765 +Or really, almost any technology
- capability. +00:43:48.766 --> 00:43:52.900 +would get us this capability.
- From an implementation standpoint, +From an implementation standpoint,
- I had a lot of fun building this trivial little e-lisp pars +00:43:54.660 --> 00:43:56.847 +I had a lot of fun building
-er. +00:43:56.848 --> 00:43:59.580 +this trivial little Elisp parser,
- And I'm rather pleased with the fact +and I'm rather pleased with the fact
- that the entirety of that-- +that the entirety of that--
- the entire algorithm for turning JavaScript or JSON data, +the entire algorithm for turning JavaScript or JSON data,
- we could say, into e-lisp is really a one-liner. +we could say, into Elisp is really a one-liner,
- Albeit a nasty one-liner, that was pretty cool +albeit a nasty one-liner. That was pretty cool
- to discover how simple that was. +to discover how simple that was.
- So in my mind, that opens up a lot of possibility. +So in my mind, that opens up a lot of possibility.
- If it's this easy in JavaScript, I +00:44:31.220 --> 00:44:32.889 +If it's this easy in JavaScript,
- wouldn't expect it to be hard, any more difficult +00:44:32.890 --> 00:44:34.708 +I wouldn't expect it to be hard,
- in your favorite language. +00:44:34.709 --> 00:44:36.860 +any more difficult in your favorite language.
- Glance one more time to see if there +Glance one more time to see if there
- happen to be any other questions. +happen to be any other questions.
- And not seeing any, I'm going to go ahead and start +And not seeing any, I'm going to go ahead and start
- wrapping up my chat now. +wrapping up my chat now.
- It will take me a couple of minutes to do that. +It will take me a couple of minutes to do that.
- So if you do have any other questions that you +So if you do have any other questions that you
- want to drop into the pad or any comments, +want to drop into the pad or any comments,
- you're more than welcome to hit me with those +you're more than welcome to hit me with those
- as I coordinate closing this chat, this talk, +as I coordinate closing this chat, this talk,
- with the organizer team. -
- [AUDIO OUT] -
-
- [AUDIO OUT] -
-
- [AUDIO OUT] -
-
- [AUDIO OUT] - +with the organizer team. -- cgit v1.2.3