WEBVTT

00:00:00.001 --> 00:00:04.640
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to

00:00:04.640 --> 00:00:11.760
your earbuds. This is episode 169, recorded February 12th, 2020. I'm Michael Kennedy.

00:00:11.760 --> 00:00:13.000
And I am Brian Okken.

00:00:13.000 --> 00:00:17.960
And this episode is brought to you by Datadog. Check them out over at pythonbytes.fm slash

00:00:17.960 --> 00:00:22.580
Datadog. Get a cool t-shirt for just giving a little trial, installing them and checking it out.

00:00:22.580 --> 00:00:25.820
Brian, I love a good story. You got a tale to tell us?

00:00:26.020 --> 00:00:33.880
Well, yeah, I've got a detail. So this was a suggestion on Twitter by, oh gosh, David Douglas

00:00:33.880 --> 00:00:38.080
something? Maybe David Douglas Smith? How do you think you pronounce that?

00:00:38.080 --> 00:00:42.760
David Douglas Smith. That's what I'm going with. If you can trust the Twitter name to be the real name.

00:00:42.760 --> 00:00:49.240
Yeah, right. This is a little tool, which is pretty darn cool. Detail. This is a quote from their site.

00:00:49.240 --> 00:00:55.400
A combination of a Flask backend and a React frontend to bring you an easy way to view and

00:00:55.400 --> 00:01:01.160
analyze pandas data structures. It integrates seamlessly with IPython notebooks and Python

00:01:01.160 --> 00:01:07.600
IPython terminals. Currently, this tool supports such pandas objects as data frames, series, multi-index,

00:01:07.600 --> 00:01:14.460
date time index, and range index. Okay. So there's a live demo on the, in the linked from the readme.

00:01:14.460 --> 00:01:19.220
And you can go to that and there's a little arrow on the top left. So you end up with something that

00:01:19.220 --> 00:01:24.720
looks like a spreadsheet, whole thing. But in the demo, you, if you click on the little play button,

00:01:24.780 --> 00:01:30.160
there's a whole bunch of different tools that pop up. One of them, like even just the describe button,

00:01:30.160 --> 00:01:36.840
if you'd click that, you can select different columns and it gives you statistics and a little

00:01:36.840 --> 00:01:43.680
graph of what the, what data is in there and top 100 values that are in there. That's even cool enough,

00:01:43.680 --> 00:01:48.840
but that's just a start. This tool also gives you, you can filter your data, do correlations,

00:01:48.840 --> 00:01:54.540
charts, heat maps, just all looking at a data frame through this user interface. It's pretty cool.

00:01:54.540 --> 00:01:58.860
Yeah. That's super cool. When I first saw this, I wasn't sure what to make of it. And playing with

00:01:58.920 --> 00:02:03.340
live demo really is the way to check it out, isn't it? Yeah. I mean, after playing at the

00:02:03.340 --> 00:02:08.800
demo a little bit and then going back to the readme with all of the information, there's just so

00:02:08.800 --> 00:02:13.260
much that you can do with this thing and it's all open source. So you can run it on your own servers

00:02:13.260 --> 00:02:17.620
or whatever, but it's cool. I like the idea of having a live demo linkable.

00:02:17.760 --> 00:02:21.080
Yeah. I do too. It's, it's makes it real and it's, it's a really cool,

00:02:21.080 --> 00:02:26.440
smooth, interactive framework for visualizing data. I like it a lot. I really, I think it's like,

00:02:26.440 --> 00:02:30.880
if I did more with Panda data frames, I'd be all over this. Yeah. Cool. Cool. Speaking of the data

00:02:30.880 --> 00:02:37.820
science side of things, there's a pretty cool project that just came out called carnets. Have you

00:02:37.820 --> 00:02:38.260
heard this?

00:02:38.260 --> 00:02:40.300
Not until you listed it, but I'm pretty excited.

00:02:40.340 --> 00:02:45.260
Oh man, it's pretty awesome. I actually learned about this at PyCascades. We were hanging out

00:02:45.260 --> 00:02:50.080
there with some folks and somebody sent this in to me over emails that, Hey, check this out or over

00:02:50.080 --> 00:02:55.320
Twitter or something like that. And yeah, everyone was uniformly impressed and thought this was quite

00:02:55.320 --> 00:03:00.540
cool. So you probably heard of Pythonista and Pythonista is a, not a description of a person who

00:03:00.540 --> 00:03:07.700
likes Python, but Pythonista being the app in the app store that is kind, lets you do like automation

00:03:07.700 --> 00:03:12.440
and stuff with Python on your iOS device. Okay. Okay. So what was cool about that is like,

00:03:12.440 --> 00:03:17.500
you can write and run Python on your iPhone or on your iPad natively, which is pretty awesome.

00:03:17.500 --> 00:03:24.480
This is kind of like that, but in that it runs Python natively, but this is Jupyter notebooks

00:03:24.480 --> 00:03:30.660
on your phone or maybe more importantly on your tablet, like on your iPad.

00:03:30.660 --> 00:03:34.240
Yeah. This is pretty slick. I can't wait to try this out.

00:03:34.240 --> 00:03:40.060
Yeah. And it's, it's super, super smooth. So what's obviously these days there's options

00:03:40.060 --> 00:03:46.100
for running and writing Python through your iPad. If like that's like that differentiation

00:03:46.100 --> 00:03:53.940
makes sense. We can use Visual Studio Code online, which will just basically put the front end

00:03:53.940 --> 00:03:58.740
into a web browser and then it runs somewhere on Linux and Azure, or there's some other ones

00:03:58.740 --> 00:04:07.560
like coder.com and whatnot. But this is no internet required running Jupyter notebooks locally. And it has

00:04:07.560 --> 00:04:15.440
built in IPI packages, NumPy, MapPlotlib, SciPy, and Pandas, and it's Pandas already installed. So you

00:04:15.440 --> 00:04:19.440
don't have to install them or anything. So it's not just, Oh, here's a thing you can run Python. Like

00:04:19.440 --> 00:04:24.880
there's even some of these C based packages that you might need already installed, which is great.

00:04:24.880 --> 00:04:31.920
Yeah. It really looks really clean too. Yeah, for sure. And it also has file sharing ability. So

00:04:31.920 --> 00:04:37.180
you could like share your stuff through iCloud, right? So you save your notebooks there, edit them

00:04:37.180 --> 00:04:43.860
somewhere else, pick them back up again over there. You can import IPYNB files or whatever the Jupyter

00:04:43.860 --> 00:04:50.520
extension is. Yeah. So it's really quite neat. And it looks like a proper Jupyter app running over

00:04:50.520 --> 00:04:55.820
there. I think it's great. I'm impressed. It also extends the keyboard on iPad to give you a couple

00:04:55.820 --> 00:05:02.540
of actions, some hotkeys or like, sort of, I guess, like the Mac touch bar, sort of. That's pretty cool.

00:05:02.540 --> 00:05:08.640
One different thing from Pythonista is Pythonista, I believe you have to pay for on the App Store.

00:05:08.640 --> 00:05:13.060
This one is open source and free. So just go click install and you have it.

00:05:13.060 --> 00:05:15.900
And you can pip install stuff. I don't even know how that works.

00:05:16.000 --> 00:05:20.180
Yeah. It's amazing. It's awesome. There's a restriction on the pip install stuff. So with

00:05:20.180 --> 00:05:26.240
Jupyter, you can say percent pip install a thing or whatever, issue that to the shell. But this one,

00:05:26.240 --> 00:05:31.880
you can do that as long as the thing you're pip installing is pure Python. It doesn't have like a

00:05:31.880 --> 00:05:35.120
C compiler or something like that in your phone. Well, that makes sense.

00:05:35.120 --> 00:05:38.240
Yeah. Yeah. Isn't this cool though? Yeah. It's very neat. I got to try this out.

00:05:38.240 --> 00:05:42.120
Yeah. I definitely want to put it on my iPad and check it out. And it has a separate dedicated iPad

00:05:42.120 --> 00:05:47.080
app that's slightly different, which is nice. Honestly, like a lot of times you can kind of

00:05:47.080 --> 00:05:51.200
get away with the both the same app or it's not really that big of a difference, but this is the

00:05:51.200 --> 00:05:57.160
kind of thing where it's most relevant on iPad or like a larger device. And then it just happens to

00:05:57.160 --> 00:06:01.100
also work on the phone is the way I would see it. I wouldn't really want to develop on my phone.

00:06:01.100 --> 00:06:05.580
I don't know. Doesn't seem great. Right. Harder to hook an external keyboard to your phone and

00:06:05.580 --> 00:06:09.320
whatnot as opposed to an iPad. But yeah, this is really cool. People should check this out and it's

00:06:09.320 --> 00:06:13.380
open source. People can go download it and play with it and whatnot. Speaking of really cool,

00:06:13.380 --> 00:06:18.260
Datadog is pretty cool. They're doing really good stuff, supporting the show as they have been for a

00:06:18.260 --> 00:06:23.280
long time. So they're a cloud scale monitoring platform that unifies metrics, logs, and traces.

00:06:23.280 --> 00:06:29.020
If you've ever wondered what's going on in your app, you know, you can watch one log or another or look

00:06:29.020 --> 00:06:33.120
at the performance of one part or another, but it's hard to put that all together in an overall

00:06:33.120 --> 00:06:36.740
request. Well, Datadog is what you want to put all those pieces together.

00:06:36.900 --> 00:06:41.040
So you can trace requests across service boundaries and that sort of stuff. And they're

00:06:41.040 --> 00:06:46.160
tracing client auto instruments, popular frameworks like Django, AsyncIO, and Flask. So you can quickly

00:06:46.160 --> 00:06:51.360
see the health and performance of your Python app. Get started today with a 14-day free trial

00:06:51.360 --> 00:06:56.920
and a complimentary free t-shirt with a cute little dog on it over at pythonbytes.fm/Datadog.

00:06:56.920 --> 00:07:01.420
Wonderful. Thanks, Datadog. Yeah. Thank you, Datadog. Brian, you spent some time on a podium not long

00:07:01.420 --> 00:07:05.400
ago, didn't you? Yeah, just this last Sunday. Or I mean like, you know, a Sunday ago,

00:07:05.400 --> 00:07:12.320
depending on time travel. So yes, and this actually came from PyCascades. I got this suggestion from

00:07:12.320 --> 00:07:18.920
Katie McLaughlin. I did my talk using, there's a lot of people that use HTML5-based presentation

00:07:18.920 --> 00:07:25.940
frameworks. And that's what I was using. I was using remark.js. I chose it because I like Markdown.

00:07:26.440 --> 00:07:31.840
And so I can write my slides in Markdown and then present it. But there was difficulty. So I,

00:07:31.840 --> 00:07:38.580
in order to get this all to work, maybe some people know some other secrets to it, but I had to go in a

00:07:38.580 --> 00:07:47.120
little early and then like go into the extended display mode so that I can drag the version of the

00:07:47.360 --> 00:07:53.340
presentation that's going to be on the display. Drag that web browser window into the other window

00:07:53.340 --> 00:07:59.080
that's on the display and then maximize it. But I'm not in front of it. So I got to like use the mouse to

00:07:59.080 --> 00:08:04.160
try to go to the maximize button. And then on the other, my laptop display, I have my presenter notes

00:08:04.160 --> 00:08:09.240
and timer and stuff. And it actually worked really good, but that setup was a little bit of a pain.

00:08:09.960 --> 00:08:16.340
And so Katie McLaughlin told me about Podium, which is a Beware application. And I got to tell you,

00:08:16.340 --> 00:08:22.720
I love the Beware stuff, but one, and they know it also is that the documentation, they need more help

00:08:22.720 --> 00:08:28.620
with documentation because there's not much there. But this is cool. It's a native application. It

00:08:28.620 --> 00:08:36.220
currently supports, there's builds for Linux and for macOS, which bummer for Windows people, but

00:08:36.220 --> 00:08:41.800
it works for me for macOS. And it's a, since it's not a browser thing, it's a native app,

00:08:41.800 --> 00:08:48.120
it can have control over going to different screens and stuff. So when you hit like command P,

00:08:48.120 --> 00:08:54.520
it just goes into presentation mode. You've got your notes on your computer and the presentation on the

00:08:54.520 --> 00:08:59.740
extended one, it's automatic. You don't have to fight it. They've also simplified the syntax of the

00:08:59.740 --> 00:09:05.400
markdown. So remark.js has a bunch of boilerplate HTML stuff on the top and bottom,

00:09:05.600 --> 00:09:13.700
but the Podium, Beware Podium has removed that. So your markdown file with all your slide content

00:09:13.700 --> 00:09:18.220
is just content. It's not a bunch of other stuff. So I'm really happy about this.

00:09:18.220 --> 00:09:22.840
Yeah, this looks nice. It's cool to not see it all just a bunch of JavaScript, right? And it's cool to

00:09:22.840 --> 00:09:26.780
have a little bit more of a native app that can do more than just something in your browser.

00:09:26.780 --> 00:09:32.960
Yeah. So this isn't specifically a Python related topic, but in watching other people's slides, I know a lot of

00:09:32.960 --> 00:09:39.220
people are using remark because I recognize it when people do it. So I'm hoping this might help other

00:09:39.220 --> 00:09:44.700
people too. Yeah, absolutely. If anyone wants to help out with the documentation, a little Giphy or

00:09:44.700 --> 00:09:49.700
video or something of what this looks like and what it does would go a long way. Just like, you know,

00:09:49.760 --> 00:09:56.980
the D type detail that you had before would be quite cool. So, or the car nets, right? Just the Beware

00:09:56.980 --> 00:10:01.920
stuff is cool, but it's always, you know, it's just text usually talking about something visual. So

00:10:01.920 --> 00:10:08.780
that would be great. Now, this one, I feel like this topic is cheating on you, Brian. I'm going to cover a

00:10:08.780 --> 00:10:10.100
pytest thing. I love it.

00:10:10.500 --> 00:10:18.060
So this is pytest mock resources. So this comes from Daniel Cardin and his company recently open

00:10:18.060 --> 00:10:24.400
sourced some of their internal pytest tools to help them do more pytest goodness. And I think it's cool

00:10:24.400 --> 00:10:30.440
that the team at the company put the effort into open source this project. So basically this is

00:10:30.440 --> 00:10:37.420
something to help out with testing external resources. Now, testing external resources is one of the tricky,

00:10:37.760 --> 00:10:44.180
challenging bits of testing code, right? I'm going to call the credit card API, but I don't really want

00:10:44.180 --> 00:10:49.140
to charge it. I just want to simulate calling it and telling it and get the response back, or I'm going

00:10:49.140 --> 00:10:53.380
to query the database. And I don't really want to hit the database. I just want to simulate getting this

00:10:53.380 --> 00:10:57.540
data back. And that's already solved with mocks and patching and that kind of stuff, right?

00:10:57.540 --> 00:10:57.780
Yeah.

00:10:57.780 --> 00:11:04.520
But this is a way that you can test if you do need to actually get some data back from the database

00:11:04.860 --> 00:11:10.460
or from some other service and just go like, I really need it to give me this data back to see

00:11:10.460 --> 00:11:18.020
that the part that actually processes the query that is working correctly. So basically its job is to

00:11:18.020 --> 00:11:24.740
set up Docker containers and manage the lifecycle of those around your tests. So it'll fire up a little

00:11:24.740 --> 00:11:30.000
Postgres server or it'll fire up a MongoDB server inside of a Docker instance, get it set up for your tests,

00:11:30.200 --> 00:11:35.480
let your test query against it, and then throw it away. Sometimes it makes sense to have tests that

00:11:35.480 --> 00:11:41.060
are abstracting away or hiding or patching or mocking the dependencies. Like we described, that

00:11:41.060 --> 00:11:46.000
probably makes sense most of the time, but there's a little slice where it really needs to interact

00:11:46.000 --> 00:11:52.460
with those resources and you might want to test that, right? Like did my SQLAlchemy class get out

00:11:52.460 --> 00:11:58.180
of shape with the way the database thinks it is? Well, I can mock that out all day, but the only way I'm

00:11:58.180 --> 00:12:02.300
going to find out that doesn't work is try to do a query and have, you know, the relational database

00:12:02.300 --> 00:12:07.580
throw an exception and say, this column that you're querying for doesn't exist. And then I'll find out,

00:12:07.580 --> 00:12:11.160
right? So I think it's cool for testing that level. Oh, that's neat. What's your take on this?

00:12:11.160 --> 00:12:20.240
It's not a domain that I'm in having to utilize, but the, I love that people that solve a problem

00:12:20.240 --> 00:12:24.160
are willing, even in a company setting, are willing to open source it to other,

00:12:24.560 --> 00:12:27.960
to let other people benefit as well. Yeah. Pretty cool. I can definitely see that using

00:12:27.960 --> 00:12:32.880
this around the websites and stuff like that. There's certain parts where, you know, it really

00:12:32.880 --> 00:12:39.920
would be easier if it just would generate the sitemap.xml correctly. So then I can use that

00:12:39.920 --> 00:12:44.220
to poke back at some of the elements and whatnot. It, it seems pretty interesting. I haven't used it for

00:12:44.220 --> 00:12:48.340
anything yet, but it looks, looks cool. Yeah. Nice. Let's keep rolling and testing, huh? Yeah. I guess

00:12:48.340 --> 00:12:53.120
we got two testing things in a row. This is an article. I wrote the title as how James Bennett

00:12:53.120 --> 00:13:00.500
is testing in 2020. The actual article title is how I'm testing in 2020, but it isn't how I'm testing.

00:13:00.500 --> 00:13:06.820
So it's James Bennett because it's his article. So anyway, he wrote an article called, I forget

00:13:06.820 --> 00:13:13.660
what it's called, but it's an article about testing Django applications in 2018. And so he's following it up

00:13:13.660 --> 00:13:18.820
again to see, you know, kind of what changed. It sounds like he's testing more things than just

00:13:18.820 --> 00:13:25.660
Django, but it still is. I'm going to go through a few of these, using, still using unit test over

00:13:25.660 --> 00:13:32.960
py test. And I respect that there's a lot of people that just think in the X unit style and for

00:13:32.960 --> 00:13:39.200
some reason have trouble thinking in py test and that's fine. We can both coexist. He's using,

00:13:39.200 --> 00:13:45.080
talks to be able to test over multiple Django and Python versions and, using a talks Travis

00:13:45.080 --> 00:13:51.660
plugin to aid the Travis side of that, which is cool. I like talks a lot. Use it almost every day.

00:13:51.660 --> 00:13:58.440
We've talked about pyenv before for local Python installation management. And so he's using that.

00:13:58.440 --> 00:14:04.060
And actually I think we've talked about this the other, not too long ago, that if you're using pyenv,

00:14:04.060 --> 00:14:12.500
there is a pyenv dash virtual end plugin to help you with a virtual environments. I'm not using pyenv,

00:14:12.500 --> 00:14:18.420
but, but that's neat. Yeah. Yeah. Yeah. Very cool. And, since you can't use py test,

00:14:18.420 --> 00:14:25.780
he's not, well, he does use py test sometimes, but he also gave a list of his, run tests script to,

00:14:25.780 --> 00:14:30.980
uh, just run everything. That's especially useful. You can have multiple. I like the idea of this in

00:14:30.980 --> 00:14:37.620
any way you can have multiple of these for, let's say you've got a smoke test or suite or different

00:14:37.620 --> 00:14:43.320
suites that run on Jenkins server or some other, or Travis server being able to have one entry point

00:14:43.320 --> 00:14:49.100
is a good idea using coverage also. And he talks about some of his two extra tools. It's not just,

00:14:49.100 --> 00:14:55.200
uh, functional tests, but things like including black and ice sort and flake. And I just appreciate

00:14:55.200 --> 00:15:01.840
people being very open about their testing workflow. I think more people just write in really any

00:15:01.840 --> 00:15:06.260
workflow. Just, I think it's interesting to find out what people are doing for different parts of

00:15:06.260 --> 00:15:11.700
their workflows. Yeah. I find this interesting as well. It's kind of not quite a confessional,

00:15:11.700 --> 00:15:16.660
but Mike, look, you're going to hear all these new, awesome ways of doing things. Are you going to

00:15:16.660 --> 00:15:21.600
hear that you should use this and not that, or you have to do it this way. Here's what's working for me

00:15:21.600 --> 00:15:26.600
really in a nice practical way. And I dig that. Yeah. It's not like, this is the best. It's just,

00:15:26.600 --> 00:15:31.020
it's working for me. This is what I'm doing. Yeah. And there's some cool little extra commands,

00:15:31.020 --> 00:15:37.400
like cleaning up a PyCache files and set up, install local files and pip upgrade. That stuff's nice.

00:15:37.400 --> 00:15:42.460
In building that is, as a talks commands. That's something that I learned. I picked up from

00:15:42.460 --> 00:15:47.680
somebody. I can't remember who, but I'm like, Oh yeah, you don't actually have to run,

00:15:47.880 --> 00:15:54.360
do a complete thing. You can just have some of your utility stuff within, within talks. That's

00:15:54.360 --> 00:15:59.280
nice. Absolutely. Have we talked about GUIs yet? I don't know. Probably not. Yeah. There's actually

00:15:59.280 --> 00:16:04.240
some, interesting news about Remy and some people jumping in and contributing to that,

00:16:04.240 --> 00:16:08.500
that I've seen flying by on Twitter. So that's super cool. But I want to talk about QT, pronounce

00:16:08.500 --> 00:16:16.300
QT. So interesting project here. This is a, I want to talk sort of riff on, I guess is the right way to

00:16:16.300 --> 00:16:22.680
put it. A article by Leo Danis Ramos over at realpython.com. And over there, there's an article

00:16:22.680 --> 00:16:28.300
about Python and PyCute building a GUI desktop calculator. So if you're interested in getting

00:16:28.300 --> 00:16:34.320
into QT, this is a really nice summary, not too long, you know, shorter than a quick little blog

00:16:34.320 --> 00:16:38.480
post, but longer than a little quick little blog post, but shorter than a whole book. Right. But

00:16:38.480 --> 00:16:42.220
you know, like, I think it's a good level that they've got going on over there. So I'm just going

00:16:42.220 --> 00:16:47.400
to talk about a couple of interesting takeaways and basically the elements of a Qt application.

00:16:47.660 --> 00:16:54.340
So if you're going to build them up to the Qt apps are made up of three or four different big ideas or

00:16:54.340 --> 00:16:59.640
whatever, one of them are widgets, right? So if you're going to work with Qt, it's basically a wrapper

00:16:59.640 --> 00:17:08.000
around the C++ API. And being that a lot of things are object oriented and whatnot. So if you work with

00:17:08.000 --> 00:17:13.060
a widget, you derive from Q widget, or use something that's already written and driven from Q widget,

00:17:13.060 --> 00:17:20.840
which are like buttons, text boxes, and so on. And a lot of examples you see will like take those

00:17:20.840 --> 00:17:26.120
widgets and put them on the screen and say, this button goes at this XY location and this thing goes

00:17:26.120 --> 00:17:32.160
there. But the other thing that's really interesting there are layout managers. So there's all these

00:17:32.160 --> 00:17:37.840
different kinds of layout managers that you can use. So you could put in something, let me pull up a quick

00:17:37.840 --> 00:17:42.880
little example. So you could put in the elements and it has like a horizontal layout where stuff goes,

00:17:42.880 --> 00:17:49.200
left to right to right based on the size of it. Or you can have a vertical one, or you can have a grid

00:17:49.200 --> 00:17:53.900
one, all these different layout managers you can employ to figure out how it will automatically adjust

00:17:53.900 --> 00:17:58.960
its size as the elements are rearranged or, you know, the size of the windows change and whatnot.

00:17:58.960 --> 00:18:04.880
So that's pretty cool. We got main windows, of course, which is like the essence of your app,

00:18:04.880 --> 00:18:09.220
right? You're going to create a main window and put your layout manager in it and then load it with

00:18:09.220 --> 00:18:14.800
widgets. And of course, you've got an app, Q application for a Qt app. And that's kind of

00:18:14.800 --> 00:18:19.380
like the essence. And then finally, to bring it all together, there's signals and slots, which are

00:18:19.380 --> 00:18:25.540
kind of like events, I guess, or callbacks. So all the widgets, like buttons and whatnot,

00:18:25.540 --> 00:18:32.000
have these event catchers from the GUI system of your OS. And then they'll fire off events like,

00:18:32.000 --> 00:18:37.280
hey, somebody clicked me, hey, somebody typed in me and things like that. So yeah, it's just a quick

00:18:37.280 --> 00:18:40.040
way to get started with Qt that people might want to check out.

00:18:40.040 --> 00:18:47.200
I think there's a really, they've done a really good job. It's pretty cool. The Qt demos and

00:18:47.200 --> 00:18:54.040
tutorials, there are many around, but having it all just in one single page is pretty neat.

00:18:54.040 --> 00:18:57.540
Exactly. I feel like there's a lot of stuff out there, but it's all kind of hit and miss.

00:18:57.540 --> 00:19:01.160
And you're like, I don't feel like I quite have the whole story. And so that's why I wanted to bring

00:19:01.160 --> 00:19:07.940
this up because Dan and crew, Leo Danis, they're doing a good job on this. Now, one caveat I do

00:19:07.940 --> 00:19:12.020
want to throw out there before you spend a week getting this all up and running and find out stuff

00:19:12.020 --> 00:19:18.920
about it. Either you need to have a lot of money to work on this, or you need to have it be open source

00:19:18.920 --> 00:19:24.940
or internal not distributed projects. They can be used at your company, I believe, but they have to be

00:19:24.940 --> 00:19:30.760
not distributed. I think that's the important thing. Oh, because of the Qt licensing? The Qt licensing is

00:19:30.760 --> 00:19:37.500
it's like dual license, either GPL or LGPL, or it's commercial. And I'm pretty sure to use it on

00:19:37.500 --> 00:19:42.600
commercial projects, you have to have a commercial license. And the commercial license is $5,500 per

00:19:42.600 --> 00:19:48.840
year per developer. Okay. That's a lot. To me, that feels like a lot of money for a GUI framework.

00:19:49.080 --> 00:19:55.320
Yeah. Right? When I could go use Java, I could use C++, I could use Windows Forms from .NET.

00:19:55.320 --> 00:19:59.920
There's like a bunch of options that are solid. I don't know. It just, it seems...

00:19:59.920 --> 00:20:02.100
All of those options sounded horrible to me, though.

00:20:02.100 --> 00:20:02.420
I know.

00:20:02.420 --> 00:20:02.880
Well...

00:20:02.880 --> 00:20:03.460
That you just listed.

00:20:03.460 --> 00:20:14.180
I know. I'm with you. But it's not like you pay $5,000 once or you pay $500 once. It's as long as you

00:20:14.180 --> 00:20:19.360
care to own this application. It's $5,500 a year per developer. And that's just, that's

00:20:19.360 --> 00:20:23.900
a lot. So anyway, it's not to say don't do it, right? If your company is like, hey, we

00:20:23.900 --> 00:20:27.600
really want to go with this technology, we want to go that way, that makes sense and we can

00:20:27.600 --> 00:20:31.340
totally justify it. But it's not something I... If I was like, hey, I'd like to create a

00:20:31.340 --> 00:20:36.340
little app, maybe I'll create like a desktop version of the Talk Python player app that does

00:20:36.340 --> 00:20:40.240
cool like offline support and stuff. Maybe I'll use Qt. Like, no, I wouldn't use Qt.

00:20:41.240 --> 00:20:41.560
Okay.

00:20:41.560 --> 00:20:46.580
Right? I mean, because I'm not going to pay, you know, $5,000, $10,000 a year for that because

00:20:46.580 --> 00:20:50.360
it's just... I don't know. That's just the way it is. Anyway, I always want to throw that caveat

00:20:50.360 --> 00:20:53.600
out there because it's not just like, oh, you got to pay a little bit for it. It's like, you

00:20:53.600 --> 00:20:58.080
got to consider that that's a non-trivial amount of money to use it that way. So I just want

00:20:58.080 --> 00:20:58.580
to throw that out there.

00:20:58.580 --> 00:21:01.800
Well, yeah. And if we've gotten this story wrong, please somebody tell us.

00:21:01.800 --> 00:21:06.560
Yep. I did poke around their site a lot and I was looking for the exact quote, but basically

00:21:06.560 --> 00:21:10.260
if you're going to release it commercially, I believe that this is the case. But yeah, if we got

00:21:10.260 --> 00:21:11.180
it wrong, someone tell us.

00:21:11.180 --> 00:21:13.800
I believe you. I just don't want to believe you.

00:21:13.800 --> 00:21:20.000
I know. I know. All right. Cool. Well, yeah. If somebody has more details than that on the

00:21:20.000 --> 00:21:23.820
license, but that is... I spent probably 30 minutes trying to figure this out to make sure

00:21:23.820 --> 00:21:26.980
I got it right. And that's what I took away from what's on their website.

00:21:26.980 --> 00:21:27.280
Okay.

00:21:27.280 --> 00:21:31.300
What about the extra stuff? The things that we're not quite covering, but we're still covering?

00:21:31.300 --> 00:21:32.120
What do you got?

00:21:32.120 --> 00:21:37.260
Well, we did mention PyCascades a couple of times. As of this recording, they don't have

00:21:37.260 --> 00:21:43.440
the individual talks chopped up into videos yet. I don't know if they're going to, but the

00:21:43.440 --> 00:21:49.800
live stream video of day one and day two. So everybody's talk, if you can kind of fast forward

00:21:49.800 --> 00:21:54.760
through it, is available. That was available right away. Actually, they were pretty fast about

00:21:54.760 --> 00:22:00.780
it, which is pretty cool. We're leaving a link to that. And I also just want to do a huge shout

00:22:00.780 --> 00:22:05.580
out and thank you to all of the volunteers for PyCascades. It was a really fun event and

00:22:05.580 --> 00:22:06.980
I appreciate everybody's time.

00:22:06.980 --> 00:22:11.180
Yeah. PyCascades was great and it was really fun to be there and meet all the folks that

00:22:11.180 --> 00:22:11.420
I did.

00:22:11.420 --> 00:22:18.540
I had a moment of panic and anxiety shortly before my talk. And back in the green room,

00:22:18.540 --> 00:22:26.020
Nita Zakarenko noticed and probably because I said, oh my God, I'm freaking out. And she helped

00:22:26.020 --> 00:22:30.760
me through to calm down before the talk and I really appreciate that. So I wanted to thank

00:22:30.760 --> 00:22:34.020
Nina on the show. How about you? Any extras?

00:22:34.020 --> 00:22:38.980
Just a couple of quick things. I did a live webcast that I talked about like a month ago

00:22:38.980 --> 00:22:42.800
on the show for Python for .NET developers. A bunch of people signed up. That was awesome.

00:22:42.800 --> 00:22:48.940
That happened yesterday. And so now the recording is available. So I'll link to that in the show

00:22:48.940 --> 00:22:53.820
notes. People can go listen to that or share it with their friends and whatnot, colleagues.

00:22:53.820 --> 00:22:58.940
And also I've talked about this before, I'm pretty sure, but I sent out a message and a whole

00:22:58.940 --> 00:23:03.940
bunch of people are like, oh, really? So I just want to throw it out that if you go to

00:23:03.940 --> 00:23:08.980
the Talk Python training site and get one of our apps, those apps, you can download them for free.

00:23:08.980 --> 00:23:14.180
And when you open up and log in, it'll give you a list of our free courses and you just tap them.

00:23:14.180 --> 00:23:19.840
You can take a bunch free at the moment, probably more in the future of our free courses on your iPad

00:23:19.840 --> 00:23:24.600
or Android tablet or whatever it is you want to take them on. So check that out if that sounds cool to you.

00:23:24.600 --> 00:23:31.140
When you first released this, I didn't quite get the value, but I really appreciate the mobile app because

00:23:31.140 --> 00:23:37.060
for me, bookmarking stuff on a, I bookmark stuff on my desktop all the time, but bookmarking stuff on my,

00:23:37.060 --> 00:23:43.000
on my mobile phone, I don't really do that. So keeping track of which courses I've been partway through,

00:23:43.000 --> 00:23:46.800
it's really handy to just have this right in the app. I like it.

00:23:46.800 --> 00:23:48.340
Awesome. Yeah. Thanks. That's awesome.

00:23:48.460 --> 00:23:55.680
And also there's a bunch of restrictions, especially around iOS. Like it won't autoplay the next video. So

00:23:55.680 --> 00:24:01.460
you've constantly got to be going like play, play, play in the mobile app and you can't quite full

00:24:01.460 --> 00:24:05.360
screen it as much because there's like a little, you know, the address bar on some browsers. Anyway.

00:24:05.360 --> 00:24:06.460
Yeah. Thank you for that. It's awesome.

00:24:06.460 --> 00:24:08.580
What? So the mobile app can't autoplay?

00:24:08.580 --> 00:24:13.780
No, the mobile app does. But if, if it was alternative or to be to watch it with Safari or Chrome or something

00:24:13.780 --> 00:24:19.280
on iOS, it's kind of restricted. Yeah. Right. Okay. Cool. How about a, how about a joke?

00:24:19.280 --> 00:24:22.780
I would love a joke. All right. I'll take one. You take one. Cause I couldn't decide. I had three

00:24:22.780 --> 00:24:28.940
and I chose two. They're both short. So I figured like that'll round it out. So here you go. Did you

00:24:28.940 --> 00:24:33.880
know that programmers, they sometimes get confused about what holidays are? No. They do because

00:24:33.880 --> 00:24:40.460
especially Halloween and Christmas. And there was, you know, like not a real good reason people

00:24:40.460 --> 00:24:45.600
couldn't figure it out until someone realized that oct 31 is des 25.

00:24:45.600 --> 00:24:51.940
This is so wacky that that's true. That's in plus it's funny.

00:24:51.940 --> 00:24:53.740
Yeah. All right. What's the other one?

00:24:53.740 --> 00:24:59.600
Okay. Let me read it first. Okay. Speed dating is useless. Five minutes is not enough to properly

00:24:59.600 --> 00:25:02.260
explain the benefits of the Unix philosophy.

00:25:03.460 --> 00:25:07.640
It might not be enough to explain the Unix philosophy, but if that's the start to a date,

00:25:07.640 --> 00:25:14.300
it might still be effective in communicating what it's got to. Oh yeah. Oh boy. All right. Well,

00:25:14.300 --> 00:25:19.180
that's pretty funny. So thanks again, as always. Great to be here with you. Thank you. Yep. Bye

00:25:19.180 --> 00:25:24.040
everyone. Bye. Thank you for listening to Python Bytes. Follow the show on Twitter via at Python Bytes.

00:25:24.100 --> 00:25:31.040
That's Python Bytes as in B-Y-T-E-S. And get the full show notes at Python Bytes.fm. If you have a news

00:25:31.040 --> 00:25:35.920
item you want featured, just visit Python Bytes.fm and send it our way. We're always on the lookout for

00:25:35.920 --> 00:25:40.960
sharing something cool. On behalf of myself and Brian Okken, this is Michael Kennedy. Thank you for

00:25:40.960 --> 00:25:43.580
listening and sharing this podcast with your friends and colleagues.

