Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
This is episode 303, recorded September 27th, 2022.
And I am Brian Okken.
And I'm Michael Kennedy.
We've got a lot of great stuff to talk about today, and it's a wonderful September day.
It's finally kind of not feeling like the blazing summer, but it's still too hot.
It's that lovely fall before it rains for 120 days straight.
It's like the pre-fake fall, yeah.
Exactly.
All right, well, the Python news still flows in the fall.
Yes.
All sorts of good stuff.
Yeah.
But what I got on deck for us is a bit of a follow-up.
So I got this message from Michael Honkala, who sent over this repo that he put together.
It says, you spoke about Humre, H-U-M-R-E, H-U-M-R-E.
And I said, you know what?
There's a bunch of these projects that I'd really like to kind of get my head around them.
And so he went to all the trouble to do a whole research project and a categorization or a taxonomy of these different libraries, which is really fantastic.
So I'm linking to his GitHub repository that is basically a readme.
I mean, GitHub's kind of the new blog for code analysis, isn't it?
And it says, R-E for humans, regular expressions for humans.
And it says, there's a bunch of different options.
This list could be useful to help you decide.
You know, if you're looking for a tool, you'll just know what's out there.
You'll get a quick look and feel of how each library's API is.
Or if you're thinking about building a tool, you can check out the alternative approaches and either contribute to an existing package or see if your thing is truly unique.
And if you're building a tool or already have one, you can communicate your differences compared to the other libraries.
Okay.
So there's a bunch of packages listed here with some code examples.
So the first one Mikio calls flow style regular expression generators.
I would call them fluent style.
But where you say, you know, function call dot function call dot function call dot function call.
Basically, the result of working with a library or calling a function, it returns the same thing again and again.
And you can kind of build it up.
Like ORMs are a lot like this.
You know, you say like objects dot filter dot order by dot limit dot sort like that kind of model.
Okay.
So these include Python verbal expressions, edify, mre, regularize, and re underscore patterns.
And they all are similar but not the same.
So I'll just, I'll read something off the top one, the Python verbal expressions.
You would say ver x for version expression dot anything dot then space dot then left bracket dot or parenthesis.
So square bracket or, you know, open square bracket, open parenthesis, then dot anything.
And that'll generate a regular expression that would then go and, you know, match basically like star and then space and then either square bracket or parenthesis open.
What do you think?
I don't know if we're getting better than actual regular expressions at this point.
All right.
Well, let's go to the next category then.
These are categorized as plus style regular expression generators.
I would call them ones that like overload operators, right?
They override what plus means and the pipe what that means.
And it's a little bit like what PathLab does for forward slash or time delta, right?
Yeah.
So here I could say, you know, this includes the humorex.
That's the one from Alstor Weigert.
So this, the, let's see, which one of these do I, I think that I like the best.
I'll probably go with this, this first one here.
So you could say capture one or more of anything uppercase plus the empty string or the string of the space rather,
plus either the open parenthesis or the open square bracket.
Is that one, do you like this style better?
Well, I'm probably a bad one to ask because I actually, I don't have a problem with regular expressions.
Sure.
Well, neither of these two are my favorite style either.
I actually think I would use the format strings and the reason, which is the third category.
And the reason I say that is it's really different than regular expressions where these are kind of like a semantic wrapper on regular expressions.
You know, there's like a way, like I call functions, I give a name to the thing instead of just the symbol, like plus versus, you know, plus star dot star.
It could be anything or you could say, you know, anything.
Also with, with all of these, they have a special syntax that they use.
So you don't have to learn regular expressions exactly, but you still have to learn their syntax.
Yeah, that's true.
So when I might use one of these libraries is when it's like not enough to go do full on regular expressions, but, you know, find is not sufficient or index, things like that.
And that's these string format styles.
So if you knew I had like a log file or something and it said power colon, some number, a percent, a string, and then a temperature, then another number.
You could just say power.
This is the scan F library, power colon, percent F bracket, percent, percent S comma, and then temp.
So you, you would basically, the, the format string you would use to generate this thing can now be used to parse it in reverse.
And so it'll say, you have to have the word power colon and then a floating point number.
And then, and so on.
That's the older, that's, that's the Python two style, I suppose.
Then you have pars and simple match, which are both much more F string style.
So you, so they have a.
These are great.
So like, I'm looking at parse and that looks.
Yeah.
That looks pretty cool.
So here, yeah.
Parse the, it says, here's the regular expression pattern thing you would make.
You would say just as a string to get curly bracket amount, colon D item, colon W comma, meet me at curly time.
Right.
And it just goes and finds the amount, the time and the item as a beautiful, you know, it just like is a, basically it's a reverse F string is what it is.
So if you can express what you're looking for as an F string, then all of a sudden you can get it back.
And so for those kinds of matches, I think this is really, this is a, it's pretty different than a regular expression.
It is, but it's, it's especially those ones where you're, you're not just trying to match a string, but you're trying to pull data out.
Yes.
Where the regular expressions really get ugly.
They do.
You got like, I got to have a capture group and all this stuff.
And you're like, oh, geez, like how do I do that again?
Exactly.
And the, and the capture groups and it's guaranteed to confuse somebody on your team, but something like this, I think it's pretty neat.
Yeah.
It does mean the data has to be more structured, but if it's highly unstructured, go crazy with regular expressions.
If you just need more than, like I said, a little more than find or index, this is pretty cool.
Yeah.
There's some wacky things that really you need to jump into regular expressions or, or the, the, the other kinds.
Indeed.
All right.
Well, Mikkel put his thoughts on which ones to pick and when, and then a little bit more diving into each of these and some, some comparisons and whatnot.
So you can check this out.
It's really good work.
If you know of other ones, maybe contribute to them or add some more explanations, but there you have it.
This is really nice.
Yeah.
This is real nice.
I'm going to start.
I looks like I may have already started.
So let's go.
Cool.
Thanks Mikkel for sending that in and creating it.
Well, what do I got?
I got, it's just some sort of news ish sort of things.
So I've been playing with a Pydantic and FastAPI and a lot.
And with that, you've got types.
So you're, you're intentionally adding types, not just because you want my pie to pass, but you're adding types
types because it helps you.
You can't have to for FastAPI and stuff and Pydantic.
So one of the things I, one of the things I was curious about is the whole, the optional part, because somebody actually caught me on this.
I tend to say, I tend to say, like, int x equals none.
Or no, x of type int equals none.
And that means it's supposed to be an integer or it's supposed to be a string or something, but it doesn't have anything yet.
So the default value is none.
But none is obviously not a string or an integer.
So what do you do?
And so there's like a bunch of options.
One, you could just say, well, the language allows it.
So I'm going to do it anyway.
But I don't recommend that.
The other, the other is one option is to use optional, but there's some issues with that.
We'll talk about those in a sec.
And then another is just to union or in.
So you can use, you use like int or int bar none or union of int and none, and then assign it to none.
And, and so I, for a while, like when I, I, I'm like the language allows it just go find.
Cause what I really mean, my intent is I expect somebody to pass in, in this case, an integer.
But if, if the, if nobody passed, if they don't pass anything in, I want to, I want the, the function to handle that case also.
And so that's what the none is for.
The union is a little weird because it says you can pass in a none.
And, and I, that would be weird for somebody to pass in none, but that's what our language is also.
It like, that's the default.
So I put out this, I put out a little survey, the, the recommendation that of the 630 votes,
the, was either use the union or optional.
It's kind of, people are kind of on the fence about with that.
Um, but, so Adam Johnson says, replied to just the other day said, well, my pie just released and they,
they don't deprecate this yet, but there's going to be a future deprecation of implicit optional types.
So you kind of can't use the old style.
If you're using my pie also, you should.
The old style being int equals none.
Yeah.
Um, of just like ignore the type.
Yeah.
For the default value.
Um, so, my pie, the my pie 0.9, 0.981.
I don't know why we're not where it's zero version still, but, whatever.
Um, but it has, it talks about implicit optional types.
So this, yeah, of saying it's a string, but the default value is none.
That's, that's bad.
Uh, we don't want that anymore.
What we want is, optional.
We'll say we'll work and it'll say, you know, what, then this is the weird part.
So the weird part is optional, isn't optional.
So what, what I'd like to use as optional, like in, in, in FastAPI, it looks nice to say this, this variable is optional,
but it, what really optional means is, is just that it optional just translates to the type or none.
Yeah.
That's it.
Those are the types.
It doesn't say it's actually optional.
It's only optional.
If you, if you have a default value, the default value makes a right option.
Yeah.
You can have a thing that explicitly says this type is optional, but it's a required parameter, which is a little odd, right?
Yeah.
What's up with that?
Yeah.
So a required optional.
Um, so anyway, the third parameter named such and such of this type is required, like, but it's literally of type optional.
Yeah.
I hear you.
Okay.
That makes sense.
So the, the basic just is you have to pick, you got to pick either optional, use an optional and then assign it to none or use, use a union.
But another, you know, another, option is just to actually assign something other than none.
So if it's a string, you could have a, a flag value to say like sentinel.
Yeah.
That means like an empty string, like a, a, a great one for a string is empty string.
Yeah.
The problem is with numbers like a floating point or an integer number.
There aren't any sentils, sentinels.
I mean, I guess you could use Nan, not a number, but it's weird.
Um, anyway, wanted to reference typing.
So just to say my proof that optional is really just the union of the type or none, it doesn't say anything.
And there, and they, they explicitly say in the Python documentation that you can, you basically, you don't have to use option, the, the keyword option or you could just put a default value that makes it optional.
But yeah, it's only a type anyway.
Um, but the other thing, the last bit I wanted to talk about with this is the best introduction.
If you're confused, like I still am apparently about this, the best discussion that I've found is in the FastAPI docs, and go to, there's a Python types intro.
And, like at the top part way down, it says possibly none.
Um, and it discusses all of this and the FastAPI recommendation is, is to use union instead of optional.
And I think I've finally gotten there that I think I prefer just the either union or if you're in the bar thing.
So you can say type or like type bar none.
And that that's, if you're only in, if you're Python three 10, that works.
But, if you're, the, on the others, I would use union.
So, ah, there's a bit of a, a voting and the audience.
Alvaro says int or none, which is a voting for that one.
Anthony says, I prefer optional of int equals none myself.
I also concur with Anthony, but I still very much would love to see some language syntax.
It's a little bit cleaner, like in C# in Swift, they just have question mark at the end to say it's either can be none or it can be its value.
And it's just such a common thing to set something to none.
And then, or alternatively have its value that I would just, I would love to see some kind of simpler syntax there than, than we see now.
But yeah, or some other, some other Sentinel that like, like SQL doesn't SQL have like null or something like that.
That's just, that's not a legitimate value for anything.
Um, yeah.
And also if we use, by the way, one more reason, I think people would want the question mark or something.
I think it would be cool is, is it gives you this tonal inflection, right?
Like this function takes an int boom, hard, hard stop.
Like that means it has to be an int where it's like a, an int.
Well, then you're not sure it's optional.
Or you're not sure what type it is.
Yeah.
I think it's an int.
Yeah.
So in question mark, come on.
It's in all, it's in a lot of the other languages that have this, like things that can't be nullable unless you express their null.
You say they can possibly take on their value or null.
Anyway, I, I know this has been discussed and, and shot down, but yeah, we make it happen.
And I was pretty sure you could do this.
Thank you.
Um, Alvaro mentioned that you can use, you can use from future important annotations to use the bar for everything on three, eight and above.
So that that's good.
And, but like, like for, like if I'm doing a FastAPI, the optional is really what I mean.
And that, that I mean it's optional, but it's frustrating that the type optional doesn't actually fill in anything.
Yeah.
So a bit of a mismatch there.
Okay.
That's enough.
That is enough.
Enough on that.
It's, it is so good though.
Good, good stuff that those types are there.
Brian, you want to tell us about our sponsor for the week?
Sure.
Um, so Microsoft start Microsoft for startups founders hub.
It's, it's very cool.
So Microsoft, this episode of Python bites is brought to you for micro by Microsoft for startups and the Microsoft for startups founders hub provides all founders at any stage with free resources to help you solve startup challenges, challenges.
Um, and it, it's a platform.
The platform provides technology benefits, access to expert guidance and skill resources, mentorship and networking connections, and so much more.
and those skilled resources and the one-on-ones and the networking, it's so valuable.
So unlike others in the industry, Microsoft for Startup Founders Hub doesn't require startups to
be investor backed or third party validated to participate. It's truly open and you don't have
to live in San Francisco. So what do you get? You get free access to GitHub and Microsoft Cloud with
the ability to unlock credits over time. And they also have partnered with innovative companies like
OpenAI, a global leader in AI research and deployment to provide exclusive benefits and
discounts. Through the Founders Hub, becoming a founder is no longer about who you know. You'll
have access to their mentorship network, giving you access to a pool of hundreds of mentors across a
range of disciplines, across areas like validation, fundraising, management, and coaching, sales and
marketing, as well as specific technical stress points. And you know that there's at least one or
two of those fields that you need help in. You'll be able to book a one-on-one meeting with the
mentors, many of whom were former founders themselves. Make your ideas a reality today with
the critical support you'll get from the Founders Hub. To join the program, visit pythonbytes.fm
slash foundershub 2022. And of course, the link is in our show notes.
Absolutely. Thank you, Microsoft. All right. Let's talk about linters. I know you're a fan of
linting code and making it look good, as am I. But if you did Cython, you might not be able to get
great information about it. So Marco Gorelli sent in this project that he's just getting started called
Cython Lint. So have you done much Cython? I know you do C and you do Python, but you live in this weird
middle ground. I don't, but I want to. Or maybe I don't. I don't know.
It's, I think it's pretty neat. You know, there's, there's a bit of a build, like a bit of a build
step you got to go through to get code that will run. But the ability to just say, I wrote Python,
it has type in. It's like, oh, let's just do a little bit different code. And now it runs at C speed
for just like a function or two. I think that's a pretty appealing idea. And, you know, Cython is
definitely a good way to do that. So Cython Lint, we'll go through and, you know, just pip install
it and then run it as a command line, give it your files, or you can even install it as a pre-commit
hook. And then, you know, it'll just, whenever you commit, it'll obviously run as well. Just like the,
the no QA and flake eight, there's a hash new Cython Lint to turn off the lines. And it right now,
mostly checks things around variables, but he's working on more and hopefully other people out
there are interested in this and can add some ideas too. This is really cool. And I'm, I hope that he
does get people helping out and adding to this. It's a, definitely it was something needed.
Yeah. He said he ran it on pandas, numpy, scikit learn, and Qpy and found ways in which all those
libraries could be cleaned up. So pretty neat. And all those libraries are notable because they're
really highly, highly used and have been around for a long time. So if this is finding issues with
them, then, you know, maybe it points out that something like this should exist. Yeah, definitely.
Yeah. Cool. So not a whole lot more to say about it. You know, Cython's cool. Having some more tools
to support it. Also cool. Yeah. I've got another sort of possibly short topic. I found out about
this cool diff tool called diff tastic. Have you seen this before? Diff tastic? I don't think so.
So I'm always looking for a better diff tool. I'm never really content with my diff tools. I use one
called beyond compare. It looks like it's coding edge out of the early nineties.
It's useful, but boy.
So, I found, I'm finding that also, so I use diff a lot, but I also use it a lot within it with it,
with respect, like within, with get. So I do, you know, you're doing a get diff of, of older
versions or something. So diff tastic is, the, what's what, how it stands out against other diff
tools is it's not line based. So it's a, it's a structural diff tool that understands syntax.
So what it does is it evaluates, the language and tries to determine what language the file is in.
And then, if it like, and it's got a ton of languages and if you, it figures out like it's
Python for instance, or any other language, it creates an abstract abstract syntax tree of the
files and then checks the differences of those. So, in the past, like one of the things that
messes things up is just spacing problems. Like in, in, in something like C or C++,
where spacing doesn't matter. You can just say, well, ignore white space, but in Python,
you really can't say ignore white space because white space is significant, but with a diff tastic,
uh, the diffs, we'll, we'll know you can, if it's significant white space, it'll tell you.
So, I tried this out this morning and it's, it's pretty amazing. So, I tried it. So the,
the thing I tried was, replacing with the diff tool. So there's a, with get, so in get,
you can, you can say, and I just tried this single line thing to just temporarily say,
I want to try get diff. It has, is diff T instead of, instead of get diff. so, what this
does is it does a diff and you, and there's ways on in the, in the documentation that where you can
permanently turn it on, but it's colorized. So you've got like syntax highlighted files side by side,
and it'll show you what's different and it highlights the difference. Well, I got a little
bit confused. because the syntax, there's syntax highlighting and highlighting to show you the
difference. So, there's a flag and I, I'm not sure where it is in the documentation, but basically
you just turn off, you say --syntax highlight equals off. So it turned, it turns off the file
syntax, but it shows, so all the highlights are just diffs. and so like, if you, if you normally
say get diff just without anything, it'll say what's different about my, my file versus the last version
or the working directory or whatever, like what, what it usually does the right thing. And, and then,
but it's like on top of each other, it's not side by side. So having it side by side, it's cool.
And having it highlight. So I had a, some code where I changed stuff and I've been working
at a month ago or so, and I forgot what I did and get diff show me just tons of changes, but diff
tastic showed me that I was just changing some, some minor things like adding types, a couple types here
and there or changing, double quotes or single quotes, double quotes. So I apparently ran black on
it at one point. And, and there was like, Oh, sin AST wise, there's really nothing different. So I can
just commit this and be done with it. so it was really helpful. It is a pretty interesting idea,
right? Sometimes you really care about those little formatting differences and you want to make sure they
get merged and committed. And other times you want to know what is the essence of the change. And this
sounds like that'll answer that. That's pretty cool. And it showed me a bunch of stuff that get
says change. There were file changes, but get, but diff tastic said there's no, there's no syntax
change. So I, I apparently had changed some, you know, light, some formatting or something or ran black
on it, but there was nothing significant change. So interesting on that. and apparently this was
a huge pain in the butt to make, and, and there's a, we're going to link to a blog or blog
article called, diff tastic, the fantastic diff, by, Wilfred Hughes, who wrote it that
basically said he thought this was going to be sort of a minor thing to build. And it was a big thing to
build. so six months later. Yeah. I'm not sure how long he spent on it, but yeah, but yeah. And
here's a, here's a image of the little different highlighting the colors and changes and stuff.
So anyway, it's nice. Yeah. Looks like a great tool. I've never heard of it. Thanks for,
thanks for finding it. Alvaro out there says code --diff. I'm guessing that's VS Code diff.
I've never, never done anything. I've never used that for my command line. I should try that.
Yeah, perhaps. okay. also one that I've been looking at, I haven't gone into uses this one
called kaleidoscope. That's just for Mac only, but it looks, it looks pretty interesting. It's
supposed to work on code, but also on like, directories, but you know, images and other
documents as well. So I don't know, maybe someday the only challenge, it looks beautiful. The only
problem is a problem. It's the thing that has held me back is it's $150. So it better be darn good.
At least there's a free trial. Maybe I'll try it someday.
I volunteer you to try it out and get back to us. Exactly. Let me know how that goes.
Yeah. All right. Well, that's our items, right? I got, I got an extra. If you're ready.
Yeah. Let's go to extras. So this is not a Python thing, but a thing that
developers may be interested in. Have you heard of next DNS? No. So one of the things that's a big
hassle is spyware tracking, you know, all sorts of trackers like finger printers and, you know,
Facebook cookies and all these different things that are trackers, which is not lovely. but also
malware as well. And a lot of those are being served off of third party domains. So there's this product
called next DNS and I'd never heard of it, but apparently it more or less acts like a firewall by
not allowing malicious or unwanted things to resolve over DNS. Wow. So what you do is you just,
you set it up and you just set your DNS server to be, you know, one, seven, two, four, or whatever their
DNS server number is. And then it goes, everything goes through there. And if it says, Hey, we're trying
to go to double click, you know, like, no, we don't know what double click is. It's not on the
internet. I'm sorry. And just, there's no more ads. So it blocks a lot of the ads and trackers.
And because it's a DNS service and not like, an ad blocker in your browser, it works on whole
devices. So you could set it up on say your router and then everything, including your television and
the mobile apps and everything on, they would all get this blocking, which I think is pretty cool.
Pretty interesting. Yeah. I'm definitely going to check this out.
I'm not quite ready to set it up on my, my router yet because every now and then you,
you basically are forced to turn off your ad blocker for some small weird website. Or do I
want to impose this on my wife? Maybe, maybe not. Do I want the tech support that like, so I'm on the
fence, but I think it's a neat idea and I might play with it as well. You can always get it and just
set it on your, your computer. Right. But if you wanted to like every device I have automatically gets
malware and ad tracker blocking to put it on your router. Yeah. So, so one of the things, oh, do you
have any other extras? No, that's it. Okay. So one of the things I've been trying, to block ads and
stuff is, is I found out about this, a VPN called mall that mall VAD, I don't even know how to
pronounce that. but it's pretty, it's been pretty good. it, it blocks a whole bunch of
stuff. of course, switching to Vivaldi helps, you can turn, you can have a Vivaldi block stuff,
but mall VAD is so, so, like, into security that it doesn't even ask for a password
or, or an email account or anything. So what you do is when you sign up, it gives you an account number
and you just have to write that down and use that. and to pay for things you can use there. They
encourage you to use cryptocurrency or something, but you can use cards or whatever, but that potentially
could tie you to them. Right. So they also allow you to, just put money in a, in an envelope
with your account number and just mail it to them. That's awesome. They'll add money to your account.
So anyway, that's pretty neat. I've done a massive amount of research on VPNs and there's a really
whole bunch of shady ones out there, but mall VAD and Nord VPN, those two come out really, really good.
And so I've heard of great stuff from all that I use Nord VPN. And the reason I'm not using next DNS or
something like it is I just run Nord VPN and everything and check the block, all the ads
over that as well. So it's very, very similar. So yeah, this, I've, I think this is a great solution
and basically do the same thing. I also want, I wanted to remind everybody that, the current,
this is a little bit old news, but the current Python 311 is, Python 311 0 RC2 definitely
worth people trying out. And definitely if you've got a module that you're, it should have been doing
this already. Shame on you. But if you've got a package out there on pipe PI and people are using
it, it, you should be updating your testing to make sure that it's testing, the latest Python 311,
uh, to make sure it continues to work. the last extra I wanted to bring up is I saw this
the other day called, Oh my get. And so this ends up being what it is, is it's a little game
and it's a little weird. but I tried it out, downloaded and tried it out. And so you've
got most of it's like this sort of a view. And so you got a, like a, there's a workspace area in the
middle, there's cards at the bottom and the cards are skills that you get, but it's in the, and on the
right, there's a description of what you want to do. And you have to like, learn the get commands to do
something, like, rebasing or merging or whatever. And, the, I, I started out at the,
trying out at the very beginning, the basic stuff. And it actually was, the introduction was pretty cool.
And then, but what I really like is that you can just go to the course, the, the, the available,
available lessons. You don't have to do it in order. You can jump out of order and just hop ahead to
something else that you're having problems with and sort of have a visual introduction to,
to get. So it's kind of neat. That's weird and kind of wonderful.
It is a little weird too. Yeah. Yeah.
But wonderful. Yeah. Very cool. All right. one more, a quick follow-up, wagon race
out there says, I know, but we don't add, but ads are the reason most stuff is free. Or do you want
to make a donate or, you know, do you make donations to sites that you block ads from?
I just want to comment on that real quick. I understand that there's a lot of services
that do need support. I mean, I was just listening to an interview with the guys from the verge.
They have a hundred person team at the verge working on stuff. And yet there is so much like
collection and triangulation, triangulation of who you are and what you are by these ad networks
through like data brokers and behind the scenes stuff that is just, it is a plague on society.
I mean, think about, the 2016 election and, the, the Facebook stuff. God, what is that name
of that company? Do you remember Brian?
But don't, but yeah. So they were using all those things to basically that kind of information
collected from those ad networks to target and manipulate people. So it's not just about like,
do I not really want to see this ad for a new program programming book, whatever it's, it's not,
it's the fact that they're using these terrible third-party networks to deliver it. So for example,
Brian, check this out, pythonbytes.fm, right? If we go here and we go to our episodes and let's just
pick one here. I got to zoom it back out a little bit. There we go. Look, this one right here. It has an
ad that's being, there's an ad blocker on my VPN on the network and there's an ad block blocker in my
browser. And right here we have an ad with no blocking. It shows up just fine. Do you know why?
Because we're not using an evil third-party network. There's no tracking. There's no retargeting.
We show you things from people who support us. We, we ask you to please check them out and at least
consider it to support our show. And yet there's as much ad blocking here as there is on somewhere like
CNN or, you know, you pick your spot. These places have like 30, 40 different tracking networks on you,
triangulating stuff and reselling it. And it is a plague on society. And if CNN wanted to show you
ads, they could do just what we do. I'm sure they have better relationships with advertisers than we
do. So Cambridge Analytica, thank you for letting me know. Yeah. So I'm not against ads. I mean,
to a large degree, we are ad supported. I'm against people building behind the scenes information and
using it to manipulate society. Bit of a rant. Sorry. Sorry, Brian, if I went too far there.
No, they had, and some people just don't realize that, that the ads are not just,
there's a product that we think that you might like based on the content of this page. That totally
makes sense. Like this, the people that are listening to Python bites, they might be interested
in Python for, or Microsoft for starters, founder or something. Magazines used to be like this all the
time, right? So you buy a magazine. It's not tracking you that whether or not you looked at something or
looked up somebody's website because of a magazine ad. there's it, there's just stuff collected
about you that I don't think is necessary. And I think, like for instance, read the docs has like
the ethical ads that, they don't do, yeah, they don't do tracking. So yeah, exactly.
And neither do we on purpose. It probably we've had to turn down sponsors. People said,
we want to sponsor you, but we need you to install this tracking thing for your MP3 downloads. We need
to install this Facebook pixel and these other things are like, you know what? We don't want your
money. Like, no, we're happy to sell your product because it's irrelevant, but we're not going
to spy on our users. So thanks for no thanks. All right. And, wagon race, just quick follow-up
says, thanks for the explanation. I do understand you better. And I'm glad you guys are big enough
to direct, to have direct sponsors without trackers. so are we. Thank you. Okay. With all that,
let's flip the table and make something, close out with a joke. What do you think, Brian?
Yeah, I'm ready for something funny.
All right. So this one comes from somebody who had to go through this online multiple choice
prove to me, you know, JavaScript test to be hired. Okay. And it says, so I got this wrong
because the person who typed in the question made a mistake. So here, check this out. The,
it's one of these multi-choice question things that says, what is the result of the function call
shown below? And it's just super simple JavaScript. It's, creating, one of these little Lambda
expressions here. And it has, the equivalent of an F string and a interpolated string is really
the essence of it. And it says console.log open parenthesis. This is important as you would
open parenthesis quote. Hi, my name is, you know, dollar curly first name close off the curly. And then
it closes out console log instead of with the closing parenthesis with a closing curly brace.
And so the options are like, hi, my name is John. I'm logged into the console. Hi, my name is
undefined. I'm logged into the console. And this, what the machine thought was a correct answer is,
hi, my name is John Jr. I'm, cause that's the name of the, the, the variable or the value variable.
I'm logged into the console and they, you answered uncaught syntax errors logged a console.
Like no wrong. It was supposed to say John Jr. No wrong. You typed it in wrong.
Wouldn't that be frustrating if you're trying to apply for a job and they put syntax errors in there
and you're like, nope, because they may be checking whether or not you're finding that closing curly
brace, right? That's a legitimate test, I guess, but no. Yeah. And it, I think it's fine that you don't
get to work for them because they're probably not someplace you want to work for. They've got syntax
errors in their onboarding. Exactly. In their application process, but. Exactly. Oh, well,
anyway, I thought that was pretty funny and I'm sure people have been through the, like, there's all
these sort of weird go home and write this test or take this thing to prove, you know, how to write
code sort of things. I'm sure people have been through, so they'll probably get a laugh out of
this. Yeah, that's pretty funny. All right. It was. Well, should we wrap it up? Let's. Cool. So,
thanks everybody for coming and watching the show and also everybody that listens. We love all of you
and thanks, Michael. Indeed. Thank you, everyone. Thank you, Brian. Yeah. See you next week.