So, I've been doing a lot of what I like to think of as boilerplate code because I've been working on the site and I've been building custom controls for the video player. And so firstly, it's awesome that you can totally get, like, there's loads of events that fire off a media element, whether it's Seeking, it's Seeked, whether it's Ended, whether it's Playing and all these things are really, really handy when you're making custom controls because you want to kind of handle that. I just wanted to, because I've spent some time doing it, I just wanted to kind of show you very briefly around some of the code.  Just check the link in the description below if you want to actually, like, spend ages looking over the source code. But I will explain, broadly speaking, how I've decided to divide and conquer the code for this. Let's have a look at what's on my screen. So, the first thing to note is that there are two things. There's actually, there's two classes that are interesting. There we go. That's how I should say it. There's the video player and the video controls. The video player is what is going to decide whether the video is playing or whether it's actually pause. It actually controls the Shaka player and it controls the video element itself. That's the, it's kind of the wrapper around. Why is it a wrapper around a wrapper around a video? Because it's a wrapper around Shaka around a video. This feels like it's going to quickly descend into some kind of tongue twister. It's a wrapper around Shaka around video. Yes, I got it. Yes. Anyway, that's not what you came for. Let's talk about the code bits. So, in the constructor for one of these video players, you can see I pull a lot of stuff from the video element because I actually put a video element in the page using Dust.js template. So, I say, look, there's a video element. And I pop in, in the HTML, all the data that I think I'm going to need. And the reason I do that is because I think that server-side rendering makes a lot of sense here. Even though this is all JavaScript-based, I don't want to make a request off for the JSON and then bring it back in, but I can encode this all inside the DOM if I absolutely need to and it's working just fine. So, I pick up all the things that I need from the DOM, like the title of the video, the link to the manifest, as in, where do I get the manifest for this particular video, post frames, all that kind of stuff.  This, here, with all these binds, you'll recognize if you have watched a supercharged. I'll explain it now just very, very briefly. These things like on key down, on click, they are class methods, but that's sugar over a prototype method in ES5 terminology. And so, if I call, if I had an event listener that's like, there's like a click event handle, let's say, on a button, and I say this.onclick, by default, the onclick will be bound to the button, for example. So, if I say this.something or other, it will refer to the button. Typically, what I actually want it to refer to is my instance of my class. The other thing, the other reason I do it like this and take a copy of it off the prototype and onto the instance is just simply so that I can do add event listeners and remove event listeners and I can still refer to it by name. So, this.onclick always refers by name to the instance copy. So, I do it for two reasons. It looks slightly odd and it is slightly odd and it's just one of those things. I would like it if we had a different way to do this, but we don't at the moment. So, anyway, so I set them all up at the start. Okay, here's actually, yeah, the event listeners are things like key down, click play, pause, back for 30, forward 30. So, these are custom specific to my app. These aren't your standard issue events. These come from the video controls, so I'll have to show you that in a moment. But there are some specific ones that I do which go in the other direction. So, when we play, we pause, the video has ended or the duration changes, I actually notify the controls. So, there is some coupling going on here. I either call into the video controls and give the video controls a bit of updated state about the video so that controls can be updated and reflect what's going on and the video controls will dispatch events back out. So, the video player, the video controls are inside something, so I can basically do event handling and so I call in, but I do events out. I think actually when you do VDOM stuff, they often say that you want to do props down and events up and it's not a dissimilar thing here. I'm sort of calling in an events bubble back up and it seems to work just great. So, these are the custom events, essentially, that I get from the controls. Then there's a few bits and pieces about whether we've gone full screen. I was surprised to discover things like full screen still require webkit prefixing on the way through. Interesting. Thought most of the webkit stuff had disappeared. In fact, I thought all the vendor prefixed stuff had mostly disappeared, but there are a few that are hanging around. There are a couple of other bits and pieces like whether we support the newer orientation locks, which I have a quick test for, which is like if orientation in a string is in window.screen. These are convenience things here, whether we support these various things. I will show you the media session API at some other point, not in this one, because it's worth seeing all by itself. It's very exciting. So, we've got all this going on. As I say, most of this is boilerplate-like. For example, if you go on back 30, all we do is we grab the video and we just say current time, take off 30 seconds, and then update the video controls. So, as I say, loads of boilerplate. On the video controls side, however, it's, again, actually not dissimilar in terms of a lot of boilerplate about sort of click handlers and so on. In fact, there's actually one global click handler, which I, so I delegate control of the click handling out to the video controls. Let me show you that. Where's the on click when you need it? La, la, la. Come on, Paul. I look on the button itself. Oh, I look on whatever was actually clicked. And if it's got a type in its data set, so if it's got data-type as an attribute, I fire a custom event with that name, which is why in the video player, we get things like, la, la, la. We get, like, back 30 and forward 30, because if we were to look in the player, I hope you all sing when you're doing your look around your codes, because I definitely do. Makes me a joy to work alongside. Hmm, hmm, hmm, hmm. Anyway, that's not what you came here for. There we see, there we are. So, like, data type equals toggle volume or data type equals toggle Chromecast. I've yet to build that bit mostly. So that data type is what's used to, as the event name, we just fire that from the video controls, pick it up in the video player and then do the appropriate thing. Oh, hopefully it all makes sense. So there you go. That is a quick look around the video controls, the video player. That's kind of where I've been roughly spending nearly all of my time. I expected a lot of boilerplate. I got a lot of boilerplate, but on the upside, I mean, let me show you now. Let me show you what we've got. This is the video player as it is, and how would you look at that? It's me and Serma. And a few other people besides. We've got the pause, play controls. We can skip forward 30. There's the buffering. Go back 30 as well. We can also drag along like that, which will also work. There's Rob Dodson. Looking very Rob Dodson. Yeah. Full screen. We can go full screen. Boom. Look at that. That's great. So that all works. All these things you can do. And more besides, I've got some code that will switch on things like the Chromecast button if there's a Chromecast on the network, all that. You can find all that in the source code, and I will spend a bit more time talking about that kind of stuff in a future entry. But for now, I will wish you a very good day, and thank you very much for watching. Hey, folks, thanks for watching. Don't forget that there is more content that you can find kind of over here-ish. And if you want to subscribe, there's probably a button. Oh, maybe there. Maybe somewhere around there. Click that if you've not done that. Brilliant.


So we would move to the next talk. And I'm delighted to introduce you today to Björn Grünning from, and he will introduce us to Bioconda and Biocontainers in his talk today. So welcome Björn. You should be able to unmute yourself and share your screen with the presentation. Does it work? And we are very much looking forward to hear your talk about Bioconda and Biocontainers. OK. Hey, all. I hope you can hear me. Yeah, so I was asked to talk a little bit about packages and containers. So kind of going a step back from workflows and talking about tools and how we can make sure that tools executed anywhere are actually reproducible. And also easily deployable. And if we start really from the beginning, I think the usual development is that you have a question, you develop code, or you develop a program, and then you try to deploy it. And this step in between developing code and deployment is what is the packaging problem since the beginning of the IT world? So the simplest packaging system that you can imagine is probably a tarball where we have, I don't know, 40 years back where we shipping around directories or tarballs and people needed to compile that on their own. But still, that's such a tarball you can't think about a packaging system. But as you can imagine, compiling these stuff, getting it to work on your computer and then maybe on your neighbor's computer is very, very challenging. So this problem is since the beginning of computers, we have this problem. How do we actually insert software on a given architecture on a given computer? And you probably know all of these different package managers around. So I kind of consider these entire C-Pan, PIP, Cran package managers as very language-specific, so more or less every language, every computing language that we know has its own package manager. And then there are these operating system-dependent package managers for the Red Hat operating systems for the Debian-based operating systems and Alpine and so on. They all have their own package managers as well. But actually for scientific research, we have kind of special needs. And there is no standard available which we could embrace. For example, in Debian, there is a Debian Met community and they try their best to package a lot of scientific packages for the Debian operating system. But of course, if you are bound to CentOS or some Red Hat system, yeah, you cannot use easily the Debian packages. So this is still a problem or this was still a problem. And a few years back, I think that's now 2016, we had still this problem that it was not easy to deploy software on the cloud, on HBC systems, and so on. And there was also no package manager available where you can think of, this is the right approach for scientific computing. So, I mean, as you know from your next-flow workflows, these programs are written in all different kind of languages. So we cannot just rely on PIP or C-Pen or whatever. It also needs to be operating system independent because we are forced to use HPC computers. We are forced to use cloud environments and they all have probably different operating systems installed. Ideally, you don't need root privileges to install it. So if you know these module systems on HPC environments, the normal procedure was to ask your administrator to install you this software as a module and then you needed to wait a few weeks or months until the software was deployed. And this is a no-go. I mean, you have seen in the talks previously that we have a huge turnaround in developing our tools and workflows and especially in a pandemic where you need to spin up a workflow in a week to actually process data. You cannot simply wait for installing a software on HPC. So you want to do it on your own and you want to do it in user space. And for reproducible reasons, you probably want to manage multiple versions of one given software. And I think what we have as a special requirement in bioinformatics, those packages needs to be very easy to maintain. Bioinformaticians are not strictly hardcore computer scientists that know how to compile and software efficiently or that can package software for different architectures and so on. So we need to have an easy to understandable language to maintain all these packages. And last but not least, and this is where we will focus in the second half of the talk, there is also something new was coming up in the last five, six years that was called containers. And you can also think about containers just as a different kind of packaging system. Containers have different requirements and has a few nice features. But essentially, if you have a Docker container, it's nothing else in the package that you install, that you run, and so on. And the question was, where is the community going? How can we address for the computational scientists for the bioinformaticians? How can we address this problem efficiently? And what was coming up in the year 2015, 2016 was a new package manager that was called Conda, which more or less addresses all our needs that we have previously defined. So we actually evaluated a lot of these package managers back at the time. So we also considered Brew, so Brew Linux, Home Brew, and so on, and also other package managers more for HPC, like EasyBuild, and so on. But finally, we decided to go for Conda for a few reasons. It's very easy to use. So potentially, or there is a potential that actually biologists can use it. It's so easy. It's, yeah, and it adheres to all our requirements. So it's language independent. It's fast, robust. You can install it on any operating system or you can use it on any operating system. It ships pre-compiled binary, so you don't need to compile it on your host system, which makes it very fast also and very reliable. And you can manage multiple versions of a particular tool, which is for reproducible a key argument. And Conda is also kind of easy to write. I mean, we saw the rise from the 2010 on that YAML is more or less dominating the field. And you can write a Conda package in YAML to a very large degree. So you define more or less the table where you get the source code. You define build requirements, runtime requirements, a few other metadata elements if you like. You can have tests as part of your package, and then you pass it on to a continuous integration system. It will build your package and everything will hopefully work. So this is how you build packages in Conda. And back in 2016, we actually created a community that is called BioConda that is specifically meant for bioinformatic packages. We have nowadays a little bit more like cam informatics and so on in BioConda. But to a large degree, BioConda is still a bioinformatic package archive where we created a community exactly around that. So creating packages for all the tools that you are using, for example, in your pipelines and making these builds reproducible. There's also a different community that is called Conda Forge. And we are working with them together. Actually, BioConda is depending on Conda Forge. Conda Forge is maintaining more or less the entire basic computational stack. So they are maintaining the Ruby, the Python packages, the entire Python ecosystem, all CRAN packages and so on. And BioConda is more specialized on the BioConductor packages, on spades, on all the nice utilities that we need to deploy for our workflows. If you're interested on BioConda, please visit the website. So we have good documentation, how you can get started, how you can use these packages, how you can build these packages for various languages. So we built for C++, Rust, Java, Perl, Python, Go. So all these different languages are supported and we built packages for them. Yeah, you have here a more or less very sophisticated contribution guide that you can use. And as I already said, this community is still growing. So we are currently maintaining more than 7,000 packages for you. But we also see that the growth of packages is kind of saturated. So it does not seem that there are many more highly used bioinformatic packages than, let's say, 8,000, 9,000. So this is kind of the number that we need to deal on bioinformatics, that what we estimate. And I think we have the most common used bioinformatic packages already here, packaged and maintained. So have a look at that if you care about it. From a community perspective, yeah, it's kind of a large community. And we have nearly 1,000 contributors and we merged in the last years more than 20,000 pull requests. You see it's an international effort. And what I'm in particular proud of is that this is more or it seems that Conda or Bioconda has established as the common base for all different kind of workflow managers. I mean, we all can disagree of different workflow managers, but it seems that at least the most common workflow managers have support for Conda packages or biocontainers in one or the other way. And this is, I think, a very good achievement that brought the entire community, I think, a step further because we can agree on the package manager level and at least here we can ensure that we are all reproducible and that we use the same binaries more or less on different arch gate textures, on different workflow managers across the globe. Yeah, but my talk is also called Biocontainers. And so let me talk a little bit about containers and the new cool kit in town. So probably Docker, if you are on an HPC environment, you're probably using more singularity, I assume, but also Rocket or the native container engine in Linux operating system, getting more traction recently. And the question is how can we actually combine both worlds? So how can we combine that you run your workflow in singularity containers on an HPC environment but maybe on Conda, on your developed big mission and in the cloud, maybe on Docker? So and how can we guarantee that no matter which execution engine you are actually using, that the same binary is included and that it's reproducible even across these different kind of technologies. So let's go back to our initial figure where we talked about packaging and let's assume we now agree that Conda, Bioconda and the Conda community is kind of the de facto standard at the given time point, who knows what's in five years. But let's assume we have these Conda packages and we are kind of happy, but now for reproducible reasons, for different other technical reasons, you want to create containers and you want to use containers. So what we are doing here is we have developed a system that now converts your Conda package into a container. And this approach is called layer donning so we don't use Docker files. This is a complete automatic process where we have a build environment and a runtime environment. And in the build environment, we do more or less a Conda install step. And everything that gets installed into the build environment as an additional layer is just transferred to the runtime engine. So if you have your runtime container, which is just a busy box with one megabyte and you compile SEM tools, for example, which is 10 to 11 megabyte, your final container is 12 megabyte in size. So the file size of the container is as minimal as you can get if you use this technology. And one design principle was really that we don't write Docker files. I consider Docker files as kind of reinventing a package manager again. So we have seen that many people started to do configure, make install in a Docker file to just create a container with SEM tools. I don't want to reinvent the wheel here again. So we invented, yeah, hopefully a smarter approach to create these containers. Another aspect of that is that we can completely automatize this entire setup. We can run it on CI systems. So essentially what you need to do, and this is why my introduction was so much about Conda, if you create a package for BioConda, you will get nowadays the container for free. And with container, I mean Docker, Singularity, Rocket, so whatever you need. And you don't even know that. So many people just contributing to BioConda because they want to have a Conda package. And then they are really surprised that, yeah, there's also a BioContainer now available for your package and so on. Because all of that is really completely automatized and part of our CI system on BioConda. So over the last years, we have created more than 40,000 containers for roughly 8,000 tools. And as I said, for these different container engines. So how does this automated container build works? And what are the advantages or what could be the advantages of the NextFlow community? So what I would like to have is that finally, we could specify just, I want to have SAM tools in this version and not the entire container pass. And NextFlow, for example, or other workflow engines could take this information, just the pure metadata, SAM tools, the version, and do a little bit of magic and figure out if a given container is actually available, if you can download it, which type of container you need? Do you need an ARM container? Do you need a whatever, x86 container? Do you need maybe singularity? Do you need Docker? But this should be part of the engine. So if your workflow engine or if you're executing the engine and these hard coded container purse, I think are limiting yourself too much. In contrast, if you have just the metadata and you let the engine tweak which container is best suited for a given architecture where you schedule the workflow, you gain way more flexibility. And this is what we are aiming here. So when you build a container, and this is what's happening on the CI infrastructure, but we have also command line utilities for that, you can simply say, build, SAM tools equals a specific version, run it, and what you will get is actually this container. So this will be automatically created, but you will also get the singularity stuff and so on. An interesting aspect here is that this name here, which is in bold, is now predictable because it's always the condo name and the condo version.  So this is very easy to do. It gets a little bit more tricky if you consider containers with multiple tools inside. So let's assume you need a container with SAM tools and bad tools in parallel. One question that is still up in the air and everyone can define and best practices here, I guess, but you should really ask, are these multi-tool containers actually needed or can we decompose workflows in a smarter way? But let's assume you need to have a container with both packages inside. How do you name them? Now, you could name the container SAM tools dash bad tools, but you could also name them bad tools dash SAM tools. So it's not really unique and what we need to make these metadata idea working and the findability working is actually that we have a unified name scheme. So in the end, what we want is, we want to treat containers like catalysts, right? We don't want to handcraft containers. We don't really care about the name of the container. We just want to use a container that is deployed somewhere and run our workflows in it. Essentially, you as workflow developer, you should not care about the container. It should just magically work. All what you need to provide is what binaries needs to be there to run my step in my workflow. And this brings us to the big question of findability. So how does a workflow engine can find a given container for you given annotations? And what we developed here is, especially for these multi-tool containers, is a naming scheme that is very trivial in the end, but you don't need to search. You just retrieve or fail. So you don't need to go to the bio container's registry or you don't need to go to Docker Hub and search for an arbitrary container that maybe contains your binaries, maybe not because most of the containers are also just black boxes. You just give the annotation, SamTools131, and your workflow engine will just pull it down or fail in this step and give you hopefully a meaningful error message. We could also think about to build these containers on the fly, right? So other workflow managers have implemented that already that if you don't find your container, but you have your condo package, build your container on the fly, ship the container to the cluster and then execute it inside the container. And what we could also think about or what I will show you in a minute is that we can also build containers in advance, for example, by scraping GitHub and looking at all different workflows that are lying around on GitHub and then creating specialized containers for all of them in advance before they are executed. So to make a long story short, the same step that I showed you with the simple SamTools container is now also working for these multi-tool containers by simply normalizing the package namespace, hashing these names, the same we do for versions. And what you will get is kind of such a string here. So this is actually your container name. And yes, it's not readable. It's for a human being, it's completely useless, but the point is a little bit that we don't create these containers for human beings. We create them for workflow engines. And workflow engines, on the other hand, can just take this metadata, construct the hash and just pull the container down without looking up some APIs without doing some other magic. You just create the hash, you try to pull it down. If you fail, you can build your container locally on demand. And this works quite nicely for a few of our users at least. And this is kind of what also, yeah, is very special in bio containers that we try to have these predictable namespace for all your containers. Because then workflow engines can just make use of it without you as a developer worrying to find a container where now SAM tools and bad tools are inset and this container should be minimal in size and the correct versions and so on. So this is more or less the problem which we try to solve here. How can you create such a multi-tool containers? So as I said, the single-tool containers are created automatically for you via Bioconda. The multi-tool containers, you just need to create a pull request on GitHub in a special repo. You provide the string here with all your dependencies that you want to have in such a container. And as soon as someone merges a pull request, you will get your container. You can even go a step further. So we have also bots running around that are searching for workflows, for example. And if they find a workflow where no container is available. So for example, here again, our example of bad tools and SAM tools. And there was no container with this particular bad tools and this particular SAM tools version. So the bot has created this pull request and on merge, the new container was or is then available and can be used by your favorite workflow engine. So a few things about bots because these bots are everywhere nowadays. So even on the Bioconda level, we have now a bot that if a developer, so if Phil is releasing a new multi-QC version, there's actually a bot running around and creating new Bioconda pull requests that just needs to be merged. So even that process is kind of an automatized. We still require a community review, but essentially the pull request is created. Someone needs to review the pull request from the bot and merge it, it's in. If it's merged, the bot or the CI system is creating actually the container for you is pushing the container. There is a bot that updates tool descriptions or your workflows, if you think about that. Then there's another community review kind of reviewing your workflow updates, if you think about that in this way. If you actually have a step in your workflow which require multiple packages, there's a bot that creates these multi-package containers for you. And finally, there's a bot that triggers the workflow test for you. So I mean, all the system is a little bit scary if you think about it that we drove it so far that most of that is now automatized. But on the other hand, that's probably what we need. We want to care about science. We want to analyze data and we don't want to care about, yeah, how do I compile a package? How do I get sent to its insert on my cluster environment and so on? But also keep in mind that all these bots needs to be maintained and so on. It's hopefully less maintenance effort than if you don't have the bots. But the people that care about the bots is way less people than the other people that would create manual pull requests. So it's a shift in responsibilities which is probably not good. On the other hand, a lot of people are quite happy that this bot is keeping track of new versions for all software that we maintain. So essentially you can assume that nowadays for all high quality bioinformatics tools you have every version now as Conner package and as biocontainer. Yeah, who's using it? And as I said, this is kind of cool because all these different workflow engines or the most used ones are actually making use of that. And they are actually sharing code, at least from the ones I know that are written in Python. They share actually library codes to pull down these containers and so on. So I think that's really cool that we have a common ground, a common denominator to actually work here together and improve the packaging ecosystem. So the tool side of our ecosystem. Yeah, and with that, I would like to thank all the, I mean, all the different communities that have contributed in it, all these different funding agencies. There's a lot of infrastructure needed to keep that running. So, I mean, just think about 40,000 containers. What is that in size? And we replicate all these containers in different regions in the world. We have CDMFS repositories for all singularity containers, also distributed and mirrored across the world. So there are a lot of funding agencies included that try to back that up, but also make the download and availability of all these containers, hopefully super robust in the future. So even if NIH, whatever cuts funding that we have mirrors in Europe and Australia and so on. So to keep the ecosystem in our community still kicking. Okay, thanks a lot for listening. Happy to take any questions. Thank you very much, Bjorn, for this very interesting talk. We can also say for the NFCOR community, Bioconda and biocontainers are indispensable. So already for including tools in NFCOR pipelines, there is a guideline that they need to be added into Bioconda or any Conda channel. Otherwise we cannot use them inside the pipeline. And now moving to DSL2 and modules, biocontainers are getting more and more important. So we have a lot of questions for you. Thank you for joining us today. And we could get started by a question by Phil, which is, could you tell us a bit more about this mold tool? Is it a tool that you wrote or is it a general tool that you are using? So that's, yeah, so this is a tool that we developed here in Freiburg. It's, again, it's super simple. I mean, if you think about it, it's you have these both containers, these runtime engine, the build container and the run container. And what you are really doing is you're triggering the installation in the build container and you make sure that everything that gets added in addition gets copied to the runtime engine. The mold script or the mold technology actually works for different package managers. So for example, you could create for all Debian packages, Debian containers. The disadvantage of Debian is that if you trigger an up get install and you will get these new additional software installed, the runtime container needs also to be a Debian, a base Debian run time engine. So it's whatever 60 megabyte in size. So you will end up with bigger containers in the end, but mold is in principle from a technology standpoint able to use any package manager. And this was the main idea. I don't want to repeat package managing or package creation with Docker. So our initial idea was just take a package manager, just repackages and distribute it as container. And this is also the reason why we did it initially for Debian, for Alpine packages, but then considering that conda is actually going until Zlib with all these dependencies. Yeah, we base bio containers on conda packages, but the technology is completely independent of conda. And maybe I forgot to say that, I mean, I'm completely aware of disadvantages of conda and so on. And who knows if conda will survive the next five or 10 years. But this is not, I mean, I don't worry too much about it. The only thing that I worry is that our ecosystem and the things that we developed can be transferred to new technologies, right? So we have packages, we have package managers. So move them just or convert them just to new freaky technologies. And if this is Docker or Singularity or whatever comes next, I couldn't care less. I mean, this is not what I'm really, really motivated in, right? So I just want to make sure that whatever comes next, we don't start on the baseline again and make configure, make, make, install again and again. And this is wasting too many resources. So yes, Malt is independent. It's developed, it's a very small Python script. A little bit of Lua code to define different tasks, but essentially it's converting from a package manager to another package manager. And it can be easily replaced by fancier code. So there's really nothing special here in it and there's entire talk, actually. Can I ask a very quick follow-up just to clarify something? So correct me if I kind of got my understanding wrong here, but you've got this one megabyte kind of base image that you're building the new stuff into for the package. So presumably you don't have a whole operating system in that one megabyte. So what happens if my tool, which is going in from Condor needs some kind of underlying operating system commands? Where does that come from? Yeah, this is, I should paste and maybe hear the conversation with Paolo. This is exactly the point where I discussed it. I don't know, this is already two, three years ago. We see next-flow core developers that if a workflow engine assumes Unix command line tools in a container, that's probably a bad design decision. And this is where we kind of disagreed in the beginning. So because next-flow was, I'm not sure if it's still, I don't know, it's not still, but it was relying on a specific version of PS and other very bare metal command line tools, but they are still different. If you don't use the GNU PS or TILS, but if you use whatever the busy box or the BSD version of these command line utilities, you get a different behavior. So I think if your workflow engine depends on the GNU version of a particular tool, it should actually depend that or declare this dependency, right, where we are back to these multi-package containers. So nowadays you can just define whatever orc in this version and or set in this version, but actually D define that you are talking about the GNU set version and not the Mac OS BSD set version. But I think the next-flow developers fix that and this is not an issue anymore. But I'm also thinking, say for example, multi-QC wants to do, I don't know, some kind of base commands. Next-flow is a perfect use case because it's been a problem in the past, but presumably there are plenty of condo packages which do use underlying system libraries. So they'll have to start declaring those dependencies. So I mean, my take on that is the only thing that you can rely on is on bash. And everything else should be defined as dependency. So if you use set, if you use curl, if you use org, you should define this dependency because even org changes the syntax of a tool set. I mean, there are different set versions running around and you cannot even use the same set command on OS X and on Linux. So this is, and that's why I'm saying if you use that in multi-QC, you should probably define this dependency even if it will blow up your container by whatever 10, 20 megabytes. But this is, this is just good for reproducibility. So I know that other workflow engines really just say the only thing that you can assume is bash. And even that was debated for a long time. Thank you very much. Yeah, no problem. Yeah, thank you very much. And now that we are talking also about reproducibility and containers, we have a question by Harshel. So how do you, how do you ensure reproducibility with multiple builds of the same container if the tag is the same? You get, so if you see this container version, you will get here minus, minus one, minus, minus two, minus, minus three. So you have more or less the same that you have in condo, the build version. You have the same in the container as well. And I talked about these smart way of workflow engines to pull down the container. So it would be smart, I guess, that if you don't specify the build version in your metadata here, that you always retrieve the latest build version until you actually fix a specific build version. But I guess we are all going in the direction that only the latest build version is actually the one that you should use. Yeah. So this is part of the container name. Harshel, actually, we cannot hear you. You are muted. Thank you for the answer to the question. Okay, cool. And thank you for all this work again, amazing. No problem, no problem. Thank you very much for the clarification on this. Yeah, multi-tool container is something that a lot of people had questions about as well. And I was wondering, so you've shown now an example with two tools in that container. Where would be the limits here? Can you imagine also, you, sky's the limit? I mean, the only limits that I can imagine is limits on KIO and Docker Hub that your containers at some point so big that we cannot push it to them to these registries. Or let's simply put it, the restrictions of a Docker container. Otherwise, there are no restrictions. I mean, you can just a comma-separated list of all your tools that you want to include and then go for it. But again, I mean, my personal opinion is that this should not happen. We should create workflows that are decomposable, that EDLE has only whatever one tool in one step. I know this doesn't work always because whatever certain mappers create a SAM file and you probably want to convert it directly into BEM in the same step. But I think we should aim at minimal containers with minimal dependencies. Yeah. Thank you. Thank you very much for clarifying on this. And Harshel had another question as well. So are there any plans to build more standardized R or bioconductor images with multiple packages there or these would be handled in a similar way as these multi-tool containers? Not sure what you're... So bioconductors, so what we are doing... So bioconductors a little bit special again, as always. So we are actually building automatically all bioconductor packages on BioConda. So they release every six months. So a month later after they release, we most likely have most of their containers built, but these are only single package containers. So we don't put the ESAC2 with whatever a go seek together in one container. And the reason, I mean, I don't think it's biocondor problem and it should not be biocondor's concern. I mean, we have developed this multi, this URL here. We have developed this repository exactly for this purpose in the sense of if you need two bioconductor packages in one container, just create such a pull request here and then you get your container in 10 minutes. But again, I would say these should probably be two steps in a workflow, but yeah, if you need it, create it. So you see here that this is an example of the XCMSS package and they also need Color Brewer for whatever reason. So we have this container now. And the same can go for two bioconductor packages. Yeah, this often comes up about, I mean, even in our group as to how we maintain bioconductor within the group because often, and try and keep things reproducible because often you need multiple packages to run a single script loaded within that environment. And if those packages are in single containers then obviously you can't run that same script across multiple containers. So you need some way of having everything within the environment. And I think filling the group has gone with a condor approach. So we have a local condo installation which we try and update with packages if we need to. But I guess this is a common problem for a lot of people is to how to maintain bioconductor packages locally and also reproducibly and also not having to minimize the maintenance of it. Which is I guess is why I was asking if there's some sort of plans for even maybe coming for our bioconductor to build their own images for standardized packages within the same environment that you could just use without doing anything. But I guess this is an expansionally complex problem, right? I mean, if your arbitrary R script is depending on seven different packages, I mean, we cannot create a priori all different combinations of tools. So that's why I'm saying your R script should in the first place maybe be split it up into three different R scripts if possible. And if not possible, okay, then let's create a container for your group specifically and keep that container updated. And what I can just recommend is creating also these kind of bots, right? I mean, this bot is really, I mean, we have an allow list that contains a lot of GitHub repositories that we scrape. And if we find a workflow, if we find a tool, in your case, if you find an environment file for from your group, you just take it, create a container, and this is more or less a snapshot of your R environment in 2019. And you can treat it like that. I mean, again, everyone is free to use that. We are currently not in a stage where we have the storage problem. So I let keep that going and then see, yeah, how much terabytes we actually produce in the long run, but until now it doesn't seem to be a problem. So just use it in that way and it should work, hopefully. Oh, thank you. Yeah. Yeah, we were wondering then if all NFCore repositories could be also added to that to that white list. So let's do that in the first place. And then, I mean, I'm always a fan of let's try it and let's see how far we come and then yelling at people to give us more storage. I mean, this is what we... So this is what we are doing for the Galaxy community for all Galaxy tools and workflows. And these are now, whatever, 3,000. And yeah, I don't think it's a problem, not yet. It might be in the future, but let's wait for that time. Okay, so one last question regarding biocontainers. So Docker images are hosted currently on Quay.io and our Singularity images hosted online anywhere. Question by Phil. Yes, that's correct. What was the question? Sorry. So if Docker images from biocontainers are currently hosted on Quay.io and our Singularity images hosted anywhere? Yes, yes. So the beauty of Singularity images, it's a file. So you can actually share it via FTP R-Sync whatsoever. And this is what we are doing. So there's an FTP or a very simple step server where you can download all 40,000 images. But I mentioned it briefly. There's a technology that is called CVMFS. I pushed this idea already to the next flow developers a few years ago. This is kind of a read-only file system over HTTP. So you don't have any problems to get that into your cloud because it's really just speaking HTTP. And it's mounting a directory over HTTP read-only into your workspace. And you see immediately 40,000 images. But only if you access one image. So only if your next flow workflow is actually wanting to run this one image, it gets downloaded and cached. So the first time it's downloaded, the second time you run your workflow, it's already cached and just using it. So I would always recommend to use the CVMFS and working with our community together to kind of shape the ecosystem around the CVMFS mirror. For example, we also share on the CVMFS reference data. I'm not sure how next flow community is maintaining reference data, but we use the CVMFS idea for images, for reference data, for databases and so on. Yeah, and we just mounted in over HTTP. It's a fuse backed technology maintained by CERN. And this is actually what I would, at least the hardcore people and look at. But the most easiest way is obviously just go to the FTP and double, you'll get your singularity images. Super cool, thank you. Sorry, I dug it up actually while you were doing questions that I found. It's a Galaxy FTP somewhere, I guess that you're keeping. Yes, exactly. So this is hosted by the Galaxy community, but yeah. As long as we have funding for that. We've been looking for something similar for years and we started off using the Singularity Hub, but then we were hit by the usage requirements. And then we wanted to use Singularity IO, but they have, we can't automate that because you need to manually renew your key every 30 days or something. And I sort of given up. If we have more of our containers, Singularity images, that's great because, so the main thing we want that for is, actually for people running offline. So make it easy to grab the Singularity image on whatever little small laptop you're using. It doesn't have to have Singularity installed and then you can just pop it over. And if you can just download it from an FTP and sort of building it every time, that's really helpful. You could create a staging script or something similar, but just stages the containers that you need for workflow on your notebook and then can go offline, yeah? Yeah, exactly. Now, this is good to know about and I'll look up the other file system that you're talking about, something exciting. Yeah, just drop me an email. So we have an Ansible role that will insert your CVMFS and set everything up. So CVMFS is an awesome technology. You have some kind of geolocation also included. So it will actually take the mirror that is locally the nearest to you. And what we do in several European projects like Alexia and EOS is that we build now CVMFS mirrors in Europe, Australia and the US. So I think it's a neat way to solve the reference data problem, for example, but also the container problem in the long run. Very nice. Thank you very much. I still have some questions regarding Bioconda, the first part of the talk. So question more for beginners that we've had this situation sometimes in the NFCOR community in this, can anyone can publish a package on Bioconda or do you need to be the main developer of that tool? No, everyone can do that. I mean, you need to go to a review process but you can update Phil's package. So if someone reviews it and approves it, yeah. People often do because I'm too slow to do releases. Yeah, no, everyone can do that. But the nice point is that we have a lot of upstream developers now. So this is actually where you know that a project is kind of successful right, I mean, at the beginning you crowd source everything and everyone is building all packages that you need but you're not maintained. But if the upstream developers popping up and yeah, then you are in the second stage and that's pretty cool. But everyone can contribute and I warmly invite everyone to contribute here. Perfect, thank you very much. So there should be no excuse left, not what. And final question. So do you have any tips for people who suffer from long lasting environment building? Huh, depends on what you're doing. So if you deal with our packages include our base in your environment definition. So pin more or less our base to four or to three dot six. So this will help. There are some discussions of... So, okay, the short answer is there's an issue on Bioconder. With, I mean, the Bioconder issue we also use to communicate to our users and so on. And there's a description of what you can do to actually speed up environment builds. And there are some suggestions. So have a look at that. The long answer is a little bit, we are well aware of the problems. Condor Forge is more or less also driving in the direction of supporting multiple condor implementations. I mean, condor is more or less just one implementation of the metadata scheme and there are other ones like Mamba. And Mamba is way faster than condor currently. But I wouldn't recommend Mamba yet for beginners. And I personally would like to get the people involved in a table and talk to each other. This is the condor main developer. So that's actually the under condor company that is behind that. Talking to the Mamba developers, talking to Condor Forge and Bioconder and so on to figure out. I don't want to have the separation of whatever different condor implementations. I would like to that everyone works together and improving, but if it's a really urgent problem, look at the issue and try to consider using Mamba. And Mamba from the syntax is the same than condor. So you can just exchange condor with Mamba and then do your magic. It still works. And I think Snakemake, for example, goes a step further and actually now recommends Mamba for their users. Yeah. But at first, if it's our packages include our base, that's probably solving your problem already. Yeah.  So we don't have a strong Perl community or anyone that is kind of old enough to understand the Perl packaging system. So if you have Perl packages in your environment, this could also be a reason that, yeah, we would need to invest more time in our Perl ecosystem, which we also didn't have the capacity and the main developers that we have are really not familiar with Perl anymore. So this is a problem. Yeah, sorry, no other answer, but have a look at the issue and I can probably put it in a chat afterwards. Yeah, thank you very much. I'm sure this will already help us a lot. And thank you in general for the talk that was really helpful to have this insight into biocondent and biocontainers and how to build these biocontainers and multiple containers. So thank you again for coming to NFCOR Hackathon. So with this, we will end up the session of Hackathon Talks today and we'll see you later today at half past four Central European Summer Time for the final Hackathon wrap.


The 7th edition of the India PR and Corporate Communication Awards is presented by Ad Factors PR, India's largest PR consultancy powered by Media Mantra, behind every successful company there is a PR firm. Yes, make some noise. Associate partner value 360 communications, managing brand equity, global outreach partner media value works, facilitates international PR campaigns with media who matter. Lifestyle partner, active media PR, India's leading lifestyle PR specialist. Co-partner, Genesis Berson Mastella embarking on the 25th year of pushing boundaries of communications and setting benchmarks with imagination and that's a very long tagline that I have. Creativity and agility to be more for its clients, people, industry and community. The MSL group, India's leading integrated communication firm PR Pandit, creating engaging campaigns with real impacts, parenza communications. We say it for you, online media partner Vicky Pedia, live webcast partner 24 frames digital. All that's happening here tonight at the cafe is being live webcast, live streamed on 24 frames digital. The microsite of IPRCCA besides being carried in the various other platforms that E4M hosts. All right, could we have the partner AVs please?


wick dhbar dihe rang baitting Eventually outcome came How was the Wrestling parents? Was humiliated. So the kids started fighting. Children too failed to do this, they were also being judged and добbed by the system Kids were not left out or almost killed by that. मेरा निकाजा जिरा बच्चाया वो में नावदा प्यारा आई जिनो तांगर दे अपने मानते भी मैं डल्ची किती है आगा


is that many times this basis, A mu or A nu whatever is a basis of, is a set of real functions and this really helps. Although I want atomic orbitals, it will be useful to use real functions and this is where for example, the Cartesian p or d functions are really helpful. So you do not use for p z, you only use p z, p x, p y and do not use exponential i phi, exponential minus then it becomes complex. I will tell you why because then if it is real function, this star is itself and that introduces several simplifications. So one of them is the following. So for example, let me take one type of function, let us say mu nu lambda sigma, just does not matter what is the index. I am not writing 1 by r 1 2, but 1 by r 1 2 is there.  So this is 1, this is 2, this is 1, this is 2 in terms of dummy variables. Since all are real, I can do lots of interesting things. I can interchange between mu and lambda, I can interchange between nu and sigma. The result will be equal. So I can start writing very quickly certain symmetries and I hope you will follow me very quickly. Let me for again sake of, remember when I am writing mu nu lambda sigma, it does not matter. For the sake of brevity, I am not writing 1 by r 1 2, but assume that 1 by r 1 2 is there. So mu nu lambda sigma very clearly would become lambda nu mu sigma. Mu sigma lambda nu, please remember this is the lexical order from where I started, mu nu lambda sigma and this can be interchanged depending on how what these are, does not matter. So that is equal to lambda nu mu sigma because they are real, remember. And then I can interchange both this as well as this. So it will become lambda sigma mu nu, lambda sigma mu nu. Then I can do another interesting thing because of the fact that 1 and 2 are dummy indices, I can independently interchange 1 and 2 on both sides and that could be done even if they are complex, remember. These are only for real. But even if it is complex, I could write this as nu mu sigma lambda because that will only change dummy variable 1 and 2. I hope all of you are understanding. Once I can write this, I can write further prescription for the real functions using the same set. That means interchange now this sigma mu nu lambda, interchange this. So nu lambda sigma mu interchange both. So sigma lambda nu sigma nu mu, sorry sigma lambda nu mu. This is when mu nu lambda sigma, each of them is distinct that is mu not equal to nu not equal to lambda not equal to sigma. Then you have this what is called the 8 fold symmetry. 8 fold symmetry I have understand what you mean by 8 fold symmetry. Of course if mu is equal to nu, some of the symmetries will vanish because there is no point in interchanging mu and nu. For example this and this is identical in that way. So it will become 4 fold symmetry. Number of symmetry will reduce depending on the uniqueness of the indices. But as long as the 4 indices are unique different you have a maximum of 8 fold symmetry and that is the largest number that you have. So eventually your m to the power 4 is not m to the power 4. It reduces. Like if everything had 8 fold symmetry then it would become m to the power 4 by 8. But that is not true because some of them have 4 fold, some of them have 2 fold. If they are equal then there is only one number. There is no further reduction. So now can you tell me what is the actual number of integrals? Assuming the real function. So I add to your home assignment for the next Monday this one. Calculate the total. Don't worry about zeroes. Assuming there is you don't know about this per city that I am not asking. Assuming every integral is you have to do. But the symmetry is what you have to factor. If I have mu nu lambda sigma I will not like to have lambda nu mu sigma again because they are equal. I like to have only one of that number. So based on only the symmetry not the special symmetry based on the integral symmetry. So what is the number of total integrals? So the assignment is the following. So that is again for the home assignment. If this mu basis is a set of real functions calculate the number of unique integrals. So I hope you understand what is unique integrals. That means something should not be calculated twice if they are equal. Unique integrals of course when I say integrals it is two electron integrals. So let me clarify and unique two electron integrals in an M basis without taking into account any special symmetry. So you can assume that the molecule is such that it has no other symmetry. It is A1. Many of you have done group theory. It is A1 symmetry so no further symmetry is there. Point group is A1. So no further symmetry should be assumed. Of course if there is a further symmetry it will reduce even more. So what is the total number? Obviously from my discussion you can make out I can give you the hint that it should be something to do with M to the power 4 by 8 but it is not. As clearly I told you because all numbers are different because if all are uniquely different then those numbers have to be divided by 8 but that will not be M to the power 4 by 8. So what is the actual number? I hope the problem is clear. Based only on these two electron symmetry no further symmetry should be assumed. That is what I mean. So calculate the total number of unique integrals and that will really help. Then all it depends is of course putting together this code. Basically multiplying this with these and so on and so forth. That is very easy. After that we will go to the iterative part and then of course how to solve the equation. FC equal to SC. How to solve the Routhan equation that I wrote. That is something that we will do. So let me now write the Routhan equation once more. F nu mu C mu i. I hope all of you can write it. Sum over mu epsilon i sum over mu S nu mu C mu i. If you note this I have to write for every nu and every i because in this equation nu and i are specific integrals this is. Mu is a dummy index. One of them is a dummy index. So given a molecular orbital i given a specific nu atomic orbital I have written down this equation. And I noted also if this was a Kronecker delta this would have a structure of eigenvalue equation. So what is the structure of this equation? I already have written to you a matrix SC. I will now introduce another nu matrix called the epsilon matrix or I can still use epsilon or maybe some eigenvalue matrix which is simply a diagonal matrix epsilon just as I do for epsilon m 0 0. Remember although I am interested only in n electron problem when I solve this equation this is a m by m problem. So I will actually get m orbital energy just as I get in eigenvalue equation. So it is actually a m dimensional matrix. So I construct a nu matrix E matrix do not confuse this with identity matrix. It is a diagonal matrix containing these eigenvalues or these values epsilon 1 epsilon 2 and the rest is 0. So it is a diagonal matrix then this entire matrix can be written for all nu i can be written in a matrix form as SCE. So it is a matrix multiplication. Note the same thing we do for eigenvalue equation. I can repeat this if it was delta mu nu the eigenvalue equation note that the same equation if S nu mu were delta mu nu what would have been written? This would have been F nu mu C mu i for a specific number would have been epsilon i C nu i again for every nu and i. How would you write this equation eigenvalue equation? You write exactly the same manner F CE equal to CE. I think in many parts we have discussed this although when I write it here the orbital energy can be written anywhere because this is a number. When I write in terms of matrix these matrix must come right of C matrix otherwise you will never get this equation. Because this matrix does not necessarily commute to the C matrix although it is a diagonal many people have a confusion the diagonal matrix always commutes to the another square matrix that is not true. A diagonal matrix commutes to the square matrix provided the diagonal values are all equal. So a degenerate diagonal matrix only commutes to the square matrix so you have to be very careful and normally you write always F CE equal to CE AC equal to CE whatever, whatever matrix this is the form of an eigenvalue equation. So precisely if you understand this you should be able to write this. The same equation you should be able to write except that the S which was an identity matrix has just come in the left of it and this is the format in which you have to write. Again E goes in the bottom and again S and C do not commute so you have to be very careful in writing this. Again at some point of time you may come back and ask you to derive this from here to here. How can you write it? These are all good assignment problem but please note this that we can write this F CE equal to CE in a matrix form and in matrix form when I write I do not have to write these for all new y. Remember here I have to write for all new y that is now all contained because when I multiply row times column all multiplications are contained. Here I am specifically talking about a new eth row, ith column and so on that is all contained here except that it is not an eigenvalue equation. I know how to solve this, I do not know how to solve this because of this guy S. That is another issue that we will come to that but before we come to that we will let me recognize that just like if S were delta I could write F CE equal to CE I should be able to write this as F CE equal to SE and if you know how to do this you should be able to do this but if you do not know we will come back please practice at home but can you write this in this form, write a simple 2 by 2 matrix, expand this you will see that you will get these equations. So you have actually four equations here new equal to 1 to 2 let us say everything is 2 take a 2 by 2 so M is capital M is 2 so you will get everything. Very clearly when I have a structure of M now the fact that I was a molecular orbital and I was interested only up to N by 2 molecular orbital that information is gone because when I solve this equation I am going to get everything now capital M the entire dimension would be capital M so whatever I do eventually I will get capital M sets of C me y capital M sets of C me y M square C me y M by M so I will actually get capital M molecular orbital is it clear eventually when I solve I will get capital M molecular orbitals because everything is now capital M whereas I required only N by 2 which is fine because all the rest of them will become unoccupied orbitals and I have already given interpretation for unoccupied orbitals more they come better they are and they will have a great use later although for Hartree-Fock I would only require N by 2 of them the result of the solution will give me capital M. Capital M molecular orbital space which means 2 times capital M spin orbitals and if I now do full CI then I will have 2 MCN determinants right when I have started with this atomic orbitals A they are not normalized once you normalize of course I am going to do that that is the next thing I will do how to solve but you have to remember after normalizing you have to get back the chemist picture otherwise the normalized orbitals are do not belong to any atoms so we will do that that is exactly what we will do but then we have to know how to get back the chemistry otherwise the chemist will not be interested so that is why that is why we started with an orthonormal basis otherwise a non-orthonormal basis otherwise I could have started with orthonormal basis okay in fact if you do methane calculation with the basis of only carbon atoms this is very fascinating a physicist would love that then the entire atomic orbitals are orthonormal and a physicist would argue that if I take a complete set of only carbon atoms I should be able to describe methane molecular orbital to chemist it will be atrocious that you are constructing a methyl molecular orbital CH4 without even having any hydrogen atomic orbitals but tell me what is wrong there is nothing wrong as far as mathematics is concerned I could use only carbon atomic orbitals and construct methane molecular orbitals and they would be orthonormal except that number capital M would have been very very large to get a meaningful information you require you would have required a much larger basis because eventually have to approximate so the approximation works well when I mix now this is where I always say that the chemist have intuition okay so chemist have intuition they will do it but you know their intuition has brought in some problems again but mathematicians can solve it so you have to help take help of mathematics people to solve your problem messiness that you have created because of intuition and there will be solution to this but yeah you are right I mean that lot of physicists say that you know take only one atom and expand the entire molecule in but you see you lose the entire picture and there is no lcao there is no understanding of the contribution of atoms in a molecular orbitals everything that the chemist love to do would vanish you will only get a energy but the interpretation is very very important remember so our interpretation is what we would like love to do so that interpretation would not be there very easy unless you do that okay so I hope you please try this at home I am not giving this as a formal home assignment the number of integrals I have already discussed so please do this once you do then you are in a good business then we can start solving this equation so two there are two parts how do you solve it and of course whichever way you solve it the iterative this remains because your f matrix depends on the coefficients don't forget this so we have to do an iterative solution of the Haltry-Fogh-Ruthan equation and then we have actually solved the molecular problem completely almost completely except that I still have to worry about what are these basis functions you know right now I have just told you these are the basis functions which have written mu nu lambda please remember also that in in short hand notation when I am writing mu lambda nu sigma they are actually a nu a lambda I hope that is very clear that this these these are basically a nu a lambda you know and so on 1 by r1 to a mu a sigma in a in a long notation this integral okay but but I am using just nu lambda mu c because that's really unimportant now because they are in the basis yes how do you have non-iterative because you can't have because that's a physics yeah that's a physics the the Haltry we have we have an iterative solution because your original Haltry-Fogh equation of the fog operator came has the field from the other orbitals if it was not then of course it would not be variational optimum so that is the first thing that I learned that to have a variational minimum energy I require the field of one electron operator of an on an electron must derive from the field of the other orbitals other other electrons so that's the first thing I have learned now that cannot vanish okay these are all then versions of Haltry-Fogh for atoms numerical for molecules expansion of bases okay but the basic spirit will not go so somewhere that iterative thing will remain in fact if you do that vanish then there is something wrong physics how did it vanish so the dependence on the other orbitals are coming now through the coefficients okay yeah alright


Ladies and gentlemen, the President of the United States. My fellow citizens, today we come together on historic grounds to write a new chapter in the American Revolution. We represent men and women of different faiths, backgrounds, and political parties from every region of our country. People live on Main Street, USA, and they're saying we love this land and we will not give up our American dream, but for too long, for too long their voices have been ignored. And no army on earth can stop an idea whose time has come and our time is now. We don't come as a special interest group pleading for personal gain. We're messengers of a united people demanding constitutional change. A crisis is a much abused word today, but can we deny that we face a crisis? Thomas Jefferson warned, the public debt is the greatest of dangers to be feared. He believed that it was wrong and immoral for one generation to forever burden the generations yet to come. His philosophy prevailed for the first 150 years of our history. The college said there is no dignity quite so impressive and no independence so important as living within your means. But then without quite knowing how it happened, we began surrendering to a siren song that was called The New Economics. Budgets became chronically unbalanced. Inflation we were told was good for us, necessary to prosperity. And the growing debt was no problem we were told we owed it to ourselves. So we have only balanced the budget once in the last 22 years. The national debt more than doubled in the last just the last 10. It was ready to break the trillion dollar barrier when we took office. The debt pro rates out to $18,000 for each and every family in the United States. Borrowing to finance the annual interest on that debt, which is greater than the entire national budget just 22 years ago, more than a hundred billion dollars, crowds out investment and keeps interest rates too high. I've said before on occasion that balancing the budget is like protecting your virtue. You just have to learn to say no. Since 1960 federal spending has increased nearly 700 percent. That's much faster than our ability to pay for it. This spending was excused in the name of fairness and compassion. But it turned out that fairness and compassion also meant local governments losing control of their communities, working people, small business and pensioners being hit by record interest rates, inflation and taxation. And that golden era of growth that we once knew in this land gradually slipped from our grasp. Let's quit kidding ourselves. Pretending government could spend like there is no tomorrow and not hurt anyone has ended up punishing everyone and the needy most of all. While we were doing all this, did we forget? The function of government is not to confer happiness upon us. The Declaration of Independence does not say life, liberty and happiness. It says life, liberty and the pursuit of happiness. There's some things that are left to us to do. Now these are not republic and a democratic principles. They're American principles as important today as they were 200 years ago when our ancestors were fighting a revolution so that we could be free to work out happiness for ourselves. Families stand at the center of society. They're the vanguards of America's future. Yet how can families and family values flourish when big government with its powered attacks, inflate and regulate, has absorbed their wealth, usurped their rights and too often crushed their spirit? This nation's greatest transfer program is not welfare. It's the annual turnover of you and your neighbor's income to Uncle Sam. Runaway government threatens our economic survival, our most cherished institutions and the very preservation of freedom itself. The people have had it. The people are saying enough. You know, our administration has the strange idea that you all weren't born just to help government grow fatter. As a matter of fact, we promised to make a new beginning to build together a brighter future filled with opportunity and hope. Together with a bipartisan coalition, we've cut the growth of federal spending nearly in half. Imagine how much worse this expected deficit would be if we had permitted spending to keep shooting up at its 1980 rate of 17 percent a year. Another of our ideas was a reform that I'm mighty proud of, an historic program of incentives for savings and investment with a 25 percent personal tax rate reduction for every American who pays taxes. Now some critics complain your tax cut is too big, that it costs government too much. Well, this may be a shock to them, but that money isn't the governments to begin with. It belongs to you, the people who earn it, and it's about time you were allowed to keep a bigger share of your own earnings. You know, the plain truth is, our tax cut actually does little more than offset the biggest tax increases in our history, passed by many of these same complainers back in 1977. We didn't get that trillion-dollar debt because you're not taxed enough. We got that debt because government has spent too much. Maybe some of you are older to remember a gentleman named Will Rogers. Will Rogers once said, I see a great deal of talk from Washington about lowering the taxes. I hope they get them lowered down enough so people can afford to pay them. Well, that's what preserving the third year of the tax cut and indexing are all about. Eliminate them, and low and middle income earners lose nearly 40 percent of their entire tax reduction. We can close loopholes, we can broaden the tax base, the tax bill approved by the Senate Finance Committee meets these objectives, and I urge its enactment. It is only by reducing tax rates and slowing price increases that Americans can finally have more money to spend, save, and help the economy grow. Our program is doing that, but it's been in the books less than a year. We must and we will get America moving again, but not by taxing the American people into the poorhouse. We've only begun to wean ourselves from the long misery of overtaxing, overspending, and the great myth that our national nanny always knows best. We should go further in reducing tax rates and making the whole system more fair and simple for everyone, but before we can do that, we must correct and control a budget system that has run amuck. Time and again the good sense of the people is trampled by powerful special interests lobbying to spend and spend and spend. The Congress passed legislation in 78 requiring the budget to be in balance by fiscal year 1981, but just like Rodney Dangerfield, that legislation didn't get no respect. This year the budget resolution was not passed in time to comply with the law. It seems to me that Americans are saying no more ifs, ands, buts, or maybes. We want an amendment to the United States Constitution making balanced budgets the law of this land, and we want it now. Of course we have to recognize all balanced budgets aren't created equal. The crucial question is how do we balance the budget? I don't think you want us to balance the budget by weaseling out of the first decent tax program since John Kennedy's tax cut nearly 20 years ago, nor would you have us do it by compromising defenses and placing our country's security in peril. There is a better way. Balance the budget by bringing to heel a federal establishment which has taken too much power from the states, too much liberty with the Constitution, and too much money from the people. There are now two resolutions pending, one in the House and one in the Senate, which enjoy strong support and which would lead to a constitutional amendment requiring a balanced budget. They would require the Congress to adopt a balanced statement of taxes and spending each year. The growth in tax revenues could not exceed the prior year's growth in national income. This would be a limitation against reaching a balanced budget by simply sending the taxpayers a bill for whatever the deficit might be. The Congress would have to make tough choices to control so-called uncontrollables. And believe me, that's what this skeptical country is waiting to see. The public could see who's hiding behind the rhetoric of balanced budgets at the same time they're unwilling to make the cuts in spending to bring them about. Now this doesn't mean, as some contend, that the Congress would be bound by a fiscal straight jacket never able to plan a deficit. It could do so by going on record with a 60% vote of the full membership of both houses. This would be an important discipline. Once approved by the Congress, the amendment will have to be ratified by three-fourths of the states. It would then take effect for the second fiscal year beginning after its ratification. But ratification itself will produce an immediate impact. From that moment on, the watchword to Washington will be, start shaping up, or you may be shipping out. Now, ratification should not be difficult. Thirty-one states have already undertaken a separate initiative in favor of an amendment. And surveys show four out of five Americans want a constitutional check on readying spending. My mail reflects this strong support. Americans and Democrats alike are ready for a goal-line stand to ask or against big spending, even if that means pruning some popular programs. People understand that making this government live within its means will ultimately do more to bring down interest rates and put our unemployed back to work than anything else we could do. Balancing the federal budget will also bring lasting benefits to state and local governments. Once the federal government can no longer preempt state and local revenues, then those governments closest to the people can better fulfill their mission envisioned by the founding fathers. They can become the true laboratories of democracy in the United States. I'm honored that leaders of the drive for passage of the constitutional amendment in the Congress, Senate Majority Leader Howard Baker, Senators Thurmond Hatch, Helms and DeConcini, Representatives Michael, Conable and Jenkins, together with so many of their colleagues are with us here today. These members of the Congress are supportive of this amendment. They have worked hard to help us get spending under control. Now the Senate is ready to take another step forward and pass this historic amendment. I'm encouraged by the spirit of solidarity of the 65 responsible Democrats in the House and 17 in the Senate who are co-sponsoring this amendment. They know this is no partisan issue. It is the people's crusade. And today we urge the Congress, let their will be carried out. You know, now there are some say that it is dangerous to push for dramatic reform in a period of crisis. Well I believe it's more dangerous not to. We may always have a crisis of one kind or another. We may not always have another opportunity. Others insist that a constitution should not embody economic theory. Well I got news for them. A wise and frugal government which does not take from the mouth of labor the bread it has earned is not economic theory. The integrity to stand for sound money and end to deficit spending and eventual retirement of the national debt is not economic theory. Those principles are the very heart of a tried and proven system. Our system, the system which created the greatest outpouring of wealth in all history and distributed that wealth more widely among the people than anywhere else in the world. It's a pity that some seem to have forgotten that. Then there are elitists who resent Americans like yourselves getting involved in the serious business of changing the constitution. But our constitution was not written to protect the government from its people. It was written to protect the people from their government. I've told on several occasions, you know there are a lot of constitutions in the world, haven't read all of them, read a lot of them. And what is the great difference that makes ours so unique? And most all of those other constitutions says we the government permit the people the following things they can do this or that. Ours says we the people permit the government to do the following things and no others. George Washington told us in his farewell address, the basis of our political system is the right of the people to make and to alter their constitutions of government. It's been said that nothing will ruin a country if the people themselves undertake its safety and nothing can save it if they leave that safety in any hands but their own. Fellow citizens, isn't it time to put the safety of our beloved country back into your hands where it belongs? Isn't it time to mobilize the great American lobby and make government understand its job is to wipe out deficits and not let deficits wipe us out? The price of freedom may be high but never so costly as the loss of freedom. This is our moment to make our stand, to renew our revolution, the real revolution. We are a nation under God. Freedom is not granted to us by government, it is ours by divine right. Our purpose is to provide within a system of laws the ultimate indignity and individual opportunity to every American without exception. Let us accept our responsibilities. Let history record that when America needed us most we didn't cut and run. Leave here today strengthened by renewed faith and determination that we will do whatever it takes to make this government once again the faithful servant of the American people. Thank you very much and God bless you all.