WEBVTT

00:00:00.001 --> 00:00:04.620
Have you come across a GitHub repo with a Jupyter notebook that has a run in Binder button?

00:00:04.620 --> 00:00:09.720
It seems magical. How does it know what dependencies and external libraries you might need?

00:00:09.720 --> 00:00:15.180
And where does it run anyway? Like all technology, it's not magic. It's the result of hard work by

00:00:15.180 --> 00:00:20.460
people behind the project. In this case, mybinder.org. On this episode, you'll meet Tim Head,

00:00:20.460 --> 00:00:24.640
who has been working to bring Binder to us all. Take a look inside mybinder.org,

00:00:24.640 --> 00:00:30.580
how it works, and the history of the project. This is Talk Python To Me, episode 256, recorded

00:00:30.580 --> 00:00:50.280
February 20th, 2020. Welcome to Talk Python To Me, a weekly podcast on Python, the language,

00:00:50.280 --> 00:00:54.460
the libraries, the ecosystem, and the personalities. This is your host, Michael Kennedy,

00:00:54.920 --> 00:00:59.220
follow me on Twitter where I'm @mkennedy, keep up with the show and listen to past episodes at

00:00:59.220 --> 00:01:04.840
talkpython.fm, and follow the show on Twitter via at Talk Python. This episode is brought to you by

00:01:04.840 --> 00:01:10.080
Linode and Talk Python Training. Be sure to check out what the offers are for both of these segments.

00:01:10.080 --> 00:01:14.460
It really helps support the show. Tim, welcome to Talk Python To Me.

00:01:14.460 --> 00:01:15.020
Hi, Mike.

00:01:15.020 --> 00:01:18.940
It's great to have you on the show, and I'm really looking forward to learning more about Binder.

00:01:18.940 --> 00:01:25.500
It's fantastic to be on the show and to talk to you about Binder, what we do, how it came to be,

00:01:25.500 --> 00:01:29.420
and hopefully how it will continue forever in the future.

00:01:29.420 --> 00:01:37.280
I hope so. It's definitely going to continue in some sense, no matter what, where GitHub is taking

00:01:37.280 --> 00:01:44.600
all of the public repositories and encoding them on tape and putting them in some vault in some Nordic country.

00:01:44.600 --> 00:01:50.560
I can't remember exactly where, but it's probably already been archived there for the world.

00:01:50.560 --> 00:01:54.680
So it's definitely going to continue, but I hope it continues actively as well.

00:01:54.680 --> 00:02:02.920
Yeah, that sounds good. We have a contributor who lives in Norway, so maybe we should try and organize

00:02:02.920 --> 00:02:05.800
a trip to wherever this vault is.

00:02:05.800 --> 00:02:10.900
Yes, exactly. I can't remember where it is, which country it's in, but yeah, it's up there.

00:02:10.900 --> 00:02:12.380
It's got to be near Norway. Pretty cool.

00:02:12.380 --> 00:02:17.660
All right, now, I'm definitely looking forward to talking about Binder and learning more and a lot

00:02:17.660 --> 00:02:21.700
of the behind-the-scenes stuff. But before we get to all that, let's just start with your story.

00:02:21.700 --> 00:02:23.200
How did you get into programming and Python?

00:02:23.200 --> 00:02:31.580
So when I was a teenager, I wanted to do what everybody 20 years ago wanted to do, is build websites.

00:02:31.580 --> 00:02:38.180
And at the time, my dad told me, oh yeah, maybe you should check out Python.

00:02:38.180 --> 00:02:42.400
And then they had this fantastic web server called Zope.

00:02:42.400 --> 00:02:50.620
And then I learned how to use that and make forum software and other little websites like that.

00:02:50.620 --> 00:02:52.060
And that's how I got into Python.

00:02:52.060 --> 00:02:58.140
And if you wanted to be mean, never really learn any other programming languages.

00:02:58.140 --> 00:03:00.240
If you don't have to.

00:03:00.240 --> 00:03:03.460
I think there's value in other programming languages.

00:03:04.080 --> 00:03:09.260
But people who know Python are in a bit of a special place because it's so widely used

00:03:09.260 --> 00:03:12.440
and accepted, you're not forced to go learn something else necessarily.

00:03:12.440 --> 00:03:16.280
Other than JavaScript, everybody's forced to learn JavaScript if you want to do anything on

00:03:16.280 --> 00:03:16.560
the web.

00:03:16.560 --> 00:03:17.360
Yeah, that's right.

00:03:17.360 --> 00:03:19.100
So I know a little bit of JavaScript.

00:03:19.100 --> 00:03:29.420
And I was a physics student at university and then worked at CERN as well as a physicist.

00:03:29.420 --> 00:03:31.880
And there we write a lot of C++.

00:03:31.880 --> 00:03:36.620
So staring at assembler code is the other thing I do.

00:03:36.620 --> 00:03:36.840
Yeah.

00:03:36.840 --> 00:03:39.040
So are you still working at CERN?

00:03:39.040 --> 00:03:42.260
So no, I'm not an academic anymore.

00:03:42.260 --> 00:03:45.200
You've hung up your tweed jacket and your pipe?

00:03:45.200 --> 00:03:46.140
Yeah.

00:03:46.140 --> 00:03:46.520
Yeah.

00:03:46.520 --> 00:03:50.480
Actually, I'm not sure if you get those before you become a professor.

00:03:50.480 --> 00:03:55.380
Maybe only when you get a tenure, maybe full professor, you get the hat at the end.

00:03:55.380 --> 00:03:55.580
Yeah.

00:03:55.580 --> 00:03:56.020
Yeah.

00:03:56.020 --> 00:03:57.200
Yeah.

00:03:57.200 --> 00:04:04.720
So I think three or four years ago, I left academia and thought there was no better thing

00:04:04.720 --> 00:04:09.120
to do in your life than be unemployed and moved to Switzerland on the same day.

00:04:09.120 --> 00:04:16.180
And I started my own business, started my own small consulting company around data science,

00:04:16.180 --> 00:04:18.400
machine learning, that kind of stuff.

00:04:18.820 --> 00:04:24.580
And today I work for a small company in Zurich that is called Scribble.

00:04:24.580 --> 00:04:30.380
So like you scribble on a piece of paper and we do electronic signatures.

00:04:30.380 --> 00:04:37.900
So if you need to sign documents which require legal signatures, you should come to us.

00:04:37.900 --> 00:04:38.200
Okay.

00:04:38.200 --> 00:04:38.720
Yeah.

00:04:38.720 --> 00:04:39.060
Yeah.

00:04:39.060 --> 00:04:39.560
Super cool.

00:04:39.560 --> 00:04:41.240
What was it like working at CERN?

00:04:41.460 --> 00:04:44.580
Oh, it was one of the best places I've worked in my life.

00:04:44.580 --> 00:04:48.820
There's a reason the competition to work there is so crazy.

00:04:48.820 --> 00:04:49.840
Yeah.

00:04:49.840 --> 00:04:50.360
It's fantastic.

00:04:50.360 --> 00:04:56.140
It seems like a really amazing place and it's one of the true cutting edge places where science

00:04:56.140 --> 00:04:57.680
is happening these days.

00:04:57.680 --> 00:05:02.380
And they also didn't set the atmosphere on fire or create a black hole or anything like

00:05:02.380 --> 00:05:02.560
that.

00:05:02.560 --> 00:05:03.240
So it was all good.

00:05:03.240 --> 00:05:03.680
Yeah.

00:05:04.020 --> 00:05:08.220
It's a great place to work and I really, really enjoyed it.

00:05:08.220 --> 00:05:12.780
But at some point decided it wasn't what I wanted to keep doing.

00:05:12.780 --> 00:05:13.600
Sure.

00:05:13.600 --> 00:05:16.140
And so I switched to do something else.

00:05:16.140 --> 00:05:16.560
Yeah.

00:05:16.560 --> 00:05:19.120
You know, I said I was in academics for a while.

00:05:19.120 --> 00:05:22.640
I'm working in math and I really loved it.

00:05:22.640 --> 00:05:26.740
But in the end, I felt like I could just have more impact and just do more interesting,

00:05:26.740 --> 00:05:31.680
concrete stuff with programming than I could with, you know, just math ideas.

00:05:31.680 --> 00:05:32.000
Yeah.

00:05:32.000 --> 00:05:32.700
Yeah.

00:05:32.700 --> 00:05:33.160
I've been there.

00:05:33.160 --> 00:05:33.760
I've been there with you.

00:05:33.760 --> 00:05:40.280
Now, let's start this conversation at the high level before we dive down into Binder,

00:05:40.280 --> 00:05:45.580
which is a tool we're working with and hosting notebooks in a special way.

00:05:45.580 --> 00:05:47.880
Hopefully I got that roughly right.

00:05:47.880 --> 00:05:48.920
Yeah.

00:05:48.920 --> 00:05:49.180
Yeah.

00:05:49.180 --> 00:05:50.180
That's about right.

00:05:50.180 --> 00:05:50.460
Cool.

00:05:50.460 --> 00:05:52.280
But let's start at a high level.

00:05:52.280 --> 00:05:54.600
Just like, what's the state of notebooks today?

00:05:54.600 --> 00:05:56.760
Now, just a little background on me.

00:05:56.760 --> 00:06:03.560
If you don't know, I do more on the website, database side, random utility side.

00:06:03.560 --> 00:06:05.880
Not as much data science.

00:06:05.880 --> 00:06:06.200
Right.

00:06:06.200 --> 00:06:08.420
Although I do pay attention to whatnot.

00:06:08.420 --> 00:06:10.580
It's not where I live day to day.

00:06:10.780 --> 00:06:14.820
So I'm genuinely asking, like, what's the state of notebooks today, do you think?

00:06:14.820 --> 00:06:18.680
I think it is more exciting than it's ever been.

00:06:18.680 --> 00:06:23.040
When notebooks started and, you know, you can discuss on who invented them.

00:06:23.040 --> 00:06:32.700
But for a long time, it was a tool for describing what you were doing to a human and to the computer simultaneously.

00:06:32.700 --> 00:06:39.220
Because you have the narrative text for humans and the computer text code for the computer.

00:06:40.220 --> 00:06:45.340
And now people are, like, going crazy, you know?

00:06:45.340 --> 00:06:50.240
People are trying to automatically turn notebooks into web applications.

00:06:50.240 --> 00:07:00.760
People are wanting to run, like, only small parts of their notebook and make it look like it's within a normal editor.

00:07:00.760 --> 00:07:03.880
And it's like a text file kind of thing.

00:07:03.980 --> 00:07:06.020
How can we make a notebook, which...

00:07:06.020 --> 00:07:06.480
Right, right.

00:07:06.480 --> 00:07:11.000
Both, like, PyCharm and VS Code have that kind of flavor, right?

00:07:11.000 --> 00:07:13.460
There's, like, a special comment that separates the cells.

00:07:13.460 --> 00:07:16.520
But you're kind of in a text file, in one of their views, at least.

00:07:16.740 --> 00:07:17.460
Exactly, yeah.

00:07:17.460 --> 00:07:20.840
And I don't use it very much, so I'm not sure.

00:07:20.840 --> 00:07:26.880
But I think you can then just highlight lines and say, run these lines in my file.

00:07:26.880 --> 00:07:27.860
Right.

00:07:27.860 --> 00:07:29.600
Which, I mean, yeah.

00:07:29.600 --> 00:07:33.540
You can imagine doing all sorts of completely crazy stuff that way.

00:07:33.540 --> 00:07:34.480
Yeah, it's pretty exciting.

00:07:34.480 --> 00:07:38.940
And there's a lot of online hosted places as well, right?

00:07:38.940 --> 00:07:43.100
Google and Azure both have ways in which you can log into your notebooks.

00:07:43.100 --> 00:07:44.680
And it may cost some money.

00:07:44.680 --> 00:07:45.380
They may be free.

00:07:45.380 --> 00:07:46.360
It depends, right?

00:07:46.620 --> 00:07:46.860
Yeah.

00:07:46.860 --> 00:07:52.340
So there's Google CoLab, Azure Notebooks.

00:07:52.340 --> 00:07:56.740
Various startups offer it as a service.

00:07:56.740 --> 00:08:01.980
There's a service called CoCalc that offers hosted notebooks.

00:08:01.980 --> 00:08:05.200
So there's a lot of people out there who do it.

00:08:05.200 --> 00:08:08.080
And mybinder.org is one of them.

00:08:08.080 --> 00:08:08.400
Okay.

00:08:08.400 --> 00:08:14.060
I guess it's probably a good time to talk about Binder and, like, where does it fit in this world?

00:08:14.360 --> 00:08:19.720
So Binder, what we offer people is that you send a link to somebody else.

00:08:20.380 --> 00:08:21.100
And they click on it.

00:08:21.100 --> 00:08:21.720
And they click on it.

00:08:21.720 --> 00:08:28.760
And if you did everything right, they can just run whatever code you wanted them to run.

00:08:29.100 --> 00:08:31.320
For example, you wanted them to try out.

00:08:31.320 --> 00:08:32.900
It should just work.

00:08:32.900 --> 00:08:34.160
And it runs in their browser.

00:08:34.160 --> 00:08:37.000
So they can do it from their tablet, from their phone.

00:08:37.000 --> 00:08:40.560
If they want to use a laptop, they can use a laptop as well.

00:08:40.560 --> 00:08:42.300
But they don't have to install anything.

00:08:42.300 --> 00:08:43.840
Do anything like this.

00:08:44.040 --> 00:08:49.420
And in that sense, it's just another notebook hosting service.

00:08:49.420 --> 00:08:54.000
The twist is that you cannot create an account.

00:08:54.000 --> 00:08:57.340
There is no way for you to make an account with us.

00:08:57.340 --> 00:08:57.980
Okay.

00:08:57.980 --> 00:09:05.680
And that means you can just send the link to everybody and it will just start, which I think is fantastic.

00:09:05.680 --> 00:09:17.180
So people use it a lot, for example, for workshops, because everybody knows that a tutorial or workshop they went to where they spent the first half of the workshop trying to get everybody set up.

00:09:17.180 --> 00:09:17.440
Right.

00:09:17.600 --> 00:09:23.400
And with a service like mybinder.org, you can send them all the link.

00:09:23.400 --> 00:09:31.000
And if the class is not ginormous, they follow the link and then they have something that they can use for the workshop.

00:09:31.000 --> 00:09:35.720
Then you can spend maybe the end of the workshop teaching them how to set it up locally.

00:09:35.720 --> 00:09:37.140
But you can get going.

00:09:37.140 --> 00:09:40.700
And binder is something that you could set up locally?

00:09:40.700 --> 00:09:46.720
Or maybe they would focus more just on here's how you set up this particular project with these notebooks and these requirements.

00:09:46.720 --> 00:09:48.320
I guess either, huh?

00:09:48.320 --> 00:09:49.820
But more likely the latter.

00:09:49.820 --> 00:09:52.300
The answer is it depends what you want to do.

00:09:52.300 --> 00:09:57.660
Imagine, like, how would I set up something that I can use for my course?

00:09:57.660 --> 00:10:03.820
I would create a GitHub repository and I would put, for example, a requirements.txt in it.

00:10:03.820 --> 00:10:10.640
And as human instructions, I would write, please run pip install minus r requirements.txt.

00:10:12.140 --> 00:10:23.480
And this is such a common pattern that for mybinder.org, we built a tool that goes looking for these files and says, aha, I found a requirements.txt.

00:10:23.480 --> 00:10:29.260
I bet you the author of this repo wanted us to run pip install minus r requirements.txt.

00:10:30.260 --> 00:10:35.640
And in an overwhelming number of cases, that is what the author wanted us to do.

00:10:35.640 --> 00:10:37.480
So that's what we automate.

00:10:37.480 --> 00:10:44.560
And so the end goal is that we didn't invent any new way of setting up your software.

00:10:44.560 --> 00:10:50.280
We tried to just spot the patterns of what lots of people are already doing.

00:10:50.480 --> 00:10:52.100
That makes it easy to automate.

00:10:52.100 --> 00:10:57.820
But it means also it should be fairly straightforward to then do it locally.

00:10:57.820 --> 00:10:58.280
Right.

00:10:58.280 --> 00:11:03.620
Because as long as you follow the same basic patterns as was intended anyway, then you're good.

00:11:03.620 --> 00:11:07.840
But you get to avoid all of the challenge of, oh, wait, I don't have Python.

00:11:07.840 --> 00:11:15.040
Or when I type Python, it says that print has these weird semicolon or these parentheses or, you know, some weird thing.

00:11:15.040 --> 00:11:20.120
It's like print is not a function or I don't know, whatever it's going to say, because they have Python too.

00:11:20.120 --> 00:11:27.540
And they didn't know that when they type Python, they got the wrong Python, but they don't have permission to install the right Python.

00:11:27.540 --> 00:11:31.660
And there's just like, yeah, there's just layers of these challenges.

00:11:31.660 --> 00:11:36.420
And the problem is often like that's the first thing to hit people.

00:11:36.420 --> 00:11:36.680
Right.

00:11:36.680 --> 00:11:40.720
Like in a couple of weeks, they're probably fine to be addressing these issues ago.

00:11:40.720 --> 00:11:42.220
Yeah, I understand what's happening.

00:11:42.220 --> 00:11:43.020
I'm going to fix this.

00:11:43.100 --> 00:11:45.220
But that's not what you want to be.

00:11:45.220 --> 00:11:46.500
Welcome to Python.

00:11:46.500 --> 00:11:49.820
Here's your four problems to struggle through and set up.

00:11:49.820 --> 00:11:50.020
Right.

00:11:50.020 --> 00:11:50.580
Exactly.

00:11:50.580 --> 00:11:56.560
And it takes an infinite or seemingly infinite amount of time to debug all these problems.

00:11:56.560 --> 00:12:02.680
If you have a group of 30 people, I guarantee there is going to be people there who have a problem you've never seen before.

00:12:02.680 --> 00:12:09.180
And now as the person trying to run the course, you're like, oh, my God, we're going to do some life debugging.

00:12:09.180 --> 00:12:11.080
That's not what I wanted to show.

00:12:11.080 --> 00:12:12.020
Yeah, exactly.

00:12:12.240 --> 00:12:15.700
It's the way that a lot of training sessions begin or a lot of workshops begin.

00:12:15.700 --> 00:12:19.540
It's definitely not a good impression for the students.

00:12:19.540 --> 00:12:21.180
And it's certainly not productive time.

00:12:21.180 --> 00:12:23.020
So this is really nice.

00:12:23.020 --> 00:12:23.260
Right.

00:12:23.260 --> 00:12:24.660
So you can set this up.

00:12:24.660 --> 00:12:29.160
Typically, I don't know, all the workshops and trainings I did all had GitHub repos.

00:12:29.160 --> 00:12:32.180
And it's like, hey, here's your GitHub repo for the stuff we're giving you.

00:12:32.180 --> 00:12:33.020
Here's the repo.

00:12:33.640 --> 00:12:36.860
Here's the part of the repo where it has the code that you're given.

00:12:36.860 --> 00:12:39.020
Here's the code where I'm going to write and I'll put it in there later.

00:12:39.020 --> 00:12:40.360
Get started.

00:12:40.360 --> 00:12:42.180
And that's a perfect fit for Binder, right?

00:12:42.180 --> 00:12:42.700
Exactly.

00:12:42.700 --> 00:12:43.040
Yeah.

00:12:43.160 --> 00:12:52.580
And we started a lot of people who work on Binder come from the Project Jupyter ecosystem.

00:12:53.100 --> 00:12:55.520
So there's a strong focus on notebooks.

00:12:55.520 --> 00:13:04.680
But now there are examples where you've replaced the UI of notebooks with VS Code because VS Code is also just a web app.

00:13:04.680 --> 00:13:07.480
Actually, you can start if you wanted to.

00:13:07.620 --> 00:13:15.380
You could start a repo, which to the users, presenters of it, it's just VS Code in the cloud somewhere.

00:13:15.380 --> 00:13:16.200
Oh, no kidding.

00:13:16.200 --> 00:13:18.280
Now, I knew VS Code did that.

00:13:18.280 --> 00:13:23.120
I knew that that's something they announced under the term Visual Studio Online.

00:13:23.120 --> 00:13:27.740
And also Coder.com was doing that as well.

00:13:27.740 --> 00:13:30.080
But how do you guys do that?

00:13:30.080 --> 00:13:36.500
Like, I guess VS Code will let you set that up for your own environment, not just for theirs.

00:13:36.500 --> 00:13:37.200
Is that how it works?

00:13:37.380 --> 00:13:44.340
So we actually take advantage of the very hard work Coder.com, I think.

00:13:44.340 --> 00:13:53.300
I'll give them a shout out because I think they're the people who did all the work for the VS Code port or modifications.

00:13:53.300 --> 00:13:54.700
I'm not sure what you call it.

00:13:54.700 --> 00:13:58.080
It does run as a web app.

00:13:58.080 --> 00:13:58.740
Right, right.

00:13:58.740 --> 00:14:04.080
Coder.com is definitely the first experience that I've seen where that was happening.

00:14:04.080 --> 00:14:04.500
Yeah.

00:14:04.500 --> 00:14:04.800
Yeah.

00:14:05.000 --> 00:14:08.420
And they publish their hard work as open source.

00:14:08.420 --> 00:14:15.560
So we allow people to install that or trigger that being installed in their binder.

00:14:16.240 --> 00:14:21.200
And then you can use it as an alternative UI.

00:14:21.200 --> 00:14:29.140
So that was one of the things that I was thinking of here as we were exploring some of the use cases and how this is interesting and useful.

00:14:29.140 --> 00:14:29.420
Right.

00:14:29.460 --> 00:14:38.420
So it makes a lot of sense that this is a lot of sense.

00:14:38.420 --> 00:14:41.740
So it's just a matter of where the server executes its kernel and whatnot.

00:14:41.740 --> 00:14:42.080
Right.

00:14:42.600 --> 00:14:45.160
So that's pretty easy to do, relatively speaking.

00:14:45.160 --> 00:14:49.660
But if it's pure Python code, it's a different kind of challenge, right?

00:14:49.660 --> 00:14:51.500
Because then how do you edit those files?

00:14:51.500 --> 00:14:52.640
How do you interact with them?

00:14:52.640 --> 00:14:54.360
How do you get a terminal into the environment?

00:14:54.360 --> 00:14:57.640
It's a lot more multi-step, it felt like.

00:14:57.740 --> 00:14:58.300
Yeah.

00:14:58.300 --> 00:15:03.680
If you could fire up like a Visual Studio Code in the cloud instance, right?

00:15:03.680 --> 00:15:05.020
That it's got the little terminal.

00:15:05.020 --> 00:15:09.000
That terminal runs inside the container that's hosting it and so on.

00:15:09.080 --> 00:15:10.180
I think that's pretty awesome.

00:15:10.180 --> 00:15:13.880
That really expands the appeal of Binder, I think.

00:15:13.880 --> 00:15:14.260
Yeah.

00:15:14.260 --> 00:15:14.700
Yeah.

00:15:14.700 --> 00:15:25.860
And you get a lot of the language server extension, the full, like, what is it?

00:15:25.860 --> 00:15:26.720
Hints.

00:15:26.720 --> 00:15:29.820
How to complete the function, what the arguments are.

00:15:29.820 --> 00:15:31.500
All this stuff.

00:15:31.500 --> 00:15:38.880
If you know how to install the plugins or enable the plugins you need, then you get all that good stuff.

00:15:38.880 --> 00:15:43.980
This portion of Talk Python To Me is brought to you by Linode.

00:15:43.980 --> 00:15:48.080
Whether you're working on a personal project or managing your enterprise's infrastructure,

00:15:48.080 --> 00:15:52.920
Linode has the pricing, support, and scale that you need to take your project to the next level.

00:15:52.920 --> 00:15:57.720
With 11 data centers worldwide, including their newest data center in Sydney, Australia,

00:15:57.720 --> 00:16:03.420
enterprise-grade hardware, S3-compatible storage, and the next-generation network,

00:16:03.420 --> 00:16:07.580
Linode delivers the performance that you expect at a price that you don't.

00:16:08.000 --> 00:16:13.000
Get started on Linode today with a $20 credit, and you get access to native SSD storage,

00:16:13.000 --> 00:16:19.140
a 40-gigabit network, industry-leading processors, their revamped cloud manager at cloud.linode.com,

00:16:19.140 --> 00:16:23.640
root access to your server, along with their newest API, and a Python CLI.

00:16:23.640 --> 00:16:28.880
Just visit talkpython.fm/Linode when creating a new Linode account,

00:16:28.880 --> 00:16:31.660
and you'll automatically get $20 credit for your next project.

00:16:31.660 --> 00:16:32.940
Oh, and one last thing.

00:16:32.940 --> 00:16:33.720
They're hiring.

00:16:33.940 --> 00:16:36.820
Go to linode.com slash careers to find out more.

00:16:36.820 --> 00:16:38.140
Let them know that we sent you.

00:16:38.940 --> 00:16:44.060
Do you set that up as part of, as a project owner?

00:16:44.060 --> 00:16:49.440
When you create your binder setup, can you say, this is going to be a Python plus JavaScript thing,

00:16:49.440 --> 00:16:52.500
so we're going to have to make sure those extensions come along for the ride?

00:16:52.500 --> 00:16:52.900
Yeah.

00:16:52.900 --> 00:16:53.020
Yeah.

00:16:53.020 --> 00:16:59.960
So you, as the owner of the GitHub repo, you specify that you would also like to have,

00:16:59.960 --> 00:17:03.400
I think it's called code server, the executable.

00:17:03.400 --> 00:17:06.060
You would like to have that installed as well.

00:17:06.460 --> 00:17:13.240
And then you format the link you share with people slightly differently so that we know to send you to this other UI.

00:17:13.240 --> 00:17:19.560
And then, yeah, you need to also, if you know which plugins and so on to install,

00:17:19.560 --> 00:17:28.740
then during the building phase of your binder, you have to add a few lines that we can execute to do all that stuff.

00:17:28.980 --> 00:17:32.580
Sure. Okay. Well, that sounds very flexible and so on.

00:17:32.580 --> 00:17:39.040
I want to talk about getting the launch binder, launch this in binder on your GitHub and all the details of how you do this.

00:17:39.040 --> 00:17:42.380
But really, just since we're still kind of beginning, let me just ask you real quick,

00:17:42.380 --> 00:17:44.680
how did you get started with binder in this whole project anyway?

00:17:44.680 --> 00:17:52.740
That's a good link back to my previous life at CERN, where as a student and as a postdoc also,

00:17:53.760 --> 00:17:58.880
we write so much software to analyze our data and it does fairly complicated stuff.

00:17:58.880 --> 00:18:05.820
And so when you see somebody else doing something cool, you're like, oh, I wish I could do that as well.

00:18:05.820 --> 00:18:12.140
But if you ask anybody in particle physics or at CERN to share their code,

00:18:12.140 --> 00:18:18.820
and then it only takes you, let's say, a week to get it running, doing what they were doing.

00:18:18.820 --> 00:18:22.580
You get this thing, you compile that from source, and then you do this,

00:18:22.580 --> 00:18:25.040
and oh, you got to get this right version of the header.

00:18:25.040 --> 00:18:30.580
Yeah. And so if it only takes a week, people are super impressed and super happy.

00:18:30.580 --> 00:18:37.180
But for me and a bunch of my friends, it was just, we were like, no, this has to take like an hour maybe.

00:18:37.180 --> 00:18:44.880
It's too long. If we just spend a week to figure out how to run it before we start modifying it, it's too long.

00:18:45.240 --> 00:18:52.840
So at some point, we decided we need to do something about it or shut up complaining.

00:18:52.840 --> 00:18:55.120
Yeah. Yeah. That's kind of my philosophy as well.

00:18:55.120 --> 00:19:00.200
It's like, it's fine to complain and criticize, but it should come with a, but you should do this instead.

00:19:00.200 --> 00:19:02.120
Or here's how we're making it better, right?

00:19:02.120 --> 00:19:02.980
That's great.

00:19:03.700 --> 00:19:09.880
So fortunately, there was a, or there's a yearly hackathon hosted at CERN called the WebFest.

00:19:09.880 --> 00:19:13.720
And we're like, okay, going to take three days to try and build something.

00:19:13.720 --> 00:19:15.880
And at least we will have tried.

00:19:16.420 --> 00:19:23.860
So we started and the idea was to build something very similar to what we now call binder.

00:19:23.860 --> 00:19:30.420
What was exciting is that on the Saturday, so it's a weekend event on the Saturday morning or afternoon.

00:19:30.420 --> 00:19:41.580
I read an email from a Jeremy Freeman, who is the inventor or creator of my binder.org announcing my binder.org.

00:19:41.580 --> 00:19:44.820
I was like, oh, that sounds very much like what we're trying to do here.

00:19:45.420 --> 00:19:52.040
So from day one, that was, yeah, it was exciting to see that other people are trying to do the same thing.

00:19:52.040 --> 00:19:59.400
Yeah. For me, I then took a detour, just doing some more science and lost my, my connection to this.

00:19:59.400 --> 00:20:11.240
And I think it was three years ago, two or three years ago, a PyCon, somebody said, we're trying to restart my binder.org.

00:20:11.240 --> 00:20:13.440
We've seen you did something similar.

00:20:13.440 --> 00:20:14.320
Do you want to be involved?

00:20:15.320 --> 00:20:15.620
Okay.

00:20:15.620 --> 00:20:17.140
And since then, I've not managed to escape.

00:20:17.140 --> 00:20:20.200
They pulled you back in.

00:20:20.200 --> 00:20:20.700
Wonderful.

00:20:20.700 --> 00:20:21.860
Cool.

00:20:21.860 --> 00:20:23.780
Well, yeah, I mean, that totally makes sense.

00:20:23.780 --> 00:20:28.920
It sort of fits with that overall theme of reproducible science and that kind of stuff, right?

00:20:28.920 --> 00:20:29.860
Yeah.

00:20:29.860 --> 00:20:37.280
If you can't create the environment to rerun or play or experiment with the code, well, that's a pretty bad shot against reproducibility.

00:20:37.280 --> 00:20:38.100
Yes.

00:20:38.100 --> 00:20:40.140
I will leave it at that.

00:20:40.140 --> 00:20:42.200
For sure.

00:20:42.320 --> 00:20:42.620
All right.

00:20:42.620 --> 00:20:42.660
All right.

00:20:42.660 --> 00:20:53.400
So the way that I learned about binder is I would go to various GitHub repos and I would see a little launch binder badge, right?

00:20:53.400 --> 00:20:56.560
Like GitHub has all these little cool, I guess it's not really GitHub.

00:20:56.660 --> 00:21:00.980
Like you can just put all these little badges on top of your readme that appear.

00:21:00.980 --> 00:21:03.720
I guess it's a convention in GitHub.

00:21:03.720 --> 00:21:04.700
It doesn't come from GitHub.

00:21:05.120 --> 00:21:18.020
And it might say, this thing requires Python 3.5 or above, or the continuous integration is working, or there's 94% code coverage, or it could say, click here to launch this project in binder.

00:21:18.020 --> 00:21:28.700
Now, to me, that was always really impressive because, you know, it's not enough to just take the code from the repository or the notebook from the repository and just run it.

00:21:28.960 --> 00:21:29.160
Right.

00:21:29.160 --> 00:21:32.460
As you described, there's all these requirements potentially, right?

00:21:32.460 --> 00:21:43.600
Like if I'm using SciPy, you know, maybe that's not installed or more likely using some edge package that nobody knows about, or you need a certain version or whatever, right?

00:21:43.600 --> 00:21:46.760
There's a lot of specific requirements that have to happen.

00:21:46.760 --> 00:21:48.460
So to me, it just looked kind of like magic.

00:21:48.460 --> 00:21:58.480
Like, oh, you can click on this button, and then this thing runs, but I have no idea how it might run because it seems like the environment where it's going to run should be so specific.

00:21:58.480 --> 00:22:00.680
So how does this happen, right?

00:22:00.680 --> 00:22:03.920
And I guess, yeah, give us the rundown of how that happens.

00:22:03.920 --> 00:22:12.340
There's a pretty good little UI that you can get started with over at mybinder.org that talks you through it.

00:22:12.340 --> 00:22:13.640
But let's talk about what happens there.

00:22:13.640 --> 00:22:20.240
We use a little tool we built called repo2docker, and it does exactly what the name suggests.

00:22:20.240 --> 00:22:32.160
It will take your repository and will look at it and say, if there's an environment.yaml, it will go, okay, we need to install Python.

00:22:32.980 --> 00:22:44.200
Well, we need to install Conda, and then we need to run whatever the Conda command is to get all the stuff which is listed in the environment.yaml installed.

00:22:44.660 --> 00:22:53.120
And that really is 80% of what repo2docker does is it will look for these very well-known files.

00:22:53.120 --> 00:22:58.660
In the Python world, it's requirements.txt, environment.yaml, setup.py.

00:22:58.660 --> 00:23:04.000
Does it know, like, pipfile and pyproject.toml and those things?

00:23:04.300 --> 00:23:07.900
We have some support for both of those as well.

00:23:07.900 --> 00:23:11.120
It doesn't seem to be used as much.

00:23:11.120 --> 00:23:15.300
So I would say it's something that could do with more love.

00:23:15.300 --> 00:23:16.300
Sure. Okay.

00:23:16.480 --> 00:23:19.160
And then we have the same for the R community.

00:23:19.160 --> 00:23:27.020
They have a whole bunch of magic files that the community has agreed on using as a format for specifying things.

00:23:27.020 --> 00:23:28.100
The Julia community.

00:23:28.100 --> 00:23:33.940
Because the notebooks will support a bunch of different kernels these days, a bunch of different languages and runtimes.

00:23:33.940 --> 00:23:42.260
And so I guess one of the questions is, when I create a Python project, I don't typically tell it, you're a Python project.

00:23:42.260 --> 00:23:50.160
I mean, I guess the closest I ever get to that is I will have the gitignore be the Python default gitignore.

00:23:50.160 --> 00:23:53.040
But other than that, when I create a new project, I don't tell it it's Python.

00:23:53.040 --> 00:23:54.340
I just put Python files in there.

00:23:54.340 --> 00:24:00.620
But I might also put JavaScript files or less files or other things that could confuse you guys.

00:24:00.620 --> 00:24:05.700
So how do you, when you look at one of these projects, know, oh, this one's Python, that one's Julia?

00:24:05.700 --> 00:24:11.800
We don't try and guess that so much as we have a list of files that we recognize.

00:24:11.800 --> 00:24:16.840
So like, yeah, requirements.txt.

00:24:16.840 --> 00:24:29.260
And when we see that, we say, okay, now add like the commands to install Conda, add the commands to install these pip packages to a Docker file.

00:24:29.260 --> 00:24:31.360
And we build a Docker container for you.

00:24:31.360 --> 00:24:31.680
I see.

00:24:31.680 --> 00:24:35.720
So for example, if you see like a requirements.txt, you're like, aha, Python.

00:24:36.000 --> 00:24:36.360
Exactly.

00:24:36.360 --> 00:24:42.100
We don't try and like look at the files in the repo in general and try and deduce.

00:24:42.100 --> 00:24:46.620
Okay, there's 80% Python files and 20% JavaScript.

00:24:46.620 --> 00:24:51.240
Let's install Node and Python 3.7 or something like that.

00:24:51.240 --> 00:24:51.880
Yeah.

00:24:51.880 --> 00:24:54.160
It always makes me, I guess, frustrated or something.

00:24:54.260 --> 00:25:03.920
When I see that, the GitHub estimation of what the project is, you know, you can like click down and the languages and it'll show like, you know, 70% this, 20% that.

00:25:03.920 --> 00:25:06.360
Because sometimes there's just some huge file, right?

00:25:06.360 --> 00:25:11.600
Like maybe I have one notebook, but there's like a ton of output in that notebook.

00:25:11.600 --> 00:25:15.440
But it's otherwise pure Python straight files, .py files.

00:25:15.440 --> 00:25:17.600
And it'll say, this is like 80% Jupyter.

00:25:17.600 --> 00:25:19.820
Like, you know, not really.

00:25:19.820 --> 00:25:33.300
It's more like output from Jupyter that you're counting or I'll decide, you know, I want to bundle up some node packages and put them in the repo so I don't ever have to worry about them vanishing or changing or ever.

00:25:33.300 --> 00:25:34.800
Just put them there and they're fine.

00:25:35.160 --> 00:25:41.220
And then it becomes a JavaScript project because, you know, it's got more JavaScript than it does Python, but it's not really.

00:25:41.220 --> 00:25:42.680
It's just like the libraries, right?

00:25:42.680 --> 00:25:45.920
So I can see that that would be very fraught with error.

00:25:45.920 --> 00:25:46.280
Yeah.

00:25:46.280 --> 00:25:52.960
So instead, the slogan we have is we reward community best practices by automating them.

00:25:52.960 --> 00:25:59.240
We try and encourage people to just be boring and do the mainstream thing.

00:25:59.440 --> 00:26:08.520
And in exchange, we can automatically build a Docker container or Docker image for them, which does what they want to do.

00:26:08.520 --> 00:26:08.860
Right.

00:26:08.860 --> 00:26:14.840
So one of the main things and the way you solve the challenge I started outlining in the beginning is like, it seems like magic.

00:26:14.840 --> 00:26:19.020
Why is this thing that seems like it has a bunch of dependencies and is very specific?

00:26:19.020 --> 00:26:20.420
Just run when I click it.

00:26:20.420 --> 00:26:22.700
And it's because you've looked at the repository.

00:26:22.700 --> 00:26:23.940
You've followed these best practices.

00:26:23.940 --> 00:26:28.140
You've sort of guessed at the best practices and found what you're supposed to do.

00:26:28.140 --> 00:26:35.960
And then you defined a Docker file that then built an image that then you run as a container when you click the button.

00:26:35.960 --> 00:26:38.300
That sets up that environment, right?

00:26:38.300 --> 00:26:38.720
Yeah.

00:26:38.720 --> 00:26:44.300
And then, and all as a user, all you need to bring is something that is like a web browser.

00:26:44.500 --> 00:26:48.120
And then at the very end, we connect you to it and off you go.

00:26:48.120 --> 00:26:49.300
And to that, you have an environment.

00:26:49.300 --> 00:26:50.740
So that's pretty interesting.

00:26:50.740 --> 00:26:51.800
Where does that run?

00:26:51.800 --> 00:26:56.680
Well, we're lucky to have four clusters around the world now, which is fantastic.

00:26:56.680 --> 00:27:03.980
So we rely on people donating resources to run all these containers for people.

00:27:03.980 --> 00:27:08.260
And we have one cluster in Google Kubernetes engine.

00:27:08.460 --> 00:27:12.720
We have one at OVH, which is a European cloud hoster.

00:27:12.720 --> 00:27:17.220
We have one sponsored by the Turing Institute in London.

00:27:17.220 --> 00:27:28.320
And we have one bare metal Kubernetes cluster at a social science research institute in Germany, in Cologne, called GISIS.

00:27:29.100 --> 00:27:34.520
So they are really at the front, you know, none of this cloud hosting business.

00:27:34.520 --> 00:27:36.680
We run our own Kubernetes cluster.

00:27:36.680 --> 00:27:37.020
That's right.

00:27:37.020 --> 00:27:42.700
You go in there, you pull the cover off of the 1U server, and you can just see Binder right in there.

00:27:42.700 --> 00:27:44.100
Yeah.

00:27:44.100 --> 00:27:44.940
Yeah.

00:27:44.940 --> 00:27:45.840
That's really cool.

00:27:45.840 --> 00:27:48.620
Are you looking for more or is it, is that enough?

00:27:48.620 --> 00:27:49.100
Is it okay?

00:27:49.100 --> 00:28:06.460
So our master plan for how to make this sustainable is to encourage more and more research institutes or cloud providers to host a small chunk of mybinder.org.

00:28:06.660 --> 00:28:17.480
Because that way, each individual contributor doesn't have to pay a cloud bill, which is hundreds of thousands of dollars, but only maybe $20,000.

00:28:17.480 --> 00:28:38.860
And if you're a big research university like MIT or University of Oxford or someone like that, spending $20,000 on something which benefits you because you can use it at your university for your researchers, but also benefits the whole world, it's still a difficult sell.

00:28:38.860 --> 00:28:43.420
It's a much easier sell than if we come to you and say, do you have $200,000?

00:28:43.420 --> 00:28:44.660
And they're like, oh.

00:28:44.660 --> 00:28:45.940
In any currency, no.

00:28:45.940 --> 00:28:46.880
Yeah.

00:28:47.260 --> 00:28:50.780
People will just laugh at you and show you the door.

00:28:50.780 --> 00:28:52.500
So that's the plan.

00:28:52.500 --> 00:28:56.340
So the short answer to your question, are we looking for more, is yes.

00:28:56.340 --> 00:29:00.620
It would be very interesting to add more clusters to this.

00:29:00.620 --> 00:29:07.700
It should be easy to do technically now that we've gone from one to four.

00:29:07.700 --> 00:29:09.620
It should be easy.

00:29:09.620 --> 00:29:12.920
Pretty much after you go from one to two, that's the hardest step.

00:29:12.920 --> 00:29:14.060
Right?

00:29:14.060 --> 00:29:17.040
And then onward, it's not necessarily easy, but it's the...

00:29:17.040 --> 00:29:22.580
Going from a very bespoke, it's all matching this to like, now we have multiple environments.

00:29:22.580 --> 00:29:24.620
Well, that's a pretty big step, I would say.

00:29:24.620 --> 00:29:26.020
Yeah, that's true.

00:29:26.020 --> 00:29:36.640
It comes with its own challenges because now you have four times as many things that can go wrong or idiosyncrasies to deal with.

00:29:37.100 --> 00:29:45.780
But it's great to see that we can run on four so different Kubernetes flavors.

00:29:46.340 --> 00:29:58.340
And I think it's great because it keeps us honest when we say we are not building something which is tied to any one cloud provider and their secret source.

00:29:58.340 --> 00:30:01.720
So you can really take it and run it at home.

00:30:01.960 --> 00:30:02.100
Right.

00:30:02.100 --> 00:30:03.220
Yeah, that's super cool.

00:30:03.220 --> 00:30:14.400
So basically, if you have admin access, like Binder has admin access to a Kubernetes cluster, it can create containers and pods and then spin them up and spin them down.

00:30:14.400 --> 00:30:19.160
And like, it's basically just managing a Kubernetes cluster wherever that happens to run.

00:30:19.160 --> 00:30:19.640
Exactly.

00:30:19.640 --> 00:30:20.200
Yeah.

00:30:20.200 --> 00:30:20.480
Okay.

00:30:20.580 --> 00:30:20.940
Yeah.

00:30:20.940 --> 00:30:22.020
That's what we do.

00:30:22.020 --> 00:30:22.880
Yeah.

00:30:22.880 --> 00:30:25.480
That sounds very exciting, actually.

00:30:25.480 --> 00:30:25.900
That's cool.

00:30:25.900 --> 00:30:42.860
Now, one of the things that's probably worth mentioning is if I have a GitHub repository and I go through this effort, this minor effort described at mybinder.org to like set this up and register it and whatnot and get my little badge so people can run my code there.

00:30:42.860 --> 00:30:43.980
That's all well and good.

00:30:43.980 --> 00:30:46.960
But what happens as I make changes to my GitHub repository?

00:30:47.420 --> 00:30:55.820
Like, oh, I need a new version, a new library I'm going to add, or we're going to update this code, but it's going to require some underlying fundamental change to the environment.

00:30:55.820 --> 00:31:08.780
Every time you make a commit to your repository, when you then launch it, we check in our cache, do we already have an image for this commit of this repo?

00:31:08.780 --> 00:31:12.620
And if the answer is no, we will rebuild it or build it again.

00:31:12.620 --> 00:31:13.280
Right, right.

00:31:13.280 --> 00:31:17.800
Like probably you tag it by like git commit hash shah or something like that, right?

00:31:17.800 --> 00:31:18.520
Yeah, exactly.

00:31:18.520 --> 00:31:18.920
Okay.

00:31:18.920 --> 00:31:28.380
And that's nice because anytime you change your repository and add a new dependency, we will just automatically rebuild it next time.

00:31:28.620 --> 00:31:42.900
It has the disadvantage that it can take quite a long time to build your repository, depending on what crazy stuff you're trying to do, how many dependencies you need to install and compile from scratch.

00:31:43.080 --> 00:31:49.360
It can take a long time to build the Docker image for your repository.

00:31:49.360 --> 00:31:49.880
Right.

00:31:49.880 --> 00:31:53.700
Do you do anything like layer this?

00:31:53.700 --> 00:32:00.620
So with Docker, you can have like layers of Docker files and dependencies and it will just, it'll cache all of them and only build the changes.

00:32:00.620 --> 00:32:06.140
Do you do anything like here's the layer that is the dependencies of this project?

00:32:06.320 --> 00:32:16.920
And here's the layer that actually has the code because the dependencies probably change infrequently, whereas the code is probably, you know, 10, 100 times more likely to change.

00:32:16.920 --> 00:32:17.180
Right.

00:32:17.180 --> 00:32:18.920
And the slow part is not getting the code.

00:32:18.920 --> 00:32:23.720
The slow part is getting the pip install -r from their Ubuntu or whatever.

00:32:23.720 --> 00:32:24.420
Yeah.

00:32:24.420 --> 00:32:29.700
So we try and be clever about how we order the layers and the Docker.

00:32:29.700 --> 00:32:30.080
Right.

00:32:30.080 --> 00:32:30.260
Right.

00:32:30.300 --> 00:32:34.300
Because that's the trick to making it do the minimum work when a change happens.

00:32:34.300 --> 00:32:35.020
Yeah.

00:32:35.020 --> 00:32:41.940
What makes it tricky is that a lot of package managers allow you to do arbitrary stuff.

00:32:41.940 --> 00:32:53.120
We have a few, hopefully enough pieces of code that inspect your requirements.txt to try and figure out, are you referring to stuff in the rest of the repo?

00:32:53.120 --> 00:32:54.180
Yes or no?

00:32:54.180 --> 00:32:59.960
Because if you are, then we need to update the whole rest of the repo before we run your file.

00:32:59.960 --> 00:33:02.640
If no, then we can cache it.

00:33:02.640 --> 00:33:06.700
So, yeah, we try and be clever on that front.

00:33:06.700 --> 00:33:07.020
Right.

00:33:07.020 --> 00:33:14.660
Because your biggest expense, at least I think, there's actually a Jupyter notebook that talks about this, which we could get into, which is fun.

00:33:14.660 --> 00:33:17.020
But your biggest expense is compute, right?

00:33:17.020 --> 00:33:17.560
Yes.

00:33:17.560 --> 00:33:19.400
As opposed to storage or bandwidth or something.

00:33:19.400 --> 00:33:19.780
Yeah.

00:33:19.820 --> 00:33:23.740
We do have a fairly large Docker container registry.

00:33:23.740 --> 00:33:30.980
And the funny story about it is that for a very long time, we paid no attention whatsoever to it.

00:33:30.980 --> 00:33:42.700
And then one day in this notebook that you were referring, which shows you how much money we spend on which line item in our cloud build, we started noticing a new one.

00:33:43.160 --> 00:33:44.160
And we're like, what is this?

00:33:44.160 --> 00:33:45.840
Why is it getting bigger constantly?

00:33:45.840 --> 00:33:54.620
And it turns out that there was, I think, tens of terabytes of images in our container registry.

00:33:54.840 --> 00:34:01.800
And that is the level at which it starts being noticeable on our chart.

00:34:01.800 --> 00:34:02.700
Right, right, right.

00:34:02.700 --> 00:34:06.820
That's like $20,000 or $10,000 or something like that.

00:34:06.820 --> 00:34:08.180
But it's a non-trivial number.

00:34:08.180 --> 00:34:09.220
Yeah.

00:34:09.320 --> 00:34:16.180
So I actually haven't looked at our billing costs in quite a while.

00:34:16.180 --> 00:34:34.500
Before we had, when we only had two clusters, so that's probably at least half a year ago or so, we would say that it costs between $80,000 and $100,000 in Google Cloud cost to run mybinder.org.

00:34:35.040 --> 00:34:39.580
Yes, the vast majority of that is paying for the virtual machines.

00:34:39.580 --> 00:34:40.760
Right, right, right.

00:34:40.760 --> 00:34:47.400
If you're a regular listener of the podcast, you surely heard about Talk Python's online courses.

00:34:47.400 --> 00:34:49.500
But have you had a chance to try them out?

00:34:49.500 --> 00:34:52.740
No matter the level you're looking for, we have a course for you.

00:34:52.740 --> 00:34:59.100
Our Python for Absolute Beginners is like an introduction to Python plus that first-year computer science course that you never took.

00:34:59.100 --> 00:35:05.960
Our data-driven web app courses build a full PyPI.org clone along with you right on the screen.

00:35:05.960 --> 00:35:08.900
And we even have a few courses to dip your toe in with.

00:35:08.900 --> 00:35:14.240
See what we have to offer at training.talkpython.fm or just click the link in your podcast player.

00:35:16.580 --> 00:35:20.140
I guess that's worth talking about as well.

00:35:20.140 --> 00:35:23.920
So there's a notebook, which I'll put the link into the show notes.

00:35:23.920 --> 00:35:29.160
Basically, it's showing you the real-time, semi-real-time.

00:35:29.160 --> 00:35:30.620
You can adjust it.

00:35:30.620 --> 00:35:31.120
It's a notebook.

00:35:31.120 --> 00:35:34.980
The cost of over the day, over the week.

00:35:34.980 --> 00:35:37.300
And it's a non-trivial number, right?

00:35:37.400 --> 00:35:43.380
Like, I'm on the weekly cost, and it's showing, on average, maybe $1,000 a week plus a little bit more.

00:35:43.380 --> 00:35:44.460
You know, that's...

00:35:44.460 --> 00:35:50.680
I know open source is doing well these days, but that's a lot of money, $1,000 a week for compute.

00:35:50.680 --> 00:35:52.720
So where does that money come from?

00:35:52.720 --> 00:35:53.420
You talked...

00:35:53.420 --> 00:35:56.340
You sort of hinted at it before, but where does it come from?

00:35:56.340 --> 00:36:04.260
So the particular notebook there only tracks the cost we incur from Google.

00:36:04.260 --> 00:36:05.200
Okay.

00:36:05.200 --> 00:36:05.860
From the Google Cloud.

00:36:06.080 --> 00:36:08.480
Which is, like, not necessarily a quarter, but one of the four, right?

00:36:08.480 --> 00:36:08.860
Yeah.

00:36:08.860 --> 00:36:11.600
It's probably the biggest of the four.

00:36:11.600 --> 00:36:16.900
So I'll talk about how that bill gets paid.

00:36:16.900 --> 00:36:22.380
At the very beginning, we were fortunate enough to have a grant from the Moore Foundation,

00:36:22.380 --> 00:36:25.840
which included a chunk of money to pay for the bill.

00:36:25.840 --> 00:36:28.200
And that was several years ago.

00:36:28.200 --> 00:36:34.880
Now, we have friends, our benefactors at Google,

00:36:34.880 --> 00:36:40.920
who so far have been able to justify why Google should give us credits.

00:36:40.920 --> 00:36:41.840
I see.

00:36:41.840 --> 00:36:43.040
Are high enough to pay the bill.

00:36:43.040 --> 00:36:45.380
So that's fantastic to see.

00:36:45.380 --> 00:36:48.600
So in some sense, Google's donating that compute to the project.

00:36:48.600 --> 00:36:49.140
Yes.

00:36:49.140 --> 00:36:49.640
Yeah.

00:36:49.640 --> 00:36:49.980
Yeah.

00:36:50.100 --> 00:36:54.880
Have you considered reaching out to the other big groups like Azure and AWS?

00:36:54.880 --> 00:37:00.780
See if they want to be part of that party to get their name in some little halo effect?

00:37:00.780 --> 00:37:01.200
Yeah.

00:37:01.200 --> 00:37:07.000
So, I mean, that's how we got the cluster OVH, which is a European cloud hoster.

00:37:07.240 --> 00:37:11.700
They donate the compute resources for that cluster.

00:37:11.700 --> 00:37:17.180
The Turing Institute's cluster runs on Azure cloud.

00:37:17.620 --> 00:37:22.880
And I don't know exactly how the invoicing works there.

00:37:22.880 --> 00:37:30.980
But I would imagine that at least in some way it's sponsored or supported by Azure.

00:37:30.980 --> 00:37:43.040
The fact that the Turing Institute has enough spare money to finance such or donate resources for such an altruistic project.

00:37:43.260 --> 00:37:43.380
Yeah.

00:37:43.380 --> 00:37:44.100
Okay.

00:37:44.100 --> 00:37:48.740
It's really cool because it really shows you that, you know, this is, it's not free.

00:37:48.740 --> 00:37:51.360
And it's, I mean, at the core, right?

00:37:51.360 --> 00:37:54.660
Somebody, those images have to get built somewhere.

00:37:54.660 --> 00:38:00.340
They have to, the Docker containers and pods, Kubernetes pods have to run somewhere, right?

00:38:00.340 --> 00:38:06.420
And this is, and also probably, I know it's probably a small percentage of the people that touch the button,

00:38:06.420 --> 00:38:11.760
but it's still got to be a non-trivial amount of like real computational stuff happening, right?

00:38:11.820 --> 00:38:14.520
Like it's scientific in large part, I would imagine.

00:38:14.520 --> 00:38:14.920
Yeah.

00:38:14.920 --> 00:38:24.520
So luckily for us, most people who start a notebook spend a lot more time thinking and reading than running code.

00:38:24.520 --> 00:38:24.880
Yeah.

00:38:24.880 --> 00:38:30.920
So we can cheat and overcommit our CPUs by quite a large factor.

00:38:30.920 --> 00:38:31.160
Yeah.

00:38:31.160 --> 00:38:31.740
I would think.

00:38:31.740 --> 00:38:32.140
Yeah.

00:38:32.140 --> 00:38:35.560
But yeah, I mean, they're not sitting there idling.

00:38:35.560 --> 00:38:36.660
No, I'm sure.

00:38:36.660 --> 00:38:44.440
Also, this doesn't help for the Python file and VS Code angle, but it might help for the notebooks ways.

00:38:44.440 --> 00:38:49.580
Like a lot of those notebooks come pre-populated with the last data they had run, right?

00:38:49.580 --> 00:38:52.000
You don't have to run them to read them initially.

00:38:52.000 --> 00:38:52.740
Yes.

00:38:52.740 --> 00:38:55.200
Is that true for your setup or is that just true for GitHub?

00:38:55.200 --> 00:38:55.540
No.

00:38:55.540 --> 00:39:01.660
So if the notebook in your repository has the output still in it from the last time it was run,

00:39:01.660 --> 00:39:08.700
then we will show it to you because we use standard JupyterLab or Jupyter Notebook.

00:39:08.700 --> 00:39:09.260
Right, right.

00:39:09.260 --> 00:39:10.960
A UI to show it to you.

00:39:10.960 --> 00:39:17.380
And so that way you get something to read before you ever try and run code.

00:39:17.380 --> 00:39:17.700
Cool.

00:39:17.700 --> 00:39:18.060
Yeah.

00:39:18.060 --> 00:39:23.620
So maybe people actually load it up and never actually run it or they might not run the expensive bits or something.

00:39:23.700 --> 00:39:24.700
So that's got to help as well.

00:39:24.700 --> 00:39:24.980
Yeah.

00:39:24.980 --> 00:39:29.360
So then it's a very expensive way to view your notebooks.

00:39:29.360 --> 00:39:33.960
It would be good if you just want to read it.

00:39:33.960 --> 00:39:37.280
Just read it on GitHub or something, right?

00:39:37.280 --> 00:39:37.700
Yeah.

00:39:37.700 --> 00:39:46.580
If the GitHub viewer works well, then that's good because that's much cheaper to run than starting up a Docker container.

00:39:46.580 --> 00:39:47.100
For sure.

00:39:47.720 --> 00:39:53.480
And, you know, I guess there are definitely benefits that you have on interactivity as well, right?

00:39:53.480 --> 00:39:58.680
Like GitHub doesn't, it's kind of amazing that you can look at an output of a notebook and it looks like it ran,

00:39:58.680 --> 00:40:01.700
but it's just the cached version or saved version of whatever was before.

00:40:02.060 --> 00:40:07.440
But, you know, a lot of those have like the little widgets, those IPy widgets or whatever.

00:40:07.440 --> 00:40:07.700
Yeah.

00:40:07.700 --> 00:40:10.940
You have like little sliders that you can play with and like adjust it.

00:40:10.940 --> 00:40:16.920
And in order to do those types of explorations, even if you're not writing code, but you're kind of exploring parameters,

00:40:16.920 --> 00:40:19.560
you've got to have a real life system to do that, right?

00:40:19.720 --> 00:40:19.940
Yeah.

00:40:19.940 --> 00:40:20.320
Yeah.

00:40:20.320 --> 00:40:28.760
You need some kind of kernel connected to it to run the computations that are needed when you slide the slider to 11.

00:40:28.760 --> 00:40:29.240
Right.

00:40:29.240 --> 00:40:30.160
Yeah.

00:40:30.160 --> 00:40:30.800
Cool.

00:40:30.800 --> 00:40:39.420
Now, I think it's awesome that all these people are donating the compute to the environment and making this available to the entire world.

00:40:39.420 --> 00:40:51.760
But there might be situations where people want this type of system, but they, for some reason, can't put their data publicly out there or they don't want to link to it or they just want to keep it more controlled.

00:40:51.760 --> 00:41:03.860
Is there a way to take what you guys have built and say, create a mine, mine, all mine binder.org rather than, you know, like an internal version of it that's not just out there on the public cloud?

00:41:04.080 --> 00:41:04.220
Yeah.

00:41:04.220 --> 00:41:04.240
Yeah.

00:41:04.240 --> 00:41:12.380
So the software that is behind my binder.org is called binder hub, like Jupyter hub, but binder hub.

00:41:12.380 --> 00:41:17.560
And that's open source, like all other Jupyter projects as well.

00:41:17.560 --> 00:41:23.820
And you can deploy it yourself on your compute with your credit card.

00:41:23.820 --> 00:41:26.300
And then you can access private repositories.

00:41:26.300 --> 00:41:29.160
You can limit access to your binder instance.

00:41:29.580 --> 00:41:35.740
So you have to log in instead of right now where it will, it's completely open to the public.

00:41:35.740 --> 00:41:36.140
Sure.

00:41:36.140 --> 00:41:36.680
Yeah.

00:41:36.680 --> 00:41:39.440
So basically, once you have those links, you can just visit it.

00:41:39.440 --> 00:41:40.300
Like that's the point.

00:41:40.300 --> 00:41:42.220
You already emphasize that, right?

00:41:42.220 --> 00:41:47.320
That you're not even supposed to have an account, which is kind of the opposite of I need to keep this private.

00:41:47.320 --> 00:41:49.080
Exactly.

00:41:49.640 --> 00:41:56.920
And also because we take compute, which has been donated to us by people.

00:41:56.920 --> 00:42:04.860
We say, if you have private repositories, you probably also work for somebody who could pick up the bill themselves.

00:42:04.860 --> 00:42:11.300
So it's a political decision that we've disabled these features for my binder.org.

00:42:11.460 --> 00:42:14.700
But you can take the same software and run it yourself.

00:42:14.700 --> 00:42:17.500
And then you can access private repos.

00:42:17.500 --> 00:42:20.180
So basically, there's no technical limitation.

00:42:20.180 --> 00:42:28.680
But right now, in order to run one of your repositories on mybinder.org, it has to be a public repository.

00:42:28.680 --> 00:42:29.320
That's right.

00:42:29.320 --> 00:42:31.700
Because that's the zen that you guys are going after.

00:42:31.700 --> 00:42:35.060
That's the overriding philosophy of what you're doing, right?

00:42:35.060 --> 00:42:35.380
Yeah.

00:42:35.380 --> 00:42:35.700
Okay.

00:42:35.980 --> 00:42:38.320
Yeah, that sounds totally reasonable.

00:42:38.320 --> 00:42:48.220
Now, I guess this repo to Docker is also pretty interesting, potentially on its own, right?

00:42:48.220 --> 00:42:53.380
Like, it's cool that you guys are using it for capturing these environments.

00:42:53.380 --> 00:42:56.360
So you can run them on mybinder.org.

00:42:56.360 --> 00:43:00.260
But is that something people would find useful outside of that use case?

00:43:00.260 --> 00:43:01.360
Yes and no.

00:43:01.360 --> 00:43:03.260
There's nothing stopping you.

00:43:03.260 --> 00:43:05.080
Or we encourage people.

00:43:05.080 --> 00:43:06.880
For example, when they...

00:43:06.880 --> 00:43:10.100
So you can run repo to Docker locally on your laptop.

00:43:10.100 --> 00:43:15.540
And it will perform its little magic trick just as well as it does online.

00:43:15.540 --> 00:43:15.860
Right.

00:43:15.860 --> 00:43:24.700
We encourage people to do that, for example, if they're trying to debug why their binder isn't building or why it isn't doing quite what they want it to do.

00:43:24.700 --> 00:43:25.360
Oh, interesting.

00:43:25.360 --> 00:43:31.700
So if things are not working right, you're like, this container won't build or it's not finding the files or whatever it is, right?

00:43:31.700 --> 00:43:32.900
The volumes aren't mapped right.

00:43:32.900 --> 00:43:33.940
The ports aren't mapped right.

00:43:33.940 --> 00:43:38.400
You can play around with repo to Docker locally and get a better shot at figuring that out, huh?

00:43:38.400 --> 00:43:38.840
Exactly.

00:43:38.840 --> 00:43:40.960
Because you can see a lot more of the logs.

00:43:40.960 --> 00:43:45.360
The turnaround is potentially much, much faster because you have a more powerful machine.

00:43:46.160 --> 00:43:58.240
You're just more direct contact with it than if you have to control it via some web form with the log automatically scrolling paths and so on.

00:43:58.240 --> 00:43:58.420
Right, right.

00:43:58.420 --> 00:44:04.360
I'm going to go do another commit to the repo to force a GitHub webhook to go off and make it happen again or whatever.

00:44:04.360 --> 00:44:05.040
Yeah.

00:44:05.080 --> 00:44:05.500
Exactly.

00:44:05.500 --> 00:44:08.080
So you can use it locally.

00:44:08.080 --> 00:44:18.980
The disadvantage is that you probably don't have as big a library of cache Docker image layers on your laptop that repo to Docker uses.

00:44:19.140 --> 00:44:23.700
Potentially you have lots of them already because Docker is very good at filling up your hard drive.

00:44:23.700 --> 00:44:24.060
Right.

00:44:24.060 --> 00:44:27.980
It won't clean up any of those cached ones unless you run like a Docker cleanup.

00:44:27.980 --> 00:44:29.200
I forget the exact command.

00:44:29.200 --> 00:44:36.420
But yeah, it's really easy to fill up your computer with Docker images that are stale cached results, right?

00:44:36.680 --> 00:44:37.120
Exactly.

00:44:37.120 --> 00:44:39.580
So you can run it locally.

00:44:39.580 --> 00:44:47.440
I do run it locally once in a while to just get the environment that the author of the repository had in mind.

00:44:47.440 --> 00:44:55.940
However, what I'm finding is that if the repository builds on mybinder.org or with repo to Docker,

00:44:55.940 --> 00:45:01.220
because it's in some way very simple minded what repo to Docker recognizes,

00:45:01.220 --> 00:45:05.540
the instructions to do it by hand are also fairly straightforward.

00:45:05.540 --> 00:45:15.640
So if you're comfortable using Conda, then it's quicker to make yet another Conda environment and just do what the author wanted you to do.

00:45:15.640 --> 00:45:23.660
And because you can try whether it actually works by clicking on the badge in the readme and seeing it run on mybinder.org,

00:45:23.660 --> 00:45:26.740
you're like, yeah, I'm pretty sure the instructions are complete.

00:45:26.740 --> 00:45:31.440
And I'm not going to spend two hours and then find out that they forgot something.

00:45:31.440 --> 00:45:32.540
Sure, sure, sure.

00:45:32.540 --> 00:45:33.300
That's pretty cool.

00:45:33.300 --> 00:45:39.160
I guess maybe if it depended on Linux and you were on Mac or something like that,

00:45:39.160 --> 00:45:45.240
that might be a quick way to jumpstart a Docker container without knowing too much about Docker.

00:45:45.240 --> 00:45:49.160
But yeah, if it's a kind of standard environment, then there's probably not a huge benefit.

00:45:49.160 --> 00:45:49.460
Yeah.

00:45:49.800 --> 00:46:02.000
If you're on a different flavor of Linux or whatever, then yes, automating the build of the Docker container and have it run locally is great.

00:46:02.000 --> 00:46:09.040
And it is something people do, but it's, I would say, just not as convenient as clicking the link.

00:46:09.180 --> 00:46:11.220
So that's why not as many people are doing it.

00:46:11.220 --> 00:46:12.540
Yeah, for sure.

00:46:12.540 --> 00:46:13.740
It's easy.

00:46:13.740 --> 00:46:20.980
Can I get a public repository into mybinder.org that didn't decide to be in there?

00:46:21.480 --> 00:46:28.600
And what I mean is I've got to go through mybinder.org and put in the repo info and stuff in general to set this up.

00:46:28.600 --> 00:46:35.900
Could I just go, this one doesn't have a link, but I'm just going to give it to mybinder.org anyway and see what happens.

00:46:35.900 --> 00:46:36.220
Yeah.

00:46:36.220 --> 00:46:37.040
Yes.

00:46:37.320 --> 00:46:42.480
You don't have to be an author of the repo or have any special rights on the repo to launch it.

00:46:42.480 --> 00:46:42.700
Right.

00:46:42.700 --> 00:46:46.560
So with no account and it's required to be public, right?

00:46:46.560 --> 00:46:51.740
It's pretty hard to not fill out the form at mybinder.org with the info you want, right?

00:46:51.740 --> 00:46:52.200
Exactly.

00:46:52.200 --> 00:46:55.180
And a lot of projects will just work.

00:46:55.180 --> 00:46:55.460
Yeah.

00:46:55.460 --> 00:46:57.680
Because of the practices that you follow, right?

00:46:57.680 --> 00:46:58.120
Exactly.

00:46:58.120 --> 00:46:58.540
Yeah.

00:46:58.540 --> 00:47:02.060
So then you can open a pull request and add the badge to the readme.

00:47:02.060 --> 00:47:03.700
That's exactly what I was thinking.

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

00:47:04.080 --> 00:47:14.580
So if you find a repo that should have a launch in Binder and yet it doesn't, a real nice way to make a simple contribution would be to go fill out mybinder.org.

00:47:14.580 --> 00:47:17.080
If it works, go do a PR with the details required.

00:47:17.080 --> 00:47:24.960
I mean, you could just edit the readme file on a branch, put the little icon there and submit that as the PR like here.

00:47:24.960 --> 00:47:26.260
I was missing this.

00:47:26.260 --> 00:47:26.780
I fixed it.

00:47:26.780 --> 00:47:27.060
Yeah.

00:47:27.060 --> 00:47:30.720
That's a super contribution for the project.

00:47:30.840 --> 00:47:38.260
It's a good way to get started and it will help whoever comes next to the project because they'll see the badge.

00:47:38.260 --> 00:47:45.500
And even if they don't yet know what mybinder.org is, they might click it and then they can run the examples.

00:47:45.500 --> 00:47:46.060
Yeah.

00:47:46.060 --> 00:47:49.860
It seems like a really nice, generous thing to do and super easy.

00:47:49.860 --> 00:47:50.480
Well, cool.

00:47:50.880 --> 00:47:57.880
So we're getting near the end of our time and I was going to ask you just a really quick sort of high level question.

00:47:57.880 --> 00:48:01.480
Looking back a bit on our conversation and your experience over time.

00:48:02.180 --> 00:48:11.580
People recently have been asking me, why do you think Python has become so popular in the data science and the scientific computing space over the last five years or so?

00:48:11.580 --> 00:48:16.920
You know, someone who worked at CERN and has been probably more involved in that than I have in a lot of ways.

00:48:16.920 --> 00:48:17.980
What are your thoughts?

00:48:17.980 --> 00:48:19.640
Why Python?

00:48:19.980 --> 00:48:23.280
Why did it become so much more popular recently?

00:48:23.280 --> 00:48:32.600
I think the short answer is I don't know because I've, since I was 15, thought Python is a pretty good language for programming.

00:48:32.600 --> 00:48:34.320
Finally, everyone agrees with me.

00:48:34.320 --> 00:48:35.460
Exactly.

00:48:35.760 --> 00:48:38.640
So I don't know what really what happened.

00:48:38.640 --> 00:48:57.160
I think part of it or why I think why Python, not some other language is there's a quote somebody else told me is you invite people to a job interview and make them write something on the, do some coding on the whiteboard or something like that.

00:48:57.400 --> 00:49:09.420
And they will write, even if they are, I don't know, C++ or Julia or whatever programmers, often they will write in something which looks very much like Python on the whiteboard.

00:49:09.420 --> 00:49:14.400
They will not put all the curly brackets.

00:49:14.400 --> 00:49:25.260
Or if you read Wikipedia, often there will be about algorithms, there will be a little section in pseudo code and you can almost copy and paste that and it will run.

00:49:25.260 --> 00:49:25.640
Right.

00:49:25.640 --> 00:49:29.240
So I think that's a killer feature in some sense.

00:49:29.240 --> 00:49:35.580
It makes it just so much more accessible to people who don't think of themselves as programmers.

00:49:35.580 --> 00:49:42.600
They are, they work in an insurance company and they want to do some data science.

00:49:42.600 --> 00:49:45.360
They don't think of themselves as programmers.

00:49:45.360 --> 00:49:47.840
They are, I don't know, actuaries or.

00:49:47.840 --> 00:49:48.660
Right, right, right.

00:49:48.660 --> 00:50:01.240
I think that agrees a lot with my general working theory is that Python is one of these special languages where it's as simple as possible to get started with like a tiny bit of computation.

00:50:01.240 --> 00:50:08.820
You don't even have to have a function, you know, forget compiling, linking, headers, static main voids, just like here's the three lines I want.

00:50:08.820 --> 00:50:10.060
I'm going to use those libraries.

00:50:10.060 --> 00:50:10.720
I'm going to do this.

00:50:11.600 --> 00:50:15.220
And so people easily get into it in the beginning.

00:50:15.220 --> 00:50:20.360
But then unlike a lot of easy languages, you don't really outgrow it.

00:50:20.360 --> 00:50:20.780
Right.

00:50:20.780 --> 00:50:25.380
It's not like, well, you can't use Python anymore because now we're doing astronomy or whatever.

00:50:25.380 --> 00:50:35.080
I was like, no, it's just, you just keep using the libraries and you can keep adding more computer science like concepts, functions, and then classes, then generators, then whatever.

00:50:35.080 --> 00:50:41.600
So I feel like it sucks people in who don't believe, just like you said, that they're programmers.

00:50:41.600 --> 00:50:45.240
They believe they're biologists, astronomers, physicists, whatever.

00:50:45.240 --> 00:50:49.400
But then it's kind of got this, like, well, I already know this.

00:50:49.400 --> 00:50:50.320
It's totally working.

00:50:50.320 --> 00:50:53.760
Why would I leave and pick up a harder language?

00:50:53.760 --> 00:50:55.980
Because there's just kind of this gravity.

00:50:55.980 --> 00:51:03.020
Like, once you get sucked into it, there's no reason to get kicked out of it because you can just keep growing with the language in the libraries.

00:51:03.020 --> 00:51:04.540
That's my theory as well.

00:51:04.540 --> 00:51:05.620
Yeah.

00:51:05.620 --> 00:51:07.200
Yeah, I think so too.

00:51:07.200 --> 00:51:29.460
And the fact that we can put a nice user interface in the programming language that you use Sense onto big, trusty Fortran and C++ libraries that have been around to do really heavy lifting, linear algebra and whatnot.

00:51:29.460 --> 00:51:31.540
I think that is fantastic.

00:51:32.120 --> 00:51:36.420
If you imagine Python didn't have that feature, then we would be stuck.

00:51:36.420 --> 00:51:38.840
We'd have to write all this stuff from scratch.

00:51:38.840 --> 00:51:39.620
Yeah.

00:51:39.620 --> 00:51:53.460
Like this, we can put a nice UI on Fortran code and get all the benefits of having well-tested Fortran code do crazy linear algebra for us.

00:51:53.460 --> 00:51:54.600
That's perfect.

00:51:54.600 --> 00:51:56.860
But not think about it ever again.

00:51:56.860 --> 00:52:00.120
Nice.

00:52:00.220 --> 00:52:00.380
All right.

00:52:00.380 --> 00:52:03.740
Well, yeah, that was definitely a good, insightful answer.

00:52:03.740 --> 00:52:04.560
I like it.

00:52:04.560 --> 00:52:05.080
All right.

00:52:05.080 --> 00:52:09.280
Now, before you get out of here, before we call the show, you've got to answer the final two questions.

00:52:09.280 --> 00:52:13.160
So, if you're going to write some Python code, what editor do you use?

00:52:13.160 --> 00:52:14.780
Today, I use Atom.

00:52:14.780 --> 00:52:15.220
Okay.

00:52:15.220 --> 00:52:16.160
Well, cool.

00:52:16.160 --> 00:52:16.960
Yeah, Atom is neat.

00:52:16.960 --> 00:52:20.960
My favorite editor probably is Emacs in a console.

00:52:21.320 --> 00:52:36.860
But at some point, I had to admit that I didn't want to spend as much time as I used to trying to understand how to get JavaScript tools to hook into my editor and auto-formatting stuff.

00:52:37.540 --> 00:52:39.960
So, yes, I use Atom now.

00:52:39.960 --> 00:52:40.860
Nice.

00:52:40.860 --> 00:52:42.040
Very cool.

00:52:42.040 --> 00:52:44.280
And then notable PyPI package.

00:52:44.280 --> 00:52:49.680
Maybe not something necessarily super popular, but something like, oh, I saw this and it was so cool.

00:52:49.680 --> 00:52:50.540
You should check it out.

00:52:50.540 --> 00:52:51.520
Need to think.

00:52:51.520 --> 00:52:54.400
While you're thinking, let me tell you about one thing that I ran across.

00:52:54.400 --> 00:52:58.000
It's not exactly that, but it's actually super cool.

00:52:58.000 --> 00:53:02.120
And I think it's relevant to the audience who would be interested in this topic as well.

00:53:02.700 --> 00:53:04.980
So, have you heard about Carnets?

00:53:04.980 --> 00:53:06.520
C-A-R-N-E-T-S?

00:53:06.520 --> 00:53:07.320
Carnets?

00:53:07.320 --> 00:53:07.900
No.

00:53:07.900 --> 00:53:14.880
So, this is a standalone Jupyter Notebook environment that runs on iOS.

00:53:14.880 --> 00:53:25.040
Not like the browser sees it, but it actually has NumPy and SciPy and all that stuff installed and Python executing disconnected on iOS.

00:53:25.040 --> 00:53:28.580
So, we could put that one out there for sure.

00:53:28.940 --> 00:53:32.760
And that's cool and it's open source and people can go check it out.

00:53:32.760 --> 00:53:34.340
It does uncertainties.

00:53:34.340 --> 00:53:36.940
So, maybe, yeah, it is actually just called uncertainties.

00:53:36.940 --> 00:53:38.420
Oh, nice.

00:53:38.420 --> 00:53:39.100
That's a good name.

00:53:39.100 --> 00:53:39.460
Yeah.

00:53:39.460 --> 00:53:45.240
So, it lets you put in numbers with uncertainties on them.

00:53:45.240 --> 00:53:45.560
Okay.

00:53:45.560 --> 00:53:54.940
And then you can do complicated computations on it and it will spit out, you know, the answer is three plus or minus 1.7.

00:53:55.660 --> 00:53:56.160
Right, right.

00:53:56.160 --> 00:54:01.840
Because if you have plus or minus 1, but then you square it and then you add this other uncertainty to it, right?

00:54:01.840 --> 00:54:05.740
Like, the propagation of uncertainty is not obvious.

00:54:05.740 --> 00:54:06.880
It's uncertain even.

00:54:06.880 --> 00:54:07.820
Yeah.

00:54:08.000 --> 00:54:14.100
I mean, it's one of these things where it's not difficult, but it's hard to do right.

00:54:14.100 --> 00:54:14.400
Yeah.

00:54:14.400 --> 00:54:14.480
Yeah.

00:54:14.480 --> 00:54:16.420
You very easily make mistakes.

00:54:16.420 --> 00:54:17.240
So, yeah.

00:54:17.240 --> 00:54:17.560
That's cool.

00:54:17.560 --> 00:54:18.140
Uncertainties.

00:54:18.140 --> 00:54:19.020
That's a cool package.

00:54:19.020 --> 00:54:19.180
Okay.

00:54:19.180 --> 00:54:19.900
Uncertainties.

00:54:19.900 --> 00:54:20.220
Nice.

00:54:20.220 --> 00:54:28.380
Another one that's kind of in that realm is Pint, which lets you do different units and multiplications and divides and whatnot.

00:54:28.380 --> 00:54:29.040
It's pretty cool.

00:54:29.040 --> 00:54:30.060
Okay.

00:54:30.060 --> 00:54:30.580
Very cool.

00:54:30.720 --> 00:54:32.480
That's a good recommendation indeed.

00:54:32.480 --> 00:54:33.220
All right, Sam.

00:54:33.220 --> 00:54:34.240
Well, we're about out of time.

00:54:34.240 --> 00:54:36.780
So, maybe a final call to action.

00:54:36.780 --> 00:54:41.700
People are excited about mybinder.org and this whole concept that we talked about.

00:54:41.700 --> 00:54:42.500
What do they do?

00:54:42.500 --> 00:54:43.300
Try it out.

00:54:43.300 --> 00:54:44.780
Tell a friend about it.

00:54:44.780 --> 00:54:47.880
That is, I think, an easy thing to do.

00:54:47.880 --> 00:54:52.560
And you can get it done because it's easy.

00:54:52.560 --> 00:54:52.960
Yeah.

00:54:52.960 --> 00:54:53.660
Yeah.

00:54:53.660 --> 00:54:57.320
It looks like you've automated a lot and it looks really not hard at all to get started with.

00:54:57.320 --> 00:54:57.560
Yeah.

00:54:57.560 --> 00:55:17.020
And, of course, we would be super happy if people find mistakes or want to add new features if they stop by and make code contributions, make contributions to the documentation, or help us deal with the fact that there's so many people who use it.

00:55:17.020 --> 00:55:25.080
If you have questions, you can contribute to mybinder.org, especially if you can't program.

00:55:25.080 --> 00:55:31.080
That's actually an asset because there's lots of people who know how to program, who help run mybinder.org.

00:55:31.080 --> 00:55:40.600
But explaining how it works, advertising it, giving talks about it, all that kind of good stuff.

00:55:40.600 --> 00:55:44.360
Adding launch and binder to various repositories that should have it.

00:55:44.360 --> 00:55:44.700
Yeah.

00:55:44.700 --> 00:55:46.140
For example, yeah.

00:55:46.520 --> 00:55:48.300
Yeah, those are pretty straightforward things to do.

00:55:48.300 --> 00:55:48.580
Awesome.

00:55:48.580 --> 00:55:49.360
All right.

00:55:49.360 --> 00:55:53.140
Well, it was great to learn more about mybinder.org and what you guys are up to.

00:55:53.140 --> 00:55:54.760
Thanks for being on the show.

00:55:54.760 --> 00:55:57.460
Thanks for taking the time to talk to me.

00:55:57.460 --> 00:55:58.640
Yeah, you bet.

00:55:58.640 --> 00:55:59.000
It was great.

00:55:59.000 --> 00:55:59.500
Bye.

00:55:59.500 --> 00:55:59.880
Bye.

00:55:59.880 --> 00:56:03.700
This has been another episode of Talk Python To Me.

00:56:03.700 --> 00:56:09.500
Our guest on this episode was Tim Head, and it's been brought to you by Linode and Talk Python's online courses.

00:56:09.500 --> 00:56:14.260
Start your next Python project on Linode's state-of-the-art cloud service.

00:56:14.520 --> 00:56:18.580
Just visit talkpython.fm/linode, L-I-N-O-D-E.

00:56:18.580 --> 00:56:21.880
You'll automatically get a $20 credit when you create a new account.

00:56:21.880 --> 00:56:24.460
Want to level up your Python?

00:56:24.460 --> 00:56:29.320
If you're just getting started, try my Python Jumpstart by Building 10 Apps course.

00:56:29.580 --> 00:56:37.460
Or if you're looking for something more advanced, check out our new async course that digs into all the different types of async programming you can do in Python.

00:56:37.460 --> 00:56:42.140
And of course, if you're interested in more than one of these, be sure to check out our Everything Bundle.

00:56:42.140 --> 00:56:44.020
It's like a subscription that never expires.

00:56:44.020 --> 00:56:46.160
Be sure to subscribe to the show.

00:56:46.160 --> 00:56:48.660
Open your favorite podcatcher and search for Python.

00:56:48.660 --> 00:56:49.800
We should be right at the top.

00:56:50.220 --> 00:56:58.780
You can also find the iTunes feed at /itunes, the Google Play feed at /play, and the direct RSS feed at /rss on talkpython.fm.

00:56:59.220 --> 00:57:00.860
This is your host, Michael Kennedy.

00:57:00.860 --> 00:57:02.380
Thanks so much for listening.

00:57:02.380 --> 00:57:03.420
I really appreciate it.

00:57:03.420 --> 00:57:05.180
Now get out there and write some Python code.

00:57:05.180 --> 00:57:25.640
I'll see you next time.

