Okay, last time we were dealing with some application of the residue theorems theorem. And now I want to enter in the details I left for this case, right? For the integration of a rational function over the reals times x alpha minus 1, where alpha is smaller than 1, alpha not real, okay? This is the interesting case. In general, you can take alpha to be real but not an integer, but then you reduce to a polynomial times something which is like this, okay? So the assumption we made is that this tends to 0 as z tends to 0 and z tends to infinity. And if you remember, I just made a slit in the plane because 0 is a branch point. Remember that in order to define this power, we have to introduce the logarithm and the logarithm is not defined in 0 but it means it is not defined in the neighborhood of 0. And we considered as a region G, the region which has contours as follows. We have two circles centered at the origin. One of radius R, I say CR1, CR2. I don't want to use capital R for the ray because capital R is also the rational function, okay? And then I also consider these two segments parallel to the real axis and I use this orientation, right? So what I am trying to do is to apply the regular theorem for this case, for this class of functions, all right? And we have this choice of contour. So the region G is this. So I will consider then the residues inside the region G and the boundary of the region G is CR1 where CR1 is this part of the circles of radius R1 plus L2 plus CR1 minus L1, okay? Plus L1, sorry, the orientation is this, okay? So this is the contour. And if I show that the contribution on the circles is vanishing as R1 times to 0 and R2 times to infinity and if I show that these two contributions on the segments which will become the offline zero infinity are in fact the ones you are considering, you can calculate this integral using the residue theorem, right? So let us start by considering this situation. Let us take mod of Z equal to rho and consider this function here which extends to the plane this which is defined only on the real axis. So Z is some rho times EI theta and theta bar is, okay, in general. What I can do is the following is substituting, substituting the Z with this, I have the DZ is I rho EI theta D theta and therefore the integral, this is plus, no, this rho is general. What I want to show you is that, okay, G is a region, G CR1 plus L1. Okay, okay, okay, thank you. So your question is about this symbol here, right? So if I say union, I mean a union of sets. When I say sum, I already use this symbol, sum for curves. It means that I consider the function without just the position of curves, okay?  So as a set, the boundary of G is in fact this set union the other sets. But as a function I use this notation because I can just consider one curve. So reparameterize the segment from 0 to 1, for instance, and stop at T1, then consider the other which begins from here where the other ends, continues up to here, then and so on and so forth. So this plus is in general adopted as a symbol when you consider in say in topology, okay? The curve which is obtained by just the positions of curves, okay? And the symbol plus, you can also take actually a combination of curves putting some coefficients, normally integers, which means that you consider, for instance, the same curve count several as many times where the orientation over the reverse orientation, okay? According to that, the sign is positive. So if I understood the question now, I adopt this notation, which is the one where we also use some, in some previous example probably. Well, I used this last time when I consider the Laurent series, remember? Okay, let us come back. We consider neighborhood of a singularity. Yes, and we consider two circles, n-side the annulus. Remember this? We consider this and this. These are two circles. We consider a segment connecting the two circles. And then I consider as a curve C1 plus lambda minus C2 minus lambda, right? I use this notation here. Check it. Check on their nodes. What I meant was the following. You say, move this way, go this way, then move this way and come back. And this becomes a closed curve. So the symbol I used here is exactly like the ones I'm using here, okay? So what I'm doing in this calculation is to show that in order to calculate... So when I calculate the integral over the boundary of G, the contribution along this portion of the circle is the zero. When the radius tends to zero and the small value tends to zero and the other tends to infinity. Okay? And so let us continue here. With this substitution, this becomes the integral between zero and two pi of what? Of I times rho EI theta square, rho EI theta. And then I have something, rho EI theta, right? Not square, sorry, alpha minus one, sorry, alpha minus one, the theta. Which means that... Notice that this is rho EI theta and this is rho EI theta alpha minus one, correct? So I have that the integral is in fact the integral between zero and two pi of rho EI theta to the power alpha r rho EI theta d theta. And this from our assumption tends to zero as z tends to zero or infinity. Which means as rho tends to zero or infinity. And this applies either for r1 or for r2, okay? Good. Now, so the integral over the boundary of G is in fact, is the integral over CR1 over the same amount. But these two integrals are infinitesimal as rho tends to infinity or as rho tends to zero. Okay? And then I have the two integrals over L1 and L2. Well, L1 and L2 are the two segments, different opposite orientation parallel to the real axis at a certain distance, positive distance from the real axis. So they are symmetric but with inverse orientation. Okay? So we are moving like this, then like this, like this, and then like this, okay? Now what is the problem now? It's how to write z alpha minus one in the two segments, the problem. So now we have to be careful about the notation. Remember that z alpha minus one is a definition, the exponential of log z. And this is the complex logarithm times alpha minus one. So that this becomes, right, x of alpha minus one log, this is the real logarithm. And here, when I write this way, I mean that I've made a choice of the argument, all right? And if this is true in L1, using the same notation in L2, we have that z alpha minus one becomes x of alpha minus one logarithm. And this is the same, you see, because the distance from the origin is the same, points on L1 and on L2. So it is independent of the fact that they are symmetric. But theta becomes 2 pi minus theta, right, on L2. So L1 is here, this is the real axis, this is L2, this is L1, and this is L2. So if this is the angle theta, sorry, theta, this is the angle 2 pi minus theta. In order to use the same principle argument in the definition of the functional log, okay? So when I have to calculate, so I just put, therefore, when I calculate the integral, the integrals over the two segments, I have, well, in fact, this is the integral, all right, the z as x plus i delta. Delta is the distance from the previous picture, I could put this delta, okay? This is the distance from the origin. So z is x plus or minus i delta, that is constant, right? And x varies, so we are integrating over the reals, essentially. And the two extremal values of the integration, for the integration, is R1 and R2, precisely the center, the radius of the small disc, small circle and of the big circle, right? Remember that these two L1, L2, where, this is a zoom of the previous picture, right? Where in G, the two segments cutting parallel lines, the annulus, okay, center at the origin of radius R1 and R2. So x is moving between R1 and R2 here and here. Therefore, the integrals reduces to the integral over the reals sometimes, because delta is fixed. And I have, so using this notation, I have that this can be written as z alpha minus 1 Rz dx, say, okay? And plus, this is the integral of what? Well, remember that, as I said, well, probably I said, but I didn't write it explicitly. So z alpha minus 1, I write it here again. z alpha minus 1 is xp of alpha minus 1 times log mod z plus i theta in L1. And this is xp of alpha minus 1 log mod z plus i to pi minus theta in L2. Therefore, we have that this is, okay, like the other one with a minus here, but then I have a coefficient 2 pi i alpha minus 1, which come out. So we have the same amount with a minus in front, but I have also, I have xp of 2 pi i times, sorry, yes, times xp. You see this? 2 pi minus alpha. And I have to multiply this entire value of the complex logarithm times alpha minus 1, okay? So there is an extra term, 2 pi i alpha minus 1 as part of the exponent. So here I have, then the integral, this is the integral over, this is L1, say, this is L2.  And I inverted R2 to R1 because I'm integrating over L2, probably vice versa, right? This is R2, R1, vice versa, I don't remember, sorry, the orientation, okay? But I have to revert because in one case I'm moving from the right to the left and the other from the left to the right. So when R1 tends to 0, so probably this says yes, okay? When R1 tends to 0, no, what I had here is something different. Sorry, sorry, sorry. This is R2 integral e 2 pi i. This is what I finally have, the integral in between R1 and R2, sorry. 2 pi i alpha z alpha minus 1 r z dx, where this is the integral. Now, changing the sign and putting together, I have this coefficient coming out which does not depend on x and on z in general, this is constant. In other words, when I then consider the case that R1 tends to 0 and R2 tends to infinity, on the right-hand side I have what I'm looking for times a constant. So the integral between 0 and plus infinity of this integrand function times this number, which is... and on the left-hand side, I have the sum of the residual sum 2 pi i included in the plane with the slit from 0 to infinity because the contribution on the portions of circles are vanishing when R1 tends to 0 and R2 tends to infinity. So to conclude, this is an application of the theorem. I have the integral 0 plus infinity times 1 minus c 2 pi i alpha is 2 pi i sum of the residue of the function f j alpha j in G. And G is the general situation. G is in fact... So this is the application. So not simply the sum of the residues, but to be divided by this constant, which comes out from the calculation. So the two contributions do not cancel each other, but give you something which appears here. So let us probably see in one of the examples I wanted to consider. This is the one we consider, right? 1 plus x. So in this case, R of z is 1 over 1 plus z. And so we have that z to the alpha times R of z and alpha is in between 0 and 1, right? So this is in fact infinitesimal as z tends to 0 and as z tends to infinite. Because this is a rational function. The order is 1. The denominator is degree 1. The numerator is degree 0. When you multiply this rational function times z to the power alpha, alpha is positive. So you have a numerator which is infinitesimal as z tends to 0. The denominator tends to 1, so no problem. But then when z tends to infinity, the degree of z is 1, which is greater than the degree of the numerator, which is alpha, so that it goes faster to infinity. So the denominator goes faster to infinity and so the ratio tends to 0. So we have the hypothesis 5 to apply the theorem. And there is only one residue for R of z. And 1 pole is minus 1 for R. So it's not only on the positive relaxing, which is good because we're integrating between 0 and 2. And so it's quite easy. This sum reduces to 1 summand. And what is the residue of the function f at minus 1? The residue is minus 1 to the power alpha minus 1, y. Well, the function f of z we are considering is z to the power alpha minus 1 over 1 plus z, which is a pole in minus 1, sorry. So that if I consider the limit as it tends to minus 1 of 1 plus z times f of z, in this case I have to write 1 plus z. And then this is what? Minus 1 to alpha minus 1, the power alpha minus 1, right? So that this number here is to be calculated. Is it normally a real number? No, it is not. We are calculating some root of a negative number. So in general this can be odd in the reals. But in the complex number we can do this because we can write minus 1 as the logarithm, sorry, that's the exponential of the logarithm of minus 1, right? And this is the exponential of logarithm of modulus of 1, which is 0, right? And what is the argument of minus 1 pi, right? Plus i pi, this is the principle argument. So minus 1 is in fact at e i pi. So this number here is e i pi alpha minus 1. Or this is e i pi alpha times e i pi with a minus in front. What is this number? Minus 1 again. So this is minus e i pi alpha. So this is the residue. So if we apply the previous general consideration to this particular case, we can say that the integral we are dealing with is 2 pi i times the residue of f at minus 1 over 1 minus e 2 pi i alpha, correct? But in this case, this is 2 pi i. The residue is minus e pi alpha and then I have 1 minus e 2 pi i alpha. Then I notice that this expression can be somehow simplified. And the following way I write e pi i alpha to be u. Therefore the integral which was 2 pi i minus u over 1 minus u squared, right?  This is never 0, right? For any choice of alpha, e 2 pi alpha is never 0. And here I recognize up to the sign. And so I change again. I have 2 i over u minus u minus 1 times pi. And this is the reciprocal of what? The sign of alpha. Because remember that u is this. This is 2 i, so I write this way. E pi alpha minus pi alpha pi. So I have that this is pi over sin pi alpha. Complex sign. And this is the final expression in our calculation. So which can appear to be difficult but it's much easier than to try to use standard integration properties from the real. This is an improper integral which is normally not very affordable. As I promised, I don't want to make you become such, to annoy you with integrals. And let me continue by saying something else. That is to say, let me add some comments on closed curve. So again, I will use the notation and I explain once again why I use plus minus and so on instead of using. So in fact, you can consider the curves and to put some algebra structures on curves on the set of curves which is quite important to make chains of curves. Then you apply for instance homology and homotopy techniques using this notation. I will not go into the details. However, let me say that this is quite standard to think of. To put a coefficient in front means to consider this curve re-parameterized and counted with positive or negative orientation according to the sign of the coefficient you put in front. The sign is always an integer. The coefficient is always an integer. So let me just give you a geometric application of what we have known about the complex line integration. So you probably all know but I guess none of you have seen a complete proof that closed-injective curve, continuous-injective curve, is a Jordan curve. So no self-intersection are allowed and the curve is closed and continuous. That is essential, continuous and not self-intersecting. Then in the complement as two components, one is bounded and the other is unbounded. This is the famous Jordan theorem which states for the circle it is easy to see. So any deformation of the circle in some sense, this topological stuff, any deformation of the circle but without overlapping. Imagine that you have an elastic band and you move it. So you can make different shapes but in a sense from a topological point of view you are always dealing with the circle. Until you overlap the bands then this changes a lot in topology. You are dealing with the circle. So it is quite natural. It is obvious in the circle I have something which is bounded and the other component is so not in the circle. In the complement of a circle you have something bounded. This is not very easy to prove in general. This is the famous Jordan theorem about Jordan curves. However what we can do now, we have enough instruments to say that in the complement of the Jordan curve we have at least two components which is a weak reformulation of the theorem. In order to prove this we apply the fact that we know something about the index of a point. Let me just remind you the basic notation for Jordan curves. Jordan curve is a continuous closed curve. In fact you can define also a Jordan path and then consider a closed path to be Jordan if it is a closed curve which is also Jordan. Jordan means which is injective. To be more precise I have the curve gamma to be defined in A, B into C, the plane curve. Then I have the gamma of A is gamma of B so it is not injective in A, B in the open A, B. Gamma of T is different from gamma of S for any T different from S and T and S are in A, B. It is not injective in A, B because gamma of A is gamma of B because it has to be closed. No other points are allowed to have the same value in the segment which is quite natural to consider. You can have different pictures. This is one example. This is another example. Now assume that we start from a Jordan curve closed Jordan curve not passing the origin. We also assume that there exists Z1 and Z2 gamma such that this is our gamma. We call it this is Z2 and this is the gamma such that I have that the two points Z1 and Z2 divide the curve gamma into two arcs called gamma 1 and gamma 2. For this properties gamma 1 is not intersecting the negative real axis and gamma 2 is not intersecting the positive real axis such that call this part of gamma from Z1 to Z2. According to orientation which is implicit with the definition of the Jordan curve gamma. Consider this path gamma 1 and the other gamma 2. Assume that gamma 1 has no intersection with the negative real axis and gamma 2 has no intersection with the positive real axis. This can be always done because since 0 is not contained you can always move this curve or if you want the frame in such a way you put the origin in the middle and separating the two arcs the two paths gamma 1 and gamma 2. So, just a matter of how to then if this is the case and then I have the index of the origin with respect to gamma is 1 and I show you how. And first I indicate by L1 this segment so L1 as the this is the statement okay this is kind of proof. So, call L1 that segment from Z1 to the origin of course it is oriented I choose this direction and L2 is the segment from Z2 to the origin right. Then the origin stays away from the curve the curve is continuous so that I can consider a small circle center such that doesn't intersect the curve gamma okay. Now but it intersects for obvious reasons this segment segment L1 in C1 and the segment L2 in C2 so Cj is Cj that's obvious because the segment Lj connects point outside okay but in any case it connects the origin with something else which stays away okay. Now I restrict my consideration on this is the C but then I put well C1 and C2 the two portions of circles which are with endpoints C1 and C2 so respectively this is C1 and this is C2 okay I use this notation and the part of the segment in L2 from Z2 to C2 I call it delta 2 and this from Z1 to C1 delta 1 alright just names okay C is C1 plus C2 okay so if you want to see C to be a curve then I prefer this notation if you want to see it as a subset of C I use the other okay good. So then I define so keeping in mind this picture I cannot write everything on one slide but keeping in mind this picture so define sigma 1 and sigma 2 the two paths are the following so I show you first what I'm doing I'm just considering this and this okay so if you follow my if you follow the orientation we have given to the curves so this is a positive orientation okay then if I use this orientation I have gamma 1 then delta 2 then minus C1 minus delta 1 to define sigma 1 for instance okay. So gamma 1 plus delta 2 minus C1 minus delta 1 and similarly I define sigma 2 as well I have gamma 2 then delta 1 minus C2 and minus delta 1 okay and I have you know I said gamma 2 plus delta 1 minus C2 plus delta 2 so and this probably also gives you an explanation why we prefer this notation instead of union okay because when I have well I notice that sigma 1 plus sigma 2 is what yes gamma 1 you can it's gamma 1 plus gamma 2 which is gamma sorry minus C1 minus C2 this minus C probably I put it wrong it is minus delta 2 right but let us check okay gamma 2 delta 1 minus C2 minus delta 1 minus delta 2 sorry okay so the contribution of the integral of this sorry of the of the segments cancel each other okay. Now I have that this number here is what and gamma 0 minus n gamma C but I can also say I can also say that n gamma 0 is n C1 0 plus n C2 0 plus n C 0 now you understand why we prefer this sum and minus in front of the curves okay because well this is a close this is the sum of two close curves sigma 1 is a close curve sigma 2 is a close curve right and we calculate this remember that the index was linear using this this definition of sums of curves right close curves so on the left hand side I have this and then this and this on the right hand side which means that if I calculate the integral of gamma so what I said is wrong here sigma 1 plus sigma 2 right this is what I have on the other hand this means precisely this because of the additive property of the integral of a curve if you have a sum of two curves and you have the integrals summed so it's essentially okay the two curves are the contours you are in where you are integrating and they are two split curves right but what can we say about this value here this is 0 and this is 0 0 no sorry this is 1 and this is 0 as well why can we say so well first sigma 1 has 0 by construction and the unbounded it stays away okay from it is 0 in the unbounded component and similar for sigma 2 the index is 0 because it is in unbounded complement in unbounded component of the complement right in unbounded component of the complement sorry whereas for the circle the index is 1 good so with this in mind let us go to the second part which is the interesting part and this time we consider this is Jordan lemma but say weak version which stays there for the complement closed Jordan curve has and then this is the weak version at least two connected components so we start from a closed Jordan curve with some hypothesis about the frame we are referring it so such that gamma as a set is contained in this half plane I write it this way because probably use it some other time later h plus is the set of complex number whose real part is positive so the right half plane and when I use this with plus on the top of h I mean the set of C and C such that in C is positive this is another half plane just the rotated half plane okay so I also assume and this is not this is without losing any generality for the curve is there so which means that in case I move the frame on the left right and I can also shift vertically the frame in such a way that there are two points on the curve one in the upper half plane h plus and the other in the lower so and such that there exists Z1 and gamma and C2 in gamma and M Z1 negative M Z2 positive okay so the situation is the following so for instance if I had a curve like the other one had to move the frame this way okay and this is always possible so you simply shift everything in order to have a picture with at the end of this okay I'm assuming that entire okay let me let me make you a picture so these are the assumption let me make a picture here so we are essentially considering a curve which is close and in this right half plane h plus with plus whose plus means real part positive but that the curve could be also in the this first quadrant for instance so what I'm assuming is that well now this is not the case I'm interested in and I want the curve like this so there are points here this is the one and this is the two for instance okay this can be done because as I said you can shift the frame as you want okay good now well let us start from this okay so here is the origin so the origin is not is in in the unbounded component of the complement of okay what I can do is well I can join these two points sorry this is the one is here right and Z2 is here Z1 is here and what I have is that it is two segments eventually intersect the curves into other points here in two points and here also in two points okay so I can over the sticks my consideration to what to two points Z1 and Z2 in the respectively in the lower half plane and in the upper half plane we call lower plane the the half plane of the gas plane whose elements have imaginary part negative so lower upper means imaginary part positive then they say right half plane the plane where the curve is that is the plane the half plane where whose elements have real part positive and then the left half plane okay so up low right and left this is just by convention okay but what I'm saying is that you can always assume that in fact the Z1 and Z2 can be chosen in this curve in such a way that there are these two points the Z1 and Z2 okay and this picture what I mean is that the entire segment 0L and Zj connecting 0 to Zj does not intersect any point of gamma okay right so we are say in a situation like this so we can assume I put this this way we can assume that the segments 0Zj j are such that Lj and gamma has no intersection okay it's not realistic at all now so let us go to an enlarged picture like they have here this this and then I put maybe this is another example so I put Z1 here and Z2 here okay just to be to have a larger picture because I have to add some extra extra rays and so on okay I could continue on the other but it would be too difficult to then to see the differences okay so this is what I denoted by L2 and this is what I denoted by L1 and I consider the segment sorry the segment the portion of the curve from Z1 to Z2 to be called let me say gamma 2 and from Z2 to Z1 gamma 1 these two points are distinct and they are the endpoints of two paths Jordan path gamma 2 and gamma 1 assume that we have also this orientation and that we choose this orientation for the segments as I said connecting the origin to the four point Zj so this way so gamma is gamma 1 plus gamma 2 once again what I mean is move and continue okay this plus means the fall and I define this time sigma 1 to be what I have L1 this this okay L1 and then minus gamma 1 minus how 2 and I have sigma 2 to be L1 plus gamma 2 minus these are two closed alright so sigma 2 minus sigma 1 is gamma in this case but in general it can be plus or minus if I have the difference of that is these two closed curve have plus or minus gamma okay so I have in this case with this notation of this other possibility because I've chosen a in any case the difference of these two closed curves is plus or minus gamma good so now let me let me make some observations which depends deeply on the fact that we are dealing with continuous functions but these two points have imaginary part as you want to which are one is positive and the other is negative the imaginary part of a continuous function if you think that this is function from an interval a to c sorry this is gamma right this is a continuous function so it can be viewed as a pair of functions which are continuous and in the complex planes that the pair correspond respectively that the first element is the real part and the second is the imaginary part right so if you say that gamma t is x t y t and this is also this x t plus i y t that is z of t since this is positive and this is negative and y is continuous then necessary it is a zero so that I can say that gamma 1 intersects the real axis and similarly gamma 2 intersects the real axis as you can see here gamma 2 in this this picture this is just an example okay intersects in more than one in fact this is the this is a consequence of the statement okay any continuous function in an interval this is a real real valid continuous function in an interval and assume that on the end points the values are such that their product is negative okay so one is positive and other is negative right this is only possible then there is at least one zero this is the existence of a zero but nothing is said about where it is and how many there are right in fact in this case there are more than one here there is only one okay for this path we have one zero but for here for this path we have for this function we have more than one actually to apply the zero theorem existence of a zero for a continuous you have to see it as the projection okay just to see it on the imaginary axis however what I'm saying is that well define x2 to be an element to be d element in gamma 2 intersected there with with maximal distance from the origin so I choose this okay what can I say now with this picture in mind I continue and I say well what about the index of x2 with respect to sigma 1 let's go this way x2 is defined as the element in gamma 2 such that it is a real number so the imaginary part is 0 maximal distance from from the origin sigma 1 is this closed curve so I can definitely say since the curve gamma is Jordan so it is injective that you cannot have self-intersection x2 is in the unbounded component of the complement of sigma 1 it cannot be in here because otherwise the curve would have self-intersections so I can actually say that this number is 0 remember that we have proved that for any point in the unbounded component in the unbounded component of the complement of the curve the index is 0 correct so what I say now is the following this is 13 right in particular this implies that n sigma 1 of z is 0 for any z in gamma 2 because remember that we have proved that this is true for any element in the in the component so it's property of the component over the point the index is constant on the component right and since gamma 2 is continuous path any point stays in the same component cannot be in different components so alright now using the same picture and the previous lemma fx is here and so very close to the origin on the real axis positive relax but very close to the origin we have that the curve sigma 1 and sigma 2 are surrounding okay the region where x lies okay it can be considered as the 0 of the previous lemma so if x is very close to the origin the origin is one of the points of the curve sigma 1 or sigma 2 but x plays the role of point okay of the pointed origin in the previous lemma and therefore we can say that if x is a real number such that modules of x is smaller than epsilon for a suitable choice then this is true for lemma 1 now we are very close to the end so let us go back to this picture so consider as we did here x1 to be the first of the intersections of gamma 1 with the real axis the first in the sense that we have segment AB to consider so if x1 as parameter T1 associated to it so the other points which lie and gamma 1 intersect to R are such that their parameter associated is greater than T1 okay so it can be only later if you give the role of time to the parameter T that gamma 1 of T intersects the real axis so I consider this point x1 in this picture there is only one so there is no no extra choice but so in general take x1 to be let x1 be the first in terms of the parameter point of gamma 1 and intersect with R which is not empty remember this is not empty so there is at least one if there are many choose the one with parameter associated the smaller okay it's not necessarily the closest to the origin but is for instance in this case assume that there is this is the closest but it's not the first the first is here okay if you use this parameterization this is the first this is the second third but this is the closest not the first in the sensitive the first from the left the first according to the parameter chosen okay good now what can we say about this the index of this point x1 with respect to sigma 2 let's go back to this this is sigma 2 and this is the point x1 okay it plays the role of the originals before okay in the previous lemma and this number is one okay good but this means then n sigma 2 of x is one for any z and gamma 1 as we said before any points on gamma 1 lie in the same each point lies in the same in the same component of the complement right so that the index is the same now between x1 and x2 these two points are separated the curve is Jordan all right so there is at least one x not actually there is an interval okay this is the first this is the last but I can say more you can find minimal distance between the two points in gamma 1 and gamma 2 this is an interval this defines an interval on the real axis and any point in this interval at this property there exists an interval real axis such that call it I okay such as if x is in I so the interval is clear this one this interval is with one and point in gamma 1 and the other gamma 2 that such that if x is in I we have that the index of this x with respect to the curve gamma is one put it together the previous result so the origin is outside the index is zero and for at least one x different from zero the index is one so there are at least two components that's what we can say okay as you can see it's not easy to even to prove this minimal so not it's not very direct the very direct it's an application of this in terms okay now this ends the part of consideration about integrals and application of the integrals let me go for a why just an introduction to what we will be the next topic this is up to my choice of course so we have seen that there are several topological instructions to to have sets to be homeomorphic right the mug the torus the donut one of the exercise in topology similarly there is no hope to have homeomorphism which extend to something which comes holomorphic between the annulus and the disc okay assume that we are looking for a function F which is holomorphic in the annulus such and with inverse G define on a disc there is no hope for topological reasons okay because any homomorphic function in fact continues it would then we would have a continuous function with the inverse continuous from non-simply connected domain into a simply connected domain we also know that there is no possibility to have in general a homomorphic yes we cannot have a homomorphic function with inverse between any pair of simply connected remains and Louville theorems in fact is an obstacle to this take the plane which is simply connected take the disc which is simply connected domain of radius whatever you like any function which is holomorphic in the complex plane takes its values and the disc so it is bounded and entire then as it is constant so there is no possibility to have a one-to-one correspondence right so the next topic is about well about the definition and so the description of possible sets which are in fact by holomorph which means that there exists a function from one set to the other holomorphic with embers which is also holomorphic Louville theorem is somehow special result because we can prove that in some cases even unbounded simply connected domains and bound the simply connected domains can be by holomorphic and one classical example is the unit disc and the upper half plane or the right half plane which is just the rotation of the other so we will investigate in general what happens for biomorphic functions and sets which are biomorphic set which are biomorphic so we give this definition definition to sets omega 1 and omega 2 and c are set to be by holomorphic or sometimes you can find by holomorphically holomorphically equivalent if there exists f from omega 1 to omega 2 holomorphic with embers holomorphic okay so of course there are some as I said topological restriction for two sets to be holomorphic to be biomorphic and such a function f or g f is said to be by holomorphism of course also g okay in particular we may wonder whether there is some easy example we start from two sets this is the general definition but what if I restrict my consideration to one set and I say well I want to consider one set and see if there is a function from this set into itself which is one to one do we have examples of biomorphism that find on that time of that kind of course the identity is a good example the identity is well the exponential is not not any not any depends on the set so oh yes oh yes sure sure sure sure not I'm saying but I'm restricted to an open set for instance and I consider which if I wonder if I can find I'm able to find a function from this set into itself which is holomorphic with an embers I'm not saying that the entire plane okay well just to be on the safe side let us say that there is at least one example the identity which is always useful to remember okay to know that we have examples okay but then as your colleagues said of course if you take a linear transform a linear function which is a function like this this is an example of course a b r complex numbers and a is not zero right this is an example of biomorphism of course in this class there is also the identity when I a is equal to 1 and b is equal to 0 exponential is not even injective so I'm sorry this time no depends okay you can restrict and but in general it's not okay good so may ask you since you came you brought our attention to this linear function this is linear this linear it's not linear technically it's not linear it's an affine function anyway this is normally called linear function okay because it reminds the line okay in the real case anyway is this just an example of biomorphism of C or the exam so let me tell you that well as an notation if omega 1 and omega 2 are sets of C we can indicate by all omega 1 omega 2 the sets of functions from omega 1 and 2 omega 2 which are holomorphic this is a notation okay and and my holomorphic I don't know if this is the notation used f from omega 1 into omega 2 f by holomorphism office but I'm sure that if you restrict to the case which omega 2 and omega 1 coincide and you normally use automorphism as notation okay this is terminology stuff nothing more can use this notation automorphism so my question is now is the class of the automorph is the set of automorph is for the domain C completely describe of this so by these two part this this linear functions so just to leave you with some yes let me just point out that we can say what we are dealing with an entire function so no poles can exist right so take f holomorphic and C entire right half cannot have poles and C no other singularities okay not even poles right question what about the point of infinity so assume that f is injective and we are dealing with automorphism function which are invertible so they are for sure injective and take D any bounded open set in C for instance a circle sorry a disk but this is D and then consider the closure of the and its complement in C which is open because its complement is closed okay so what I'm doing here is the world this is D and this is C minus the closure of D which incidentally is unbounded what I can say is the following since f is injective f of D cannot intersect the image of the complement of the closure of D are you with me these two sets are separated and distinct this joint the image cannot have intersection which means that this set here is not dense because this is open because remember f is holomorphic D is open open set and f is open so f of D is an open set which means there is an interior okay can be whatever you like but it has an interior so there are points with some interior and this is the image of what of a neighborhood as I already observed is a neighborhood of infinity this is unbounded and it is any neighborhood of infinity because I chose I've chosen D to be any general open set but bounded which means that if you go very close to the origin or very far from the origin you take an open neighborhood of the not the origin sorry although the infinity its image according to f is not dense so it cannot be an essential singularity it can only be eventually a pole infinity but so just to okay I run out my time but just to leave you some ideas okay so it can be a pole most it cannot be it cannot be a removal of singularity because otherwise we would have a holomorphic function over a composite this would be constant so and it's not invertible so in any case so the only possibility is it's a pole but if it were a pole of order say m and m is greater than 1 then infinity would have m inverse images right condense at infinity and then the function wouldn't be 1 to 1 so the only possibility is that this pole at infinity is of order 1 which means that in fact if you write down the Laurent series okay it reduces to a polynomial okay but the polynomial degree at most one because it has to have it has to be injective otherwise if the if the degree is greater than one then necessarily there would be several images of zero so the example you gave us is precisely the set of all automorphism of the plane linear functions so I invite you to think about the fact that automorphism of a set first include the identity form a group with respect to compositional functions okay and we'll continue on Friday thank you for your attention


The only things that I've added to gemcommand is lazy loading. So when you start up gem, it doesn't have to load up everything until you go and say, gem install, then I'll load the install class for you. Gemcommand also gives you argument grouping. So for the help output, you can say, well, all these arguments are for local remote. All these arguments are for version, et cetera. And there's also some argument helpers. So you can say, get one gem name, get one optional argument, get all gem names. And then it'll also go ahead and raise the appropriate errors for you. So you don't have to redo that across multiple classes. It also provides argument sharing by modules. So we've got a module for local remote options, one for install and update options, and one for version of platform options. And you can also, for some of these, you can only include them as you want. And finally, there's integrated help. So gemhelp will list all the commands that you can use that are active interregems. And I think the nipiest feature is command completion. So since there's only one command that starts with i, you can type gem i to install gems instead of gem install. Now I'll review some important components in RubyGems that have changed. First up is the gem format. Originally, the format was yaml, the yaml paste. So the beginning was a Ruby self-install header followed by a yaml gem spec. And then a yaml manifest, which is all the files and their sizes and their file loads. And then after that was the file there. So there was one file separated by gashes, and there were basically four encoded and compressed. And so these original gems, you can't install them by running the gem anymore, like you used to be able to because the gem installed in our face has changed. The custom format was replaced with this targizip format, which was a little more flexible and uses more standard tools. So in the new format, a gem is a tar file, and inside that tar file is a data targizi, which today is all the files, and it's a yaml gem spec in the metadata.gz. And when we add assigned gems, it was really easy to go and extend this by just adding a signature for each of those files. However, RubyGems integrates itself with Ruby and it probably changes the most in RubyGems. Originally, you would use required gem. So when you get a required gem of some file, you would add all the gem's paths to Ruby's load path, and then if you had an auto-require that's giving you a gem spec, it would automatically require that file for you. And this didn't work like required because it's nicer to have just be able to require stuff than how it would be loaded, regardless of whether it's a built-in or it's a proper RubyGems. So with the library stuff we're at, and with the library stuff, if you had an auto-require in your gem, RubyGems would install a stuff for this auto-require, which would, when you required it, would do a required gem first. And then it would activate your gem, and then it would require the original file again, now that it was added to your load path. And this still had some problems. There was, you could only have one file, or one active version, and there were problems with, if you had multiple files having the same, or multiple gems having the same file, there could be conflicts there. So custom-require replaces this. And custom-require overrides for the require. First it does a real require, sort of a whole load path. The gem isn't there, it rescues the exception and activates a gem that has that file, and then runs to the same process again. And now in Ruby 1.9, RubyGems is just built-in, so you don't have to do an acquired RubyGems before requiring a file. So this is much more natural. The evolution of the remote index is long and painful, and some of you have been using RubyGems for a while, so you remember the updating bulk index pane. So originally, RubyGems used one big YAML file, and that had every gem spec for every gem with every detail, including the file list, all the files that were in the gem. This was fine, because there weren't many gems way back in those days. But over time, RubyGems became more popular, and so that file got bigger and bigger and eventually got too big. And in order to install a gem, you need to download this huge file to update your local cache. So incremental updates were added. And with incremental updates, RubyGems would batch individual YAML files to update their local cache. So in theory, you'd have to download a few small files instead of a big file in updating the index. So this didn't, this still took a long time. So the format was switched to Marshall, and that helped a little bit, because the files were a little smaller and the connections were added, and that helped a little bit because you didn't have to go and make a round trip to the server every time. But it still wasn't enough. The one file was still too big, because on the client side, you'd still have to load this giant file up to figure out what all the dependencies were to install a gem. So for small virtual servers, 128 megabyte virtual server was pretty popular back then. This would bring the gem server, or bring the virtual server to its knees, because it would take more than 128 megabytes just to install a gem. So I replaced that with the modern index. The monolithic cache file was too big, and RubyGems needed to instead download only the files it needed, and then load just the gem specs it needed on demand. So this would vastly reduce its memory footprint. So now with modern index, when you type gem install, you download this latest specs file, and it contains the name and the version of the platform, all the latest versions of every gem. And then once it's got that, you can go and download that gem spec, figure out the dependencies, and then continue to download the gem specs just for the dependencies it needs. And this latest specs file is about 150 kilobytes, and you may even small it with some marshal tricks. If you provide a version that downloads this specs file, which is just a little bit bigger, and the rest of the process is the same, it's for install without the version. So to recap, basically the problem with the index was the scaling problem. Now originally we had this yaml file, that one big yaml file that was cached locally. That got too big and too hard to update, so we added the quick index, and then gem spec for every gem. That was too slow to download, so we added the marshal file. Marshal file, which was smaller, and marshal version of gem specs, which were smaller, or reduced the number of downloads, we also added persistent connections. And then finally we replaced that with the two specs file, one for the latest gems, one for all the gems, and then a cache file for gem. And the on-disk format is also now one cached file per remote file. So you only have to download a couple of them, or you only have to load one file at a time. Well, so I already drove my first major commitment to RubyGems, which was the gem installer. I wanted to have a tool that would go and download every gem, install it into a clean environment, and then run the test on that gem, and then make a report that to a website. And so in order to do this, I needed a way to automatically install all these gems in a sandbox. So this was too hard with the original installer. When I started there, these two classes, the gem installer and the gem installer. The gem installer did the extracting the gem file, put all the files in the right place, build the extensions, and install all the executable steps in Ruby. The remote installer would go and download the gem, figure out that we're into dependencies, ask the user, hey, do you want to install this dependency? And we're gonna install the dependency, and then finally we're gonna install the gem. And the problem with this was it wasn't automatic enough. There was too much work for me to get the gem installed. Asking me if I wanted to, I always wanted to install the dependencies. It also could sometimes reinstall a dependency multiple times. So if you had a gem that had dependency on rate, and then another dependency before it also had dependency on rate, a rate could be installed multiple times because it wouldn't make a full dependency map first. When I finished there were two installer classes, the gem installer and the gem dependency installer. Which if the gem dependency installer worked a little bit different. First it would go and resolve all of the dependencies and then install all of the gems and figure out what the entire map is. Also the API was a little bit nicer with the way it interacted with the cache. Platforms and Ruby gems are a way for Ruby gems to deal with having alternate gems if you really don't have compilers. A platform works pretty similar to a version. So x86 Darwin 10 maps to 32 bit Ruby on OS 10.6. Universal Darwin 10 maps to any architecture that 10.6 supports. And Universal Darwin maps to any architecture in version of OS 10. And so you can build a gem version this way to make it similar to a gem version. We're starting to build a platform this way to make it similar to a gem version. And so when you're building with platforms, the best thing to do is use Luis Levinas rate compiler. This will go ahead and build a gem that can work in both 1.8 and 1.9 all in one package. If you're too lazy to set up a gem or set up a rate compiler, you should use the current version constant. And if you're too lazy to go and build for both 1.8 and 1.9, you should set the required Ruby version to prevent it from installing on the version that you have in the battle field. Platforms is still not a perfect solution. There's still some problems. Ruby gems refers gems matching the platform, but many gems are 1.8 only. Many existing platform gems are 1.8 only. So if you go and try and use this on 1.9, a lot of Windows people try and then the gem just installs, but it doesn't actually work. The other problem is Ruby gem will fall back to the Ruby platform, which may involve building an extension. This is a problem when the person who builds the platform gem is different from the main one. So if the main version is updated, that goes and hides all the platform versions until new releases are made, for example, for Windows. So there are still several things that I'd like to fix in Ruby gems that I think could be better. First one is gem mirror. It's certainly an important code, but not many people use it. Hasn't been actually worked on in years. It's slow and it's bandwidth intensive in order to update the gems. Instead, you should use Ruby gem's mirror by James Tarr. James Tarr gives Ruby gem's mirror uses persistent connections to speed up the gem downloads. It also provides parallel fetching, so you can download multiple gems at once. It uses the modern index rather than the old Marshall index. There's also a gem test, which is also run by gem install dash t. I don't think, actually, has anybody used gem install or gem test? Now, you have used it. Yeah, I don't think this actually works any better. It doesn't actually work very well. One of the problems is, now in Ruby, we've got a half dozen popular testing frameworks. So, and there's no consistent API across these. You don't figure out, hey, how do we run these tests? Do we run them successfully? It's not something that's easy to go and do in Ruby gems. So, Eric Lindsey is working on Ruby gem's test. And so, one of the other things that Ruby gem, that gem test command doesn't do is install the development dependencies. Ruby gem's test goes ahead and takes care of this for you and uses the right test. It's still in development, so if you want to help out with this, you can go talk to Heritage on IRC channel. And Fancy Require is a feature that I've developed with the inspiration of Nobu to kind of look up objects to Ruby's load path. So, Ruby gem's would add a Ruby gem's look up object to the load path, and this would respond to the path form method. And so, you would pass it the name of a file that, or for Ruby, would pass it the name of a file that's going to be required, and then it would respond with one or three things, a file path telling Ruby to go and load this file like normal, or if they respond with true false to say, hey, it's load has already been taken care of and this was the status, or it could turn nil saying to go on to the next item and load that. And so with this, Ruby gem's could be encapsulated in this look up object rather than sitting on top of a require, which would reduce the memory footprint in Ruby 119. I'd also like the gem spec to be more strict about what it allows. Jeremy Hindergachter is going to be talking in two talks and he's going to have all the gory details of that. Basically, there's a lot of junk in the gem specs. Overtime, because it's a Ruby format, you can pretty much add almost anything in Ruby to the gem spec and previously Ruby gem just didn't care. So it would be nice to have some better theater metadata. Unfortunately, I don't know what the solution to this is because it's hard to go and say, oh, you can't add that, but still support the old gems that had stuff that I'd like to avoid. So now on to Ardok. So Ardok was originally written by Dave Thomas and Dave Thomas wanted a set of tools to create documentation in the source for Ruby and for Ruby projects. And so I think he's absolutely succeeded with this because there are pretty much every project has at least some documentation in the Ardok format. But when I asked him about this as I was researching my talk, he said, I am surprised and terrified that Ardok lasted as long as it did. So my first contribution to Ardok was a RIO output formatter for an IRC bot. For an IRC bot, so you can look at RIO with an IRC bot. And then I also added gem RIPaths so that the RIO tool can also look up gem RIO, there are RIO data for gems. So like Ruby gems, I'll make a rundown of the Ardok releases. So Ardok 101 was added to Ruby 181 and much of the development of the original version of Ardok was done in Ruby Trunk without, or the 180 branch without any separate release notes. When I took over Ardok releases, I bumped version two, version two, I replaced the template page templating with BRB and moved everything into the Ardok game space. Also I added Ryan Davis's RI Cache to speed up look out of RI methods. In Ardok 201, I added support for metaprogram methods like Adder accessor. So those would be, you could document those and have them display in RI or DHTML output. I also added an ancestor look up to RI. So if you looked up file read, it would display IO read, but I don't think that exact example would work because there was another bot in ARDok that would file be a subclass of IO. In Ardok 22, we improved the RI cache and added interactive RI. In 23, especially Michael Ray, there's a dark-faced generator and added some Ardok generator speed ups, such as threading and added Ardok discover to plug it to Ardok discover to look up additional generators or templates. Ardok 24 removed the HTML generator, originally the HTML generator and the XML generator because I didn't need two HTML generators to maintain and nobody used the XML generator. And finally, Ardok 25 added a new RI data format and removed the threading because there were problems with visibility across multiple classes when threading was used. So some components of Ardok. First, the parser, so the parser goes and converts the code into a tree of objects representing the project. The Ruby parser is based on IRB and walks token string. The C parser is based on regular expressions and just kind of graphs around in the file looking for pieces of information. The tree that the parser builds is based on or is composed of Ardok code objects and there's a subclass for Ruby construct. So there's one for classes and one for modules, methods, attributes, files, constants, and hiring, I think those are all of them. And then so the parser goes and constructs a graph of these objects. So a file will contain a class and that class contains methods and then the method will go and link back to the file where it was defined. And the generators go and take this code object and turn it in, code out by graph and turn it into some kind of output. So Ardok generates HTML using dark fish, generates RI data and it also have a work in progress generator for tags file format for use in an integral in a banner. There's also an old Microsoft CHM generator which is still floating around out there. I'm not sure it works anymore. Ardok Markup provides the block and inline formatting using a plain text format and for a fancy format you can embed HTML if you wanted to add a table. And finally, RI is Ardok's command line documentation tool. So it outputs several formats including plain text, fancy colorized text and you can also get HTML out of it. So I think the best feature in Ardok is the code object tree. So the parcels built this graph of Ardok code objects which represent the entire project. So the various classes involved in here can provide full introspection so the generators can more easily generate documentation. You can also use this there being a data source you can manipulate in a new format like the HTML generator error or the tags file outputter. Code object tree provides a rich interaction. So for example, the methods and attributes are sortable and they're separate classes but they're all sortable with each other. It's easy to create new scenarios or building tests for some higher order behaviors and there's also a printing print baked in so when I'm writing some tests and I'm learning some new thing if it fails it'll go and show me pretty output that I can go and actually look at and figure out what's going on and the things that I'm just going to inspect which is kind of hard to read. So in Ardok, I replaced more code than Ruby Jam which is largely factory for factories. First up is Ardok markup. The original Ardok markup used a regex parser for text blocks. So you had blocks for paragraphs and lists and binary sections and then inline markup for things like emphasis or cross-references was separate. And the original markup used, or the original parser used regular expression is to go and figure out stuff like indented blocks like the slide here. And so the state was kept separate from the regular expression which was a little bit hard for me to maintain and follow. So I replaced this with a token idler and a personal descent parser. And so it would use, so it parses the input text and builds a markup tree and the inline markup is still separate. And when I wrote this, I battle tested my new parser against all the jams using Gauntlet to make sure that I didn't have any bugs that I didn't know about from the tests. And then once you have a tree, you can use the visitor pattern to go and output text. So currently the visitor is involved in Ardok Text Output which is pretty much a mirror of the original. Backspace text for paged output because most pagers don't support ANSI box. ANSI text for colorized output, HTML and an extra class for HTML with cross-reference links for dark vision. Like the gem index, the RI software from a success problem as well. Originally there was just one RI data directory and then with the gems, you added a RI data directory per gem. And for every method and class, there was a file for that documentation that was yaml. And so if you wanted to look up some method with RI, it would go and look through all of these data directories, try and get a walk and static all the files and look up, hey, is there this method here? And then if once the ancestor was look up it got worse because then you'd have to go and look up the class for all those and then go and look up the method again. So you ended up doing a lot of file stats across a lot of the file systems which was really slow. There was also a separate formatter for output. So the HTML generators and the RI sharing, didn't share any of the code. For the first pass at improving RI, largely done by Ryan Davis, the YAML objects were replaced with hashes. So Ruby, sorry, RI would load up a YAML object originally and now it's just loaded a nested hash. Also there's a cache of file locations added but given the nature of the original RI code, this was a bit too difficult. For the second pass, the Marshall format was added. So we store the ROC code objects directly and also store the ROC markup. ROC markup tree in there for the first comment and then also reuse the visitor code. There's also new decks included to speed lookups but there's not a complete cache across all the gems like the original format. None of the original ROC generators were made. The XML and CHM generators have been removed from RDoC as they were unused and un-maintained. The CHM generators still floating around if anybody wanted to resurrect it though. The original HTML generators used a class called template page generate output. This consumed a JSON like hash which was very simple and used each and if or the only looping or constructs or the only constructs in it. Would also convert the RDoC code object tree into a half nested hash which was it's lost all the richness of the Ruby objects. There's also a library home. By later one eight releases it would take about two gigabytes to go and generate all the HTML documentation. So to approve the HTML generator, first I added, I switched to ERB to make template writing templates easier but we still had this code object transformation. And then Michael Granger came in and wrote darkfish. Darkfish, which I converted to off the code object tree directly. Meaning there was no extra tree to build making it more memory friendly. Incidentally, one of Koichi's students, Tetsu So, wrote a memory profiler that found the cause of the memory consumption in RDoC's original HTML generator. But this was after the darkfish switch. The original RI generator translated the code object tree into the separate tree of RI description objects which were stored in the ML format. And so there was also no index to speed up any of the new lookups. And new RI uses the code object tree with RDoC markup content comments that has an index for directory. So we can easily go and see what all the classes and methods and the ancestor chain for all the jams right off the bat.  So there's still some things I like to change in RDoC. So this slide may look familiar. The Ruby parser is based on our review which was rather hard to change. I added multi-byte support to it and that was pretty difficult. I've also added features of the C-pipe parser which were not very fun. And my experience with RDoC markup and Ruby2Ruby tell me that it's much easier to walk a syntax tree and then to interpret token stream or to wrap around in a file. So I like to switch to something like Ripper and Cast. Also, encoding support is not actually done but it's not actually released yet. Release RDoC is the released versions assume a single encoding across all the files. And Trump had transcode all the input documents to one output encoding that you specified. I haven't battle tested this yet which is why it's not been released. I'd like to make sure that I don't break any jams. I have some plugins for it in RDoC but I don't think I have enough yet. You can add generators, you can add hook directive to do custom stuff. But I don't yet have a way of adding command line options to a generator. And I'm sure that there's probably some plugins that I should add to RI but I'm not sure what they should be in. So what have I learned from Ruby jams and RDoC? First thing is to have a good project and a good API. And so a good API has a clean separation of concerns. So the, for example, dependency installer should only be involved in figuring out what dependencies to install. I mean, has the caching is separate and the installing is separate from it. So your classes should all do one thing and they should do that one thing really well. It should be a rich interaction amongst your objects. So are you gonna wanna store your objects? Well, then you should add spaceship. Oh, I got an error. Spaceship and comparable. You're gonna wanna enumerate your object to provide each enumerable time to compare it. And you're gonna use your objects to hash key by the hash and the VQLA method. So refactor your methods aggressively or refactor your classes aggressively. Make sure you shave off any rough edges and encapsulate any state that's shared across multiple objects down into one. This makes your API easier to use. To get there, you're gonna wanna have good tests for everything. They help you refactor. They also teach you about your pain points. You're not sure how to go and find these out. Build some other thing with your API that's not whatever your main thing is. In this case, for the installers, it was Fire Brigade. Talk to me about how difficult it was to actually use the installer classes. And then once you've done this, you can go back and refactor the original implementation. And then once your software is out there and successful, people will be using it in ways you don't expect. So if you can, go and battle test it. You know, tests are good, but they're not gonna, they're only your ideas about how to use the code. They're not everybody else's idea. So you can only make it so idiot-proof. For Arbok and Lubejams, I can use Dolphlet, which can harvest the wisdom of many idiots. When I replaced the Arbok markup parser, I read Dolphlet and found several crashing bugs and infinite loot bugs in my parser, even though I had all of Dave's original tests.  You know, Dolphlet has an arrow focused on it. It's only for jams. It goes through, it does this process, it downloads every latest jam, converts it to a charge easy, and then put it on a command against every jams. So that's, that's all it does. For example, at work at AT&T, we do a lot of solar stuff. So in order to battle test our solar parsing code back at Redditch, we'll do dictionary searches against the solar server, and then go and run the results through our solar parsing code. So you may even have some success problems after a while, and these can be hard to tap, especially when you have only a few tests. Arbok and Lubejams had some poor code, or some poor test coverage, so make sure you go and write more tests to figure out how it works. When there's many moving parts, it can be kind of hard to figure out, hey, is it supposed to work this way? So tests can help you figure that out. And really, so what this is doing is helping you familiarize yourself with the code, so you can test it. So once you've tested it, it'll tell you kind of give you an idea of why it works the way it does, so that you can learn how, once you've learned how it works, then you can make small improvements. And if those small improvements don't do it, then you can replace it completely. This is our, how I improved our eye, Lubejams Remote Index. And you know, be sure to examine the problem closely. What do you really need to fix here? While simple improvement do it, while simpler code do it, if none of those things will work, then finally replace it. Do that, try that last. Replacing it first means you may not replace it with a good enough thing. And finally, less is more. Having less in your project is much better. When there's less code in your project, it's easier to coordinate amongst busy developers. So with Plugins, so for that, Hardock and Lubejams both provide plugins, which make it easier for many people to work on what they want to work on, rather than having me maintain everything. Plugins give you more flexibility. So if James Tucker wants to make a release of Lubejams Mirror or Eric Lensby wants to make a new release of Lubejams Test, they don't have to worry about me making some feature, some unrelated feature in Lubejams work. They can just go and do it. And with this more ideas can be explored, for example, while there's Lubejams sing, which will sing the indentation of your code, or there's, you know, GemConner was really started out as a plugin. And so this ends up with less working on your original code base, because everybody can work on their own happy thing. But plugins can be hard to do right, so be very careful when you start. Think carefully about when you load the plugins and what to do. In Lubejams I made a mistake with the way the plugins work because they're loaded all the time. So even when you're not going to use a command plugin, they're getting loaded up. Also be careful about API walking. If you do it wrong then you might get stuck supporting something you don't want to. Thank you, that's the end. Any questions? So I recently had occasion to need all of the Gem QuickSpecs in advance for my own mirror. And Lubejams mirror doesn't do that.  But in order to do it I needed the deflated Marshall index that I think is going way over time. My understanding that's the only place you can go and say what are all the versions, all the gems, all at once. I need all the right ones. Is that still okay since- So Wilson was asking about the list of every Gem and all the Gem specs. And currently the Marshall 4.8.z file will be staying around for a foreseeable future. It's pretty expensive to generate. So I believe it's only generated once a day. Shane. Where do we go to help? So Shane asked where do we go to help? Lubejams is on GitHub now. Actually I've got, Lubejams, here we go. There, here's where you go to help. In the back. Are there any features planned for the future? Is it more or better? So are there any features planned for the future? Well, so my talk is about the history. So I didn't go over many of those other than my to-do items. For RDoC I've got about a release almost ready to go. I'm trying to figure out the, how to make command line options work better. For Lubejams we're looking at making arbitrary metadata for the Gem specs. But I'm kind of nervous about that because of the potential for abuse. So we've got a couple things planned, but not so much for Lubejams. Yes. I just wanted to say thanks.  Are there any features planned for Lubejams? Well, you're welcome. Any comments on Yard? Any comments on Yard? Yard, Yard. Competitors are rude. Yes, sorry, Yard. For whatever reason, the Yard maintainer has never spoken to me about much of anything. So I haven't really looked at Yard much here. I do know it uses Ripper, so I may go and look at it to see how it uses Ripper to see what it does. I think that most of what Yard could be done, Yard does, could be added as an extension doc to RDoC. And I don't see any reason for me to not want to do that. But as to why he hasn't asked me for that, I'm not sure. I don't want to add those features to RDoC because they're not my preferred style and I don't want to have to make, it's hard to maintain something that's not your passion. Any more? All right, I believe that's it. Thank you.


The West has been planning to crush China for a very long time. China is preparing to kill Americans and we've got to prepare to defend ourselves, Empire propagandist Gordon Chang told Fox Business during an interview on Monday. Chang, who has famously spent more than two decades incorrectly predicting the imminent collapse of China, bizarrely made these comments while discussing a future attack on Taiwan. Taiwan is of course not the United States and any potential war between Taiwan and the mainland would be an inter-Chinese conflict that needn't involve a single American and Chang is most assuredly not part of any we who will ever be engaged in combat with the Chinese military under any circumstances. Chang frames his narrative as though China is menacing Americans in their homes when in reality only the exact opposite is true. The US has been militarily encircling China for many years and is rapidly accelerating its efforts to do so. Just the other day the Philippines announced the locations of four military bases the US will now have access to in its ongoing encirclement operation, most of them in the northern provinces closest to China. Anti-war's Dave DeKamp writes, quote, three of the Philippine bases will be located in northern Philippine provinces, a move that angers China since they can be used as staging grounds for a fight over Taiwan. The US will be granted access to the Lailo Airport and the naval base Camilo Oasis, which are both located in the northern Cagayan province. In the neighboring Isabella province, the US will gain access to Camp Melchor del Cruz. The US military will also be able to expand to Palawan, an island province in the South China Sea, disputed waters that are a major source of tensions between the US and China. The US will be granted access to the Balabac Island, the southernmost island of Palawan. The new locations are on top of five bases the US currently has access to, bringing the total number of bases the US can rotate forces through in the Philippines to nine. The expansion in the Philippines is a significant step in the US effort to build up its military assets in the region to prepare for a future war with China, end quote. So it's very clear who the aggressor is here and who is preparing to attack whom. Imperial spinmeisters like Gordon Chang are just lying when they frame China's militarizing to defend itself against undisguised US encirclement as China militarizing to attack Americans. Fun fact, US officials used to pretend China was crazy and paranoid for saying this encirclement was happening. In the 1995 book Killing Hope, US military and CIA interventions since World War II, William Bloom wrote the following quote. In March 1966, Secretary of State Dean Rusk spoke before a congressional committee about American policy toward China. Mr. Rusk it seems was perplexed that at times the communist Chinese leaders seemed to be obsessed with the notion that they are being threatened and encircled. He spoke of China's imaginary, almost pathological notion that the United States and other countries around its borders are seeking an opportunity to invade mainland China and destroy the Beijing regime, the Secretary then added. How much Beijing's fear of the United States is genuine and how much it is artificially induced for domestic political purposes only the Chinese communist leaders themselves know. I am convinced, however, that their desire to expel our influence and activity from the Western Pacific and Southeast Asia is not motivated by fears that we are threatening them. End quote. Another fun fact. Thanks to a 2021 revelation by Daniel Ellsberg, we now know that the Secretary of State's comments about how crazy and paranoid China was for thinking the US wanted to attack it came just eight years after the US had seriously considered acting on plans it had drawn up to launch a nuclear strike on the Chinese mainland. Mainstream Western imperialists of all stripes have for a long time recognized that a hard conflict with China would be necessary at some point in the future if they were to continue their dominance of the world. In his 2005 book Super Patriot, Michael Parenti wrote that the unipolarist neoconservative PNAC, that's project for the New American Century ideology that had by that point taken over US foreign policy, was ultimately geared toward a future conflict with China. Quote. The PNAC plan envisions a strategic confrontation with China and a still greater permanent military presence in every corner of the world. The objective is not power for its own sake, but power to control the world's natural resources and markets, power to privatize and deregulate the economies of every nation in the world, and power to hoist upon the backs of peoples everywhere, including North America, the blessings of such an untrammeled global free market. The end goal is to ensure not merely the supremacy of global capitalism as such, but the supremacy of American global capitalism by preventing the emergence of any other potentially competing superpower. End quote. But you can see the twinkle in this looming conflict in the eyes of western imperialists long before any of this. In a 1902 interview, which was not published until 1966, a year after Churchill's death, Churchill candidly voiced his support for partitioning China at some point in the future in order to preserve the dominance of the Aryan stock over barbaric nations. This is a direct quote. The East is interesting, and to no one can it be more valuable and interesting than to anyone who comes from the West. I think we shall have to take the Chinese in hand and regulate them. I believe that as civilized nations become more powerful, they will get more ruthless, and the time will come when the world will impatiently bear the existence of great barbaric nations who may at any time arm themselves and menace civilized nations. I believe in the ultimate partition of China. I mean ultimate. I hope we shall not have to do it in our day. The Aryan stock is bound to triumph. End quote. The word partition here means breaking a nation up into smaller nations, i.e. balkanization. To this day, we can see western imperialists pushing for the partitioning of disobedient nations like Russia and Syria, and we still see this with China in the push to permanently amputate regions like Xinjiang, Hong Kong, and Taiwan from Beijing. China's sheer size, social cohesion, and geostrategic location have long been recognized as a potential problem in the future for western imperialists, who wish to ensure their ability to dominate and control, and now we're seeing that all come to a head. Churchill said of a future confrontation with China, I hope we shall not have to do it in our day, because that confrontation has always been certain to be horrific, and today in the atomic age this is far more true than it was in 1902. And in fact, we do not have to do it in our day either. We do not have to do it any day. The only reason we're being pushed toward a profoundly dangerous conflict with China is because it's the only way for western imperialists to maintain their hegemonic control of this planet. But their hegemonic control of this planet has brought us to a point of endlessly escalating nuclear brinkmanship and looming ecosystemic collapse. It hasn't exactly been working out great, is what I'm saying. There's no reason the West can't simply accept the existence of other powers and stop trying to dominate everyone in the world. We have long been ruled by tyrants who continually push our world towards suffering and death in the name of securing more power and control. But we don't need to accept their rule. They do not have a healthy vision for our species, and there are a whole lot more of us than there are of them. Their rule is done as soon as enough of us decided is.


Have you ever wondered how much it cost to live in Belarus the heart of Europe? Today we're going to delve into that topic, and you might be pleasantly surprised. When we compare Belarus to other European countries, the cost of living is considerably lower. This is especially true when it comes to housing. In many western European nations, buying a house can be a financial strain, but in Belarus it's a different story. The average cost of a house in this Eastern European gem is significantly more affordable. Imagine being able to own a piece of Europe without breaking the bank. The affordability doesn't stop at housing either, from groceries to utilities, and from transportation to healthcare. Living in Belarus won't drain your wallet. Surprised by the affordability? Stick around to discover the 10 cheapest places to buy a house in Belarus. The heart of Europe might just become your new home. Starting our journey in the Brest region, we find a gem, tucked away in the southwest corner of Belarus. Brest is a region steeped in history, offering a unique blend of cultures and a rich tapestry of heritage. Known for its impressive fortresses, tranquil parks, and ancient libraries, it's an area that speaks volumes about the nation's past. But the Brest region isn't just about history and culture. It's also a place that offers an affordable lifestyle. Imagine owning a charming house in this region without breaking the bank. The average cost of buying a house in Brest is surprisingly affordable. Picture this, a quaint two-bedroom house with a cozy living room and a spacious backyard, nestled in this historic region for less than the price of a luxury car. Such affordability, coupled with the region's cultural richness, makes the Brest region an ideal place for those seeking to make a smart investment in a home. A bargain for such a historic and cultural hub, wouldn't you agree? Next stop, the beautiful Grodno region. Nestled in the western part of Belarus, Grodno boasts a unique blend of history and natural beauty. Its picturesque landscapes are adorned with lush forests, tranquil rivers, and the grandeur of architectural masterpieces from the past. Now let's talk about housing. Grodno offers a variety of options that cater to different tastes and budgets. If you're a fan of the city life, a modern apartment in the heart of Grodno City can be yours for an average price that's surprisingly affordable. On the other hand, if you're drawn towards the serenity of the countryside, a cozy house nestled among nature comes at a price that will leave you pleasantly surprised. The Grodno region is also home to a vibrant community, with a thriving arts and culture scene, and plenty of local attractions to explore.  Now, let's explore the Vitebsk region. Nestled in the northeastern corner of Belarus, the Vitebsk region is a harmonious blend of nature's splendor and architectural charm. It's a place where the past meets the present, with its medieval castles standing side by side with modern high-rise buildings. Vitebsk is famous for its vibrant art scene, being the birthplace of Marc Chagall, one of the most successful artists of the 20th century. The region boasts a rich cultural history with numerous festivals and events that attract visitors from all over the world. Now, let's talk about housing. The average cost of buying a house in this region is quite reasonable, considering the lifestyle and amenities it offers. A typical home in Vitebsk will set you back by about $20,000 to $30,000. So, whether you're an art enthusiast, a history buff, or simply someone who appreciates the beauty of nature, Vitebsk could be the perfect place for you. Impressive affordability for a place with such rich history and culture. Heading east, we reach the Mogilev region, a charming blend of historical appeal and modern convenience. Nestled on the banks of the Dnieper River, this region is a treasure trove of attractions, from the majestic Mogilev drama theater to the panoramic beauty of Buenicci Field. But the true allure of Mogilev lies not just in its picturesque landscapes and cultural richness. Homebuyers will find a welcoming market that blends affordability with value. Averaging at a cost that is significantly lower than many European cities, purchasing a house here won't break the bank. Yet home ownership in this region comes with the promise of a serene, culturally vibrant lifestyle. Imagine waking up to the site of the Dnieper's gentle waves or strolling through the historic city center, all while knowing you've secured a valuable investment. From its affordability to its allure, Mogilev region is another affordable gem in the heart of Europe. Next, we venture into the Gomel region, a gem tucked away in the southeastern corner of Belarus. This area is a delightful blend of urban landscapes and natural beauty, making it an ideal place for those seeking tranquility and convenience alike. Gomel, the region's capital, is the second largest city in Belarus, offering a vibrant city life that's just as captivating. Now let's talk real estate. The Gomel region presents an array of affordable housing options. On average, you may find yourself becoming a homeowner here for less than the price of a new car. That's right, you can own a piece of this charming region at prices that are as captivating as the landscapes. From the Pripyatsky National Park's lush greenery to the Stoze River's serene flow, the Gomel region offers a restful retreat from the everyday hustle. Imagine living among these scenic views day in and day out, a small price to pay for such natural beauty and tranquility. Finally, we arrive at the bustling Minsk region, a vibrant blend of urban life and tranquil countryside. Now don't let the allure of the capital intimidate you. The Minsk region is more than just its high rises and bustling streets. It's a region that balances the hustle and bustle of city life with the tranquility of the surrounding nature. Here you'll find picturesque villages nestled amidst lush forests and serene rivers, offering a peaceful retreat from the city's fast-paced rhythm. And guess what? You can be a part of this dynamic region without breaking the bank. The average cost of buying a house in the Minsk region varies, but it's safe to say that it's surprisingly affordable. From cozy cottages in the countryside to apartments in the heart of the city, there's something for everyone's budget. So who said living in the capital region had to be expensive? In the Minsk region, affordable living meets metropolitan charm and it's all waiting for you. But it's not just about the cost, is it? Let's delve into what makes Belarus a truly remarkable place to call home. This Eastern European gem is more than just an affordable place to settle down. It's a country rich in culture, history, and natural beauty, offering an array of perks that make life here genuinely fulfilling. Firstly, let's talk about the people. Belarusians are known for their hospitality and friendly demeanor. They're warm, welcoming, and always ready to lend a helping hand. Whether you're lost in the city or need advice on the best local cuisine, you'll find a Belarusian ready to assist. This sense of community and camaraderie is what makes living in Belarus feel like home, no matter where you're originally from. Now let's move on to the culture. Belarus is a treasure trove of historical landmarks, traditional festivals, and cultural events. From the majestic Mir Castle, a UNESCO World Heritage Site, to the vibrant Viva Rovar Festival celebrating the art of cycling, there's always something to immerse yourself in. And let's not forget the traditional music and dance that echo through the streets during festivals, adding a rhythm to life in Belarus.  Belarus boasts beautiful landscapes, from the mesmerizing Belovesh Skia Pushcha National Park, home to the majestic European Bison, to the picturesque Pripyatsky National Park, known as the Lungs of Europe. The country's commitment to preserving its natural heritage means you'll always have a greenscape to retreat to. Moreover, Belarus is a country that values education and offers excellent schooling options. Its universities are renowned for their high standards, attracting students from around the globe. So, if you're planning to raise a family here, rest assured your children will receive quality education. Affordable housing and a high quality of life, Belarus seems to have it all. So why wait? Experience the perks of living in Belarus and let this hidden gem of Eastern Europe become your new home sweet home. Intrigued by the possibilities Belarus offers? Quench your curiosity by subscribing to the European Hub. Stay tuned for more insights and information about living in Europe. Join the the European Hub community today and never miss an update from the heart of Europe.


What's in there in Magna Sites? The black wagon is back and ready to react. Now, this is to a video on a world star. It's called, if you're trying to turn up for Christmas with hip-hop, Santa Claus Migo.  So let's do this. Once again with the real Migos, you know. Had to do it for the holiday season. You know, holiday season. Hey, Migo! Migo! I know some of y'all have written me before and said, hey, we want to see all your real reactions, even if you don't like something. Well, it was alright. It was alright. It was a couple of funny things, but yeah. Ain't my thing. Post your comments down below. Let me know if you liked it. That's my reaction video, mother suckers. Or me and subscribers. Woo!