Transcript
[[!template text="""Okay, so welcome to this session about interactive Python""" start="00:00:00.000" video="mainVideo-python" id="subtitle"]]
[[!template text="""programming. My name is David Vujic and I live and work in""" start="00:00:04.440" video="mainVideo-python" id="subtitle"]]
[[!template text="""Stockholm, Sweden. a developer and today I focus""" start="00:00:09.680" video="mainVideo-python" id="subtitle"]]
[[!template text="""mainly on Python software development. So I do this at work""" start="00:00:15.320" video="mainVideo-python" id="subtitle"]]
[[!template text="""and I also do this on my spare time in my open source projects.""" start="00:00:20.440" video="mainVideo-python" id="subtitle"]]
[[!template text="""Before that, I've been part of the Lisp community. I've""" start="00:00:26.000" video="mainVideo-python" id="subtitle"]]
[[!template text="""been a Clojure developer, and also, like, way back,""" start="00:00:30.480" video="mainVideo-python" id="subtitle"]]
[[!template text="""I was in the Microsoft world and developed C# and .NET stuff.""" start="00:00:33.701" video="mainVideo-python" id="subtitle"]]
[[!template text="""What I've been doing lately is to try to improve the""" start="00:00:40.280" video="mainVideo-python" id="subtitle"]]
[[!template text="""developer experience when you write Python code. So what I""" start="00:00:46.000" video="mainVideo-python" id="subtitle"]]
[[!template text="""want to talk about is this, but also I want to begin with""" start="00:00:52.400" video="mainVideo-python" id="subtitle"]]
[[!template text="""feedback loops because I think it's very related to this""" start="00:00:56.160" video="mainVideo-python" id="subtitle"]]
[[!template text="""interactive programming style, like having this nice""" start="00:01:00.840" video="mainVideo-python" id="subtitle"]]
[[!template text="""feedback when you write code.""" start="00:01:05.360" video="mainVideo-python" id="subtitle"]]
[[!template text="""So I'm going to begin with that.""" start="00:01:07.068" video="mainVideo-python" id="subtitle"]]
[[!template new="1" text="""Feedback loops""" start="00:01:10.534" video="mainVideo-python" id="subtitle"]]
[[!template text="""So this image, you know, this circle is supposed to be a""" start="00:01:10.534" video="mainVideo-python" id="subtitle"]]
[[!template text="""visualization of a feedback loop. Let's say we write our""" start="00:01:14.200" video="mainVideo-python" id="subtitle"]]
[[!template text="""code and then we deploy it to production. Then when it's""" start="00:01:19.880" video="mainVideo-python" id="subtitle"]]
[[!template text="""running there, we can check if things work, or if maybe someone""" start="00:01:25.240" video="mainVideo-python" id="subtitle"]]
[[!template text="""else will let us know. Maybe our customers will let us know.""" start="00:01:29.640" video="mainVideo-python" id="subtitle"]]
[[!template text="""That's a pretty slow feedback loop with potential risks of""" start="00:01:35.320" video="mainVideo-python" id="subtitle"]]
[[!template text="""damaging your business or whatever.""" start="00:01:39.640" video="mainVideo-python" id="subtitle"]]
[[!template text="""This is obvious, of course.""" start="00:01:41.868" video="mainVideo-python" id="subtitle"]]
[[!template text="""So a faster feedback loop probably is to have""" start="00:01:44.168" video="mainVideo-python" id="subtitle"]]
[[!template text="""some kind of automation when you do commits""" start="00:01:50.001" video="mainVideo-python" id="subtitle"]]
[[!template text="""or maybe you have this pull request things and even reviews.""" start="00:01:54.067" video="mainVideo-python" id="subtitle"]]
[[!template text="""So maybe not always as fast as deploy,""" start="00:01:59.734" video="mainVideo-python" id="subtitle"]]
[[!template text="""don't deploy directly to production, but""" start="00:02:02.934" video="mainVideo-python" id="subtitle"]]
[[!template text="""it's probably safer and often you get this automated""" start="00:02:05.840" video="mainVideo-python" id="subtitle"]]
[[!template text="""feedback faster anyway. But it's still kind of slow. You""" start="00:02:10.540" video="mainVideo-python" id="subtitle"]]
[[!template text="""have to wait. You have to push things to GitHub maybe and""" start="00:02:16.200" video="mainVideo-python" id="subtitle"]]
[[!template text="""wait. So there's faster ways for sure to get feedback.""" start="00:02:20.240" video="mainVideo-python" id="subtitle"]]
[[!template text="""So a much faster way is to write code,""" start="00:02:24.280" video="mainVideo-python" id="subtitle"]]
[[!template text="""and write some unit tests, and run those unit tests.""" start="00:02:27.968" video="mainVideo-python" id="subtitle"]]
[[!template text="""So then you do everything on your local machine""" start="00:02:31.368" video="mainVideo-python" id="subtitle"]]
[[!template text="""and you will fairly quickly learn if your code does""" start="00:02:33.468" video="mainVideo-python" id="subtitle"]]
[[!template text="""what you think it does or if it doesn't. I want to zoom in to""" start="00:02:39.040" video="mainVideo-python" id="subtitle"]]
[[!template text="""this test write code and test flow a bit. Let's do that.""" start="00:02:47.160" video="mainVideo-python" id="subtitle"]]
[[!template new="1" text="""Test-driven development""" start="00:02:56.000" video="mainVideo-python" id="subtitle"]]
[[!template text="""As a developer, I have used a thing called test-driven""" start="00:02:56.000" video="mainVideo-python" id="subtitle"]]
[[!template text="""development for quite some time. I find that this way of""" start="00:02:59.760" video="mainVideo-python" id="subtitle"]]
[[!template text="""working is very fast when it comes to getting feedback on""" start="00:03:06.000" video="mainVideo-python" id="subtitle"]]
[[!template text="""what your code does and how you should continue the""" start="00:03:11.260" video="mainVideo-python" id="subtitle"]]
[[!template text="""development. So, test-driven development,""" start="00:03:14.520" video="mainVideo-python" id="subtitle"]]
[[!template text="""basically that you start writing a test for""" start="00:03:19.981" video="mainVideo-python" id="subtitle"]]
[[!template text="""something that you want to develop, and then you continue""" start="00:03:24.221" video="mainVideo-python" id="subtitle"]]
[[!template text="""developing that, and then you go back to the test, and modify""" start="00:03:27.021" video="mainVideo-python" id="subtitle"]]
[[!template text="""and modify the code, and you go back and forth between the""" start="00:03:31.020" video="mainVideo-python" id="subtitle"]]
[[!template text="""tests and the code.""" start="00:03:35.080" video="mainVideo-python" id="subtitle"]]
[[!template text="""It's sort of like a ping-pong game. I find this very""" start="00:03:36.960" video="mainVideo-python" id="subtitle"]]
[[!template text="""effective when you want to get feedback and to know how to""" start="00:03:44.420" video="mainVideo-python" id="subtitle"]]
[[!template text="""continue the development. The most important thing""" start="00:03:50.520" video="mainVideo-python" id="subtitle"]]
[[!template text="""that I feel is that you know what the code does.""" start="00:03:57.234" video="mainVideo-python" id="subtitle"]]
[[!template text="""You learn very quickly.""" start="00:04:01.701" video="mainVideo-python" id="subtitle"]]
[[!template new="1" text="""REPL-driven development""" start="00:04:05.560" video="mainVideo-python" id="subtitle"]]
[[!template text="""Let's zoom into this TDD flow a little bit. The last couple of""" start="00:04:05.560" video="mainVideo-python" id="subtitle"]]
[[!template text="""years, I've been doing a slightly different thing which is""" start="00:04:12.200" video="mainVideo-python" id="subtitle"]]
[[!template text="""called REPL-driven development. REPL-driven""" start="00:04:17.380" video="mainVideo-python" id="subtitle"]]
[[!template text="""development is very similar to test-driven development,""" start="00:04:21.980" video="mainVideo-python" id="subtitle"]]
[[!template text="""but I find it even quicker. You get feedback even quicker""" start="00:04:25.720" video="mainVideo-python" id="subtitle"]]
[[!template text="""than with a regular TDD setup. So REPL-driven development""" start="00:04:31.160" video="mainVideo-python" id="subtitle"]]
[[!template text="""is about writing and evaluating code in a REPL basically.""" start="00:04:34.980" video="mainVideo-python" id="subtitle"]]
[[!template text="""And you can do experiments and you can refactor and""" start="00:04:41.200" video="mainVideo-python" id="subtitle"]]
[[!template text="""re-evaluate and you get instant feedback on what the code""" start="00:04:46.840" video="mainVideo-python" id="subtitle"]]
[[!template text="""does and what you need to change. So I think that's even""" start="00:04:51.700" video="mainVideo-python" id="subtitle"]]
[[!template text="""faster than test-driven development.""" start="00:04:54.800" video="mainVideo-python" id="subtitle"]]
[[!template text="""Okay, REPL driven development. Let's go back. What's the""" start="00:04:59.520" video="mainVideo-python" id="subtitle"]]
[[!template text="""REPL? Most of developers know what a REPL is. The most common""" start="00:05:02.900" video="mainVideo-python" id="subtitle"]]
[[!template text="""setup is you open this shell and you use the REPL for your""" start="00:05:10.760" video="mainVideo-python" id="subtitle"]]
[[!template text="""programming language. In this case I'm using the Python""" start="00:05:16.400" video="mainVideo-python" id="subtitle"]]
[[!template text="""REPL or the IPython REPL which is an enhanced REPL for Python""" start="00:05:19.360" video="mainVideo-python" id="subtitle"]]
[[!template text="""development. So what happens here is that we start a REPL""" start="00:05:25.620" video="mainVideo-python" id="subtitle"]]
[[!template text="""session in isolation. So this session knows about the""" start="00:05:30.680" video="mainVideo-python" id="subtitle"]]
[[!template text="""Python environment. So it knows about the Python language""" start="00:05:34.920" video="mainVideo-python" id="subtitle"]]
[[!template text="""basically. So as soon as we start writing things, adding""" start="00:05:38.120" video="mainVideo-python" id="subtitle"]]
[[!template text="""variables or creating writing functions or even doing""" start="00:05:42.360" video="mainVideo-python" id="subtitle"]]
[[!template text="""imports. Then the session will be more and more aware of the""" start="00:05:47.360" video="mainVideo-python" id="subtitle"]]
[[!template text="""code so we will add things to the to the session and then that""" start="00:05:51.680" video="mainVideo-python" id="subtitle"]]
[[!template text="""means that we can run functions we can print out these""" start="00:05:55.820" video="mainVideo-python" id="subtitle"]]
[[!template text="""variables and things like that. But with REPL driven""" start="00:06:00.520" video="mainVideo-python" id="subtitle"]]
[[!template text="""development it's not really that well at least not what I""" start="00:06:05.860" video="mainVideo-python" id="subtitle"]]
[[!template text="""mean with REPL driven development. So what I'm thinking of""" start="00:06:09.840" video="mainVideo-python" id="subtitle"]]
[[!template text="""is that you are in your code editor where you have your""" start="00:06:14.040" video="mainVideo-python" id="subtitle"]]
[[!template text="""autocomplete, and you have your syntax highlighting and""" start="00:06:19.640" video="mainVideo-python" id="subtitle"]]
[[!template text="""your favorite theme, color theme, and all of those things. But""" start="00:06:22.800" video="mainVideo-python" id="subtitle"]]
[[!template text="""instead, you have this running REPL in the background or in a""" start="00:06:30.460" video="mainVideo-python" id="subtitle"]]
[[!template text="""smaller window or buffer. So that means that you write code""" start="00:06:34.980" video="mainVideo-python" id="subtitle"]]
[[!template text="""and you can send that code to the running REPL, to the REPL""" start="00:06:41.140" video="mainVideo-python" id="subtitle"]]
[[!template text="""session. You write and do everything as you would do when""" start="00:06:45.320" video="mainVideo-python" id="subtitle"]]
[[!template text="""writing your code basically. In this case, in this""" start="00:06:50.400" video="mainVideo-python" id="subtitle"]]
[[!template text="""example, I have evaluated these two functions. I've sent""" start="00:06:55.220" video="mainVideo-python" id="subtitle"]]
[[!template text="""them to the REPL session so it's aware of these functions.""" start="00:07:00.600" video="mainVideo-python" id="subtitle"]]
[[!template text="""Then I switched to a separate different module and""" start="00:07:05.820" video="mainVideo-python" id="subtitle"]]
[[!template text="""evaluated that one. So the REPL session now knows about""" start="00:07:10.400" video="mainVideo-python" id="subtitle"]]
[[!template text="""these two functions and also these two variables. That""" start="00:07:14.040" video="mainVideo-python" id="subtitle"]]
[[!template text="""means that I can evaluate the state of those variables and""" start="00:07:19.040" video="mainVideo-python" id="subtitle"]]
[[!template text="""change code and re-evaluate and things like that. So in this""" start="00:07:24.000" video="mainVideo-python" id="subtitle"]]
[[!template text="""example if you look in the smaller area there you see that I""" start="00:07:29.000" video="mainVideo-python" id="subtitle"]]
[[!template text="""have evaluated this res variable on line 6 and the output was""" start="00:07:33.640" video="mainVideo-python" id="subtitle"]]
[[!template text="""that it's a dictionary with two keys and two values""" start="00:07:39.640" video="mainVideo-python" id="subtitle"]]
[[!template text="""basically. So this setup works in basically any of your""" start="00:07:42.400" video="mainVideo-python" id="subtitle"]]
[[!template text="""favorite code editors. So you can do this in Visual Studio""" start="00:07:51.220" video="mainVideo-python" id="subtitle"]]
[[!template text="""Code, you can do this in PyCharm or Vim. But what I have done is""" start="00:07:54.080" video="mainVideo-python" id="subtitle"]]
[[!template text="""that... More like what I have missed is that when I write code""" start="00:08:01.240" video="mainVideo-python" id="subtitle"]]
[[!template text="""and do this evaluation, this is really cool, but then I need""" start="00:08:07.120" video="mainVideo-python" id="subtitle"]]
[[!template text="""to switch context if I want to see the result. I have to switch""" start="00:08:10.240" video="mainVideo-python" id="subtitle"]]
[[!template text="""context to this other window. I""" start="00:08:15.460" video="mainVideo-python" id="subtitle"]]
[[!template text="""have my focus on the code and then I have to look in a different""" start="00:08:21.980" video="mainVideo-python" id="subtitle"]]
[[!template text="""place to know the results. And if it's a larger output, then""" start="00:08:25.760" video="mainVideo-python" id="subtitle"]]
[[!template text="""maybe I need to scroll. So I wanted to find out if it was""" start="00:08:31.800" video="mainVideo-python" id="subtitle"]]
[[!template text="""possible to make this even smoother and faster, this""" start="00:08:37.480" video="mainVideo-python" id="subtitle"]]
[[!template text="""feedback loop even faster, so I don't have to switch""" start="00:08:43.480" video="mainVideo-python" id="subtitle"]]
[[!template text="""context. What I've done here is that... I can select a row or a""" start="00:08:45.480" video="mainVideo-python" id="subtitle"]]
[[!template text="""region and I can evaluate and then an overlay, a small pop-up""" start="00:08:52.120" video="mainVideo-python" id="subtitle"]]
[[!template text="""shows up with the evaluated result right next to it. So I can""" start="00:08:58.080" video="mainVideo-python" id="subtitle"]]
[[!template text="""change code and re-evaluate and quickly see the result of it""" start="00:09:03.120" video="mainVideo-python" id="subtitle"]]
[[!template text="""without doing this context switching. So the way I've done""" start="00:09:07.520" video="mainVideo-python" id="subtitle"]]
[[!template text="""it is that I wanted to reuse the existing tooling that I""" start="00:09:12.641" video="mainVideo-python" id="subtitle"]]
[[!template text="""already had. I know that my in-editor REPL, the IPython""" start="00:09:20.680" video="mainVideo-python" id="subtitle"]]
[[!template text="""REPL, already does this evaluation. So I figured maybe I can""" start="00:09:27.740" video="mainVideo-python" id="subtitle"]]
[[!template text="""extract the data and do this visualization as a separate""" start="00:09:31.560" video="mainVideo-python" id="subtitle"]]
[[!template text="""thing. That's how I've done it. What I've done is that""" start="00:09:35.360" video="mainVideo-python" id="subtitle"]]
[[!template text="""I've created this overlay and placed it where my cursor""" start="00:09:40.840" video="mainVideo-python" id="subtitle"]]
[[!template text="""currently is, right next to the code. Then I've""" start="00:09:47.200" video="mainVideo-python" id="subtitle"]]
[[!template text="""extracted the evaluated result and put it in this overlay.""" start="00:09:50.860" video="mainVideo-python" id="subtitle"]]
[[!template text="""I also want this overlay to have this nice looking syntax,""" start="00:09:55.720" video="mainVideo-python" id="subtitle"]]
[[!template text="""so I've set it to this Python mode, so we get this syntax""" start="00:10:01.040" video="mainVideo-python" id="subtitle"]]
[[!template text="""highlighting. Make it look very readable. And as a nice""" start="00:10:04.760" video="mainVideo-python" id="subtitle"]]
[[!template text="""developer experience thing,""" start="00:10:10.560" video="mainVideo-python" id="subtitle"]]
[[!template text="""when you move the cursor, of course you don't want the""" start="00:10:16.880" video="mainVideo-python" id="subtitle"]]
[[!template text="""overlay to be there. You want it to disappear. So those kinds""" start="00:10:20.380" video="mainVideo-python" id="subtitle"]]
[[!template text="""of things I've added. So putting the overlay at the right""" start="00:10:25.680" video="mainVideo-python" id="subtitle"]]
[[!template text="""place and feed it with the evaluated data and then make it""" start="00:10:29.000" video="mainVideo-python" id="subtitle"]]
[[!template text="""disappear when it's not interesting to look at anymore.""" start="00:10:33.280" video="mainVideo-python" id="subtitle"]]
[[!template text="""What I've described so far is something that I use on a""" start="00:10:39.840" video="mainVideo-python" id="subtitle"]]
[[!template text="""daily basis, and it covers most of my needs while doing Python""" start="00:10:44.640" video="mainVideo-python" id="subtitle"]]
[[!template text="""development. But one thing I still miss, and I miss it from my""" start="00:10:50.640" video="mainVideo-python" id="subtitle"]]
[[!template text="""days as a Clojure developer, because over there we could""" start="00:10:56.120" video="mainVideo-python" id="subtitle"]]
[[!template text="""have a running app on our local machine and we can have our""" start="00:11:03.480" video="mainVideo-python" id="subtitle"]]
[[!template text="""editor, and the app and the editor were connected. So when I""" start="00:11:07.920" video="mainVideo-python" id="subtitle"]]
[[!template text="""did some changes in the code, the app would change without""" start="00:11:12.720" video="mainVideo-python" id="subtitle"]]
[[!template text="""any restarts or anything like that. And the same if I would""" start="00:11:17.200" video="mainVideo-python" id="subtitle"]]
[[!template text="""change the state of the app, I can inspect the state from the""" start="00:11:20.560" video="mainVideo-python" id="subtitle"]]
[[!template text="""code. So they were connected. They are connected. So I was""" start="00:11:24.680" video="mainVideo-python" id="subtitle"]]
[[!template text="""thinking, hey, this would be really cool if we could have""" start="00:11:28.920" video="mainVideo-python" id="subtitle"]]
[[!template text="""something like this in Python. And that reminded me of""" start="00:11:32.840" video="mainVideo-python" id="subtitle"]]
[[!template text="""Jupyter and Jupyter notebooks because I think notebooks,""" start="00:11:39.200" video="mainVideo-python" id="subtitle"]]
[[!template text="""the way you do things there, is very similar to what I was""" start="00:11:43.840" video="mainVideo-python" id="subtitle"]]
[[!template text="""trying to achieve. So I was reading up a little bit on how this""" start="00:11:49.660" video="mainVideo-python" id="subtitle"]]
[[!template text="""notebook thing works. It turns out that a notebook is a""" start="00:11:56.880" video="mainVideo-python" id="subtitle"]]
[[!template text="""client that talks to a server, that communicates with a""" start="00:12:00.920" video="mainVideo-python" id="subtitle"]]
[[!template text="""server. It's on the server that all this Python""" start="00:12:05.280" video="mainVideo-python" id="subtitle"]]
[[!template text="""evaluation and all this thing happens. Then what I've""" start="00:12:08.800" video="mainVideo-python" id="subtitle"]]
[[!template text="""done is that instead of starting up IPython in my editor, I""" start="00:12:14.160" video="mainVideo-python" id="subtitle"]]
[[!template text="""start the Jupyter console instead. And then I can give it""" start="00:12:19.660" video="mainVideo-python" id="subtitle"]]
[[!template text="""that unique ID and it will be connected to that running""" start="00:12:23.520" video="mainVideo-python" id="subtitle"]]
[[!template text="""kernel.""" start="00:12:27.160" video="mainVideo-python" id="subtitle"]]
[[!template new="1" text="""FastAPI CRUD""" start="00:12:30.920" video="mainVideo-python" id="subtitle"]]
[[!template text="""In this example, I've created this FastAPI CRUD app that""" start="00:12:30.920" video="mainVideo-python" id="subtitle"]]
[[!template text="""has this create, read, update, and delete endpoints. It""" start="00:12:37.200" video="mainVideo-python" id="subtitle"]]
[[!template text="""has this, it's locally running, it has this database where""" start="00:12:41.920" video="mainVideo-python" id="subtitle"]]
[[!template text="""you can do all these things. I'm running this FastAPI app""" start="00:12:46.400" video="mainVideo-python" id="subtitle"]]
[[!template text="""in the kernel and then I've connected to, I've connected to""" start="00:12:51.640" video="mainVideo-python" id="subtitle"]]
[[!template text="""the kernel in my editor too. Both of them are connected to""" start="00:12:58.060" video="mainVideo-python" id="subtitle"]]
[[!template text="""the kernel. What I do now is that I want to initially create""" start="00:13:03.240" video="mainVideo-python" id="subtitle"]]
[[!template text="""some data. I'm going to add this, creating this message.""" start="00:13:09.720" video="mainVideo-python" id="subtitle"]]
[[!template text="""What I get back is a message ID. I want to experiment in""" start="00:13:15.240" video="mainVideo-python" id="subtitle"]]
[[!template text="""my browser. What do I get with that message ID? I'm""" start="00:13:19.900" video="mainVideo-python" id="subtitle"]]
[[!template text="""evaluating the read function. I instantly get this""" start="00:13:24.360" video="mainVideo-python" id="subtitle"]]
[[!template text="""evaluated result, which was this hello world text. So what""" start="00:13:30.240" video="mainVideo-python" id="subtitle"]]
[[!template text="""happens if I do some changes in this app? I'm going to grab""" start="00:13:34.780" video="mainVideo-python" id="subtitle"]]
[[!template text="""this message ID and write something else.""" start="00:13:39.920" video="mainVideo-python" id="subtitle"]]
[[!template text="""Now I can evaluate the same thing again, and you can see that""" start="00:13:49.660" video="mainVideo-python" id="subtitle"]]
[[!template text="""the content has changed to this new value. My editor isn't""" start="00:13:53.760" video="mainVideo-python" id="subtitle"]]
[[!template text="""in any debug mode or something like that. It doesn't know""" start="00:14:02.400" video="mainVideo-python" id="subtitle"]]
[[!template text="""what database it is. It doesn't have any environment""" start="00:14:07.720" video="mainVideo-python" id="subtitle"]]
[[!template text="""variables set up or something like that. It is only""" start="00:14:11.240" video="mainVideo-python" id="subtitle"]]
[[!template text="""connected to the kernel, and the kernel is aware of that. It's""" start="00:14:14.480" video="mainVideo-python" id="subtitle"]]
[[!template text="""running the app. It has the connection strings and""" start="00:14:17.600" video="mainVideo-python" id="subtitle"]]
[[!template text="""everything that is needed. So that's how this thing works.""" start="00:14:20.480" video="mainVideo-python" id="subtitle"]]
[[!template text="""Now I want to do some inline hacking because I want to store""" start="00:14:28.800" video="mainVideo-python" id="subtitle"]]
[[!template text="""this input that is sent from this app because I want to work""" start="00:14:34.200" video="mainVideo-python" id="subtitle"]]
[[!template text="""with it afterwards. I can add this dictionary that stores""" start="00:14:37.800" video="mainVideo-python" id="subtitle"]]
[[!template text="""this message. I'm updating the source code of this app, and""" start="00:14:42.040" video="mainVideo-python" id="subtitle"]]
[[!template text="""when I run any of these endpoints again, you will see that""" start="00:14:48.760" video="mainVideo-python" id="subtitle"]]
[[!template text="""the state changes, and the new inputs, I can grab and I can use""" start="00:15:03.080" video="mainVideo-python" id="subtitle"]]
[[!template text="""them for quick evaluation or testing. This example is""" start="00:15:08.760" video="mainVideo-python" id="subtitle"]]
[[!template text="""really simple. It was just an integer. For example, if you""" start="00:15:14.400" video="mainVideo-python" id="subtitle"]]
[[!template text="""are sending a more complex object, maybe a pydantic schema""" start="00:15:18.520" video="mainVideo-python" id="subtitle"]]
[[!template text="""or something, and you want to inspect what's coming in, and if""" start="00:15:23.520" video="mainVideo-python" id="subtitle"]]
[[!template text="""you have some sort of validation that you want to test out.""" start="00:15:28.200" video="mainVideo-python" id="subtitle"]]
[[!template text="""The configuration or the code that I wrote to make this work""" start="00:15:34.200" video="mainVideo-python" id="subtitle"]]
[[!template text="""is a little bit different than just adding an overlay. I'm""" start="00:15:38.400" video="mainVideo-python" id="subtitle"]]
[[!template text="""using this overlay just like with the IPython example, but in""" start="00:15:44.160" video="mainVideo-python" id="subtitle"]]
[[!template text="""this case, when I change code, I have to think about where that""" start="00:15:51.000" video="mainVideo-python" id="subtitle"]]
[[!template text="""code lives, because it's the app that runs the code. So it's""" start="00:15:57.840" video="mainVideo-python" id="subtitle"]]
[[!template text="""in the app context I need to manipulate with the data. If you""" start="00:16:02.160" video="mainVideo-python" id="subtitle"]]
[[!template text="""have started the app from maybe a main function and that""" start="00:16:07.040" video="mainVideo-python" id="subtitle"]]
[[!template text="""module imports namespaces, then you need to, if you want to""" start="00:16:11.920" video="mainVideo-python" id="subtitle"]]
[[!template text="""update a function or something like that, you need to update""" start="00:16:17.880" video="mainVideo-python" id="subtitle"]]
[[!template text="""it in the correct namespace. What I did before in IPython""" start="00:16:22.360" video="mainVideo-python" id="subtitle"]]
[[!template text="""by adding and changing things, everything ends up in the""" start="00:16:26.680" video="mainVideo-python" id="subtitle"]]
[[!template text="""global namespace. But here, if you want the app to actually""" start="00:16:29.920" video="mainVideo-python" id="subtitle"]]
[[!template text="""react to the changes, you need to put it in the right""" start="00:16:34.440" video="mainVideo-python" id="subtitle"]]
[[!template text="""namespace. So that's what I do here. I do some lookups, where""" start="00:16:38.480" video="mainVideo-python" id="subtitle"]]
[[!template text="""is this function, and then I do this reload of this function or""" start="00:16:43.480" video="mainVideo-python" id="subtitle"]]
[[!template text="""module. And when I was developing this, I was thinking, hey,""" start="00:16:49.140" video="mainVideo-python" id="subtitle"]]
[[!template text="""this is really ugly. I'm in this REPL and do some""" start="00:16:54.800" video="mainVideo-python" id="subtitle"]]
[[!template text="""manipulation of the imports and things like that. That""" start="00:16:59.320" video="mainVideo-python" id="subtitle"]]
[[!template text="""didn't feel good. Then I was reminded of the IPython. And""" start="00:17:03.560" video="mainVideo-python" id="subtitle"]]
[[!template text="""IPython has this feature to reload any updated""" start="00:17:09.760" video="mainVideo-python" id="subtitle"]]
[[!template text="""submodules. I was curious how do they do it. I looked in the""" start="00:17:15.520" video="mainVideo-python" id="subtitle"]]
[[!template text="""IPython source code and saw that they also use importlib and""" start="00:17:19.120" video="mainVideo-python" id="subtitle"]]
[[!template text="""reloading of this module. Once I've learned that, then I""" start="00:17:24.080" video="mainVideo-python" id="subtitle"]]
[[!template text="""stopped thinking that my code was hacky. I thought it was""" start="00:17:28.360" video="mainVideo-python" id="subtitle"]]
[[!template text="""good enough at least.""" start="00:17:32.600" video="mainVideo-python" id="subtitle"]]
[[!template new="1" text="""Testing with an LLM""" start="00:17:37.160" video="mainVideo-python" id="subtitle"]]
[[!template text="""But one thing that has bothered me for a long time is I quite""" start="00:17:37.160" video="mainVideo-python" id="subtitle"]]
[[!template text="""often want to test out and evaluate individual rows that""" start="00:17:45.060" video="mainVideo-python" id="subtitle"]]
[[!template text="""lives in a function. Quite often, this code uses the input""" start="00:17:50.200" video="mainVideo-python" id="subtitle"]]
[[!template text="""to that function like the input parameters. To be able to""" start="00:17:58.560" video="mainVideo-python" id="subtitle"]]
[[!template text="""do that, I need to manually type some fake data and set it to""" start="00:18:02.640" video="mainVideo-python" id="subtitle"]]
[[!template text="""this variable, and then I can evaluate the code. But I think""" start="00:18:07.720" video="mainVideo-python" id="subtitle"]]
[[!template text="""that takes... That slows me down. I was thinking, maybe I can""" start="00:18:12.280" video="mainVideo-python" id="subtitle"]]
[[!template text="""do this in a quicker way, so I have this quicker feedback, so I""" start="00:18:17.780" video="mainVideo-python" id="subtitle"]]
[[!template text="""can run this or evaluate this code much quicker.""" start="00:18:23.440" video="mainVideo-python" id="subtitle"]]
[[!template text="""So my idea was maybe I""" start="00:18:27.934" video="mainVideo-python" id="subtitle"]]
[[!template text="""can use an LLM for this. If I give it the parameters, maybe it""" start="00:18:29.440" video="mainVideo-python" id="subtitle"]]
[[!template text="""can return some random data so I don't have to write it""" start="00:18:35.240" video="mainVideo-python" id="subtitle"]]
[[!template text="""myself. I ended up doing that. I have this source code.""" start="00:18:41.120" video="mainVideo-python" id="subtitle"]]
[[!template text="""I'm loading the REPL with the code. Then I select this""" start="00:18:44.120" video="mainVideo-python" id="subtitle"]]
[[!template text="""function name and the parameters with its data type. I""" start="00:18:50.400" video="mainVideo-python" id="subtitle"]]
[[!template text="""have this prompt that instructs the LLM to come up with fake""" start="00:18:56.720" video="mainVideo-python" id="subtitle"]]
[[!template text="""data based on the tag name and on the data type. And then I can""" start="00:19:02.840" video="mainVideo-python" id="subtitle"]]
[[!template text="""send that to the REPL. I do that with a key command. Then""" start="00:19:06.240" video="mainVideo-python" id="subtitle"]]
[[!template text="""I can proceed by running the code within the function that""" start="00:19:10.100" video="mainVideo-python" id="subtitle"]]
[[!template text="""uses these inputs. This works for all the data types. If""" start="00:19:16.020" video="mainVideo-python" id="subtitle"]]
[[!template text="""there's a custom data type, you need to give the LLM extra""" start="00:19:21.720" video="mainVideo-python" id="subtitle"]]
[[!template text="""context. So that's something to think about. Once it knows""" start="00:19:26.280" video="mainVideo-python" id="subtitle"]]
[[!template text="""the context, it can generate this fake data that very often is""" start="00:19:30.400" video="mainVideo-python" id="subtitle"]]
[[!template text="""good enough just to test out, you know, like I've done here, like""" start="00:19:35.680" video="mainVideo-python" id="subtitle"]]
[[!template text="""string... sorry, list destructuring and parsing and things""" start="00:19:39.840" video="mainVideo-python" id="subtitle"]]
[[!template text="""like that. I think that was all I had, and thank you for""" start="00:19:45.400" video="mainVideo-python" id="subtitle"]]
[[!template text="""listening!""" start="00:19:51.880" video="mainVideo-python" id="subtitle"]]
Captioner: sachac
Q&A transcript (unedited)
[[!template text="""So as we wait for people to drop""" start="00:00:00.000" video="qanda-python" id="subtitle"]]
[[!template text="""in their questions and so on,""" start="00:00:02.840" video="qanda-python" id="subtitle"]]
[[!template text="""I'll just kind of add a couple of thoughts.""" start="00:00:04.280" video="qanda-python" id="subtitle"]]
[[!template text="""I'm not personally much of a Python developer,""" start="00:00:08.720" video="qanda-python" id="subtitle"]]
[[!template text="""so I'm just curious as to your thoughts on using Emacs""" start="00:00:12.040" video="qanda-python" id="subtitle"]]
[[!template text="""and kind of the development methodology you showed""" start="00:00:17.760" video="qanda-python" id="subtitle"]]
[[!template text="""as a way to learn Python.""" start="00:00:24.320" video="qanda-python" id="subtitle"]]
[[!template text="""Yeah, I think Emacs is perfect for it.""" start="00:00:26.520" video="qanda-python" id="subtitle"]]
[[!template text="""If you're already an Emacs user""" start="00:00:29.240" video="qanda-python" id="subtitle"]]
[[!template text="""and you have the keyboard commands""" start="00:00:31.760" video="qanda-python" id="subtitle"]]
[[!template text="""and everything uploaded in your brain,""" start="00:00:35.600" video="qanda-python" id="subtitle"]]
[[!template text="""then learning Python shouldn't be too difficult,""" start="00:00:38.720" video="qanda-python" id="subtitle"]]
[[!template text="""because there's a lot of good packages.""" start="00:00:42.600" video="qanda-python" id="subtitle"]]
[[!template text="""For Python, I'm using a thing called elpy,""" start="00:00:44.840" video="qanda-python" id="subtitle"]]
[[!template text="""which is really good. for Python development.""" start="00:00:51.320" video="qanda-python" id="subtitle"]]
[[!template text="""So you have this connection to a running backend,""" start="00:00:55.680" video="qanda-python" id="subtitle"]]
[[!template text="""the Jedi Python backend that will give you autocomplete""" start="00:01:00.040" video="qanda-python" id="subtitle"]]
[[!template text="""and some refactoring and things like that.""" start="00:01:06.040" video="qanda-python" id="subtitle"]]
[[!template text="""So I think Emacs is really good for Python development.""" start="00:01:09.040" video="qanda-python" id="subtitle"]]
[[!template text="""So what are some other...""" start="00:01:14.440" video="qanda-python" id="subtitle"]]
[[!template text="""How long have you been using Emacs?""" start="00:01:16.680" video="qanda-python" id="subtitle"]]
[[!template text="""Kind of a general question.""" start="00:01:18.320" video="qanda-python" id="subtitle"]]
[[!template text="""Sorry if you covered this and I missed it.""" start="00:01:19.600" video="qanda-python" id="subtitle"]]
[[!template text="""It's not that long actually.""" start="00:01:23.600" video="qanda-python" id="subtitle"]]
[[!template text="""I think it was in 2019 or 2020.""" start="00:01:26.600" video="qanda-python" id="subtitle"]]
[[!template text="""It's when I started to, I was really fortunate enough""" start="00:01:31.600" video="qanda-python" id="subtitle"]]
[[!template text="""to join a team that had chosen to""" start="00:01:34.800" video="qanda-python" id="subtitle"]]
[[!template text="""develop an app in Lisp, in Clojure.""" start="00:01:38.040" video="qanda-python" id="subtitle"]]
[[!template text="""yeah and i didn't know anything about it""" start="00:01:42.920" video="qanda-python" id="subtitle"]]
[[!template text="""i didn't know lisp at all so it was like brand new""" start="00:01:45.040" video="qanda-python" id="subtitle"]]
[[!template text="""so i really had struggling to to learn it""" start="00:01:47.360" video="qanda-python" id="subtitle"]]
[[!template text="""but at the same time i was looking for okay""" start="00:01:50.640" video="qanda-python" id="subtitle"]]
[[!template text="""which editor should i pick to to do this""" start="00:01:53.560" video="qanda-python" id="subtitle"]]
[[!template text="""and i was before that and like an ide person""" start="00:01:55.280" video="qanda-python" id="subtitle"]]
[[!template text="""so i do use this big ideas""" start="00:02:00.240" video="qanda-python" id="subtitle"]]
[[!template text="""and this time i figured maybe i should try something different.""" start="00:02:02.920" video="qanda-python" id="subtitle"]]
[[!template text="""And I read this book about Clojure development""" start="00:02:07.840" video="qanda-python" id="subtitle"]]
[[!template text="""and the author was really into Emacs""" start="00:02:10.240" video="qanda-python" id="subtitle"]]
[[!template text="""and he was like, Clojure is really good for,""" start="00:02:13.240" video="qanda-python" id="subtitle"]]
[[!template text="""Emacs is really good for Clojure development.""" start="00:02:17.160" video="qanda-python" id="subtitle"]]
[[!template text="""So that's how I started.""" start="00:02:19.160" video="qanda-python" id="subtitle"]]
[[!template text="""So I like to learn, rewired my brain""" start="00:02:20.760" video="qanda-python" id="subtitle"]]
[[!template text="""to learn all how Emacs works""" start="00:02:24.480" video="qanda-python" id="subtitle"]]
[[!template text="""as opposed to like the mainstream editors out there.""" start="00:02:27.640" video="qanda-python" id="subtitle"]]
[[!template text="""So that's how it started. So like five years ago, maybe.""" start="00:02:30.960" video="qanda-python" id="subtitle"]]
[[!template text="""Cool. Um, so did you, what were some other,""" start="00:02:33.520" video="qanda-python" id="subtitle"]]
[[!template text="""what, what, what editor were you primarily using before you?""" start="00:02:39.520" video="qanda-python" id="subtitle"]]
[[!template text="""Um, um, back, back then it was like,""" start="00:02:44.000" video="qanda-python" id="subtitle"]]
[[!template text="""I think it was like Sublime Text.""" start="00:02:49.400" video="qanda-python" id="subtitle"]]
[[!template text="""And also some IntelliJ, sorry, JetBrains, their tools.""" start="00:02:52.720" video="qanda-python" id="subtitle"]]
[[!template text="""And before that, I was in the Microsoft world,""" start="00:02:57.720" video="qanda-python" id="subtitle"]]
[[!template text="""so it's like Microsoft toolings basically.""" start="00:03:04.600" video="qanda-python" id="subtitle"]]
[[!template text="""So I moved towards open source tooling""" start="00:03:08.200" video="qanda-python" id="subtitle"]]
[[!template text="""and also open source development. Very cool.""" start="00:03:10.880" video="qanda-python" id="subtitle"]]
[[!template text="""So I see we've got a couple people""" start="00:03:16.680" video="qanda-python" id="subtitle"]]
[[!template text="""that have joined on the BBB here with us""" start="00:03:19.120" video="qanda-python" id="subtitle"]]
[[!template text="""for the live question.""" start="00:03:23.480" video="qanda-python" id="subtitle"]]
[[!template text="""You're welcome to just throw your question in this chat,""" start="00:03:24.960" video="qanda-python" id="subtitle"]]
[[!template text="""or if you've got a microphone connected,""" start="00:03:29.200" video="qanda-python" id="subtitle"]]
[[!template text="""you're welcome to come off mute""" start="00:03:32.040" video="qanda-python" id="subtitle"]]
[[!template text="""and throw a question in that way as well.""" start="00:03:34.600" video="qanda-python" id="subtitle"]]
[[!template text="""You can join on liberachat IRC.""" start="00:03:36.760" video="qanda-python" id="subtitle"]]
[[!template text="""You can join pound emacs comp hyphen dev,""" start="00:03:40.360" video="qanda-python" id="subtitle"]]
[[!template text="""and we would happily take your questions there.""" start="00:03:44.120" video="qanda-python" id="subtitle"]]
[[!template text="""Meanwhile, I've got a question""" start="00:03:47.280" video="qanda-python" id="subtitle"]]
[[!template text="""coming in on the pad right now, so take that next.""" start="00:03:49.480" video="qanda-python" id="subtitle"]]
[[!template text="""I'll just read it out.""" start="00:03:52.720" video="qanda-python" id="subtitle"]]
[[!template text="""I don't quite see how your setup works with IPython.""" start="00:03:55.240" video="qanda-python" id="subtitle"]]
[[!template text="""Sorry if you already answered this.""" start="00:03:58.240" video="qanda-python" id="subtitle"]]
[[!template text="""Do you have your Emacs connect to the IPython kernel""" start="00:04:00.280" video="qanda-python" id="subtitle"]]
[[!template text="""over XMPP socket that IPython sets up? Oh, good question.""" start="00:04:03.520" video="qanda-python" id="subtitle"]]
[[!template text="""So what I've done is I have two different connections.""" start="00:04:11.920" video="qanda-python" id="subtitle"]]
[[!template text="""Like if I'm going to do this regular day-to-day Python work""" start="00:04:18.040" video="qanda-python" id="subtitle"]]
[[!template text="""when I want to evaluate code""" start="00:04:21.360" video="qanda-python" id="subtitle"]]
[[!template text="""without thinking about the external connection,""" start="00:04:24.400" video="qanda-python" id="subtitle"]]
[[!template text="""then I just use IPython""" start="00:04:29.960" video="qanda-python" id="subtitle"]]
[[!template text="""and I have my I'm using the LP Python package""" start="00:04:31.560" video="qanda-python" id="subtitle"]]
[[!template text="""so that you can set up which of the REPLs""" start="00:04:36.800" video="qanda-python" id="subtitle"]]
[[!template text="""you want to start when you evaluate code.""" start="00:04:39.840" video="qanda-python" id="subtitle"]]
[[!template text="""So that's IPython. But in the second part of the talk""" start="00:04:42.800" video="qanda-python" id="subtitle"]]
[[!template text="""where I connect to an externally running app,""" start="00:04:46.760" video="qanda-python" id="subtitle"]]
[[!template text="""then I have set up the same configuration""" start="00:04:50.920" video="qanda-python" id="subtitle"]]
[[!template text="""but to start Jupyter, the Jupyter console instead.""" start="00:04:55.840" video="qanda-python" id="subtitle"]]
[[!template text="""And when I start it up, it's going to, it's like a dialogue""" start="00:05:00.960" video="qanda-python" id="subtitle"]]
[[!template text="""that will ask for the ID of a running kernel.""" start="00:05:04.960" video="qanda-python" id="subtitle"]]
[[!template text="""Because if you start a kernel,""" start="00:05:09.600" video="qanda-python" id="subtitle"]]
[[!template text="""if you start something in a kernel,""" start="00:05:10.840" video="qanda-python" id="subtitle"]]
[[!template text="""you will get this unique ID so you can connect to it.""" start="00:05:12.920" video="qanda-python" id="subtitle"]]
[[!template text="""So that's kind of the difference.""" start="00:05:17.080" video="qanda-python" id="subtitle"]]
[[!template text="""So I have two different ways""" start="00:05:19.680" video="qanda-python" id="subtitle"]]
[[!template text="""of starting up the Python kernel. REPLs, either PyPython,""" start="00:05:21.640" video="qanda-python" id="subtitle"]]
[[!template text="""which I do for most of my daily work,""" start="00:05:26.600" video="qanda-python" id="subtitle"]]
[[!template text="""or if I want this connection to a running app,""" start="00:05:29.560" video="qanda-python" id="subtitle"]]
[[!template text="""I'm using the Jupyter console, basically.""" start="00:05:32.240" video="qanda-python" id="subtitle"]]
[[!template text="""Have you explored Org Babel at all?""" start="00:05:38.480" video="qanda-python" id="subtitle"]]
[[!template text="""Can you talk about your approach""" start="00:05:45.200" video="qanda-python" id="subtitle"]]
[[!template text="""compared to the Babel workflow? Oh, interesting.""" start="00:05:48.200" video="qanda-python" id="subtitle"]]
[[!template text="""No, I haven't actually, I haven't done that,""" start="00:05:52.280" video="qanda-python" id="subtitle"]]
[[!template text="""but I think it's similar to Jupyter notebooks,""" start="00:05:54.880" video="qanda-python" id="subtitle"]]
[[!template text="""so you can do some interactive, you can run Python there,""" start="00:05:59.120" video="qanda-python" id="subtitle"]]
[[!template text="""but I haven't,""" start="00:06:02.360" video="qanda-python" id="subtitle"]]
[[!template text="""I have too little knowledge about it to elaborate on that.""" start="00:06:03.280" video="qanda-python" id="subtitle"]]
[[!template text="""Sorry. Very good. All right.""" start="00:06:08.120" video="qanda-python" id="subtitle"]]
[[!template text="""I'm just going to peek over to the other chats""" start="00:06:24.160" video="qanda-python" id="subtitle"]]
[[!template text="""and make sure I'm not missing questions.""" start="00:06:27.000" video="qanda-python" id="subtitle"]]
[[!template text="""Sorry, I got a lot of screens. A little dance here.""" start="00:06:28.840" video="qanda-python" id="subtitle"]]
[[!template text="""All right, and I do see a few people in the chat.""" start="00:06:35.520" video="qanda-python" id="subtitle"]]
[[!template text="""I'll just say again, if you've joined us on the BBB,""" start="00:06:41.240" video="qanda-python" id="subtitle"]]
[[!template text="""you're more than welcome to jump in with your questions""" start="00:06:44.560" video="qanda-python" id="subtitle"]]
[[!template text="""or put questions into the chat here.""" start="00:06:47.000" video="qanda-python" id="subtitle"]]
[[!template text="""I'm not a big Python person,""" start="00:06:50.120" video="qanda-python" id="subtitle"]]
[[!template text="""so I can't get into the really interesting questions""" start="00:06:52.880" video="qanda-python" id="subtitle"]]
[[!template text="""that are probably more relevant,""" start="00:06:57.600" video="qanda-python" id="subtitle"]]
[[!template text="""just because a lot of it's kind of over my head.""" start="00:07:01.640" video="qanda-python" id="subtitle"]]
[[!template text="""Have you seen the miramo.io notebooks?""" start="00:07:05.800" video="qanda-python" id="subtitle"]]
[[!template text="""These use standard Python?""" start="00:07:12.880" video="qanda-python" id="subtitle"]]
[[!template text="""Oh, yes, I've seen, I haven't tried it myself,""" start="00:07:15.280" video="qanda-python" id="subtitle"]]
[[!template text="""but I've seen it.""" start="00:07:18.120" video="qanda-python" id="subtitle"]]
[[!template text="""It's very, I think it's a very interesting approach""" start="00:07:19.360" video="qanda-python" id="subtitle"]]
[[!template text="""that probably will solve a lot of these things""" start="00:07:22.640" video="qanda-python" id="subtitle"]]
[[!template text="""with interactive development in general,""" start="00:07:26.280" video="qanda-python" id="subtitle"]]
[[!template text="""but because I think it's basically Python files""" start="00:07:28.840" video="qanda-python" id="subtitle"]]
[[!template text="""and not the, not this other file format that you have""" start="00:07:31.840" video="qanda-python" id="subtitle"]]
[[!template text="""for the regular notebook setup.""" start="00:07:36.440" video="qanda-python" id="subtitle"]]
[[!template text="""So I have that in my list of things to try out in future,""" start="00:07:40.800" video="qanda-python" id="subtitle"]]
[[!template text="""but it looks really, really cool. Awesome.""" start="00:07:45.560" video="qanda-python" id="subtitle"]]
[[!template text="""Yeah, I'm hesitant to just ask you really boilerplate questions.""" start="00:08:00.720" video="qanda-python" id="subtitle"]]
[[!template text="""You get an expert, a souffle chef,""" start="00:08:06.720" video="qanda-python" id="subtitle"]]
[[!template text="""and you ask about making pasta or some other sort of thing.""" start="00:08:11.240" video="qanda-python" id="subtitle"]]
[[!template text="""No, go ahead. Go ahead. I'm glad to ask any questions.""" start="00:08:16.600" video="qanda-python" id="subtitle"]]
[[!template text="""So just generally about Emacs as a coding developer,""" start="00:08:20.560" video="qanda-python" id="subtitle"]]
[[!template text="""what are the features""" start="00:08:25.680" video="qanda-python" id="subtitle"]]
[[!template text="""that you tend to lean on more heavily?""" start="00:08:27.000" video="qanda-python" id="subtitle"]]
[[!template text="""you know completion or you know what what have you""" start="00:08:28.480" video="qanda-python" id="subtitle"]]
[[!template text="""maybe I could put it better""" start="00:08:34.320" video="qanda-python" id="subtitle"]]
[[!template text="""as what have you spent more time configuring for Emacs""" start="00:08:36.200" video="qanda-python" id="subtitle"]]
[[!template text="""to facilitate development?""" start="00:08:40.080" video="qanda-python" id="subtitle"]]
[[!template text="""Yes initially it was basically taking away""" start="00:08:45.440" video="qanda-python" id="subtitle"]]
[[!template text="""some of the UI features""" start="00:08:49.640" video="qanda-python" id="subtitle"]]
[[!template text="""basically disabling it and and but fairly quickly""" start="00:08:51.320" video="qanda-python" id="subtitle"]]
[[!template text="""for for both closure development""" start="00:08:56.600" video="qanda-python" id="subtitle"]]
[[!template text="""where i was using cider which is like a really good uh good tool um""" start="00:08:58.920" video="qanda-python" id="subtitle"]]
[[!template text="""and for python when i quickly found lp elp""" start="00:09:04.600" video="qanda-python" id="subtitle"]]
[[!template text="""i'm not sure how to pronounce it""" start="00:09:08.160" video="qanda-python" id="subtitle"]]
[[!template text="""but you you get so much uh good things from these tools""" start="00:09:10.600" video="qanda-python" id="subtitle"]]
[[!template text="""so what i've done additionally is like theme""" start="00:09:16.040" video="qanda-python" id="subtitle"]]
[[!template text="""and maybe having this environment""" start="00:09:21.720" video="qanda-python" id="subtitle"]]
[[!template text="""that is without disturbance.""" start="00:09:27.160" video="qanda-python" id="subtitle"]]
[[!template text="""So I really like the code to have my full attention.""" start="00:09:31.480" video="qanda-python" id="subtitle"]]
[[!template text="""So I rarely have, maybe I have like a preview sometimes,""" start="00:09:34.840" video="qanda-python" id="subtitle"]]
[[!template text="""but mostly it's the window or the buffer where I have my code""" start="00:09:41.240" video="qanda-python" id="subtitle"]]
[[!template text="""and I've minimized the running REPL buffer.""" start="00:09:45.360" video="qanda-python" id="subtitle"]]
[[!template text="""So sometimes it's, I'm hiding it, but it's still active.""" start="00:09:49.880" video="qanda-python" id="subtitle"]]
[[!template text="""So basically that's how I configured,""" start="00:09:53.440" video="qanda-python" id="subtitle"]]
[[!template text="""spent my configuration doing that.""" start="00:09:57.680" video="qanda-python" id="subtitle"]]
[[!template text="""And also lately, trying out some LLM tools.""" start="00:10:00.280" video="qanda-python" id="subtitle"]]
[[!template text="""So I think I have two packages""" start="00:10:04.800" video="qanda-python" id="subtitle"]]
[[!template text="""that I'm using actively today.""" start="00:10:09.280" video="qanda-python" id="subtitle"]]
[[!template text="""And my favorite is a tool called ECA,""" start="00:10:12.240" video="qanda-python" id="subtitle"]]
[[!template text="""which is a LLM chat assistant, which is really good.""" start="00:10:15.800" video="qanda-python" id="subtitle"]]
[[!template text="""The developer is also an Emacs enthusiast.""" start="00:10:20.200" video="qanda-python" id="subtitle"]]
[[!template text="""So are you the type of person that tends to work with""" start="00:10:24.400" video="qanda-python" id="subtitle"]]
[[!template text="""like a master builder, build your own Emacs?""" start="00:10:33.640" video="qanda-python" id="subtitle"]]
[[!template text="""Are you using the system packages?""" start="00:10:37.040" video="qanda-python" id="subtitle"]]
[[!template text="""What's your approach to just get Emacs""" start="00:10:40.800" video="qanda-python" id="subtitle"]]
[[!template text="""up and off the ground for yourself?""" start="00:10:43.616" video="qanda-python" id="subtitle"]]
[[!template text="""I'm not there yet with doing my own builds.""" start="00:10:45.369" video="qanda-python" id="subtitle"]]
[[!template text="""Currently, I'm on macOS,""" start="00:10:52.520" video="qanda-python" id="subtitle"]]
[[!template text="""so I'm installing Emacs through broom basically, homebrew.""" start="00:10:55.600" video="qanda-python" id="subtitle"]]
[[!template text="""I've yet so much Emacs things to learn""" start="00:11:00.040" video="qanda-python" id="subtitle"]]
[[!template text="""because I'm not even using org yet.""" start="00:11:04.920" video="qanda-python" id="subtitle"]]
[[!template text="""I'm exploring the this editor.""" start="00:11:07.740" video="qanda-python" id="subtitle"]]
[[!template text="""So I feel like I'm very much a beginner.""" start="00:11:11.560" video="qanda-python" id="subtitle"]]
[[!template text="""I'm not using Emacs to its full potential yet.""" start="00:11:14.800" video="qanda-python" id="subtitle"]]
[[!template text="""So I'm counting on that I will be more and more using Emacs""" start="00:11:17.920" video="qanda-python" id="subtitle"]]
[[!template text="""for more and more different tasks basically.""" start="00:11:23.280" video="qanda-python" id="subtitle"]]
[[!template text="""And I'm just seeing a comment.""" start="00:11:29.120" video="qanda-python" id="subtitle"]]
[[!template text="""Ed Stallthroat says, thank you""" start="00:11:32.560" video="qanda-python" id="subtitle"]]
[[!template text="""for publishing your configuration and offers a link.""" start="00:11:35.800" video="qanda-python" id="subtitle"]]
[[!template text="""Oh, great. Great.""" start="00:11:40.840" video="qanda-python" id="subtitle"]]
[[!template text="""Yes, those things that I showed in my talk,""" start="00:11:41.880" video="qanda-python" id="subtitle"]]
[[!template text="""I haven't made any, I haven't packaged it yet,""" start="00:11:46.360" video="qanda-python" id="subtitle"]]
[[!template text="""but everything is on my GitHub,""" start="00:11:49.320" video="qanda-python" id="subtitle"]]
[[!template text="""and I've tried to separate each feature""" start="00:11:51.200" video="qanda-python" id="subtitle"]]
[[!template text="""in separate LSP files.""" start="00:11:57.080" video="qanda-python" id="subtitle"]]
[[!template text="""So it should be, I hope that it's fairly straightforward""" start="00:11:59.640" video="qanda-python" id="subtitle"]]
[[!template text="""to understand how it's set up. Very good.""" start="00:12:04.320" video="qanda-python" id="subtitle"]]
[[!template text="""Let me just scroll down,""" start="00:12:08.960" video="qanda-python" id="subtitle"]]
[[!template text="""make sure I'm not missing questions here.""" start="00:12:11.120" video="qanda-python" id="subtitle"]]
[[!template text="""Okay, I think those are the questions that we have.""" start="00:12:13.000" video="qanda-python" id="subtitle"]]
[[!template text="""We can take a couple more minutes if you're open to that,""" start="00:12:16.960" video="qanda-python" id="subtitle"]]
[[!template text="""just for people to consider.""" start="00:12:20.880" video="qanda-python" id="subtitle"]]
[[!template text="""I know we're coming up on the lunch hour,""" start="00:12:24.040" video="qanda-python" id="subtitle"]]
[[!template text="""so it may be that people are jogging off to get some food.""" start="00:12:26.120" video="qanda-python" id="subtitle"]]
[[!template text="""Yeah, in Sweden, it's dinner time.""" start="00:12:31.680" video="qanda-python" id="subtitle"]]
[[!template text="""It's like 6 p.m. soon. That fits.""" start="00:12:36.600" video="qanda-python" id="subtitle"]]
[[!template text="""So are you involved with local Emacs meetups?""" start="00:12:40.080" video="qanda-python" id="subtitle"]]
[[!template text="""I know that your part of the world""" start="00:12:46.440" video="qanda-python" id="subtitle"]]
[[!template text="""has a really brisk community,""" start="00:12:49.080" video="qanda-python" id="subtitle"]]
[[!template text="""you know, a lot of, just a lot going on.""" start="00:12:51.800" video="qanda-python" id="subtitle"]]
[[!template text="""I'm always seeing in Sacha's Emacs News,""" start="00:12:55.280" video="qanda-python" id="subtitle"]]
[[!template text="""all of the different meetups and so on.""" start="00:12:58.800" video="qanda-python" id="subtitle"]]
[[!template text="""I'm curious if you're plugged""" start="00:13:02.320" video="qanda-python" id="subtitle"]]
[[!template text="""into a local community there at all, No, I haven't.""" start="00:13:03.520" video="qanda-python" id="subtitle"]]
[[!template text="""Not in any community. I haven't done that yet,""" start="00:13:08.720" video="qanda-python" id="subtitle"]]
[[!template text="""but we are like friends that I've gotten to know""" start="00:13:10.760" video="qanda-python" id="subtitle"]]
[[!template text="""through work and through like open source work that also use Emacs.""" start="00:13:15.680" video="qanda-python" id="subtitle"]]
[[!template text="""We talk and share our conflicts""" start="00:13:23.440" video="qanda-python" id="subtitle"]]
[[!template text="""basically on a regular basis,""" start="00:13:28.960" video="qanda-python" id="subtitle"]]
[[!template text="""because we are, at least in the Python community,""" start="00:13:30.800" video="qanda-python" id="subtitle"]]
[[!template text="""we're like a minority,""" start="00:13:36.000" video="qanda-python" id="subtitle"]]
[[!template text="""like other editors are like the standards.""" start="00:13:37.400" video="qanda-python" id="subtitle"]]
[[!template text="""And at work, I'm sharing what I'm doing,""" start="00:13:39.800" video="qanda-python" id="subtitle"]]
[[!template text="""just like my talk here to my fellow co-workers""" start="00:13:45.880" video="qanda-python" id="subtitle"]]
[[!template text="""that are not on Emacs, but I hope to get their interest up.""" start="00:13:48.680" video="qanda-python" id="subtitle"]]
[[!template text="""So many of us Emacs users are Emacs evangelists.""" start="00:13:54.000" video="qanda-python" id="subtitle"]]
[[!template text="""Yeah. It's the Venn diagram of Emacs user""" start="00:13:59.000" video="qanda-python" id="subtitle"]]
[[!template text="""and Emacs evangelist is a circle, I think.""" start="00:14:06.202" video="qanda-python" id="subtitle"]]
[[!template text="""Yeah, I think so too.""" start="00:14:08.869" video="qanda-python" id="subtitle"]]
[[!template text="""Well, David, I super appreciate your talk""" start="00:14:11.036" video="qanda-python" id="subtitle"]]
[[!template text="""and thank you so much also for...""" start="00:14:16.560" video="qanda-python" id="subtitle"]]
[[!template text="""I'm sorry, I saw another question here. Let me cover that.""" start="00:14:18.760" video="qanda-python" id="subtitle"]]
[[!template text="""Can you repeat the name of the LLM""" start="00:14:24.640" video="qanda-python" id="subtitle"]]
[[!template text="""that you specifically mentioned there?""" start="00:14:27.960" video="qanda-python" id="subtitle"]]
[[!template text="""Oh, it's a tool called ECA, E-C-A.""" start="00:14:30.320" video="qanda-python" id="subtitle"]]
[[!template text="""It's basically a server and clients,""" start="00:14:36.785" video="qanda-python" id="subtitle"]]
[[!template text="""and it's not only Emacs. It has support for other editors,""" start="00:14:44.077" video="qanda-python" id="subtitle"]]
[[!template text="""but I think the primary support is for,""" start="00:14:49.161" video="qanda-python" id="subtitle"]]
[[!template text="""at least the developer who does it is an Emacs user,""" start="00:14:53.120" video="qanda-python" id="subtitle"]]
[[!template text="""and so it's like Emacs first, basically.""" start="00:14:57.600" video="qanda-python" id="subtitle"]]
[[!template text="""And his name is Eric Dallo.""" start="00:15:01.040" video="qanda-python" id="subtitle"]]
[[!template text="""He's a great developer in the Clojure community.""" start="00:15:04.960" video="qanda-python" id="subtitle"]]
[[!template text="""He has done some LSP work in the Clojure world, too.""" start="00:15:09.680" video="qanda-python" id="subtitle"]]
[[!template text="""What was the last name? What was Eric's last name?""" start="00:15:13.160" video="qanda-python" id="subtitle"]]
[[!template text="""Eric Dallo, D-A-L-L-O. Yeah.""" start="00:15:17.160" video="qanda-python" id="subtitle"]]
[[!template text="""So I think that's a great tool, but I also use another tool""" start="00:15:23.920" video="qanda-python" id="subtitle"]]
[[!template text="""that for some reason I forgot to have this interactive way of,""" start="00:15:31.880" video="qanda-python" id="subtitle"]]
[[!template text="""because I think they are developing that feature too,""" start="00:15:38.920" video="qanda-python" id="subtitle"]]
[[!template text="""but I have another LLM that has support""" start="00:15:43.600" video="qanda-python" id="subtitle"]]
[[!template text="""for requests and callbacks basically.""" start="00:15:46.440" video="qanda-python" id="subtitle"]]
[[!template text="""So you can do something programmatically.""" start="00:15:50.600" video="qanda-python" id="subtitle"]]
[[!template text="""So that's how I've solved my LLM thing""" start="00:15:53.800" video="qanda-python" id="subtitle"]]
[[!template text="""where I select some Python variables""" start="00:15:55.920" video="qanda-python" id="subtitle"]]
[[!template text="""and tell the LLM to populate it with some fake data""" start="00:16:00.760" video="qanda-python" id="subtitle"]]
[[!template text="""so I can send that to the REPL.""" start="00:16:05.600" video="qanda-python" id="subtitle"]]
[[!template text="""But for some reason, I forgot the name of it.""" start="00:16:08.880" video="qanda-python" id="subtitle"]]
[[!template text="""I can look it up. Just give me one minute, sorry.""" start="00:16:11.480" video="qanda-python" id="subtitle"]]
[[!template text="""oh yeah gptel gptel that's that's the name of the other tool""" start="00:16:25.160" video="qanda-python" id="subtitle"]]
[[!template text="""which is uh also a good tool yeah""" start="00:16:35.560" video="qanda-python" id="subtitle"]]
[[!template text="""but ECA is more like a more chat companion""" start="00:16:37.880" video="qanda-python" id="subtitle"]]
[[!template text="""and this you can also you can tell it to write code and things like that""" start="00:16:41.280" video="qanda-python" id="subtitle"]]
[[!template text="""but i mostly use it for reviews and research""" start="00:16:46.680" video="qanda-python" id="subtitle"]]
[[!template text="""and like asking questions""" start="00:16:51.680" video="qanda-python" id="subtitle"]]
[[!template text="""because i want to my I don't have a problem with typing code.""" start="00:16:54.600" video="qanda-python" id="subtitle"]]
[[!template text="""I don't think that slows me down,""" start="00:17:00.280" video="qanda-python" id="subtitle"]]
[[!template text="""but maybe getting some quick feedback""" start="00:17:01.920" video="qanda-python" id="subtitle"]]
[[!template text="""on the actual work that I'm doing,""" start="00:17:05.640" video="qanda-python" id="subtitle"]]
[[!template text="""that's what I'm using LLM for,""" start="00:17:07.480" video="qanda-python" id="subtitle"]]
[[!template text="""on LLM for two, mostly today. That really hits for me.""" start="00:17:09.000" video="qanda-python" id="subtitle"]]
[[!template text="""I don't mind typing either.""" start="00:17:13.520" video="qanda-python" id="subtitle"]]
[[!template text="""I think somehow having things be so simple""" start="00:17:15.200" video="qanda-python" id="subtitle"]]
[[!template text="""and in many cases just automated,""" start="00:17:18.480" video="qanda-python" id="subtitle"]]
[[!template text="""Emacs just does the right thing.""" start="00:17:20.880" video="qanda-python" id="subtitle"]]
[[!template text="""It makes me hungry to type. I want to type more.""" start="00:17:22.720" video="qanda-python" id="subtitle"]]
[[!template text="""It feels like every keystroke does a little more.""" start="00:17:26.520" video="qanda-python" id="subtitle"]]
[[!template text="""Speaking of evangelism, thank you. Thank you""" start="00:17:28.560" video="qanda-python" id="subtitle"]]
[[!template text="""pop up for the for the question.""" start="00:17:33.520" video="qanda-python" id="subtitle"]]
[[!template text="""I'm just going to peek one more time through""" start="00:17:35.600" video="qanda-python" id="subtitle"]]
[[!template text="""and I don't see a backlog.""" start="00:17:39.440" video="qanda-python" id="subtitle"]]
[[!template text="""There are a couple more comments here""" start="00:17:41.160" video="qanda-python" id="subtitle"]]
[[!template text="""linking linking to the ECA Emacs and gptel.""" start="00:17:44.520" video="qanda-python" id="subtitle"]]
[[!template text="""Comment also saying very cool setup.""" start="00:17:49.320" video="qanda-python" id="subtitle"]]
[[!template text="""So I suppose I'll I'll hand it over to you""" start="00:17:52.240" video="qanda-python" id="subtitle"]]
[[!template text="""if you have kind of final thoughts or.""" start="00:17:56.960" video="qanda-python" id="subtitle"]]
[[!template text="""additional wisdoms you want to share""" start="00:17:59.320" video="qanda-python" id="subtitle"]]
[[!template text="""I really appreciate your taking the time to prepare this presentation""" start="00:18:02.080" video="qanda-python" id="subtitle"]]
[[!template text="""especially to do the live Q&A with us. Thank you""" start="00:18:05.400" video="qanda-python" id="subtitle"]]
[[!template text="""and I haven't anything more than that I will""" start="00:18:11.080" video="qanda-python" id="subtitle"]]
[[!template text="""of course I will continue like have evolving my setup""" start="00:18:13.920" video="qanda-python" id="subtitle"]]
[[!template text="""because there's like new tools""" start="00:18:19.480" video="qanda-python" id="subtitle"]]
[[!template text="""and maybe new ideas also coming up""" start="00:18:21.360" video="qanda-python" id="subtitle"]]
[[!template text="""and my What I'm aiming for in Python development""" start="00:18:24.760" video="qanda-python" id="subtitle"]]
[[!template text="""is the great developer experience""" start="00:18:28.720" video="qanda-python" id="subtitle"]]
[[!template text="""of what's called Lisp programming, basically.""" start="00:18:30.480" video="qanda-python" id="subtitle"]]
[[!template text="""So that's what I'm aiming at for Python 2.""" start="00:18:34.520" video="qanda-python" id="subtitle"]]
[[!template text="""Thank you. Thank you so much.""" start="00:18:41.700" video="qanda-python" id="subtitle"]]
Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202023%20python%3A%20Interactive%20Python%20programming%20in%20Emacs)