 So and then the disclaimer that I'm not a Python programmer, you know, I could write Python programs, but if you ask me which Python function to call for two, like for like these data frames and parallel programming, that sort of things, I would know on top of my mind. So Radawan might, will help me during this, when I call certain functions, for example, for examples. So we start with the dependency management. So the first part is motivation about dependency and how, how it could bite you back, you know, if you don't do it properly. So this section I will actually demonstrate with an example from, from a user support case that I was handling sometime back. After that, we'll go for the exercise. We go for the exercises in the wake up rooms, 15 minutes. After that, we'll come back here. Then I will motivate a little bit about package management. Mainly the material shown here. But during that package management, I will purposefully try to set things wrong and show you certain pitfalls. And I will, I will, I will make the case by showing, you know, how bad it can go wrong, for example. And I will try to have a critical eye on this. Yes, yes. So if you see something that I, sorry, that I, so if you see something going wrong, that's because purposefully I'm doing that, not because it went wrong. So I have a slight go to the answer. So excuse me there. And the exercise two that I will do at this demonstration, not the, like we'll not go for the breakout rooms and also the same with the exercise three, because they are, I want to emphasize certain pitfalls as well. These exercises you could do after the course, like not, it's not, not like, like coding here. Then for the, the recording dependency part I'll do introduction. And then we'll go for the exercises in the breakout rooms. And then we'll have a discussion. So everything goes well. We could end this by 950 and have like 10 minutes discussion before we go to a break. Does that sound good, Radwan? Sounds great. Yeah. So let me adjust my terminal a little bit. Can you have the, the teaching material available for you when you have it, because I'm going to share my terminal now. So I might ask certain things. Yeah. So I have the open and I also want people to open. So on one half of your screen, you can watch the other half or maybe have the material open and that's what I have on my side as well. Yes. Thank you. So I was thinking, Radwan, that when I, when I start this, I would just make my vanilla terminal ready, that, you know, some, something that's perfectly made for the demonstration. But then I thought it doesn't make sense. Like we have to, we have to show what real life is. So I have certain setups in my terminal that I will unset first in order to come for the vanilla. So, so these things that I'm going to do, you don't have to follow or like, like don't type along, because this is very specific to my laptop that I didn't want to hide anything. Right, Radwan? So don't type along. Sounds good to me. I should clarify what is meant by vanilla. Vanilla means no configuration. Thank you very much. Yes. So, so I'm going to activate. So I have this top and bottom terminals because if you see that certain terminals when you open up, it'll start with a Konda prompt or, you know, some Python activated. So in my laptop, I make sure that nothing is activated when it is starting up. So I'm going to start a Konda environment here. I have this file I created. You can have a look at that file later on, but it is. So it just activated my Konda. So it doesn't automatically get activated whenever I started. So, Radwan, do you have your Konda activated always in your terminal or is it that something you would explicitly do? So I do it like you. I don't have it activated every time because actually I prefer to have different environments for different projects. And maybe we will say something about that later. So I also say as you, when I open my tunnel, nothing is there. And then I actively activate the environment that I need. And in this case, you are activating an environment called base. So that's the base environment. And later one can create different environments for different projects. Can we comment on the whole philosophy? So you're doing stuff from the shell here, which is changing different properties of the shell, the environment variables, that will activate or deactivate different environments. And here an environment is the Python environment. So the Python version and all the packages that are installed. Is that the summary here? Yeah, so more or less. So as you see that, if you notice what I was typing, maybe a little fast, I would apologize for that. What I'm trying to do is I'm trying to have two NumPy versions on two terminals to show you something. So here I typed Konda. I missed one of these, this activate part, which will come later. So that's why this error is... Okay. So is that the main point here? So you're trying to show that you can have two different NumPy versions. Exactly, Richard. On the same laptop. Got it. And then all the details, I guess, we'll learn later. But that's not the main point right now. That's also a very good point. And thank you for reminding me that. So these things I'm just typing along, like typing a little faster, we'll come back to in the second half. Okay. So then this PS1 and that sort of things that I usually do before the course, but here, what I'm doing is, I'm sort of shrinking my prompt so you can see better. So there's no magic, there's no Python magic involved in that part. So now I have two NumPy versions. And as I said, rather than before that, that I start, so I'll make the form a little bit better here with the space. And I'm going to clear the screen. So I have two NumPy versions, 1.15 and 1.21 on the bottom. So what I'm going to do is, I'm going to execute a small script that I pre-created in my directory. So I will open that. NumPy. So this is some broad card shape script. I have no idea what it does, but I know it do something. Do you have any idea of what would this do? Well, I should have paid better attention at the NumPy lesson, but I think Richard knows. Yes. So, well, it does something, but I see that it doesn't work. So I guess whatever it is, it's designed to show that NumPy doesn't support this function. Not exactly, Richard. So NumPy 1.15 doesn't support this function, but 1.21 does. So this function, let's say if it is in your program, a script that you've distributed with your publication, when the user, when the end user or somebody wants to reproduce this, want to run this, it will catastrophically fail, like in the top case, with the long stack trace. Like here it's very clear because I'm focusing on a specific, I'm triggering something very specific. So the error is very clear, which says that attribute is not defined in NumPy. But if it is inside something, something else, inside something else, it will be a long stack trace hard to detect. So what we're trying to do in this lesson is to prevent this from happening by telling the user or the end user or your friend, or especially, especially, especially your future self, that this script is designed for this version. Attach that information like some metadata. In addition to your script, you tell that in order for this to work, you need this NumPy version. And here's a way for you to get this unambiguously. Does that make sense? That's something we're going to show you. It makes sense. And I think we all need that sooner or later because, I mean, the software evolves, but at some point, our projects, they stop evolving. I mean, then we switch to different projects, but we still want them to work on the same computer or in future. And then we need to worry about the dependencies. So that's why we show these tools. Yes. So having said that, so those things are more described with more examples here, but I thought like showing you a real case that I have encountered before. Actually, I had to mention that I have stripped this down. So this was part of a long track test, but when I was doing system support, I stripped it down so the, so the error is more clear. But if it, if I ran the exact program that I actually encountered, it will be a long track test, very hard to debug. So, so rather one and Richard, now what we do is with that in mind, we go to this excise one, which is 15 minutes excise, go to your breakout rooms and discuss among, sorry, yes. Since many people are watching either in small groups or independently, should we take a few minutes and have people write in HackMD while we go on? Yeah, sounds fine. Do you want me to explain the excise a little bit? Yeah, if you talk, I will prepare it. Yeah, very good. So in breakout rooms, how do you yourself install packages like this that you use in your work? Do you use this pipey, which I'll show you a little later, or you use something like Konda or assist admin? I will have like a small demo later on. You can use system package management like app kit or you even, right? And how do you do this? And have you any experience that a project needed a different version of Python library than one your computer has? How would you sort of do that gymnastic I did in the morning? How would you do it when you do it? So this is a discussion, there's no right and wrong answers. So there are different points of view. And if you know what the requirement dot text at the government Yamal is, try to discuss that as well. But that will come back in a later on session. And so the goal is that we now kind of discuss all together in HackMD. I mean, some people are in working groups, and then you can discuss the within groups, but we can assume that I mean, many, many learners are watching via Twitch and I'm not really inside any breakout room. And then you can discuss here on HackMD. It can be interesting to see what other people write. It's not a problem if you've never heard of three requirements of text or environmental general or a condom or pipeline. No problem at all. But I think we all sooner or later have some sort of horror stories of things going wrong on our computer or the computers of our colleagues. Yeah, sounds fine. Then Richard, can you take the screen for me for the HackMD? Yeah, it's there. Yeah, see you. Can you place the time answer exactly in 15 minutes? So you'll not I think 15 minutes is too long. So we're getting some, I mean, even 10, I think is quite long. Should we, I think we can basically take a few minutes while we are watching it live here. So we see many pips and condos, some with the operating system. Brew's a good idea. Yeah. Tracking dependencies. I must say until maybe five-ish years ago, I didn't track dependencies well myself. So that's definitely understandable. So Radoan, do you have any experience with this poetry that is mentioned here? Yes, a little bit of experience. I think it's nice. Nice project. I'm not using it myself, but yeah, nice project to solve actually a couple of issues. It can do both dependency tracking, but it's also for packaging. So it's also relevant in the third lesson of the day. I'm using something else for packaging, but not because it's better, it's just personal preference. I have a real example. So in fact, last night, or no, it was yesterday morning, I was trying to update the course webpage, and then there was an error from the thing that built it and it wasn't working. So I searched the error message and eventually find that Jupiter had changed something, which made it somehow incompatible. And then Jupiter made some change that was incompatible with some versions of Python, so read.dox was failing to build the ski comp.alto.v website. So then I had to update our requirement.txt file so that way it could build. And yeah, I mean, I have to say the number of times I've done this is perhaps a little bit surprising. Maybe also surprising how little I've had to do it. Yeah, these days when I get a Python project from somebody else, one of the first things I do is to look at the requirements, the text on environment level, and then I think about, okay, how can I set up an environment for this? And it also comes back to what Richard mentioned yesterday. I think we talked about versions and pinning versions already yesterday somewhere. And if I have different projects on my computer and they both pin, so they refer to a very specific version, but the version is simply different, then we need a mechanism so that both projects work on my laptop somehow. And so now this is the point of this lesson. Yeah. So how is the HackMDA Richard? Is there any questions there for us to answer? There's a lot of good comments here about different ways people do things. Yeah, I think so far no question that needs to be addressed here. I'm trying to have an eye on this. Yeah. Should we carry on then? Are you ready for the next part? Let me, let me prepare my screen again. Okay. I'll give you the next up in a moment. Maybe I can kind of raise one thing from the HackMDA, but maybe we'll discuss it later. So I could write the dependencies, I could write them into really, or I could write them into requirements or text, or I could write them into environment. So what could be the advantage of using these files instead of writing them somewhere? Although I have to say that writing them somewhere is already really, really better than not writing them down at all. But maybe we'll come back to that. Yeah. So the thing is at the end I will try to come back to that. But if you, if I forget that, please remind me because it's at the end of the lesson, because I'm going to bypass this bind and the packaging thing. So we could discuss that later. So Richard, my screen, is it shared now? There you go. Okay. So the next part we're going to do is about this conda and PP or whatever you call it, P by PI. How do you pronounce it around yourself? PI PI because it's the Python package index. So that thing. So I'm going to install the same because there are different packages. So why we have these different things? The main thing with the conda is that it incorporates additional non-Python code and dependence libraries and system-level libraries and even something called glibc, which is sort of low-level system related alongside the packages. And they distribute pre-compiled binaries. Do you know what a pre-compiled binary is, Richard? Yeah. So well, other than exactly what it says, I guess it basically means that your computer doesn't need the development tools in order to prepare the code for use. And it's done before you get it. Yeah. Okay. So I'm going to do that magic I did before because I want to make sure that my conda is not always activated. So in conda and I have on the bottom, I have a Python 3, let's see what version it is. So I have 3.5, 8 Python system by install. And on top, I have a conda activated. So I'm going to install install. I'm going to use this flag user, which is to install on my local home directory. But in the latest Python versions, they actually check where they have root access, then they will fall back. But I see this has like a good practice when I do that. So do you know, rather one that we are used to equal science when you do this numpy installation? Okay, it's already installed. So I'm going to remove that. But as I said before, this is not a type along, because I will do certain things wrong. So don't type along, I'm going to remove something from my home directory. If you do this one, you will lose your thing. But I'm on like a safer environment that I could do this very, like without breaking my computer itself. Yeah, I'm getting really stressed about looking at something. Yeah. So one part of some things that I'll show is how to break your system. So not to try at home. Why are you deleting this now? Just to understand. So this was in my side some preparation mistake that I already tried installing it before coming here. So when I installed it, it said numpy is already installed. So if it is already installed, I can't show the mistakes I'm going to show. And can I just ask you, are you going to later also show how to install it into a virtual environment? Yes, I do. Because I can say that what you do now here, I normally don't do. But maybe this is the point. Yes, yes. Okay, good. Yeah, okay. And I'm going to install that. And I'm going to here, first I'll do a Konda search, right? Numpy 1.21. Here it's installed, you see the rather one here, it says a wheel file, it installed a wheel file. That is sort of like a self-contained zip file, archive file, which everything inside. So it does these binaries and everything incorporated. So here if you see, I'm sorry, my screen is a little bit too much to show you here. Let's see if I can scroll up. There are different versions of Numpy in Konda, if you see. So here the IP, the PIP didn't complain. It went check my architecture, it checked my operating system and got the proper wheel down. Here the Konda Numpy has different versions. So what this means is, so this Numpy is for Python 3.7. This is for 3.8. This is for 3.9. So they have provided different versions. And what follows is a hash, which is very specific, which is in, which says that there are very specific version, maybe there's a bigger set of dependencies that will meet this specific version. So to make sure that I install the correct one, I'm going to do, do you know, if I do this, what will happen? Numpy 1.21.2. And I'm going to install this one. So this is a very specific version. So this is something that you will encounter the Kondais, people say Kondais very slow. So Kondais slow, if you don't ask it to install something very specific. So I'm going to install this, but don't do that either. So this is also something you shouldn't do. So what will do, this happen is that it will go and modify your base Kondai environment with this Numpy. So every time you install other packages, it has to go and make sure it doesn't conflict with this thing. So I'm going to do that anyway. So I need two things that you shouldn't normally do. One thing is modify your base Kondai environment. And the other thing is, you know, rely on your base for the, for like the user for installing the packages. Here you see this sold environment or failed. The reason for that is, if you remember before, I had a specific Python version, which is 3.8. Now I'm asking you to install 3.9. So it has to think, it has to think a lot. It has to go through some matching and it has to find out. So let's, I'm going to cancel that. Let's try a 3.8 version. And also in this case, we don't do equal equal, we do just one equal, right? Because Kondai is a bit different than in this case. That's a good point that I forgot to mention. Yes. So it'll go and it'll do this. And again, it's not the specific version. So it'll think. So eventually it'll go and install, I think. But let's see what it's trying to install at least. Here it didn't do anything because everything that's supposed to be installed is packaged and the PIP detected my architecture and everything and it got the correct thing downloaded. So while this is working, can I ask you a question from Kondai? Yes. The question is, are we going to see how we can deal with this solving environment failed? Yes. Good. Yes. For this one, so until this goes on thinking about, because I purposely made the installation slow, I'm going to cancel this. So instead of that, let me do create name. The name I'm typing here may not match exactly the name in your example, but don't worry about course you could select whatever name you want here. So now we're making a new content environment, which will have its own completely separate set of installed software with exactly what we need. Yes. And we called it NumPy. We called it NumPy. And it failed because I, you see this red one that I specified a name and I said NumPy here again something something here. So that was the reason for that. And I'm going to remove the, I'm going to remove the specific Python version as well. So it's just going to create. Let's see how this time, do you see how fast it was? It was not thinking at all. So then I want to also focus here for the Konda, not like just the bee. It was installing the NumPy base. It was installing the open SSL libraries. It was installing the math kernel libraries for mathematical calculations. So it pulled down everything. And if you see here, you will see certain like earlier for NumPy, you had Python 3.9, 3.6, here we have HE H51. So I want to discuss in the, in the, I can be like, not now, but if you know what it is, please mention that. So here you have 3.9, but some of, some of them do not have Python associated. Can I just explain that now we got lots of packages that we didn't ask for. So where do they come from? They are dependencies of NumPy. So we wanted NumPy, but we got a lot more because NumPy depends on other things, which may depend on other things. Yes. That's, that's very true. So do you remember the other one that I did this very bad because you forceful removal of my home directory things? Yes, I remember that. Yes. So how would you avoid that from it is using virtual environment as you mentioned before. So instead of doing these things, if you have a virtual environment prepared for that, it's easier to remove and activate and uninstall. Because when you do this in your home directory, it will be always NumPy 2.1. So here, if you remember this example I showed before, instead of that, I'm just going to print the version of NumPy here and where it is loading from. So rather one, sorry that I don't go inside this Python prompt, because sys admins, they don't have time for that. So they use this one liners. So in the material, I have included this one liner and I have to apologize because we have a very high standard of, I know this code refiner, we keep a very high standard when it comes to teaching material. So the example I included is not code highlighted. So it might be hard to find, I'll show you later. So I'm going to find, so it says that it's loading from this location and it's even Python 2.7. And then let's say if I ask Python 3, you see there's another location. So probably your program which you run might not call Python 3 as itself. So I also installed Python 2 just to make sure that how these things could be ambiguous. But I think we couldn't need some explanation here. So we see these two terminals and it might not be so clear how they differ. So on top, we have one way of dealing with dependencies and the way is conduct and I think it's perfectly fine. And on the bottom we show a different way of dealing with it, right? Correct. So this is with pipe, a pip. It is another way of installing this. I'm doing the same thing in two different ways. So then let's see how there's a scratch directory. You can do something like for the same sort of like isolation that you did for the Konda. You can ask Python, create a Vim with numpy 2.21.2. So this is, so then you do this, you'll have this environment. You can activate it. But do you think, Radovan, if I just activate it, I would have numpy already because I already called it numpy. Let's see. So again it's loading from my scratch init numpy. That is actually unexpected, is it? So when I have this installed, so I have this numpy 2.21 I created, then now when I'm, I've activated that. So I'm loading the numpy, but it's not loading from there. It should be, you see this difference here. It should be loading from this place. So I have to install numpy there. Install by 2.21.2. So even after you have this environment, you might have different setups in your computer. So this is a one-liner I always use to make sure that numpy, so it's still, it's still not using this. But let's say if I use Python now, it's still using the numpy version that is actually, that's something that I didn't want. So is there any idea that how can I like use the Python numpy version from this specific version? Mm-hmm. You see the CD, here, around one. So there I had a pitfall made when Python loads, it's also checks your current directory where you have installed something. So it gave priority to what I already had. So I had to move out of that directory even though I had a virtual environment. So that thing doesn't happen with Konda. So when you have the Konda, it's what you get. So activate that. Can I ask something before we continue here? Just to take a step back, because one question that came up, which I think many, many people have this question is, okay, so there's Konda and it can do, it can solve all these problems. And there is PIP, which can also solve almost all of these problems. So which one should we use? How do they differ? Why are there two solutions to this problem? So if you have, so when you have PIP, the libraries that you could install are distributed Python packages and APIs for other like C libraries, for example, but not system level libraries. If you remember that SSL library that I showed you, I'm not sure it's still here. For example, MKL and also this SSL, there was a SSL library that was here. So let's say if you try to use this package NumPy on your system and if I install it, if you don't have SSL installed as a package manager, like as a system wide, this package will complain. So in a place where you don't have root access, point HPC system or shared resources, without relying on the system admin, you can include everything in your Konda. So in a environment, in a shared environment, Konda makes sense because then you don't have to rely on system level, like RPM insulations. Yeah, maybe that's for such as an additional explanation is that what PyPI traditionally, PyPI is for Python packages. There are many projects that are actually not, it doesn't have to be pure Python, but it's all the packages on PyPI, they have a Python interface. And for many most packages, it's totally fine to use PyPI. Konda was created, it's more general because it's not only for Python, you can distribute C++ packages on Konda and packages written in our languages. So for some projects and for some communities, it's easier to use Konda. I would say it depends a bit on the project and depends on the community. There are projects which distribute on both and it doesn't matter. For some projects, it's a lot easier to use Konda. For many projects, it's totally fine to use PyPI a little bit of personal preference. So I often start with virtual environment and if that somehow doesn't work, then I switch to Konda, but that's just me. Yes. So again, Radon, that's a good point because I see that in our survey, there are some biology people from biology as well. So there are things in Konda that, for example, sequence assembly, for example, this will fail, but we'll see what it will fail with. This will say that it's not found. Just so you know, we have, according to the schedule, we have 18 minutes left for this part for this lesson. We do have extra time to go over at the end, but thought I would let you know so you can strategically use it. Yeah, I think I will be done by 10 minutes. Next one I'm going to show is the requirement. So this is a channel, Radon and Richard. So there are different channels that distribute different packages. So you can go to this BioKonda channel by specifying a dash C and get you these tools which are not necessarily Python. So that advantage is there for reuse. Konda, but this thing you can't do with it. So before, yes, so the next section I'm going to do that. So these two exercises I did with sort of like an example. So I didn't follow exactly the steps, but I gave you the general idea. Please go ahead and try it out later on. But there's this thing I want to show that actually failed and I thought it was nice thing to fail. Let's see. I'm going to clear this and exit my window and bring out a new one very quickly because I want something very clean. Yeah, let me, sorry about that. It's my screen again. Okay, Richard. So this virtual environment I'm going to create here. That's a good point. In Python 2, we have this venv. So I always get this because I resort to versions just to show you certain things. I'm going to check my version and show you something another pitfall because this is not recommended to do in your homes. Remember, I don't have the Python version and I'm going to copy paste something from the printing material itself. Oh, first before I need to activate it. And I'm going to do this one. What will happen now? Let's say it failed. Do you know why it failed here? The example I just copy pasted, but why it failed? I'm not sure why it failed. Yes. So that's something like very interesting answer. That the answer for that was in here in the pit pipey oak, NumPy. I'll go to this NumPy version, which is the latest, you know, Radhan, then I have this release history and I'm going to find 1.3.1 that I just installed. So it was quite old. It says that there's a new version available. And I'm going to say download files. And if I look closely, if you remember, Radhan and Richard that I showed you about this Python 3.7 binaries and 3.9. So there are specific binaries that you make the build files attached to a certain Python version. So if I go here, there's Python 3.14, like macOS, so my one is unique. So you have Python 2.7, Python 3.4, Python 3.6, but there's nothing for Python 3.8. So when people go to install, it will go and check what is the best, compatible version for me. What is the Python I have? It's not going to install Python. What is the architecture? It's going to pull. So if you don't have this, it will go through the zip file, which is the source code for NumPy, and it will try to build from source code. So that way it failed because I don't have certain things that I need to sort of build it. So if this happened, what you should do is, first you could do a condi environment with Python 3.6. You would build a condi environment with Python 3.6 and then NumPy 1.3.1, which you can't here, without modifying your system Python, here you can't do it. That you have to go for by a condi. Good point. So that's easy in condi. In condi, I have different versions. Yes. So when you make the event, it picks up the Python already available for you in your system. So that might fail there. Then we have another exercise that we could have a discussion around it. How would you record these things? Python 1.3.1 with Python 3.6. NumPy this version. Pandas this version. How would you specify this? So there are two ways to do this. One way for the condi and one for the div, but more or less same procedure. What you do is you create a text file, a YAML file for condi and a text file for div. And when you install the condi, you would say, create my environment with this name. Use this file. Instead of NumPy, you will specify that. I'll quickly show it in the next five minutes, a short example. And the format of this file is given here. Sorry, not there. Here. So here on the one, you could also specify and read that the versions. So it could be very specific or you could be more general. But in condi, yeah. So here, did you try to say anything around where you started to say something? Yeah, so I think this is very important. So these files, they have these specific names. And it's, of course, you can call them differently, but I recommend to use these names because other tools understand these names. And we will, like later after the break, we will actually see a tool that will read these files and use them. And about, should we specify versions or not? There was a bit of a discussion yesterday. I think it depends when, if you want to archive your project and you want to make it reproducible for the next five to 10 years and you don't intend to really modify it much, I think it's good to specify the versions. On the other hand, if you create a tool that you want to be used by other tools and it's evolving, maybe it's good to keep it a little bit more relaxed. Yes. But it depends on, sorry, like how specific you want to be. So this might install in a certain computer, but let's say this NumPy 1.19 is bound to Python 3.8, and the user's computer has Python 3.9, for example, like the NumPy example that I showed you that failed, that might create issues. So this is less confinement, there's more freedom, but it might break your code. Here, you specify more, this might not install in user's computer. So because normally the consumers of your code may not be system admins, or know a lot about why it failed. For example, why that NumPy failed, they might not go investigate. They might just not use the software because this is red errors, this is too much, like it's overwhelming when you see this, right? So it's a compromise that you want to make between being very specific and make it difficult or making more relaxed and break your code. So you have to think, I think there's more coming about Python packaging later on, the setuppy, and we are going to talk about bind as well. Yes. I would like to come to one question in HackMD, but maybe you can keep this open. You showed this one command, if you scroll a little bit, what was it, a little bit down or up? No, in the material, you showed that you can install condom or virtual environment from a file somewhere you showed that. Can you just scroll to this? Yes. I just want to say that this is something that I do. So when I install packages, what I actually do is I edit the file first and then I install from a file because then I have the advantage to have it documented at the same time. And I want to connect that to a question in HackMD that in this environment.yml, you can also specify channels. So you can have channels in there. You can give the environment a name. You can give which packages with versions. So one way of kind of remembering what channels did I install it from is to edit the file first and then install from the file. One thing I don't know is whether you can have multiple channels in the same environment.yml. I don't have to answer because I'm more of a virtual environment person. Yes. So you could have multiple environments in your channel, multiple channels in the environment in condom. Yes, you could do that. Answers, yes. So this is all the material that I'm going to show, but because of that question, I'm going to show something very quickly in the next two minutes. The recommendation here is to write down the text file alongside without installing them directly. So when you want numpy, pandas, mathpotlib, sidepy, you write them down in the file and then install it. So Python, yeah, for the pip, it's okay. But in condom, as practically it's very difficult to go to the specific version. So what I do is for condom, I install the condom environment first, then let's say, and then I do a condom, I don't get the command exact command first in my export, maybe. And yeah, so you could do a condom in export and have this that specific hashes that I mentioned before. And this file is already created. So here the default channel, here you can have bio condom, whatever you want. Maybe I can show that as well, deactivate. So that is to come out of an environment, you have to use this condom deactivate, you don't have to mention the name. I'm going to create another environment, condom create stem tools, get bio condom as the channel. Yes. So Richard, is there anything that in the HackMD that we would mention? Well, a good question was, it got some answers, but I think it's still a good question. So what to do if the environment broke? Like we did something and it's broken. What is a good strategy there? And I mean, I can just have one answer that I wrote there is that it will happen sometime, but to keep, like what I do is that I actually don't install anything into the base environment. I consider that as a read-only thing. I create a new environment for each project because then I'm less afraid of breaking things. And if something breaks, well, I just delete it and recreate it because it's just for the fun project. It's not my whole system. That is a very good answer, Radwan, because when you have this isolation, system isolation, conda package environments, then it's easier to delete and rebuild. If you do system-wide, it's very difficult. Your system will break. So this example I did to install this bio condom to show that how to specify multiple channels. So you could specify multiple channels on this. So after do this, you can actually export this to a file, let's say requirement once.yaml. There's some type order. Yes. Requirements. Oh, yeah. And it should be requirements of text, not the yaml. For the, for the condom. Yes, for the environment. Okay. So by the way, Radwan, the name doesn't, the name actually doesn't matter here. So it's just, you have to specify, but it's good to use the same name in order to be, for example, consistent with the material. Here, then you have the environmental file, then you can actually version control this and head. So version control this alongside your code. So that's the best practice. And in addition to that, let's say I did this, but it also showed me all the dependence. So this will be like a self-contained, fully self-sufficient requirement file. But let's say if you want to do, I think this is the command, but if I not, I will do a little googling. If you go from history, it will tell you what you explicitly said. So this is sort of that the relaxed version that we're talking about, not to confine the user a lot. So if you just want to see what explicitly you asked, you could use the from history, or you could say the complete thing. So we have two minutes left before the break. I wanted to clarify one thing because you said you could version control this file. This may not be so clear to everybody. So what version control itself is a little bit outside of this course, but what we absolutely recommend is to keep this file in the same folder, in the same repository, the same project as all the code. So it's a very good practice to keep the requirements of text or environmental demo in the same folder where you have your Python code in the same repository, not in a different place. Very, very good point, Radoan. So I will also add like your documentation, your requirement file and your code, if they're in the same repository, then the users, especially your future self, will be happy with you. And you will have like less cursing when people run this code. So Richard, that's all I wanted to present. And I think this nice arrangement that you're going on, and I would like to thank for your effort in organizing these things and all the instructors and the helpers who are helping out and the people who answered in the HACMD and also people who are participating. And I wish you a good life further. Thanks. What do you like more time to do anything else? Unless there's a specific question, I don't want to dig into anything deep because showing something really fast doesn't help unless I explain that. I guess if we have more questions, we can use the buffer time at the end and come back to special topics. Okay, so with that being the case, I guess we will go to the break.