This is Python Bytes, Python headlines and news delivered directly to your earbuds.
Episode number three, recorded November 21st, 2016.
Hey, Brian.
Hello, everyone.
Hey.
Sorry.
Hey, man.
Great to chat with you.
I'm really loving this show we're putting on.
This is so much fun.
But before I get to the headlines, I actually have some good news about the show.
What's that, Michael?
Python Bytes is now brought to you by Rollbar.
They take the pain out of errors, and we'll hear from them later.
But thank you, Rollbar, for sponsoring the show.
That's really awesome.
We appreciate it.
That's really awesome.
Thank you, Rollbar.
Yeah, yeah, definitely.
All right, let's get to the headlines.
Every week, there's so much cool stuff happening, right?
Well, yeah.
And this last week, I just read a huge list of articles I read, Python-related.
I really enjoyed.
It was a hard time picking out which one to talk about.
Yeah, it really was.
Yeah.
All right.
Well, but you had to pick, right?
Because we're only doing three each.
We're trying to keep this short and on topic.
Yeah, and I thought maybe we'd pick the same three, but we didn't.
So first up, I've got an article titled, How to Get Superior Text Processing in Python with PyNinny.
I think I'm pronouncing that right.
PyNinny.
Or maybe it's Nini.
I'm not sure.
PyNini?
Like the Knights of Knee from Monty Python.
Oh, yes.
Yeah, yeah.
You're probably right about that.
But this is from the O'Reilly blog, and it was written by Kyle Gorman and Richard Sprout,
I think.
Yeah, both who are PhDs in linguistics of some variety or other, right?
Yeah.
And actually, because of that and also because of the title, I was afraid this was going to
be sort of a hard thing to get into, but it's a really easy article.
And my interest in it is mostly because when I read the Pragmatic Programmer a long time
ago, it introduced me to the concept of mini languages to solve simple problems with this
is the data I have and how to change it into the data I need.
And often I used regular expressions for things like that, but sometimes that's not enough.
And the next step always seemed to be to build up a parser or an abstract syntax tree, and
that's way too far that I want to go.
I think this article produces a nice halfway ground talking about what they call them is
finite state transducers, which sounds like something in a Back to the Future movie.
Quick, Marty, connect the finite state transducer.
Yeah, exactly.
But I like working with finite state machines, and apparently this is a finite state machine
turned into something else.
But the article starts with a small introduction to what finite state machines are, and they're
really easy to get the grasp of.
If you look at the article, there's some nice pictures.
And then they talk about how that applies to text processing and then introduces a concept
finite state acceptor, which I think just accepts things.
And then transducer spits things out.
I believe I get this right.
But how this applies to how to translate your thinking from regular expressions to these.
And anyway, it goes through some of this, gives an example using cheese names, which I love the
Python tradition of using cheese names and examples.
And then introduces a library called PyNinny from Google to help build these things up.
And at the end, I kind of got a little bit lost, but I wasn't working through the examples
myself.
It is something that I think I might spend an afternoon poking through.
Yeah, it is quite interesting, right?
I mean, one of the things that makes me really happy about looking at this is, one, it's not
too complicated.
And two, it gets you away from regular expressions, which anything that gets me away from regular
expressions puts a smile on my face.
Well, I actually really like regular expressions.
Although it is true that, I mean, there's oftentimes with text processing where it doesn't work when
you can't do it line by line.
And I'm probably not going to use this right away, but I appreciate this tool introduction
so I can put it in my tool chest.
And next time I have a problem like this, I might look this thing up.
Right.
You guys will be looking at something, some dating, like, oh, you know what we need?
A finite state transducer.
We're going to solve this.
And I totally want to do that in a meeting.
I think we should put a finite state transducer in here.
Fantastic.
Now, it does things like pluralized stuff.
You can teach it, like, for example, you taught it what all the cheeses were, and then it could,
like, locate sentences that were talking about cheese and do lots of interesting processing,
not just pattern matching.
It's cool.
It isn't, but it does start out with, like, a simple example of, like, if I tell it all the
cheeses to look through some code and find the cheeses and add a cheese tag around it or something.
Yeah, yeah.
There are simple solutions, simple problems that it can solve as well.
Yeah, it's great to have it in your toolbox.
Well, you know where I would like to run it, though?
I don't really want to run it on Python 3.5 or definitely not on 2.7 anymore.
Oh, yeah.
Nice transition there.
Thank you.
Yeah, I want to run that on Python 3.6.
And, you guys, there is amazing stuff coming in Python 3.6.
And they just released beta 4.
Beta 4.
Wow.
So, yeah, I don't know what the exact release schedule of the final release is, but I think
it's coming up pretty quickly.
These things are looking pretty solid.
Let me just give you a sense of some of the PEPs, Python enhancement proposals that are coming.
First up, it seems like no programming language these days is content with their string formatting.
And Python is like, look, we only have, like, eight ways to format strings.
We need another.
But this new way is actually pretty good.
There's a PEP498, and what it is about is formatting string literals.
So, imagine you've got a string, and normally you'd like, there's a variety of ways to do
it.
Maybe the newer way would be to do something like, say, I want to say, hi, my name is,
and you have a variable called name, right?
So, you might say, quote, hi, my name is curly bracket zero, quote, dot format, name, yeah?
Well, it kind of takes this idea and just says, well, why do you have to do the dot format
and use arguments and orders and then number them?
Why don't you just put the name of the variable in the string?
So, now you could say, hello, my name is curly name.
And now, whatever the value of name is, if there's a variable that will be put into the
string as if you did the first thing I said.
Oh, that's really cool.
Yeah, it's pretty cool.
The only bummer is you have to indicate that it's this new format string.
I think it's an F prefix on the string.
Oh, okay.
But, you know, because otherwise, you'd have like dictionary stuff mixing in, just for compatibility.
It's got to have a little identifier.
But other than that, yeah, it's a really cool way to format stuff.
All right.
So, we also have another easy to understand but really nice one, PEP515, which will let
you put underscores in numerical literals.
So, if you have a number like 1-0-0-0-0-0, and you look at it, is that a million?
Is that 100,000?
Is it 10 million?
Like, it's hard to know like what the separators are.
So, now you can put underscores.
So, you could have like 1-0-0-0-0-0-0-0-0.
And that would, it basically just ignores the underscores.
But it allows you to visually see, oh, that's a million, not a hundred thousand.
Something like that.
Oh, that's kind of cool.
Yeah, that's pretty cool.
No, it's not going to be world changing.
One thing that is more significant, I guess, is in Python 3.5, we have type annotations.
Right?
So, I could have a function.
I could have a function.
I could say it takes a, let's say, it says create, functions name is create, and it has
a thing called entity.
Well, if you were given that function, you could be like, I have no idea what this does.
Like, entity, maybe that has to do with databases.
But in Python 3.5, you could say colon, customer, where customer is like a class or something.
And then the tooling and whatnot would know to give you the right auto-completion and various
type checking and whatnot for that type.
Right?
But that only applied to functions.
You couldn't put it on like variables and other types of class fields and other things
that are outside of functions.
So, this PEP 526 brings that to functions.
That seems like obvious.
I don't know why they didn't have that at the start.
Yeah, it definitely seems obvious.
So, you know, maybe you don't care too much, but tooling will care.
Linters might care.
So, like the tools you could possibly get better because of this.
All right.
So, we have 525 asynchronous generators.
Async and away is awesome.
Yield, yield from are awesome.
But they were not friends previously.
No, you couldn't use them together.
So, you could either have an async coroutine or you could have a generator, but you couldn't have both.
Now, you can have both.
And similarly, we have asynchronous comprehensions.
And, you know, actually one of the biggest things is the change to dictionaries coming in Python 3.6.
What?
Yeah, so you might think, well, Python has had dictionaries since from the very beginning.
When you add fields or attributes to a class, it's actually stored in Dunderdict.
I mean, dictionaries are, it's keyword values.
Like, all over the place, dictionaries play a super important role.
Well, in this release from 3.5 to 3.6, dictionaries are now 20% to 25% more memory efficient.
They should be a little faster.
They are ordered.
So, the order that you put things in, they remember that, right?
Like, if when you first started working with dictionaries, you're like, multiple dictionaries can have the fields show up at different times and different orders.
It's bizarre, right?
You can keep switching.
Now, it's always consistent.
The order dict part and making them fast is good.
So, it's all good stuff.
Yeah, it's all good stuff.
We've got a new secrets module coming.
So, you have cryptographically strong random number generators, windows.
They've now marked the Python executable as long path aware.
So, I don't know if you guys are aware, but Windows typically has, like, crummy 260 character path limits for a long time.
There's a lot of legacy stuff that applies that to, like, newer code.
So, now, long path limitations are gone on Windows, which, if you write code that has to run on Windows, you'll care a lot about that.
Wow.
Yeah, actually, I try to write code that I don't have to care about Windows, but...
Yes, exactly.
So, there's...
If you go look through the link, the release notes, the documentation there, there's a lot more stuff.
I'm scratching the surface on all the cool stuff coming in 3.6.
So, if people need one more reason to upgrade from 2 to 3, well, here's, like, 20 or 30 more reasons.
Yeah, and I like the peps that you talked about.
You left the links to those particular peps in the show notes.
So, that's great.
Yeah, yeah, definitely check them out.
Okay.
Hey, Brian.
Hey.
Before we get to the next headline, let me tell you about Rollbar.
Well, tell me about Rollbar.
All right, man.
So, Rollbar is sponsoring Python Bytes, and we're really excited about it.
I use Rollbar for my website.
Rollbar is a package you install in your Python web app, Pyramid, Flash, Django, whatever, and anytime there's an error, you get an immediate notification and detailed error reports.
So, you know, even though the Talk Python websites handle almost 2 million dynamic HTTP requests per month, and they transfer, like, 4 to 5 terabytes of data,
I'm not worried about them.
Really?
No, not really, because if something goes wrong, my Slack, my email, my phone, everything will be blown up with notifications.
And, you know, I don't get many, but when they come in, like, all the info is there, so I often don't even have to debug it.
I just go and fix the problem.
That's pretty awesome, right?
That's very awesome.
Yeah, I love Rollbar.
So, and the Python Bytes listeners, all you guys out there, you can have the same peace of mind.
Just visit rollbar.com slash Python Bytes and sign up for the free tier.
You get, like, 300,000 free errors tracked, although I really hope you don't have that many.
Definitely.
You should do more testing if you do.
You definitely should.
Well, next up for me, I am a sucker for, like, I really like efficiency, developer efficiency.
That's always kind of been important to me.
And part of that is being able to set up your personal development environment to help you succeed.
And I know it's different from everybody, and I'm always tweaking mine.
I like articles when people write about them.
So there's an article by Dougal, I think, Dougal Matthews, called Create an Excellent Python Dev Environment.
And he goes through installing Python, but everybody knows how to do that.
But he's got some goals of, like, don't muck with the system Python and set up virtual environments easy.
And it's interesting.
One of the things I think is interesting about this article is to start off the bat saying why he has particular goals for why he's chosen things.
And that's kind of neat.
Yeah, that's cool.
Because you might look at it and go, I would never do that.
But maybe your goals are different than his.
And you can really understand where he's coming from because of that.
That's cool.
Yeah.
Actually, the first part confused me because he was covering a project that I'd never heard of called pyenv or P-Y-E-N-V.
I'm more used to V-E-N-V, which just comes in 3.6 or virtual environment.
So this is something different, and I just will have to check it out.
But it's something like virtual environments, but it's independent of Python.
It sets them up separate, I guess.
I don't know.
Yeah.
But I haven't used that much either, so I might be a little off here.
But I think it's kind of like for managing and creating and activating different virtual environments.
It's like your virtual environment manager.
Okay.
I think.
Yeah.
Next is a pyenv virtualenv, which is apparently similar to virtualenv wrapper, which a lot of people use.
I don't use either of those, but I still don't get what they're for.
Straight virtual environments work fine.
I don't understand what I need more for.
You have different goals.
Yeah, that's probably it.
The next thing he talks about is a thing called Pipsy, which I hadn't heard of, and I just used it today.
It's a tool to let you install Python-based command line utilities in their own virtual environments so that you can use them.
You can just set your path to them so you can use them on the command line from anywhere.
That's really cool just to have like these little virtual environments just for a command line utility.
That's really cool.
I never really thought of doing it that way.
That's great.
When I was talking in one of the interviews I've done, I heard about more people using Atom than before.
And I tried to set up Atom and I needed to give it a path to Flake 8.
And I'm like, oh, I'll use Pipsy to set up this so that you can see Flake 8.
So I've done that.
Oh, nice.
But he does talk about with Pipsy.
He usually includes talks for testing multiple environments, which I highly recommend.
Flake Docs, which is a static site generator documentation thingy.
I've never used it.
Get Review, which I would totally use.
It's a Garrett integration for Git, but I don't use Git right now, but at work.
And I actually do code reviews on my own code in my free time.
And then Flake 8, of course, which is my favorite, recommended, way too static in the analyzed stuff.
And then, as a side note, one of the things he was talking about for this Pi A&V is because it's compatible with Fish,
which is a different shell that I've never heard of.
I use Bash.
I tried Z-Shell for a while.
I'm always used.
I think it's fun to try new shells.
So maybe I'll give it a shot.
Yeah, it's definitely worth checking out, Fish.
That sounds cool.
I use Z-Shell as well.
I just actually formatted my computer and I'm like, you know, I might try a different shell this time.
And I set everything up.
So that's cool.
I'll check out Fish.
I do love to see the way people put these environments together.
And I think it really can help people who are new.
It can help you discover things you don't know about, like Pipsy.
That's really great.
I was just stuck in traffic today, this morning, and was thinking for some reason about this stuff.
You know, other people, I don't know what they dream about, but this is what I was daydreaming about.
I was thinking, you know, I might try switching to Conda instead of pip and try using Conda for managing all these environments.
I really like the way that Conda, like, vets the packages and pre-compiles them for you.
I was reading about something.
It was like, well, as long as you have this compiler set up, it'll probably be fine, but it might not work so well.
I'm like, you know what?
Maybe I should just use Conda, and, like, all those problems are solved by the Continuum guys.
And so I'm also doing a lot of virtual environments with Python 3, V, and V.
And the one thing that I like that I've stopped using the main Python REPL, and I'm using PtPython.
Do you know PtPython?
PtPython.
No, I don't.
So PtPython is basically the regular REPL, but it has a lot better editing and history and auto-completion and all sorts of stuff for what you can do.
So, like, for example, if you type in a function in the regular REPL, you know, it's like three lines with indentation or whatever.
If you want to edit it, you've got to remember to, like, always replay them in the right order.
You know, up arrow four times, enter, up arrow three times, make the change, you know, that kind of stuff.
This will, like, if you hit up arrow for code suites, it'll bring the whole thing back and you can edit it, stuff like that.
Oh, okay.
Do you work in the REPL very much?
Not too much.
Usually I'm in some kind of editor.
But when I am there, I've been moving to PtPython.
That's pretty cool.
I think I'll check it out.
Yeah, yeah, check it out.
So what do you got next?
Well, a lot of people have been checking out Python lately.
And there was an interesting article.
Is it an article?
It was an article that's posted as a GitHub repository, which is accompanied by a Go program that's generated a bunch of statistics
and graphs.
And the thing I'm actually linking to is a Reddit article with, like, 350 upvotes and tons of comments.
So you can check out the conversation.
But the headline is awesome.
GitHub language statistics.
Python is the second most popular language on GitHub for active repositories.
That's awesome.
Yeah.
I mean, Python's growth is just continuing and expanding.
And it's such a cool time to be involved in the language.
And here's just one more stat to back that up.
Yeah.
Looks like the graphs you have to click through from the Reddit to the GitHub page.
Yeah, yeah.
So I'm linking to both.
Okay.
So they say, we're going to study active repositories because it doesn't make any sense to think about GitHub statistics if something was put there five years ago and hasn't been touched.
All right.
So they said, let's consider the set of active repositories.
Those are created or updated during the period.
And the period is like a bunch of dates, like, throughout the last three years, you'll see when you get there.
And it has to have at least one star.
So people have to, somebody has to care about it.
Somebody has to care enough about it to have forked it.
And it must be more than 10K.
Right.
So it can't just be like, well, I put up this one file and somebody forked it or, you know, something silly like that.
It's got to be like a real project.
So if you take all of those together, JavaScript turns out to be the most popular.
But JavaScript, I'm sure, is highly overcounted.
I'm pretty sure that's generally true on GitHub statistics because almost every one of my Python projects has some JavaScript.
You know what I mean?
Yeah.
I mean, since it's the front end, it's almost every project has it.
Right.
Almost any web project in any language is going to be counted as JavaScript to some degree in the language category.
And so I feel like JavaScript, while it is extremely popular, I think it's massively overcounted in these types of stats.
And it seems to appear that way in the graph.
But so Python displaced Java, which we can all cheer for that.
Right.
That's awesome.
Yeah.
But let me give you some stats that are pretty interesting that will I think this might blow your mind.
So back in November 2014, there were 1,790 active repositories by the four criteria above.
Yeah.
That were Python.
This is just Python.
November 2015, there was 2,500.
And if you look throughout the year of 2015 and early 2016, there's, it would vary, but it's like 2,000 to 2,500, 2,600.
By November 2016, there's 10,944 active repositories.
It's just like, it's growing like crazy.
Yeah.
I love seeing that.
And I think one of the things I like, I think has changed in that timeframe is the, I don't know if it can be attributed to this, but the cookie cutter project has made it a lot easier for people to set up something to share on GitHub.
Yeah.
Cookie cutter is really awesome.
If you guys don't know about cookie cutter, check it out.
It's a cool project.
I'm sure it's not hurting.
Yeah.
Anyway, those are, that's good.
Also, it makes me think that I spent the right time learning a new language.
So I started from C++.
Yeah, absolutely.
You know, it's good to be in a place that's growing.
Now, I mean, obviously take these stats, they're with a grain of salt.
They're sliced in all these various criteria and so on.
So they might not be perfect, but they give a glimpse into a world that is doing very well and is very fun to be part of.
So I'm happy to see it.
Okay.
We're up to my number three pick, which is handling Unicode strings in Python.
It is from, I know I'm going to get this name wrong, Wan Li Song, I think.
But we'll link it, of course, in the show notes.
I like it because it's a nice article to introduce people about the concepts of text representation in Python.
And this comes up, at least, it hurts my head sometimes because I came up with the 2.7 Python world.
And I think anybody that learned with 2.7 and had to switch to a more recent 3x version,
sometimes it's hard to understand how the switch happens.
And there's a nice table for some of the things that are different.
And then it goes through specifics of dealing with Unicode in things like I.O. boundaries to databases or services.
And then also a few other examples are dealing with it with logging, with JSON encoding, and with Redis even.
A nice pointer to a 2012 article from Ned Batchelder called Pragmatic Unicode, which I hadn't read before.
So I learned a lot about Unicode in this last week.
Oh, yeah.
That's great.
If you have to juggle that stuff, it can be tricky.
I remember talking to some of the Web Foundation guys.
I think it was Kenneth Wrights and Requests, but it could have been Armin Roeniger and Flask.
I'm not sure.
I think it was Kenneth.
Anyway, seeing that one of the most challenging things of upgrading their projects from 2 to 3 or supporting 3, let's say,
is the dramatically different way that bytes go to strings and all of this kind of stuff.
So, yeah, if you've got to upgrade something that's 2 to support 3, be really careful with the strings.
Yeah, and this is another one of those, I'm going to bookmark it, and if the next time I come up with an issue, I'll look through this, see if it can help me figure out how to fix it.
Yeah.
Awesome.
All right.
What do you got as your last one, Michael?
My last one, I think this one might be a little surprising for you.
Let's see.
So, I've asked many people what their favorite editor is over at Talk Python To Me, and I've heard many answers.
You know, it would be fun to go back and actually do some data analysis and graphs or whatever, right?
But I would say Sublime Text, extremely popular.
Emacs, very popular.
Vim, I think Vim might be slightly beating Emacs.
PyCharm is pretty popular.
People hear me go on and on about PyCharm.
I love PyCharm.
Really?
I didn't know that.
Yeah.
Yeah, and people, most people don't know this about me, but I actually do use it now.
I do love it a lot.
But one thing I came across with was I was fooling around with Visual Studio Code, and this is not like Visual Studio from Windows, the big .NET thing.
This is like a lightweight editor.
It's based on, I think, the same underlying stuff as Atom.
Okay.
It's using the Chrome as its underlying engine, and it's based on some client-side HTML stuff.
Anyway, it's a free editor that's pretty cool, and it's growing quite a bit in terms of its extensions you can get for it.
It's got, like, cool Git integration, and now it's getting better Python integration.
So my pick is this thing called the Python extension for Visual Studio Code, and it runs on Mac and Windows and Linux and so on.
And I have a link to the one there.
And what's really interesting is, well, the bunch of features, which I'll tell you, but if I had to ask you, Brian, how many times do you think this thing has been downloaded?
23.
23 is good.
Well, I would guess thousands, maybe 20, 30,000 times, something like this, right?
Like, okay, how many people are installing full Python support?
This is, like, not just standard completion, but it, like, reads, if you're writing a package, it, like, understands your package and will tell you exactly what all the names of all the elements symbolically.
In your package, it'll do, like, AST-based refactoring.
Like, really cool stuff, right?
Anyway, 850,000 installs.
That's actually incredible.
Now I want to go try it.
Yeah, I mean, when you think of Python editors, almost a million people installed this Python support for their editor.
Now, of course, not every one of them is doing Python all the time, and there's not a one-to-one mapping between developers and editors.
But this is, like, way more popular than I realized.
And so I thought, well, why don't I play with it?
So I played with it this week, and I'm pretty impressed.
For, like, lightweight stuff, I think this is my new editor.
Oh, okay.
I was just actually picking it.
I installed Adam this morning, and maybe I'll try this one out as well.
Yeah, it's really similar to Adam, actually, so it's worth giving it a try.
So it has linting, including a bunch of linters you can configure, including Flake 8.
It has full-on auto-completion, as well as support for PEP 484.
I think that's the type hint.
It has Jupyter support, intending, code formatting, refactoring, like I said, code navigation, debugging.
You can remotely debug over SSH to, like, a Flask app.
I mean, that's pretty serious for this little plug-in, right?
That's awesome.
Unit tests, all the various tests you're talking about, lots of good stuff.
So anyway, I thought this is kind of one of the unsung heroes of the editors, so I thought I'd highlight it.
Yeah, cool.
And maybe the next time you ask somebody, they'll say, I use code.
Oh, yeah, I use Visual Studio Code all the time.
Anyway, yeah, it's pretty cool.
So I'm excited to try it out, at least.
Okay, well, I think I'll try it out, too.
And that brings us to the end.
But we do like to catch up with what both of us are up to.
So, Michael, what are you up to lately?
Well, I've been continuing to crank out the Talk Python to Me episodes.
So the last one I just released was parsing horrible things with Python, which I wanted to make sure I pointed out here, because I think that's a really interesting tie into your first pick of the week.
Because it's another way to parse horrible things that I think is really actually quite powerful and interesting.
So anyway, I released that with Eric Rose, and that was cool.
That was a really interesting episode.
I really enjoyed it.
Eric is obviously a brilliant guy.
So that was good.
Yeah, thanks a lot.
Yeah, he was a great guest and definitely enjoyed talking to him.
You last week had asked me if Awesome Python, the GitHub thing, was the same as the Awesome Python newsletter.
And I said, I think so.
And now I think I might be wrong.
No, in fact, the Awesome Python newsletter comes from python.libhunt.com, which is a really cool place for Python news.
And I think one or two of the news items throughout the podcast, not this one, but over all of them, I've gotten from that place.
Okay.
So, yeah, that's my picks.
What's up with me?
Python is so awesome.
We like to slap it on everything.
It's awesome, yeah.
How about you?
What are you up to?
Man, I've been doing a lot of writing.
I've got a deadline, an editor deadline, in about a week, actually exactly a week from today.
Because I'm trying to put on full steam, and it's the pytest book, and I'm trying to get it ready so that it can be printable,
and I can take a stack of copies with me to PyCon in 2017, in May.
So that's what I've been working on.
The last episode of Test and Code is recorded and partly edited.
This was number 25 with Dave Hunt about Selenium.
And there's some really good content mixed in with some really stupid questions that I've asked.
So I need to go and cut out the stupid questions, and then it'll be good to go.
Hopefully we'll get that out in the next couple days.
And then I'm really excited about an interview tomorrow scheduled.
Hopefully it goes through with a person called David Hussman.
He runs a place called Dev Jam Studios, and he also talks about Agile and goes around and speaks to people.
And he's a really good speaker, so looking forward to talking to him.
Yeah, that'll be awesome.
Kind of a slightly above-the-code talk about all the testing and whatnot, right?
Yeah, and I don't even know if he'll get into testing.
One of the things he likes to talk about lately is story mapping, which is sort of high-level planning for an entire project above the writing stories level.
And that's pretty neat.
Yeah, that's cool.
Definitely precedes code.
Yeah.
Well, anyway, I really enjoyed talking with you this week, and look forward to seeing what cool stuff people put out in the upcoming week.
Yeah, thanks, Brian.
I enjoyed it as well, and like always, I learned about some cool new things.
I'm definitely checking out Pipsy.
And thank you, everyone, for listening, and we will see you next week.