WEBVTT

NOTE
This file was generated by Descript <www.descript.com>

00:00:13.966 --> 00:00:15.706
<v Amanda Majorowicz>This
is Self-Directed Research.

00:00:15.796 --> 00:00:19.516
Our hosts, James and Amos, get hyped about
different topics and take turns each week

00:00:19.546 --> 00:00:20.986
presenting their ideas to each other.

00:00:21.376 --> 00:00:23.746
You can check out the website,
YouTube or Spotify to watch the

00:00:23.746 --> 00:00:28.366
episode's presentation and visit
sdr-podcast.com/episodes for

00:00:28.366 --> 00:00:31.966
previous episodes, presentations and
videos, show notes and transcripts.

00:00:32.206 --> 00:00:34.216
New episodes are
published every Wednesday.

00:00:34.576 --> 00:00:38.465
This week Amos discusses things you
might not have known about clipboards.

00:00:38.864 --> 00:00:40.324
<v James Munns>This episode is
sponsored by CodeCrafters.

00:00:40.324 --> 00:00:46.454
Visit sdr-podcast.com/codecrafters for
more information or to sign up today.

00:00:46.644 --> 00:00:49.024
Or stay tuned to the end of the
episode for more information.

00:00:56.042 --> 00:01:00.242
<v Amos Wenger>I like that I'm
on black tea and like downers

00:01:00.282 --> 00:01:04.232
and uh, James is on Red Bull?

00:01:04.522 --> 00:01:05.992
Can everyone see my slides?

00:01:06.512 --> 00:01:07.372
<v James Munns>Looks lovely.

00:01:07.802 --> 00:01:10.142
<v Amos Wenger>I got tired of
making presentations about Rust.

00:01:10.252 --> 00:01:12.462
I want to talk about something
else for a change because I feel

00:01:12.462 --> 00:01:16.352
like I've been giving the same
talk two or three times on SDR.

00:01:17.129 --> 00:01:19.524
Today's presentation is about clipboards.

00:01:19.544 --> 00:01:22.714
It's called "Things you might not
have known about clipboards and some

00:01:22.714 --> 00:01:24.894
things I still do not understand."

00:01:25.224 --> 00:01:27.594
The reason I care about
clipboards is because I make

00:01:27.594 --> 00:01:28.964
a lot of slide decks nowadays.

00:01:29.014 --> 00:01:30.314
I make them for SDR.

00:01:30.354 --> 00:01:33.734
We have slides every time, you can see
them on the website, you can see them on

00:01:33.744 --> 00:01:35.354
the video if you watch them on YouTube.

00:01:35.824 --> 00:01:39.174
And sometimes we have code and when
we have code, I don't want to have a

00:01:39.174 --> 00:01:43.414
picture of a code editor, I actually
want to have syntax highlighted code.

00:01:43.494 --> 00:01:49.019
I want actual texts that will render,
crisp at any resolution and have the

00:01:49.029 --> 00:01:53.919
color scheme that I chose and not
some random dude who published a weird

00:01:53.919 --> 00:01:57.809
Google Slides plugin five years ago
chose because it's going to be bad.

00:01:58.399 --> 00:02:03.149
And I did a bunch of weird
stuff to make that happen.

00:02:03.159 --> 00:02:06.779
It's linked to my website because I
usually write things like as articles

00:02:06.779 --> 00:02:10.399
and also as videos, so I need to
paste them in different places.

00:02:10.429 --> 00:02:13.179
And that led me to play
a bunch with clipboards.

00:02:13.239 --> 00:02:17.719
And I just want to have an SDR episode
where we go together over how weird and

00:02:17.719 --> 00:02:19.929
cursed and fantastic clipboards are.

00:02:20.508 --> 00:02:24.424
I guess a good introduction is,
as a kid, I got an Ubuntu CD, and

00:02:24.424 --> 00:02:25.864
that was the beginning of the end.

00:02:25.874 --> 00:02:29.389
I installed it on my
parents' computer, I think?

00:02:29.739 --> 00:02:33.489
Before I got my own computers and it
got me into the whole like Linux thing.

00:02:33.499 --> 00:02:34.299
It was over for me.

00:02:34.359 --> 00:02:37.339
Like it was, it was a gateway to
becoming an open source maintainer,

00:02:37.339 --> 00:02:38.689
burning out and all that stuff.

00:02:38.828 --> 00:02:42.338
But one thing I learned is that on Linux-
at least back then, I don't even know if

00:02:42.338 --> 00:02:46.188
that's still a thing today, it probably
is- if you select text, it immediately

00:02:46.188 --> 00:02:50.258
goes into some clipboard, which is not
called a clipboard, we'll get to that.

00:02:50.498 --> 00:02:53.878
But it goes somewhere, and then you
can middle click somewhere else, and

00:02:53.878 --> 00:02:55.068
that's actually going to paste it.

00:02:55.081 --> 00:03:00.478
So, I had played with Windows a bit,
the early Windows, I think my first

00:03:00.478 --> 00:03:03.080
Windows was Windows 3.11 for Workgroup.

00:03:03.186 --> 00:03:03.626
<v James Munns>Hell yeah.

00:03:03.666 --> 00:03:05.616
I had a, I had an old DOS computer too.

00:03:05.626 --> 00:03:09.066
It was a IBM something-or-other, but
it was like- it would boot in DOS.

00:03:09.346 --> 00:03:12.026
And if you needed to, you
could boot into Windows to play

00:03:12.026 --> 00:03:13.456
a certain game or whatever.

00:03:13.701 --> 00:03:16.661
<v Amos Wenger>Exactly, you type
W I N, enter, and then it would

00:03:16.671 --> 00:03:18.411
boot up into Windows, yes.

00:03:18.721 --> 00:03:22.581
And then I spent most of my time
on Windows 95 and 98SE, you know.

00:03:22.921 --> 00:03:25.961
And crashes were a lot more frequent,
I forgot how frequent crashes

00:03:25.961 --> 00:03:27.461
were, and how blessed we are today.

00:03:27.461 --> 00:03:30.463
Today, it just, kind of, sometimes
the desktop reboots, that's it.

00:03:30.823 --> 00:03:32.063
That's what happens when you get a crash.

00:03:32.430 --> 00:03:34.920
For me, the clipboard was
like Ctrl+C, Ctrl+V, right?

00:03:34.920 --> 00:03:37.130
Ctrl+C, it's in the clipboard,
Ctrl+V, you paste it.

00:03:37.725 --> 00:03:40.629
Not at all the case, like this is
the experience most people have

00:03:40.629 --> 00:03:41.929
of clipboards, I would imagine.

00:03:42.014 --> 00:03:46.596
But my first exposure to how weird
they were was that on X, I was using

00:03:46.596 --> 00:03:50.129
it on Linux, but on X, which I think
you can also use on various BSDs.

00:03:50.345 --> 00:03:52.795
So X11, xorg, I don't even know
how to call it at this point.

00:03:52.907 --> 00:03:54.921
There are multiple selection buffers.

00:03:55.283 --> 00:03:59.093
The primary selection buffer is kind
of the highlighting middle click

00:03:59.093 --> 00:04:00.303
thing that I just talked about.

00:04:00.563 --> 00:04:04.643
And then the clipboard selection
buffer is the Ctrl+C, Ctrl+V thing

00:04:04.993 --> 00:04:10.163
that you get in GUI applications,
applications using GTK, using Qt.

00:04:10.681 --> 00:04:12.531
And so there's a command
line tool called xclip.

00:04:13.155 --> 00:04:14.975
And you can pipe things into it.

00:04:14.975 --> 00:04:18.195
So if you have like a command that
generates a lot of text, you actually want

00:04:18.195 --> 00:04:21.975
to paste that somewhere into the browser,
for example, you can run that command and

00:04:21.975 --> 00:04:27.395
then pipe and then xclip, but you have to
specify `-selection clipboard`, otherwise

00:04:27.415 --> 00:04:29.795
it goes into the wrong selection buffer.

00:04:30.175 --> 00:04:32.485
Browsers are especially cursed as well.

00:04:32.680 --> 00:04:35.170
Again, fond memories of my
Linux on the desktop days.

00:04:35.170 --> 00:04:37.940
I have since moved to
Windows and then to macOS.

00:04:38.190 --> 00:04:42.530
I remember pasting an image into a Linux
browser- so like doing a screenshot, and

00:04:42.530 --> 00:04:47.190
then Ctrl+V into a browser, like on GitHub
or Twitter or whatever- could freeze it?

00:04:47.476 --> 00:04:50.921
And I'm not sure that's still the
case, but honestly, I wouldn't be

00:04:50.921 --> 00:04:55.601
surprised, but now X has been phased
out to some extent and there's

00:04:55.601 --> 00:04:59.221
Wayland, so I imagine clipboards are
now breaking in new, exciting ways

00:04:59.321 --> 00:05:01.551
that I haven't even learned about yet.

00:05:01.816 --> 00:05:03.206
<v James Munns>Always something to debug.

00:05:03.596 --> 00:05:05.086
So many opportunities for learning.

00:05:05.086 --> 00:05:05.866
<v Amos Wenger>Exactly.

00:05:06.616 --> 00:05:08.636
Oh, this is another fun
one: I have a slide here.

00:05:08.666 --> 00:05:10.796
And again, you're missing out if
you're not actually looking at the

00:05:10.796 --> 00:05:15.036
slides, you can get the PDFs of
the slide decks on sdr-podcast.com.

00:05:15.056 --> 00:05:18.576
Go to episodes, find the one we're
talking about, or you just watch this

00:05:18.576 --> 00:05:21.596
on YouTube, in which case you have been
looking at the slide for quite some time.

00:05:21.826 --> 00:05:23.456
The slide is just the Twitter.

00:05:23.554 --> 00:05:25.764
message composer, whatever
they're calling it.

00:05:25.954 --> 00:05:32.354
And it has a single camera emoji,
like DSLR, not like movie camera.

00:05:32.914 --> 00:05:37.379
And that's the result of doing copy
image from another tab and then

00:05:37.379 --> 00:05:40.399
pasting it into Twitter on Safari.

00:05:40.559 --> 00:05:43.299
Instead of pasting the image,
it just pasted this emoji.

00:05:43.418 --> 00:05:43.958
<v James Munns>What?

00:05:44.278 --> 00:05:44.488
What?

00:05:44.918 --> 00:05:46.958
Who was like, "This is what they'll want.

00:05:46.998 --> 00:05:50.208
This is, you know, exactly
what they were looking for!"

00:05:51.068 --> 00:05:52.098
<v Amos Wenger>I have no idea.

00:05:52.438 --> 00:05:56.938
Honestly, I feel like everyone gets
mad at browsers that aren't Chrome.

00:05:57.188 --> 00:05:59.968
So people get mad at Firefox,
people get mad at Safari...

00:06:00.358 --> 00:06:05.088
when actually it's probably on the
developers of websites and web apps for

00:06:05.088 --> 00:06:06.878
not testing on anything other than Chrome.

00:06:07.358 --> 00:06:12.442
And, you know, given the recent run
of Twitter being Twitter, I guess...

00:06:12.777 --> 00:06:16.497
like Twitter being X, it's not
surprising to me that this happens.

00:06:16.647 --> 00:06:18.474
I mean, a little, still, but...

00:06:18.495 --> 00:06:19.305
I don't know what to tell you.

00:06:19.803 --> 00:06:22.133
There are some good
things about clipboards.

00:06:22.223 --> 00:06:26.773
Ever since I moved everything over to the
Apple ecosystem- I have like a Mac mini,

00:06:26.773 --> 00:06:31.543
I have a Mac Studio, I have an iPhone,
I have a MacBook- I can copy from some

00:06:31.543 --> 00:06:33.533
device and paste into another device.

00:06:33.863 --> 00:06:36.683
So, banking apps tend to be on
phones for security reasons.

00:06:36.693 --> 00:06:37.853
You have face ID and everything.

00:06:38.203 --> 00:06:41.928
And then I usually fill forms out on
desktop because that's convenient.

00:06:41.928 --> 00:06:46.388
So you can just open the banking app,
hit copy and then paste into the desktop.

00:06:46.418 --> 00:06:47.968
There's no like setup to do.

00:06:48.339 --> 00:06:51.399
They do even a crazier Continuity
things where you can if you have two

00:06:51.399 --> 00:06:54.739
computers, you can just move the mouse
to the edge of one of the screens and

00:06:54.739 --> 00:06:56.389
it'll appear on the other one magically.

00:06:56.509 --> 00:07:01.439
A feature that is cool when it works, and
then I'm sure exactly twelve people on

00:07:01.439 --> 00:07:05.034
earth know about, because I don't think
they've done any effort in trying to tell

00:07:05.034 --> 00:07:08.754
people that it's there so people just
download third party apps instead that

00:07:08.754 --> 00:07:10.254
are worse and they need to pay money for.

00:07:10.264 --> 00:07:11.874
<v James Munns>I don't know if you
mentioned it because you mentioned

00:07:11.874 --> 00:07:13.724
that xclip works on Linux.

00:07:13.724 --> 00:07:17.184
It took me forever to realize that
on macOS they also have pbcopy?

00:07:17.204 --> 00:07:19.374
Which I don't know if is built
in or whatever, but they have a

00:07:19.374 --> 00:07:23.602
similar sort of you can pipe a
bunch of stuff into a command line

00:07:23.612 --> 00:07:25.282
and then paste it somewhere else.

00:07:25.282 --> 00:07:29.312
I'm just, you know, Ctrl+C Ctrl+V
all over the place kind of person.

00:07:29.550 --> 00:07:33.470
<v Amos Wenger>If I had to summarize
everything we've seen so far, we have

00:07:33.470 --> 00:07:38.680
learned that operating systems, or like,
windowing systems, it's fuzzy, okay?

00:07:38.680 --> 00:07:40.820
The nomenclature is- don't, don't sue me.

00:07:41.150 --> 00:07:46.810
Operating systems have multiple
clipboards, for X- based systems and

00:07:46.810 --> 00:07:48.430
I'm assuming Wayland also copies this.

00:07:48.430 --> 00:07:49.080
I have no idea.

00:07:49.090 --> 00:07:50.380
I don't, don't at me about Wayland.

00:07:50.380 --> 00:07:51.090
I don't care anymore.

00:07:51.430 --> 00:07:56.060
For X, there's a primary selection
buffer and clipboard selection buffer.

00:07:56.290 --> 00:08:00.760
On macOS, there's also a different
set of paste boards as they call it.

00:08:00.810 --> 00:08:02.990
So nothing, none of that is
actually called a clipboard.

00:08:03.070 --> 00:08:05.860
Like clipboard is just the
name of one X selection buffer.

00:08:06.255 --> 00:08:07.675
But there's no clipboard on macOS.

00:08:07.695 --> 00:08:08.505
It's a pasteboard.

00:08:08.525 --> 00:08:09.695
Hence the name pbcopy.

00:08:09.695 --> 00:08:11.675
We're talking about the pbcopy CLI tool.

00:08:11.675 --> 00:08:12.845
That's pasteboard copy.

00:08:13.375 --> 00:08:15.155
Uh, but it still has a bunch
of different pasteboards.

00:08:15.175 --> 00:08:17.305
It has the general one,
it has the drag one.

00:08:17.575 --> 00:08:21.715
For example, when I use one of my new
favorite tools on Mac- well, it's not new,

00:08:21.715 --> 00:08:24.485
but it's new to me- called CleanShot X.

00:08:25.045 --> 00:08:28.562
It's just a screenshotting tool that
is better than the built in MacOS one.

00:08:28.862 --> 00:08:31.452
And instead of putting the
image in the general pasteboard.

00:08:31.502 --> 00:08:34.232
It has it floating as a window
and then you can drag the

00:08:34.232 --> 00:08:35.312
window wherever you want to.

00:08:35.512 --> 00:08:38.386
And what that does is that
it doesn't override whatever

00:08:38.386 --> 00:08:39.426
you had in the clipboard.

00:08:39.706 --> 00:08:44.566
So actually this was super useful when
coming up with that slide deck because

00:08:44.570 --> 00:08:46.483
it didn't override what I had in there...

00:08:46.503 --> 00:08:50.472
because I was taking screenshots
of a tool called pasteboard viewer.

00:08:50.832 --> 00:08:56.272
Not only do we have multiple clipboards,
each clipboard can have multiple items.

00:08:56.272 --> 00:08:59.562
This makes sense if you think of
like selecting a bunch of files in

00:08:59.572 --> 00:09:00.902
the finder and then copying them.

00:09:00.912 --> 00:09:02.472
Each of those files is one item.

00:09:03.062 --> 00:09:06.332
And then also items can be
available in several formats.

00:09:06.562 --> 00:09:09.827
And that's where, if you have
access to the slides, again,

00:09:09.897 --> 00:09:10.817
you know where to find them.

00:09:10.997 --> 00:09:14.370
But you will be able to see a
little app called Pasteboard-Viewer

00:09:14.710 --> 00:09:16.200
made by sindresorhus.

00:09:16.220 --> 00:09:18.240
I'm definitely butchering
that name, I'm sorry.

00:09:18.700 --> 00:09:21.240
It's a very nice app, it's free,
it's open source, and it lets you

00:09:21.240 --> 00:09:23.050
see what's in the macOS Pasteboard.

00:09:23.050 --> 00:09:24.740
And, uh, here's an example.

00:09:24.920 --> 00:09:30.620
When you copy two files, like I promised,
you have two items, and they both have

00:09:31.155 --> 00:09:34.815
a format, or a representation, or a
content type, or a MIME, I'm not even

00:09:34.815 --> 00:09:38.625
sure how to call it, a variance, a
presentation, so many names you could

00:09:38.625 --> 00:09:43.595
call that, called public.file-url,
which is a URL, starting with file:///.

00:09:43.905 --> 00:09:49.795
And then, not the path of the file
that I copied, it's actually .file/id=,

00:09:52.620 --> 00:09:55.635
some numbers dot some other numbers.

00:09:55.655 --> 00:09:57.065
That's the surprising part to me.

00:09:57.065 --> 00:09:59.935
Everything else makes sense so far,
but this, I don't understand why

00:09:59.935 --> 00:10:01.125
it's not just the path of the file.

00:10:01.355 --> 00:10:06.227
I imagine it's because you can actually
copy from a network drive, or I don't

00:10:06.227 --> 00:10:11.087
know, from inside of an archive, a mounted
thing, but all of these have actual paths.

00:10:11.087 --> 00:10:13.007
You could like pass the
copy on the command line.

00:10:13.027 --> 00:10:16.707
So I don't actually know why they're
doing that, but I do understand that

00:10:17.097 --> 00:10:19.817
the contents of the file themselves
are not actually in the clipboard.

00:10:19.817 --> 00:10:23.867
There's just a reference so that if you
paste into an application that supports

00:10:23.867 --> 00:10:27.777
that, they will know where to find
the files, where to get metadata about

00:10:27.777 --> 00:10:29.587
them, how to read them and everything.

00:10:30.202 --> 00:10:30.312
<v James Munns>Yeah.

00:10:30.312 --> 00:10:35.192
I know like intents on Android or whatever
are sort of similar in that, like you

00:10:35.192 --> 00:10:38.562
can declare that you can handle certain
intents and that's how things like

00:10:38.562 --> 00:10:42.162
the "share to this app" happens is I'm
sure they have something very similar.

00:10:42.162 --> 00:10:46.928
That's like- this is the, either a
file path or like a pointer to the

00:10:46.958 --> 00:10:52.578
whatever buffer or some output like
how programs talk to each other

00:10:52.578 --> 00:10:56.795
especially in a GUI world is something
totally out of my knowledge area.

00:10:57.029 --> 00:10:59.832
<v Amos Wenger>Yeah, but the weird
thing is that the file protocol,

00:10:59.852 --> 00:11:02.052
it's just like HTTP or HTTPS.

00:11:02.112 --> 00:11:04.332
It's an actual protocol
and it actually works.

00:11:04.332 --> 00:11:06.972
You can open file URLs in your browser.

00:11:07.273 --> 00:11:09.393
The thing is that this one doesn't exist.

00:11:09.493 --> 00:11:11.453
So this is the part I cannot explain.

00:11:11.473 --> 00:11:13.663
I promised there were some
things I still don't understand.

00:11:13.663 --> 00:11:14.483
This is one of them.

00:11:14.513 --> 00:11:15.522
This does not exist.

00:11:15.522 --> 00:11:17.892
If you try to stat it in the
terminal, it does not exist.

00:11:18.539 --> 00:11:22.498
The other interesting thing is that
when you copy two files from the finder,

00:11:22.508 --> 00:11:27.098
the first item in the pasteboard, the
general pasteboard, if we're going

00:11:27.098 --> 00:11:34.353
to be specific about it, has a UTF-8
plain text representation, which

00:11:34.363 --> 00:11:36.433
is just the two names of the files.

00:11:36.813 --> 00:11:39.923
So if you were to, like, copy two files
and paste that into a text editor, for

00:11:39.923 --> 00:11:43.572
example, you would just have the file
names, which is knowledge that I've never

00:11:43.572 --> 00:11:46.133
used, but yeah, if you just need, in
a script like a list of files, you can

00:11:47.073 --> 00:11:50.443
just copy them from Finder  and paste
them into your text editor and you would

00:11:50.463 --> 00:11:51.663
get that list of all the file names.

00:11:52.761 --> 00:11:54.932
They also have a UTF-16 version of that.

00:11:54.942 --> 00:11:57.732
Now, I don't know the
implementation details.

00:11:57.782 --> 00:11:59.722
Is it an API that converts on the fly?

00:11:59.752 --> 00:12:02.872
I really hope it does, because otherwise
it means when you select a really,

00:12:02.872 --> 00:12:06.783
really, really long text, what it does
is it takes the normal UTF8 version

00:12:06.783 --> 00:12:10.876
of it and then also creates a UTF-16
version, which is probably twice as large,

00:12:10.916 --> 00:12:12.531
roughly, just to put in the clipboard.

00:12:12.563 --> 00:12:16.722
I know Windows is heavily
UTF-16 based, or is it UCS2?

00:12:16.792 --> 00:12:17.572
I keep forgetting.

00:12:17.902 --> 00:12:19.462
Or is it WTF something?

00:12:19.672 --> 00:12:20.172
I don't know.

00:12:20.377 --> 00:12:24.377
<v James Munns>WTF8 is fun but yeah, I
don't, I, wide char, I don't know what

00:12:24.377 --> 00:12:28.427
wide char is if that's UC2 or UTF-16.

00:12:28.877 --> 00:12:32.317
<v Amos Wenger>Windows is weird because at
first it was like, okay, we have ASCII, we

00:12:32.317 --> 00:12:36.387
have like seven bits and then one that's
useless so we can do code pages so that

00:12:36.387 --> 00:12:39.257
the upper 128 characters can be accents.

00:12:39.267 --> 00:12:42.337
It's mostly going to be like French
accents or whatever latent stuff.

00:12:42.557 --> 00:12:44.597
And then they were like, "Okay,
no, there's a lot more later.

00:12:44.597 --> 00:12:46.187
So we're going to do UTF-16."

00:12:46.717 --> 00:12:49.477
And then they were like, "Well, now
the rest of the world is kind of

00:12:49.487 --> 00:12:53.757
standardized on UTF-8," so actually
there's a code page that's like, instead

00:12:53.757 --> 00:12:59.034
of ASCII, it's now UTF-8, but it's a
mishmash of a lot of different things.

00:12:59.324 --> 00:13:01.794
I've come to appreciate the
Apple approach a lot more,

00:13:01.794 --> 00:13:03.154
where they just deprecate stuff.

00:13:03.204 --> 00:13:04.844
They're just like, "No,
this doesn't work anymore.

00:13:05.134 --> 00:13:05.734
Screw you."

00:13:05.944 --> 00:13:09.351
Whereas Windows is like, "Well,
yeah, we, we kind of try to

00:13:09.351 --> 00:13:10.621
keep everything working..."

00:13:10.631 --> 00:13:13.301
and then it kind of doesn't
actually, I don't know.

00:13:14.201 --> 00:13:16.871
<v James Munns>There was an awkward future
point and I think Java and Windows

00:13:16.871 --> 00:13:19.731
both got hit by it where they're like
we need something other than ASCII and

00:13:19.731 --> 00:13:25.031
alternative code pages and UTF-8 didn't
exist yet or at least wasn't popular

00:13:25.031 --> 00:13:29.941
and they committed hard to UTF-16 and
oops, that was not the format that won.

00:13:30.411 --> 00:13:33.341
They chose the Betamax
of uh, string formats.

00:13:33.341 --> 00:13:33.911
<v Amos Wenger>That's harsh.

00:13:33.911 --> 00:13:36.820
I think Betamax was actually
technologically superior or something.

00:13:36.875 --> 00:13:37.469
<v James Munns>That's fair.

00:13:37.469 --> 00:13:40.911
<v Amos Wenger>I don't think UTF-16 is
like paying twice as much for the most

00:13:40.931 --> 00:13:42.701
common letters is not a good format.

00:13:43.031 --> 00:13:43.321
<v James Munns>Fair.

00:13:43.871 --> 00:13:45.311
<v Amos Wenger>More pasteboard explorations.

00:13:45.411 --> 00:13:49.641
When you copy an image from Safari,
this is the case I had where the

00:13:49.641 --> 00:13:54.053
reason you saw the tweet composer is
because I manually cross post between

00:13:54.093 --> 00:13:56.463
BlueSky, Mastodon, and Twitter.

00:13:56.793 --> 00:14:01.253
So depending on which composer I use
first and then I copy to the others, I

00:14:01.263 --> 00:14:06.798
get that freaking camera emoji and I have
to paste into the preview app first and

00:14:06.798 --> 00:14:08.978
then copy from there, and then that works?

00:14:09.768 --> 00:14:12.508
Anyway, when you copy an image
from Safari, this is what

00:14:12.508 --> 00:14:13.478
you have in the pasteboard.

00:14:13.478 --> 00:14:15.718
There's so many different
representations here.

00:14:15.878 --> 00:14:19.048
There's 1, 2, 3, 4, 5, 6, 7, 8, 9 of them.

00:14:19.598 --> 00:14:20.708
It's kind of amazing.

00:14:20.808 --> 00:14:25.028
Again, I hope some of them are built
lazily, like they're getters that are

00:14:25.208 --> 00:14:28.218
computed on the fly because otherwise
it's a lot of computations, just

00:14:28.228 --> 00:14:31.128
when you're hitting command C, no,
no wonder sometimes it just lags.

00:14:31.378 --> 00:14:36.058
One of the representations is called
public.url and it's- I think it's

00:14:36.058 --> 00:14:40.948
the reason we see that little camera
emoji in the tweet composer is

00:14:40.948 --> 00:14:42.968
because the URL is not an actual URL.

00:14:42.978 --> 00:14:46.538
It's a blob URL, which is
not HTTP, it's not HTTPS.

00:14:46.558 --> 00:14:47.598
It's not a file.

00:14:47.818 --> 00:14:50.918
It's not even a version of file that
doesn't exist, like what happens

00:14:50.918 --> 00:14:52.418
when you copy from the finder.

00:14:52.668 --> 00:14:53.588
It's a blob URL.

00:14:53.588 --> 00:14:56.478
So it's only valid
within a certain context.

00:14:56.938 --> 00:15:02.986
What happens is when you paste an
image into Phanpy, a Mastodon client

00:15:02.986 --> 00:15:08.556
I really like, it stores it as a blob,
which is just a collection of bytes.

00:15:08.736 --> 00:15:11.696
And then you get this UUID.

00:15:11.696 --> 00:15:13.446
What's the actual meaning of UUID?

00:15:13.496 --> 00:15:14.926
There's unique in there somewhere.

00:15:14.931 --> 00:15:16.661
<v James Munns>Universally
unique identifier?

00:15:17.136 --> 00:15:17.586
<v Amos Wenger>There you go.

00:15:18.346 --> 00:15:21.086
You get this universally
unique identifier, and

00:15:21.086 --> 00:15:22.751
that's the name of the blob.

00:15:23.131 --> 00:15:26.969
And then you can refer to it, but you
can see it's prefixed by phanpy.social.

00:15:27.099 --> 00:15:28.499
So it's only valid for this thing.

00:15:28.499 --> 00:15:31.069
So if you actually paste that
somewhere else, then it doesn't

00:15:31.069 --> 00:15:31.689
know what to do with it.

00:15:31.699 --> 00:15:34.759
It has no way of getting the
original data, but the original

00:15:34.759 --> 00:15:37.069
data is actually there as a TIFF.

00:15:37.266 --> 00:15:38.808
When's the last time
you saw a TIFF, James?

00:15:39.363 --> 00:15:40.683
<v James Munns>I could not tell you.

00:15:40.753 --> 00:15:42.663
Intentionally, probably a decade.

00:15:42.663 --> 00:15:44.293
<v Amos Wenger>And yet here it is as a TIFF.

00:15:44.303 --> 00:15:50.423
It's a 2.8 megabyte file
for 900 pixels, uh, by 800.

00:15:51.233 --> 00:15:54.906
It is screenshot I took, for
sure, just in a weird format.

00:15:54.936 --> 00:15:58.254
Again, something I'm assuming
Apple committed to a long time ago,

00:15:58.254 --> 00:16:00.934
and now that's just, that's just
what's in the clipboard, I guess.

00:16:01.367 --> 00:16:02.707
But it doesn't stop there.

00:16:03.707 --> 00:16:05.457
You also have it as a web archive.

00:16:05.477 --> 00:16:06.377
What's a web archive?

00:16:06.377 --> 00:16:07.267
I'm so glad you asked.

00:16:07.447 --> 00:16:10.557
It's pretty much what you have
if you try to save a web page.

00:16:10.557 --> 00:16:14.197
Like if you hit file save in your
browser and it says well I could save

00:16:14.217 --> 00:16:16.827
only the HTML but then you wouldn't
have images, you wouldn't have

00:16:16.917 --> 00:16:18.597
CSS, you wouldn't have Javascript.

00:16:19.157 --> 00:16:21.817
So how about I save everything for you?

00:16:22.217 --> 00:16:23.637
It's kind of a zip but not really.

00:16:23.857 --> 00:16:27.907
Because actually it's a binary
property list in that case,

00:16:27.937 --> 00:16:29.137
which is a very Apple thing.

00:16:29.538 --> 00:16:32.288
And is here shown, I think as XML

00:16:32.384 --> 00:16:34.633
<v James Munns>In all the joy
of XML yeah, I was gonna say

00:16:35.173 --> 00:16:36.713
<v Amos Wenger>It's even Base64 encoded.

00:16:36.713 --> 00:16:39.723
I don't think it actually
is Base64 encoded in the...

00:16:39.754 --> 00:16:43.397
I think this is just the Pasteboard
Viewer app showing it to us

00:16:43.537 --> 00:16:44.931
in a way that is structured.

00:16:45.157 --> 00:16:50.243
Moving on, we have another format
called com.apple.flat-rtfd.

00:16:50.833 --> 00:16:53.403
RTF does mean Rich Text Format.

00:16:53.568 --> 00:16:55.158
Your instinct is correct.

00:16:55.708 --> 00:17:01.678
And then I don't know what the D stands
for, but flat means that it's an archive

00:17:01.988 --> 00:17:05.018
of rich text plus its attachments.

00:17:05.068 --> 00:17:11.038
So this is actually a rich text
format document that contains the

00:17:11.038 --> 00:17:13.175
image, but this time as a PNG.

00:17:13.246 --> 00:17:16.566
<v James Munns>I didn't realize that
systemd got into RTF documents too.

00:17:17.036 --> 00:17:18.536
This is my RTF daemon.

00:17:18.596 --> 00:17:20.646
<v Amos Wenger>RTF is, is
worth its own episode.

00:17:20.646 --> 00:17:24.956
I think you can see a little bit of
the markup in the slide right now.

00:17:25.243 --> 00:17:26.114
It's very interesting.

00:17:26.960 --> 00:17:32.310
Because I like the Pasteboard Viewer tool
that much, I did a bunch more slides with

00:17:32.340 --> 00:17:35.120
what actually ends up in the pasteboard
when you copy from different places.

00:17:35.120 --> 00:17:39.440
And I was curious about this specific node
that is zoomed in but is part of the UI

00:17:39.450 --> 00:17:44.930
for a slides code highlighter, a tool by
Roman Nurik, which lets you paste your

00:17:44.940 --> 00:17:49.655
own code as plain text and then colorizes
it and then you can copy it back.

00:17:50.145 --> 00:17:54.175
And it says if you're pasting into
Keynote the Apple presentation tool

00:17:54.185 --> 00:17:58.115
you should copy from Safari but if
you're pasting into Google Slides then

00:17:58.115 --> 00:18:01.285
you should copy from Chrome so I was
curious what the differences actually

00:18:01.285 --> 00:18:04.515
are what actually ends up in the in the
pasteboard if you copy from Safari or

00:18:04.515 --> 00:18:06.465
from Chrome and so that's what I did.

00:18:07.355 --> 00:18:13.555
This is the result of copying from
Safari and there's an RTF thing in there.

00:18:14.145 --> 00:18:18.905
It's taking the HTML, it's taking the
colors, it's taking the fonts, it's

00:18:18.905 --> 00:18:24.175
taking the size, and it's again, like
converting it to rich text format.

00:18:24.225 --> 00:18:28.445
And this, I didn't know yet, when I
started researching this, but this is

00:18:28.455 --> 00:18:31.105
what Keynote uses if you paste into it.

00:18:31.115 --> 00:18:36.305
It doesn't use the HTML version at all,
even though it also has the font, font

00:18:36.305 --> 00:18:38.885
face and size and color information.

00:18:39.320 --> 00:18:42.970
It uses the rich text format
version, which is here rendered

00:18:42.970 --> 00:18:44.410
poorly with the wrong font.

00:18:44.989 --> 00:18:45.479
<v James Munns>This is like...

00:18:45.529 --> 00:18:49.049
if it's asking you which you're
copying and pasting from and to...

00:18:49.119 --> 00:18:51.679
that gets into I guess like
just the practicalities of

00:18:51.679 --> 00:18:53.524
the 'Who's encoding what?'

00:18:53.584 --> 00:18:56.824
It's like when my printer refuses to
print a pdf and sometimes I open it

00:18:56.834 --> 00:19:00.134
in Chrome or whatever and then print
to pdf and it re encodes the entire

00:19:00.134 --> 00:19:04.124
pdf and then sometimes my printer
figures out what that format is, but...

00:19:05.014 --> 00:19:06.544
it's interesting that it's just...

00:19:07.264 --> 00:19:10.474
I guess this is your best
encoding- like sender and

00:19:10.474 --> 00:19:13.144
receiver pairs known to work well.

00:19:13.614 --> 00:19:14.074
<v Amos Wenger>Exactly.

00:19:14.084 --> 00:19:14.834
But I was curious.

00:19:14.844 --> 00:19:18.824
So I looked at the HTML version
of that pasteboard item.

00:19:18.824 --> 00:19:20.391
Cause again, it's one pasteboard item.

00:19:20.391 --> 00:19:23.181
We're copying one thing, but it's
available in different formats.

00:19:23.661 --> 00:19:27.751
When copying from Safari, it's available
as RTF, as I just mentioned, but also

00:19:27.781 --> 00:19:33.421
as UTF-8 plain text, a bunch of WebKit
internal things, WebArchive again, for

00:19:33.421 --> 00:19:35.991
some reason, and then also just HTML.

00:19:36.511 --> 00:19:41.541
The difference between what Safari
writes to the pasteboard and what

00:19:41.541 --> 00:19:45.891
Chrome writes to the pasteboard in
terms of HTML is actually not that big.

00:19:45.891 --> 00:19:48.391
If you're looking at the slides,
this is the Safari version.

00:19:48.561 --> 00:19:49.871
This is the Chrome version.

00:19:50.141 --> 00:19:54.391
I even did a diff so you can see the
differences are mostly in like...

00:19:54.441 --> 00:19:59.641
the surrounding HTML element that it puts
around the content that you're copying.

00:20:00.001 --> 00:20:01.901
And there's a few different defaults.

00:20:02.131 --> 00:20:04.241
orphans: 2 becomes orphans: auto.

00:20:04.291 --> 00:20:06.681
I didn't even know there
was an orphans CSS property.

00:20:07.219 --> 00:20:09.566
Widows also surprised me.

00:20:09.801 --> 00:20:11.381
<v James Munns>Not windows just widows.

00:20:11.461 --> 00:20:12.931
<v Amos Wenger>Widows, important.

00:20:13.291 --> 00:20:17.841
Text decoration, thickness, style,
and color all get collapsed from

00:20:17.841 --> 00:20:20.891
initial into text decoration
none, which is the shorthand.

00:20:21.411 --> 00:20:24.795
So it's just like the default
stuff it puts around the HTML

00:20:24.815 --> 00:20:26.255
version of whatever you're copying.

00:20:26.915 --> 00:20:30.275
And the reason that tool exists
and the reason it's useful is

00:20:30.275 --> 00:20:36.353
because it styles every span of code
individually with inline CSS and that

00:20:36.353 --> 00:20:37.823
ends up in the pasteboard as well.

00:20:38.278 --> 00:20:42.898
Whereas if you had like CSS classes
and then rules for those CSS classes,

00:20:42.918 --> 00:20:44.348
it would not necessarily do that.

00:20:44.378 --> 00:20:48.238
It would not pick up on the styles
that are applied from the style sheets,

00:20:48.238 --> 00:20:49.868
but that are not in line on the nodes.

00:20:50.166 --> 00:20:52.386
<v James Munns>I know on Linux,
there's a command line tool

00:20:52.456 --> 00:20:54.606
that does syntax highlighting.

00:20:54.636 --> 00:20:55.716
I forget what it is, but it's...

00:20:55.726 --> 00:20:56.666
<v Amos Wenger>There's Pygments...

00:20:56.686 --> 00:20:58.596
<v James Munns>Pygments is exactly
the one that I'm thinking of.

00:20:58.616 --> 00:21:02.656
And it does the exact same thing where
it's just the HTML output that it

00:21:02.677 --> 00:21:07.257
produces is super verbose because it's
does inline CSS for every element.

00:21:07.267 --> 00:21:13.325
So when you have some fairly benign
looking code, there might be 12 CSS

00:21:13.326 --> 00:21:16.987
chunks in one line because it's going
to highlight your variable and the equal

00:21:16.987 --> 00:21:19.148
sign and the numbers all different.

00:21:19.158 --> 00:21:22.457
And that's pretty- I have looked at that
one before and it looks a lot like that.

00:21:22.457 --> 00:21:24.877
And it's probably why
that exists like that.

00:21:25.627 --> 00:21:27.037
<v Amos Wenger>I am aware of such tools.

00:21:27.037 --> 00:21:30.027
And that's actually the first thing
I address in my articles, like: I

00:21:30.027 --> 00:21:31.657
know there's existing solutions.

00:21:31.887 --> 00:21:35.717
But I did code highlighting the
way I like it on my website.

00:21:35.717 --> 00:21:38.577
And so that's why I wanted that
pipeline of like, I'm writing the

00:21:38.577 --> 00:21:42.917
article, I'm pasting the code one place
already, which is inside the markdown.

00:21:43.407 --> 00:21:46.407
And then it's highlighted
exactly the way I want it.

00:21:46.437 --> 00:21:48.967
And I want that to appear
as-is in the presentation.

00:21:49.237 --> 00:21:50.267
So I'm not using Pygments.

00:21:50.267 --> 00:21:53.207
I'm not using- I'm sure Pandoc or
something can do something like that.

00:21:53.567 --> 00:21:55.137
There's existing tools, but...

00:21:55.812 --> 00:21:58.217
Yeah, I want to automate things
much as possible and keep them

00:21:58.217 --> 00:22:00.167
close to the way that I like them.

00:22:00.404 --> 00:22:07.804
And to achieve that, it means that I have
to be able to copy code from my website,

00:22:07.924 --> 00:22:10.924
not the production version of my website,
because when I draft an article, it's not

00:22:10.924 --> 00:22:13.384
actually available on fasterthanli.me.

00:22:13.704 --> 00:22:14.914
It's only available locally.

00:22:14.914 --> 00:22:16.912
I'm running the same software locally.

00:22:16.912 --> 00:22:19.144
It's serving it on port 1111.

00:22:19.402 --> 00:22:22.652
But I have the same interface and every
code block has a little copy button that

00:22:22.662 --> 00:22:27.665
only I can see and that actually writes
to the pasteboard and that means I need

00:22:27.665 --> 00:22:29.455
to use the browser APIs to do that.

00:22:30.155 --> 00:22:37.264
Luckily, the browser APIs for clipboard
actually mirror reality more or less.

00:22:37.616 --> 00:22:42.180
I don't think they expose the fact
that there's different clipboards

00:22:42.180 --> 00:22:42.960
or pasteboard or selection buffers.

00:22:43.000 --> 00:22:45.880
I think it just uses the
clipboard selection buffer on X.

00:22:46.180 --> 00:22:50.410
It just uses the general pasteboard
on macOS and don't ask me about

00:22:50.410 --> 00:22:51.580
other platforms, I'm tired.

00:22:51.907 --> 00:22:55.117
But it has the idea that you
can write multiple items to it.

00:22:55.397 --> 00:22:57.727
So you can like download
multiple files probably.

00:22:57.907 --> 00:23:01.587
It has the idea that every item can
be available in different formats.

00:23:02.127 --> 00:23:07.067
So you can have, for example, an item
available as HTML and text so that it

00:23:07.067 --> 00:23:11.577
could be formatted if you paste it into
a capable application or just text,

00:23:11.597 --> 00:23:13.267
if you paste it into something else.

00:23:13.277 --> 00:23:16.697
And they don't have to strip the HTML
tags themselves or just be incompatible.

00:23:17.288 --> 00:23:20.988
They even thought about use cases like...

00:23:21.523 --> 00:23:24.803
you know, maybe people have diagrams
on their websites, you know, people

00:23:24.803 --> 00:23:28.883
like me and they want to copy those
and paste them into presentation

00:23:28.883 --> 00:23:30.493
software that actually supports them.

00:23:30.693 --> 00:23:37.154
Now, unfortunately, for years now, you
have not been able to paste those into

00:23:37.174 --> 00:23:39.294
Google Slides or even upload them.

00:23:39.534 --> 00:23:43.210
It just goes, "Oh, your
EMF file is invalid."

00:23:43.890 --> 00:23:45.080
I just uploaded an SVG.

00:23:45.080 --> 00:23:47.800
First of all, it's not even what?

00:23:48.100 --> 00:23:51.150
But then also there's a lot of workarounds
or like: yeah, if you upload it to

00:23:51.150 --> 00:23:55.400
like a free online suite to convert
it to a different format, and then

00:23:55.400 --> 00:24:00.110
you run a script on Google Workspaces
to change the MIME type, because

00:24:00.130 --> 00:24:02.250
there's a bug since of two years ago.

00:24:02.915 --> 00:24:07.385
Or like if you import it as a PowerPoint
document into Google Drive and then

00:24:07.385 --> 00:24:11.855
copy from one tab to the other, then
it keeps the shapes, but actually no,

00:24:11.855 --> 00:24:13.627
some people say it rasterizes it as PNG.

00:24:14.428 --> 00:24:17.538
The point is you cannot do
vector graphics in Google Slides.

00:24:17.618 --> 00:24:18.409
Don't even try.

00:24:18.459 --> 00:24:20.254
<v James Munns>User
experience is my passion.

00:24:21.312 --> 00:24:24.802
<v Amos Wenger>But you can paste it
in software like Keynote, which...

00:24:25.232 --> 00:24:26.592
Mostly I think by accident.

00:24:26.592 --> 00:24:29.442
I think like Apple invested
in RTF, Apple invested in SVG,

00:24:30.322 --> 00:24:31.702
also internally for the OS.

00:24:31.742 --> 00:24:33.892
I'm pretty sure I didn't-
I didn't fact check that.

00:24:34.211 --> 00:24:40.321
And as a result, you can just paste text
with formatting as RTF and also diagrams

00:24:40.471 --> 00:24:42.241
as SVG, and it'll just do the right thing.

00:24:42.241 --> 00:24:43.881
It has, it's all
integrated in the renderer.

00:24:43.881 --> 00:24:46.241
It's very, they didn't
have to add support for it.

00:24:46.241 --> 00:24:47.681
It's just something they've
been doing for years.

00:24:48.381 --> 00:24:54.831
So because SVG is supported by Safari
and because web browser clipboard

00:24:54.831 --> 00:25:00.241
APIs have the ability to have items
be available in different formats

00:25:00.241 --> 00:25:01.881
and tell which MIME type it is.

00:25:02.246 --> 00:25:05.186
And because SVG is a text format,
so you don't have like weird

00:25:05.196 --> 00:25:08.156
things about binary or like, it's
actually impossible to generate from

00:25:08.156 --> 00:25:10.006
JavaScript because binary is weird.

00:25:10.886 --> 00:25:15.154
You'd think you would just be able to
write some code that writes some SVG into

00:25:15.154 --> 00:25:19.864
the clipboard, and then you can paste it
into Keynote, and then everyone's happy.

00:25:20.034 --> 00:25:26.944
But, actually, if you look at the
compatibility matrix out of caniuse.

00:25:26.944 --> 00:25:29.682
What's name of that domain again?

00:25:30.182 --> 00:25:32.762
<v James Munns>I just know 'caniuse', but
I know exactly what you're talking about.

00:25:33.422 --> 00:25:34.922
<v Amos Wenger>Right, it's just caniuse.com.

00:25:35.132 --> 00:25:36.952
I was thinking of the caniuse.rs.

00:25:36.972 --> 00:25:37.782
There's one for Rust.

00:25:38.613 --> 00:25:42.913
Unfortunately, Safari is one of the
browsers that does not support writing

00:25:42.933 --> 00:25:46.793
items of type image slash SVG plus XML.

00:25:47.357 --> 00:25:51.439
If we summarize the status quo of
support between browsers and presentation

00:25:51.439 --> 00:25:56.779
software, and all I really want to do is
to just copy code as rich text, I just

00:25:56.779 --> 00:25:59.029
want colors and fonts and font sizes.

00:25:59.419 --> 00:26:00.269
It's not crazy.

00:26:00.639 --> 00:26:02.299
And copying diagrams as SVG.

00:26:03.099 --> 00:26:05.649
I have this little slide here that
kind of summarizes everything.

00:26:05.949 --> 00:26:09.419
Safari doesn't let you copy
SVG into the clipboard.

00:26:09.549 --> 00:26:14.129
Chrome doesn't copy colored text as RTF.

00:26:14.869 --> 00:26:22.619
Keynote doesn't read HTML, CSS and apply
the styles from the clipboard and Google

00:26:22.619 --> 00:26:27.499
Slides doesn't read RTF from the clipboard
and also doesn't let you paste SVG.

00:26:27.819 --> 00:26:30.999
So, as of now, there is no
combination of tools that I can

00:26:30.999 --> 00:26:33.449
actually use to do my work properly.

00:26:33.875 --> 00:26:36.395
<v James Munns>So at what point do you
write a utility that just listens to

00:26:36.395 --> 00:26:40.755
the clipboard and whenever it sees
clipboard data just re exports it in all

00:26:40.765 --> 00:26:43.355
three of these formats automatically?

00:26:43.355 --> 00:26:47.655
So whenever you copy it just replaces
your copy buffer with like the maximally

00:26:49.675 --> 00:26:52.855
implemented version,
number of version formats.

00:26:53.042 --> 00:26:53.582
<v Amos Wenger>Well.

00:26:53.607 --> 00:26:54.097
<v James Munns>Oh no.

00:26:55.362 --> 00:26:57.932
<v Amos Wenger>If you search for Rust
crates that let you write to the

00:26:57.932 --> 00:27:03.822
clipboard, you will see an open pull
request for myself adding the...

00:27:04.233 --> 00:27:05.866
what did I actually add there?

00:27:06.006 --> 00:27:09.386
I think I was only concerned with HTML
at that point, but yeah, adding the

00:27:09.386 --> 00:27:13.806
ability to specify different content
types on macOS, but the problem

00:27:13.806 --> 00:27:15.006
is that it supports all platforms.

00:27:15.016 --> 00:27:17.956
So they would only accept the pull request
that adds it for all platforms at once.

00:27:18.006 --> 00:27:22.011
And again, I don't know what the frick's
going on with Wayland and X11 these days.

00:27:22.651 --> 00:27:27.211
But yeah, because I'm running a local
server anyway, I can just, when you

00:27:27.211 --> 00:27:32.051
click the, the copy button, I can just
send a message to the server, which

00:27:32.051 --> 00:27:37.419
is then going to write to the system
clipboard with all the might of native

00:27:37.419 --> 00:27:41.259
code and not just the browser API going
like, "No, sorry, this MIME type string

00:27:41.559 --> 00:27:44.599
is something we will take another
couple of years to support because..."

00:27:44.967 --> 00:27:45.667
Because why?

00:27:45.757 --> 00:27:49.475
So actually pretty much this
whole episode is a cry for help.

00:27:49.665 --> 00:27:53.465
If you work on the Safari team, if you
know someone who works on the Safari

00:27:53.465 --> 00:27:59.785
team, please tell them to just add
support for image slash SVG plus XML.

00:28:00.325 --> 00:28:00.815
Please.

00:28:00.915 --> 00:28:01.505
It's for me.

00:28:01.505 --> 00:28:02.195
It's for Amos.

00:28:02.195 --> 00:28:02.835
You know me.

00:28:02.935 --> 00:28:04.105
You've seen me in videos.

00:28:04.425 --> 00:28:05.355
Just add support.

00:28:05.405 --> 00:28:07.575
It's- I'm sure it's a two
line change on your end!

00:28:07.835 --> 00:28:09.985
I'll run technology preview if I have to.

00:28:10.285 --> 00:28:11.305
Just please add it.

00:28:11.845 --> 00:28:12.275
Please?

00:28:12.358 --> 00:28:15.938
<v James Munns>I think the podcast is
the perfect place for calling in favors

00:28:15.938 --> 00:28:20.018
from people who happen to work at tech
companies and can just make those PRs.

00:28:20.963 --> 00:28:22.129
It's like that person who...

00:28:22.263 --> 00:28:23.609
uh, is probably apocryphal...

00:28:23.628 --> 00:28:27.008
the person who joined a company just
so they could fix a bug and then quit

00:28:27.028 --> 00:28:28.588
immediately after fixing the bug.

00:28:29.023 --> 00:28:30.423
<v Amos Wenger>I think
that actually happened...

00:28:31.068 --> 00:28:32.108
<v James Munns>it wouldn't surprise me.

00:28:32.573 --> 00:28:34.673
<v Amos Wenger>More times than,
than, than we have on the record.

00:28:34.673 --> 00:28:35.103
Probably.

00:28:35.718 --> 00:28:37.548
<v James Munns>It's too good of
a story to be true, but it's

00:28:37.878 --> 00:28:39.298
too good of a story to pass up.

00:28:44.986 --> 00:28:47.266
This episode is sponsored by CodeCrafters.

00:28:47.454 --> 00:28:50.724
CodeCrafters is a service for
learning programming skills by doing.

00:28:51.394 --> 00:28:54.684
CodeCrafters offers a curated list
of exercises for learning programming

00:28:54.684 --> 00:28:57.694
languages like Rust or learning
skills like building an interpreter.

00:28:58.169 --> 00:29:01.709
Instead of just following a tutorial, you
can instead clone a repo that contains

00:29:01.719 --> 00:29:05.449
all of the boilerplate already, and make
progress by running tests and pushing

00:29:05.449 --> 00:29:08.789
commits that are checked by the server,
allowing you to move on to the next step.

00:29:09.429 --> 00:29:12.399
If you enjoy learning by doing,
sign up today using the link at

00:29:12.399 --> 00:29:16.519
sdr-podcast.com/codecrafters,
or use the link in the show

00:29:16.519 --> 00:29:17.749
notes to start your free trial.

00:29:18.169 --> 00:29:20.689
If you decide to upgrade, you'll
get a discount and a portion of

00:29:20.689 --> 00:29:22.229
the sale will support this podcast.

00:29:22.674 --> 00:29:26.364
That's sdr-podcast.com/codecrafters.

00:29:27.064 --> 00:29:29.444
Thanks to CodeCrafters for
sponsoring this episode.

