Brought to you by Michael and Brian - take a Talk Python course or get Brian's pytest book


Transcript #366: Put It In The Backlog

Return to episode page view on github
Recorded on Tuesday, Jan 9, 2024.

00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to

00:04 your earbuds. This is episode 366, recorded January 9th, 2024. Welcome to the new year.

00:12 I'm Michael Kennedy. And I'm Brian Okken.

00:14 And Brian, this episode is sponsored by us. Support our work by taking our courses,

00:19 the Talk Python training ones, the complete pytest course, and as well as through our

00:24 Patreon supporters. All those links are at the top of your show notes and your podcast player,

00:29 episode page, and so on. Connect with us over on Mastodon. You'll find us all on Fosstodon.

00:35 That's right. Michael, Brian, and the show. It has its own pronouns and gets thrown into the group

00:41 and has its own website and all that. So come see Python Bytes over there as well. And if you want

00:46 to be part of the live stream, you're welcome. That's certainly not required to take part and

00:52 enjoy the show. But if you want to be part of the live stream, pythonbytes.fm/live. Usually

00:56 you'll see some scheduled upcoming one. You can click, you can, you know, smash the bell,

01:00 crush the subscribe, all the things they say over there. Yeah, Brian, it's been a while. Welcome

01:04 back to the show. It has been a while. I'm excited to be back. I am too. Thanks everyone for, you know,

01:11 being patient with us while we took a little break over the winter break. It's always a little bit

01:16 tricky to juggle that kind of stuff, especially Brian, when you're on a beach and it's 80 degrees

01:22 Fahrenheit or 20 degrees Celsius, 22, something like that. It was, it was a windy day. It was,

01:27 there was one day it was windy. It was, it was rough. I'm really sorry about that.

01:32 Thank you. Thank you. I appreciate your balances. Yeah. Brian, can I, can we maybe not skip this

01:39 episode because I'm in Hawaii hanging out on the beach, sipping drinks? Yeah, no, no, no,

01:45 it was lovely. It's good to get away, but it's also really good to be back. So yeah. Yeah. And I

01:50 missed you. Yeah. I missed you too. And everyone missed, missed the audience. shall we shit it

01:56 off? Yeah. 2024. Let's get it. Let's get started. Let's get started. Okay. So, Anthony shot. So

02:06 one of the things that's possibly hopefully coming into Python 13 is Python 3, 13, sorry, we're not

02:12 all the way up to Python 13 yet. We're still in three, three that 13 is a jet compiler. It's,

02:18 and, and I'm, I'm with, because of like, you know, Java and other languages, I'm familiar with

02:27 jet compilers, but pythons is going to be a little different. So Anthony Shaw was kind enough to write up,

02:32 a article kind of walking through it and it's a really nice. there's a couple of things that I,

02:38 I recommend reading it. If, if you don't really know what a jet compiler is, or if like me,

02:44 you didn't know what a copy and paste jet compiler or jet, whatever implementation is. So that's kind of

02:50 where he goes with this. And he, he starts off talking about really what a, what a jet is. And

02:55 really it's, it's something that basically generates your, your semi, your compiled code

03:01 for a lot of times it's compiled code, machine code. but for Python, it's going to be, the,

03:07 not the compiled code, but the byte code. So getting the byte code ready, I think I may have gotten this

03:13 wrong. but, we, he walks through, kind of what a, what a compiler is or a jet compiler is

03:22 with, with the, as if you were writing it in Python. So he goes through a little example of making your own

03:29 Python version of the CPython interpreter, like, which is actually written in C, but if you were to write

03:34 in Python, it might look like this, like, switching on op code of load instruct load constant,

03:39 things like that. and you can see what those primitives are by using the disc, disc, module

03:46 for disassembler. And, and that's fun. The, and then he walks through kind of, okay, so that's

03:52 what a, what a JIT compiler might be. What is a copy and patch JIT compiler, not copy and paste copy and

04:00 patch. And, and that's a little, a little bit more harder to describe over audio, but he, but,

04:07 but Anthony does a really good job describing it. And, and then talking about really this thing,

04:14 it, instead of like copying a piece and then running it, it copies like more than one bit,

04:19 like the entire function and then bring the whole thing. And it's a little bit faster. And, and then

04:25 we're going to do something like that. It's going to be something like that for Python inside of the Python

04:30 C, interpreter and how to that's, it's just a good walkthrough to kind of understand what is going

04:37 on. What are these people doing and why? And the why is it's going to be a couple of things. It's

04:43 going to be faster. and in his, there's some benchmarks that show it's from like two to 9% faster,

04:49 which is great. I mean, actually, anytime you can make things a little faster, it's good. but,

04:54 but is it worth it for this in it's, it's worth it for this partly because mostly it doesn't make

04:59 it slower, which is the good part because, because of this JIT compiler, there's other tricks that they

05:06 can do down the line to make things a lot faster. So this is, this is great news and a good explanation.

05:11 Yeah. It's super exciting. And you're on top of the news today, Brian, like this came out this morning.

05:16 So, well, well done. This is brand new from Anthony Shaw. Anthony, excellent work. writing this up and,

05:23 all the things. So one part that's interesting is two to 9% is great. Like that's still really good

05:31 to make things faster. Yeah. But he also points out that this is just the foundation. Like once you have

05:38 a JIT, there's all kinds of interesting things that JITs can do on a per hardware architecture,

05:44 per platform story, right? They can say, well, you wrote this code, but I know we have these specific

05:50 machine instructions, specialized machines, instructions on this CPU. So let's make it do

05:56 that. Or I see that you could actually inline this function instead of just make it run faster. We could

06:01 inline it over here and here and here, and then, you know, function calls in Python are expensive.

06:05 So maybe they just become not function calls, right? there's, there's a lot of possibility for

06:11 where things go. It would be interesting. I wonder if you could even do things like, you know,

06:16 compile stuff to see, and you see optimizations as part of the JIT compiler, right? Like maybe there's

06:21 a bunch of like layers that could happen. I don't know, but yeah, basically this is, you know, a foot

06:28 in the door for compiler optimizations that we've not had before in Python.

06:32 Yeah. Yeah. It's pretty exciting. So, yep.

06:35 Excellent. Excellent. So the future is bright. Also compounding is interesting, right? Right.

06:40 We're supposed to get Python much, much faster by making it like a little, a little bit faster over

06:45 five years continuously. Right. And this is just part of that, right? So you keep adding the things up and

06:51 the Python, I don't know, three, 14, 15 versus three 10 when they started could be super, super different.

06:57 Yeah. All right. Let's, I hope people like deploying, packaging, bundling, talking about managing

07:03 your projects because that's all I got this week, Brian. I got one after another. So let's start out

07:07 with this, Mastodon post by Bass Neiholt. And Bass says, we're launching Unidep, which is a

07:15 unified Conda and pip dependency management system. Okay. So we've got the Conda world, we've got the

07:21 pip world. Sometimes they kind of work together, but they're pulling from different sources. So you can

07:27 like in a Conda virtual environment, you could pip install a thing, I believe, and it would still

07:32 install, but here's the deal. Like you can create a single requirements.yaml file and say,

07:36 I depend on these different projects. Those two come from Conda, Conda forge or something.

07:42 These three come from pip IPI. Interesting, huh?

07:45 I'm actually excited about this. This is very interesting.

07:48 Yeah. It's super interesting. It works with pyproject.toml and setup.py.

07:52 It also is good for monorepos. So why is this good for monorepos? Monorepos are,

07:57 I don't want to have to switch projects on GitHub. I just want one ginormous one for a whole company.

08:04 So let's just have one, right? Which is kind of an insane way of working, but it's also pretty

08:09 interesting, right? Like I've got two libraries. They depend on each other. It's just all on the

08:13 same project structure. So, you know, you just version them together, but that's literally every

08:18 project for your company. And there's different teams potentially working with different versions

08:23 different things. So maybe there's some data science folks and there's some web API folks and

08:29 the web API folks are maybe pip and the data science folks are Conda. So here you could express all of

08:35 the requirements for the different projects through these different sources, right? Because some might

08:40 be Conda, some might be PIP, but here's one, one way to express it. Also, it'll create consistent

08:46 Conda lock files for multiple projects. It has a platform support and you can just,

08:52 you need up install if you want, which is pretty cool. So looking over at the GitHub here,

08:58 yeah, pretty much, honestly, pretty much says the same thing, but it shows you some examples of,

09:04 you know, how you might express, you know, what is, what is a Conda dependency? What is a pip dependency?

09:10 So like in your requirements.eml, you just have dependencies. Let's just say numpy, or you'd say

09:16 Conda colon Python graph is, or you'd say pip colon graph is, if you wanted that one and so on. Right.

09:22 And look at this, you can even include other, you have like nested requirements.eml, which maybe

09:29 talks to the monorepo type of thing or multiple projects just in one repository, right? Like this

09:35 thing actually requires these four other things. This, this is even interesting. You know, we were talking

09:39 about courses and I know you're going to mention something about your course later. This is actually

09:43 would be really nice for courses as well to do. And I suspect you probably could do with PIP. I just,

09:48 it never crossed my mind. Right. I might have chapter one, let's do FastAPI stuff. Chapter two,

09:53 let's add Beanie and MongoDB. And like those have different requirements files. And you might want

09:58 to just be able to express like, well, just run this one, just run this thing. You have everything you

10:03 need for the course, but you also want to not like talk about everything before you get to it. Right.

10:07 You could have like one at the top of your course repository and then every chapter have its own

10:11 one of these and then just like pull them together with this, like this.

10:15 Oh, interesting.

10:15 That's cool. Right.

10:16 Yeah. I've never really thought to do that.

10:18 I haven't either, but it seems like I should, I've just been copying that stuff around. Seems

10:22 like I shouldn't do that really.

10:23 Awesome though. Yeah. So, uni depth, it's brand new. I don't know if this thing's gonna

10:30 take off and be super, super popular or if it's going to be kind of niche, but you know,

10:35 it seems like it's solving a unique problem. And it really is kind of a time of like a thousand

10:40 flowers blooming in the packaging and dependency managing space. Like previously we talked about

10:45 hatch. I have more to say about hatch later as well.

10:47 Do you remember, did you say that it were, you, you can use a pyproject.toml instead of,

10:53 yes, you can. Okay. Yes. It's a, because there's already enough YAML in my life. Yeah. Yeah. You can use a pyproject.toml. Cool.

11:04 Alternatively, one can configure the dependencies in the pyproject.toml under the tool.uni depth

11:09 section. All right. Nice. There you go. Yeah. All right. Well, over to you. well, I would like a

11:17 lot of people I've been, doing some work over the holiday break since we also took a break from

11:23 podcasting a bit. I've been doing some open source work and I ran into, this is timely because I

11:30 ran into, some problems with, with pull requests and wanting changes, changes in pull requests

11:37 and having some of the problems with if somebody, does a pull request and their fork is on main

11:44 instead of on a branch. And so, and it causes problems. and so instead of having to write this

11:52 up as to why you should not do this, Hinnick beat me to the punch and wrote this great article saying,

11:58 don't start pull requests from your main branch. and it's, it's tempting, right? when I first

12:05 started using get at work, even at work, the, so personally, I, when I was started using get,

12:12 I just used main and, and just checked. I just had one branch and that's no big deal with my,

12:18 my own stuff with a, with a team. We had to decide, well, we're going to use, branches or forks.

12:24 and, possibly not both, but you can use both. And in open source, it's common to use both.

12:30 And what we mean is you fork the repository and you create a branch. why do you do both? Because

12:37 it seems like if you're going to make a change, you just need one or the other, right? And you can't do

12:41 a branch because you don't have permission. So you, you do a fork, but you do both a fork and a branch

12:46 for reasons. And the reasons are spelled out, here first. if you, if you didn't do that,

12:53 he's, he's giving the reasons in the sense of if you did main instead, why that's bad is first,

13:00 you can only do one pull request at a time. If you were going to do your pull request off of

13:04 your main branch and it's not been accepted yet. Well, you can't, you can't go and do another pull

13:11 request for a different change. You can't do another fix because you've already used up your

13:15 main. whereas if you do a branch off of that, you can have as many fixes as you want.

13:20 So that's reason number one, but people might think, ah, I don't care about multiple stuff.

13:24 I'm just fixing the one thing I care about. Great. if it takes a while, so somebody on the other

13:30 end is going to have to pull, like review it, maybe ask you for changes to, maybe, merge it

13:38 even that's great. If they end up merging your pull request, that's awesome. But the, what happens

13:44 then is it'll, that branch will have changes of both the, both the main line and your branch

13:49 all in this branch, your main branch. And now that has conflicts and you're not able to pull it back

13:56 to your local repository. So polls won't work. And you just, you, I don't know what you do at that,

14:01 at that point, you blow away your fork and start over. You delete your repository to start over.

14:07 Yeah. lame. okay. The third reason is, is the pragmatic one of getting something done.

14:16 And this is the one that bit me, a couple of weeks ago is, eat, there's two reasons you're,

14:23 I may, I might be like messing this up, but, you can, if you have it on main it's,

14:30 and you have branch protection on, which a lot of repos do most of most, a lot of big open source

14:36 projects, the main is locked down. then, and you don't want, you want to allow it's allow

14:43 edits from maintainers, is meaningless at that point, because what I want, want to do is if there's,

14:49 if somebody does a pull request and I want to accept it, but there's a minor change to it that I,

14:53 I want to like tweak it. Like maybe the, I don't know, the naming convention's wrong and it's not a

14:58 big deal. I can just change it before I merge the pull request. You can't, if, if that's locked

15:04 down the, the original, the person pulling into their, their, repository can't do that edit.

15:10 And it, it's just not nice and it's not fun. So, just remember to do fork and branch don't do just

15:18 fork. so that's, that's the, public service announcement for today.

15:23 Yeah. I mean, fork is required because you, a lot of times you don't have right access to the main

15:28 repo contributor access, but doing it from your main, doing it from like some other, the main branch

15:34 instead of some other one is yeah. You only learn that that's a bad idea when you do it. And then

15:38 you're like, Oh no, now I've done that once or twice. I'm like, I'm going to make a change and do a

15:43 pull request and submit it. And what if they don't accept it? Then your main is out of sync forever.

15:47 You can never sync your fork up again. And like, there's just all sorts of.

15:51 And, and even if there's no ugliness there, let's say there's, and this has happened to me many

15:56 times, you, and somebody wants to, to merge your stuff in, but they're merging other things

16:02 too. And maybe they grabbed a few other things first. Now they, they really would like to have

16:07 the merge from yours be really clean and just see the changes. So the great thing to do is to merge

16:14 your, the new main to your new main, and then resolve it with your forked brand, your branch first,

16:21 before going all the way back. And if you don't have that, it just doesn't work.

16:25 Yeah. That's a good point too. Indeed. Indeed. All right. Let's get back to deployment.

16:30 Okay. This one's different. Okay. Installed. This is kind of like a, like a little bit of a web 2.0 name installed, but zero vowels installed.

16:42 Oh, in S I N S T L D. So this is an interesting project. When I first saw it, I was like,

16:50 this seems like a bad idea. I don't know. This seems like just a bad idea. Let's not do this.

16:54 And then people kept recommending it and saying stuff like, you know what, actually,

16:58 that's kind of cool actually. So here's the deal. Previously, what we talked about is like

17:03 the right way, right? You're going to create your requirements, your dependencies,

17:08 you're going to have pin versions. You can have lock files. Someone is going to create a virtual

17:12 environment or a Docker container or something like that. Then you're going to install all of those

17:18 things, right? Right. What if you don't, what if you have, Brian, what if you have a single dot PY file

17:24 you want to give to somebody and you want to just let them run it, but you know, it needs like one or two

17:30 dependencies. Like maybe you really, really, really want to use rich because Will's project is awesome.

17:37 And you just don't want it to look plain white, unformatted. You want it to look good, right?

17:42 So you want to be able to handle one of your coworkers or somebody else, one of these things

17:46 and say, just run it. Well, just run it becomes all of a sudden a conversation about virtual environments

17:51 and all these things. Right. And like, ah, geez, just, just want to format it just a little.

17:55 Could we somehow, well installed is kind of aiming to solve that problem. Right. So it's not like a

18:02 high-end production sort of thing. It's a, let me be able to pass a file around without going through

18:08 the whole process of, you know, like PI installer because like, well, oh geez, I made it exe for you.

18:13 That's right. You're on windows. Let me recompile it. Like, okay, great. No. So here's the deal.

18:18 It lets you run Python code without installing the dependencies, without mentioning the dependencies,

18:25 without having any awareness said dependencies. So, so exist with one huge caveat. And that's,

18:33 you must have installed installed. Okay. Once this thing isn't there, it can then bootstrap

18:39 everything else. So maybe like, if this was a thing you were doing with your coworker story,

18:43 I said like, okay, well everyone pip install dash dash, user installed or, or pip X installed,

18:51 or I don't know, something like that. Right. But once that's there, then you can run and use arbitrary

18:54 things from PyPI without having them installed or requirements file or going through a step. You

19:00 just Python space, your thing off it goes. Also, if you were in a really weird situation, but you had

19:06 to do it, you could use two versions of the same library package within a single execution of a program.

19:12 Okay. Interesting. Which you might do that because you have incompatible libraries. Like I've talked

19:18 before about there are times where I literally cannot pip install dash R my requirements. Right. It's just

19:25 like, Nope. This old janky version of some library depends. It's pinned less than something else, some

19:31 other library. And then like another library is greater than that same library. Well, modern pip just

19:37 says, guess we can't run your program. Take a hike. Right. So this would let you sort of, say this part of the

19:43 code uses the old janky thing. Let's use it and then get rid of it and then go back and use another.

19:48 All right. And also doesn't leave behind junk on your hard drive. It basically deletes everything. So

19:53 how does this thing work? So basically in your code, you can say you have to import installed,

19:59 and then you use a context manager. You can say with installed some package, and then you can use,

20:05 like within that context manager, you have access to that. Pretty wild, huh? Okay.

20:09 So basically that, that context manager will make sure that it's installed on your system. It'll

20:14 download it, all those things. And then like when presumably when it closes, it'll delete it.

20:19 You can also do it as a REPL. So you can, you know, interact with just like the Python REPL. You can

20:25 interact with it that way. you can run a script. You can say installed some script, and then it'll,

20:31 be executed as if you were running it like regular Python, but it'll, you can also pass in,

20:37 dependencies that it might need to run it. Right. If you're like this out, if your program has

20:42 imports of any packages other than the built-in ones, they'll be installed automatically.

20:47 Right. So you just say installed some Python file and it goes, oh, you're saying import this stuff.

20:52 You're import, you know, HTTPX. Hopefully you got the names, right? Yeah, exactly.

20:56 So yeah, anyway, you can do a bunch of, a bunch of more advanced stuff you can talk about there.

21:03 You can pin the versions. You can specify, which IPI, which package repository it comes from.

21:10 If you have like a, the example here is a test one, but if you've got like a private whitelist

21:14 server and so on. So there's a lot going on here. I don't know. How does this, how does this hit you

21:19 seeing this?

21:20 You know, the W I was, I was thinking I don't need it up until just a second ago where I know when you had you with the eight, being able to do multiple versions in the same file, even to say, like with, like, as an example, normally I, I test against multiple versions of PI test, for instance, or multiple versions of something. Like in my own stuff, I'm testing against maybe a few different versions of a particular.

21:50 package. and I do that usually outside in talks to be able to, to, to install a different environment, set up a different environment to with those different, different things installed, but to be able to do it all in one run, that's pretty interesting.

22:06 actually. It is interesting. Yeah. Yeah. So it's pretty interesting. apparently when it runs, it spits out basically the pip output, you know what I mean? It are, it comes, but in the context manager, you can say catch output equals true. And then it's kind of invisible to your users. It just takes a little startup time as it does the dependency stuff, you know? So yeah, yeah, yeah. Pretty wild. So when I first saw this, I thought, this seems like it's encouraging people to do the wrong thing, but it's, it's also some interesting flexibility. So there you have it.

22:36 and sold. And sometimes people need to be encouraged to do the wrong thing. That's right. How else do you learn to do the right thing? No, just kidding. Yeah. All right. what, what do you got for our extras?

22:47 I got a couple extras. I am super excited. The other thing, one of the things I was doing is open source code this break, but I also was, I was completing the complete by test course. so, I named it the complete by test course before it was complete. Now it actually is complete all 16 chapters. However, it's not, it's never really going to be done because this isn't a printed book. It is, is, is a project. It's,

23:17 it's a course that's up on the web and I'm going to update it if I need to. So, I've, it's, I've got a good community going with it already. And, and we're going to, make sure that it's up to date with new versions of by test, like, by test eight is coming out. And if I, I don't think that I'll have to change anything, but if I do have to change stuff, I'll change it here first.

23:39 you can just do a fine replace for a seven to eight and you're going to be fine.

23:42 I don't actually put seven in there anywhere. I know, I know. but, but there might be some new toys that we want to play with and there already were. So one of the, one of the fun things was, was get in getting this is, is going through and being able to say, Oh, I do things a little differently now. Like one of the parts is building a, a, a pie test plugin.

24:01 And I package a little differently now than I did several years ago. So, I got to use the new, new way and we're keeping that up to date. So that's the first thing. The other thing is this course took a lot of my time actually to get this to, to the point where it is now. And, and so some things went on the back burner and a couple of things were the other podcasts. So Python people and Python test, Python people has new people. Will Vincent, and I've got a whole bunch more than I need to release, but Will Vincent was on in October.

24:31 And I finally got this released, and we talk about Django and writing technical books and Will's awesome. He also is the, the host of, Django chat podcast. and then I don't have any, the last, Python test episode was out December 15th, but I've got a whole 16 of them planned. They're not recorded yet, but 16 are planned. So these will come out in the next few months. So stay tuned.

24:53 Awesome. Awesome. How about you?

24:55 Well, I have a whole bunch of talk Python stuff coming. I think I have 12 scheduled or something.

25:00 And it's kind of out of control to be honest, but I've got some extras that are more relevant here.

25:05 Okay.

25:06 Not see the joke yet. That is the end. All right. So Ofec just sent us a follow-up and it's a little unfortunate that we talked about this big release of hatch 1.8.

25:16 And then went on a two week break because like the next day he said, great coverage on hatch 1.8. Thanks. However, one small correction. Remember I was so impressed and psyched that the binaries of your apps, if you made apps with hatch, which is a cool, cool feature of it would be signed. I'm like, how are they doing this? How do they get away with doing this? Well, they're not.

25:39 So he's a one small correction. Only the binaries for hatch themselves are signed by the certificate of the PSF, not the binaries created by hatch for you. Those are your certificates problems.

25:51 Okay.

25:52 We're back to signing our own apps again and dealing with Apple and Microsoft and all that stuff.

25:57 Okay.

25:57 But it makes more sense, right?

25:59 Okay.

25:59 next, this is just interesting.

26:02 high PI had new user registration temporarily suspended there.

26:08 the volume of malicious users and projects being created outpaced the ability to respond to it in timely fashion.

26:15 So like, we just need to slow down.

26:17 No action required.

26:19 This is from last week, just interesting.

26:21 And I guess, you know, thank you everyone for being on top of this, honestly, because what a hassle.

26:25 I also would, I don't know what they're doing right now, but at least I would recommend, I don't know if it would really help, but like cloud flare, turnstile, at least stop, stop the bots, you know, which is a way, way, way, way, way, way better, way better thing than the Google recapture.

26:44 I think so.

26:45 Yeah.

26:45 Maybe if, if some kind of gate like that would be awesome, then put that up.

26:49 Anyway, that's news.

26:50 Also coming up next February, February 12th, which is in 33 days.

26:55 I'm doing a YouTube only thing on talk Python that I think will be really fun with Martina Puglisi about data doodling.

27:04 So she's got this whole cool series she's doing where she's doing, data science by just sketching it out and just drawing pictures and trying to understand data before jumping into like notebooks and stuff.

27:17 And so we're just going to talk through some really fun doodles and it's all visuals, which is why it's YouTube only not on talk Python.

27:23 Exactly.

27:25 But so if you're interested, please come and, click the get notified to register and quotes, to be part of that, that live event.

27:34 So hopefully people will, that'd be really cool.

27:36 I think she's got some beautiful, beautiful work and you'll appreciate when we'll get there.

27:40 and wrote an article called, which maybe should have R in the front.

27:46 Are AI features a waste of time?

27:48 So my premise is that, I'm just wondering like how many cumulative programmer hours have been utterly wasted on adding very mediocre AI features to every app imaginable that you rarely ever want to use.

28:01 You know?

28:01 So I just lay out like a couple of issues, like look at all these, these examples of apps that just like they're adding AI for the sake of adding AI, but it's not, you know, not bashing on like ChatGPT or something like it was just like, oh, you can click this to like,

28:16 correct the date by AI.

28:18 Like I just type the date.

28:19 Why do I need the stupid thing?

28:20 Right.

28:20 And, another, this example I use with spark email, which has this really cool, Brian, see how beautiful that is.

28:28 You can write beautiful emails in spark.

28:29 Love it.

28:30 Right.

28:30 But if you try to proofread it with AI, it deletes all the content, the images, and it just like jams it back as plain text, like response from ChatGPT or something.

28:40 You're like, dude, that's not what I want.

28:42 I want to ask for you to proofread it.

28:45 Like why?

28:46 Why there's this app is full of little tiny bugs and like, they're adding this, like who, who would ever use that?

28:51 If this is the outcome of what you get, you know?

28:53 Anyway, another example, would be the Dropbox fiasco where they just silently turned on.

29:00 Hey, we're sending all your documents to, open AI.

29:02 I hope you don't mind.

29:03 Do you have anything private?

29:04 Probably not.

29:04 It's fine.

29:05 Right.

29:05 Like, wait, why did you add?

29:07 Nobody wants this.

29:07 Why do you turn this on?

29:08 Or why are you sending my data on a Dropbox?

29:10 This is not right.

29:12 So anyway, hopefully people will enjoy this article.

29:15 I have another fun one.

29:16 Let's say another fun one coming.

29:17 I forgot to turn that off.

29:19 Oh, well, you can ask ChatGPT about that.

29:22 God, God, no.

29:27 Yeah.

29:27 No, honestly, it doesn't actually send it unless you interact with one of the, like a text box.

29:33 It says, do you want to ask this thing and the AI about your doc?

29:35 But if you ask it, then it's, then it's on.

29:37 Right.

29:37 So it's not clear by like entering that text box, that input, you're now sharing your data

29:43 with some other company, right?

29:44 Like, can we just have like more reliable integration with Finder and Explorer and better sync?

29:51 Like, I don't need this AI stuff.

29:52 I had, I actually on the topic though, I had like a really cool AI experience.

29:57 I went to the dentist and they took x-rays and, and she showed me the x-ray picture.

30:04 And then she showed me the picture right next to it where an AI highlighted areas that might

30:10 be problems that the dentist should check out and take a look at.

30:13 That's awesome.

30:14 And things like that, like helping, helping a professional make sure they don't miss things.

30:19 Great use of AI.

30:20 Yeah.

30:20 So yeah.

30:21 Proofreading less.

30:22 No, that's an awesome, awesome use of it.

30:25 Yeah.

30:26 Okay.

30:26 Ready for the joke?

30:28 I'm almost.

30:30 Okay.

30:30 I want to show one more thing.

30:31 I forgot to mention for a lot of people, New Year's resolutions time for a lot of people.

30:37 And if your new year's resolution is get better at testing, to celebrate the pie test or the

30:43 complete pie test course you're getting done.

30:45 The coupon code 2024 is open through January for 10% off.

30:51 So just wanted to mention that.

30:52 So now I'm ready for a joke.

30:54 All right.

30:54 This one has to do with managers and sprints and super agile stuff.

30:59 Okay.

31:00 It was from work chronicles or chronicles.com.

31:03 Put it in the backlog with dashes.

31:05 So there's a programmer, clearly a business.

31:10 Actually, it's a project manager, but whatever.

31:12 Like somebody on the tech team.

31:13 And here comes a person, very cheery.

31:15 Hey, I have a new feature idea.

31:17 And the person a little bit bugged, getting interrupted from work says, awesome.

31:21 Just put it in the backlog.

31:22 Person says, where's it?

31:24 Where's the backlog?

31:24 Holds up the trash can.

31:25 Oh, dear.

31:28 Put it in the backlog.

31:29 Just go back.

31:30 We're busy.

31:31 Yeah.

31:32 Anyway.

31:33 We actually, we've got a real backlog, but the things that are marked low priority, it's

31:40 never going to happen.

31:41 Just run a filter that just hides all the priority things.

31:44 Yeah.

31:46 We're done.

31:47 Backlogs all caught up.

31:47 No, I know there's that feature I put in there.

31:49 Oh, yeah.

31:50 It must be a little priority.

31:50 Got it.

31:51 Oh, it's prioritized.

31:52 We'll get to it.

31:52 Beautiful.

31:53 All right.

31:55 Well, fantastic to be back with you and everyone else, Brian.

31:57 Good to be back.

31:58 Yeah.

31:59 Bye, all.

Back to show page