WEBVTT

00:00:00.001 --> 00:00:04.440
Jupyter Notebooks and JupyterLab have to be one of the most important parts of Python

00:00:04.440 --> 00:00:07.520
when it comes to bringing new users into the Python ecosystem.

00:00:07.520 --> 00:00:12.180
And certainly for the day-to-day work of data scientists and scientists in general

00:00:12.180 --> 00:00:15.400
who have made some of the biggest discoveries of recent times.

00:00:15.400 --> 00:00:20.680
The Jupyter platform has recently gotten a major upgrade with JupyterLab 4 released

00:00:20.680 --> 00:00:24.640
and Jupyter Notebook 7 being significantly reworked

00:00:24.640 --> 00:00:27.280
to be based on the changes from JupyterLab as well.

00:00:27.280 --> 00:00:29.220
We have an excellent panel of guests.

00:00:29.680 --> 00:00:33.660
Sylvain Corley, Frederick Collinval, Jeremy Tolup, and Afshindarian

00:00:33.660 --> 00:00:38.100
here to tell us about what's new with these and other parts of the Jupyter ecosystem.

00:00:38.100 --> 00:00:43.360
This is Talk Python To Me, episode 438, recorded October 16th, 2023.

00:00:57.440 --> 00:01:00.900
Welcome to Talk Python To Me, a weekly podcast on Python.

00:01:00.900 --> 00:01:02.620
This is your host, Michael Kennedy.

00:01:02.620 --> 00:01:07.740
Follow me on Mastodon, where I'm @mkennedy, and follow the podcast using @talkpython,

00:01:07.740 --> 00:01:10.120
both on fosstodon.org.

00:01:10.120 --> 00:01:15.200
Keep up with the show and listen to over seven years of past episodes at talkpython.fm.

00:01:15.200 --> 00:01:18.920
We've started streaming most of our episodes live on YouTube.

00:01:18.920 --> 00:01:22.740
Subscribe to our YouTube channel over at talkpython.fm/youtube

00:01:22.740 --> 00:01:26.520
to get notified about upcoming shows and be part of that episode.

00:01:26.520 --> 00:01:29.260
This episode is brought to you by Phylum.

00:01:29.260 --> 00:01:32.480
Developers and data scientists are the new high-value targets.

00:01:32.480 --> 00:01:33.020
That's you.

00:01:33.020 --> 00:01:36.180
And yet this group remains severely underprotected.

00:01:36.180 --> 00:01:39.460
Phylum detects, reports, and blocks malicious packages.

00:01:39.460 --> 00:01:44.300
Get their research and join their community at talkpython.fm/Phylum-research.

00:01:44.900 --> 00:01:47.320
And it's brought to you by Python Tutor.

00:01:47.320 --> 00:01:52.840
Visualize your Python code step-by-step to understand just what's happening with your code.

00:01:52.840 --> 00:01:58.260
Try it for free and anonymously at talkpython.fm/Python-Tutor.

00:01:59.220 --> 00:02:01.800
Hey, Darian, Jeremy, Sylvan, and Frederick.

00:02:01.800 --> 00:02:04.220
Welcome to all of you to Talk Python To Me.

00:02:04.220 --> 00:02:05.260
It's a great time to be here.

00:02:05.260 --> 00:02:06.180
Thanks for having me.

00:02:06.180 --> 00:02:06.640
Yeah, thanks.

00:02:06.640 --> 00:02:07.100
Thanks, Michael.

00:02:07.100 --> 00:02:07.720
Yeah, you bet.

00:02:08.040 --> 00:02:14.860
I'm honored to have so many Jupyter team members, people around here, and all the work you've

00:02:14.860 --> 00:02:19.660
done on the different parts of Jupyter Notebook, Jupyter Lab, Jupyter Lite, all the things is

00:02:19.660 --> 00:02:20.700
really fantastic.

00:02:20.700 --> 00:02:23.960
So I'm looking forward to celebrating the new releases.

00:02:23.960 --> 00:02:27.160
They're not quite as new as when we first started talking about this.

00:02:27.220 --> 00:02:31.620
It took us a while to put this many people together on for an hour, but yeah, it's still,

00:02:31.620 --> 00:02:32.480
it's going to be great, right?

00:02:32.480 --> 00:02:32.900
Sounds good.

00:02:32.900 --> 00:02:33.620
Yeah, for sure.

00:02:33.620 --> 00:02:39.660
So before we get into the topics, maybe just a quick introduction for each of you here, and

00:02:39.660 --> 00:02:42.600
we'll go around the Brady Bunch circles in the video.

00:02:42.600 --> 00:02:43.740
Darian, we'll start with you.

00:02:43.740 --> 00:02:44.100
Sure.

00:02:44.100 --> 00:02:44.620
Hi.

00:02:44.620 --> 00:02:46.080
So I'm Darian.

00:02:46.080 --> 00:02:51.060
I work at Quantstack, along with everyone else on this call.

00:02:52.080 --> 00:03:00.280
And I have been working on the Jupyter stack for about eight years now.

00:03:00.280 --> 00:03:07.120
And I originally started working on what became Jupyter Lab.

00:03:07.120 --> 00:03:14.340
And nowadays, in addition to that aspect of things, I'm also part of the Jupyter Executive

00:03:14.340 --> 00:03:17.380
Council, which is one of the governing bodies of the project.

00:03:17.380 --> 00:03:21.020
As of this year, we actually changed our governance structure.

00:03:21.460 --> 00:03:27.700
And so each year there are elections and we have this new set of governing institutions

00:03:27.700 --> 00:03:28.760
that I've been a part of.

00:03:28.760 --> 00:03:29.500
That's really fantastic.

00:03:29.500 --> 00:03:34.780
You know, there's a lot of projects where there's one maintainer who is primarily the

00:03:34.780 --> 00:03:35.340
maintainer.

00:03:35.340 --> 00:03:40.260
Then there's projects that get put under an organization, you know, like Flask with pallets.

00:03:40.260 --> 00:03:44.980
But there's not very many open source projects like this that have governing bodies.

00:03:44.980 --> 00:03:47.560
You know, Python itself comes to mind.

00:03:47.560 --> 00:03:48.240
Django.

00:03:48.240 --> 00:03:49.140
That's awesome.

00:03:49.140 --> 00:03:52.480
I think, you know, Jupyter is such a vibrant ecosystem.

00:03:52.480 --> 00:03:54.060
It's an exciting space, for sure.

00:03:54.060 --> 00:03:54.740
Yeah, absolutely.

00:03:54.740 --> 00:03:56.880
All right, Jeremy, quick background on you.

00:03:56.880 --> 00:03:57.840
Yeah, I'm Jeremy.

00:03:57.840 --> 00:04:02.440
And I've also been working on the Jupyter stack for a couple of years.

00:04:02.440 --> 00:04:04.500
I think something around five or six years.

00:04:04.500 --> 00:04:10.620
I started a bit like on my own first, like a spare time thing, you know, contributing to

00:04:10.620 --> 00:04:13.500
projects on GitHub before joining Quantstack.

00:04:13.500 --> 00:04:18.060
And currently, I'm mostly involved in the Jupyter project.

00:04:18.360 --> 00:04:21.160
So, the Jupyter notebook 7, wallet dashboards.

00:04:21.160 --> 00:04:23.300
Also, a bit of iPad widgets.

00:04:23.300 --> 00:04:26.520
And most recently on the Jupyterite.

00:04:26.520 --> 00:04:26.880
Nice.

00:04:27.200 --> 00:04:28.040
Hi, everyone.

00:04:28.040 --> 00:04:28.040
Hi, everyone.

00:04:28.040 --> 00:04:29.180
So, yes, I'm Silva.

00:04:29.180 --> 00:04:33.560
I'm the CEO of Quantstack, which I founded in 2016.

00:04:33.560 --> 00:04:37.220
I've been working on the Jupyter stack for about 10 years now.

00:04:37.220 --> 00:04:38.940
So, yeah, it's been a while.

00:04:38.940 --> 00:04:41.040
I think it's almost the anniversary right now.

00:04:41.040 --> 00:04:48.920
And in the Jupyter ecosystem, I mostly worked on kernels, widgets, the Jupyter server, and a

00:04:48.920 --> 00:04:51.360
tiny bit on the front-end pieces as well.

00:04:51.540 --> 00:04:52.180
Excellent.

00:04:52.180 --> 00:04:55.760
So, it's a Jupyter space over there at Quantstack.

00:04:55.760 --> 00:04:56.700
Top to bottom, right?

00:04:56.700 --> 00:04:57.260
That's right.

00:04:57.260 --> 00:04:59.080
Awesome.

00:04:59.080 --> 00:05:00.220
Hey, Frederick.

00:05:00.220 --> 00:05:00.540
Welcome.

00:05:00.540 --> 00:05:01.180
Hey, everybody.

00:05:01.180 --> 00:05:02.860
So, I'm Frederick.

00:05:02.860 --> 00:05:05.520
I'm working at Quantstack, as everybody else.

00:05:05.520 --> 00:05:09.200
And I'm working mainly on JupyterLab.

00:05:09.200 --> 00:05:15.140
I'm actually the representative to the Software Steering Council of Jupyter for that subproject,

00:05:15.140 --> 00:05:15.500
mainly.

00:05:15.500 --> 00:05:21.420
And I started contributing, like a bit like Jeremy, five to six years ago, trying to

00:05:21.420 --> 00:05:27.480
convince colleagues in my aeronautic company back then to use Python and Jupyter instead

00:05:27.480 --> 00:05:28.060
of Excel.

00:05:28.060 --> 00:05:31.260
You're fighting the good fight.

00:05:31.260 --> 00:05:31.800
That's awesome.

00:05:31.800 --> 00:05:36.440
Maybe I could ask you all a quick question, since it might give people an interesting view

00:05:36.440 --> 00:05:37.620
into the world of Jupyter.

00:05:37.620 --> 00:05:41.080
It's just, you know, there's a lot of reasons people get into programming.

00:05:41.080 --> 00:05:46.600
But what attracted you all individually to the Jupyter ecosystem itself?

00:05:46.600 --> 00:05:48.040
Darian, how about you?

00:05:48.040 --> 00:05:49.520
So, I got lucky.

00:05:49.960 --> 00:05:53.660
I liked the idea of working on open source software.

00:05:53.660 --> 00:05:58.040
And I'd worked at a few startups that released open source software.

00:05:58.040 --> 00:06:03.240
But they were startup projects that were driven primarily by one company.

00:06:03.680 --> 00:06:07.620
And some of them had community in the sense that there were lots of users and there'd be a

00:06:07.620 --> 00:06:09.740
lot of traffic, say, on forums and stuff.

00:06:09.740 --> 00:06:15.460
But not community in the sense of a public-minded group runs this thing and makes decisions.

00:06:15.460 --> 00:06:17.960
It was the decision was at my employers.

00:06:18.600 --> 00:06:20.960
And nonetheless, I liked it.

00:06:20.960 --> 00:06:29.340
And I just sort of accidentally happened on working with the team that was building a new

00:06:29.340 --> 00:06:34.880
front end for Jupyter because I liked JavaScript and other people in the Jupyter community did

00:06:34.880 --> 00:06:35.220
not.

00:06:35.420 --> 00:06:41.040
So, they had to bring from outside the Jupyter community in because Python people at the time

00:06:41.040 --> 00:06:42.320
tended to sort of hate JavaScript.

00:06:42.320 --> 00:06:44.580
Now, I think that's still the same.

00:06:44.580 --> 00:06:48.480
So, I got into Jupyter because I like JavaScript.

00:06:48.480 --> 00:06:55.440
But I stayed in Jupyter because I liked a community open source project that was doing something

00:06:55.440 --> 00:07:03.720
that I didn't really know you could do, which is to mix your research and your results and

00:07:03.720 --> 00:07:09.320
the pros that you write and the output of the analysis that you do all in one document and

00:07:09.320 --> 00:07:12.980
share it with people and they can reproduce it and they can run your code and they can tweak it and

00:07:12.980 --> 00:07:18.240
they can do all those things without ever going through what I thought were the necessary

00:07:18.240 --> 00:07:19.720
prerequisites to writing code.

00:07:19.720 --> 00:07:21.600
It turns out none of those were necessary.

00:07:21.600 --> 00:07:23.240
You could make it way easier for people.

00:07:23.240 --> 00:07:24.860
So, I liked working on that.

00:07:24.860 --> 00:07:25.620
I like the community.

00:07:25.620 --> 00:07:26.380
I like the people.

00:07:26.380 --> 00:07:28.340
And that's why I'm still here.

00:07:28.340 --> 00:07:28.980
Yeah, excellent.

00:07:29.320 --> 00:07:34.140
It is pretty unique of an idea to say we're going to have kind of a document, we're going

00:07:34.140 --> 00:07:36.880
to have results, and we're going to have code, and it's going to be live.

00:07:36.880 --> 00:07:38.480
And that's very special.

00:07:38.480 --> 00:07:41.600
Jeremy, how did you get into Jupyter land?

00:07:41.600 --> 00:07:44.240
Yeah, I started as a user.

00:07:44.240 --> 00:07:50.360
I think back in the days when it was still the IPython notebook, like all together, just

00:07:50.360 --> 00:07:52.660
Python programming language.

00:07:53.000 --> 00:08:00.100
I think that was really this idea of being able to write normal text alongside code and

00:08:00.100 --> 00:08:06.580
have this kind of narrative with charts, interactive graphs, and so on, and share that to people.

00:08:06.580 --> 00:08:12.720
So, I used it on my own for personal projects, but also at different companies to share reports,

00:08:12.720 --> 00:08:15.460
then communicate results more easily.

00:08:15.900 --> 00:08:20.160
And after a while, you know, when you start using a tool, you want to make fixes to it

00:08:20.160 --> 00:08:20.880
or improve it.

00:08:20.880 --> 00:08:26.960
So, that's why, that's how you can go to the side of a contributor side, start submitting

00:08:26.960 --> 00:08:29.760
a pull request and getting in touch with the community.

00:08:29.760 --> 00:08:30.280
Excellent.

00:08:30.280 --> 00:08:31.740
Sylvan, I'm going to come back to you.

00:08:31.740 --> 00:08:33.620
Frederick, let's have your story.

00:08:33.620 --> 00:08:35.280
So, that's a bit like Jeremy.

00:08:35.280 --> 00:08:39.880
As I said, I try to convince people that something better than Excel exists out there.

00:08:40.720 --> 00:08:43.100
And that's when I discovered Jupyter.

00:08:43.100 --> 00:08:49.900
And what was really interesting was the ability to, like, as Ashton said, like, mixing very

00:08:49.900 --> 00:08:55.620
nice and advanced visualization with text and being able to do that interactively so that

00:08:55.620 --> 00:09:02.440
in a meeting, you don't, like, have to remember which tab in your Excel is the right result.

00:09:02.440 --> 00:09:07.200
It's like, yeah, you just type two lines of Python code and you get a nice graph to display,

00:09:07.200 --> 00:09:10.020
like, the points you tried to make from the data.

00:09:10.020 --> 00:09:11.320
And that was it.

00:09:11.320 --> 00:09:17.060
And as Jeremy then, at some point, she said, hey, I can do some stuff better and I can contribute

00:09:17.060 --> 00:09:18.120
because it's open source.

00:09:18.120 --> 00:09:22.300
So, I put my finger in that and now all my body is in it.

00:09:22.300 --> 00:09:24.320
Awesome.

00:09:24.320 --> 00:09:29.980
I think one of the ironies is, and, you know, Darian touched on this actually, that to use

00:09:29.980 --> 00:09:35.740
Jupyter often is to write Python, but to contribute Jupyter is often to write JavaScript, TypeScript.

00:09:35.740 --> 00:09:40.240
Like, it's, you're kind of taking one for the team, doing the JavaScript that no one else

00:09:40.240 --> 00:09:41.300
has to do, right?

00:09:41.300 --> 00:09:43.060
And that's a little bit different, isn't it?

00:09:43.060 --> 00:09:53.420
I think nowadays with the maturity of TypeScript as something that serious, large projects can

00:09:53.420 --> 00:09:55.280
use, it's a little bit better.

00:09:55.280 --> 00:10:01.480
But, you know, it wasn't obvious to us as a foregone conclusion that we should use TypeScript

00:10:01.480 --> 00:10:02.800
back in 2015.

00:10:02.800 --> 00:10:11.260
So, I think over time, that problem has somewhat attenuated, but it's not, we're not in the

00:10:11.260 --> 00:10:11.580
clear.

00:10:11.580 --> 00:10:19.720
We do definitely have a lot more people who would like to hack Python than would want to

00:10:19.720 --> 00:10:24.780
contribute to a gigantic TypeScript plugin-based, you know, front-end application.

00:10:25.680 --> 00:10:26.660
Yeah, exactly.

00:10:26.660 --> 00:10:29.720
They come to Jupyter because they're like doing Python, they get really excited.

00:10:29.720 --> 00:10:30.920
Like, I want to be part of this, I want to help.

00:10:30.920 --> 00:10:32.260
Oh, wait, hold on.

00:10:32.260 --> 00:10:33.680
It's a bit of an irony.

00:10:33.680 --> 00:10:35.980
Or maybe even WebAssembly, as we'll talk about, Jeremy.

00:10:35.980 --> 00:10:37.340
All right, Zilvan, back to you.

00:10:37.340 --> 00:10:41.240
So, I wanted to change the question a little bit for you and just maybe have you talk about,

00:10:41.240 --> 00:10:46.460
like, what are the benefits of having QuantSight, like the whole company, being so in on Jupyter?

00:10:46.460 --> 00:10:48.000
Like, how's that affected you all?

00:10:48.000 --> 00:10:49.080
Is that for your business?

00:10:49.080 --> 00:10:50.540
This is really how it started, actually.

00:10:50.540 --> 00:10:56.460
So, I was a Jupyter contributor back in a previous job before I founded QuantStack.

00:10:56.460 --> 00:11:05.360
And I really, QuantStack is almost an accidental startup in that I started the company as a means

00:11:05.360 --> 00:11:10.940
to continue working on the project being paid by, as I was a core contributor already, being

00:11:10.940 --> 00:11:16.140
paid by clients on consulting contracts and whatnot to continue working on this.

00:11:16.640 --> 00:11:23.580
And very quickly, we had enough business that I could hire one other person and then another

00:11:23.580 --> 00:11:24.200
and then another.

00:11:24.200 --> 00:11:26.580
So, we bootstrapped from day one.

00:11:26.580 --> 00:11:32.620
So, our success, I would say, is really bound to the success of the project.

00:11:32.620 --> 00:11:35.860
And I think it's been a positive feedback loop since the very beginning.

00:11:35.860 --> 00:11:36.240
Excellent.

00:11:36.240 --> 00:11:36.760
Yeah.

00:11:36.760 --> 00:11:42.020
I'm sure it brings a real advantage when people come to you to look and sort of see like,

00:11:42.020 --> 00:11:46.760
yeah, this is the company to help me with, you know, Jupyter type of change, maybe adopting

00:11:46.760 --> 00:11:50.140
Jupyter or some advanced deployment problem solving.

00:11:50.140 --> 00:11:50.520
Yeah.

00:11:50.520 --> 00:11:53.680
This, I mean, we're not trying to be the Jupyter company.

00:11:53.680 --> 00:12:00.760
There are other groups and we really have a consulting business model and that people can really come

00:12:00.760 --> 00:12:03.260
to us for our skills and expertise.

00:12:03.260 --> 00:12:10.080
And it turns out that so far, we've been able to contribute back everything that we've done or nearly everything.

00:12:10.080 --> 00:12:18.260
In some occasions, we have to do something that's very ad hoc to a client and, you know, custom development that requires using some of their internal APIs or whatever.

00:12:18.260 --> 00:12:21.640
But like, I would say that 99% of our work is out there.

00:12:21.640 --> 00:12:22.820
So, yeah.

00:12:23.040 --> 00:12:23.160
Excellent.

00:12:23.160 --> 00:12:23.720
Awesome.

00:12:23.720 --> 00:12:26.580
Let's start talking about just a recent event here.

00:12:26.580 --> 00:12:29.840
A couple months ago, it was JupyterCon.

00:12:29.840 --> 00:12:32.340
I think the videos, no, the videos have been up for two months.

00:12:32.340 --> 00:12:38.420
So a little, it's been around for a little while, but multiple of you, I don't know if all of you, I haven't gone through all of the videos here,

00:12:38.420 --> 00:12:42.640
but, you know, there's 86 sessions posted for JupyterCon 2023.

00:12:42.640 --> 00:12:44.920
There's a ton of good stuff.

00:12:44.920 --> 00:12:52.760
Maybe you all could just speak to the talks that you gave there or some of the real interesting things that you want to, people should maybe check out.

00:12:52.760 --> 00:12:57.540
Because if you just get into Jupyter, you can learn a lot by watching some of these talks, I think.

00:12:57.540 --> 00:13:09.260
Our recommendation, Jupyter Notebook 7 was talk where Jeremy and a few other contributors to the project introduced the new version of Jupyter Notebook.

00:13:09.920 --> 00:13:15.660
And usually when you go from version 6 to 7 of a software package, it's, you know, an iteration.

00:13:15.660 --> 00:13:26.500
But in this particular case, it's a whole new application with a whole new architecture that has the same experience of the Jupyter Notebook as version 6,

00:13:26.500 --> 00:13:30.660
but has all new architecture and can use the same plugins as Lab.

00:13:30.660 --> 00:13:31.840
And it's pretty exciting.

00:13:31.840 --> 00:13:35.080
So I would recommend checking out that talk.

00:13:35.080 --> 00:13:36.640
That was a good one.

00:13:36.960 --> 00:13:45.140
That's also something that's main topic of the show is sort of this interplay between JupyterLab and Jupyter Notebook and both of the big new releases,

00:13:45.140 --> 00:13:47.780
which is, yeah, it's a big change, isn't it?

00:13:47.780 --> 00:13:50.380
Bigger than just the 6 to 7 would indicate.

00:13:50.380 --> 00:13:50.720
Yeah.

00:13:50.720 --> 00:13:52.800
There are also plenty of other videos.

00:13:52.800 --> 00:13:58.960
So there are quite a few, let's say, technical videos or more like product updates, as we call them.

00:13:58.960 --> 00:14:08.400
Like each sub-project has a talk where they discuss and present their new features or what they've been to the past few months.

00:14:08.400 --> 00:14:17.620
But there are also quite a lot of interesting talks on use cases so that we can learn how people use Jupyter in a while,

00:14:17.620 --> 00:14:20.040
like at companies, also in education.

00:14:20.520 --> 00:14:28.300
And those are very inspiring because they also give people ideas on what they could do with Jupyter in general.

00:14:28.300 --> 00:14:28.700
Well, yeah.

00:14:28.700 --> 00:14:30.600
Well, I certainly recommend people check this out.

00:14:30.600 --> 00:14:36.860
And then there was a talk that you, Darian, and Martha gave introducing JupyterLab 4, right?

00:14:36.860 --> 00:14:37.660
Yes, that's right.

00:14:37.920 --> 00:14:49.580
JupyterLab 4 is also the first time we did one of our keynote product launch talks with the desktop version of the application,

00:14:49.580 --> 00:14:59.720
just kind of to expose people to this new way to use JupyterLab, which isn't super new, but I think is new to most people.

00:14:59.720 --> 00:15:04.740
So we thought that would be a good opportunity, not just to show the new JupyterLab 4 UI and its new features,

00:15:04.740 --> 00:15:10.080
but also to show you can download it onto your desktop, double click a notebook, and open it up in JupyterLab.

00:15:10.080 --> 00:15:10.300
Yeah.

00:15:10.300 --> 00:15:16.380
This portion of Talk Python To Me is brought to you by Phylum, your Python developer security partner.

00:15:16.380 --> 00:15:20.080
Developers and data scientists are the new high-value targets.

00:15:20.080 --> 00:15:20.720
That's you.

00:15:20.720 --> 00:15:24.220
Yet this group remains severely underprotected.

00:15:24.540 --> 00:15:30.420
Attackers know that developers control the keys to the kingdom, SSH, GPG, and signing keys,

00:15:30.420 --> 00:15:34.580
API tokens, infrastructure secrets, and proprietary source code.

00:15:34.580 --> 00:15:37.180
Do you use open-source dependencies in your code?

00:15:37.180 --> 00:15:38.160
Of course you do.

00:15:38.160 --> 00:15:39.080
We all do.

00:15:39.080 --> 00:15:42.520
Vulnerability exploits in open-source code are rare.

00:15:42.520 --> 00:15:47.900
But software supply chain attacks via malicious dependencies are unfortunately kind of common now,

00:15:47.900 --> 00:15:51.400
and these attacks can compromise developers and organizations.

00:15:52.160 --> 00:15:55.340
Phylum detects, reports, and blocks malicious packages,

00:15:55.340 --> 00:15:58.740
while other solutions you may have heard of merely look for known vulnerabilities.

00:15:58.740 --> 00:16:04.740
Of course, Phylum also reports on vulnerabilities, as well as author engineering and license risks.

00:16:04.740 --> 00:16:10.500
But critically, Phylum doesn't wait for a CVE to be published before alerting on bad packages.

00:16:10.500 --> 00:16:13.780
Phylum provides integrations to protect developers where they live,

00:16:13.780 --> 00:16:15.900
guarding PRs and CI environments,

00:16:15.900 --> 00:16:19.580
and with CLI and pre-commit hooks for local development work.

00:16:20.140 --> 00:16:23.560
Help you and your organization's Python security game with Phylum.

00:16:23.560 --> 00:16:24.760
Get started today.

00:16:24.760 --> 00:16:28.440
Subscribe to their newsletter to get Phylum's research sent directly to you,

00:16:28.440 --> 00:16:30.460
or even sign up for their service for free.

00:16:30.460 --> 00:16:34.620
Visit talkpython.fm/phylum-research,

00:16:34.620 --> 00:16:38.580
and enter your email in the subscribe to our research field in the middle of the page,

00:16:38.580 --> 00:16:42.700
or create your free account by clicking the sign up button in the nav bar.

00:16:42.700 --> 00:16:44.020
Stay safe out there.

00:16:44.420 --> 00:16:47.700
Visit talkpython.fm/phylum-research.

00:16:47.700 --> 00:16:51.060
That's P-H-Y-L-U-M dash research.

00:16:51.060 --> 00:16:53.240
Thank you to Phylum for supporting the show.

00:16:55.240 --> 00:17:00.460
Let's set the stage about just what, you know, people, maybe they've heard the word Jupyter,

00:17:00.460 --> 00:17:03.700
they've heard the word notebooks, plural, you know,

00:17:03.700 --> 00:17:08.260
but they might not know the difference between JupyterLab, Jupyter Notebook.

00:17:08.260 --> 00:17:11.700
Maybe you all could like sort of position those two side by side.

00:17:11.700 --> 00:17:13.040
What are these two different things?

00:17:13.040 --> 00:17:13.760
Are they the same?

00:17:13.760 --> 00:17:14.340
Are they different?

00:17:14.340 --> 00:17:15.380
Are they synonyms?

00:17:15.620 --> 00:17:15.780
Okay.

00:17:15.780 --> 00:17:24.000
There is a file format that you will see with the extension .ipynb,

00:17:24.000 --> 00:17:28.200
because historically it was the IPython notebook file format, and we've kept that.

00:17:28.200 --> 00:17:31.060
And those are called Jupyter Notebooks, commonly.

00:17:31.060 --> 00:17:33.720
It's a generic term for that kind of file.

00:17:33.720 --> 00:17:41.700
And then there is a browser-based application that millions of people use for rendering those

00:17:41.700 --> 00:17:43.560
notebooks and writing them and authoring them.

00:17:43.560 --> 00:17:46.360
And that application is called Jupyter Notebook.

00:17:46.360 --> 00:17:48.820
And we just released version seven of that.

00:17:48.820 --> 00:17:57.740
And there is a data environment that features notebooks, but also has lots of other functionality

00:17:57.740 --> 00:18:02.540
that we call the other front end, and that's JupyterLab, right?

00:18:02.540 --> 00:18:08.980
And JupyterLab has a notebook renderer in it, among other things, for Jupyter Notebooks.

00:18:08.980 --> 00:18:16.420
And that same notebook renderer is what powers the application called Jupyter Notebook.

00:18:16.420 --> 00:18:20.200
I think if I keep saying these words, you'll get more confused, so I'm stopping here.

00:18:20.200 --> 00:18:29.560
In my mind, I sort of think of Jupyter Notebook as, you know, which is the single file view type

00:18:29.560 --> 00:18:33.580
of thing, a little bit, not quite the right analogy, but a little bit like the Vim or the

00:18:33.580 --> 00:18:38.120
Emacs user who likes just to have like a single file totally open and just focused on that.

00:18:38.120 --> 00:18:41.140
Whereas JupyterLab is more like the IDE style.

00:18:41.140 --> 00:18:42.760
I want all the tools and the extras.

00:18:42.760 --> 00:18:46.920
I want to be able to get to my, browse my file system, go to the terminal, do all the different

00:18:46.920 --> 00:18:50.900
things and have like multiple files open and work between them.

00:18:51.000 --> 00:18:54.340
Is that a good mental model or am I not quite there yet?

00:18:54.340 --> 00:18:55.780
No, I think that's right.

00:18:55.780 --> 00:19:00.120
The Jupyter Notebook is a single document interface.

00:19:00.120 --> 00:19:05.280
It is, I mean, even like Vim, it has a command mode and, you know, an edit mode and all those.

00:19:05.280 --> 00:19:06.780
So it's not a bad analogy at all.

00:19:06.780 --> 00:19:16.000
JupyterLab is just a really flexible environment to do a lot of different activities in your analysis

00:19:16.000 --> 00:19:17.580
of any particular data.

00:19:17.580 --> 00:19:21.840
It is a much more sort of multi-tool for that.

00:19:21.840 --> 00:19:22.480
Okay.

00:19:22.480 --> 00:19:23.040
Excellent.

00:19:23.040 --> 00:19:26.880
Anyone else want to add more to that, those comparisons or the daring?

00:19:26.880 --> 00:19:27.020
Yeah.

00:19:27.020 --> 00:19:32.540
I mean, for the genesis of this, of JupyterLab, I mean, the first tool that everybody saw and

00:19:32.540 --> 00:19:36.700
the whole world saw in the beginning in 2014 was the notebook, right?

00:19:37.220 --> 00:19:43.560
And got a lot of people excited, but there was a, like a very recurrent request for bringing

00:19:43.560 --> 00:19:49.540
together in the same page, the text editor, the terminals, the having a console as well,

00:19:49.540 --> 00:19:53.960
a regular Python console alongside the notebook in the same, at the same page.

00:19:54.400 --> 00:19:56.960
And so this is what we delivered with JupyterLab.

00:19:56.960 --> 00:20:03.260
And even though it was a very popular, like common demand from the community, a lot of people

00:20:03.260 --> 00:20:10.880
really loved this more rigid full page notebook UI and, you know, kept using the notebook.

00:20:11.320 --> 00:20:21.400
So this is where we were about two years ago when we started the discussion about notebook 7 and

00:20:21.400 --> 00:20:24.440
modernizing, you know, the classic notebook user interface.

00:20:24.440 --> 00:20:30.460
Was there ever a time where people were thinking to have JupyterLab be the next version of Jupyter

00:20:30.460 --> 00:20:32.280
notebook and kind of replace it?

00:20:32.280 --> 00:20:35.740
And then the people are like, you know what, maybe please don't take that away.

00:20:35.740 --> 00:20:43.000
No, it was definitely at some point, our strategy to deprecate the notebook eventually.

00:20:43.000 --> 00:20:48.640
And we had a large public conversation about this.

00:20:48.640 --> 00:20:53.840
And it just, I think is clear that people like having that choice.

00:20:53.840 --> 00:20:58.600
People like having what is just a simple editor for notebooks.

00:20:58.600 --> 00:21:02.500
And people also like having the Swiss army knife.

00:21:02.500 --> 00:21:07.620
And they're not always the same people, but we want everyone who is using these things

00:21:07.620 --> 00:21:15.400
to be able to get both the benefit of the modern architecture and the updates and also the user

00:21:15.400 --> 00:21:16.840
experience they want, right?

00:21:16.840 --> 00:21:22.560
So if most of the plugins that come out lately are for JupyterLab and you're feeling more and

00:21:22.560 --> 00:21:24.520
more left behind, that's not a great experience.

00:21:24.520 --> 00:21:29.800
And so deprecating that tool you're using and saying you must use this other one, it just

00:21:29.800 --> 00:21:32.060
isn't what our community needed.

00:21:32.060 --> 00:21:38.180
So now we, I think, have an architecture that we can sustainably maintain because it's

00:21:38.180 --> 00:21:39.740
effectively the same code base.

00:21:39.740 --> 00:21:45.780
But we also can give users what they want because there are different contexts.

00:21:45.780 --> 00:21:50.100
And it is the case that we would have left some people behind and it's better not to.

00:21:50.100 --> 00:21:55.560
You can imagine in different scenarios, different user bases, it might make a lot of sense to

00:21:55.560 --> 00:21:56.620
have one or the other, right?

00:21:56.620 --> 00:22:02.740
If I'm a data scientist working on complicated projects, maybe JupyterLab is the right place.

00:22:02.740 --> 00:22:09.000
But if I'm trying to teach a little bit of computation for a psychology class and I just want them to do

00:22:09.000 --> 00:22:15.540
three plots and pull in some data, you don't want to drop non-developers into something that looks kind of

00:22:15.540 --> 00:22:15.940
complicated.

00:22:15.940 --> 00:22:16.940
like, where do I go?

00:22:16.940 --> 00:22:18.060
Here's your page.

00:22:18.060 --> 00:22:23.620
You type in these cells, you see the picture, you get the graph for the study we're talking about or something.

00:22:23.620 --> 00:22:23.620
Right?

00:22:23.620 --> 00:22:24.620
Yeah, that's exactly the idea.

00:22:24.620 --> 00:22:25.620
Yeah.

00:22:25.620 --> 00:22:26.620
Mm-hmm.

00:22:26.620 --> 00:22:27.620
Interesting.

00:22:27.620 --> 00:22:33.620
You touched on something interesting there that Jupyter Notebook, the single page or the single view version,

00:22:33.620 --> 00:22:36.340
is now based on JupyterLab.

00:22:36.340 --> 00:22:38.460
And there's a lot of overlap of these things, right?

00:22:38.460 --> 00:22:38.860
Yeah.

00:22:38.860 --> 00:22:42.420
I don't know if it was the right time to go more into the details.

00:22:42.420 --> 00:22:43.300
Yeah.

00:22:43.300 --> 00:22:47.820
Give us a little, it's a bit of a jump ahead, but just give us a sense that people who,

00:22:47.820 --> 00:22:50.580
maybe people are listening, go, ah, I'm not going to use JupyterLab.

00:22:50.580 --> 00:22:52.560
I'm kind of the notebook type of person, right?

00:22:52.640 --> 00:22:59.160
There's a lot of what we're talking about that still directly applies because there's a bunch of similarity or actually reused, right?

00:22:59.160 --> 00:23:09.920
So one thing we didn't mention yet about JupyterLab is that, so for end users, it is indeed a more advanced environment, a bit more like an ID, even though it's not really an ID.

00:23:09.920 --> 00:23:13.200
But for developers, it's also a framework.

00:23:13.200 --> 00:23:17.920
So JupyterLab itself is just a set of plugins and extensions.

00:23:18.460 --> 00:23:23.500
They were designed from the very beginning to be reused in, you know, in different ways.

00:23:23.500 --> 00:23:29.140
So like, if you actually, if you go to the JupyterLab repo, there is an examples folder.

00:23:29.140 --> 00:23:34.900
And in there, there are a few different apps that you can build yourself.

00:23:34.900 --> 00:23:36.140
And they are not JupyterLab.

00:23:36.140 --> 00:23:43.960
They are like just a single cell on the page or maybe just, yeah, this one, maybe just a console, maybe just a notebook.

00:23:44.340 --> 00:23:49.780
And this is made possible because JupyterLab is indeed just a set of extensions.

00:23:49.780 --> 00:23:54.040
These examples, they just reuse some of them and they just put them together in a different way.

00:23:54.040 --> 00:23:56.860
So we sometimes call them remixes.

00:23:56.860 --> 00:24:01.420
And in the end, Notebook 7 is a JupyterLab remix.

00:24:01.420 --> 00:24:12.960
It's just a different JupyterLab interface, but focused on a document-centric experience that, you know, users have been liking for many years already.

00:24:13.380 --> 00:24:18.020
So, yeah, that's a bit of the second side of JupyterLab.

00:24:18.020 --> 00:24:18.560
Excellent.

00:24:18.560 --> 00:24:19.080
Yeah.

00:24:19.080 --> 00:24:24.840
And there's a bunch of features that we're going to talk about here that come to Jupyter Notebooks in 7.

00:24:24.840 --> 00:24:27.940
Yeah, 7 can get the right version for the right product.

00:24:28.540 --> 00:24:35.140
Because of what you all have done here, like interactive debugging and real-time collaboration and things like that, yes?

00:24:35.140 --> 00:24:40.000
Yeah, all of that was really a byproduct of moving over to the JupyterLab architecture.

00:24:40.000 --> 00:24:56.240
And one other key aspect of Notebook 7 over Notebook 6 is that since we use the text editor from JupyterLab 4, which is a newer version of CodeMirror, we also get a lot of benefits in terms of accessibility.

00:24:56.860 --> 00:25:09.320
Most of the work on accessibility has been going into the JupyterLab codebase and not into the classic Notebook, which was really based on older versions of, you know, older libraries and, you know, JavaScript from 2010s.

00:25:09.920 --> 00:25:14.640
And so we're in a much better shape on this regard with JupyterLab 4 and Notebook 7.

00:25:14.640 --> 00:25:18.040
It's a different world with JavaScript these days than it was in 2010.

00:25:18.040 --> 00:25:18.620
That's right.

00:25:18.620 --> 00:25:20.340
Quite a bit.

00:25:20.340 --> 00:25:24.240
Let's start by talking about some of the new features for JupyterLab.

00:25:24.240 --> 00:25:26.760
One of the ones is for very large notebooks.

00:25:26.760 --> 00:25:29.540
JupyterLab is quite a bit faster, right?

00:25:29.540 --> 00:25:30.740
That's excellent.

00:25:30.740 --> 00:25:32.120
Who wants to take that one?

00:25:32.120 --> 00:25:33.420
I nominate for it.

00:25:33.420 --> 00:25:34.920
Yeah, I can go ahead with that one.

00:25:34.920 --> 00:25:36.600
Go ahead.

00:25:36.600 --> 00:25:50.700
So, yeah, that's one of the complaints of the user is that when you get lots of notebook open or when you get some notebook that are very lengthy, the UI responsiveness can be low.

00:25:50.700 --> 00:25:55.760
And so we decided to focus quite some time on that aspect.

00:25:55.760 --> 00:26:01.700
And that was made possible by fully upgrading the text editor to the latest version.

00:26:01.700 --> 00:26:03.280
So we are using CodeMirror.

00:26:03.280 --> 00:26:08.560
It's a awesome third-party library for dealing with text editor.

00:26:08.560 --> 00:26:13.580
And we upgraded to the latest one that brings up a very important speedup.

00:26:13.580 --> 00:26:21.040
And also we have worked on the styling to try to optimize it because styling can hit your browser pretty hard.

00:26:21.780 --> 00:26:31.000
And lately, we have also introduced a new way of rendering notebook, like only rendering what the user is seeing, basically.

00:26:31.000 --> 00:26:32.960
That one is still experimental.

00:26:32.960 --> 00:26:35.920
So by default, it's off and user can try it.

00:26:35.920 --> 00:26:44.140
And we are still working on that one to get it on by default for the next minor version, so for 4.1.

00:26:44.140 --> 00:26:53.280
And hopefully, when we reach that milestone, we'll get like a very smooth experience for 99% for a user.

00:26:53.280 --> 00:26:54.700
That's the goal.

00:26:55.100 --> 00:27:00.660
Yeah, it's tricky because web browsers typically want to just have the whole document, the DOM loaded.

00:27:00.660 --> 00:27:02.460
They want you to just work with it.

00:27:02.460 --> 00:27:11.780
But if you've got 100 virtual pages, right, that you would go through, you don't want to style all those and do all the widgets and all that if they're not on the screen, right?

00:27:11.780 --> 00:27:12.880
So there's this tension.

00:27:12.880 --> 00:27:13.600
Yeah, exactly.

00:27:13.600 --> 00:27:23.960
And sometimes it can come from tricky part, like just displaying for education, for example, the use, and that's very nice, a lot of equation, nice rendering.

00:27:23.960 --> 00:27:35.440
And those are creating so many elements in the web page that sometimes just having not so long notebook with lots of math expression can crush your browser, basically.

00:27:35.440 --> 00:27:37.880
That's surprising at first.

00:27:37.880 --> 00:27:38.220
All right.

00:27:39.920 --> 00:27:40.340
Right.

00:27:40.340 --> 00:27:40.620
Okay.

00:27:40.620 --> 00:27:45.580
So here's what I'm hearing is like complex math, like calculus, differential equations, those kind of things.

00:27:45.580 --> 00:27:48.040
Not just hard for people, but also hard for web browsers.

00:27:48.040 --> 00:27:51.700
Math is hard for web browsers.

00:27:51.700 --> 00:27:52.140
Got it.

00:27:52.140 --> 00:27:53.480
That's pretty interesting.

00:27:53.480 --> 00:28:02.880
Darren, you showed in your talk, you showed this off in a video, a side-by-side, JupyterLab 3 versus 4 with a large notebook, and it was much faster.

00:28:02.880 --> 00:28:09.680
Did that video have the virtual paging, like the render, the scene culling thing?

00:28:09.680 --> 00:28:14.960
Where it doesn't show, it doesn't render the stuff it doesn't see, or is that just the first default version right now?

00:28:14.960 --> 00:28:20.720
This is where I come clean to your audience and say, Fred is the person who produced and recorded those videos.

00:28:20.720 --> 00:28:24.380
And Fred was originally going to give that talk.

00:28:24.380 --> 00:28:31.060
I can tell you that, yes, that's exactly what's going on, but Fred can give you the actual details because he's the one who hit the record button.

00:28:31.060 --> 00:28:31.400
Yeah.

00:28:31.400 --> 00:28:31.800
Yeah.

00:28:31.800 --> 00:28:32.360
Tell us, Fred.

00:28:32.420 --> 00:28:35.980
I have a very happy event that prevented me to go to the JupyterCon.

00:28:35.980 --> 00:28:44.960
So I was, normally, I was the one that had to do the talk with Marta, but we had to switch last minute and thank again, Afin, for doing that.

00:28:45.380 --> 00:28:57.000
But definitely, the video that was displayed was that it's a comparison between the latest 3.6 version and the 4 version with that feature that's off for now by default.

00:28:57.000 --> 00:29:00.880
That will bring the best performance for the end user.

00:29:01.120 --> 00:29:02.640
Yeah, it was a massive speed up.

00:29:02.640 --> 00:29:06.580
So, you know, on one hand, you're like, ah, you're just waiting 10 seconds.

00:29:06.580 --> 00:29:10.620
But those kinds of little delays, they just kind of break your thought and your flow.

00:29:10.620 --> 00:29:12.600
And you just feel like the tools are getting in the way.

00:29:12.600 --> 00:29:18.200
And if it's really, really quick, then the tools kind of vanish to the background and you don't think about them, right?

00:29:18.200 --> 00:29:18.880
That's how it should be.

00:29:18.880 --> 00:29:35.280
Even when rendering all of the notebook and without enabling the virtual scrolling, we get already a nice speed up already, thanks to the adoption of CodeMirror 6, which is much faster to render and a bunch of other optimizations that we were able to do.

00:29:35.280 --> 00:29:44.560
But yeah, I mean, it was the easiest clap in the entire talk was just playing that video and seeing the fast one render and the slow one keep going.

00:29:44.860 --> 00:29:50.320
It's a really different user experience, even though, as you say, it's only a few seconds.

00:29:50.320 --> 00:30:00.360
It turns out a few seconds is enough to cause the kind of interruption that leaves a negative overall impression in the user's experience.

00:30:00.360 --> 00:30:00.880
Absolutely.

00:30:00.880 --> 00:30:06.440
This portion of Talk Python To Me is brought to you by Python Tutor.

00:30:06.440 --> 00:30:10.900
Are you learning Python or another language like JavaScript, Java, C, or C++?

00:30:10.900 --> 00:30:13.300
If so, check out Python Tutor.

00:30:13.800 --> 00:30:19.840
This free website lets you write code, run it, and visualize what happens line by line as your code executes.

00:30:19.840 --> 00:30:24.640
No more messy print statements or fighting with the debugger to understand what code is doing.

00:30:24.640 --> 00:30:30.420
Python Tutor automatically shows you exactly what's going on step by step in an intuitive visual way.

00:30:30.420 --> 00:30:38.960
You'll see all the objects as they are represented in Python memory and how they are connected and potentially shared across variables over time.

00:30:39.540 --> 00:30:47.080
It's a great free tool to complement what you're learning from books, YouTube videos, and even online courses like the ones right here at Talk Python Training.

00:30:47.080 --> 00:30:52.600
In fact, I even used Python Tutor when creating our Python Memory Management and Tips course.

00:30:52.600 --> 00:30:57.380
It was excellent for showing just what's happening with references and containers in memory.

00:30:57.380 --> 00:30:59.560
Python Tutor is super easy to check out.

00:30:59.560 --> 00:31:05.140
Just visit talkpython.fm/python dash tutor and click visualize code.

00:31:05.140 --> 00:31:09.160
It comes preloaded with an example and you don't even need an account to use it.

00:31:09.160 --> 00:31:13.760
Again, that's talkpython.fm/python dash tutor to visualize your code for free.

00:31:13.760 --> 00:31:15.640
The link is in your podcast player show notes.

00:31:15.640 --> 00:31:18.340
Thank you to Python Tutor for sponsoring this episode.

00:31:20.500 --> 00:31:29.480
This is not a JupyterLab feature exactly, but while we're on this code editor topic, I wanted to ask you all just your thoughts about this.

00:31:29.480 --> 00:31:32.140
Now, keep in mind, before I ask this question, my perspective.

00:31:32.140 --> 00:31:38.700
I've come from doing a lot of traditional software development with editors like PyCharm and Visual Studio Code and others.

00:31:38.700 --> 00:31:43.440
So when I work in Jupyter, Notebook or Lab, it doesn't really matter.

00:31:43.440 --> 00:31:51.220
And I'll say some variable dot, it doesn't give me any help unless I press tab to see the autocomplete.

00:31:51.220 --> 00:32:00.100
Like, is there an option or discussion around having like more aggressive autocomplete that kind of automatically shows up as you work with it?

00:32:00.100 --> 00:32:04.380
Or is the community just like, we don't really want that stuff popping up around.

00:32:04.380 --> 00:32:04.860
We want it.

00:32:04.860 --> 00:32:05.800
We just want to type.

00:32:05.800 --> 00:32:19.480
So the reason it's currently this way is primarily due to the behavior of Jupyter Notebook a long time ago and not subverting user expectations.

00:32:19.480 --> 00:32:29.580
But we can often keep that as the default and have some setting to facilitate a different kind of behavior.

00:32:29.580 --> 00:32:35.160
With this one, I think there's probably actual appetite for it.

00:32:35.160 --> 00:32:36.840
But no one's shown up to do it.

00:32:36.840 --> 00:32:40.160
I don't think we would turn down a feature like this hidden behind the setting.

00:32:40.160 --> 00:32:50.120
I just don't think anyone has both been bothered enough and also been in the time and place with the resources and wherewithal necessary to do it.

00:32:50.120 --> 00:33:00.040
But it doesn't sound, yeah, it sounds totally doable and compatible with both keeping the user expectations intact and offering you the feature you're talking about.

00:33:00.280 --> 00:33:03.280
Because, yeah, people have different styles of completion that they're into.

00:33:03.280 --> 00:33:10.580
And new things are appearing all the time and creating new expectations like LSP, which changes the language server protocol.

00:33:10.580 --> 00:33:11.120
Yeah.

00:33:11.120 --> 00:33:11.320
Yeah.

00:33:11.320 --> 00:33:12.960
Anyone else have thoughts on that?

00:33:12.960 --> 00:33:21.060
I would say that in 4.1, there are things coming to at least give you the ability to more quickly restore history.

00:33:21.060 --> 00:33:30.860
Like you type and then it's going to propose you to copy-paste the code that was written previously in some previous cells and stuff like that.

00:33:30.860 --> 00:33:37.600
And the same infrastructure will be available for plugins.

00:33:38.060 --> 00:33:44.680
And I know some people are working on AI integration in Jupyter and some of them are already working.

00:33:44.680 --> 00:33:54.380
And, okay, let's try to do a request when the user is typing to help him complete the code or giving me the hint on how to improve things.

00:33:54.380 --> 00:33:58.000
And, yeah, there are a couple of people working on that.

00:33:58.000 --> 00:34:00.100
So stay tuned for more.

00:34:00.400 --> 00:34:00.800
Yeah, okay.

00:34:00.800 --> 00:34:02.860
I really like JupyterLab and working it now.

00:34:02.860 --> 00:34:08.460
But if you could just go and these are all the things you can do just as I would, you know, I would make me even more happy.

00:34:08.460 --> 00:34:10.000
Darn, you mentioned settings.

00:34:10.000 --> 00:34:15.580
And that's actually one of the new features as well as like a UI for settings.

00:34:15.580 --> 00:34:16.120
Is that right?

00:34:16.120 --> 00:34:16.480
Yeah.

00:34:16.640 --> 00:34:27.320
So this is basically a front end that's capable of taking any extensions defined settings and rendering a UI for it.

00:34:27.320 --> 00:34:35.140
Because we don't know what the preferences an extension author is going to want are going to look like.

00:34:35.140 --> 00:34:37.940
We can't create like a custom UI for it.

00:34:38.100 --> 00:34:53.600
Instead, we have to read a schema file that defines such like the extension author who wrote an extension that does Git, right, also has a whole bunch of Booleans that are by default set to true.

00:34:53.600 --> 00:34:55.640
So this UI is like, oh, okay, cool.

00:34:55.640 --> 00:34:57.540
I'll bring a bunch of checkboxes and check them.

00:34:57.540 --> 00:34:59.120
And so it's very flexible.

00:34:59.120 --> 00:35:01.180
It can take any extension settings.

00:35:01.180 --> 00:35:06.660
And as long as they're described properly according to the API, they will render inside that UI.

00:35:07.160 --> 00:35:12.280
And it really beats what we used to have there, which is just a JSON blob editor.

00:35:12.280 --> 00:35:13.420
Here you go.

00:35:13.420 --> 00:35:14.380
Here's your JSON.

00:35:14.380 --> 00:35:14.720
Good luck.

00:35:14.720 --> 00:35:17.120
And we tried to make it slightly nicer.

00:35:17.120 --> 00:35:24.480
I think we tried to make it support a version of JSON that has inline comments as well.

00:35:24.480 --> 00:35:26.480
But like, it's still not that nice.

00:35:26.480 --> 00:35:32.900
So I'm very happy to see this as the way you go playing around with all the choices you have.

00:35:32.980 --> 00:35:39.460
Because JupyterLap has a lot of settings, but it's really difficult to explore them without something like this.

00:35:39.460 --> 00:35:40.740
Especially with all the extensions.

00:35:40.740 --> 00:35:41.540
Yeah.

00:35:41.540 --> 00:35:42.580
Kind of unbounded set, right?

00:35:42.580 --> 00:35:43.140
Exactly.

00:35:43.140 --> 00:35:43.460
Yeah.

00:35:43.520 --> 00:35:48.140
The settings UI has a search that searches through all the different areas for settings.

00:35:48.140 --> 00:35:50.380
It's one of my favorite things on complex apps.

00:35:50.380 --> 00:35:56.580
And you're like, I don't know what is in here, but I bet if I start typing, it'll reveal itself if it's in there somewhere, right?

00:35:56.580 --> 00:35:56.920
Yeah.

00:35:56.920 --> 00:35:57.420
Yeah.

00:35:57.420 --> 00:35:59.540
JupyterLap has two places like that.

00:35:59.900 --> 00:36:05.000
One is the command palette also lets you search the entire menu system, basically.

00:36:05.000 --> 00:36:08.600
And that's become, you know, in other ideas too.

00:36:08.600 --> 00:36:15.500
I mean, I think there's a certain point as a user of these tools where you discover something like that.

00:36:15.500 --> 00:36:18.080
And then after that point, you don't want to go back.

00:36:18.080 --> 00:36:20.020
So I think you're right.

00:36:20.120 --> 00:36:24.760
Like I didn't used to always need search in my applications, but now I do, just like you say.

00:36:24.760 --> 00:36:25.360
Yeah, exactly.

00:36:25.360 --> 00:36:29.440
This really goes into the thing we were mentioning earlier about JupyterLab remixes.

00:36:29.440 --> 00:36:34.240
So as you know, JupyterLab is basically only a collection of extensions, right?

00:36:34.240 --> 00:36:40.120
And the notebook itself, the command palette, all of these things are extensions to the core app, right?

00:36:41.860 --> 00:36:51.020
So remixes are a way to cherry pick some of these core extensions, potentially include third-party extensions into a new thing.

00:36:51.020 --> 00:36:56.520
I think that there are not many equivalents to JupyterLab in that regard.

00:36:56.520 --> 00:37:12.800
If you try to make a new complex application in the web, like a photo editor, a CAD engine, anything that falls into the category of having to display a lot of information on the screen, doing something that, you know, you spend hours doing every day.

00:37:12.800 --> 00:37:27.460
You will want a framework that allows extensibility, theming, a command palette, unified keyboard shortcuts, you know, across the application, a settings editor for your main app and all of your extensions, configurable keyboard shortcuts.

00:37:27.460 --> 00:37:30.360
I mentioned that earlier, potentially real-time collaboration.

00:37:30.360 --> 00:37:35.960
And these are lots of checkboxes to check if you are starting from scratch.

00:37:35.960 --> 00:37:47.460
And so the JupyterLab, basically, application framework allowed us to reuse all of that work for other things that have nothing to do with the notebook, for example.

00:37:47.460 --> 00:37:55.000
So earlier this year, we released JupyterCAD, which is a web-based CAD modeler, which is a JupyterLab Remix, really.

00:37:55.000 --> 00:38:00.600
It can be used both at the JupyterLab extension where you find everything that you're used to or in a standalone fashion.

00:38:00.600 --> 00:38:02.960
And this JupyterCAD is really interesting.

00:38:02.960 --> 00:38:16.160
It's a 3D CAD curated design editor that has, that's built on top of the JupyterLab framework, but it's not itself exactly about Jupyter, like programming and so on, right?

00:38:16.160 --> 00:38:21.320
And it has really interesting things, like it has real-time collaboration between multiple people.

00:38:21.320 --> 00:38:24.660
And all of that stuff comes from just building on top of this, like you said.

00:38:24.660 --> 00:38:28.360
That's a good example of something really different, but still possible.

00:38:28.360 --> 00:38:39.140
Yeah, so in the way we enable real-time collaboration in JupyterLab, we have to specialize a few things depending on the type of document that you're editing, but really the framework is generic.

00:38:39.140 --> 00:38:46.520
And you can start making, enabling real-time collaboration and other types of content than just textual content or whatnot.

00:38:47.060 --> 00:38:56.080
And we all got used to real-time collaboration and collaborative editing on text, you know, on the sort of software suite that we use for basic productivity.

00:38:56.400 --> 00:39:06.480
But very convinced that this will be the case for more technical computing, not just code, but everything where you have to put together a really complex system.

00:39:06.480 --> 00:39:11.440
Like, especially if you are building something that requires a lot of people to coordinate.

00:39:11.680 --> 00:39:24.720
Like, you're making a new plane or football stadium, and you have this unified model where everything percolates across many, you know, domain-specific applications from CAD to, you know, electrical systems or whatnot.

00:39:24.720 --> 00:39:34.560
And for people to effectively collaborate in these kinds of environments, I think collaborative editing is going to bring a lot if we can implement this vision.

00:39:34.560 --> 00:39:40.100
So, really, JupyterCAD is a demonstrator that you can do collaborative editing on other things than just notebooks.

00:39:40.560 --> 00:39:46.700
Yeah, JupyterLab may become the foundation for things that we would never expect to be part of programming, like you're talking about.

00:39:46.700 --> 00:39:47.260
It's interesting.

00:39:47.260 --> 00:39:51.480
Yeah, it's more technical computing than just, you know, interactive computing, I would say.

00:39:51.480 --> 00:39:51.800
Yeah.

00:39:51.800 --> 00:39:52.080
Yeah.

00:39:52.080 --> 00:39:54.180
I was thinking about this book here.

00:39:54.180 --> 00:39:55.320
Like, oh, man.

00:39:55.320 --> 00:40:01.620
This book is thrown around as, like, by Fred Brooks, basically saying, like, there's no project.

00:40:01.620 --> 00:40:03.060
We're adding more and more people.

00:40:03.060 --> 00:40:06.840
It's going to speed it up and get it done more on time, right?

00:40:06.840 --> 00:40:10.500
It was all about sort of the follies of, like, well, as you add more people,

00:40:10.700 --> 00:40:16.880
the complexity of the communication and the overhead of syncing and all of that is kind of going to break everything.

00:40:16.880 --> 00:40:23.720
And so, you know, you can't make a baby in, like, one month by having nine women work on it sort of story.

00:40:23.720 --> 00:40:31.260
You know, like, but the stuff that you're talking about here and all of these communication tools and all of this interesting async stuff that we're doing these days,

00:40:31.260 --> 00:40:34.360
I kind of feel like people should rethink these ideas.

00:40:34.360 --> 00:40:46.880
And I think kind of what you're touching on here is, like, it is possible to get deeper, important work done as groups than maybe the mythology that people think about in the software world traditionally has been.

00:40:46.880 --> 00:40:49.280
It's a different world than 2023 and on.

00:40:49.280 --> 00:40:51.200
I mean, it's kind of a sidebar of it.

00:40:51.420 --> 00:40:53.640
It's also important to what this collaborative editing.

00:40:53.640 --> 00:40:55.120
Yeah, I like this book.

00:40:55.120 --> 00:41:00.440
So for a long time, we have been trying to introduce real-time collaboration into Jupyter.

00:41:00.440 --> 00:41:06.100
We've had at least three significant technical attempts at it, right?

00:41:06.140 --> 00:41:07.360
It's a hard problem.

00:41:07.360 --> 00:41:09.140
It's one we've worked on a long time.

00:41:09.140 --> 00:41:23.940
And it's given me a unique opportunity that most people don't have, which is trying to justify to myself over the course of six years why anyone should want real-time collaboration inside a programming environment.

00:41:23.940 --> 00:41:49.320
And what I can say is, over that time period, I have spent, I don't know, hundreds of hours inside documents with other people that are Markdown files, because that's how we conduct our meetings, or inside Google Docs, because that's how we wrote our governance, or asynchronously back and forth on GitHub, which is not exactly the same thing, but truly is collaboration.

00:41:49.960 --> 00:42:06.960
And so I don't think there's a tension between there's a group of us working on something in a room, and we want technical tools so that we don't all have to be in that room, but we can have that seamlessness and the myth of the mythical, you know, the man month, right?

00:42:06.960 --> 00:42:14.640
I actually think those problems are, like on the surface, they look pretty similar, but I actually think they're not the same thing.

00:42:14.940 --> 00:42:21.960
It's more like, back when that book was written, groups of people would get inside one room and work collaboratively.

00:42:21.960 --> 00:42:28.040
Today, every one of us on this call is in a different location, and some of us are pretty far apart.

00:42:28.040 --> 00:42:30.540
We're in different countries, and it's all working out fine.

00:42:30.540 --> 00:42:37.100
And Jupyter is bringing tools like that to people, and less tools like, let's add 5,000 people.

00:42:37.100 --> 00:42:46.860
Now, what Sylvan was talking about, still, you know, you're not going to have one person opening up the grand document that describes like the whole Coliseum, right?

00:42:46.860 --> 00:42:53.860
But there's going to be tons of groups that are working on systems where there's like seven people who need to work on this thing together.

00:42:53.860 --> 00:42:59.080
And Google Docs for wiring documents doesn't exist yet, you know, but it could exist.

00:42:59.080 --> 00:43:00.860
Yeah, and it could be built on Jupyter Lab.

00:43:00.860 --> 00:43:01.340
That's right.

00:43:01.340 --> 00:43:03.820
One of the big features is this real-time collaboration.

00:43:04.340 --> 00:43:06.260
Let's, you know, let's talk about that for a moment.

00:43:06.260 --> 00:43:11.300
I think that's, I think it's a big deal, as I've been hinting that with my sidebar and so on.

00:43:11.300 --> 00:43:14.440
Well, in the beginning, I think we need to start small.

00:43:14.440 --> 00:43:20.960
Even with, you know, Google Docs, when it came out, I think in 2006, a lot of, many people didn't see the point.

00:43:20.960 --> 00:43:24.760
Like, why would I want someone else's cursor in my document?

00:43:24.760 --> 00:43:26.620
Like, it sounds dangerous, right?

00:43:26.780 --> 00:43:34.460
So if you were to make a survey of what people wanted at the time, nobody would have said that, right?

00:43:34.460 --> 00:43:36.760
Yet everybody does that now, right?

00:43:37.340 --> 00:43:44.980
And it's probably, people probably have the same feeling when it comes to writing code or doing any sort of technical work.

00:43:44.980 --> 00:43:49.160
And I think we'll get past this point where people will get it.

00:43:49.160 --> 00:43:59.100
And in the very beginning, this can start being useful for peer programming, doing something together while we're reviewing code over a Zoom meeting.

00:43:59.480 --> 00:44:07.060
That sort of thing where, you know, there is a, you know, real-time interaction between people over some kind of medium.

00:44:07.060 --> 00:44:13.880
If you look at more technical objects, like, for example, you have two different teams.

00:44:13.880 --> 00:44:15.220
Like, someone's making a plane.

00:44:15.220 --> 00:44:22.260
There is a team of people that's doing some simulation and see how, you know, the plane goes through the air.

00:44:22.260 --> 00:44:27.440
And another person is making physical prototypes of parts of the plane.

00:44:28.040 --> 00:44:29.860
And you have this interaction.

00:44:29.860 --> 00:44:33.980
You know, normally these two groups would be in two different branches of the company.

00:44:33.980 --> 00:44:41.220
And in order to change any kind of spec, you would need to go up and down in the hierarchy by a few, you know, degrees.

00:44:41.220 --> 00:44:41.600
Right.

00:44:41.600 --> 00:44:44.060
Schedule a meeting for next week, that sort of thing, yeah.

00:44:44.060 --> 00:44:44.420
Yeah.

00:44:44.420 --> 00:44:52.020
And you change the specs and now everybody has to change or make, you know, changes to their, you know, boundaries.

00:44:52.780 --> 00:45:01.380
And if you enable more real-time, you know, feedback on suggestions and whatnot, you may be become a lot more efficient.

00:45:01.380 --> 00:45:06.300
So, it's pretty similar to Google Docs, excuse me.

00:45:06.300 --> 00:45:13.300
You have to install the Jupyter Collaboration extension for the server, right, in order for this to work?

00:45:13.300 --> 00:45:17.580
It's not just pip install Jupyter Lab and you're good to go?

00:45:17.760 --> 00:45:23.600
Well, you can pip install Jupyter Lab and pip install Jupyter Collaboration if you need the one-liner.

00:45:23.600 --> 00:45:29.140
But the idea was lots of people install for personal use on their own laptops.

00:45:29.660 --> 00:45:37.020
And anyone who's going to create an environment where collaboration is happening is doing more than running just one command to install Jupyter anyway.

00:45:37.020 --> 00:45:37.500
Yeah, yeah.

00:45:37.500 --> 00:45:37.920
Of course.

00:45:37.920 --> 00:45:44.960
You know, so, like, as a toy, if the five of us are in the same network, we can launch it that way just to play around with.

00:45:44.960 --> 00:45:50.180
But really, any sophisticated user is going to tie in the user system and do a whole bunch of config and all those things.

00:45:50.180 --> 00:45:58.760
And so, we're not shipping the code that does that inside core Jupyter Lab for two reasons.

00:45:58.760 --> 00:46:06.320
One is that, you know, the main sort of install base doesn't do real-time collaboration.

00:46:06.320 --> 00:46:11.460
The other is that we're working on that package much faster than we're working on Jupyter Lab core.

00:46:11.460 --> 00:46:19.920
And having them in separate packages allows us to bump versions if we need without carrying that much and to add new features and to just, you know,

00:46:19.920 --> 00:46:21.740
it's a smaller subset, it can move way faster.

00:46:21.740 --> 00:46:29.240
Yeah, that's a great design philosophy process because there was a conversation like this in core Python and request.

00:46:29.240 --> 00:46:34.080
They're like, we have a URL library in Python, but request seems to be the default.

00:46:34.080 --> 00:46:37.600
We should move it in and be like, whoa, whoa, whoa, you're going to make us ship request once a year.

00:46:37.600 --> 00:46:38.320
We don't want to do that.

00:46:38.320 --> 00:46:41.100
This is not, like, this is changing fast and it needs to be more adaptive.

00:46:41.100 --> 00:46:43.340
And that sounds like a similar deal here.

00:46:43.340 --> 00:46:43.820
Excellent.

00:46:43.820 --> 00:46:45.820
Let's hit on some more of the new things.

00:46:45.980 --> 00:46:50.700
So we've got one of the things that's new is cell toolbars.

00:46:50.700 --> 00:46:55.320
There's like when I'm editing a cell within the little cell, there's a toolbar with some new features.

00:46:55.320 --> 00:46:56.680
Anyone want to talk about that?

00:46:56.680 --> 00:46:57.920
It's exactly what you said.

00:46:58.240 --> 00:47:07.020
One question often asked by extension authors is, okay, I want to do a certain thing to a specific kind of cell, right?

00:47:07.020 --> 00:47:11.060
Like I want to somehow pull out this cell and do something extra with it.

00:47:11.060 --> 00:47:12.260
Where do I put that button?

00:47:12.260 --> 00:47:13.960
Or, you know, it's the answer to that question.

00:47:14.220 --> 00:47:14.880
Yeah.

00:47:14.880 --> 00:47:17.040
All of the things that you can do were there before.

00:47:17.040 --> 00:47:23.740
It's just meant to give users a discoverable way to learn maybe some capabilities they didn't know.

00:47:23.740 --> 00:47:27.820
Or maybe even hover over the button and learn a new keyboard shortcut or something.

00:47:27.820 --> 00:47:29.900
It's one of those quality of life features.

00:47:29.900 --> 00:47:31.600
It's not like revolutionary.

00:47:31.600 --> 00:47:35.960
It's more like just making this thing slightly more ergonomic.

00:47:35.960 --> 00:47:46.180
Yeah, I was thinking when I saw that, I was thinking of, you know, the biologist who is doing their first semester of a class where they had to use Jupyter notebooks for their work.

00:47:46.180 --> 00:47:52.540
And they're like, how do I just seeing those buttons there for the first month of working with it is helpful.

00:47:52.540 --> 00:47:54.420
Then, as you point out, you learn the hotkeys.

00:47:54.420 --> 00:47:57.520
Like I press B, I don't go over here with the mouse and those kind of things.

00:47:57.520 --> 00:47:59.700
But still, I think it's a nice one.

00:47:59.700 --> 00:48:00.340
Let's see.

00:48:00.340 --> 00:48:04.340
What else did I want to give a shout out to that we haven't done yet?

00:48:04.340 --> 00:48:05.700
Oh, collapsing.

00:48:05.700 --> 00:48:07.440
Based on markdown headers.

00:48:07.440 --> 00:48:17.500
That's kind of interesting that you can organize your document in a way to kind of expose parts or make it more of a report or more of a coding environment and these kind of things.

00:48:17.500 --> 00:48:18.900
Who wants to introduce that feature?

00:48:18.900 --> 00:48:26.980
The idea was to, especially when you have some document that can be long, like from education that has lots of text and stuff like that.

00:48:27.100 --> 00:48:37.420
It helps the student, for example, to be able to focus or to scroll artificially, let's say, to the right place faster.

00:48:37.420 --> 00:48:40.280
So that's one of those nice features.

00:48:40.700 --> 00:48:48.780
And I think it's something also now we are used to because lots of classical Office text editor have that kind of ability.

00:48:48.780 --> 00:48:52.020
So it was a nice feature to add to in JupyterLab.

00:48:52.240 --> 00:48:53.140
Yeah, kind of related.

00:48:53.140 --> 00:49:02.060
And it's probably going to sound really boring, but it actually is pretty awesome, I think, is the table of contents where it looks like it's showing the table of contents.

00:49:02.060 --> 00:49:06.120
But if you say run all cells, it'll actually show you as you go.

00:49:06.120 --> 00:49:15.560
It'll sort of like go down the table of contents showing where in like some big doc, if the running cell is off the screen, what it's working on currently, which is actually pretty excellent, I think.

00:49:15.700 --> 00:49:20.100
And even soon, you would also report that one cell crashed and you should look at it.

00:49:20.100 --> 00:49:25.360
That's coming up in the next version.

00:49:25.360 --> 00:49:27.420
Okay, excellent.

00:49:27.420 --> 00:49:28.460
What else?

00:49:28.460 --> 00:49:32.860
Running kernels in the side panel sounds kind of interesting, like different kernels.

00:49:32.860 --> 00:49:36.780
You can go create notebooks based on them and see all of what is at play.

00:49:36.780 --> 00:49:39.180
I think that's probably worthwhile as well.

00:49:39.380 --> 00:49:45.920
Yeah, so this is more something you would care about if you're running JupyterLab than notebooks.

00:49:45.920 --> 00:49:54.260
So it's a sidebar in JupyterLab that just says, in the environment where you're running, here are all the kernels that you as a user can see.

00:49:54.260 --> 00:50:03.280
And so you can even have kernels that might not be coming from your Jupyter server at some future date, right?

00:50:03.320 --> 00:50:12.920
The idea being, why shouldn't JupyterLab be the place you interact with lots of different resources, wherever they might be?

00:50:12.920 --> 00:50:24.280
And for the longest time, we thought of a running kernel session, for want of a better word, as intricately tied to a file, right?

00:50:24.280 --> 00:50:26.160
The notebook that it's the kernel for.

00:50:26.160 --> 00:50:28.100
But, you know, we've been moving away from that.

00:50:28.100 --> 00:50:32.000
I mean, the same way IPython hits a kernel, but isn't really transient.

00:50:32.000 --> 00:50:35.740
We have code consoles inside of JupyterLab that aren't really transient.

00:50:35.740 --> 00:50:43.640
But you can take a notebooks kernel and open a code console on it so that you could do some scratch work, but like not modify your document.

00:50:43.640 --> 00:50:48.900
So there's just having more insight into what's available in your environment is what that's about.

00:50:48.900 --> 00:50:50.880
And again, it's not a revolutionary change.

00:50:50.880 --> 00:50:59.920
It's just one of these sort of ergonomic features to make it a better multi-tool for being in an environment that gives you lots of different kernels to play with.

00:50:59.920 --> 00:51:08.480
Like the sort of use case that we'd like to tackle with this is, for example, there are lots of desktop applications that embed a Python interpreter, like FreeCAD or Blender.

00:51:09.280 --> 00:51:20.540
And eventually, if these desktop applications advertise a way to connect to these running interpreters with a Jupyter or kernel API, then they would be listed there.

00:51:20.540 --> 00:51:28.220
So the JupyterLab could almost become a scripting front end to like a running Blender project or something like that?

00:51:28.220 --> 00:51:28.560
Exactly.

00:51:28.820 --> 00:51:34.700
So this has already been done, actually, in Kitware's Slicer 3D project.

00:51:34.700 --> 00:51:38.420
So they run a kernel as part of their desktop application.

00:51:38.420 --> 00:51:44.040
And so we want to streamline the use case and make it more easier to do.

00:51:44.040 --> 00:51:49.560
Yeah, I'm sure the UI for a lot of people's hosted integrated Python is really poor.

00:51:49.560 --> 00:51:54.480
You know, there's probably maybe you'll get auto indentation if you're lucky, right?

00:51:54.560 --> 00:51:57.320
You know, like it's just there's not a there's not a great story.

00:51:57.320 --> 00:52:01.880
So they could just like the other examples we talked about build upon what JupyterLab is already doing.

00:52:01.880 --> 00:52:03.780
Just add their part.

00:52:03.780 --> 00:52:04.280
Yeah, exactly.

00:52:04.280 --> 00:52:07.380
Rather than them having to reinvent everything, they can just reuse Jupyter.

00:52:07.380 --> 00:52:07.860
Yeah.

00:52:07.860 --> 00:52:08.140
Yeah.

00:52:08.140 --> 00:52:15.060
And because of the extensions, you could theoretically have like a Blender extension for JupyterLab, potentially.

00:52:15.060 --> 00:52:16.680
Actually, someone has made one.

00:52:16.960 --> 00:52:25.560
So for the specific use case, I think it's Jan Hendrick Muller has a Blender extension to render Blender model in line in the notebook.

00:52:25.560 --> 00:52:26.940
So, yeah, check it out.

00:52:26.940 --> 00:52:27.520
Excellent.

00:52:27.520 --> 00:52:28.300
All right, y'all.

00:52:28.300 --> 00:52:29.860
We are getting very short on time here.

00:52:29.860 --> 00:52:33.300
There's two things I want to touch on really quick before we put a wrap on it.

00:52:33.300 --> 00:52:37.000
These are not exactly like brand new things, but they're very exciting.

00:52:37.000 --> 00:52:39.520
And one is Jupyter Lite.

00:52:39.520 --> 00:52:41.640
And Jeremy, I know you've done a lot with Jupyter Lite.

00:52:41.640 --> 00:52:44.440
You want to tell us quick about Jupyter Lite?

00:52:44.440 --> 00:52:45.180
Yeah, sure.

00:52:45.540 --> 00:52:52.220
The idea behind Jupyter Lite is to have a full Jupyter distribution that runs in a web browser.

00:52:52.220 --> 00:53:01.820
So normally when you use Jupyter, you need to install JupyterLab package, Python package, or the notebook Python package on your machine or on a server.

00:53:01.820 --> 00:53:04.680
But with Jupyter Lite, you don't need to do this.

00:53:04.680 --> 00:53:09.380
So in the end, what you get is just a set of static files.

00:53:09.380 --> 00:53:11.880
So it's just a bunch of files sitting on disk.

00:53:12.240 --> 00:53:16.000
You just have HTML, CSS, JavaScript, and WebAssembly.

00:53:16.000 --> 00:53:27.060
So the main difference compared to a traditional Jupyter installation is the fact that the execution, the environment runs in a browser as well.

00:53:27.060 --> 00:53:29.080
So, for example, Python.

00:53:29.080 --> 00:53:33.260
But it could also be other languages that are compiled to WebAssembly.

00:53:33.580 --> 00:53:37.840
All of this is, again, built on the shoulder of giants.

00:53:37.840 --> 00:53:38.660
Yeah, this is awesome.

00:53:38.660 --> 00:53:39.700
This is so awesome.

00:53:39.700 --> 00:53:44.740
The Jupyter stack is just another way of kind of remixing the whole stack.

00:53:44.740 --> 00:53:52.940
So, you know, you take a bit of JupyterLab, a little bit of the Jupyter protocol to interact with the kernels.

00:53:52.940 --> 00:53:56.800
And then even the kernels can be reused in some way.

00:53:56.800 --> 00:53:59.540
And then you put that together and make something new.

00:53:59.540 --> 00:54:01.720
So that's the idea behind Jupyter Lite.

00:54:01.720 --> 00:54:07.000
It was also made possible by the work on the Pyodide.

00:54:07.360 --> 00:54:10.020
So this is Python compared to WebAssembly.

00:54:10.020 --> 00:54:21.000
Since Python is still the most heavily used language in Jupyter, this is kind of what people expect when they use Jupyter and Jupyter Lite to have a Python kernel.

00:54:21.200 --> 00:54:28.380
So if I wanted to, say, host some interactive code exploration, I want to have something that people can play with.

00:54:28.380 --> 00:54:35.580
Maybe I'm an educator and I've got a thousand students, but I don't want to set up a server and worry about what people might do to it.

00:54:35.580 --> 00:54:37.300
But I want to give them flexibility, right?

00:54:37.300 --> 00:54:38.440
Like, this is really nice.

00:54:38.440 --> 00:54:41.600
You could just put this on a static file server like Netlify.

00:54:41.600 --> 00:54:43.280
Yeah, that's definitely a use case.

00:54:43.280 --> 00:54:45.720
So GitHub Pages, Arita Docs.

00:54:45.760 --> 00:54:46.680
It's very simple.

00:54:46.680 --> 00:54:51.620
It's much simpler than having to do sysadmin work to install packages.

00:54:51.620 --> 00:54:56.020
And also for the end user, it's also simpler because you don't have to install anything.

00:54:56.020 --> 00:54:57.940
Everything is already prepackaged.

00:54:57.940 --> 00:54:58.620
It's crazy.

00:54:58.620 --> 00:55:01.540
It looks just like JupyterLab, you know, but it's...

00:55:01.540 --> 00:55:03.700
Because it is, in the end, just JupyterLab.

00:55:03.700 --> 00:55:04.000
Yeah.

00:55:04.000 --> 00:55:06.940
And there is also Notebook 7 running as well.

00:55:06.940 --> 00:55:15.980
So again, like we were talking about earlier, if some users prefer to have this document-centric interface, then they can also use Notebook 7 instead.

00:55:15.980 --> 00:55:17.060
It's excellent.

00:55:17.060 --> 00:55:23.840
If you want to give access to some notebook but not run a server, I think there's kind of two options here.

00:55:23.840 --> 00:55:24.820
This is one of them.

00:55:24.820 --> 00:55:34.120
The other is if I'm going to give a notebook file to somebody and say, here, run this on your computer, there's a lot of assumptions about what happens at that point.

00:55:34.120 --> 00:55:35.100
Do you have Python?

00:55:35.100 --> 00:55:35.920
Do you have the right Python?

00:55:35.920 --> 00:55:39.980
Do you have permissions to install Jupyter and all the other dependencies?

00:55:39.980 --> 00:55:41.240
Can you run a server?

00:55:41.240 --> 00:55:42.620
Do you know what a terminal is?

00:55:42.620 --> 00:55:44.700
Like, that's a long conversation.

00:55:44.700 --> 00:55:56.580
And so I think the other thing that's really interesting, I don't know where I pulled it up, but yeah, Jupyter Desktop is also quite interesting as a quick start to getting a Jupyter Python environment on your system, right?

00:55:56.580 --> 00:55:58.980
Yeah, that's some work done by Mehmet.

00:55:58.980 --> 00:56:03.380
And basically, it bundled an Electron.

00:56:03.600 --> 00:56:06.720
So it's a web browser that's packaged with Jupyter Lab.

00:56:06.720 --> 00:56:15.480
And it's very powerful because now it can come with its own Python, but you can also use the Python that you have on your computer.

00:56:15.480 --> 00:56:26.080
And yeah, that's really a nice way for distributing and easing the installation for the end user, especially on non-friendly operating systems.

00:56:26.200 --> 00:56:27.200
Sure.

00:56:27.200 --> 00:56:28.200
Sure.

00:56:28.200 --> 00:56:31.580
Or people who are not familiar with it.

00:56:31.580 --> 00:56:31.980
Yeah.

00:56:31.980 --> 00:56:32.980
That's true.

00:56:32.980 --> 00:56:33.940
Like, yeah.

00:56:33.940 --> 00:56:35.600
I mean, you've got a Mac.

00:56:35.600 --> 00:56:39.160
Well, there is a macOS ARM and 64 version.

00:56:39.160 --> 00:56:40.440
There's a Debut and a Fedora.

00:56:40.440 --> 00:56:42.340
There's a Windows EXE.

00:56:42.340 --> 00:56:43.340
Like, that's...

00:56:43.340 --> 00:56:50.060
No, it really solves the problem of I've never used the command line, but I know lots of math, right?

00:56:50.060 --> 00:56:51.000
So...

00:56:51.000 --> 00:56:51.420
Yes, exactly.

00:56:51.660 --> 00:56:55.880
But when I run MATLAB, I just click the MATLAB icon and then I get that shell.

00:56:55.880 --> 00:56:56.920
What is...

00:56:56.920 --> 00:56:59.820
Why can't I have permissions to install Jupyter?

00:56:59.820 --> 00:57:01.280
It says I don't have...

00:57:01.280 --> 00:57:01.860
No, I get it.

00:57:01.860 --> 00:57:04.520
Like, that whole frustration side could go away, I think.

00:57:04.520 --> 00:57:05.300
This is interesting.

00:57:05.560 --> 00:57:14.380
But, I mean, this is a harder problem than one might imagine just because of how many packages there are on the ecosystem, what things you might be using.

00:57:14.380 --> 00:57:17.860
So, JupyterLab Desktop is pretty clever.

00:57:17.860 --> 00:57:23.460
It can also detect if you have Conda or Mamba installed and use those environments.

00:57:23.460 --> 00:57:26.980
It can use a running server.

00:57:27.320 --> 00:57:30.160
So, it shifts with the newest version of JupyterLab, right?

00:57:30.160 --> 00:57:35.500
But it could also connect to a server that's serving a different version of JupyterLab and give you that.

00:57:35.500 --> 00:57:38.040
It can be a client to different JupyterLabs is what I mean.

00:57:38.040 --> 00:57:45.360
One time, just to see if it would work, I ran Jupyter Notebook and Lab and Desktop with real-time collaboration.

00:57:45.360 --> 00:57:46.900
And it turns out you could do that.

00:57:46.900 --> 00:57:52.840
So, it really is like first-class JupyterLab and it's very flexible and it tries to integrate with what you've got.

00:57:52.840 --> 00:57:55.000
If you've got nothing, it brings what it needs.

00:57:55.440 --> 00:57:58.160
If you've got Conda set up, it finds stuff there.

00:57:58.160 --> 00:57:59.940
If you've got Mamba set up, it finds stuff there.

00:57:59.940 --> 00:58:06.740
So, it basically tries to be exactly what that first user experience you would want is.

00:58:06.740 --> 00:58:08.940
You go, you download, you double-click a file.

00:58:08.940 --> 00:58:12.480
The only thing that's missing is you have to go to GitHub to get this.

00:58:12.480 --> 00:58:15.220
We should probably put it in an easier place for you to find.

00:58:15.220 --> 00:58:16.080
Yeah, possibly.

00:58:16.080 --> 00:58:18.860
Like, maybe in the various stores.

00:58:18.860 --> 00:58:19.840
I don't know.

00:58:19.840 --> 00:58:20.640
That's such a hassle.

00:58:20.640 --> 00:58:23.580
Well, no, I just mean go to jupyter.org slash download.

00:58:23.580 --> 00:58:24.760
I just set a URL.

00:58:24.940 --> 00:58:26.560
Sadly, it's not going to work for you.

00:58:26.560 --> 00:58:27.600
But maybe we should do that.

00:58:27.600 --> 00:58:28.260
Yes, exactly.

00:58:28.260 --> 00:58:30.540
That would be a pretty easy thing to do, actually.

00:58:30.540 --> 00:58:35.140
Just detect the OS and highlight that or have that little drop down and choose another OS, right?

00:58:35.140 --> 00:58:35.660
See all downloads.

00:58:35.860 --> 00:58:42.000
I think these two options are going to really make it possible to reach the next 10 million users of Jupyter.

00:58:42.820 --> 00:58:47.680
Especially Jupyter Lite in terms of Jupyter Lite in terms of scalability is unmatched at the moment.

00:58:47.680 --> 00:58:55.820
There is a deployment of an in-browser Jupyter flavor in use at the moment by the French high school system.

00:58:55.820 --> 00:58:59.360
They started with the Paris area and now they enabled all the school districts.

00:58:59.640 --> 00:59:04.020
There is over half a million users on this deployment.

00:59:04.020 --> 00:59:06.120
200,000 sessions per week.

00:59:06.120 --> 00:59:08.980
And it's also one single virtual machine.

00:59:08.980 --> 00:59:16.160
And if they were trying to do this with a one Docker image per user session, it wouldn't fly.

00:59:16.160 --> 00:59:19.000
They'd need a massive IT team to pull that off.

00:59:19.000 --> 00:59:19.460
Exactly.

00:59:19.460 --> 00:59:24.060
And France is not home to hyperscaler cloud providers.

00:59:24.060 --> 00:59:29.660
So we'd need to host that Azure or Alibaba or Google.

00:59:29.660 --> 00:59:32.080
And that would be an enormous cost, right?

00:59:32.080 --> 00:59:34.940
And this is incredibly cheap.

00:59:34.940 --> 00:59:37.260
There are some limitations to WebAssembly.

00:59:37.260 --> 00:59:43.140
And I mean, for the sort of use cases, what a high schooler is going to do in a notebook,

00:59:43.300 --> 00:59:47.580
like learning how to write four loops or computing your greatest command in the administrator.

00:59:47.580 --> 00:59:49.140
This is more than enough.

00:59:49.140 --> 00:59:52.420
Like the complexity of it is lesser than rendering the UI.

00:59:52.420 --> 00:59:53.680
So, yeah.

00:59:53.680 --> 00:59:55.060
I think you're absolutely right.

00:59:55.060 --> 00:59:58.660
That's why I put them both side by side, the Jupyter Lite and the Jupyter Desktop app.

00:59:58.660 --> 01:00:02.040
I think they kind of address similar audience, but in a different way.

01:00:02.040 --> 01:00:03.060
Check this out, by the way.

01:00:03.060 --> 01:00:05.040
This probably won't come through very well.

01:00:05.040 --> 01:00:07.680
But this is my iPad.

01:00:07.680 --> 01:00:12.700
And I've got Jupyter Lite working just the same on my browser there as I did.

01:00:12.800 --> 01:00:14.540
Or it'd be a Chromebook or whatever, right?

01:00:14.540 --> 01:00:16.420
Like it really reaches a big audience.

01:00:16.420 --> 01:00:16.720
Yeah.

01:00:16.720 --> 01:00:18.800
I mean, modern browsers now can all handle it.

01:00:18.800 --> 01:00:21.000
It's not the bad old days, at least on that front.

01:00:21.000 --> 01:00:26.840
There will be a lot of really exciting things that happen inside browsers that will surprise

01:00:26.840 --> 01:00:29.500
anyone who was using this era of the Web.

01:00:29.500 --> 01:00:31.480
Like we're about to see crazy things.

01:00:31.480 --> 01:00:33.220
We are about to see crazy things.

01:00:33.220 --> 01:00:34.640
Well, we already see crazy things.

01:00:34.640 --> 01:00:35.620
We'll see more of them.

01:00:35.620 --> 01:00:36.240
That's for sure.

01:00:36.240 --> 01:00:36.980
That's for sure.

01:00:36.980 --> 01:00:37.720
All right, y'all.

01:00:37.900 --> 01:00:41.000
I think we are out of time, but we are certainly not out of topics.

01:00:41.000 --> 01:00:43.920
We could keep talking for a long time, but we'll close it here.

01:00:43.920 --> 01:00:45.980
I guess final thoughts, call to action.

01:00:45.980 --> 01:00:47.320
People want to check this stuff out.

01:00:47.320 --> 01:00:53.120
Maybe they want to upgrade from an older version, either JupyterLab 4 or Jupyter Notebook 7.

01:00:53.120 --> 01:00:53.900
What do you say?

01:00:53.900 --> 01:00:55.560
Pip install notebook.

01:00:55.560 --> 01:00:58.680
Pip install JupyterLab and have fun.

01:00:58.680 --> 01:00:59.500
Dash, dash upgrade.

01:00:59.500 --> 01:01:00.220
Yes.

01:01:00.220 --> 01:01:00.960
Good point.

01:01:00.960 --> 01:01:02.760
Okay, so you already got it.

01:01:02.760 --> 01:01:03.660
Poor request, welcome.

01:01:03.660 --> 01:01:06.300
Poor request, welcome.

01:01:06.420 --> 01:01:06.660
Awesome.

01:01:06.660 --> 01:01:07.020
Yeah.

01:01:07.020 --> 01:01:10.280
So it's a huge project with lots of people involved.

01:01:10.280 --> 01:01:11.820
Frederick, final thoughts?

01:01:11.820 --> 01:01:15.280
That's a very fun project to work on too.

01:01:15.280 --> 01:01:20.400
So if people are willing to contribute, just come and contribute to it.

01:01:20.400 --> 01:01:24.540
There is plenty of spaces as we have just touched some of them here.

01:01:24.540 --> 01:01:31.640
And we are very happy to have new contributors and help people learn the ecosystem to try to contribute.

01:01:31.640 --> 01:01:33.400
And there is no small contribution.

01:01:33.400 --> 01:01:35.320
Like there is no small contribution.

01:01:35.320 --> 01:01:36.280
Everybody is welcome.

01:01:36.280 --> 01:01:36.580
Yeah.

01:01:36.580 --> 01:01:37.740
Yeah.

01:01:37.740 --> 01:01:38.200
Yeah.

01:01:38.200 --> 01:01:40.800
Somebody could set up the download page for Jupyter Desktop.

01:01:40.800 --> 01:01:41.480
Exactly.

01:01:41.480 --> 01:01:42.680
Absolutely.

01:01:42.680 --> 01:01:46.140
Jeremy, you get the final, final word.

01:01:46.140 --> 01:01:46.500
Yeah.

01:01:46.500 --> 01:01:49.220
That was what I was going to say a little bit as well.

01:01:49.220 --> 01:01:51.600
It's the Jupyter community is very welcoming.

01:01:51.600 --> 01:01:53.820
So you can contribute in many different ways.

01:01:54.220 --> 01:01:59.120
It doesn't have to be about technical details or code only.

01:01:59.120 --> 01:02:02.040
Even just putting a talk out there.

01:02:02.040 --> 01:02:14.320
First of all, going to Jupyter Cloud and sharing your use cases is already very valuable to the community and also to the developers because they can learn about how people use the tools, get a very valuable feedback.

01:02:14.720 --> 01:02:17.240
And that would be one call to action.

01:02:17.240 --> 01:02:19.760
Don't hesitate to get involved.

01:02:19.760 --> 01:02:22.160
And if you think there is room to improve, for sure.

01:02:22.160 --> 01:02:26.780
As you were saying before, PRs welcome, as we say often.

01:02:27.740 --> 01:02:39.160
And yeah, check out the latest update on JupyterLite because there is going to be exciting new updates to JupyterLab 4 and Notebook 7 coming in a couple of days.

01:02:39.160 --> 01:02:43.420
So I think maybe by the time this podcast is released, it will probably be out already.

01:02:43.420 --> 01:02:52.520
And also exciting developments when it comes to real-time collaboration in JupyterLite, JupyterLab Desktop, JupyterLab together.

01:02:52.520 --> 01:02:52.860
Yeah.

01:02:52.860 --> 01:02:53.540
Very exciting.

01:02:53.540 --> 01:02:56.260
A lot of things are already great here that we talked about.

01:02:56.260 --> 01:02:57.560
These are some big changes.

01:02:57.560 --> 01:03:01.500
So thank you all for being on the show and sharing what you and everyone else has been up to.

01:03:01.500 --> 01:03:01.860
Thank you.

01:03:01.860 --> 01:03:02.560
Thanks very much.

01:03:02.560 --> 01:03:03.060
Thank you.

01:03:03.060 --> 01:03:03.440
Yep.

01:03:03.440 --> 01:03:03.840
Thank you.

01:03:03.840 --> 01:03:04.100
Bye.

01:03:04.100 --> 01:03:07.920
This has been another episode of Talk Python To Me.

01:03:07.920 --> 01:03:09.740
Thank you to our sponsors.

01:03:09.740 --> 01:03:11.340
Be sure to check out what they're offering.

01:03:11.340 --> 01:03:12.760
It really helps support the show.

01:03:12.760 --> 01:03:18.000
Developers and data scientists are the new high-value targets.

01:03:18.000 --> 01:03:18.540
That's you.

01:03:18.540 --> 01:03:21.700
And yet this group remains severely underprotected.

01:03:21.700 --> 01:03:24.960
Phylum detects, reports, and blocks malicious packages.

01:03:24.960 --> 01:03:27.380
Get their research and join their community at Talk Python.

01:03:27.380 --> 01:03:29.840
Talk Python.fm slash phylum dash research.

01:03:29.840 --> 01:03:32.520
Python Tutor.

01:03:32.520 --> 01:03:38.020
Visualize your Python code step-by-step to understand just what's happening with your code.

01:03:38.020 --> 01:03:43.480
Try it for free and anonymously at talkpython.fm/Python dash tutor.

01:03:45.260 --> 01:03:46.480
Want to level up your Python?

01:03:46.480 --> 01:03:50.640
We have one of the largest catalogs of Python video courses over at Talk Python.

01:03:50.640 --> 01:03:55.720
Our content ranges from true beginners to deeply advanced topics like memory and async.

01:03:56.120 --> 01:03:58.380
And best of all, there's not a subscription in sight.

01:03:58.380 --> 01:04:01.280
Check it out for yourself at training.talkpython.fm.

01:04:01.580 --> 01:04:03.360
Be sure to subscribe to the show.

01:04:03.360 --> 01:04:06.140
Open your favorite podcast app and search for Python.

01:04:06.140 --> 01:04:07.460
We should be right at the top.

01:04:07.460 --> 01:04:12.620
You can also find the iTunes feed at /itunes, the Google Play feed at /play,

01:04:12.620 --> 01:04:16.820
and the direct RSS feed at /rss on talkpython.fm.

01:04:17.220 --> 01:04:19.780
We're live streaming most of our recordings these days.

01:04:19.780 --> 01:04:23.180
If you want to be part of the show and have your comments featured on the air,

01:04:23.180 --> 01:04:27.600
be sure to subscribe to our YouTube channel at talkpython.fm/youtube.

01:04:27.600 --> 01:04:29.660
This is your host, Michael Kennedy.

01:04:29.660 --> 01:04:30.960
Thanks so much for listening.

01:04:30.960 --> 01:04:32.120
I really appreciate it.

01:04:32.120 --> 01:04:34.020
Now get out there and write some Python code.

01:04:34.020 --> 01:04:54.900
I'll see you next time.

