Hey everybody, my name is David Thompson, I'm the CTO of the Sprite League Institute and today
I'd like to talk about minimalist web application deployment using scheme, a language that
I know many, at least some familiar faces in the room, quite familiar.
Quickly about me, again I'm Dave, I'm the CTO of the Sprite League Institute and Sprite
League is a 501C3 US-based nonprofit and our mission is to build technology that makes
secure, distributed, programming easy.
I'm going to talk a little bit about the deployment of such technology but in this room if
you stick around for the entire time you're going to see many other talks that get into
all of the facets of Sprite League technology so I highly recommend you stick around.
But in this talk we're going to talk about web applications, we're going to cover a number
of topics, we're going to start with the topic of scale and what does that mean scaling up
scaling down. The problems that I see with mainstream web development, oh and I didn't start
my timer, let's fix that. Great. We're going to go into scheme as an alternative language to
what is commonly used in web development. We're going to go through both the server side
and the client side and the recent development Sprite League's done around there and then we'll
conclude with future direction and work-lift to be done. So let's talk about scale. In the
web development industry something that I worked in for about 10 years before coming to Sprite
League and getting on the show hands like web developers in the room or have done it at any
point. Okay, quite a number of people. Industry focus, no surprise, is on scaling up. We read a lot of
articles about going from zero users to millions and public clouds and load balancers and all
these sorts of things. But my focus that's Sprite League and hopefully some of the people here
can relate to is on self-hostible web applications. Things that not only can maybe scale up at
scale down and importantly things that can run on some hardware you just have hanging around
something that maybe only supports you or you and some friends, a small community and we don't
talk about this much. We don't talk about scaling down. So I really like to focus on it here and
show how scheme can be a language to affect such things. So let's cover the modern web development
stack. I have a pretty pessimistic view of it. One thing I hope everyone can agree on is JavaScript
is essentially mandatory. On the front end until recently I'll get into this. You didn't have
much of a choice. JavaScript has involved in the stack at some point. Usually no JS maybe it runs
your back end. Maybe it's just for generating front end code. But more and more not only are we
dependent on JavaScript we're dependent on languages that compile to JavaScript. So we have projects
like Babble.js that are JavaScript compilers and we have languages like TypeScript, you know,
back in the day CoffeeScript, other things. More and more we're building languages on top of JavaScript
to deal with the shortcomings of JavaScript and I think Babble's really appropriately named because
it really is becoming this tower of Babble in complexity and just piles of languages. When it
comes to deployment you usually need a combination of your systems package manager pretty much
always MPM. Any time I look at a web application, get repository there's always a package that
JSON file hanging out. And if you're not using node for the back end you need at least one of
the package manager. If you're using Python probably pay up if you're using Ruby, Bundler if you
got a rust back end, it's cargo, et cetera, et cetera. And then, you know, web assemblies come
around and now you have a whole additional tool chain for that, the most popular of which is
I'm scripted. Let's focus on JavaScript for a moment. Here are my problems with MPM. Typically the
dependency graphs are just massive, even for trivial things. I mean show of hands who's sort of
the left pad and PM package. I mean this is okay. It's kind of an extreme example of how
miniscule these packages get and they get depended upon by a bunch of things and now, you know,
between legitimate security issues like typosquadding these sorts of things, we have
dependency graphs that are just impossible to understand. Sorry about that. And not only
they're hard to understand, they're hard to understand by the people that work on things like Linux
distributions. They're difficult to near impossible to actually pull in out of MPM and go somewhere
else with them, which will be a problem I'll expand on a little bit. And having done DevOps
for a number of years, language package managers, they complicate deployment. Typically,
I was used to needing at least three. They don't compose particularly well. You have to use
additional DevOps tools, things, you know, like, like puppet or answerbuller or shaft or
something like that. So to wrangle it all together and get something that you can actually,
you know, push out and deploy the production. And because of all these different package
managers and package ecosystems, you know, interoperating and not composing particularly well,
you know, if you're under requirements to make sure for compliance reasons that you're
keeping up with security updates. And so if you quickly become dependent on like centralized
infrastructure like GitHub and they're dependent on to understand your CVE exposure.
So how how bad could it be? Who's a geeks user in this room? Let me do a lot of these like hands
and how many of you were at geeks days? So I'm okay. So the topic of using a forge for geeks has
come up and particularly for GAO. And you know, how bad could this mpm thing be? Well, if you
take a look at the package lock.json file for GAO, which is kind of build as a self-hostible
getforge, that file is nearly 16,000 lines long encoding, you know, hundreds to potentially
thousands of dependencies. That's a big lift when you try to think about taking things out of
that ecosystem and actually packaging it for a district like geeks or something else. It's pretty bad
in my opinion. Let's talk about WebAssembly, not just JavaScript. I'm calling this title,
M-Scriptin is for the crabs, for the for the for the Russ of the world. WebAssembly provides a path
away from JavaScript. Like you could imagine producing JavaScript dependence and implementing
more on WebAssembly deploying that. However, the most popular tool change for this is M-Scriptin.
It's based on the LOM. It's a compile tool chain. And that's the primary use case there is for
your static languages, you know, compiling your Russ C++ Cs or perhaps a VM or interpreter for a
dynamic language. But like, you know, the part of it that's implemented in C, you compile that.
It may be run that in the browser. But what about dynamic memory memory memory. Managed memory
languages, excuse me. And particularly what about why as in GC, the garbage collector extension that adds,
you know, heat-allocated types and things to WebAssembly. What about this? The M-Scriptin path doesn't
really give you that. And I'll stop at the bad in a minute, but just one more thing. You know,
you talk a lot about DevOps. DevOps is a full-time job. If you want to pay me six figures,
USD to wrangle all of your package managers and keep your database servers running. Great. That's
awesome. But when we talk about applications that regular users are running or just a few people,
maybe someone that's very tech savvy, but just doesn't have a lot of time, this quickly becomes like
burdensome. And something you don't want to do. I certainly don't want to do it. I've done enough
of that. You have to pay me to want to do these sorts of things. So we have an alternative. It's called
the userOps. It's a term that's been around, I don't know if you've heard of it, but it's been
around a little while. I believe coined by Deb Nicholson currently at the Python software foundation.
And the idea is kind of the, you know, the inverse of DevOps. We're talking about minimal dependencies,
minimal system requirements. Things that you can actually deploy from a system package manager.
Thank you can actually reasonably act install something and start it up. And it's,
I'm not talking flat pack. I'm not talking Docker. Like just a package managers that users
use on a regular basis, at least in the Linux world. And they can also just be maintained by those users
who have limited free time and energy. There's not a lot of different demons to set up and maintain,
you know, redist caches, post-grace SQL services, these sorts of things. And as I try to demonstrate
with the 4GA example, even apps that build themselves as self-hostible, in my opinion,
you're actually quite difficult to self-host. I don't self-host a mastered on instance. For example,
I use someone else's. These sorts of things. Oops. One more slide about this. You know,
is it web scale, right? Again, the industry's focus is on scaling up, not down. You know,
they're focused on deploying to AWS, not the old laptop that has been collecting dust in your
closet, you know, and as like an analogy, it's kind of like big agriculture uses like, you know,
large tractors and combines and things to do their work versus, you know, in your home garden,
you have, you know, a little hand shovel and maybe, you know, maybe a hoe. And so I think the tools
that have tried to make things easier, Docker, flat pack, oh, just install this, take this Docker
container and run it, take this flat pack image and run it. I think they're insufficient because
they're a layer of complexity on top of all of these things. They kind of hide what we've built,
the tower of Babel, and I think ultimately they reduce user agency because these things are typically
artifacts that are produced by the developers of something and they say, run, run this. I gave you the
binary, just run it. And I think it's important for at least those of us that are interested to,
you know, in software freedom and these sorts of things to be able to, you know, inspect and build
and run these things on our own machines with the dependencies that we've got from wherever else.
Anywhere we want. So all this is to say, maybe we need different tools and spoiler alert that
tool is, I'm scheme. I think. So no, no secret that I'm a little schemeer here. So specifically,
I want to talk about, I'm a guy, as a particularly good scheme implementation. So a lot of people
here, like no use gigs or racer hands. I know a lot of people know guy here. But schemes are
fairly minimal, language. You know, few course syntax forms are relatively small. I mean,
stick to Scandard's game. It's not much there. Guyel adds a little bit in a former standard library,
but it's not huge. It's something readily available in Linux distributions. It has a good bootstrapping
story. It's Giles Compiler is written in scheme, but there's a path. So you don't need a previous,
you don't need an already built version of Val to compile it. There's an interpreter written in
C. And so you can go from GCC to the interpreter. There's this whole bootstrapping thing.
I'm looking at Andy in the back. He's written blog posts about the whole process. And it's a
wonderful thing. So it's a nice path to getting into Linux distribution and just being a nice
built system general. It has relatively few dependencies. It's not the absolutely most minimal thing,
but not a lot of dependencies. And in terms of web applications, it has some built-in web client
web server goodies. And there are more goodies available in third-party libraries. And the big thing
is that, you know, scheme on the server has been a thing for a very long time, but scheme in the
web browser is relatively new. And that's something that's now possible. And just so you know that this
talk is actually a guide web application. And I'll just show you really quick. If you get here
my slides, remember, if you remember the intro slide, there's just some scheme code that's rendering
these things. And that's the client side. And on the server, here's what's rendering the web page.
That's running. I'm running an HTML on the server to serve it. So I'm going to talk a little bit
more about maybe a few examples of how you can do these things. You can do a lot with a little
bit of minimal language like scheme. So one example I'm going to give is using SXML. It's S stands for
S Expressions. So what we're used to and with web development, a lot of string-based templating
languages. And you put some funny looking characters to kind of drop out of string mode and run
some code. And whatever that string is gets put right back in and you have this big template.
The problem with that, and I'm going to talk too much about it, is that you become vulnerable to
things like injection attacks. And if you're not careful about escaping your input,
there's a link at the bottom. If you screen-shadowed it or whatever, it's a good article on this subject.
But really what I want to focus on is with list, you can get structural templating. So it's
not, it's an actual data structure. It's not just something that makes a big string blob.
And so this little back-tick here, quasi-quote. That's your new best friend.
The list has a built-in templating language for it. It's called quasi-code. You don't need to
bring string-templating language into this. It's already there. All you need is something that
can take the tree and produce the HTML. Another nice thing is, you know, URI routing, common thing.
Webframe works on the here is an example of Ruby on Rails. How you might do a get request for a
showing like a post. I don't know, look at it. We're going to on a blog or something like that.
Well, with not that much code, you can use Giles Pattern Matcher. And you get a structural
matcher. So on the left, you see like post slash ID. And if that little colon thing means capture
that part of the URI path and assign it to the variable ID and post hash show is some string-encoded
way of, you know, the post class and the show method. Well, instead of having to write string
parses, you can just use what Giles already has. It has pattern matching. You can just take the
URI, split it up, and take the method, and then just match on that, capture the ID component,
and then, you know, this, you know, the right's the equivalent. Gile code. So, you know, you have a
flexible DIY router, like pretty much right there. And years ago, I wrote Geeks Publish,
at least the first implementation of it. And we just, we just use that for the, for the, for
doing the URI, I know, no web framework necessary. Again, you get a lot with a little. And just a
quick example of, um, third-party libraries. Gile web sockets, library and maintain,
stands what Gile provides already for HTTP stuff to also do, uh, web sockets. Don't worry about
the code, but I just wanted to show you this is like a simple, um, like echo server. You can just
write that and connect to it from the browser and it'll echo things back to you. Okay,
let's get to the good stuff. Let's talk about Gile in the web browser. So, who is sort of
who before? Okay, great. A lot of people. So, those who don't know who is a scheme to
have assembly compilers, how we get Gile onto the web. And, um, it's a project developed by
sprightly, um, in conjunction with contracting with Galea and the wonderful wonderful
Andy Wingo, I Andy. Um, it's not only a compiler, but it's a full purpose, uh,
web assembly tool chain. Um, so if you have any interest in playing around with web assembly,
either at the low level, writing actual instructions or perhaps bringing another language to the
web, uh, I'd like to offer up who, as, as an interesting place to start. Um, it's an ahead of time
whole program compiler for scheme and the ideas you take your whole program and, uh, you let, um,
you get someone like Andy to be like, okay, we got to do all these compiler optimizations in it.
And it produces a relatively compact binary, you know, that you can ship over the web and use
minimal bandwidth. So, um, which is why we take the whole compilation strategy and Giles the
soul dependency for this thing. That no NPM, no I'm scripted. So, but it provides us a way to kind of
take an end run around this whole, you know, my opinion problematic and, uh, an NPM ecosystem. Um,
and so, and we do this as sprightly, we, you know, we can actually deploy to the web without having
to rely on, on NPM packages, which we think is really nice because we're big geeks fans and so
we can just use stuff that's available in geeks and have one package manager that, that, that,
that, for the entire, for the entire build and deployment. And, um, I don't know if fan is going
to get embarrassed by this quote, but it's one of my favorite things that's ever written. So, so,
who is approximately Gile? The intent is that this is Gile compiled for the web and, and it is
honest of a way as we can, which means there's things like all the primitives, like,
delimited continuations and things like that. They're, they're, they're implemented in tail calls,
of course. Kind of scheme without tail calls, web assembly has tail calls. It's great. We can kind of
reasonably deploy, you know, scheme programs without many compromises. So, I'm just going to say,
Gile's web booty doesn't pack all the funk in its trunk. Probably it's just junk. And,
in who does it? Um, so let's take a quick look at, uh, some more, um, examples of, of client side
things. Service stuff is interesting, but it's, it's the client somewhere it's at. Um, so first
to talk about fibers, is anyone know the fibers library and, and Gile Gile fibers? Okay,
not so many. Um, it's an asynchronous programming library, an implementation of communicating
sequential processes, um, basically. And, first, I guess I should also ask, who's familiar with,
like, a sync programming in JavaScript using promises, a sync await, okay, much more people.
Okay. So, those of you that are familiar with it are used to having to color the functions
that can use await with a sync. And when you want to suspend it, wait on something, you use await.
And, you know, I wear this function called sleep and it returns a promise. We can await on this.
And, but the point is, once, once you want to use this, any, any function that's intended to use
await has to be marked a sync. It's hard to take an existing code base and just like do a sync,
this new async thing with it. You have to go around and, and make changes to the code base.
Well, um, there's no coloring necessary with, with fibers and scheme. So, the, the,
this much smaller program over there is just using, um, the fibers API from, from hoot,
which is an exact copy of the one you can get for. Guile VM just, just implemented for the web.
And, you don't have, you don't have to color the run function. It's just, you can do a sleep,
and it'll suspend, and resume once through seconds of pass. So, I think this kind of nice is,
it makes for, like, more pleasant async programming. So, not only is it kind of a, a minimal thing,
I think it's like a win in terms of, like, developer ergonomics. Um, you know, um, who's used, react,
or any kind of virtual dominant position view, these sorts of things. Okay, so it's pretty,
pretty common. I have, like, some, you know, criticism of that, of that kind of, like, way of doing
front end, but it's common. So, I just wanted to show it. You can actually do this pretty minimally,
with hoot. We have a blog post here. At the bottom, I know it's a long-year-old. Don't worry about it,
but, um, we, we've, we've shown, you know, you can take, we're showing, uh, earlier I showed SXML,
rendered on the server. We can do the same thing on the client. Take the SXML tree,
use the Dom API, render the tree, in response to a user event, generate a new tree of what the current
state is, dip the two things, and then again, use the Dom API to render those changes, just like
reactous. And so, we can do it from scheme, and we get the benefit of, we don't need, like, JSX or some,
like, additional language to, to write, the templates is all just pure scheme code, and there we go.
Is that the 10-minute? Okay, great. Um, okay, actually, really quick. I'm going to get out of full screen.
Here, here is, let's go in now. I don't know what happened. Where did, where did my browser go?
It's not great when I only have five minutes left. No, it's, it's there.
Oh, this is a bad time to have that happen. I shouldn't have never switched.
I'm suggesting you try to grab moving it to a new workspace.
It's, it's mirrored is the thing. So I just kind of screwed up. Let's, let's do this real quick.
Let's see if I just, if I just choose this. Sorry, everybody. There it is. Okay,
I'm going to be really careful. Anyway, I'm going to skip all of that. Anyway, I won't show this
particular demo. So one thing that's actually a lot more interesting than virtual done to me is,
you know, we can do some interesting experiments in UI kind of moving past virtual done.
Who's heard of functional reactive programming? Some, okay. Functional active programs are really
neat thing. I'm interested in it. Not great with cycles in the graph. Typically, it's one way
data flow. Who's sort of propagators? So MIT thing. Okay, not that many people.
It's an interesting concept. There's, uh, someone by the name of Luxe Radoo wrote a dissertation
in 2009 showing how to implement functional reactive programming with propagators and it
encodes cycles. And so with hoot, with hoot, I've actually implemented the thing that was only
described in the paper. And this is a little hoot program. I can change both sides of the sliders
. There's two sets of sliders, RGB in HSV, change a slider in anyone and it's reflective
in the other sets of sliders. Um, so this is an interesting implementation of functional
reactive programming, but in a way that handles cycles. Um, implemented in scheme, compiled to
web assembly. I think it's pretty neat. Um, I'd like to do more experiments and like what we can do
to, uh, have more pleasant UI. Um, and just want to mention this really quick. I've been talking
a lot about client server stuff, but it's rightly really focused on peer to peer applications,
distributed applications. Um, Goblins is our framework. Um, for doing distributed programming,
peer to peer uses the actor model, uses something called object capabilities. My talks nearly
over, but just like a talent is going to be having a talk later talking all about this. I just wanted
to note it, put a pin in it, just to go tell you later. Um, and we made a game last year, um,
that uses HTML5 canvas, um, to do this. And, uh, I wish I had silenced, uh, matrix notifications
right now. Um, but. So we have this little game circuit button. You can move around and it's a
block-pushing game. It's really fun. Um, I want you to mention it, but look, you can see it's working.
This is a scheme program, student graphics, you know, doing a thing. So, you know, you can, you can
make your programs with this. Great. Really done. So, okay, to wrap up, um, let's talk about
the future. Um, like I said, who's intended to be an implementation of Gile? And so, we're not quite
there yet. There's a number of missing pieces. So we would like to support more or less all of Gile.
You know, you don't have the access to all the things in the politics API on the web, for example.
So there'll be some things that we can't do, but as much as possible, that's what we want to do.
Um, we like to add the Gile standard library. There's just like Gile just doesn't have a
JSON module for, for some reason. Um, the SXML stuff is really great, but there's not a, you can go
SXML to XSML, but there are SXML to XSML, but there's just no way to, to render each
TML. Like, but you could do it. I have code. I just had to carry it from one project to the other.
The fibers API is not built into Gile, but it's built into who they should just be in Gile. These are
nice things. Um, we like to advance web assembly. Um, you know, our implementation of
continuations could be better if web assembly adopted a stack switching proposal, which is
something that's out there right now. Um, we have some problems around bite vector performance,
and, um, which we represent in web assembly as this array I ate type, um, and we'd like to
advance proposals that can make these things better, so our scheme implementation is more
performant and less resource intensive. And also, we would like to advance peer to peer interests
on the web. Um, there's a lot of tricks you have to do right now to, to, to do peer to peer
stuff on the web. You're kind of in the world of centralized domain name systems and, uh, TLS
certificate authorities, and you kind of have to work with them to like bootstrap yourself into
appear to peer to peer worlds. We would like web browsers to accommodate, um, uh, the peer to peer,
um, model a little better. Um, so finally, please run in whether it be Gile, whether it be who
whether it be Goblins, here's links. Um, I'd like to see more people using who any new person that
uses who typically, that who doesn't cover amazing, and they find some bug, or they have a pet,
it's, it's, it's great. So the more people that use who the better gets, so please, if, if deploying
scheme to the web sounds great, give it a try. Um, so I want to thank our supporters,
our funders, and thank you. I know I'm out of time.
Excellent timing, Dave. Oh, questions. Cool.
This one there? Yeah. Yeah. So, uh, just some like big web project like, for example, Django
for, um, like, on the interior of the forest, something like that. Uh, can you repeat the question, Dave?
Yep. The question is, is there, like, a framework, such like, like Django or like Rails, um,
that's available for scheme now, or for Gile, or is going to be available? And there is one that I
have not used, it's called Ganyu Artenis, which is the Sanatra reverse, Sanatra is like a mini
Ruby web framework. I have not used it. I don't love web frameworks. Personally, I much prefer to
just like grab a few little things and, and piece them together, but that's something that
that could be used. I, but I can't speak to it. Um, before the next question, I just want to say,
we, spread this running a donor campaign. If this kind of stuff is really interesting to you,
if you'd like to see it advance, if you'd like to, to help support us, please go to Sprite
Data Institute slash donate, um, you know, we've, we've met our goal, but if we can, we just
stretch goal, we can do even more with hoot. So, um, we would greatly appreciate any contributions
there. Um, yes, down here. Yeah, so you mentioned that you can, uh,
uh, function, color, and color. But then when you have situation like, yeah, and your click
handle is need to be, uh, not, you think that's, is there a way to get back to where this
is. So the question is, without function coloring, is there a way to guarantee that the, like,
say, a click handler is synchronous? Is that the, uh, the answer would be, no, if you were to use
a fibers function, like, sleep, it would suspend. Um, so I guess the answer would be, don't, don't
use them. Oh, yeah, we got to unplug. Thank you, Peter. Sorry. So you can continue on, I'll take
a picture. Uh, in the back, and then I'll get to. Hi, Jenny. You mentioned, um,
don't make it fairly erratic, don't make it fairly. Uh, but you mentioned that about
confusing, uh, and one of the things about bio is to explain to you how to make a
function, it just has heat, so, so generally. So, do you anticipate that the heat is,
the package, or do you think the guy would have something a little more likely? Okay, so the
question is, uh, I was talking about package managers, language package managers, and all their
problems, uh, but there's another problem, which is that guy, itself, doesn't have a package manager,
and is, is the package manager that I recommend geeks, or, or do you think there's something else?
Did I capture that roughly? Okay, um, so, it is kind of the reverse problem, instead of having
a package manager that's totally separate from, from anything in the system package manager,
we have, guy, has none, and that has certain problems, uh, typically people use, like, the auto-tools
build system for packages and stuff, and it's, like, kind of trash to be honest. Um, personally,
for me, geeks is my package manager. Like, that's, uh, I don't, I do everything with Linux.
But I understand that that's not a sufficient answer for people that want to do
development on other platforms. You don't have, like, a across platform, um, solution.
So, I think, maybe a language package manager would be a good idea, but it's also, it's tricky,
because then you could end up in, in the same place. So, I don't, I'd like to talk more about
something like that, because I don't, I don't have good answers. Sorry, what?
There, as a package manager for Gile, and also said, Brother's came out,
there's also Aku, like, went back home. Aku? Aku, AKKU. Okay, AKKU, Aku, yes, I've heard of it,
but I haven't used it, but it's for many scheme implementations. So, that might be a path.
And it works on Gile. Thank you, definitely. Do I, do I have time for any more?
Yeah, you just want to, if you can, oh, right, yeah.
Here's the clip. I'm up for the show, three screens, uh, there it is.
Yeah, I'm used to it, so. Any, I haven't had an act.
I know someone had their hand up, and I, um, Mr. They were, yes.
I don't know how to, how to configure X-rams? No, it's, it's pretty, isn't it?
Does anybody know how to configure X-rams?
Well, well, Geeks in general allows, you know, to have your application can have an entirely different
dependency graph than another application and live happily on the same system events.
Um, with other things. Um, are you, sorry, the question was, uh, uh, the package.json stuff.
You have find, uh, applications are very fine-grained, control of the versions of which dependencies they use to
can Geeks do that. And so, um, I think you might be referring to Geeks, you know, typically has one version of
something. Yeah. Um, I think for the purposes of development, um, it, in some sense,
importers are useful if it's coming from another package ecosystem, but in the general case, um,
I often depend on versions that are unreleased of things, either Spritly Projects or my own or
someone else's, and I keep much like Nick's users have like a little Nick's shell configuration.
I keep a geek shell configuration, per project, and it has customizations of every dependency that's needed.
So it's not exactly automated, but if I need to refer to Git commits in order to get my work done
of unreleased things, I can do that very easily inflexibly. So, um, maybe it's on a perfect answer
for your question, but like, I've gotten by with that. Yeah. And I've been happy.
Oh, for God, it was in my pocket. You kind of, um, yeah, thank you. Thank you for telling me.
One of those things that like, just you kind of forget about like physical space when you repeat.
Yes. Can you compare, uh, okay, I'll tell us please, why, uh, the criminal can never be alive.
There's no more than, uh, can you tell me? Oh, the question is, can I explain why
web development is better in-guile than closure, for example?
Okay. And I don't know if I can, um, to me, closure is not a minimal thing, like using the JVM,
like you've left the land of minimalism to me. It's, it's, it's, it's a lot. The JVM's are
very heavy thing. Um, I got to wrap it up. Okay. I'm done. Um, we can talk more, but I just think that
that's not exactly like minimalism to me. And I think scheme is just a smaller footprint, et cetera. So,
but we can talk more. Yeah. Okay. Okay. Okay.
Thank you. Thank you.