fasterthanli.me
amos likes to tinker
https://fasterthanli.me/
2024-03-02T18:00:00Z
Amos Wenger
https://fasterthanli.me
told
https://cdn.fasterthanli.me/static/img/logo-square-2.028c7cae6c294ec7.png
Face cams: the missing guide
https://fasterthanli.me/articles/face-cams-the-missing-guide
2024-03-02T18:00:00Z
<p>I try to avoid doing "meta" / "behind the scenes" stuff, because I usually feel
like it has to be "earned". How many YouTube channels are channels about making
YouTube videos? Too many.</p>
Just paying Figma $15/month because nothing else fucking works
https://fasterthanli.me/articles/just-paying-figma-15-dollars
2023-10-19T16:50:00Z
<p>My family wasn't poor by any stretch of the imagination, but I was raised to
avoid spending money whenever possible.</p>
<p>I was also taught "it's a poor craftsman that blames their tools", which
apparently means "take responsibility for your fuckups", but, to young-me,
definitely sounded more like "you don't deserve nice things".</p>
Cracking Electron apps open
https://fasterthanli.me/articles/cracking-electron-apps-open
2023-07-03T16:30:00Z
<p>I use the <a href="https://github.com/jgraph/drawio-desktop">draw.io desktop app</a> to
make diagrams for my website. I run it on an actual desktop, like Windows or
macOS, but the asset pipeline that converts <code>.drawio</code> files, to <code>.pdf</code>, to
<code>.svg</code>, and then to <code>.svg</code> again (but smaller) runs on Linux.</p>
The RustConf Keynote Fiasco, explained
https://fasterthanli.me/articles/the-rustconf-keynote-fiasco-explained
2023-05-31T21:00:00Z
<div class="disclosure">
<p><strong>Disclosure</strong>:
At some point in this article, I discuss The Rust Foundation. I have received a
$5000 grant from them in 2023 for making educational articles and videos about
Rust.</p>
<p>I have NOT signed any non-disclosure, non-disparagement, or any other sort of
agreement that would prevent me from saying exactly how I feel about their
track record.</p>
</div>
<div class="disclosure">
</div>
Rust: The wrong people are resigning
https://fasterthanli.me/articles/rust-the-wrong-people-are-resigning
2023-05-28T17:04:00Z
<p>(Note: this was originally posted <a href="https://gist.github.com/fasterthanlime/42da9378768aebef662dd26dddf04849">as a
gist</a>)</p>
<h2>
<a id="reassuring-myself-about-rust" class="anchor" href="#reassuring-myself-about-rust">
Reassuring myself about Rust
</a>
</h2>
Extra credit
https://fasterthanli.me/series/building-a-rust-service-with-nix/part-12
2023-03-05T07:30:12Z
<p>We've achieved our goals already with this series: we have a web service written
in Rust, built into a Docker image with nix, with a nice dev shell, that we can
deploy to <a href="https://fly.io">fly.io</a>.</p>
<p>But there's always room for improvement, and so I wanted to talk about a few
things we didn't bother doing in the previous chapters.</p>
<h2>
<a id="making-clash-geoip-available-in-the-dev-shell" class="anchor" href="#making-clash-geoip-available-in-the-dev-shell">
Making <code>clash-geoip</code> available in the dev shell
</a>
</h2>
Generating a docker image with nix
https://fasterthanli.me/series/building-a-rust-service-with-nix/part-11
2023-03-05T07:30:11Z
<p>There it is. The final installment.</p>
<p>Over the course of this series, we've built a <em>very useful</em> Rust web service
that shows us colored ASCII art cats, and we've packaged it with docker, and
deployed it to <a href="https://fly.io">https://fly.io</a>.</p>
Making a dev shell with nix flakes
https://fasterthanli.me/series/building-a-rust-service-with-nix/part-10
2023-03-05T07:30:10Z
<p>In the previous chapter, we've made a nix "dev shell" that contained the fly.io
command-line utility, "flyctl".</p>
<p>That said, that's not how I want us to define a dev shell.</p>
<p>Our current solution has issues. I don't like that it has <code>import <nixpkgs></code>.
Which version of <code>nixpkgs</code> is that? The one you're on? Who knows what that is.</p>
Learning Nix from the bottom up
https://fasterthanli.me/series/building-a-rust-service-with-nix/part-9
2023-03-05T07:30:09Z
<p>Remember the snapshot we made allll the way back in <a href="part-1">Part 1</a>? Now's the time to use it.</p>
<p>Well, make sure you've committed and pushed all your changes, but when you're
ready, let's go back in time to before we installed anything catscii-specific in
our VM.</p>
Doing geo-location and keeping analytics
https://fasterthanli.me/series/building-a-rust-service-with-nix/part-8
2023-03-05T07:30:08Z
<p>I sold you on some additional functionality for <code>catscii</code> last chapter, and we
got caught up in private registry / docker shenanigans, so, now, let's resume
web development as promised.</p>
<h2>
<a id="adding-geolocation" class="anchor" href="#adding-geolocation">
Adding geolocation
</a>
</h2>
Using the Shipyard private crate registry with Docker
https://fasterthanli.me/series/building-a-rust-service-with-nix/part-7
2023-03-05T07:30:07Z
<div class="dialog bear">
<div class="dialog-head" title="Cool bear says:">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M21.41 41.398c.148-1.787.337-3.572.574-5.351.369-2.772 4.393-11.308 5.624-12.882l.553-.706-1.344-.449a5.772 5.772 0 0 1-3.948-5.478 5.786 5.786 0 0 1 5.779-5.78 5.768 5.768 0 0 1 5.684 4.758l.249 1.396 1.231-.704a28.845 28.845 0 0 1 14.282-3.801c4.991 0 9.93 1.314 14.282 3.801l1.231.704.249-1.396a5.766 5.766 0 0 1 5.683-4.758 5.786 5.786 0 0 1 5.779 5.78 5.772 5.772 0 0 1-3.948 5.478l-1.344.449.552.705c1.911 2.44 2.55 2.541 3.563 5.599 1.422 4.293 2.923 7.964 2.923 12.61v49.875h2V41.373c0-6.519-2.008-12.717-5.819-18.005a7.768 7.768 0 0 0 4.072-6.836c0-4.29-3.49-7.78-7.779-7.78a7.766 7.766 0 0 0-7.3 5.1 30.834 30.834 0 0 0-14.146-3.45 30.834 30.834 0 0 0-14.146 3.45 7.766 7.766 0 0 0-7.301-5.1c-4.289 0-7.779 3.49-7.779 7.78a7.766 7.766 0 0 0 4.072 6.836c-6.681 9.271-5.976 21.037-5.992 32.034-.017 11.946.656 23.895.109 35.838l2.006-.001c.67 0-.17-33.831-.156-36.912.022-4.312.148-8.631.505-12.929z"/><path d="M73.854 31.271v-4.494c0-.971-.79-1.76-1.761-1.76H55.235c-.604 0-1.3.869-1.778 1.905-.015 0-.027-.008-.042-.008H46.789c-.02 0-.037.011-.057.011-.478-1.037-1.175-1.908-1.779-1.908H28.094c-.971 0-1.761.79-1.761 1.76v4.494c0 4.477 3.643 8.119 8.119 8.119h5.12c4.265 0 7.734-3.47 7.734-7.734v-2.091H52.878v2.091c0 4.265 3.47 7.734 7.734 7.734h5.121c4.479-.001 8.121-3.643 8.121-8.119zm-41.713 3.192a1.387 1.387 0 0 1-1.917-.442 1.392 1.392 0 0 1 .442-1.917l8.403-5.255a1.392 1.392 0 0 1 1.475 2.359l-8.403 5.255zm11.163-2.18l-5.75 3.597a.95.95 0 0 1-1.313-.302.952.952 0 0 1 .303-1.312l5.75-3.597a.953.953 0 0 1 1.01 1.614zm15.168 1.935a1.387 1.387 0 0 1-1.917-.442 1.392 1.392 0 0 1 .442-1.917l8.403-5.255a1.392 1.392 0 0 1 1.475 2.359l-8.403 5.255zm4.909 1.561a.953.953 0 0 1-.506-1.759l5.75-3.597a.952.952 0 1 1 1.01 1.614l-5.75 3.597a.942.942 0 0 1-.504.145z"/><path d="M59.705 45.232h-2c0 1.823-1.483 3.306-3.306 3.306s-3.306-1.483-3.306-3.306v-1.439h1.06a3.294 3.294 0 0 0 3.285-3.285v-.17c0-.259-.038-.508-.095-.749a3.291 3.291 0 0 0-2.665-2.482 3.243 3.243 0 0 0-.525-.053h-4.12c-.18 0-.353.025-.525.053a3.291 3.291 0 0 0-2.665 2.482 3.255 3.255 0 0 0-.095.749v.17a3.294 3.294 0 0 0 3.285 3.285h1.06v1.439a3.31 3.31 0 0 1-3.307 3.306 3.31 3.31 0 0 1-3.306-3.306h-2a5.312 5.312 0 0 0 5.306 5.306 5.293 5.293 0 0 0 4.306-2.229 5.294 5.294 0 0 0 4.306 2.229 5.313 5.313 0 0 0 5.307-5.306zM29.742 58.336a.703.703 0 0 0-1.406 0v5.368a.704.704 0 0 0 1.406 0v-5.368zM43.779 58.336a.703.703 0 0 0-1.406 0v5.368a.704.704 0 0 0 1.406 0v-5.368zM57.816 58.336a.703.703 0 0 0-1.407 0v5.368a.704.704 0 0 0 1.407 0v-5.368zM71.853 58.336a.704.704 0 0 0-1.407 0v5.368a.704.704 0 0 0 1.407 0v-5.368zM35.354 71.559v5.369a.703.703 0 0 0 1.406 0v-5.369a.703.703 0 0 0-1.406 0zM49.39 71.559v5.369a.704.704 0 0 0 1.407 0v-5.369a.703.703 0 0 0-1.407 0zM63.427 71.559v5.369a.704.704 0 0 0 1.407 0v-5.369a.703.703 0 0 0-1.407 0zM29.038 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.406 0v-5.369a.703.703 0 0 0-.703-.703zM43.076 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.406 0v-5.369a.705.705 0 0 0-.703-.703zM57.113 81.364a.704.704 0 0 0-.704.703v5.369a.704.704 0 0 0 1.407 0v-5.369a.705.705 0 0 0-.703-.703zM71.149 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.407 0v-5.369a.705.705 0 0 0-.704-.703z"/></svg>
</div>
<div class="dialog-text">
<p>Wait wait wait, so we're not talking about nix yet?</p>
</div>
</div>
<p>Well, no! The service we have is pretty simple, and I want to complicate things
a bit, to show how things would work in both the Dockerfile and the nix
scenario.</p>
Deploying catscii to fly.io
https://fasterthanli.me/series/building-a-rust-service-with-nix/part-6
2023-03-05T07:30:06Z
<div class="disclosure">
<p><strong>Disclosure</strong>:
Because I used to work for fly.io, I still benefit from an employee discount
at the time of this writing: I don't have to pay for anything deployed there
for now.</p>
<p>fly.io is still <a href="/donate">sponsoring me</a> for developing
<a href="https://github.com/hapsoc/hring">hring</a>, but this isn't a sponsored post. It's
just a good fit for what we're doing here, with a generous free tier.</p>
</div>
Writing a Dockerfile for catscii
https://fasterthanli.me/series/building-a-rust-service-with-nix/part-5
2023-03-05T07:30:05Z
<p>Now that our service is production-ready, it's time to deploy it somewhere.</p>
<p>There's a lot of ways to approach this: what we are going to do, though, is
build a docker image. Or, I should say, an <a href="https://github.com/opencontainers/image-spec">OCI
image</a>.</p>
Serving ASCII cats over HTTP
https://fasterthanli.me/series/building-a-rust-service-with-nix/part-4
2023-03-05T07:30:04Z
<p>Our <code>catscii</code> program does everything we want it to do, except that it's a
command-line application rather than a web server. Let's fix that.</p>
<h2>
<a id="enter-axum" class="anchor" href="#enter-axum">
Enter <code>axum</code>
</a>
</h2>
Printing ASCII cats to the terminal
https://fasterthanli.me/series/building-a-rust-service-with-nix/part-3
2023-03-05T07:30:03Z
<p>Now that our development environment is all set up, let's make something useful!</p>
<h2>
<a id="creating-the-catscii-crate" class="anchor" href="#creating-the-catscii-crate">
Creating the <code>catscii</code> crate
</a>
</h2>
Developing over SSH
https://fasterthanli.me/series/building-a-rust-service-with-nix/part-2
2023-03-05T07:30:02Z
<p>With <a href="part-1">the previous part</a>'s VM still running, let's try connecting to our
machine over SSH.</p>
<h2>
<a id="network-addresses-loopback-and-ip-nets" class="anchor" href="#network-addresses-loopback-and-ip-nets">
Network addresses, loopback and IP nets
</a>
</h2>
Setting up a local Ubuntu Server VM
https://fasterthanli.me/series/building-a-rust-service-with-nix/part-1
2023-03-05T07:30:01Z
<p>The first step to using Nix to build Rust is to do so <em>without</em> Nix, so that
when we finally do, we can feel the difference.</p>
<p>There's many ways to go about this: everyone has their favorite code editor,
base Linux distribution (there's even a <a href="https://nixos.org/">NixOS</a>
distribution, which I won't cover). Some folks like to develop on macOS first,
and <em>then</em> build for Linux.</p>
The bottom emoji breaks rust-analyzer
https://fasterthanli.me/articles/the-bottom-emoji-breaks-rust-analyzer
2023-02-13T14:20:00Z
<p>Some bugs are merely fun. Others are simply delicious!</p>
<p>Today's pick is the latter.</p>
<h2>
<a id="reproducing-the-issue-part-1" class="anchor" href="#reproducing-the-issue-part-1">
Reproducing the issue, part 1
</a>
</h2>
Day 18 (Advent of Code 2022)
https://fasterthanli.me/series/advent-of-code-2022/part-18
2023-01-12T14:00:00Z
<p>This time around, we're porting a solution from C++ to Rust and seeing how it
feels, how it performs, and what we can learn about both languages by doing that.</p>
<p>See <a href="part-17">Day 17</a> for the rationale re: porting solutions rather than
writing my own from scratch. TL;DR is: it's better than nothing, and we can
still focus about learning Rust rather than spending entire days fighting
off-by-one errors.</p>
Twitch fell behind
https://fasterthanli.me/articles/twitch-fell-behind
2023-01-12T13:00:00Z
<p>So you want to do live streams. Are you sure? Okay. Let's talk about it.</p>
<h2>
<a id="let-s-talk-numbers" class="anchor" href="#let-s-talk-numbers">
Let's talk numbers
</a>
</h2>
Day 17 (Advent of Code 2022)
https://fasterthanli.me/series/advent-of-code-2022/part-17
2023-01-11T15:00:00Z
<p>Advent of Code gets harder and harder, and I'm not getting any smarter. Or any
more free time. So, in order to close out this series anyway, I'm going to try
and port other people's solutions from "language X" to Rust. That way, they
already figured out the hard stuff, and we can just focus on the Rust bits!</p>
Day 16 (Advent of Code 2022)
https://fasterthanli.me/series/advent-of-code-2022/part-16
2022-12-29T15:00:00Z
<p>Let's tackle the <a href="https://adventofcode.com/2022/day/16">day 16 puzzle</a>!</p>
<h2>
<a id="parsing" class="anchor" href="#parsing">
Parsing
</a>
</h2>
<p>The input looks like this:</p>
<div class="code-block" translate="no"><pre class="code-block-inner" data-lang="">Valve AA has flow rate=0; tunnels lead to valves DD, II, BB
Valve BB has flow rate=13; tunnels lead to valves CC, AA
Valve CC has flow rate=2; tunnels lead to valves DD, BB
Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE
Valve EE has flow rate=3; tunnels lead to valves FF, DD
Valve FF has flow rate=0; tunnels lead to valves EE, GG
Valve GG has flow rate=0; tunnels lead to valves FF, HH
Valve HH has flow rate=22; tunnel leads to valve GG
Valve II has flow rate=0; tunnels lead to valves AA, JJ
Valve JJ has flow rate=21; tunnel leads to valve II
</pre></div>
Day 15 (Advent of Code 2022)
https://fasterthanli.me/series/advent-of-code-2022/part-15
2022-12-25T17:00:00Z
<p>The <a href="https://adventofcode.com/2022/day/15">day 15 puzzle</a> falls into the "math
puzzle" territory more than "let's learn something new about Rust", but since
several folks asked if I was going to continue... let's continue.</p>
Day 14 (Advent of Code 2022)
https://fasterthanli.me/series/advent-of-code-2022/part-14
2022-12-15T19:00:00Z
<p>I like how the <a href="https://adventofcode.com/2022/day/14">day 14 puzzle</a> sounds,
because I think it'll give me an opportunity to show off yet <em>another way</em> to
have Rust embedded in a web page.</p>
<p>But first...</p>
<div class="dialog bear">
<div class="dialog-head" title="Cool bear says:">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M21.41 41.398c.148-1.787.337-3.572.574-5.351.369-2.772 4.393-11.308 5.624-12.882l.553-.706-1.344-.449a5.772 5.772 0 0 1-3.948-5.478 5.786 5.786 0 0 1 5.779-5.78 5.768 5.768 0 0 1 5.684 4.758l.249 1.396 1.231-.704a28.845 28.845 0 0 1 14.282-3.801c4.991 0 9.93 1.314 14.282 3.801l1.231.704.249-1.396a5.766 5.766 0 0 1 5.683-4.758 5.786 5.786 0 0 1 5.779 5.78 5.772 5.772 0 0 1-3.948 5.478l-1.344.449.552.705c1.911 2.44 2.55 2.541 3.563 5.599 1.422 4.293 2.923 7.964 2.923 12.61v49.875h2V41.373c0-6.519-2.008-12.717-5.819-18.005a7.768 7.768 0 0 0 4.072-6.836c0-4.29-3.49-7.78-7.779-7.78a7.766 7.766 0 0 0-7.3 5.1 30.834 30.834 0 0 0-14.146-3.45 30.834 30.834 0 0 0-14.146 3.45 7.766 7.766 0 0 0-7.301-5.1c-4.289 0-7.779 3.49-7.779 7.78a7.766 7.766 0 0 0 4.072 6.836c-6.681 9.271-5.976 21.037-5.992 32.034-.017 11.946.656 23.895.109 35.838l2.006-.001c.67 0-.17-33.831-.156-36.912.022-4.312.148-8.631.505-12.929z"/><path d="M73.854 31.271v-4.494c0-.971-.79-1.76-1.761-1.76H55.235c-.604 0-1.3.869-1.778 1.905-.015 0-.027-.008-.042-.008H46.789c-.02 0-.037.011-.057.011-.478-1.037-1.175-1.908-1.779-1.908H28.094c-.971 0-1.761.79-1.761 1.76v4.494c0 4.477 3.643 8.119 8.119 8.119h5.12c4.265 0 7.734-3.47 7.734-7.734v-2.091H52.878v2.091c0 4.265 3.47 7.734 7.734 7.734h5.121c4.479-.001 8.121-3.643 8.121-8.119zm-41.713 3.192a1.387 1.387 0 0 1-1.917-.442 1.392 1.392 0 0 1 .442-1.917l8.403-5.255a1.392 1.392 0 0 1 1.475 2.359l-8.403 5.255zm11.163-2.18l-5.75 3.597a.95.95 0 0 1-1.313-.302.952.952 0 0 1 .303-1.312l5.75-3.597a.953.953 0 0 1 1.01 1.614zm15.168 1.935a1.387 1.387 0 0 1-1.917-.442 1.392 1.392 0 0 1 .442-1.917l8.403-5.255a1.392 1.392 0 0 1 1.475 2.359l-8.403 5.255zm4.909 1.561a.953.953 0 0 1-.506-1.759l5.75-3.597a.952.952 0 1 1 1.01 1.614l-5.75 3.597a.942.942 0 0 1-.504.145z"/><path d="M59.705 45.232h-2c0 1.823-1.483 3.306-3.306 3.306s-3.306-1.483-3.306-3.306v-1.439h1.06a3.294 3.294 0 0 0 3.285-3.285v-.17c0-.259-.038-.508-.095-.749a3.291 3.291 0 0 0-2.665-2.482 3.243 3.243 0 0 0-.525-.053h-4.12c-.18 0-.353.025-.525.053a3.291 3.291 0 0 0-2.665 2.482 3.255 3.255 0 0 0-.095.749v.17a3.294 3.294 0 0 0 3.285 3.285h1.06v1.439a3.31 3.31 0 0 1-3.307 3.306 3.31 3.31 0 0 1-3.306-3.306h-2a5.312 5.312 0 0 0 5.306 5.306 5.293 5.293 0 0 0 4.306-2.229 5.294 5.294 0 0 0 4.306 2.229 5.313 5.313 0 0 0 5.307-5.306zM29.742 58.336a.703.703 0 0 0-1.406 0v5.368a.704.704 0 0 0 1.406 0v-5.368zM43.779 58.336a.703.703 0 0 0-1.406 0v5.368a.704.704 0 0 0 1.406 0v-5.368zM57.816 58.336a.703.703 0 0 0-1.407 0v5.368a.704.704 0 0 0 1.407 0v-5.368zM71.853 58.336a.704.704 0 0 0-1.407 0v5.368a.704.704 0 0 0 1.407 0v-5.368zM35.354 71.559v5.369a.703.703 0 0 0 1.406 0v-5.369a.703.703 0 0 0-1.406 0zM49.39 71.559v5.369a.704.704 0 0 0 1.407 0v-5.369a.703.703 0 0 0-1.407 0zM63.427 71.559v5.369a.704.704 0 0 0 1.407 0v-5.369a.703.703 0 0 0-1.407 0zM29.038 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.406 0v-5.369a.703.703 0 0 0-.703-.703zM43.076 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.406 0v-5.369a.705.705 0 0 0-.703-.703zM57.113 81.364a.704.704 0 0 0-.704.703v5.369a.704.704 0 0 0 1.407 0v-5.369a.705.705 0 0 0-.703-.703zM71.149 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.407 0v-5.369a.705.705 0 0 0-.704-.703z"/></svg>
</div>
<div class="dialog-text">
<p>Let me guess: parsing?</p>
</div>
</div>
Day 13 (Advent of Code 2022)
https://fasterthanli.me/series/advent-of-code-2022/part-13
2022-12-14T20:30:00Z
<p>The <a href="https://adventofcode.com/2022/day/13">day 13 puzzle</a> needs a speech
therapist.</p>
<div class="dialog bear">
<div class="dialog-head" title="Cool bear says:">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M21.41 41.398c.148-1.787.337-3.572.574-5.351.369-2.772 4.393-11.308 5.624-12.882l.553-.706-1.344-.449a5.772 5.772 0 0 1-3.948-5.478 5.786 5.786 0 0 1 5.779-5.78 5.768 5.768 0 0 1 5.684 4.758l.249 1.396 1.231-.704a28.845 28.845 0 0 1 14.282-3.801c4.991 0 9.93 1.314 14.282 3.801l1.231.704.249-1.396a5.766 5.766 0 0 1 5.683-4.758 5.786 5.786 0 0 1 5.779 5.78 5.772 5.772 0 0 1-3.948 5.478l-1.344.449.552.705c1.911 2.44 2.55 2.541 3.563 5.599 1.422 4.293 2.923 7.964 2.923 12.61v49.875h2V41.373c0-6.519-2.008-12.717-5.819-18.005a7.768 7.768 0 0 0 4.072-6.836c0-4.29-3.49-7.78-7.779-7.78a7.766 7.766 0 0 0-7.3 5.1 30.834 30.834 0 0 0-14.146-3.45 30.834 30.834 0 0 0-14.146 3.45 7.766 7.766 0 0 0-7.301-5.1c-4.289 0-7.779 3.49-7.779 7.78a7.766 7.766 0 0 0 4.072 6.836c-6.681 9.271-5.976 21.037-5.992 32.034-.017 11.946.656 23.895.109 35.838l2.006-.001c.67 0-.17-33.831-.156-36.912.022-4.312.148-8.631.505-12.929z"/><path d="M73.854 31.271v-4.494c0-.971-.79-1.76-1.761-1.76H55.235c-.604 0-1.3.869-1.778 1.905-.015 0-.027-.008-.042-.008H46.789c-.02 0-.037.011-.057.011-.478-1.037-1.175-1.908-1.779-1.908H28.094c-.971 0-1.761.79-1.761 1.76v4.494c0 4.477 3.643 8.119 8.119 8.119h5.12c4.265 0 7.734-3.47 7.734-7.734v-2.091H52.878v2.091c0 4.265 3.47 7.734 7.734 7.734h5.121c4.479-.001 8.121-3.643 8.121-8.119zm-41.713 3.192a1.387 1.387 0 0 1-1.917-.442 1.392 1.392 0 0 1 .442-1.917l8.403-5.255a1.392 1.392 0 0 1 1.475 2.359l-8.403 5.255zm11.163-2.18l-5.75 3.597a.95.95 0 0 1-1.313-.302.952.952 0 0 1 .303-1.312l5.75-3.597a.953.953 0 0 1 1.01 1.614zm15.168 1.935a1.387 1.387 0 0 1-1.917-.442 1.392 1.392 0 0 1 .442-1.917l8.403-5.255a1.392 1.392 0 0 1 1.475 2.359l-8.403 5.255zm4.909 1.561a.953.953 0 0 1-.506-1.759l5.75-3.597a.952.952 0 1 1 1.01 1.614l-5.75 3.597a.942.942 0 0 1-.504.145z"/><path d="M59.705 45.232h-2c0 1.823-1.483 3.306-3.306 3.306s-3.306-1.483-3.306-3.306v-1.439h1.06a3.294 3.294 0 0 0 3.285-3.285v-.17c0-.259-.038-.508-.095-.749a3.291 3.291 0 0 0-2.665-2.482 3.243 3.243 0 0 0-.525-.053h-4.12c-.18 0-.353.025-.525.053a3.291 3.291 0 0 0-2.665 2.482 3.255 3.255 0 0 0-.095.749v.17a3.294 3.294 0 0 0 3.285 3.285h1.06v1.439a3.31 3.31 0 0 1-3.307 3.306 3.31 3.31 0 0 1-3.306-3.306h-2a5.312 5.312 0 0 0 5.306 5.306 5.293 5.293 0 0 0 4.306-2.229 5.294 5.294 0 0 0 4.306 2.229 5.313 5.313 0 0 0 5.307-5.306zM29.742 58.336a.703.703 0 0 0-1.406 0v5.368a.704.704 0 0 0 1.406 0v-5.368zM43.779 58.336a.703.703 0 0 0-1.406 0v5.368a.704.704 0 0 0 1.406 0v-5.368zM57.816 58.336a.703.703 0 0 0-1.407 0v5.368a.704.704 0 0 0 1.407 0v-5.368zM71.853 58.336a.704.704 0 0 0-1.407 0v5.368a.704.704 0 0 0 1.407 0v-5.368zM35.354 71.559v5.369a.703.703 0 0 0 1.406 0v-5.369a.703.703 0 0 0-1.406 0zM49.39 71.559v5.369a.704.704 0 0 0 1.407 0v-5.369a.703.703 0 0 0-1.407 0zM63.427 71.559v5.369a.704.704 0 0 0 1.407 0v-5.369a.703.703 0 0 0-1.407 0zM29.038 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.406 0v-5.369a.703.703 0 0 0-.703-.703zM43.076 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.406 0v-5.369a.705.705 0 0 0-.703-.703zM57.113 81.364a.704.704 0 0 0-.704.703v5.369a.704.704 0 0 0 1.407 0v-5.369a.705.705 0 0 0-.703-.703zM71.149 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.407 0v-5.369a.705.705 0 0 0-.704-.703z"/></svg>
</div>
<div class="dialog-text">
<p>???</p>
</div>
</div>
<p>...because it has an awful lisp!! Ahhhahahahhhh</p>
<div class="dialog bear">
<div class="dialog-head" title="Cool bear says:">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M21.41 41.398c.148-1.787.337-3.572.574-5.351.369-2.772 4.393-11.308 5.624-12.882l.553-.706-1.344-.449a5.772 5.772 0 0 1-3.948-5.478 5.786 5.786 0 0 1 5.779-5.78 5.768 5.768 0 0 1 5.684 4.758l.249 1.396 1.231-.704a28.845 28.845 0 0 1 14.282-3.801c4.991 0 9.93 1.314 14.282 3.801l1.231.704.249-1.396a5.766 5.766 0 0 1 5.683-4.758 5.786 5.786 0 0 1 5.779 5.78 5.772 5.772 0 0 1-3.948 5.478l-1.344.449.552.705c1.911 2.44 2.55 2.541 3.563 5.599 1.422 4.293 2.923 7.964 2.923 12.61v49.875h2V41.373c0-6.519-2.008-12.717-5.819-18.005a7.768 7.768 0 0 0 4.072-6.836c0-4.29-3.49-7.78-7.779-7.78a7.766 7.766 0 0 0-7.3 5.1 30.834 30.834 0 0 0-14.146-3.45 30.834 30.834 0 0 0-14.146 3.45 7.766 7.766 0 0 0-7.301-5.1c-4.289 0-7.779 3.49-7.779 7.78a7.766 7.766 0 0 0 4.072 6.836c-6.681 9.271-5.976 21.037-5.992 32.034-.017 11.946.656 23.895.109 35.838l2.006-.001c.67 0-.17-33.831-.156-36.912.022-4.312.148-8.631.505-12.929z"/><path d="M73.854 31.271v-4.494c0-.971-.79-1.76-1.761-1.76H55.235c-.604 0-1.3.869-1.778 1.905-.015 0-.027-.008-.042-.008H46.789c-.02 0-.037.011-.057.011-.478-1.037-1.175-1.908-1.779-1.908H28.094c-.971 0-1.761.79-1.761 1.76v4.494c0 4.477 3.643 8.119 8.119 8.119h5.12c4.265 0 7.734-3.47 7.734-7.734v-2.091H52.878v2.091c0 4.265 3.47 7.734 7.734 7.734h5.121c4.479-.001 8.121-3.643 8.121-8.119zm-41.713 3.192a1.387 1.387 0 0 1-1.917-.442 1.392 1.392 0 0 1 .442-1.917l8.403-5.255a1.392 1.392 0 0 1 1.475 2.359l-8.403 5.255zm11.163-2.18l-5.75 3.597a.95.95 0 0 1-1.313-.302.952.952 0 0 1 .303-1.312l5.75-3.597a.953.953 0 0 1 1.01 1.614zm15.168 1.935a1.387 1.387 0 0 1-1.917-.442 1.392 1.392 0 0 1 .442-1.917l8.403-5.255a1.392 1.392 0 0 1 1.475 2.359l-8.403 5.255zm4.909 1.561a.953.953 0 0 1-.506-1.759l5.75-3.597a.952.952 0 1 1 1.01 1.614l-5.75 3.597a.942.942 0 0 1-.504.145z"/><path d="M59.705 45.232h-2c0 1.823-1.483 3.306-3.306 3.306s-3.306-1.483-3.306-3.306v-1.439h1.06a3.294 3.294 0 0 0 3.285-3.285v-.17c0-.259-.038-.508-.095-.749a3.291 3.291 0 0 0-2.665-2.482 3.243 3.243 0 0 0-.525-.053h-4.12c-.18 0-.353.025-.525.053a3.291 3.291 0 0 0-2.665 2.482 3.255 3.255 0 0 0-.095.749v.17a3.294 3.294 0 0 0 3.285 3.285h1.06v1.439a3.31 3.31 0 0 1-3.307 3.306 3.31 3.31 0 0 1-3.306-3.306h-2a5.312 5.312 0 0 0 5.306 5.306 5.293 5.293 0 0 0 4.306-2.229 5.294 5.294 0 0 0 4.306 2.229 5.313 5.313 0 0 0 5.307-5.306zM29.742 58.336a.703.703 0 0 0-1.406 0v5.368a.704.704 0 0 0 1.406 0v-5.368zM43.779 58.336a.703.703 0 0 0-1.406 0v5.368a.704.704 0 0 0 1.406 0v-5.368zM57.816 58.336a.703.703 0 0 0-1.407 0v5.368a.704.704 0 0 0 1.407 0v-5.368zM71.853 58.336a.704.704 0 0 0-1.407 0v5.368a.704.704 0 0 0 1.407 0v-5.368zM35.354 71.559v5.369a.703.703 0 0 0 1.406 0v-5.369a.703.703 0 0 0-1.406 0zM49.39 71.559v5.369a.704.704 0 0 0 1.407 0v-5.369a.703.703 0 0 0-1.407 0zM63.427 71.559v5.369a.704.704 0 0 0 1.407 0v-5.369a.703.703 0 0 0-1.407 0zM29.038 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.406 0v-5.369a.703.703 0 0 0-.703-.703zM43.076 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.406 0v-5.369a.705.705 0 0 0-.703-.703zM57.113 81.364a.704.704 0 0 0-.704.703v5.369a.704.704 0 0 0 1.407 0v-5.369a.705.705 0 0 0-.703-.703zM71.149 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.407 0v-5.369a.705.705 0 0 0-.704-.703z"/></svg>
</div>
<div class="dialog-text">
<p>Are you ok? What is.. what is going on with you?</p>
</div>
</div>
<p>No but seriously we have what are ostensibly S-expressions, except they use
JSON-adjacent notation:</p>
<div class="code-block" translate="no"><pre class="code-block-inner" data-lang="">[1,1,3,1,1]
[1,1,5,1,1]
[[1],[2,3,4]]
[[1],4]
[9]
[[8,7,6]]
[[4,4],4,4]
[[4,4],4,4,4]
[7,7,7,7]
[7,7,7]
[]
[3]
[[[]]]
[[]]
[1,[2,[3,[4,[5,6,7]]]],8,9]
[1,[2,[3,[4,[5,6,0]]]],8,9]
</pre></div>