Python Bytes - #440 Can't Register for VibeCon

Episode Date: July 15, 2025

Topics covered in this episode: * Switching to direnv, Starship, and uv* * rqlite - Distributed SQLite DB* * Some Markdown Stuff* Extras Joke Watch on YouTube About the show Sponsored by PropelA...uth: pythonbytes.fm/propelauth77 Connect with the hosts Michael: @mkennedy@fosstodon.org / @mkennedy.codes (bsky) Brian: @brianokken@fosstodon.org / @brianokken.bsky.social Show: @pythonbytes@fosstodon.org / @pythonbytes.fm (bsky) Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Monday at 10am PT. Older video versions available there too. Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it. Brian #1: Switching to direnv, Starship, and uv Last week I mentioned that I’m ready to try direnv again, but secretly, I still had some worries about the process. Thankfully, Trey has a tutorial to walk me past the troublesome parts. direnv - an extension for your shell. It augments existing shells with a new feature that can load and unload environment variables depending on the current directory. Switching from virtualenvwrapper to direnv, Starship, and uv - Trey Hunner** Trey has solved a bunch of the problems I had when I tried direnv before Show the virtual environment name in the prompt Place new virtual environments in local .venv instead of in .direnv/python3.12 Silence all of the “loading”, “unloading” statements every time you enter a directory Have a script called venv to create an environment, activate it, create a .envrc file I’m more used to a create script, so I’ll stick with that name and Trey’s contents A workon script to be able to switch around to different projects. This is a carry over from “virtualenvwrapper’, but seems cool. I’ll take it. Adding uv to the mix for creating virtual environments. Interestingly including --seed which, for one, installs pip in the new environment. (Some tools need it, even if you don’t) Starship Trey also has some setup for Starship. But I’ll get through the above first, then MAYBE try Starship again. Some motivation Trey’s setup is pretty simple. Maybe I was trying to get too fancy before Starship config in toml files that can be loaded with direnv and be different for different projects. Neato Also, Trey mentions his dotfiles repo. This is a cool idea that I’ve been meaning to do for a long time. See also: It's Terminal - Bootstrapping With Starship, Just, Direnv, and UV - Mario Munoz Michael #2: rqlite - Distributed SQLite DB via themlu, thanks! rqlite is a lightweight, user-friendly, distributed relational database built on SQLite. Built on SQLite, the world’s most popular database Supports full-text search, Vector Search, and JSON documents Access controls and encryption for secure deployments Michael #3: A Python dict that can report which keys you did not use by Peter Bengtsson Very cool for testing that a dictionary has been used as expected (e.g. all data has been sent out via an API or report). Note: It does NOT track d.get(), but it’s easy to just add it to the class in the post. Maybe someone should polish it up and put it on pypi (that person is not me :) ). Brian #4: Some Markdown Stuff Textual 4.0.0 adds Markdown.append which can be used to efficiently stream markdown content The reason for the major bump is due to an interface change to Widget.anchor Refreshing to see a symantic change cause a major version bump. html-to-markdown Converts html to markdown A complete rewrite fork of markdownify Lots of fun features like “streaming support” Curious if it can stream to Textual’s Markdown.append method. hmmm. Joke: Vibecon is hard to attend

Transcript
Discussion (0)
Starting point is 00:00:00 Hello and welcome to Python Bites, where we deliver Python news and headlines directly to your earbuds. This is episode 440 recorded July 15th, 2025. I am Michael Kennedy. And I am Brian Ocken. And this episode is brought to you by Propel Auth. I'm going to tell you more about them later, but make Auth easy for your app and don't spend time on things that are not your core value proposition.
Starting point is 00:00:26 Get off of your apps with them. Links to the top of your podcast player show notes. If you want to connect with us, Brian, I don't even know where people should connect with us anymore. We're on Macedon. We're on Blue Sky. We're here on YouTube. People can comment on the YouTube channel, on the YouTube video.
Starting point is 00:00:42 That actually is a place that a lot of the feedback happens. So any of those places, and if you want to be part of the live show, Python bites.fm slash live, usually Monday is at 10 AM today. We're 25 hours later, I guess, I don't know Tuesday because sometimes life intervenes, but generally Monday at 10 AM. And if you want a really nice summary and a little bit of extra information around the episode, not just rehash of the show notes, but something different. Be sure to sign up for the friends of the show.
Starting point is 00:01:14 Just visit pythonbice.fm newsletter button right in the front. Enter your email. We'll treat it kindly. We won't share it or sell it, but we will send you cool stuff. Brian puts together for you. Speaking of cool things, Brian, let's switch over to you and see what we're talking about. Okay. Well, I want to, uh, let's see. First I want to add something to my, to the screen. How do I do? Uh, there we go.
Starting point is 00:01:37 Um, I want to bring up a rehash an old episode. Uh, so in episode four 38, so just a couple episodes ago, we, one of the things we talked about was, was I talked about Durin. Where was that at? Was there's a lot of stuff on the show notes. Anyway, my CLI world from Frank Wiles. And one of the things was Durin. And, and so I've been thinking about it. Also, while we're here, I'll just go ahead and show people that you can see the cool stuff like my book, your course, and where do people subscribe again? People subscribe right at the top. Oh, be part of the live show and scroll down and there's newsletter right there.
Starting point is 00:02:17 It was like, yeah. Anyway, so I wanted to talk about the Durand a little bit again, and I think I may have said what it's not before. So dir env is just a tool. It says unclutter your.profile. And the main thing people use it for is these.envrc files or optionally.env files that basically use that to load up environmental variables when you go into a directory. That's really mostly it. But in Python world, we use that also to do other work. Like I guess
Starting point is 00:02:54 everybody else uses it to do other work as well. But one of the things we do is invoke a virtual environments when you go in. And that's really what I will be, I'll be using it for. So I really want to talk about, where is this? Trey Hunter's, there it is. Trey Hunter's blog post called, and this is an older one from, oh, not too old, last year, switching from Virtual Inv wrapper to Durin, Starship and UV. Well, I don't really care about the from Virtual Inv wrapper because I don't really care about the from virtual in wrapper because I didn't use it before. So I'm thinking this is just switching to Durinv and UV. And it's and I when reading this and I can't remember who brought this up but when reading this it brings up a lot of the things that I
Starting point is 00:03:42 didn't like about Durinv the first time I tried it and Trey fixes all of those things. So let's, let's look at a few of the things that he fixes. So he does talk about, uh, doing, uh, making it work with Z shell. I've made it work with bash as well. So it works fine with most of the least all the Linux type shells that I've used. Um, so the first off, the default doesn't show you the virtual environment prompt because Durand doesn't allow you to modify the shell prompt. So how do you get around that?
Starting point is 00:04:13 And there's just a short script that Trey wrote to put in your Z shell RC or in your bash RC file. And then now your prompt is back where it shows your virtual environment. So that's cool. Also, apparently the default is to put the virtual environments replaced in a different directory like a.durinv python 312.
Starting point is 00:04:35 And that's not, I mean, I don't know about most people, but at least me, I've always just stuck my virtual environment right in the project directory that I'm working on. So he has some switches for that. Also Durr-Env when you enter and exit it like is very verbose about telling you that it's loading stuff. You can turn that off, shows you how to turn that off. And then that's just the Durr-Env setup and he's with virtual environments, but he's set it up so that with UV next. So after that,
Starting point is 00:05:09 it's UV and showing how to use all of this with UV. The thing that I think is kind of one of the things I wanted to point out that's pretty cool that I don't know if we've talked about is when you're creating a virtual environment with UV, you don't get pip with it because you're going to use, you're going to use pip or UV pip install instead of pip install. However, some tools, some extra tools need it to be there for some reason. And so you can say dash dash seed, which it probably does other stuff too, but it adds pip to your virtual environment. So be kind of cool if it just said dash dash pip or something seed works. You just have to know that. Anyway, that's as far as I'm gonna get so far. He's also talking about
Starting point is 00:05:51 Starship. And I guess I think I will follow the Starship tutorial too, because one of the things I like is he is he likes he teaches people a lot. So he doesn't want his his his shell prompt to be too crazy. Um, and, uh, and so he's going to have a fairly bare, boring Starship configuration. And I'm glad, cause I'd like to see how to do a boring first. And then, um, and then like, look at his other stuff. Yeah. Those things can be overwhelming, but I really like having some of these
Starting point is 00:06:23 things like a prompt that shows you which virtual environments active Which version of Python you're using it's it's really neat. Yeah. Yeah Anyway, so if if you've tried during the before and it sort of annoyed you Maybe this this tutorial might be for you. So it might be for me as well. I haven't I'm not entirely sure I am I recently updated I use oh my Z shell plus warp sure I, um, I recently updated, I use, Oh, my Z shell plus warp, which warp is a super cool terminal thing. And for some reason things weren't working quite the way that I was expecting. And with some of my Python virtual environment stuff installed versus system
Starting point is 00:06:57 Python, it was really, it was odd. I think I was running PI test from the wrong place or something like that. And it was driving me nuts and I didn't realize, I don't know, I think I had pi test extensions installed into plugins installed into a different place than I was trying to run it from. And that was the challenge. But yeah, I recently added to my profile, this thing will automatically activate virtual environments.
Starting point is 00:07:19 If you go into a place that's got somewhere in the directory tree, a virtual environment, and if you see the out of it, it'll automatically deactivate it, which is pretty dirty and V, but I ended up doing that just with like a simple bash. Cool. So anyway, I, however you go about it, I totally, totally recommend it because I could see here exactly all the get status, all the, you know, the branch, everything is great. That's not what I want to talk about.
Starting point is 00:07:43 That was just a fun little followup. Um, what I want to talk about is something from them Lou and they say, Hey there, here's a cool topic for Python. So we've all heard of SQLite and almost all of us have SQLite installed knowingly or unknowingly because Python itself ships with SQLite, it bills itself as the world's most popular database. I think Excel itself as the world's most popular database. I think Excel might be the world's most popular database, but you know, pretty close, right? Yeah.
Starting point is 00:08:10 They can, they're definitely tightens. But the story you're told is I'm using SQLite for development or like a local storage, like a local settings file for an app, but it's not appropriate for production. This thing I'm about to talk about called R RQL light instead of SQL light is pretty neat and that's what Demi recommended a distributed SQL light. Read and go, but who cares? You can use it however you want. Right. So come down here and let's, let me open up their main website here.
Starting point is 00:08:43 So RQL, RLite.io. And if you go over here, you can see that it's got a couple of things. Vault tolerance, high availability, SQLite. How crazy is that? So basically what it is, is it's a data access layer on top of SQLite, but it also sets up distributed, a distributed version of SQLite with replication. Oh, wow. I'm not crazy.
Starting point is 00:09:07 Yeah, that's awesome. Yeah. I think it's super cool. So yeah. Um, replacing Postgres with RQLite has simplified the software we ship to customers says Mark Campbell. Yeah. So you come down there and see some other things it does is deploy in seconds.
Starting point is 00:09:22 Nothing complex to run. And then it gives you basically an HTTP API to talk to the database because it might live somewhere else in a cluster. Right. But that really routes just internally to SQLite and it integrates with Docker Kubernetes super easily, full tech search, vector search, JSON documents, lots of different things. So if you go up here to, I think getting started, yeah, quick start.
Starting point is 00:09:46 Yeah. It talks about you just, there's different ways you can install it. You could brew install the thing or this is the way I've been doing all of my database servers lately. All my server type things, you know, Nginx, MongoDB, et cetera, Postgres is to just run a local version using Docker. So I don't have to install it or have it mess with my machine. So instead of brew install, I would just Docker run this thing and give it a volume.
Starting point is 00:10:11 And it's good to go, right? Persistent volume. So you don't lose the data. And then you just talk to it a lot like Cipollite, but you can create a cluster of them, which is what's wild. And in the example they show, it's like, look, this is all local hosts, but you probably would set them up to be running in different places, which is, it's pretty wild. So you also have got, um, like all the rules around eventual versus strong
Starting point is 00:10:36 consistency and everything you do with clusters. So they've got a nice little writeup on trade offs you can make for like reliability, performance, staleness, etc client libraries I've done ones I RQL RQ light and so on one for SQL alchemy Yeah, a lot of neat stuff here if you're looking for a distributed database and you're using SQL light I think people should look at this and thanks to them you for them Lou for sending this in actually a hook into the SQL alchemy for them Lou for sending this in. Actually a hook into the SQL alchemy to RQ light is pretty cool.
Starting point is 00:11:08 That's yeah, it's pretty neat. All right. Yeah. You got read only nodes and all sorts of different things about how you can set up the clusters, you don't have to do clusters by the way, if you want to just run a single instance of it, it says plenty of people do that. But if you want to have like the fault tolerance, high availability, then you know, set up a cluster. Cool.
Starting point is 00:11:23 Neat. Do you want to do something else that's awesome? I we need to set up a cluster. Cool. Neat. Do you know what else is awesome? I would guess that it's our sponsor. Yes. PropelAuth. This episode is sponsored by PropelAuth. PropelAuth is the easiest way to turn authentication into your advantage.
Starting point is 00:11:36 For B2B SaaS companies, great authentication is non-negotiable. But it can often be a hassle. With PropelAuth, it's more than just functional. It's powerful. PropelAuth comes with tools like managed UIs, enterprise SSO, robust user management features, and actionable insights.
Starting point is 00:11:52 As your product grows, PropelAuth adapts with it, supporting more advanced authentication features. And the best part, PropelAuth has native support for major Python libraries like FastAPI, Flask, and Django. You can easily integrate them into your product. When Auth is effortless, your team can focus on scaling, not troubleshooting. That means more releases, happier customers, and more growth for your business. Check them out to get started today. The link is in your podcast player show notes. It's a clickable chapter URL as you're hearing this segment. And it's at the top of the episode page at PythonBytes.fm.
Starting point is 00:12:27 Thank you to PropelAuth for supporting PythonBytes. Yeah, it's definitely. Thank you, thank you. Now, Brian, I feel like I've snuck this out one out from under you. This next one I wanna talk about. Okay. We have a Python dictionary that can report
Starting point is 00:12:42 which keys you used and which ones you did not use. Why do I feel like I got this from you? This is like perfect for testing. Okay. Okay. So imagine I'm working with an API or some kind of data reporting library and you send it some kind of dictionary, right? And you want to make sure like, I want to make sure that it uses these three
Starting point is 00:13:03 important pieces of information that are contained in the dictionary. And if you run your code run either through a tester, however you want to, but probably through a test, then you could ask which keys were used and which ones were not used. And if one you're like, nope, it's really important that they take this piece of information into account and you see that it's not used. Well, that's a pretty big hint that something's going on. And you might say, Mike, we'll just mock it out and we can check, but it's not that the function is called.
Starting point is 00:13:30 It's that the function is called with a certain combination of different parameters over time, which I think is where it gets tricky, right? It's not like get item was called or get is called. It's that get was called with these seven values, but not this eighth value. Right. And that's kind of like where I think this has at least as far as I know, kind of a unique idea. Yeah, that's pretty neat.
Starting point is 00:13:52 Now what I'm pointing at is this, um, blog post by Peter Benson and it's very nice, but it's also very short and it's not like exactly a Python package. You just UV pip install and then run with it. Instead, it's more of just a simple little dictionary that people wrote and then you can just access like what keys were accessed, which keys were not accessed. And it's got some sweet step operations for that, right? Like the difference of a set and so on. So you might want to extend this a little bit, right? Like the difference of a set and so on. So you might want to, you might want to extend this a little bit, right?
Starting point is 00:14:26 Like copy this in, for example, one of the things they note, um, and there's some nice comment, a comment conversation at the bottom, one of the things missing is this works for square bracket access, which calls it under get item, but not.get. Access. But you know what? If you look at the way that get item is implemented and you rewrite the one that does get, I'll tell you what it's like three lines of code and it's super easy, right?
Starting point is 00:14:49 Like there's, it basically just captures a key that was used into a, a set and then, uh, delegates to the underlying dictionary implementation. So there's not a lot going on there. Right. So you can add that out. Another thing that's nice is, uh, there was a conversation about what would this look like if it was a typed tracking dictionary. And so someone in the comments provided a typed version with multiple generics. How about that?
Starting point is 00:15:14 Okay. Yeah, sure. Yeah. Yeah. So I think you would definitely want to add the dot get function to this. But like I said, it's like three lines of Python and it's not hard. So check that out. But yeah, I think this is a neat idea. If you're looking to test how a dictionary is being used on a key by key basis. Yeah. It seems like it's ripe for a small tracking dictionary package. Yeah, exactly.
Starting point is 00:15:39 I think this is going to be like a sweet kernel of an idea for somebody who wants to put something on PyPI. And I put this in the show notes. Maybe someone wants for somebody who wants to put something on PyPI. And I put this in the show notes. Maybe someone wants to polish it up and put it on PyPI. That person is not me. Yeah. Yeah.
Starting point is 00:15:52 Or maybe that person is Brian. Exactly. I don't, but maybe someone else does. Yeah. Okay. Well, we are streaming this episode and I would also like to talk about streaming Markdown. It's a transition there, yeah. Anyway, so Will McGoogan reported a few days ago that the Textual that he and his team are working on, I guess, I'm not sure if there's a team
Starting point is 00:16:21 there anymore, but anyway, Textual has a new version out 4.0.0. So what's the what's the big change? The big change is markdown append. So this is kind of a neat thing I thought of school to have to be able to see if we can get this to run. The gist of it is you've got markdown, you can report to a markdown widget that as you append to it, it just keeps going. So you can, in real time, add stuff to it and it just sort of scrolls down. Anyway, that's the big thing. The other, the one that's, maybe you don't care about this, but I brought this up. That's like
Starting point is 00:16:58 all of our topics, but I brought this up because I really like the thing that he did in bumping the major version. So he says why? The reason for the major version bump is because while he was implementing this, there was a different another part of the interface, widget anchor that already existed and that has changed semantics. So he, and it works better also, but the semantics change caused the major version bump. I wish more people did this. I think that a lot of people only change the major version
Starting point is 00:17:32 if they change the actual signature, the API signature. And I think that behavior changes are completely, they're even more important to change the version because it's going to sort of run fine. It's just going to do something different. And that's a, that's something you really want to point out to users. So applaud him for doing that.
Starting point is 00:17:53 Yeah, Brian, I remember when I first learned C plus plus, and I had some for me at the time complicated program. I was so proud of myself when I got it to compile. Yeah, then it's behavior. I've had to figure out Yeah. It's behavior. I had to figure out all the bugs. And this is kind of like that, right? It's like it technically still has the same API signature,
Starting point is 00:18:12 but it's down to the harder things to detect that are breaking changes, right, which is semantics and behavior. Yeah. And that's the real one that gets you is, if it seems like it runs fine right away, but there's a major version bump, you got to it seems like it runs fine right away, but there's a major version bump, you had to check a look at your test to make sure that and probably it's just that
Starting point is 00:18:29 you're not using widget anchor. And if you're not using it, you don't have to worry about it. But anyway, so there's that. And I was like, what, what can we stream with this? What would I want to stream into Markdown? Well, I've got another, another project that I wanted to highlight called HTML to Markdown. So this is a HTML converter that apparently there was another tool which I think I ran across before called Markdownify that converts web pages or HTML stuff to Markdown.
Starting point is 00:19:02 So I thought, and one of the features of it, okay, so they completely rewrote the fork, but why? There's a bunch of extra features like HTML5 support, type safety, metadata extraction, and look at this, streaming support, memory efficient processing for large documents with progress callbacks. I'm curious if you could take a web scraper or something or somehow take something that's streaming HTML or use this to grab something large and have it reported to a textual widget.
Starting point is 00:19:38 That'd be kind of fun. That's very fun. Yeah. Nice. I can also see if you are doing some kind of chat chat bot or LLM type of thing on the textual side. Yeah. And you wanted to output the responses in markdown.
Starting point is 00:19:54 Like that's a real common exchange for even brings that up. Like the efficiently stream markdown content, like you might get from an LLM. Like you might. Yeah. Okay. Makes a lot of sense. So cool. All right.
Starting point is 00:20:08 Hey, I want to jump back to your first item real quick. Okay. Did you give this article a shout out as well? Cause I know that you were thinking about it. Oh yeah. I just didn't highlight it. So I didn't bring it up yet. So yeah, there's, yeah.
Starting point is 00:20:20 You want to talk about it? Yeah, sure. I don't know a whole lot about, but it is very neat. So, um, Mario Python by night also did a, it's the terminal bootstrapping Starship just during the NUV and talks about how you can sort of get things set up with that as well. So just, it's already in the show notes. Just one more thing to throw out there. Yeah. And so that's, that's what's causing me to say, maybe I should take
Starting point is 00:20:42 another look at Durinv and Starship because other people that I admire are using it. So yeah, maybe it's worth looking at. Not like me who just vibe my way to a turn it on, turn it off automatically sort of bash function. Yeah. You ready? Yeah.
Starting point is 00:21:01 Actually, you got any extras before we jump to the vibe? Well, the only extra I wanted to bring up is the reason why I'm wearing an annoyingly bright t-shirt today. Usually I do a darker color because it shows up better on the better. But this is my Oregon Country Fair shirt that I got last Friday. So I'm going to stand up so you guys can see it. And it's awesome. Lovely Oregon Country Fair shirt. It was a blast. but I'm definitely feeling
Starting point is 00:21:27 my age a little bit. We got there, it's 11 to seven, and we got there right before 11 to get a decent parking spot. But you probably should, usually we get there earlier to get a decent parking spot. Anyway, a lot of people, it was pretty hot this weekend. So it's till seven o'clock, but like, I dunno,
Starting point is 00:21:48 like three or four o'clock, we were like, I think we're fried enough, let's go home. So we reacted. It has been very warm and very sunny in the Pacific Northwest, contrary to what people think about the rain and the clouds. Yeah, no, I think, I think there's other parts of the country getting more rain than us right now.
Starting point is 00:22:05 Oh, indeed. All right. You ready for the joke? Yes. Okay. So let me set the stage. I know many of you out there already know this. We've had several jokes.
Starting point is 00:22:14 So if you've been progressing along the joke timeline with us, you will know what vibe coding is just for the folks who don't though. Vibe coding is when you go to an agentic programming model like cursor windsurf Juni for the jet brains IDEs that kind of thing and you just just tell it what to do you don't need to touch the keyboard you use text to speech you just like build me this app now I do it this way now make it that and the joke is that it comes up with a bunch of mistakes or it works on your machine, but you're not enough of a programmer to actually know.
Starting point is 00:22:48 Okay. That like this might work here, but it's not really going to work. So that's the joke. And the joke is switch back. There's an announcement for this new conference. Very exciting vibe con introducing vibe con the world's largest vibe coding conference. Make sure you register today. http 127.0.0.1 colon 8080 slash register.
Starting point is 00:23:09 It says Vibe coding is hard to attend. VibeCon is hard to attend. That's already funny. This is on Reddit. But if you scroll down into the comments, so good. Someone just says C colon backslash Vibe dot html. Someone's no, no, that's wrong. File colon triple slash C colon forward slash and vibe.hcl.
Starting point is 00:23:29 What boomer posted this modern vibe coders gather up at HEP bracket, colon, colon one, you know, the IPV six. That's funny. Oh my goodness. Is this sweet? Isn't it? Can someone give me the prompt to generate the registration for him so I can sign up?
Starting point is 00:23:48 That's funny. Yeah. Somebody said tried to register and they took a screenshot that local, the page, you know, connection refutes as it tried to register for ViveCon. I guess my vibes weren't local enough. Yeah, that's funny. Yeah. Okay.
Starting point is 00:24:03 So let's say I'm dense. Why is, what is that URL that 127 001? If you're doing web development locally, that's where it will run. Okay, so I don't know what server typically picks 8080. Maybe this is node JS. Probably it is because like flask is 5000. Some of them are 8000. Yeah, so but it's definitely like if you ran it locally, you said build me this thing, it
Starting point is 00:24:27 would work perfectly locally because this is like the dev address, but obviously it's listening on the local loop back. It's not a real server. I love it. Yeah. Yeah. I haven't done a lot of vibing lately, but yeah. No, definitely.
Starting point is 00:24:42 VibeCon is definitely hard, hard to, uh, to attend and Pat on the honest says they, they run a lot of local APIs on 80 80 and like internal. All right. Well, fun as always. Yes. Thanks for being here, Brian. Thanks everyone. Let's see.
Starting point is 00:24:56 And if you're not subscribed to the podcast, please click follow or the subscribe for free, whatever your podcast app button says to, you know, keep getting automatic downloads to our free podcasts. And if you're not subscribed on YouTube and you want to get notified, you want to catch the older things and all the stuff we're doing here, go over there and subscribe as well. Thanks and bye all. Bye.

There aren't comments yet for this episode. Click on any sentence in the transcript to leave a comment.