It's about looking ahead to open to the level 0, which is the distribution that's currently in development. The last part of that happened very early in the development process of 10.3, which was released in September. This time it will be released in June, so we are much further ahead in the development process of open to the level 0. Oh, sorry, do we have to stay? Okay, that's fine. The content of my talk will be shortly introducing the solution to those that don't know it, which is basically the same as last year. I will shortly give you the new features and we will give some room for your feedback and discussions on what we improved, because we're still roughly two months before beta 1, so there's still room for your input. Let's start with the solution introduction. What makes a distribution a distribution? The task is probably picking from all these great open source software that is. We have in our factory tree, I just checked roughly 10,000 packages, which is half the answer in our case. We can only put around 800 on the CD, of course one of them is open office, but it's still less than a percentage of packages on the CD. The DVD has roughly 2,000, but it's still quite some that you can put. On build service we have 30,000 packages, so I mean, open source is really huge and if you get a promo DVD outside, you will get only a whole tiny portion of it, but you'll get the portion that most people will connect to open source. Of course, specific developments that we are doing for open source are making up the distribution, like we have Yast, which is still very unique, giving those open source and tiny distributions to use it. We have Circle, which is our software update stack. We have, of course, the developments in the base system. Our distributions name their routing and give them top-level domains. We just do it and are routing faster than them, but we don't have top-level domains for them. And the community itself makes up a distribution. So, we're getting factory trees out there that are tested from the community and we have alphas and laters that are tested and that are contributed to our community. The most important of these is the factory tree, which is our leading edge development. We are sending it out roughly every two days, which is after every rebuild we push out the tree. The goal, the definite goal is that it's stable and actually running this implementation from the factory installation. But, of course, as for almost every open source project, when you get the leading edge, it's always interesting at times. There's a meaning specific to those that are using it and are discussing it, which is also the main development discussion platform. If you want to contribute to OpenSuser and to the next version of it, openSuser Factory and OpenSuser Dark is your goal. What's also very important for OpenSuser is the build service. With 10.3, we integrated the repositories there as integral part of the distribution. So we have a module that lists the popular repositories and you can with one click select latest Firefox, latest OpenOffice, latest Wi-Fi drivers, latest KDE, latest GNOME stable, latest games, I don't know. And they would be even more visible with 11.0 as they are more integrated into the registration workflow then. And we put more and more packages into the build service and maintaining them in the build service and only copying them back to the distribution as before. We very often just copied into the build service and built there even though it wasn't maintaining that. So the top priorities for this year is creating a better infrastructure so that everyone can contribute to OpenSuser and every part of OpenSuser. Right now it's very easy to contribute to the KDE community, to GNOME stable, to computers, etc. But the base system is still set apart from it. I guess not too many people are really interested in hacking our compiler, but it should be possible. And that's basically our top priority goal. And there are several talks about how the service will improve. And what we did over since last Boston is we have the online updates available to testing heroes. So in the past we have the problem that we released online updates that weren't tested well enough because we can't test on all setups and all hardware. So we are releasing them as soon as we build them unless there are security updates under embargo. So if we have a new kernel it fixes some known problem. We put it out there and leave it there the week for heroes to test. And if no one had a problem that we released it to the government public. As Martin just said we have roughly one million installations so one broken kernel update is really a problem. These are basically the new versions that are coming out from OpenSource projects that will be in OpenSource as you know. Most of them are already like kernel 2.6.24, OpenOffice 2.4, SNPTAR, NL, KD4 is also a new kernel. NL32 is beta 2 I think. 5.3 is going to be beta again 2.4 is already in. GCC4.3 is releasing kernel data etc. So the order was wrong for it. So what's beside these new versions that are really in every distribution that is released in June. We will have a damn fast software management and I'm not joking here. If you released every version before it's faster. It's not just faster than the previous one. It's just as fast or faster as competition. We will have KD4. The iPads already use KD4 as default KD desktop. And if everything goes well we will stick with it. We work on Yast's feed in general. We had in August till October the Yast survey where like 3,000 or 8,000 people took part.  Even though the general content for us is Yast's, it makes it easy to keep telling the point of all the research. Thank you for that. Another complaint that we will have live cities is Prime Medium. With the release of 10 of them we had KD live cities. But they weren't good enough to be shipped on a general availability date. So we had to release them a month or six weeks later. And after that it wasn't that interesting anymore. So we have not yet seen big interested live cities. So this time we were really good at Prime Medium. The Alpha2 already is released as live city at the same time as the normal city and DVD. And if still no one cares about live cities, we can talk about it, I don't know. And this basically what makes up most of the rest of the talk is we are working still on simplifying the installation. So, keeping on time. It started already as plans for the last custom or presented as plans for last custom. So the goal then was to have one CD so that you don't have to download five CDs or DVD just to install a basic desktop. So we had a GNOME CD and a KDE CD for both 2032 and 64 bits. And it was English only, but during installation you could register a network if you had a cable and DHCP. And then you could download from our factory between the remaining packages. And it wasn't appreciated as much as we hoped. So we thought that DVD is left aside, that everyone just downloads 600 or 700 megabytes. And then downloads the remaining 300 megabytes of software needs, the basic desktop. But our registration number shows that still DVD is a winner. So I looked basically, or we looked at what the reviewers out there, the journalists, said about the installation. And they were highly confused that the installation is still so complex and offer is so much. And I think that you have download and you can register a network, but not Wi-Fi or not that driver. And it was very confusing to them. And so my idea when I took over the development of 11.0 was to go one step back and think why do we need a CD? And can we make it better? Can we simplify it even more? Or can we do it completely different? And present shortly the installation of 10.3. Because I assume that even those that don't install it every two days. So I will briefly guide you to the old installation. So it starts with taking a language. I hope this... Okay, then you get a media check and you have to read the license. You pick if you want to install or update. You pick the online vehicles I talked about. You pick the time zone. You pick your known desktop XFCE or server. Then you get a proposal which includes the partitioning and the software selection. Then you can change your keyboard to a different language than your user interface language. Then you confirm after that you have to wait by some time. You invest the package I installed. After that you enter the root password. You get your hostname. You have to approve the network config. You test the network config. You download the release note. You create users. Here is a mask missing. Then you see the release notes. Then you approve the hardware configuration. Then you get a congratulation. And then you're done. So we sat together in Prague until 2007. And that's in set. This is just too much.  You can't read this, but it was full of action items and things that the developers just wanted to change. So the action items that went out of the workshop for the team was basically making it faster, making it sexier, making it simpler. Easy like the PDF steps. So something had to be done about our installation. We concentrate on the workflow of the installation and the look and feel. I could have shown you 9-1 screenshots and they would have looked roughly the same. Which is good for consistency reasons, but which is bad for boring reasons. I mean it's like four years and the web doesn't look like four years ago we did. So unlike Google. So we want simple things like put more icons for easier part of what is happening. We want simplified progress bars. No longer, no not so many pop-ups. We want to split better between when you're in-store and when you're administrator in the system. Like do you have to configure a spring type of installation or isn't this an administration task that you're doing when you buy a printer also or after installation is really static. So we try to combine steps of these 20 so you need less clicks for the same result and we try to pin up the installer. There were several more apps and pictures. Pin up my installer was for instance a wicked page where community members collected ideas and mock-ups for the installer. And it was really a nickname for starting, meaning of adjust and throwing everything out of the old style and do our QT style sheets. So this is now the current factory installation. You will see some flaws in the screenshot if you look very closely but it's really work in progress. But you see at the first screen you can take language, you will layout and license and then you get icons in this mode. Then in the screen that is happening between the system analysts you also get icons that show the progress. And then you select your time zone, you can zoom into that map and then you pick your desktop or your installation, the system type. We edit the server selection which gives you just a text prompt without X or you get a movement X where you can only run TWM or I don't know except the EU's data we can discuss this after the talk on Borg-Rom and KDE's previous versions. And then I edit on step which is the partitioning so that you can see during the installation that we will erase the partition and create another one and you can switch, I mean this video button is highlighted, it's just not visible in the scene but you can switch between these video buttons and switch to LVM so you can create volumes or that you create a proposal right in that dialog or you go right into the desktop partitioning mode where you can change mount points or add your slash user from a different partition or whatever you like or you can have a complete workflow where you can do everything. So then that's the scene loop, you create a user account and you have this option to use the password for the loop password because I talk with many people and they all use on their laptop the same password for the loop and the user and it's one click less. So you don't need the route mask after that unless if you unclick this option then of course you'll get a problem for the loop password. So then you get a summary, shouldn't be a need to change anything in here because everything you change or that I think people will change are already asked for and if you accept here you have to approve it once again this dialog is I would claim intently unthemed and if you say it install there you will have to wait a bit and after that you're here. The other steps and these are quite some will be removed and they will not be removed, they will run non interactively. So we will continue detecting your graphic card we will configure it for the default settings we will continue detecting your printer and configure it if we have the right word we will continue detecting your hostname even though it's a random one based on your MAC number There are several steps that we can do non interactively that most of them require network support so the installation will create a desktop that is comparable to a live CD or live CD installation just that you have your own user your own partitioning, your own stockware selection and if you go into your normal desktop online like with network manager configure your wifi and you're online you can be prompted to register the update repositories who have been updated and I talked about registering the community repositories and download additional software like I want tech life, I want latest games so maybe Battle of War Several admin registration tasks are no longer part of the installation then so that includes opening the SSH port configuring remote printers set custom hostname and these are basically those these are the features we are able to use for reducing from 25 dialogues during the installation so I hope and this is basically what I want to discuss in the rest of these minutes still 20 if this is okay with everyone there are suggestions how to solve these problems Is the system that launches the installer the live CD itself or is it still different? Currently with alpha 2 you will have a DVD one CD with only the software for KDE or normal desktop and we have a live CD which has a live installer which will have roughly the same or comparable workflow but no full screen for example but if we stick with the one CD installation or installable CD is not yet clear it will really depend on the feedback we get during the beta phase so the question then is why don't you trust using live CD and the installer there it has already detected the screen and the printers and everything and trust those settings that you already have from the live run the system and use these to configure the system why do you still use two separate installer systems? because we want to have a DVD use the same live system for the DVD plus some additional packages the live system has a very big disadvantage it means quite some memory and the installed from the live system is much faster but this is something that we want to change as well because we want for the CDs or perhaps also for the DVDs we want to install the base system from an image and then only install a language specific thing by RPM so the difference will be quite low and I guess for 11.0 we will offer both at least this is my current strategy and then see for the future what has been used really ok I have two questions first one is how do I set up the boot loader if I choose not to get a boot loader or if I want to be sure that my windows is still on the hard drive so basically you have to scroll and after in there somewhere is the boot loader configuration you will create and in there you can configure all these links are created in dialogs where you can change I mean you can change the processor and you can change the vision in here and further below is the boot loader configuration pretty much hidden pretty much hidden but the boot loader is really not what you should change but wouldn't it be better if people see visually that their windows is still on their hard drive yeah that is independent of the boot loader yeah but just to get the feedback I think we have contact with people who write us mails and who always tell us I don't know I'm not sure if my windows is right in the way from my hard drive actually this is a very big problem we face with these device names the expert wants to see what device name he has but the average user only knows the C or D but there is no good solution that we came up with so if there is a question for that the boot loader will basically only list we would be able to boot windows at least we would try to and the second question is what happens when I click on a media player and I don't have a vision codec he said can I include a payment repository whatever, automatically by clicking one button I talked about you are doing online update and after that we will give you the list of community repositories which consist of built-in repositories and a catalog that we put from openlosercommunity.org and they kindly include Pacman in there so you can register Pacman with a click so it's automatically possible by configuration process I wouldn't call it automatic but it's just one click so we wouldn't I'm not sure if our legal department would be too fond if we could install it automatically No, I'm not talking about installing it but the user can't choose it because that's the possibility to do it I love doing installation but after in the desktop let me do it from the inside I see quite a lot of space on the right side of the screen so why do I have to scroll down for the rest of the list why not it should fit all two columns yeah, why not two columns and have one over here at once that much space for me oops, sorry now it looks like there how much is there below it do we see most of it now? 60 percent 50 percent in a second time what you see here is system where there is no information with it yet with partitioning you see some information and with software okay, but with software you see a lot which most people probably do not either know what it is or if they want to know it they can click on it so if you take these details if you take them out in just a small explanation it is not on one screen already actually the idea we discussed was to have the flag these are our patterns we discussed to have a flag in them if they are important or if they are just there because for example we have X-window system which is required by KDE there is no way that you can have KDE without X-window system the same probase system so it could be that we only list here the top patterns and then we list the users and to answer your point this is 800, 600 unless you install on XE you will have more space and then you will see more information on that so I think the partitioning is really the most important because this is the only thing where you can destroy something in trying on this user so this will stay for and only the processor which is not too easy to configure and for example put the system much lower because most people know what is this forget about it this is just part of the idea of making this software text expandable so it is not shown in first place but in input text and a tree like system actually if you click on software you get a full dialog where you can read a description of every pattern I wouldn't put too much I would be like remove things from here that are important or leave it as this but I think we will remove some don't or some want to be sure that they have some don't and most of them are just to group software and I think we will some weeks ago we had several icons and just one detailed plane which could be useful so we have an icon for partitioning the software and if you hover it then you see the details which you see right now I don't know this is actually you can see it right I don't this is progress I think what you describe this is a progress which you have to ask which has a list and an icon associated with it can you proceed a step as well from this installation on the tree where you can choose which are you interested in and then proceed a detail I don't the European idea even though I don't understand correctly what you are describing but the challenge is that there are several you mean with the installation where you have the slideshow basically a menu concept where you open and then you see software and that puts down on the first step you have the slideshow with presentation of open Susan on the second you have the installation about what is being installed on the third I think you have the tree tabs I think the third is the not sure so you could add a tab there and give the information about the system there I am just showing what we are referring to the interface improved a lot by the way the interface it has hotkeys now but where it starts there was another question that I had to I was going to suggest where the patterns are listed as well as maybe having two or three columns for those you could have a checkbox beside each if you want to change it at that point you don't have to click on the higher and going to the more detailed screen you just quickly remove the tab you just like taking the checkbox do you think it is coming coming thing to do to remove the panels so let me ask this what is the thing that you are not clicking before in the installation if I go to the back to the entry installation so I don't care here who many so I think that the decision that I want is to consider that is all I want to configure I don't even want to see the patterns that is what I am up to but I would like to have a broader than one so who does media check I would even have that is what I am up to and it was very hard to find out who actually wanted to have this in the installation work room so who does not approve the license so ok this is new installation you have to go you did that is awesome but here I don't care either question about repositories other distributions other distributions use an approach where they define online repositories at the very beginning of the installation process and they install software from online repositories during the main package installation you can just down on the mini you can just go to the megabyte and install it you can't add pacman at that point because that has been deferred yes so my question is what was the decision why not to do it that way with the online selection of the front and then one installation to split it the reason was that we want to make it very easy for people to register such such repositories but at the same time we don't want to risk that people are installing something that they don't even know they changed because you click on yeah I want pacman and then you report the problem and you said no I didn't change amorok and that's why we wanted to make this a complete specific action to change amorok to the pacman version so that's political or just the decision for supportability specific observation I said that twice already so it does not change the default so this is really interesting the default is overview you don't have a system before someone mentions it who for example changes the keyboard layout to not have the default associated to the language but do you need one more to select it if you have german and it would make german the keyboard layout but many often as far as some german hands here want to see english on screen instead of the german keyboard the other way around the other way around when I thought in your news install you selected both anyways yes but first it's language and if you change language to german it will change the keyboard as well but you should be able to change it there no it will be there as a summary but it won't be there to change it so who changed the partitioning in here that's the reason why we added it no discussion needed anymore so who is going into the software selection at this point and now the question is for what reasons because I want to add several programs and I want to remove several programs for example I use windowmaker not KDE or GNOME so you install windowmaker I don't want to have up armor so I de-install that and some other things I want my specific way and get it over with one simple and get it over with one simple no no no but you could just install so the goal for you to know is to have the base system which base I mean basic desktop has one image in a very short time because it's not no longer running any config and not opening the update database all the time and then you can after the installation remove up armor or install I mean installation means that I can start with a system and not start configuring that's what I had to do with during the installation what's the difference between doing it during installation after the same amount of time yes it's my turn when I see the screen coming up I want it to be running already but the number of users who have actually tweaked the software in small is probably much smaller and the number of users we want to reach will get very confused but I'll just put it there so it wouldn't be better to have if you're going to spend the same amount of time to do it after the install rather than before so people who are not power users like yourself do so they just basically do it and they have a working desktop I don't want to force them of course to do it but I want to have the option myself to do it why shouldn't I be doing it at that moment the standard user, the non-power user doesn't bother with it before or after either way I wouldn't be sure about that I mean the basic desktop is really a basic desktop and I mean the average open user user does care even my wife says Carla is not installed the first thing is installing and those should fix that it's not knowing but what I want to ask you even though if there isn't one there to change other than the five option I just did for desktop or system would it be a huge problem or just a minor annoyance for you I would start wondering why I should install things that I don't want no, there's one option minimal x which would be for you because you want minimal x plus window maker minus up and more so yes you would have to install up and more to remove it afterwards yes and I would wonder why should I install things because the installation would be fastest fastest fast and I personally think that's not for me this is more important than the speak okay but still big problem or minor annoyance it's a big annoyance sorry will there be a detail installation option for people who love 20 clicks Sunday afternoon not impossible they can create an auto just profile with their favorite XML editor and then run that's for the profis then sounds like the man behind me here wants a choice really early on do I want a basic installation or an expert installation the only option that I removed are those that I listed OpenSSH configured in details of X etc I won't and I hope most agree won't add in I'm an expert here because there's never someone not going to click it we are always installed outside just is the XML file still compatible with 11.0 or do I have to re-edit all my XML files because from 10.2 to 10.3 with the introduction of threads it was a major effort re-editing all the XML files with the introduction of threads during the installation because in 10.0 we didn't have threads we had selections yes we changed it once with 10.1 and we are still using that one and the developers are really fond of testing actually so it should unless if not we will most likely provide a tool to change that for patterns and selections there were not too much but slightly different so it wasn't that much and it wasn't on our agenda that high but we just became much more popular and we are already now with the version of 3.5.9 3.5.9 for sure and what about KD 4.1 4.0 point something you don't know yet sorry we ran 15.12 about it at 9.30 and tomorrow morning bring your coffee ok thank you everyone for the discussion


It's been a long long day. I got a lot to say. It feels like I'm carrying a two-ton weight. I go to see a friend. Hello, I'm Monsignor Patrick Winslow. And I am Father Matthew Cowd. And we are speaking from the Rooftop. A podcast brought to you by Tan Books, in which we invite you to join our conversation out here in the open air. Where we look out upon the world around us from the rooftop of the church and share with you what we see. Well, happy new year, Father Cowd. And to you, welcome back. It's good to be back. Well, good. Hopefully it's going well. I need to apologize if you hear something dripping in the background. I don't know how sensitive the sound is, but we do have a small leak in the building. Yeah, a gray matter coming out of his ears. Yeah, clearly that's what's happening. It's all falling out. Underused, I think. Yeah, I think so. I think so. You had extra, right? Oh, extra. That sounds like something my dad would say. He had extra. Oh, Lord have mercy. Speaking of which, I saw your father, as you know, at the March for Life in the middle of this larger gathering. And I said, you've made quite a few appearances, at least verbally, on the from the rooftop. And he was very pleased with that and still thought it wasn't quite enough. Of course. But true to forum, he, in the middle of a thousand people walking around and everything else, he decided to show me some things from his computer on the relative sort of physics and what have you of climate change and whatever else. Oh, don't get him going. Proved to me the reality of some of the unfounded biases of other persons. One of the funny stories. He has strong opinions on that, you know, relative to the scientific data on the debates pertaining to climate change. And, you know, he's got some interesting data on the matter. But one time he was going to get done. Tell you this already. He was going to get donuts. We're on vacation. And he went out just to get some donuts for the family. My father is inclined to engage everyone who's near him. Yeah. So having conversations with my father means standing next to him. And then after that, good luck. So this woman who was waiting on him, she was working there at the store, started, my father mentioned something about the weather. And then she started alluding to the fact that the weather that it was so temperate in August was related to climate change in a very severe kind of way and how dour and sad all that was. And my father just made a very quick comment. So you don't need to really worry about that. And just as a way of saying it's not as bad as you think. And she responded by saying, no, you know, this really is. And in fact, she asserted her credentials. Really, she says, you know, I'm a scientist. And my dad's really in what field? She said, I'm a physical therapist. And my dad said, well, I'm a scientist too. And she said, really? He said, yes, I have a PhD in analytical, physical, analytical chemistry. She walked away. Did he get his doughnuts? He got his doughnuts. But listen, there are many reasons to walk away from your dad. But that's not necessarily one of them. No, I really actually appreciate it. It was always good to see him. So he was really funny. He's done his credentials after her after hers apparently either she didn't believe him or she thought maybe he was lying. Either way, I think she was probably well founded based upon her interaction. I would believe him just because I probably never would have heard of physical analytical chemistry had it not been for someone saying it to me. Not a field that I would ever even approach. Well, that said, now that we've given him more time than his warranted. Some day we'll actually have him on the show. He's interesting in the manner of the practice of faith and all the good things that he does in terms of Bible studies and prison ministry and things of that nature. So he's as much as he is a fun target. He is actually worth having on the show to talk about some of those things. I remember working in a prison and for just one year at a maximum security facility where I was a part-time chaplain, I brought you in one time. I was there. I remember that. And I remember at the time thinking in really with a matter of first month or two that this was intellectually draining. These guys had nothing but time to read and they read. I gave a guy a catechism within two days. He handed it back. They would ask questions about St. Thomas. And I remember thinking in contrast to my parochial experience, these were much more difficult, challenging questions that I was getting at a parish level. But it was quite interesting to experience that contrast. In so many ways, there are men ripe for conversation about serious matters. And I think so often in a parish level, we're always trying to shake people up to think about the serious things. I mean, the one benefit they have, and it's hard to talk about having benefits in prison, but the big questions are looming large. Can't really avoid them. Yeah, but we can walk around like the living dead, never really engaging the more serious matters. And I think people do that a lot. Yes, absolutely. I remember my experience going in there with you and it was a chiaroscuro sort of a thing, right? I mean that sort of light and darkness because there was a lot of darkness. So people obviously choosing when they're in, when they're faced with those big questions, which route they're going to go. And some went simply into the darkness. And so walking through those halls, those cells, and seeing the imagery they have on the walls or the kind of characters that are staring at you. And at the same time, experiencing the men that would come to mass or to the Bible studies or to the various things that you did, or having personal conversations with them, they have to live on the one hand in that darkness. But they're constantly being sort of infusing their minds with real light. And I just remember thinking to myself that it's such a wonderful ministry for priests, for laymen, for deacons, etc. because it's an easy place to bring light into because they're hungry. Those who are answering the question in the right way, exceptionally hungry, whereas you say sometimes we're in a position in parishes where I have to convince someone that they're actually starving. Right. Yeah. Or you're trying to get an audience to come and hear me talk about this or present the church on this. And meanwhile, they are quite literally a captive audience. Well, maybe you're, maybe you're trying for it. Oh, yeah. No, no, no. People are duped by your persona. They come and listen. Waiting, waiting in line outside for wisdom that falls. Clearly, clearly. Meanwhile, your seminarians are running away from every break. And every break and weekend that they get off. Speaking of breaks, they're back. Everyone's back in action. We got a couple weeks under our belt of the new semester. And it's always an easier semester than the first one simply because the first one, you have a new class. And when you're small seminary, the new class makes up a significant portion of your men. And so they're finding their way and learning how to be in the seminary and articulate and gesticulate in that sort of new arena. And by the second semester, they come and walking as if because they're coming back to something. And they have that sort of habituation. And it got me thinking about, you know, the nature in general of habits and how much we ultimately rely upon them for almost everything that we do in life. And sometimes the word, you know, habit is synonymous with the word that we use for virtue. Some people have a difficulty with that. The Latin word is habitus and say, but habits are not, they're not these sort of rote things that we do that are mechanical. But on the other hand, the habit is a very analogical word in the sense that it's elastic. You can use it for a lot of things. So you and I have various habits that we engage in that are sort of underneath the ground of our consciousness that we rely upon something as simple as driving a car. If I had to think about driving a car all this all the time, I think we were talking once about driving a bicycle in reverse. Oh, right. Yeah. And that's the logical pathways, the neurological pathways. We need lots of those habits that we build in that are sort of subterranean that shape us. And then there's that the help us get through life. And there are other ones that we are very volitional about and that create the perfections of our various capacities, our powers, and make us ultimately creative and facilitate a kind of joy in our activity if their virtues. But it brought it home to me because the men just got their cassocks, which we call a habit. In religious life, we call them habits, which is sort of interesting because it makes sense that we do that because it's a way of comporting yourself. It's like a way of being part of something that it funnels your action through in a certain way. So it's kind of been a joy to watch them come back as it is every year. And then they have a certain kind of ownership about the place it didn't have before. So the second semester is always easier because I don't have to do nearly as much relative to what they're doing. Because they're habituated. They're habituated. Yeah, the plan is that that practical habit produces and cultivates or just doesn't produce, but cultivates the actual virtue or muscle that you're trying to cultivate. Yeah, and it doesn't mean that we don't have to always go back to those things and be intentional. This means that when we're in them, because we know how to do them, then we can be free and creative and enjoy them. I was thinking simply this morning about the fact that you and I went through seminary and part of seminary life is you're saying morning prayer in common. It's a simple thing. Now, you may not like the way they do morning prayer. You may love the way they do morning prayer. But at the end of the day, after eight years of seminary, you're probably not going to miss morning prayer anymore.  You can't imagine getting to noon or evening tide and not having done. Although we do have some friends. No problem doing it. But we will leave his name. We have some very creative friends that sometimes they will wait till the end of the day and they'll do all the prayers for that day and it's midnight and they'll begin the prayers for the next day. There is a long tradition of that being done. That's a long tradition of that being done. A blessing the hour is in advance or even afterward. That's right. Yeah, in canonically it was acceptable. Yes. Especially living the life of a diocesan priest. We don't have the routine of a religious where you have to sort of chaff all these different times throughout the day and it's just sort of built in. So you can see why parish priests would go that route. That said, I'm sure there are other reasons beside some practical reasons maybe. I don't know about you but for me, I have a very large section of time in the morning when my mind is most fertile for prayer and thought. The difficulty with that of course is that if I've got a couple hours of time in the morning which I carve out for prayer, which is kind of the staple, two or three hours, then the temptation sometimes is then to go get your work done after that. And it doesn't imbue the rest of your day. I think some people may not understand the context in what you're speaking because it might be worth noting that when priests are ordained. It might even be a felicitous for them to know that that's what we call the day, the work of God, that we actually are charged and promised to pray these hours every day for the faithful. So people think of poverty, chastity and obedience and those are the evangelical, meaning gospel councils or gospel directives for those who wish to follow in the pattern of our Lord who lived a life of poverty, chastity and obedience to his father. Those are religious communities who live those consecrated vows. Diocesan priests do not take these vows, rather we make promises. We make promises of obedience, of celibacy, that is to be committed to chaste single life and then also to pray for the faith, to pray for the people, a promise of prayer. And that prayer takes the form of the liturgy, the hours in particular. Obviously there's a liturgical prayer of the celebration of the mass and the other sacraments, but then in addition to that is the divine office, which is the prayer of the church, which most people are unfamiliar with, but you have the office of readings, you have the morning prayer, the afternoon prayer, the day, the daytime prayer, the evening prayer, night prayer, and there are the old Latin terms, which I'm sure they roll right off your tongue if you want to relate them as a lords man. Matins, lords, prime in the old bribery, which was kind of a neat little hour that never changed, it was exactly the same. And then tersex non, which were the different hours of the day. In the day. So nine, noon and three. They call it now mid-morning, midday, mid-afternoon. Exactly. But we're just obliged to do one of those three. That's correct. Right. And then. Evening prayer, night prayer. Vespers. And compland. And compland isn't sort of completed. I haven't been finished. And the church has always been very merciful and compland. It's a very short prayer because usually you're ready for to follow. You're trying to remain awake while you offer it. But it's one of those things that we would recommend to you because even though the priests are obliged to say it, and I think most of us do so as a real anchor for us and our spiritual life to turn our minds back to God during the day, even if you have a substantial moment of time in the beginning of the day or the end of the day, those kinds of things just sort of take your chin as it were and a finger on your chin and move it back in the direction of the Lord to refocus your attention and why you're doing what you're doing. So it certainly would be something that we would recommend for all the faithful. If you're looking to develop a new kind of activity and repeated actions will eventually develop a habitous habit, a virtuous activity that you'll begin to enjoy, I would recommend that you begin by starting with looking at the literature of the hours, maybe take one or two hours a day. There are apps available. There are. Yeah, iBrievery is one, Universities is another. There are others out there. Also, there are some that are red allowed. So people commuting on the way to work. Are you confessing here is that what you're doing? I'm not confessing. I'm just simply saying, but there are different ways that people can participate in the literature of the hours. You know, it's an interesting way to pray because you may not feel what the Psalms are saying. You may be joyful, but the Psalms are maybe talking about despair. But somebody in the church is feeling despair. Yeah, so how many you know is most likely, you know, and so you the whole church is praying that psalm or that canticle, but these scriptural texts and these prayers. And because the whole church is doing it, there is a need for them, the world over. And so we're participating in one voice as part of the body of Christ on earth in with his voice, articulating these Psalms, that he himself would have prayed with his own lips and did so as recorded in the Gospels. So there's something mystically corporally beautiful about that universal practice kind of coming together with a single voice with a single articulation. The body of Christ is articulating in a common way every day, regardless of the particular member articulating them. And that's important to understand. I, you know, when I read the Psalms, I mean, obviously one of the greatest challenge with prayer in general is distraction of mind. Extremely difficult to remain focused. It takes a certain discipline. You could say happy to helps cultivate it. But I find myself increasingly listening to the Psalms from an earthly perspective, thinking of the human voice that would utter these words.  And I try to imagine, you know, the circumstances, the world from which this person was speaking and relate to it. And they're just remarkably earthly, you know, the utterances and the feelings, the agonies, the joys, and they're very tethered to the ground, which is interesting when you consider that these are the prayers that we come together and pray. Absolutely. And as you said previously to recognize the fact that even though we say that the Psalms are the portrait of Christ, according to Thomas, right, that sort of the Christ as it were being manifested by them in all the various vicissitudes of his life, even him quoting the Psalm on the cross, right? My God, my God, why have you forsaken me? The Psalms were ever on his lips as a manifestation of himself, but himself as a man too, himself raising up as one of us, all of us into this, into both praise of God, but also admission of pain, of agony, of need for vindication, salvation, hope, etc. The cries of the human condition that were taken up into him. And then to realize even that not only for thousands of years, but for thousands of years since Christ, we have a couple thousand years now, that every one of the church has been still singing those Psalms. So every epoch of the church, anyone who has been a priest or religious, but even more than that, certainly the faithful relative to the scriptures that are read at Holy Mass, they're imbued with the Psalms. And that means that everyone has had the same prayer book for thousands of years. And it's been on the lips of every saint that you've ever read about, every pope that's ever governed to the church. That's a wonderful thing to think that I'm going to add my voice to that. And one of the things I think people love about Gregorian chant as the primary song of the church, the voice of man being the primary instrument, is that its modes capture all of those different movements of what the Psalms are relating. And there's something about it that just sort of orders you and settles you. It's not the rhythm of a three, four time. It's not a beat the way modern music is. It's got that arses and thesis, which is that way of, if you imagine a kind of a swirl up and a swirl down, it kind of puts you in that wave of praise, of prayer. And so when you hear it, you kind of float along on the whole thing. And we're also floating along all the way through history with all these various persons. And maybe I'm getting too many metaphors and it's getting too poetic at this point. I think people are used to that with you. So one of the lessons I think people can draw from, I think some of our reflections is that the habit of prayer that we manifest in the form of an obligation to pray the divine office. So whether it is the divine of office or it's the rosary and other things. But that the habit of tethering back time and time and time again more than just once a day is something of great value. And I think of it just in terms of a needle and thread.  It becomes weak. But to be able to tack back with shorter intervals has a tighter fit to marrying, if you will, a prayer life to the fabric of your life. It's just a way to think of it because if it's too far, the intervals are too far apart, and don't tack back sooner rather than later, well then they can become shall we say less strong, weaker in enduring the vicissitudes of life. But if you, and I'm not saying that every minute of the day, you know, to offer a prayer, but I'm just saying that I think that the divine office does a good job. It has, it doesn't let the morning pass, the afternoon pass, the evening pass, the night pass. It's a constant tacking back. Yeah, and if you've always, if you're always feeling that chord on some level, if you're not doing vocal prayer or meditation or contemplation, if you're always feeling that chord, then you're beginning to achieve that imperative of the scriptures, which is to pray without ceasing. Right. But it's not the same kind of prayer as saying in our father, it is praying without ceasing, and maybe you're learning something from your latest hobbies. Contemplate the current of the soul. Your hobbies. Oh, my hobbies, yes. In terms of the stitches. Stitches, yeah. But that said though, I mean, you're right. I mean, cultivating that current of the soul, even if the conscious mind is engaged with all the many things that we have to be engaged in. People have to take care of the kids, they have to do this, they have to do that, they go to work, and you know, even things that we do oftentimes, which are just as temporally minded as your average person in managing bills and finances and meals and things like that, you're still going to have that current, like these tacking back to current, we're mixing a lot of metaphors, but it does create a current of the soul, as you say, praying without ceasing. Well, speaking of currents before we go, we were at the March for Life, and the showing was really quite extraordinary. Really awesome. I was, one didn't know if people were going to come after the end of Roe v. Wade, and yet they did, and they came en masse, and it was a joy-filled event, but maybe think about this when you mention the word current, because there was, if you recall, we were at sort of the head of the march as it was coming down, we were going to jump into that current. But as it was getting closer to us, we noticed there was an individual who was very sadly deranged, and the things he was saying were black and vile and horrible, I won't repeat them on the radio. But I was just praying my rosary waiting for the march to get to where I was, so I could jump in that current.  So many kids. You know, 13, 14, 15, 16-year-olds that were just marching. And I was kind of looking in a defensive posture to see what was going to happen, because you always think to yourself, I have to defend someone on some level, because they're just kids. And instead, what happened is this guy was going back and forth that astounded me as these kids got louder and louder with their song, as he was shouting obscenities through that megaphone.  I mean, they completely consumed him. They didn't touch him. They didn't hit him. They didn't do anything. But this crowd, this avalanche of persons just sort of crashed upon him. But the sound was joyful. That's nice. And in terms of, they just were loving God. There's a joy drowning out. Yeah. And I couldn't hear him anymore. I don't even know what happened to him. I couldn't see him anymore. Maybe he just went home. But I thought to myself, what a beautiful image for the way in which we actually conquer. I don't go on the absolute, this is not my enemy. This is not my enemy. I'm just going to absorb him right here. We'll push back against the darkness, but we don't attack the person and that the light of the gospel overcomes it. It's really a beautiful and apt image. Well, just before we go, I just always say, as you know, I quoted Ruth Bader Ginsburg and as my sister mentioned, we were on our edge of our seat thinking, where is this headed? It was a quote that she has used where she was quoting an abolitionist and a woman's rights activist in the early 1800s who said, we don't ask any favor from our fellow, from our brothers, only that they take their feet off our necks. And I couldn't get that thought out of my mind. It's a beautiful quote. And I applied it to the pro-life movement. For years, the Roe v. Wade decision has been the court's foot on the neck of the pro-life movement that hasn't been able to affect any substantial change in our legal system for protection of the rights of the unborn because it wouldn't allow it. It kept its foot on our necks. And so by overturning Roe v. Wade, you see how the foot has been taken off the neck of the pro-life movement. And now we can really begin to work and actually affect change. But until then, until or unless that happened, we couldn't. Hard to speak when someone's foot's in your neck. Oh, well, that's right. And we weren't asking for any favor, right? I mean, so I thought that the words were appropriate. It's sad that Ruth Bader Ginsburg couldn't see it apply to the pro-life cause, as she saw applied to another equal rights cause. But it is equally applicable for a category of people that have been subjugated and whose rights were not being respected. And the people, the children in the womb are not asking for any favor. Just take the foot off our necks and allow the people that are speaking on our behalf, advocates of the pro-life movement, take the feet off their necks too, so that we can affect some real change. So I thought it was a really... No, it's beautiful. Just a really apt social justice point to be made that was applicable to the women's suffrage movement, as Ruth Bader Ginsburg had mentioned, but it's equally applicable to the pro-life movement. And so those were some of my thoughts coming out of the march this year.  Thanks for listening to this episode of From the Rooftop. For updates about new episodes, special guests, and exclusive deals for From the Rooftop listeners, sign up at rooftoppodcast.com. And remember, for more great ways to deepen your faith, check out all the spiritual resources available at 10books.com. And we'll see you again next time, From the Rooftop.


Good morning everyone. Thanks for having me back here at Bangalore. Great to speak to you guys. I'm going to tell you today about parametricity, how we use types as documentation of code. So this apparently is a bit of a contentious topic. I don't understand why. I'm going to teach you why it's just obviously true. So here we go. I look after a team in the state of Queensland, Australia. Queensland Funker Programming Lab is my team. We generally write Haskell more than anything, but we don't necessarily write Haskell. We work on a lot of open source projects. We work on a banking project at the moment in Haskell. And, yeah, it's sponsored by the state Queensland government and CSIRO from a research organisation. So first of all, why does parametricity work? One of these is you must first commit to functional programming. Here we are at a functional programming conference, but I'm just going to remind ourselves what it actually means. So here is a program written in some programming language and it doesn't matter. And we notice in this program that there are two sub-expressions that are equal. That is, these two expressions. You can't quite see the highlighting there, these two here. And we say, let's factor out that expression to a value and assign it to the value and then substitute the expression with the value. And in doing so, we ask, did the program just change? So who thinks the program just changed? Okay, I left a delay there because some people do think it just... So the program did change and it changed because of this thing here, this side effect here. The counter now gets only incremented once. Here's another program and again it's got two sub-expressions that are equal. And what we're going to do is we're going to factor them out and assign them to a value. Did the program just change? Who says yes this time? There are zero hands and that's correct. This program is the same program. The reason this is the same program is because PIVL is a function. It's a function. So functional programming is the act of writing only functions where we can substitute expressions with values without changing the program. That's the definition of functional programming. So you must commit to that before parametricity works. Okay, so... Or another way some people say it is, for given inputs, the outputs are the same and nothing else happens. And that's an important thing, nothing else happens. So inputs come in, inputs out and nothing else. We call this property of expressions when we can substitute them with a value without changing the program. We call that referential transparency. I heard Michael mention it in the keynote. If you heard that word, that's what he meant. You can substitute expressions with values and a referentially transparent expression with a value and the program will remain unchanged. So the definition is very simple. But there's some consequences. One of them is that, for example, you can't do i++ anymore. You can't do loops anymore. And, you know, where I work, I just take everyone's loops away, take all their tools away, and say, there you go, fix. And now I have to substitute new tools. One of those tools is parametricity. And in my opinion is one of the most important things, one of the most practical and useful consequences once you've committed to functional programming. By the way, who was at the workshop yesterday? Just as a... Okay, I don't know if you noticed, but we were using parametricity yesterday. So yesterday I was asking people to write functions of Brian and Mark and I of a specific type and the type guided you to the answer. So I'm going to be a bit more concrete about telling you how types can get you to answers. So types can tell us about what's called inhabitants and inhabitants of a type are values of that type. Like, for example, Boolean has two inhabitants that are true and false. These are the inhabitants of Boole, for example. So I'm going to do a little bit of algebra and I hope that's okay. So who's heard of some types? All right, where we have like an A or a B. We have a sun type and this corresponds to addition. It's the same as A plus B when we count the inhabitants. Or we can have A and a B. We have a product type, I think most people have heard of those. We are doing multiplication. The inhabitants are A multiplied by B. And who's here written a function? Everyone. You've taken an A and you've returned a B. That is the same thing as B to the power of A. That's the number of inhabitants of that function. All right, so for example, if I said to you, write me a function that takes a Boole and returns a Boole. Well, Boole is two. There's only four possible inhabitants that you could write. They are return the argument, negate the argument, return true always and return false always. There's nothing else you can do. That's two to the power of two. Boole to the power of Boole. The unit is one. It's just the starting point in it in the algebra. And boy, that is a data type that has no inhabitants is zero. So let's look at Boole. It's a true or it's a false. It's the same thing as carrying units in the constructor because unit means it just has one inhabitant. It just carries one value in that constructor. This is the same thing as saying one plus one. It's two. Boole is two. Unit plus unit. It's a sum type we said or. How about maybe? The maybe data type is a unit plus a. Nothing carries unit and just carries a. So it carries one plus a inhabitants. If I said a with Boole, which is two, maybe Boole, it's three values of type maybe Boole. One plus two. Here's just another simple one. Either void or a. It is again addition. It's one of those two things. The left carries zero and the right carries an a. Zero plus a is a. If I ask you to construct a value that's an either void a, that's the same thing as saying construct a value that is an a. You can't call the constructor with void because there's no inhabitants of void. And if you do zero times a, this is a void and an a, then you have zero. You're just never going to give me one of these things. Give me a void and an a. First you need to give me a void, which you can't. It's zero times a. I think this is just an interesting way to sort of concrete the algebra. So if I said to you two times two and two plus two and two to the power of two, they're all four. All of these types are isomorphic. All right, so if I said to you give me a value of the type either Boole, Boole, you'll give me one of four values. You'll give me a left true, left false, right true, right false. They're all four. So I can count the inhabitants just by doing some algebra. As I just said. So I've just made a little something a little bit more complicated just to kind of really concrete it in. If I said to you give me a value of the type maybe of a function Boole to maybe Boole, I have just asked you to give me one plus. So one plus, one plus two to the power of two, possible inhabitants which is nine. And you're welcome to calculate them all out. There'll be nine of them and there's nothing else you can do. And an even more complicated one. If I really had to give you something of that type, I'd calculate it and say well I have to give you one of 40 values. All right, so the algebra can tell, I mean that's a very silly thing for me to ask you to do, but it's quite a nasty data type actually, isn't it? But I can count it and I can say it's one of 40 values. So what about a list of A? Algebraically, what is this thing? Well we know that an A is either a nil or it's a cons carrying a head and a tail, an A and another list. Or another way of saying it is I have zero A's, I have zero A's, or I have one A or I have two A's and so on. That's what a list of A's is. I can simplify that to be one plus A times the list of A. And if you carry that further, you'll find it's actually, this is from memory now, it's one over one minus A. Isn't that interesting? I said give me a list of A. I've just said to you calculate one over one minus A in algebra. I've asked you to do an algebraic equation. I happen to think this is really interesting, but it's not what the subject of the talk is about, but you can actually differentiate these functions. So take one plus A, that's a maybe, which the differentiation is one, with respect to A if I remember rightly. That means unit is differentiates maybe. But yeah, that's another talk for another day. It's really interesting, or maybe out in the hall perhaps. Okay, so parametricity. Why is it so important? What even is it? So this is the abstract from the paper. The paper is called Theorem for Free by Phil Wadler. And basically, Phil says, write down the definition of a polymorphic function, and by polymorphic that's when we're using like the A's and D's and so on. And tell me it's tight, but don't let me see the definition. Just tell me the type. And I will tell you a theorem that function satisfies by the type. And the paper goes on to explain how you can do that trick. So what my goal today is to try and give you an intuition to do this trick, just to prepare you to read that paper and then carry forward and actually execute it in your work, because I do it all the time. So I've got a contrived example here based on algebra. If I said to you write me a function, take an int, return an int. Well, I've just asked you to write me one of that many possible implementations, right? Int to the power of int. That's a lot. That's a large number. I have no idea what you're going to do, pretty much. But it's smaller than infinity. But you're not going to return the string ABC. It won't touch it. But we don't know anything more about the type other than it's going to be one of that many implementations. There's no information that's conveyed anymore. So this often happens. At least when I've worked on this kind of code, someone will go, oh, I'm going to look at the identifier name. Now I know what it does. And we write some tests. I definitely know what it does. No, you don't. And then that code. It's contrived, of course. But this passes all the tests. All right? I mean, of course, it's obvious that this is broken code. But there are more subtle examples out there. I want something more reliable than giving me, you know, test 10 elements out of the possible 2 to the power of 32 to the power of 2 to the power of 32. That's very small. I want to give a wider coverage with less effort. So the reasoning is difficult, or the effort is difficult, because the types are monomorphic. That is to say, they're not a's and b's. They're ints. They're concrete types. And I want to address a concern that I often hear, sometimes people say to me, when you write those types that are all very polymorphic, they're hard to read. And I want to address this by saying, quite the contrary, they're easier to read, because now I know what the function does. Okay? So I want to give you the skill, at least give you an intuition for being able to calculate that. And therefore agree with me that it's actually easier to read when you be polymorphic. So here's another one, just another example. Take a list event, return a list event. What does it do? I don't know. Does it do that? What about that? I don't know. But here is an important one. I've written it in Java notation. Yesterday I said, who's written Java? And almost everyone put their hand up, so I assume that's still true. And you can read that code there. I've written Java by... In fact, we went out for dinner last night, and it was revealed that I have a Java certification. All right? Someone dod me in. I actually have three. I was with one of my colleagues, and we were talking about Java, and having some fun. And someone goes, oh, Tony's got a Java certification. It's like, oh, man, just drink beer and look away. So looking at this type, I'm going to make the claim that every element in the return list appears in the input list. All right? It must. All right? Just by intuition, it must. Now, you might say, aha, I can think of counter-examples like null. I can put null in the list, and so on. And I'm deliberately discarding those. So all the a's in that list appeared in the input. And the reason is, I can't just construct a's out of nowhere. It's not true in C sharp. Who writes C sharp? So for C sharp, it has another sort of cheat code, which is you just call default, and make an a out of nowhere. And as far as my world exists, it is that doesn't exist. So I will explain why, but they don't exist. But importantly, I'll look at this code, and I could have written this code, say, yesterday when I was feeling a bit tired and I wrote this code, and I came in today and I looked at it and I said, I don't know what I did, but every element in the result appears in the input. I know that immediately from the type. And let's commit to this statement. Is does anyone sort of not quite feel that that's true? And that's okay. And if so, okay. Is that a question? If I replace a with int, yep, so if I replaced a with int, then my claim falls flat. So that's true. So what I'm saying is because I'm using a polymorphic a, now my claim is true. Okay, so you're right that if it was int, I could just put 99 in there. Yep. Yep. Yep. Okay, so if I call not on the elements in that list, it will not compile, because they're a's. They're polymorphic a's, and if I call negate, the compiler's going to say you can't negate an a. If they were bools, then it would be true, but I cannot just negate an a. The only thing I can do with those a's is shove them in the return list. Does that make sense? All right. I now believe I have your commitment. Okay, not quite. It has a subset. So that the returned list will always have the a's. All the a's in the return result will come from the input. It might just return no a's. It might return only one of them or all of them, or double all of them. Like just put two of them in the list or something. But they're all in the input list. No a's came out of nowhere. Yep. Yep. So let's return the empty list. All a's in the result of which there are none appear in the input. Okay? All right. This is in Haskell notation. Given a list of a's, return a list of a's, there could be like an alien somewhere on the unit, I don't know, Jupiter, and they're writing a function with this type. And when they are, all a's in the result will appear in the input. And this is a really good property. It took me no effort. I just wrote the type. And now I know this thing. And these things we will call theorems. All right? So the papers call theorems for free. And I can reliably construct these theorems based on the type. So here's another one. Maybe a to list of a. And I'm making three claims here. And that is that all the a values in the return list are the same value. They must be. All right? Looking only at the type. They must be. If the argument is nothing, that is there are no a's, then the empty list is returned. So I already know what it does. If nothing comes in as the argument. And the a values that are, so if the list is not empty, then all the a values were in the just. They're in the just constructor of the maybe. I know all these things by looking at the type because it's polymorphic. All right? Wouldn't be true if there were ints. If a were ints, I'll just start doing 99 and 77 and whatever else. And I know it because it compiles. All right? The type, it compiled. I know all these things. Isn't that great? I didn't have to do any work. I knew things for free. So here's one. And just to explain this notation a little bit, this says a b to an f of a, so these are the arguments, given a b, given an f of a, return an f of b. And this bit here says you can do math on f. That's all you can do with f. Okay? So if I said to you, write me a function, and in fact, yesterday we did, I think, write me a function b to f of a to f of b where f does math, what are all the things you could do?  Any guesses? I heard one. That's correct. I know what this function does already by looking at the type. There's only one function in the whole universe that has this type. All right? It's the one that maps on this f, so it calls math on f. When it maps on f, it then needs to pass a function of type a to b to make the f of b. It takes the a, it discards it and replaces it with that b. That's all it can do. If I said to you, write me a function that is int to list of bools, to list of int. Yeah, int to list of bools, to list of int. Well, now it's just exploded. There's millions of things you could do. But because we're polymorphic, there's only one thing you can do. Isn't that amazing? Write the type, done. And what about now? Now, what applicative does is it says you can sequence on f. So that is to say you can take an f. Not only can you map it, you can then run it again. Now, what's happened here is I could do the same thing that it did when it was only constrained by the functor. That is, it could map. But because it's now applicative, I've opened up the possibility of taking this f, this result, and continually sequencing it. So the answer in this case is infinity. There's infinity possible answers. But the simplest one is the one that maps. Actually, that is even simpler. Correct. So I could just call pure b because applicative has a pure function on it as well. So there's some limitations. So it doesn't always work. Wouldn't it be good if our types were just once and that's it? There's some limitations. So going back to the fact that I can discard null if I were writing it in Java or I could discard default if I were writing it in C sharp, this paper tells us that we reason about our programs as if we're reasoning in what's called a total language. That is to say, these other things don't exist. And we do this all the time. Like, how many possible things does this return? Well, two, right? And we throw away that one. The one that didn't return. It's really three, but we are justified in throwing away that third option. That paper talks about that. And this is called fast and loose reasoning. So when I say, null doesn't exist, I am discarding this thing. I'm fast and loose reasoning. And in many languages, they have a lot of things that I have to throw away, such as all of these. That's a lot. If you use Java, which I have, and I did in fact throw all of those things away. It can be done. You can write Java so you never have to use any of those things. But I do throw all of these things away so that I can exploit parametricity. So here's just yet another example. List of int to list of int. It's monomorphic. What does it do? I don't know. Who knows? It just returns a lot of tens. I don't know. But this one here, all elements in the result appear in the input. There's a problem here, which is, well, that's not everything. That's not telling me everything about what this function does. It tells me a lot about what it doesn't do. But, you know, does it flip every second element? Or does it flip every fifth element? I don't know. So what do we do in these cases? We've exploited parametricity. We've got a really good, like for free, we've got some really good theorems, but we don't know exactly what the function does all the time. So, yeah, we don't know what it does. So, I mean, I've worked on lots of projects and often I see these things. It goes, this function twiddles the database to twiddle out the twip top or something like that. I kind of go a bit blank as I'm reading it. It's just a blur. It says something like that. And I tend to look at these things, actually, and I use them to go, it definitely does that thing that it says it doesn't do. You know, the ones, this function doesn't touch the database. I immediately know it does. This is not parametricity. This is just the way programming generally works. But instead of writing these comments or documentation or whatever you want to do, I want to write machine checkable comments where a machine makes sure it's true. If you did touch the database when you said you didn't, it won't pass the tests. So, let's look at this function. So, this is Haskell notation and this is more a question for you guys and I want to hear your input, right? Which is, I have a function. It's type is list of A to list of A as discussed. We don't know what it does just yet. We know that every element in the result appears in the input and I think that might be a bit hard to read but I can tell you what it does, what it says. It says if I call this function, so that's here, if I call this function, then I call it again. On any X, I always get back the same X. Alright, so if I call it once then again, on any X, I just get back X. And this one here says if I have two lists X and Y and then I append them and then I call the function that's the same as calling the function on Y and appending that to calling the function on X. Alright, so these are tests. I've written some tests and a good test library will just start plugging in X's and Y's and see if it's false. So what does this function do? I know there's some of you who know the answer but what does it do? Who feels like they've calculated by these two stated propositions that they know what this function does? Well, does it always return the empty list? It always returns the empty list. No one's brave enough. If it always returns the empty list and I call the function on the function with X, yeah, it'll return not X, right? I'll just pass in a single element list and then it'll return me back nil. So it doesn't return the empty list at all times. I can tell this by these two propositions. What this function does is it reverses the list. All right, this function must reverse the list. It must reverse the list because these two propositions told me so. Okay? There is no other function that satisfies these propositions and that type. That is not reverse. It must reverse. Okay? So people often say to me, do you write comments in your code and like no, I write propositions in my code. I think this is much more reliable because if I touch the database in here or whatever it is, the propositions stop being true and I will learn about that very quickly. Okay? So basically these propositions are what happens when the parametricity has not got us all the way to the answer. All right? So in the previous example, which was B to FA to FB, we're already at the answer, there are no tests to write. Do you test your code? Not in that case. All the tests are written. I have a proof. So here's another simpler example. So flat map or bind it sometimes called, given a list of A and a function, A to B return a list of B. Well, if the input list is empty, so is the result. I'm making this claim immediately. All right? So if there are no A's, then no B's are coming back and I know that straight away.  I already know this. And every B that is in the list came from the application of the function. It's the only way you're going to get any B's. All right? This reasoning that I'm doing is parametricity because those types are polymorphic. I now know a lot of things about what that function does. This wouldn't be true if it was like A was a string and B was an int. Then I got to return a list of ints and I'm going to put negative 99. I'll put all my favorite numbers there. But because it's polymorphic, I can use parametricity. And like I said, sometimes you don't have to write tests. This is a very simple example. Write me a function that takes A and returns A. How about this? Write me a function that takes an int and returns an int. Oh, that's a lot. That's a lot of possible answers. If I sent you all the way to write me that function, you'd all come back with different answers. That's a lot of possible answers that you could give me. But this one here, if I said it's A in and A out, it's polymorphic, you're all going to come back with the same answer. It must return its argument. And that's all it can do. This is a common objection I hear to this kind of claim is if you're not familiar with functional programming, so don't forget we've committed to that already. But if you're not familiar, you might think something like, aha, I'm going to lock a thread, then return an A. But this has a different type. You can't do that in Haskell, at least when you're honest with your types.  Where are you going to get it? Well, it must come from the argument. There's nowhere else it's going to come from. And there's no way you can write any test with this function. They're all redundant. The types have already given me all the tests. Okay? So another thing actually I often hear is that types are not tests. And that's true. Types are not tests. The types do substitute the tests. There are now none to write. Okay? And this is the example that we've already seen. So if we look at this code here, and basically I've called G and I've passed in the string hi and then I've passed in the list one, two, three. And it returned me back the list of hi three times. And I already know that the function did that by looking at the type. List, map, right? I can map across a list. What did it do? Well, it mapped across the list of integers and it replaced it with that string hi. But I already know that it did that by looking at the type. I don't need to run it and check. Sometimes it's helpful to run it and check just to verify that you know what's going on. But that's not the same as now I know what that function does by the type. Okay? So the point I want to get across is I can use types to reason about my code and know a lot about what it does. Sometimes I can know everything about what it does. And when I do, there's no tests to write. What tests are you going to write for this type? Are you going to write this one? Well, I already knew that. It's redundant. Okay? So when we say types are tests, it's true that types are not tests. But this type substituted for all the possible tests you could have ever written. There is no need for them. I have a proof. Sometimes they're almost unnecessary. Not quite. How many functions of this type exist? Well, it's a to the power of a to the power of a, but I haven't told you how to do algebra with a's yet. Just intuitively, how many functions of this type exist?  How many different answers would I have? Take a guess. I see, I hear and see a few two's and that's the correct answer. You must return me an a. These are the arguments. Well, you're either going to return the first one or the second one. So how many tests do we have to write? One. We'll just disambiguate it. We're not sure yet which of the two functions I've written by the type, but I need to write a test to disambiguate which one did I do? There we go. Now I know what it does. If I put in seven and eight, it returns seven. Well, now I know which of those two that it did. And this is just one to think about. Who can read that, by the way? I mean, it's okay if you can't. Okay. So I'm going to try and explain it. Basically, this function, applicative, applicative means that you can sequence the f. All right.  And by traversable means you can run a function on either side of the thing. So if you had, say, a list of pairs, a list of two things, you can run a function on both sides, like you can map across both sides. And the answer to the question in this, so I guess what I'm saying is, like the overall point is, when we look at types like this, and the problem with this type is it's, the benefit is it's very polymorphic. There's all a's and f's and so on. But how many inhabitants are there? How many values of this type exist? And the answer is infinity. Okay. Because I can just keep sequencing the f. I can write the code. I can get the f. And I can just call the applicative and just keep sequencing it. But sometimes we actually do this reasoning, which is, what's the most sensible answer? Which is very loose reasoning. But the sensible answer is the correct one as well. All right. It's the one where you don't keep sequencing f. So it is true. I'm making an admission. It is true that sometimes we do this reasoning, which is, well, of all the infinity inhabitants, which one is this? It's the sensible one. That's it. Here's another example where, so store is a data type. Who's heard of store, by the way? It's pretty handy. It's basically, instead of carrying a b around, like carrying a value of the b around, sorry, instead of carrying, sorry, that should be an a. That should be an a there. So yeah, instead of carrying a b around, you carry an a, and then a function a to b so that you know how you got to the b. All right. Does that make sense? So you're carrying it into round. So you go, well, how did I get to that int? You have a function like string to int and a string so that you know how you got to it. That's what store does.  Well, you take the a, you put it in the function, and you return the b. And in fact, that's the only way you can get the b. All right. When I see functions of this type, which you might, I go, well, I know what it does. I look at the type. It's once inhabited. I can calculate it. That paper theory tells you how to calculate that. And it's one and so on. So the point I want to make here is, so address the point that people often come to me and say, hey, this type, I find it really hard to read. I don't know what this says. I need help.  Okay. Once that tool, once you've got that tool, these things become much easier to read. It's why we do these things. So we're able to calculate what code does sometimes using only types. Isn't that, doesn't that excite anybody? Why don't I just write types and then go home? All the work is done here. It's good. I really enjoy doing that. So basically types document your code. I'm making this claim. Types document your code. Nice, reliable, dense documentation. The best kind of documentation. Any questions? Yeah. Can we do that one in the hallway? Is that okay? So the question was, so if I have a type A to A, and I've said to you there's only one inhabitant of that type, what is the process by which we get to that one? And I'd really like to take that one offline if I could. It requires a whiteboard, and questions keep coming as we do it. Anything else? Who wants to go and write some types? And that's it. Thanks, everyone. Thanks so much, Tony. That was a great talk.


Fateh te ев applicants  отно పి Ostak 的 కీని కీరని కిని కికీని కంటకరూటాతెనిసం కికానికకికాక్టికూటాం. and to apply sanctions to such persons. That means that LUSHA received a partially compliant written for recommendation 14. So Mr. Speaker, this bill amends section 40 of the Money Services Business Act to offer the financial services regulatory authority to monitor and to license money services businesses and to take actions against individuals carrying on money services businesses without a license in LUSHA. So this means Mr. Speaker, that all the people in money services Mr. Speaker, people who transact money, who send money in, who provide loans, these payday loans Mr. Speaker, payday loans, micro lending, moving money, they have to get license Mr. Speaker. Mr. Speaker, speaking about payday loans Mr. Speaker, I think whereas we are passing these rules, these regulations to protect international bodies, we need also to encourage and educate our people Mr. Speaker in budgeting and using finance Mr. Speaker, money Mr. Speaker. Mr. Speaker, these payday loans are very attractive. But I don't think that when we take them we ever check the rate of interest that we pay on these loans Mr. Speaker. Sometimes these in that interest on these loans as a has 30 percent. So Mr. Speaker, we need to have a process of education, financial literacy to tell people how to use credit cards. There are some people Mr. Speaker, who use credit cards to pay credit cards, who take loans from these payday loan areas to pay credit cards Mr. Speaker. So because the interest on the credit cards in them is over 20 percent, 25 percent, 29 percent Mr. Speaker. So whereas we are doing all these things to protect, to first to be compliant with international regulations, we need to educate our own people. Our own people need to look at other means of doing the financial transactions so they cannot fall prey to these creditors Mr. Speaker. So I think it's a very simple amendment called FSRE to license and to regulate these businesses. But our people must be careful in the way they use these businesses and the way they use their finances Mr. Speaker. So Mr. Speaker, I ask members to approve this amendment.


Hi, I'm SB1 Jake Foynes. I've been a special warfare combatant craft crewman for 10 years now. I grew up in a small town, never thought I would leave. I worked at a machinist shop and decided I needed to do something better with my life.  The thing I love the most about the SWCC community is the people I work with. SWCCs in general are some of the hardest-working people and just being around this atmosphere makes every day that much more enjoyable. One of the hardest parts of SWCC training for me is buddy toes. Do you have to go save a drowning victim, which is the instructor?  During this evolution, I failed every single one. When you fail, you do have a chance to make it up. So instead of accepting failure, I went out, I trained and then I came back and then I crushed it. Failure isn't an option.