So let us continue with our discussion see we were discussing meromorphic functions okay and you know we have to as I told you we have to worry about meromorphic functions because eventually our aim is to prove the Picard theorems and to prove the Picard theorems we need to actually do some topology on the space on a space of suitable space of meromorphic functions okay. So you see doing topology on a space of functions is kind of the background theme okay so you must understand what this is all about okay and for that I need to first of all tell you about spaces of holomorphic functions okay or analytic functions and of course you know analytic functions or holomorphic functions are also considered as meromorphic functions okay. So meromorphic also includes analytic okay and of course last time we saw that if D is a domain in the extended plane okay then the set of meromorphic functions on D namely those functions which are analytic on D except for poles okay that set is actually a field it is a field extension of the complex numbers and I told you that the behaviour the algebraic properties of this field extension have got a lot to do with the geometry of the domain okay and this philosophy is in fact very useful and it is exploited when you replace a domain by in fact Riemann surface okay. Now you see but whenever you are looking at a domain and of course let me also remind you when I say domain I am taking a domain in the extended plane which means that the domain can also include the point at infinity okay which means that I am also allowing study at infinity so I am allowing neighbourhoods of infinity also to be domains okay and this is very very important because the following reason you see you take a meromorphic function okay then on a domain in the extended plane okay. Now take a of course you know it is a meromorphic function so it can only have the only singularities it can have are poles so in particular it can have only isolated singularities and they are poles okay and if you go to as you as you approach a pole the function values approach infinity okay so that the function values approach infinity is can be understood in two ways one way is in a that is the way in which you would have learnt when you did a first course in complex analysis that you see saying that f of z tends to infinity is the same as saying mod f z tends to infinity okay that is it becomes orbit the modulus of the function becomes larger and larger that is one way of saying it but then there you do not really think of infinity as a point but now you know we are used to thinking of infinity as a point namely a point in the extended plane and you physically see it as the north pole in the Riemann sphere when there is a when you look at this identification of the Riemann sphere with the extended plane okay so you know you picture a you picture a domain in the extended plane as by thinking of its image on the Riemann sphere so you imagine the Riemann sphere okay that is a that is a north pole which corresponds to the point at infinity in the extended plane okay mind you the Riemann sphere is homomorphic to the extended complex plane okay it is homomorphic to the extended complex plane with the point with the north pole corresponding to the point at infinity so you can make you can clearly see that you know a small disk like neighbourhood of the north pole that will correspond to the exterior of a circle of sufficiently large radius on the plane by the stereographic projection and when you think of a domain in the complex plane or in the extended complex plane you can think of its image on the Riemann sphere okay so you can think of a domain in the extended plane as some open set on the Riemann sphere okay that is open set can include the point in can include the north pole or it need not include the north pole that depends on whether the original domain you are looking in the complex plane is actually in the complex plane or it is in the extended plane including the point at infinity okay so you must imagine whenever you are thinking of a function defined on a domain in the extended plane you must always imagine an open set on the Riemann sphere and that open set can include the north pole in which case it corresponds to a domain on the extended plane which contains a point at infinity okay and therefore you know we so the point is that if you are looking at a function which is meromorphic on a domain on such a domain in the extended plane then you know it will have only poles okay but if you now approach the you take the points corresponding to the poles on the Riemann sphere okay you take the points corresponding to the poles on the Riemann sphere okay outside those points the function will take values only in complex numbers okay whereas at the poles what happens is at the poles the function tends to infinity okay so the moral of the story is what you can do is you can define the function value at each of the poles to be infinity okay and thereby the resulting function becomes continuous at those points okay now you have to be now there is a subtlety here okay I am saying that the function is made continuous at a pole by defining its value at a pole to be infinity okay and when I am saying this I am not saying that the function is continuous in the usual sense okay a function continuous in the usual sense is if it is continuous at a point it is supposed to have a finite value at that point okay but I want so I am really thinking of infinity as an extra value okay there is a subtlety there is some subtlety involved there is a little bit of confusion involved here because when you say a function is continuous at a point okay it means you know Riemann's removable singularity theorem says if an analytic function has a isolated singularity at a point and if the function is continuous at that point then it is analytic that point is not actually a singularity but I am not saying that I am saying what you do is you take a pole of the function and you make the function continuous at that point at that pole in the following sense you declare the function value at that point to be infinity okay and regard this function as a mapping in not into C but regard it as a mapping into C union infinity the extended plane and then with respect to that now you on C union infinity which is extended plane there is a topology okay that is exactly the topology which is topological space structure which is homeomorphic to the Riemann sphere okay and so I am thinking of the function as taking values in the Riemann sphere in some sense okay and I am saying that the function is continuous at a pole by declaring its value at the pole to be the value infinity okay. Now this is a certain point of view that is very very important okay let me put this following convention let D in the extended complex plane be a domain so it is an open connected subset of the extended plane okay so what you must remember is that D corresponds under the stereographic projection to a domain on the Riemann sphere so it is an open so the image of D under the stereographic projection is an open connected set on the Riemann sphere okay that is what you must remember okay so let D be a domain let f of z be meromorphic on D okay that means f is analytic except for an isolated set of points of D at each of which f has a pole that is what it means okay that is the definition of water meromorphic functions okay so we define the value of f at pole of f to be infinity see you make this definition okay f at every pole f of a pole is equal to infinity you make this definition okay so then the beautiful thing is that f it becomes a function from D to the extended plane okay now f is a function from D to the extended plane and the point is that as a function into the extended plane this is continuous okay if you are normally taking a first course in complex analysis and you are working with a function which has a singular points then what you do is that you consider the function to be defined on the complement of the singular points okay and it is supposed to take only complex values alright now what we are doing is we are allowing meromorphic functions so that means you are restricting the singular points to be isolated and they must be poles okay so in principle you should be worried only about the function outside the poles outside the poles the function should be analytic and it should have complex values okay but what we are doing is we are also including the poles we are defining the function value at each of the poles to be infinity and therefore the function becomes a function into the extended plane okay allow it also takes the value infinity and the point is after you do this continuity is not lost and see the reason why continuity is not lost at a pole is that as if z not is a point of D where f has a pole then limit z tends to z not f of z is infinity okay but infinity is also f of z not by definition because z not is a pole we have defined the value of f at a pole to be infinity okay so f of z not is infinity and that is also equal to limit z tends to z not f z therefore you know that is the definition of continuity okay at z not so the function becomes continuous at z not okay and again let me warn you should not confuse this with continuity in the usual sense I am not saying that as an analytic function it is continuous at a pole that is not correct okay it certainly is discontinuous because when I talk about analytic functions I am only worried about functions is taking complex finite complex values not the value at infinity okay so when I say continuous here you must take it to the pinch of salt you have to be careful okay so let me write that down if z not belonging to D is a pole of f then limit z tends to z not of f of z is equal to f of z not is equal to infinity so this is the extra definition okay that we make so the actually you know sometimes in the language of Riemann surfaces we say that a meromorphic function on a Riemann surface is this same as a holomorphic function into the Riemann sphere okay we say this often and it really makes sense in this sense okay so the point is that you know by including the value at infinity you are able to give a function value at a pole namely the value infinity okay and that is and that makes the function continuous on the domain okay but the point is that the target domain the target domain becomes the extended plane and the topology on that is the you know the topology of the one point compactification which is homeomorphic to the Riemann sphere okay so you know for all purposes you know the picture that you imagine is the following so let me draw this picture it is very important so whenever you know so for all practical purposes this is the best thing to imagine on one hand you have the Riemann sphere okay so on the other hand also you have the Riemann sphere and you know well this point is a north pole okay this corresponds to the point at infinity and this is again the north pole which corresponds to the point at infinity okay and whenever I put this double sided arrow I actually refer to the stereographic projection which compares the Riemann sphere as topologically isomorphic with the extended plane with the point at infinity corresponding to the north pole n okay and what we are doing is see basically you are looking at a you are actually looking at a domain in the extended plane so you know it is going to be some domain like this okay and in fact you know I should not put you know I should not put the boundary so it is something like this so this is my domain so the way I have drawn it now it contains the north pole so that means that when you take its image under the stereographic projection it actually corresponds to a neighbourhood of infinity okay and this is an open connected set on the north pole okay and I have this function f I have the function f which is defined on that and it is taking values again in you must think of it as taking values again on the Riemann sphere okay and whenever you think of the Riemann sphere see you picture the Riemann sphere but always think of c union infinity okay the Riemann sphere minus the north pole is the complex plane by the stereographic pressure and the north pole corresponds to the point at infinity so what will happen is that your function f will is defined you must picture it as being defined on a subset of the Riemann sphere and it is the image it take the image of the function is also a subset of the Riemann sphere okay and the point is that if you take a point which is a pole of f okay then the function has a value there that is what we have done if you take a pole of f the function value is infinity so you know if I draw a pole so suppose I have z0 z0 is a pole okay then f of z0 is equal to infinity okay and so what will happen is that this f of z0 you must picture it as being mapped on to the north pole okay mind you in this the way I have drawn it is not entirely accurate because there is an identification on the left and on the right with c union infinity so what is happening is that there is this the thing on the left is c union infinity okay this thing on the right is also the c union infinity c union the point at infinity so both of them are the Riemann sphere and then I have a domain D inside c union infinity and I have this function f this is a picture so D is a domain in c union infinity f is taking values in c union infinity you allow the value infinity and that is a value you are you assign to function at a point which is a pole okay and in principle this f that I have written in red is actually the is gotten from the f that I have written in purple after identification with the stereographic projection so in principle for this f here I should use some other symbol I should use f tilde if you want and for this point z0 that I have written in purple is not exactly z0 it is actually stereographic projection of z0 the point z0 is actually as a point in D okay and after I identified the c union infinity with Riemann stereographic projection then the point z0 in D corresponds to this point z0 on the Riemann sphere okay. So you know so you know forgetting the notational complication that is involved in all the time carrying the stereographic projection okay you always imagine that things are happening on the Riemann sphere okay and the reason why this is very very useful is because you see if you are looking at only the extended plane the point infinity is something that you cannot see okay you cannot see it as a point and more importantly you cannot for example define a distance between the point infinity and some other point in the plane okay there is no way of doing it in the usual sense but if you think of the extended complex plane as a Riemann sphere then the point infinity is just the north pole and now you know if you now you can define a distance between any two points in the extended plane by simply taking the distance on the Riemann sphere of the images of these points under the stereographic projection. So you know for example therefore if you are imagining all the time the Riemann sphere you can even talk about a neighbourhood of infinity which has certain radius you can talk about a circle centred at infinity with some finite radius okay and that is something that you can picture as an interior of a circle surrounding the point n on the stereographic projection with a certain radius finite radius okay and that radius can be made smaller and smaller okay and you can imagine that as I make that radius smaller and smaller under the stereographic projection I get a larger and larger circle on the complex plane okay. So see this is a certain point of view that you should always remember you always think about a domain in the extended plane as actually a domain on the Riemann sphere and open connected set of the Riemann sphere okay and open connected set on the Riemann sphere the topology is mind you is just the induced topology from R3 the Riemann sphere is just the sphere of the sphere centred at the origin radius 1 unit in real 3 space and real 3 space is Euclidean space you know it has a standard topology it is a metric space it is a complete metric space. So you take the induced topology on the subset so there is a nice topology and it is in fact even a metric space okay therefore you think of it like that okay. So this is something that you must so you know if you want if you want I should do the following thing you know I should actually relabel this as f tilde you know and I should actually relabel this point as z not tilde where this tilde means you translate everything to the Riemann sphere and you will have to therefore bring in the stereographic projection but most of the time you do not worry about it okay see what we are going to do is as I told you we are going to do we have to worry about space of you have to look at the space of meromorphic functions on a domain okay and you have to do topology on it and more generally the simpler case is trying to do topology on a space of analytic functions on a domain. So see what is this topology all about see the most important thing that we will be worried about in the topology of a space of functions is compactness okay so you see compactness is the somehow the most important property that we have to study. So essentially what we have to study is compactness of spaces of functions what kind of functions functions essentially we have to study meromorphic functions but then before that you will have to also worry about holomorphic functions or analytic functions because they are special cases of meromorphic functions meromorphic functions which have no singularities are essentially holomorphic or analytic functions. So now let me do the following thing so let D you take it take D to be a domain in the extended complex plane okay then what you have is so domain, domain means it is non empty it is an open non empty connected subset okay and then you have this so you have this you have the complex numbers sitting inside as constant holomorphic functions in H of D so let me put this notation and this is M of D okay. So what is this M of D this is something that I told you last time this is this is the set of meromorphic functions on D okay this is so let me write this here set of meromorphic functions on D okay this is the field as we have seen last time okay and at this point you only you do not worry about the value at infinity okay at a pole okay this is completely algebraic so you are really not worried about looking at the function which looking at infinity as one of the values of the function okay. So this is the field we have seen this and you have and therefore this is a field extension of the complex numbers see this is this map C sitting inside this is you are thinking of lambda as a constant function lambda okay. If lambda is a complex number you you identify it with the constant function which is equal to lambda and what is this H of D this is actually a set of holomorphic functions on D holomorphic is same as analytic okay this is a set of holomorphic functions on D alright and the fact is that you know the set of holomorphic functions will only be a it will be a ring in fact it will be a C algebra it will not be a field because you know I cannot invert a holomorphic function to get a holomorphic function unless I know that it is non-zero is that that is not ever going to be 0 because wherever it is going to be 0 I cannot invert it okay because for the inverted function the 0 will the 0 of the original function will be a pole of the inverted function okay. So and the moment a function has a pole it is not holomorphic okay it is not analytic. So the point is that you see this is so this is a C algebra and in fact it is commutative it is a commutative algebra mind you whenever we talk about algebras the algebra and algebra is a ring which is also a vector space over a field and in general it could be the algebra the multiplication in the algebra need not be commutative for example the simplest examples are of course matrix algebras you know matrix multiplication is not commutative so but of course algebras of functions are commutative okay because they are taking values in C and C is a commutative field okay multiplication in C is commutative alright. So the fact is that if you take a holomorphic function in D it is certainly a meromorphic function on D okay if you take a function that is holomorphic on D I have to only worry about to invert it I have to only worry about points where the function has zeros but then you know zeros of a holomorphic function are isolated therefore at each of those zeros the inverted function will only have a pole therefore that should be no problem so if you take any holomorphic function on D you may not be able to invert it to get a holomorphic function on D but if you invert it you will certainly get a meromorphic function on D. So in particular you see the meromorphic functions on D will contain inverses for all holomorphic functions okay now fine so M of D contains also inverses of non-zero elements in H of D okay and H of D is mind you it is a subring it is a subalgebra okay this is this is a subalgebra and H of D is not a field but M of D is a field this is what it is algebraically okay and I told you that there is a lot of geometry in studying this field extension M of D over C it is a field extension studying the algebraic properties where extension has got to do with a lot with the geometry of D okay. Now well keep these things aside I want to go away from the algebra and I want to go into topology so you see let us look at just H of D just look at H of D and try to worry about topology on this on the on the set H of D okay so how do you do topology you think of H of D as a set and you would like to give some topology on it okay now the and you know it is not that you do not give an arbitrary topology you give a topology which makes sense with the functions with the domain of the functions okay so what is the idea the idea is you are trying to worry about topology of a space of functions okay now what I want to do is that you know I want to tell you that this topology has got to do with it has got to do with point wise convergence of functions okay on the point wise convergence with respect to points of the domain on which the functions are defined which is D in this case okay. So I want to say that the topology on H of D or if you want to even worry about more generally topology on M of D that has to do with convergence with point wise convergence with respect to points of D okay so this is what I am trying to emphasize when I say I want to do topology on the space of functions I want to worry about topology on the set of holomorphic functions or I want to worry about topology on the space of meromorphic functions set of meromorphic functions okay then the topology has to do with point wise convergence now so why is that true you know you need some motivation for that and in fact you know let me be even more accurate we are not really worried only about point wise convergence because point wise convergence is a very weak of something very very weak you know the reason why it is weak is you suppose you have a suppose you have family of functions or a sequence of functions which is converging point wise to a limit function then the limit function need not be continuous even if the original members of the family of functions each of the members is continuous okay you know that you need a uniform limit for the limit function to be continuous so it is not only point wise convergence we are worried about we need something stronger that is uniform but what happens in complex analysis you do not get uniform always on your domain what you get is uniform on compact subsets of the domain okay for example you will get uniform on closed disks inside the domain and that is a special kind of uniform convergence which is uniform convergence on compact sets that is called normal convergence and see it is so what I want to impress upon you is that the topology on the space of holomorphic functions or on the space of meromorphic functions on a domain has to be studied with the viewpoint of normal convergence okay it is point wise convergence and it is not totally uniform convergence but it is uniform convergence on compact sets okay and you know in some sense why is all this importance why is all this important because you see let me recall little bit of basic topology to help you to see the following thing let X be any set so this is some motivation X is any set take any set not even a topological space of course assume it is not empty okay then what you do is you take you know L to be well the set of all functions from X to R okay you take the set of all real valued functions on X okay take the set of all real valued functions on X so these are just functions on a set okay the only thing is that these functions have real values right now the point is that this L becomes immediately this becomes a real this becomes a real vector space L becomes a real vector space alright and you know how because point wise addition and point wise scalar multiplication makes sense so if f is a function on X with real values and g is another function on X with real values f plus g can be defined as f of X f plus g of X is just f X plus g X for each small X in capital X and similarly if lambda is a real number lambda f can be defined as lambda f value at X is lambda times f X okay so this becomes a this becomes an R vector space alright and well what you can do is among these functions you can look at those functions which are whose images are bounded okay you can look at bounded functions so in this L I can have this subset b okay which is the set of all f belonging to L such that f of X is bounded the image is bounded so these are bounded real valued functions okay the set of all real valued functions L is a vector space it is a real vector space and now you take this subset which is which causes of bounded real valued functions okay then it is also a subspace because if f is bounded and g is bounded then f plus g is bounded if f is bounded then lambda times f is also bounded okay so the point is that this is a this is a this is a subspace this is a real subspace of this vector space alright now the beautiful thing about the subspace is that because your images of functions are bounded you can make this into a Banach space you can make it into a complete normed linear space you can define a norm on it the supremum norm that makes it into a topological space in fact it makes it into a metric space the metric being induced by the norm and with respect to that metric it becomes complete and this is essentially because of the completeness of the real line okay so this object here is actually and in fact the beautiful thing is that I can in all these spaces I can even multiply two real valued functions to get a real valued function and the multiplication is commutative so these are not just spaces they are in fact commutative algebras so L is actually in fact a commutative R algebra okay B is also commutative R algebra but B is in fact a commutative Banach R algebra okay it is a Banach space it is a Banach algebra alright so let me write this so this fellow here is actually commutative R algebra and this fellow here is actually commutative Banach algebra it is commutative Banach algebra and the point is that you define norm f to be equal to supremum x small x in capital X of mod fx and the supremum will be a finite quantity because I am looking at f in B f is the image is bounded and you know that one of the properties of the real line is that you take a bounded set its supremum exists and it is a finite real number okay in fact you know that is equivalent to completeness of the real line the real line that every Cauchy sequence converges on the Cauchy sequence of real numbers converges is as strong as requiring that any subset of the real line which is bounded above has a supremum okay and that is equivalent to also saying that any subset of the real line that is bounded below has an infimum okay so if you take this norm this is a sup norm it makes B into a normed vector space and the norm induces a metric in the following way d of f, g is just norm of f minus g so with this d function distance function this B becomes a metric space okay it is the it is said to be the metric induced by the norm and with respect to this metric B is complete so it is a Banach space and in fact it is an algebra so it is a Banach algebra okay now what you do is all this is correct if you are taking X to be just a set okay now you put the extra condition that X is a topological space okay if you put the condition that X is a topological space then instead of simply looking at functions from X to R I can look at continuous functions from X to R because now the source X is a topological space it has a topology okay so I look at functions which are continuous also and when I do that then I get this familiar object that you should have seen in course in analysis namely the space of all continuous bounded real valued functions on the topological space X so this is if X is topological if X is a topological space okay and the fact is that this is a closed subspace so mind you B is already a topological space and this is a closed subspace you can show that this is a closed subspace namely you can show that if you have a set I mean if you have a if you take a point which is a limit point of continuous bounded real valued functions then the limit function is also continuous bounded real valued okay therefore this becomes a so in particular this space C X R that also becomes a commutative Banach R algebra okay and the beautiful thing is the following the beautiful thing is that for a function for a for a sequence of so you know now in C X R I can mind you C X R is also a metric space okay because there is a metric induced by the norm so I can make sense of a sequence of functions converging to a function what is that convergence if you check it out that convergence is nothing but uniform convergence okay therefore the moral of the story is that uniform convergence of real valued functions sequence of real valued functions on a topological space is the same as the convergence in the norm the so with respect to the sup norm on the Banach algebra of bounded real valued functions. So this is to give you the motivation that you know whenever you try to get hold of a topology on a space of functions okay the convergence should have to do with point wise convergence in fact it has to do with normal convergence okay or at least to begin with it has to go to do with uniform convergence but normally what happens is you cannot get uniform convergence on a whole space in complex analysis for example in the case of holomorphic functions you can get only uniform convergence with respect to compact subsets so the topology of a space of meromorphic functions or holomorphic functions needs to be studied with respect to normal convergence okay that is the motivation okay so we will continue with the next lecture so let me write this down this is also commutative Banach algebra with convergence same as uniform convergence on x okay.


I am Dave McHugh joined by field hockey head coach Laurel Martin after the team's first few games of the season. We talked in the preseason. I know you wanted to get off on a good foot. I suspect you would say you probably did with two wins to start the first weekend and three overall. Yeah, yeah, it was a great start. The opening weekend at the York Invitational was a great opener for us. We played strong halves in both games, not both halves, but strong halves in both games to secure wins. So I was I was pleased with that. Yeah, so you get two wins there, a certain mass momentum, then the schedule changes on you a little bit. You're supposed to go to Washington College. That game was already going to probably be rescheduled time-wise due to field conditions and the problems they're having there. But then instead a couple days ahead of time the game ends up moving to Stevenson. Was that any bit of a distraction with just the the nuances of that or was it maybe a little bit easier that it did come to the home field? I don't think it was a distraction for the team. I think, you know, obviously home field advantage is nice to have. A little bit of a logistical challenge for the coaching staff. Sure. Trying to organize the officials and making sure that we could get the field accommodations, all of those things. But you know, it was a good thing to be able to play on a good surface. Yeah, Washington College, not that we'll get into it having some problems with their fields, which has affected all their teams. And so at least you guys got a good game under your belt in the sense of field conditions.  Yeah, it was a tough loss for us. I have to give them credit. They're athletic, they have some big hitters, well coached, so I think that team is going to surprise some opponents. On our end, we did not play up to even close to what we are able to do. So yeah, disappointing loss. But then we gathered in together after that loss, had a true heart to heart as far as what the expectations were and what we can actually accomplish this season. And the team responded well. So we were able to bounce back. I was going to say with a tough game with Rowan coming up, to have that tough loss, that can almost have a hangover effect. That going into the Rowan game maybe not really buying in or worse not sure they can accomplish what they can against a really tough getting votes in the top 25. Tough team in Rowan and you guys get not only a distracted game due to the weather, but you get a really solid win in overtime against that. Yeah, no exciting, exciting game and it's, you know, I found that our team rises to the occasion against the tough competitors and we play our A game and certainly we had to to give Rowan the battle that we did. Good team, athletic team, so I was so happy and so pleased with how we performed that game. That game had a lot of little things about it. You had the weather delays from the previous one at soccer game, two lightning delays there. You guys start an hour late, eight o'clock at night, so now it's already a late night. Then you'd throw in a lightning delay of your own. The game ends late, it goes into overtime. I mean there's just, we're dragging out what is normally a schedule for your team and it looks like despite all that responded well. Yeah, responded great and I think that's, you know, the approach is always light in the area, stay focused, stay happy and just roll with the things that you can control and that was our approach to the game. And yeah, I was just pleased, little kid on Christmas day with that win. Well, two one and overtime. Not certainly a high scoring affair, but what were the nuances? What were the things you guys did well to not only keep that as a one-one game, but to ultimately get the victory? Well, I mean it could have gone either way, obviously. So Rowan had their chances and I think Gaby did a great job in goal for us. She came up with some really big saves and then on the other end we have some speed on the attack and you know, Katelyn Dempsey's going to be marked and she was marked, but she's also able to create the assists which was neat to see as well and Holly had a great game with two goal winners and we're starting to show that it's not just the Katelyn Dempsey show. We've got some, you know, we've got a strong overall team and that's neat to see too. I was gonna say we'll talk about a lot of that as we go through the year here, but Dempsey's certainly the focus of everybody because she's already broken all kinds of records here at Stevenson, but it is a chance for those other players to then rise to the occasion because the defense is so focused on the sum and you point out in Rowan it seemed you got that. Yeah, yeah. I think that we're showing that we're not a one-man show. We've got a strong contingency of 11 field players and some subs as well. Coming up on Tuesday you're back home against Goucher, then followed up on that. You are back home against St. Mary's. We talked in the preseason about taking advantage of the home games. You got a good stretch here. What are the keys to your first game against Goucher on Tuesday? Goucher's huge because just like I said to the team that people will forget the Washington loss if we win against Rowan. People will forget the win, row and win if we lose against Goucher and so we have to climb and we have to play even better than we did with Rowan at Goucher. We have a light that's on the fritz so please forgive the blinking. I might have to fix that in a minute and because of the edit you probably can tell we already lost our light so we'll pick up a word we're starting talking about Goucher and the importance of that game and how do you get the team almost refocused? I mean you had the game with Washington where it wasn't not a good win. You got to get them focused for Rowan. Now you get a huge win with Rowan and you know you don't want to rest on your laurels so you you know fall flat against Goucher. How does that coaching technique work? It's a mental game at this point stage. Our team understands that in order for us to reach our goals we have to play every single game at the A level and we're not we're not good enough yet to play play down and still secure wins. We have to play hard every game. They know that so that's the approach going in. And then Saturday you face off against former CAC opponent St. Mary's again at home as well. Nice bit of a break there between a Tuesday and a Saturday game but at this point it's all about keeping the momentum going too I assume. Yeah momentum is huge we've got to come out we've got to play really well against Goucher and we've got a secure win and we've to carry that into into St. Mary's. We have a little bit of a break with practice so that'll be beneficial for us as well. And hopefully the weather cooperates for you in all facets though it's cooler so that's certainly nicer.  What is the overall message for this week. For our team yeah it's focus it is it's mental focus it's the fact that we know what we can do. Can we continue to do it elevated at that level and learn and grow every single game. Very good well congratulations on the three-on-one start I know that's exact you know maybe exactly what you drew up. I didn't want to assume. So three-on-one start with a big win over Rowan here at Mustang Stadium again team back in action on Tuesday against Goucher and St. Mary's that following Saturday those two games both seven o'clock start times barring weather delays here at Mustang Stadium she's coach Laurel Martin for Field Hockey I'm Dave McHugh we'll keep in touch with the team throughout the year on Go Mustang Sports.


Metal organic frameworks, MOFs, are a type of crystalline coordination polymer composed of metal ions or clusters and organic ligands. These materials have been used in environmental sensing due to their unique structure and properties such as high surface area, tailored pore size, and high catalytic activity. Recent advances in MOF-based environmental sensors include optical, electrochemical, and field effect transistors. These sensors have demonstrated excellent performance in detecting contaminants in water and air, and they can be further improved by incorporating other functional materials. Additionally, MOF-based composites can enhance the sensing capabilities of these devices. Finally, there are still many challenges and opportunities for MOF-based environmental sensors. This article was authored by Xian Feng, Boyang Zong, and Shan Mao.


A good example of what we imagine the American success story is, she became a best-selling novelist. Her real big success was the book called The Fountainhead, which is available in Greek as all her novels are. And The Fountainhead was rejected by 12 publishers, finally a publisher agreed to publish it. But they didn't publish too many copies, but it became a word-of-mouth bestseller. And soon enough, they were making more and more and more editions. Today, The Fountainhead sells more than 100,000 copies in the United States, which is an astounding number for a book that's over 70 years old. She then wrote Atlas Shrugged, which is considered a Magnus Opus. And Atlas Shrugged, of course, the publishers were bidding to get Atlas Shrugged. And again, Atlas Shrugged today sells hundreds of thousands of copies a year. And it became an instant bestseller. After that, she wrote philosophical works.


A heat wave is a period of abnormally hot weather. While heat waves aren't as dramatic as most severe storms, they're just as dangerous. Heat waves can be hazardous to your health. They can also trigger massively destructive wildfires that pollute the air. Heat waves are often more intense in cities where asphalt and concrete absorb rather than reflect heat. Their frequency and intensity of heat waves are increasing as Earth's climate gets warmer. During a heat wave, stay cool, drink lots of water, and reduce physical activity. And check on family, neighbors, and pets who may be at risk.


Let's do the second question Let's so let's get rid of all this information except for The stuff that we knew that wasn't related to the problem for the first for the first question, right? So Let's just clear this up Also when you're doing geometry super important that If you when you're starting out do the stuff in pencil because you're gonna end up erasing a lot of things If you did this in pen if you do every single problem in pen When you move on to the second part of a problem you're gonna have to recreate the original and Every time you do a carbon copy of something every time you copy down Something from one place there's more chances of an error So you don't want to continuously rewrite the same thing what you want to do is lay out the problem and Solve for all the different parts of the question on your base Okay, it's just basically making carbon copies if you make copy of a copy of a copy of a copy of a copy you end up losing The details, okay, and that's exactly say what it works with math So let's go to part two if C e is Q and this line by the way up here between the two letters means if Line C e is Q Then solve for a b and a e so let's figure out where a C is a e is a e Q So from here to here, they're telling us this is Q Okay, we want to solve for a b. Here's a b and We want to solve for a e A e so we want to go back here and solve for this guy as well Let's put a question mark there and let's put this an upright question mark so C e is Q now. What was our relationship? This guy was equal to this guy and we knew Unfortunately erased it, but we knew I shouldn't have erased it that this guy was equal to this guy because D Was the midpoint of B and E so if that's The link that's the link is the same link, right? Now take a look at this if that's the same length as that This guy is the same as that so this guy is the same as that so if we put a tick here This guy breaks down into the same piece as this so the length here must be equal to the length there and this is the Main thing that you have to realize to be able to solve the second part of this question This guy was the same length as that guy and if you can break this guy into two pieces Then you break this guy into two equal pieces and this guy would equal that guy which equals that guy So if they're telling us the length from here to here is Q Then what's each one of these guys? Well each one of these guys is going to be Q the whole thing divided by 1 2 3 So each one of these is going to be Q divided by 3 so Q over 3 Q over 3 Q over 3 Now you don't have to write it out three times all you got to know is one of them is Q over 3 When we laid out the problem at the beginning We knew that this guy was equal to that guy so if that's Q over 3 That guy's Q over 3 it has to be So again, we just solve For the first part of the second question. That's Q over 3. Well, what's the length from a to e? Let's take a look at this thing. We have 1 2 3 4 5 Q's over 3 so this becomes 5 times Q over 3 which is 5 Q over 3 So the link from a to e is 5 Q over 3 Again, this becomes super powerful because this is Applies for any number they put put on there for Q. So for example if they had Let's say this was 12 Okay If that was 12 that would have meant Q the length from there to there was 12 and This was broken into three equal segments. So each one of these would have been four, right? Agreed. So if we plugged it into the question here, it would be Q over 3 12 divided by 3 is 4 12 divided by 3 is equal to 4 right and then how many of these that we have we have five of these guys So 5 times 4 is 20 and if we plug it in here 5 times 12 over 3 Well 12 goes into 3 goes into 12 4 times 5 times 4 is And that's the power of solving problems with variables


Okay, so the next talk is going to be about the Haskell infrastructure. A little backstory is that I discovered Nick's last year because of Rock's enthusiasm. And then I discovered the guy was sitting across the table from me was actually one of the main Nick's people, namely Peter Siemens. So Peter has been working on Nick's for seven years now. And he's gained a lot of fame in the last month because of his big efforts into improving the Haskell infrastructure. And that's what he's going to talk about today. So please welcome everybody, Peter Siemens. Thank you. Okay, the slides for this talk are online right now. So in case you want to read ahead and don't wait until we get to the point, you can do it. I think that right now the Haskell users in Nick's packages are in a fairly happy place, because the packages sort of appear mysterically and nobody really knows where they come from. Nobody has to worry about updating them. They are just there and they are up to date. And I want to look in this talk at the process that gets Nick's packages into that state. How do packages end up in Nick's packages and how does the machinery work that makes this stuff built and makes it work for the user? So I'm mostly interested actually in interesting aspects of the implementation. I'm not going to look at the user side in the sense of how do you install a Haskell package, how do you compose an environment with libraries. I won't cover that at all. That's a different talk. Okay. The Haskell packages, when you're a user of Nick's and you have an installation that involves Haskell packages, then these are the players, the entities that are involved in getting that stuff onto your machine. Obviously a package, I have it as a separate box there, but it's obviously part of the internet like everything else. But what I mean is that you have a package which is the central repository of Haskell packages. So everything that's deemed worthy of being published to a worldwide audience is typically registered on Hackage. And then there is a separate ecosystem of packages that exist on GitHub or Sourceforge or whatever kind of servers people use where they also publish Haskell packages, but they don't necessarily register them on Hackage. And when you have Nick's package, you get packages from both. So you have all of Hackage, all that's registered in the central repository is there, and you get other package in addition to that, which we pull in from other sources. For instance, the Cabal to Nick's utility, which Haskell users typically use, that's not registered on Hackage. That's a tool that's specifically for us. And so there seems to be no point of making it available or advertising its existence to everyone. So the data flow is like this, that packages show up on Hackage, then there is a separate effort which is called Stackage, which is called Stable Hackage. And what these people do is that they take a subset of Hackage and make sure that they pick versions of all the relevant packages that are compatible with each other. Every Haskell developer knows that you can't just update one single package and everything still compiles. That's not going to work because these packages are very intricately interwoven with each other. And if you update one, then this typically requires that you update others because they depend on the newer version. And when you update those, something else will not compile because it hasn't been updated for the new versions yet. And it's a bit of a mess. And the Stackage people, they resolve that for a subset of Hackage and publish essentially a list of package names and versions. And whenever you pick a package in that version from that list, then you know it will work together with everything else on that list. And we take advantage of these efforts to provide a stable user experience. Okay, so we get packages directly from Hackage. We have obviously all of Hackage, not just the packages that are in Stackage. We have the rest too. But from Stackage, we take the additional version information, then we take additional packages from other places in the Internet, and we provide that Enix packages to the user who then has the ability to configure local overrides at his own local packages, add packages from we don't even know about to his installation and use them within Enix all nicely integrated. The process is pretty obvious. So it works like this. A public shows up on Hackage. From there, it goes into this Stackage arena, which has one repository that's called All Cabal Hashes, and that's a Git repository that contains all of Hackage, that's versioned in Git. You have to know that Hackage does not provide that. Hackage does not provide any kind of versioning or anything like that. They have this one tarball that contains everything they have, and there you go. And if you have this All Cabal Hashes repository that continuously downloads this tarball, checks in the differences, and so you have a Git repository where you can actually see a bit of the history of when a package was added, when a package was edited. These kind of things are visible in that Git repository, but they are not visible on Hackage. So it's a service edited on top, but it's essentially just Hackage in a Git repository. Another nice feature that they add is that they download all those tarballs and compute the SHA hashes for those and add them into the repository. So when we generate built instructions, we don't have to download the packages to figure out those hashes, but they are in there already. I'll show you how it looks. So that's the basis that the Stackage people use to do their work, and then every day they do a snapshot, a Stackage nightly snapshot, they call it, where they basically update everything to the latest version that they can, then try to compile that, then they run into errors and see this doesn't compile, this doesn't compile, and then they manually configure, okay, don't use this update yet, or use this update, but specify some special flag or disable the test suit or somehow mess with the build to make it work, and then at the end of that process when everything compiles, comes out this list of names and versions that is a nightly snapshot, which is the most recent stable package set that you can get. Then there is, on the same source, there is another basically family of package sets, which is the long-term support LTS Haskell package sets, and these work like so. They typically, whenever a new compiler version comes out, they start a new LTS package set, and then they call it LTS packages 3.0, and then they pick the latest versions from their nightly build, whatever they have right now, and then continuously, every week they release a new version of that package set, and they include only minor updates that don't break the API. So when a new package comes out that changes the interface of the library, it will never end up in that package set. So you as a user can say, I follow this package set, and I have production software that depends on the contents of those libraries, then you will never get an update that requires you to modify your software in order to build, right? You have a stable API, but if someone fixes a bug or fixes security vulnerability in a way that's not exposed in the API, then you will get that update. So you're not stuck on a fixed version, but you have stable updates, right, which is the idea. Okay, so these two build products, the Stack Edge Nightly and this family of package sets, they all live in Git repositories too, and these are huge JSON files that basically say for every package, this is the version you ought to choose, these are the flags you ought to specify, run the test suite, yes and no, build the HEDOC documentation, yes and no, all the information is in there. And then we have a tool called Hackage to Knicks, which consumes all of this. So it consumes the entire Hackage repository, it consumes the build information from the Nightly snapshot and from the LTS, Haskell snapshots, and then it allocates some 30 gigabytes of memory because it's a Haskell program you're not a serious Haskell program if you don't allocate 30 gigabytes of memory. And then it writes a whole bunch of files into the file system, into the Knicks package repository, which contains these and there are obviously the one on top, right, the Hackage packages.knicks and these configuration files down at the top. So those are generated by Hackage to Knicks, these are automatically generated. The Hackage packages.knicks contains build instructions for every package that we contain. So it's build instructions for every Hackage, almost every Hackage package. Then there is a common configuration which modifies the build instructions in there with fixes so that stuff works that the auto-generating tool doesn't know how to generate it correctly for some reason. Then there is another configuration layer which applies fixes that are required if you're building this package with a particular version of GHC. And then finally, there is the last step which configures the versions that you see in those package sets so that they match the specification from the LTS Haskell package set. Now users, they basically cannot install any of this stuff directly. It's not possible. You can install the executables. That's possible, but if you have a Haskell library, you can't basically say, I installed this library and then you use it. It's not feasible. What you do is you build this GHC with packages environment in which you specify these other libraries I want to have and then Knicks builds you a GHC binary that knows exactly those libraries that you want. And the place where you configure that is this overrides attribute set which is in your config.knicks file in your home directory. So there you choose packages either from the GHC-specific package set or from the LTS-specific package set and then you can optionally pull in additional packages where you generate instructions with Kabal to Knicks automatically and then this whole process ends up in a place where you can install it and then you have pretty much the entire Haskell ecosystem at your fingertips. So Hackage. In the rest of the presentation, I'm basically going through those boxes each one by one, right? So Hackage, it contains over 60,000 Kabal files which group into about 9,000 packages. So this means that on average, every package releases approximately nine versions, seven versions. This box plot shows you that half of all packages lie within this range. So if you take any random package from Hackage, chances are that it will have between two and eight versions released. So there are some packages that are rare that release have 150 releases by now. So they release, I don't know, once a week or something like that. And there are packages that release a new version every couple of months and many never ever release a new version. They have to have at least one otherwise they wouldn't be there, right? So the Git repository that contains Hackage is just a long, long list of directories. The directory always matches the name of the package. In every directory, you have another directory which matches the version number of the release and inside of the directory you have the Kabal file which contains the build instructions and you have a JSON file which is added by Stackage which contains the hashes. And these Kabal files, they look like this. You have this general section which defines, you see it, right? Your home page, the version number, the package name, general information about the package and then the components of the package are defined below that. You can define a library, you can define executables, you can define benchmarks, test suits and they all have the same syntax and the same structure.  You can very accurately restrict the versions of your dependencies. So you can say, in this case I want the base library only if it's older than version six. So this is a convention in Haskell ecosystem you can't upload a package to the package unless you configure that. And, okay, but from my point of view why do you do that? Why do you say if it's base version five then, okay compile but if it's version six it doesn't exist, it's not there there is no version six, then don't compile. You have no idea whether version six is actually going to cause any problems or not. But that's reason enough for them to say since we don't know that it will work we'll prevent you from using it just to be sure. And since everybody does that and most people actually don't understand the implications of that people have no idea what versions to choose if you have 10 dependencies and each of those dependencies has four different versions then you have a huge permutation of trees of things that you would have to test to see if it works. And then you have a permutation that reflects reality but obviously you can't do that so what people will do is yeah I'll restrict it to the version I've been using and it's fine. And so when people update the base library or transformers library or whatever then all those builds are going to say I won't compile because you have the wrong version and they would compile just fine if the restriction hadn't been there There is another important thing it's this line here it says that this is a simple build a simple build means that this build configuration is actually entirely declarative so this is a text file there's no code ever being executed and just by parsing that file we know everything about the build that there is to know which is extremely convenient if you want to translate these things there is another build type which is called custom and when you have that build type then basically all bets are off what that means is that you ship an executable program the source code for an executable program called setup.hs and the Haskell build system will compile that and run that to configure the build and do the build so at that point you can declare in the file basically whatever you want the program do whatever it wants and those two things don't have to be related so basically when you have a custom build type there is no way to extract the information about the build from the file that you need that's bad for Nix the good news is that the interface to this kind of custom build system is so complicated and so poorly documented that nobody ever uses it and if they use it they use it for super simple things like I want to add an additional compiler flag on the command line somewhere and that doesn't affect us so it's fine, right? but if they would do something that would affect us like we add additional dependencies or we make the existence of a dependency depend on some property of the system or not then we would have no way of figuring that out so this is the other file which is fairly obvious there are these tar balls which contain the software and then we have a whole bunch of hashes for those and we need them to generate Nix expression which looks like this so this is essentially meta information we could do without that so we can describe that build essentially in those three lines that's all you need obviously we need the package name, the version and we need the hash of the tar ball then we have to specify the dependencies we distinguish between dependencies of the library components of the executable components and of the test components the reason why we do that is that when you run the build and you disable tests then we don't need the dependencies that are required purely for the test suite so we specify them separately and if you run the build without tests then the test dependencies will not be included and they won't be required and a lot of Haskell builds can be fixed by disabling the test suite because often times people update their software to cope with the new versions but they don't run their own test suite and they don't update their own test suite and then we run their test suite and say, yeah you haven't updated the test suite and then we just disable it and it still works but they should probably have a good CI system there are a couple of things in Hackage that make the packaging process very interesting one of the extremely nice features is destructive editing so what you can do is you upload a tar ball to Hackage and that contains the cabal file plus all the source code that's the entire package and then you can go to the website and edit the cabal file and change it and what happens is that but it's edited in place so the version changes so they did that then they realized, gee this changes the hash of our release tar ball this is bad and lots of people would complain about that so what they do is when you download the release tar ball you get the old version and then you look into the cabal file and see that there is this X-minor revision header and if it's there then this tells you that there is a new cabal file which you download extra and replace the existing one with that the good, obviously there is nothing in place that prevents people from including that line in the cabal file when they upload in the first place which just breaks I think they fixed it by now but it broke a lot of software obviously the second thing is that this revision number it doesn't show up anywhere so when you install a package then you go to the website and see okay, the build has been edited in some way then there is no way to tell whether the version that you installed is the new one or the old one for Nix, obviously this is a bit of a nightmare so what we do is that we track this revision number we needed the revision number only to construct a URL for the cabal file we don't use that information otherwise and we have the hash of the new cabal file and when you have a destructive edit taking place then the build lock will say something at the beginning, okay I have a new cabal file and then this is downloaded and replaced and then yeah, then you have in-place editing because just making a new release would have been more difficult I suppose there is another nice feature and this is a particularly extreme example you can have all the items in a cabal file can depend on things and make choices conditionally on the value of those things you can configure your build differently depending on whether you compile with a new or an old version of GHC you can change your behavior on your operating system, right, for instance here you say okay, if I'm a windows build then I won't need that but if I'm not a windows build then I need that library and obviously this makes the interpretation of these files a little less straightforward because when we generate the build extractions the right choice would be to say okay, we pass all those conditional trees and then we do some cool optimizing and filter out things that don't affect us and then we generate build extractions expressions that cover those conditionals, right, we say if I am on system Linux then add these dependencies and if I'm on system Darwin these dependencies and we would basically capture that at nix it's just that doing that is actually difficult so we don't. What we do is we assume all builds run on Linux using the latest GHC then we resolve all those conditionals and these are the build instructions that we generate so this means that we have builds that work fine on Linux but if you run the exact same build on Darwin it's not going to succeed fortunately these cases are rare and so rather than fixing our generator which is hard we edit this level of configuration which I showed you, right, this config common where you can add build dependencies and mess with the build expressions in a manually edited way and we do that for most of the packages that need it and it's not that many fortunately but anyway this is an area where the cabal to nix tool essentially has to be improved that it expresses this kind of intelligence in the build last but not least there is a feature which is perhaps the nastiest of all of them builds can say they can define flags these flags are boolean values a flag is anything it's just a string and then you can have conditionals based on whether this flag is set or not now what this build does, first of all it's important to know that whether this flag is set or not is never visible after the build has run so you've run a build and then you wonder does it have https support and there is no way to tell except for trying an https url and see whether it works but the values of those flags are not visible in the version information there's also no way for Haskell packages to depend on a library saying I want this version of the library this flag enabled it's not possible I can't do it so it's a tricky feature the nice thing about those flags is that the value of those flags users can specify it as a user you can say I want https support and then you enable it but if you don't do it then kabal will guess the value of the flag depending on your build environment so if you have these libraries installed in your environment then kabal will say aha I can use this branch and it will enable https and if you have this library but it's say version 2.1 then it says yeah that's too new and then you don't have https support and also this is something that we can't express in nix because sometimes people use these flags for something that's actually useful they say I don't know and then they enable additional optimizations or something like that so we would like to offer our users the ability to say I want this package and I want it with LLVM so our build instructions would technically have to contain some boolean parameter that's called https support and then as a user you can pass true or false and get the build with the appropriate flag set or disabled and this is also something we currently can't do what we do instead is that we have one global list of flags where we for every package specify the flags that are specified and for most parts we just let kabal guess and see what happens it works good enough okay the next box in this diagram was stackage stackage has about 18% of package covered and when you want your package in stackage you actually have to register with them you have to say this is my email address this is my twitter name this is my github account these are the packages I'm responsible for you have to promise that you will fix build errors within a reasonable amount of time you have to have a backup administrator in case you're on vacation and then once you've registered in the database your packages will be part of stackage and then you're part of a sort of package that updates things and informs the authors if there are problems and then they respond quickly and then you have this stable package set this curated package set stackage runs all these builds in github travis ci which means it's only linux builds so when you get information from stackage that says this package in this version is going to build fine then it's not necessarily going to build fine on a mac next we do have a mac we do have support for that platform so mac users or basically anything other than linux users don't get the full value out of this whole LTS effort because their platforms aren't tested then there is I talked about that already the build products are these nightly snapshots which is the latest possible version so that everything compiles there are LTS minor releases which are released every week and contain updates that don't break the I and the major releases they may break APIs but they are rare we are now at LTS major version 3 so 4 is going to come out together with gcc 7 12 3 I don't know we are not at 12 we are 10 right okay so the code program that does all the automatic stuff these are these two tools kabal tunics and hackage tunics they live on github and actually all the intelligence about how do you generate a build expression what kind of exceptions have to be configured in and so on is included in one library and then both of these executables are just front ends to that library the kabal tunics tool is supposed to be used by users when you say I have a kabal file give me a nix expression that builds it that's what this does the hackage tunics executable on the other hand says give me hackage stackage and then I generate your nix package so it updates the whole package set and people are typically not supposed to use that instead we have this run this update nix packages script that's run automatically and so basically once an hour we take all the new versions all the new information generate a new version of nix package commit it into a separate branch first of all so that there is some testing we have a hydra instance that continuously builds all that stuff and only after we have seen this stuff is really stable and it really works then we merge it into master so basically updates on master they could in theory appear once an hour so in theory if someone uploads a new package we would have it 60 minutes later at most the factor we merge to master I do it manually so whenever I think of it I merge it and it's every two or three days so basically if you're following the master branch of nix package you have an accurate representation of a package that's within two or three days which is I think pretty good okay so now the nix package machinery is interesting in itself I just have to check the time because we're running out of time the package set there is what we have is we have this one attribute set which contains the builds for all the packages that we feature and what you see is this is what it looks like we define for every package an attribute exactly the name of that package and then there is this whole package thing that you probably know how packages are defined in nix the only difference is that here we don't refer to a separate file but instead we have all the expressions in place so there is one file and it's completely self-contained and then we have for every package the latest version which is the one that has this only package name attribute and then we have typically older versions that are required for LTS support and these have their version number added to them at the back so when dependencies are resolved only the packages without this kind of suffix are used so when you say I depend on MTL you will get the latest version and when you say I want to depend on MTL <IP_ADDRESS> then you have to say that explicitly you get the latest version by default so this package set is implemented as a recursive function and this is a it's a lot of fun when you know about how it works but I suppose it's new for many people the idea is that this package set is a function that function produces a package set and as an argument it gets the package set that it's going to produce the the idea is here is a nice example where you can see how that works you have this package set which gets itself as an argument then it defines those two attributes and then it defines this attribute which refers to these attributes via itself and so when you when you compute a fix point this is the point where the argument and the output are the same then you compute this function when you expand that self argument again and again and again you end up just repeatedly calling PSPSPSPSPS and at some point this package set contains normal reference to self and when it doesn't reference self self is not computed because it's lazy evaluated and then the computation finishes yeah yeah you have this construct in NICS you have this recursive attribute set but the recursive attribute set doesn't work this nicely because it will be clear after this example one thing why we do this, why we structure the package set in this way is that this makes it really convenient to modify the package set in a way that looks like object of oriented inheritance so what you have is you have this function which as arguments takes a recursive package set and it takes another function and this function takes a recursive package set and then it computes changes it's going to make to that package set and returns the result as another recursive package set so when you when you take this example and you compute the fixed point without any customization you will get foo bar as a result but when you apply this function to modify it this function here then you have the function right it has its own output it has its input and this is a change it specifies to be applied to the thing so in here we replace foo reversed and when we apply this we get this output so we have modified the package set if this had been a recursive attribute set in the nix sense then the self argument wouldn't have been necessary right but in this case this would have bound tighter than any modification you could make if you would modify the foo value of that package set you would not modify foo bar because this has already been bound yeah so you can basically whenever you want to modify the package set you can choose between give me the value from above and I modify it and return it as a result or you can say give me the result of another modification so you can refer to basically a series of overrides that happen and you can here in the inner one refer to a result that's going to be here so this is an extremely flexible construct and the package set I'm going to come to an end and the package set this is it that's the actual code we have the Haskell packages this is the file that I showed you which contains all the build expressions to that we apply this common configuration which fixes missing dependencies or which adds other libraries that we want to enable flags during compilation then we extend that with the compiler specific configuration then we extend that with the package set specific configuration that gives you the version information then at the end we extend that with the user configured overrides that you can specify to change it and then we say fix then we get a result where this original package set that we once generated automatically may look completely different it has different versions different build inputs you can do with it whatever you please ok and this stuff are the other three slides I'll save for another talk ok thanks for the talk Peter we have a couple of minutes to understand what the fix point is so should, should don't be shy ok ok I think I already asked you probably a few months ago but how could we reuse this functionality which extends and overrides into other languages as well because I see it as a common piece that if you generate something from whatever stackage or pipi or bundler everything and then you build this set and you need to overwrite a few different layers could we then kind of abstract this and kind of create this more unified way how to approach languages and import them would that be an option technically it's absolutely feasible basically the entire infrastructure that you need for this are those two functions this is the real thing they are not more complicated than this this code is in the package set it's there it can be reused so everybody is free to use that approach and structure the packages in such a way that you have this base package set which is kind of the bare default and then you can have layers of configuration added on top of it and it's not difficult to do the thing is it's effort you have to do it so for instance I also generated the package set for R for the R utility and it's some I don't know 7000 packages in there and it's not structured in this way because at the time when I did that I had no idea about this stuff so these days every time I have to work with the R package set I think man this is a mess and it should really be cleaned up actually I once grabbed packages for fix and const and such functions and there are maybe three or four places where those functions are defined because they are so useful so maybe include them in the live lip yeah yeah so actually I think we should probably use this for Nix packages at the top level because right now Nix packages has a pretty ad hoc override mechanism which is really a undisciplined way of doing this so there is sort of as Nix packages actually defined by passing itself into itself and then some complications for being able to refer to the unoverridden version so yeah this would be much better so we should probably look into how we can do that somebody should do that we should open a GitHub issue sorry it's right, Nicholas has actually taken the effort upon himself Andy? I think there may have been some start already by factoring out the package overrides mechanism which is well it's the same mechanism again or very similar and there have been some changes recently that this well it's factored into a function I think that you can say I want these packages and apply a package overrides and get it as a package set not just in the general way that you edit it somewhere in .Nix package config I'm sorry I have very practical question the older versions of libraries we keep them just for LTS so we can't rely on them being in Nix packages like tomorrow or like rather after the next release of LTS theoretically we could say we drop support for LTS Haskell 0 point something and if we did then packages required only by that version would go away that's true the reality is however that the number of versions we ship is only going up so personally I think that this whole intelligence that selects which package to include and which ones not that should go away entirely we should just say we have every version on package period that's what we should do it's only a matter of what's the implication on the Nix tools in terms of memory requirements parser performance these kind of things we have to figure out but I think that the versions we distribute the number of versions that we distribute is going to go up only it's not going down I think so I actually have two questions like the first question would be what does the stack tool like do you have any thoughts on this the stack utility is a kind of advanced version of install it's a build driver so you can write a very simple json file yaml file where you specify I have this package I have these dependencies and then you just say stack build and it's doing everything automatically it downloads the packages compiles a dependency sets up a sandbox for you it's all very convenient and it's very nice and I use it myself it's a great tool it interacts perfectly with Nix there is no problem if you have if you use Nix to install a compiler in a library environment and stack sees that it needs some of those libraries that you already have installed then it will reuse them and it won't compile them so in theory you could say in your stack file I use LTS version 3.3 and then you configure GHC environment in the LTS 3.3 package set which contains exactly those packages that you need and then you would run stack build and it wouldn't compile anything because it's already there so in a way the two tools complement each other it's I guess the advantage of stack is that it's very ad hoc-ish you don't have to write a Nix expression save it somewhere enter a Nix shell leave a Nix shell you don't have to bother you can just run stack and it works but I think it's if people want to develop with stack and use Nix at the same time it's just working just fine no problem at all thank you and my second question would be when you clone Nix packages what's the percentage of Haskell packages in there I actually wrote an email about that a while ago but I don't recall the numbers it's significant I think we have Haskell packages are something like 12,000 I think at Nix packages as a whole has maybe 15,000 or something like that not including the Haskell packages so it's a large large chunk but in terms of how much space it takes up in a repository I think it's probably even bigger the percentage of Haskell packages because we have packages, synopsis, all this stuff that we take from the compile file which many packages don't have so it's hard to say but it's a fairly good part of the distribution


I wouldn't call it a victory, it's not a defeat, it's a bit of a step forward in the sense that the appeal has been granted some conditions upon the USA and so we continue the campaign and above all we appeal to friends in the United States and Australia and obviously in this country to not just keep up but step up the campaign in support of Julian Assange. Julian ends up in a maximum conspiracy prison for the rest of his life as a defeat for every good journalist all around the world. It becomes an act of self-censorship on every journalist around the world. Julian's crime telling the truth about war crimes.


How do you keep your your sanity because right now it seems like everything's imploding the freedom to go out and touch something real touch some grass enjoy nature as our lives get more and more digitized as the internet sucks us ever in I think it's I think real life I think breathing fresh air things like that is going to be one of the most precious things I just switch off because markets will be there when I come back then same thing how you keep your sanity probably I probably don't. The way I would keep my sanity dealing with crypto was I would honestly I would just not look at it for like three months at a time you can always come up with a strategy right whether it's a DC a strategy or whatever and and and they just kind of forget about it for a while these times do chip away at my sanity sometimes yeah exactly well said and I'll just tell everybody like this try to control the things that you can change and don't worry about the things that you can't there's a lot of things in this market that you cannot so just step away you'll be a lot happier.