To summarize whatever we've learned so far, because we mainly focus on cities, or we try at least within this podcast. You now live in Biharitz, let's imagine that you're the mayor of Biharitz, and with your degrowth stick, what would be some of the steps or how would you translate your knowledge into some actions or into some, let's say initiatives that you would rally citizens and companies and people within Biharitz. Economic growth, the way I conceptualize it, is like an engine that's self-amplifying. So for me, degrowth is about stopping the engine. It's an engine of production, an engine of consumption, both self-amplifying. So as the mayor of Biharitz, I would just ban advertising in the street, like it's been done in Grenoble and several other fifth cities. I would also constrain not only public advertising, but also as much as I can online advertising, and let's say every single pressure to consume having to do with publicity or planned obsolescence would become banned or heavily taxed or whatever tools. So here we can shrink the engine of consumption. To do this as well, I would want to rethink consumption through the lens of well-being, being like, okay, I'm the mayor of Biharitz. How can the people of Biharitz be happy in their daily lives without having to consume going to the mall? And then you realize that actually keeping a forest in good shape and public park, and developing the infrastructure around surfing so that it's available to an affordable for people to do, same thing with... So giving people option to find ways of entertaining themselves, meeting, relating to each other without having to rely on consuming every time more commodities. Here we're constraining consumption. Then I'll go hard on production too. I'll be like starting by doing democratic inventories in the city of the type of activities we want, the type of activities we don't want. So that's like local industrial policy. I'm a surfer, I surf every day. The pollution is there. We have the harbor of Bayon issues related to overfishing and mass transport of good. The water is very often polluted. So here it's an experience of in a city that is just close to the ocean, you have to have this relation to nature. So now I would want to bring that discussion, okay, we are a coastal city.  How do these two cohabit? There are certain things that actually can identify as being like low well-being, high ecologically intensive product that we could phase out. So I would like, yeah, these are the type of things. And then to do this, it starts with work time reduction. Because how can you have these discussions? How can you mobilize people into organizing alternative forms of economy if they're just too busy working in a, for a company, most of the time working, producing things that don't directly consume or don't have a lot of fun producing. So this is overall, I think, and to develop a bit more of the link with cities, when we're thinking of democratizing the economy, it necessarily means relocalizing production and consumption. Necessarily, because if you want to have a democratic forum where, you know, producers and consumers and all the people that are kind of bearing the consequences of that production and consumption, they can all be in the same room, then you minimize the risk of exploitation.  It's just not cool. But if the boat is cleaning, you know, their oil like in a faraway country, we never see and care, it makes it way easier for us not to care about. So relocalizing and productive activities is a way of somehow bringing them back within the realm of democracy. And then there are many other tools to do this local currencies is a great way because that also repoliticize money in the sense of today money is the bank have monopoly in creating and destroying it. But with local currencies, we can have local monetary policy where we decide somehow to use the money to invest into new sectors to create new money to boost or stimulate certain activities like with time banks that we're not finding any finance and funds under a normal capitalist economy. So here's a few changes that probably make everyone realize I do a terrible job at being the mayor. So this is not a new official application. But if the mayor of Yards does want to hear my recommendation, I'll be more than happy to look into it.


On Thursday, May 4, local churchgoers and religious leaders gathered in Pikeville Park to recognize National Day of Prayer. Throughout the event, various prayers were recited regarding our churches, government and education system. Everyone in attendance was glad to share the experience with each other. Prayer is essential and we believe as people of God that prayer is its bottle for our nation, for the health of our nation, for the direction of our nation, and as far as morality and other things like that. So we believe that it's important to come together often on a regular basis and pray, but specific times like this, it's important for us to come together as a community as well. It's annual, but it's also national as well. And so there are people meeting literally across the United States of America right now that are praying for God's intervention in our country. Cancer, it's a very scary word. But an outstanding treatment facility was here at home. I was led to the Lawson Cancer Center. As a nurse practitioner at the Lawson Cancer Center, we are champions for our patients. I am so happy for Robert. The treatment worked. Although celebrated on a national level, the Day of Prayer is an important community event as well. Johnson says those who practice their faith need to pray all the time. Just like in our individual churches, we need to participate in things in our community to reach out and to show the love of Christ. And that's one way we do that. The great commandments are to love God and to love each other, to love our neighbor. And I think that this is a little bit of both of that. The Bible tells us to pray without ceasing. And so this is an attitude of prayer, not just a one-time event, but it's something that we ought to do all the time. I think about Main Street down here. We ought to pray for our related leaders. We ought to pray for our churches. We ought to pray for our nation. It ought to be something we do on a regular basis, not just one time a year. Reporting from out in Top News, I'm Nick Collum.


five super high-intensity sessions in one week. This is the Hail Mary of training known as block periodization. Today I'm going to get into the science of block periodization to show you why it can be so effective and take you through my own training in the months of September and October of this year using this method that got me into the best shape on the bike that I've ever been in. Welcome back to another video. Block periodization is a training method in which you block very hard training sessions together over a short period of time. I've done videos on this before in the past, but in this video I want to show you how I implemented this strategy and show you the results that I got from it. First things first let's get into some of the science behind block periodization and this should give you a good idea of why I'm making such a big deal about this training method.  More than this does not appear to be beneficial and may actually be detrimental as it may lead to overtraining. It's very tempting for cyclists to go too hard too often. Well what do you expect me to do with my email constantly blowing up about Rick stealing all my KOMs around town? I mean am I supposed to just let him take my spot as the fastest guy on that one quarter mile section of main street where you have to cross like three different traffic lights? That's a highly coveted title. Fatigue from overdoing it with intensity isn't something that's immediately noticeable. If you ride hard three or four times a week then you may feel fine at first but over time it'll catch up to you. When riders complain about constantly feeling tired or lacking motivation to train this is usually the underlying reason and it may have something to do with how our nervous systems respond to hard training. This study on autonomic recovery after exercise found that exercise below the first ventilatory threshold or zone two and below causes minimal disturbance in ANS balance. Further the first ventilatory threshold made demarcate a binary threshold for ANS slash HRV recovery in highly trained athletes because further delays in HRV recovery with even higher training intensities was not observed. What does this mean? Well basically if you keep your ride at zone two intensity or below in a five zone training model then you're not building up a lot of autonomic nervous system stress. However if you go over that threshold then you are building up stress and it doesn't really seem to matter whether you do a high quality vo2max interval session or just ride kind of hard with your friends because you didn't want them to drop you. If you do this day after day for most days for weeks on end you'll find yourself in a bad place. Now you may be thinking I thought you said you did five high intensity interval sessions in one week and now you're telling me do no more than two? What gives? Well block prioritization takes good training practices and chucks them out the window. Hmm all right you've got my attention continue but for just one week and it's imperative that you follow this week up with some solid recovery. Nope you lost me again. The reason I call this the Hail Mary of training is because it's easy to screw up and if you do you may find yourself over trained. However do it correctly and you may see the biggest bump in fitness that you've ever gotten from a single training week. Let me show you what I'm talking about. This study on block prioritization of high intensity intervals had the block prioritization group perform five high intensity sessions in the first week followed by three weeks of one high intensity session per week while a control group did two sessions per week each week. They found that the block prioritization groups mean power during the high intensity workouts increased with each session along with power at two millimolar lactate max power and maximal oxygen consumption. None of these changes occurred in the control group that stuck to a more traditional training pattern. Very promising results here but as always let's look at more than one study before we come to any sort of conclusion. This study looking at the effects of a 12 week block prioritization program had the block prioritization group perform five high intensity sessions every fourth week and one high intensity session per week during the other weeks while the traditional group did two sessions per week each week. The block prioritization group saw a greater increase in VO2 max power at two millimolar lactate hemoglobin mass and power during a 40 minute time trial. This study on cross-country skiers and block prioritization came to the same conclusion showing greater increases in maximal aerobic power maximal oxygen uptake and power at four millimolar lactate and these findings are backed up by a similar study on cross-country skiers that concluded that block prioritization led to better adaptations than traditional training. These studies all seem to show that having a very large training stimulus such as an intense training block was particularly effective. The 12 week study even explicitly states this. It's well known that the better trained the athlete is, the larger the stimuli needed to achieve further improvements and that the larger stimuli of higher intensity training during each hit block is likely to explain the favorable adaptations to block prioritization. This is a very important piece right here. If you're new to cycling or you've just started training seriously then it's probably best that you don't try block prioritization. However if you're well trained and you're starting to see a fitness plateau then the large stimulus that you get from doing block prioritization may give you the fitness bump that you need. I've personally seen both great results and terrible results from trying to use this method in my own training. Last year I got a little too ambitious about getting back to normal training after the block week. I didn't give myself enough time to recover. The result was chronically heavy legs, a complete lack of punch, and a reduction of my power in general. Towards the end of this shortened race season however I got the formula spot on and saw some new personal best power records as a result. My last race of this year was Belgian Waffle Ride Cedar City and I decided to implement block prioritization in the month before this event. The race was on October 17th so I decided to start my block week on September 14th to give me four weeks of recovery before race day. Let's break down exactly what that week looked like and then I'll get into what the weeks after that looked like in order to recover leading into the race. With a Monday rest day the training week started off on Tuesday with eight by five minute intervals with five minutes of recovery in between. The goal of this workout is to average the highest power possible across those eight intervals which for me was just over 400 watts. You'll know you did it right if you get to that eighth one and feel like vomiting. Intervals of this length and intensity are what are commonly referred to as VO2 max intervals however normally you wouldn't do this many of them in a session it's much more common to go with five by five minutes or four by five minutes so why did I step it up to eight? This study comparing different durations and intensities of intervals found that an eight by four minute interval session was among the most effective intervals tested. With this in mind though more is not always better this is the advice I usually give when somebody's trying to determine how many intervals they should do. You should go until you can no longer stay in the zone you're targeting. For example in this workout I was able to hold the first seven at my target of just above 400 but on the eighth one I finally cracked and that interval only ended up being three and a half minutes and then I knew I was done. The entire ride ended up being three hours and 15 minutes with warm-up and cool-down and some zone two after the intervals. Tuesday was four by 15 minute intervals done right at or slightly above FTP which for me was right at 360 watts and the total time for this ride was four hours. Believe it or not this second day may be the hardest one to get through because you're obviously going to be pretty cooked from the previous day. After this though something interesting happens you actually start to feel really good on the bike. Now don't get me wrong you will likely feel soreness but strangely enough it doesn't really seem to have a big impact on your power. This happens during stage racing too you've been pounding yourself day after day but the power doesn't really seem to drop off. I call this the stage racing effect and it's not really too much of a surprise why pro road racers will do week-long stage races in preparation for grand tours. Essentially what they're doing is block periodization. That being said I didn't do five days in a row during this week I did throw in a recovery ride on Thursday to gear up for a solid Friday Saturday and Sunday. Recovery ride during your Hail Mary training week I don't even do recovery rides on a normal training week unless of course I get dropped in which case I was just trying to take it easy today guys give me a break. Friday was 30 30s and as the name suggests this workout requires doing repeated 30 second sprints with 30 seconds of recovery in between. The short rest period is critical because this workout is not about targeting your max sprint it's about improving your repeatability and again it's been shown to be one of the most effective high intensity intervals. Going back to the previous study on intervals the only other type of interval that was on par with the eight by four minutes was 12 by 30 seconds. This style of on-off interval is known as Tabata training and has a fair bit of research to back up its effectiveness. For this workout on Friday I did two sets with 12 minutes in between. In the first set I did 11 sprints and in the second I did 10. There isn't any rhyme or reason to 11 and 10. I simply did the intervals at my power target which was 550 to 650 watts until I was ready to fall off the bike. Again expect to be lightheaded and nauseous towards the end of this one. Total ride time for this workout was two and a half hours. This brings us to Saturday which was not an interval session but a race. I like to throw this in at the end of these weeks because it gives you motivation to push harder than you normally would. Hard group rides are also great for this. This particular race was a local 45 mile gravel race and fortunately the competition here was very solid meaning that it would make for a great workout. I managed to get the win but more importantly I had some really solid training numbers from the day. The race lasted two and a half hours with a lot of attacks and hard digs leaving me with a normalized power of 321 watts and an intensity factor of 0.93. Very high quality day there. Finally we get to Sunday which was the last day of the training block and on this day I decided to do something a little more specific to what I was training for which was a 125 mile gravel race that I knew would take around six hours and likely have long sections where sustained high power was needed. This ride was five hours and 45 minutes in total and in that ride I did three 40 minute long intervals at 310 to 320 watts. My plan was to do as much time at this intensity as I could and three was it before I finished out the rest of the ride at zone two and did two 15 second max sprints at the end. I'll often put sprints at the end of a ride like this because in a race scenario you're never sprinting for the line fresh and this gets you used to that plus if you're not a dedicated sprinter but you still want a decent sprint putting the sprints at the end of the ride won't take away from the intervals that you have to do earlier in the ride. I include these lower intensity intervals in the lead up to ultra endurance races because getting in race specific intensity along with higher intensity seems to produce favorable results on race day. For example this study on specific intensity for peaking stated that the combination of both high intensity training and specific training may lead to a higher training response. That's the block week in total I did 20 hours of riding and had a tss or training stress score of 1200. Now came the recovery process the week after was a straight up recovery week Tuesday through Friday I just rode easy in zone one or two for no more than two hours and it's during this time that fatigue starts to set in as your body realizes what you just put it through by Saturday I was feeling pretty good though and had my first hard training session since the block week which was supposed to be four by 12 minutes at 360 watts but as you can see I was struggling a little bit and had to reduce the interval time down towards the end of the workout. It's not uncommon to feel this way towards the end of a recovery week especially if you're recovering from a very high training load. The next few workouts should feel a lot better though and they did the next two weeks after this leading into the race I did just under 22 hours and 19 and a half hours of riding with two solid high intensity workouts each week. This was more than I had anticipated doing but I really took that recovery week after the block week seriously and was feeling great during these two weeks. During this time I was seeing some of the highest power numbers I'd ever seen and while I wasn't able to get in an FTP test during this time because it didn't quite fit in with the training Zert which I used to track my progress estimated my FTP at 371 watts and I was able to do threshold intervals at that power. This is 10 watts higher than I've ever seen it and a week out from the race I put out a new PR on a local climb at 417 watts for just under eight minutes and this was after I had already done 30 30 intervals earlier on the ride. Yo I checked and you're still second on the Strava leaderboard on that climb kind of made this whole thing pointless if you ask me and obviously most importantly I showed up to the race with great legs which was the end goal of doing this. I've had block prioritization completely fail me before and the big takeaway from getting it right this time was to take the recovery afterwards very seriously. If you get too eager to get back to normal training it could be disastrous however if you take your rest seriously you may end up with some really good form. Thanks for watching if you enjoyed this video be sure to give it a like subscribe for weekly science-based cycling videos just like this one and share this video with your cycling friends. I'll see you in the next one.


Hey guys, I'm Shashvat. I work at Flipkart. Here are my two colleagues, Ankit and Ravi, who has helped. So we together have investigated a little bit about JavaScript engines, not JavaScript itself. So Flipkart, I'll just go in a very brief, that why we did this and all. We have started using Node.js at Flipkart. And as such, there was a very completely different experience when you use JavaScript in our server side as on browser side. And as with other languages like Java and all, which are VM-based, you experience unknown pauses when there is a lot of memory consumed. And that's the logical cause being the JavaScript memory management and all. So we investigated, we dwelled deep into a couple of JavaScript engines, SpiderMonkey and V8, and tried to find out what is all this mayhem about. So I'll go through a little introduction about what SpiderMonkey and V8 are. I think most of you guys know. A little bit into a theory of garbage collection. Then I'll talk about garbage collection strategy in SpiderMonkey, which IonMonkey is the latest version of SpiderMonkey, and V8. And then there are two closure sessions, which is why should you care? And some tips and tricks you can do to avoid memory pileup or GC pauses. So JavaScript engines is a SpiderMonkey and V8. Mostly sent to the IonMonkey.  So when you talk about JavaScript engine performance, you mostly talk about these three things that when Google launched V8, they talked about fast property access, dynamic machine code generation, and efficient garbage collection. So fast property access is that when you access a property in JavaScript, it's mostly most of the JavaScript engine or old-time JavaScript engine keeps it as a hash map. But Google came with something different. They came with a mechanism of hidden classes by which you can directly access a property just like you access a property in a statically typed language. Dynamic machine code generation is, again, it's more closer to generating just in time machine codes for JavaScript to make it efficient. And the last one is efficient garbage collection. So this is another place where they went away from the leak, which was a leak of Mozilla, another very inefficient JavaScript engines, which were using a stop-the-world garbage collection. So I'm going to concentrate on garbage collection in this presentation, and we'll talk about what the different strategies that these companies at SpiderMonkey and V8 utilize. So yeah, basically these are the points that we went for garbage collection here in this talk. Mozilla working on IronMonkey, one of the main focus areas in V8. Yeah, basically you got the point. So GC is the basic, very basic principle of GC is find data objects that the program has created is no longer required, and reclaim those resources. So the problem with this approach, against a traditional approach where, in a statically typed language, where you are responsible for creating or allocating the memory and releasing the memory, is that GC runs. When you allocate a memory, you don't care about releasing it in a VM, in JavaScript, or in other VM-based languages. So what GC does is, GC has to somehow collect those objects. And in the process, what it has to do is, it has to find out what all objects have expired. So it needs a lot of computing resources to find those objects, which causes unpredictable pauses in your program, if the GC is heuristic based. And then bad implementation of GC virtually lowers your available memory. Because if you haven't collected the objects, those memory is not available for you to reallocate again. So basically, if the garbage collection implementation is bad, you end up with a very less memory available with you. So what SpiderMonkey does is, they use mark and sweep algorithm. Basically, they mark all the reachable objects. Basically, the objects that are currently being used. And they don't mark the not utilized object in the mark phase. And then in the second phase, they call the sweep phase. They go and collect all the unallocated or unmarked objects, and release the memory allocated with these objects back to the pool. So sweep phase will basically unmark the marked objects. What SpiderMonkey in the latest version of Firefox 16 came up with is incremental mark process, where the traditional mark process is a stop the world process, where what happens is that it will stop the execution of the JavaScript execution. It will find all the objects, clean those objects, and then resume. But now what they have done is they have spread out the marking to a larger period of time. So suppose if a traditional garbage collection takes 100 milliseconds, one stop 100 milliseconds, they have divided into 10 stops. And they do garbage collection in a cycle of 10 milliseconds each. So now within those 10 milliseconds, your application can respond. And the performance is better, way more better. So incremental, they have break into small things. But what VA does is something different. So remember that in sweep phase, SpiderMonkey has to go through the entire heap. And it's a very big heap. What VA does is it divides the heap into, based on the age of the object. Basically it divides the heap into two parts, known as young generation and old generation. Young generation is small, where all the objects are allocated. And old generation is the part where the objects that have higher life cycle moves. So what happens is it allocates memory into young generation. When young generation gets full, it does a small GC. Moves all the objects that are still live into old generation and continues on. Now you have young generation free for more allocation. Then it does a full GC. Then it does a full GC to clear entire memory if it finds that both old generation and young generation are full. Now the advantage here is that your small GC pauses are very small now. Because you are iterating over a very small heap. But the full GC is still stopped the world. So keeping this point of view, what we did was we did a comparison of different these two engines based on what is the effect of these two engines on the processing. So we have divided the comparison into three parts. How much computationally intensive these engines are? Second thing is what is the effect of pauses? Third is how and what is the effect of garbage collection on memory? Memory management by your application. So if you talk about computational resources, both the engines come takes around same amount of resource. Because primarily because GC in both V8 and Spider Monkey is single threaded. And what ends up happening is that they stop the application for say 10 milliseconds. They will collect as many objects as it can and moves on. So both engines basically the computational cycle that is they consume is directly proportional to the number of objects the application has created and the size of heap. So computationally both the engines are comparable. There's no much difference. What is the impact on pauses? Now again, with the new Firefox 16 version, the pauses they have reduced the pauses. That doesn't mean so what they have done is they have broken the 100 millisecond cycle into 10 millisecond cycle. So that way they have controlled the pauses. But that have other side effect that we are going to talk about. But still, Spider Monkey has to scan the entire heap. Though it is doing it in a smaller cycle, V8 can do it much faster, much better because it has to scan young generation only. For most of the time, old generation only when young generation is full. But still when V8 executes a full GC, it has to scan the entire heap. So that's why full GCs have higher time. They usually take around 300 millisecond to 400 millisecond. So example being. So this is a small application that Firefox 16 guys developed to show the incremental pauses. I'll run it here. So this is the effect of. So this is what it is saying that how much time it took to basically collect from a heap. And the horizontal axis, basically the width of this graph shows how long it took. So if you see that with new Firefox 16, the collection cycle is not more than 44ms at any event point of time. So this is a test that was purposefully written for Firefox. This test doesn't perform well on Chrome. So if you see the pauses, pauses are going to 86 milliseconds. So I'll talk about why this is happening here. So what's happening is in this test, let me stop it. So what's happening in this test is that they've created a very big array, and they are allocating objects to it. So the array size is around 6 million objects. And they're creating, in each short burst, in each instance, they are creating, generating 8k objects. So what's happening is in mark and sweep, since the sweep time, the mark time is very small, only 10 milliseconds. And they don't care about memory in this test. So this test is running fine on Mozilla with 10 milliseconds pauses and a full GC pauses going around 22 milliseconds. But what happens in Chrome or VA it is that since there's a young generation and old generation, young generation is getting filled because there are 6 million objects. It is pushing all the memory to old generation. And gradually, old generation is filling up as well. And that's why there is a full GC happening at that point of time, 446 milliseconds. So I changed this test a little bit. What I did was I took the original array where 6 million objects array. I made it 1024. That is 1k objects only. And each cycle I was generating only 100 objects per second. Now Chrome was performing much better and has a very nice straight line of 16 milliseconds flat on this experiment, while Firefox had the same experience.  So I'll talk about it in a little bit more detail. So memory management. So what is the impact of JavaScript's strategy in memory management?  It will reduce your available memory. So what happens in that if you start collecting random objects from the memory heap, it starts leaving gaps. And those gaps may not be contiguous. And those gaps could be between two very large chunks of memory. There's a small chunk of memory in between. That's called fragmentation. I think all of you know that. So what SpiderMonkey GC does is it yields less usable memory after each GC. And that's what is perceived as memory leak in Mozilla. But V8, what V8 does is, once in a while, say, from after third garbage collection cycle, it does a compaction of the memory. So basically, it finds out these gaps and moves them into a contiguous space. So that's why if you run this experiment or if you run any experiment and you quit, you stop your experiment, you will find that V8 or Chrome, Chrome is not going to consume more than 300 megabytes, while Mozilla ends up consuming around 800 megabytes. And it never releases it until and unless you close the tab. Another thing that GC strategy affects here is object allocation rate. Both SpiderMonkey and V8 GC will not play nicely if you have a high rate of object creation in a very short while. Because both, in both cases, your memory fills up very fast, and whether it is young generation or whether it is a full heap scan, you are going to take the same amount of time to reclaim the entire memory. So in this context, both SpiderMonkey and V8 are equivalent. Another thing is object lifetime. So remember, I told you about that there is an array. In the experiment, there was an array and 6 million array. And the memories were getting added into that array. And it was getting cleaned. And there was a full GC running in Chrome, but there was no such case in Mozilla. So the fact here is the observation here is that V8 is not very friendly with the objects which have higher lifetime. If you create many such objects, and if you continue to create so many objects that have higher lifetime, then it takes to move from young generation to old generation, V8 will start crapping out. SpiderMonkey, there is no special effect there, because it anyway is doing full heap scan every time, and it is collecting those objects. Another thing that GC strategy impact is time it takes to allocate memory. It's very subjective. Usually V8's memory allocation is faster in most of the cases. But what happens is if your contiguous memory allocation is larger than the young generation memory heap size, then V8 has to move some objects from young generation to old generation, basically do a small GC. Or if the space is not there in young generation, it has to move the entire object allocation to old generation. And it has to do a full GC on old generation to get reclaim memory if it is not sufficient. So there it takes more time to allocate V8 in special cases. SpiderMonkey, again the special case being that if the memory is highly fragmented, SpiderMonkey will suffer. Because it will not find the space, and it will give you out of memory exception. So why should you should care about all these things? So you should care because if you are going to write a game, which is going to have to have 60 frames per second, then you will get only 16 milliseconds to do your job. And in that 16 milliseconds, if it is consumed by your garbage collection, then you will not be able to give you a very good user experience. Again, when you are rendering graphs. So we were doing some experiments in Flipkart around rendering a very large amount of data, some 20,000 line item data which has around 20 columns. So what was happening was during pagination, after one full page view, our entire application was halting, mostly because of there was a garbage collection running at the background. Again, web applications such as spreadsheets and maps where there are a lot of tiles that has to be moved around or that has to be juggled. This causes a problem. Having a GC which will pause the user experience when you are trying to move a map from one place to another or if you are moving from one cell to another. So in this process, basically whatever I've discussed in the last point, what you do is you generate a lot of garbage. There are DOM events flying around. You are adding callbacks and event handlers. There is you are modifying DOM elements. You are adding to the DOM element, removing from the DOM element. You have such, I talked about the data that you are rendering into a graph. Then there are discarded elements in animated or interactive applications like there are map tiles. There are discarded, say, character objects when you are developing a frame. So you generate a lot of garbage there.  Finally, I'll leave you with some tips and tricks. So the thing is that both the garbage collectors are very friendly with very short time, with very small objects which live for very short time. So try to use variables in a very narrow-scape, as narrow-scape as a scope as possible. And use wire inside the function. I think that's a standard practice in JavaScript, but I have seen a lot of code where it is not practiced. That people leave out wire when you are declaring a variable in the function, and what happens if it's end up declaring in the global scope. Another thing is that use small objects, large objects. Again, these spider monkey does not have a very high effect on large objects. But in v8, small objects, large objects tends to go from one generation to another generation, which cause extra GC cycles. And finally, if you can't avoid large objects, what you should be doing is you should be doing object caching. So yeah, that's what Google Maps does when it juggles styles. It creates local caches and all. Yeah, I think time is up. Any questions? I think I agree that it's a short presentation. It's a lot of stuff that I could have covered, but I didn't. So I'm very happy to take questions or anything, any doubt you have in this time. Can we get the tests or any samples from which you have acquired these results? Yeah, yeah. So this sample, basically I took this sample and I worked. This was released in Firefox. When they released incremental GC in Firefox 16, they have a blog post where they explain this example. I have tweaked this example with different parameters to test it on. So it's, again, it's freely available. I will send you a link or I can share the link. OK, anyways, I'll move on. I'll send you the, we are at the Flipkart booth. You can contact us there. Any other question? It is also will be there, where we can manually run the GC. Of course, it depends on the virtual machine and everything. Like that here, whenever we are free at not using the memory, we can run the GC. No, so in Chrome and Mozilla, there is no JavaScript function that can force a GC. But there is a Mozilla plugin which can do it for you. There's called Memchecker. Memchecker, let me just find it. So if you see there is a, this is the plugin. Memcheiser, sorry. Like, I mean, once again, this is the GC concept.   Whereas in Mozilla, it is fine. Means when you are writing the code, depends on the type of browser, you are allocating the memory accordingly or? No, no, no. We don't do that. What we do is we try to follow these guidelines which are friendly with both the browsers. Yeah. So point of this exercise was, first of all, we were trying to render a lot of data on web pages. Basically, something like showing 1 million, so when you are creating an analytic software, you have to deal with a lot of data, and you have to render that data or graphs on that. So what happens is if you move from page to page or data to data in the same web page, this lot of data actually consumes memory. And because of this memory, GC runs, and your performance becomes very sluggish. If you are doing an interactive. Again, another thing is that if you are developing a web server on Node.js, you have to be aware of these things because Node.js is a server, a pause there means that you are blocking tens of thousands of requests. So Spider-Bunk is not useful in that case. We did it as a comparison that what other JavaScript engines are doing. Yeah, I just needed one clarification on that point where you said the V8 is not friendly with objects which are kept in memory for a long time. Yes. So in game programming, you create an object pool and you keep reusing it. So that's. I didn't get the part. Yeah, in game programming, you create an object pool and then you keep reusing it, right? So does that mean are you referring to those kind of objects, objects which are used in games? So I'm talking about that use local object caching only if you are generating a lot of, say, tiles or some same set of data you are working on again and again. Only use them as a pool. Avoid pools most of the time. Create short objects, small objects with short lifetime. OK, I also heard that WebKit is very good with closures. So does that mean we should, does local object caching means you have more closures for V8? No, we don't do any special treatment there. And WebKit, I haven't worked with WebKit so.


Welcome, I welcome you all to this lecture in the course Introduction to Paninian Grammar. In this lecture, we are studying the technical terms provided by the South Nya Sutras in the text of Ashtadhyayi, the core text of Paninian grammar. We have studied the concepts of Vakya, Padha and then we are looking at the concepts of Dhatu and Pratipadika. We studied the South Nya Sutras which explain the concepts of Dhatu to us. Today, we shall devote time to study the South Nya Sutras which explain the concept of Pratipadika to us. There are two definitions of Pratipadika given in two sutras. This is the first one, Artha Vat Adhatura Pratyaya Pratipadika, 1, 2, 45. What this means is that a word form which is meaningful Artha Vat and which is not a verbal root Dhatu and neither a suffix Pratyaya nor a word ending in the Pratyaya is termed a Pratipadika. I repeat a word form which is meaningful Artha Vat and which is not verbal root Dhatu Adhatu and neither a suffix a Pratyaya nor a word ending in the Pratyaya a Pratyaya. This is termed as Pratipadika. So, Pratipadika is the South Nya, Artha Vat Adhatura Pratyaya is the South Nya. These are the qualifications of the South Nya which is a Shabda Rupa. What this sutra eventually states is that the undirived word forms which do not have a Pratyaya at the end, they are to be termed as Pratipadika. If we observe this definition, we note that this definition eliminates certain items to be called Pratipadika. So, this is in the form of negation of basic elements. What it says is no Dhatus, no Pratyayas but the meaningful units, they are to be termed as Pratipadika. That is what this definition seems to say. According to one view in the tradition, all non-verbal root that is all non-Dhatu words in the language, they are derived from the verbal root Dhatu and such words are called Yutpanna. Even in this view, there are a few words which are otherwise called indeclinables, avyayas at least which are not derivable and which come under the scope of this definition. According to another view, not all but some non-verbal root words, non-Dhatu words are derived from the verbal root Dhatu. Some which are not derived in this manner, which are called avyipanna, they become the scope of this definition. For example, dithadavitha, they are not derived from any verbal root. Krishna not derived from any verbal root, some scholars would derive it from some verbal roots but some scholars would not. So, this is as well as a Yutpanna. So, if it is a Yutpanna, this becomes part of this definition, scope of this definition. And also Chhva, Thu and He, which are indeclinable, they can become scope of this particular definition. Now, let us look at the second definition. This definition is given in the second sutra, 1246. What this means is that, and also the words ending in krith and taddhitas are fixes, as well as compound are termed as prathipadika. I repeat, and also chhva, the words ending in krith and taddhitas are fixes, krith taddhita, as well as a compound, samasa. They are also termed as prathipadika. If we study this closely, we note that it is 1246, which negates the term prathipadika for the words that end in a suffix. 1246 provides with two exceptions in case of such words which end in a suffix. Those words which end in either a krith or a taddhita suffix, they are the two exceptions, which can still be called a prathipadika. Now, what is a krith and what is a taddhita? Let us study this now. These are also the technical terms, saudnyas, defined by Panini in his sutras. Let us first study what is a krith, which is a part of a prathipadika. So, krith is defined by 3193, which is a saudnyasutra, as krithatim, very simple sutra. What this means is that dhato ho, atim pratya jaha, krith bhavati. A suffix added immediately after a verbal root, that is a dhatu, and which is not a ting, is termed krith, dhato ho, atim pratya jaha, krith bhavati. And I repeat, a suffix added immediately after a verbal root, that is a dhatu, and which is not a ting, is termed krith. The word form thus derived is termed prathipadika by 1246. Krith suffixes generally denote bhava and karakas, six karakas, karta, karma, karana, sampradana, apadana, and adhikarana. And we shall be dealing with these concepts in a while. So, the krithantha words, by krithantha we mean krith antha, that means at the end of which appear a krith, these words are primarily adjectives, unless specified otherwise to mean some noun or something. Here are some examples of the krith suffixes. Krithya is a big set of suffixes, including yir, tavya and anir in the section that begins with 3195, and goes up to 31132. Then trich, which is stated in 31133 is there, then trun is another example, stated in 32134, an is stated in 321, ghayi is stated in 3 318, tomon is stated in 3 3178, and kthwa is stated by 3426. These are some examples of krith suffixes. The krithya suffixes yir, tavya and anir, they denote karma and bhava generally, trich and trun, they denote karta, always, an denotes karta, ghay denotes bhava mainly, tomon denotes bhava, and kthwa also denotes bhava. Here is an example of krith suffixes being added to a verbal root, and how the prathipatika is generated. So, here we have the verbal root kru, to which is added the suffix trich, and here we add the suffix trun, and then by this derivation process, we delete chur over here and na over here. First of all, it is termed as a marker or ith, and we have studied these sutras by 133, and then this chur and na are deleted by 139. Then by applying 7384, kru becomes kr and we get the forms kr through and kr through again. The difference is however in accent. In this case, where trich is added, the final vowel is accented, kr through, and where trun is added, the initial vowel is accented, that is the difference, and we shall study this difference of accent later on in this course. And in an advanced course, the advanced theory is on accent. This is how krith suffix generates the prathipatika. Now, let us look at the second suffix mentioned in 1246, taddhita. What is a taddhita? A taddhita suffix is added after a prathipatika, to which a sup is already added. So, we have this formula. Prathipatika plus sup, to which is added a taddhita suffix, this gives rise to a prathipatika. This generates a prathipatika as an output. For example, if one wants to express the meaning descendant of the sharatha, then we have the sharatha, which is a prathipatika, to which is added the suffix as which is a sup, and we add the suffix inya, which is a taddhita after it. And this us gets deleted. And so, we get the form the sharathi as an output. This is a prathipatika by 1246. Dasarathi is an adjective and the sharatha from which it was derived is a noun. So, the taddhita suffixes we note in most of the cases, change the parts of speech of the given word. These taddhita suffixes are stated in the section from 4176 up to 54160. The sutra is taddhita, 4176. So, we note that this is once again an enumerative definition. All the suffixes that come in between 4176 and 54160, 54160 including, they are all called taddhita. There are more than 1000 sutras in this section and the suffixes stated therein they all are called taddhitas. So, this can be termed as a lexicon within a lexicon. And the arrangement of this big section is quite peculiar and very, very complex. Here are some examples of the meanings which get expressed by suffixes in this taddhita section descendant of, by the sutra tasya bhaktiṁ, coloured by dye, tenaraktam raghād, one who knows taddhadhita tadveda, born there, tattrabhavaha, modification of that, tasya vikāraha, its state, tasya bhavastvatalau, completion of that, tasya purane datu, measurement of, yattadete bhyaparimaane batup, position of, tadasthyāsthyasminniti matup, superlative degree, atishāya ne tamavisthhanau, comparative degree, drivachana vibhajyopavade tarabiyasunau. So, these are the taddhita suffixes. And the output of these taddhita suffixes is a prāthipadika, like dāsharathī. So, this is how kruta and taddhita are defined in ashtadhyayi and they are defined as prāthipadikas. Now, let us look at the third word in the sutra 1-2-46, namely samāsa. This is also a technical term defined in the ashtadhyayi in the following manner. What samāsa stands for is a compound stated in the sutra of 2-1-3 prakkadarāt samāsahā. What this means is the process of the words stated from 2-1-3 up to 2-3-3-8 in which the word kadara occurs are termed as samāsa. The term samāsa is thus once again an enumerative definition. All the words, all the processes stated in the section beginning with 2-1-3 up to 2-2-3-8, they are all called, all are enumerated as samāsa. The word samāsa is derived from the verbal root asa with the preverb or upasarga sum added to it and the suffix a added to it. What this means is words thrown out together. This is derived from the verbal root asukṣepane asa which means to throw. What it eventually means is that words which are otherwise thrown out of mouth as separate as independent are thrown out together as one unit and that unit is called samāsa or a compound. Let us look at this term closely. Samartha words in the sentence form the base for the process of compounding to start with. Samartha means fit to convey the same meaning. So if you have a sentence like rādhnyapurushogacchati meaning the man of a king goes. In this we notice that man of a king is a peculiar phrase in which man is linked with the king as the servant of the king. So there is a relation of swaswāmi bhava in this particular sentence between man and a king. King is the swāmi, man is the swa, the servant. So now man and king they are fit to become the input of the process of compounding and the derived word form would denote the same linked meanings. So we have rādhnyapurushah to begin with and from that we go to rādhan plus us and purusha plus su we delete us and su and then we have rādhan plus purusha then nā gets deleted and we have rādhya plus purusha and then we have rādhya purusha and this word rādhya purusha conveys the same meaning as the words rādhnyapurushah. So if we use the words rādhnyapurusha gacchati in a sentence they would convey the same meanings when rādhya purusha gacchati is used. In this way rādhya purusha is samartha is capable of expressing the same meanings as as rādhnyapurushah also interlink same meaning is conveyed in the sentence by these two words and in the compound by one word. So in the compound what happens is both meanings become one two meanings become one. Here are some sections within the ashtadhyayi which deal with the topic of compound or samasa. So for example in 2.1 and 2 compound prescription is stated in 2.2 word order in the compounds is described in 2.4 gender and number in the compound is stated. In 3.2 upapada tathpurusha compound is stated in 5.4 samasanta suffixes are stated. In 3.2 upapada tathpurusha compounds are stated meaning the suffixes which form the upapada tathpurusha compound they are stated upapada tathpurusha compound is prescribed in 2.2 by the sutra upapada matting. Coming back to 5.4 samasanta suffixes the suffixes which come which are added at the end of a compound are stated. They are part of the tadita suffixes. In 6.2 the compound accent is stated in detail. In 6.3 operations on the first member of the compound are stated. Apart from these sections there are some other sections in which compound is treated for various operations like retroflex in 8.3 and 8.4. There are 3 features which are described in the paninian grammatical traditions the features of a compound they are aikarthir, aikapadir and aikaswarir. aikarthir means one meaning, aikapadir means one word and aikaswarir means one accent. These 3 are the features of one unit called a compound or a samasa. So 2 units in the form of meaning and words and accents they become one unit with one meaning and one word and one accent. So for example raja sambandhi purusha this is the meaning which becomes one as a word raja purusha and you get one accent as far as raja purusha compound is concerned. There are 4 main types of compounds described here avyayi bhava, tad purusha, bahuvrihi and dvannva. The 2 examples of avyayi bhava compound are pratitina and yathashakti and these to become pratipadika to which sup is added. Tat purusha the examples of tat purusha are kumbhakara and nakhabhinna they become pratipadika. The 2 examples of bahuvrihi are lambodara and ekadanta and they become a pratipadika. 2 examples of dvandva are ramalakshmana and hastapada and they become a pratipadika. Meaning wise the compounds are stated in this particular fashion. So avyayi bhava is stated to be prayana purva vada padartha pradhana. Mostly the meaning of the first word first padar is the main in avyayi bhava compound. In a tad purusha compound mainly the meaning of the last element is the main prayana uttara padartha pradhana. In a bahuvrihi compound it is mainly the meaning of the other word not stated as constituent of the compound is the main prayana annepadartha pradhana and in a dvandva compound prayana ubhayapadartha pradhana. That means that both the words act as the pradhana the meaning of both the words acts as pradhana as far as dvandva compound is concerned prayana ubhayapadartha pradhana. This is how samasa is treated in the ashtadhyayi. We have treated the concept of samasa in brief. We have tried to understand the saudmya sutra which describes samasa. All this comes to the basic point that the samasa is termed as pratipadika by 1246 krt taddhita samasascha. So the words that end in the krt suffix, the words that end in the taddhita suffix and the samasas they all are called pratipadikas. So what is not a pratipadika? It is interesting to know what is not a pratipadika. So the forms which express the feminine gender they are not a pratipadika. A suffix is added after a pratipadika to express femininity in general. Here is an example. We have a pratipadika ajar which means a goat to which is added a feminine suffix a which gives us an output ajar. Similarly we have the pratipadika gaura which means fair or white to which is added the feminine suffix e which then gives us an output gaury. So what is the status of these words ajar and gaury? Are they pratipadikas? No. Why? Because they are formed by adding a suffix and therefore 1245 cannot term them pratipadika because 1245 says arthavat adhatuhu apratya ajar. A meaningful word element which is not adhatu and which is not ending in a pratya ajar is called pratipadika. These two words are ending in a pratya ajar and therefore they cannot be termed pratipadika by 1245. Now in 1246 two examples were given of the words which end in a pratya ajar as an exception to 1245 and those words are also called pratipadika and they are krt and taddhita. Now these suffixes a and e expressing the feminine gender they are not part of the krt suffix nor part of the taddhita suffix and therefore they cannot be termed pratipadika by 1246 either they are just left as they are ajar is neither a pratipadika nor anything else. It is a word expressing feminine gender to which is added a suff and this is made a padha which is eligible to be used in a sentence that is all this is not a pratipadika. What is a function of a pratipadika? Addition of a sub is an important function of a pratipadika. So, we take krt through a krdanta word to which we add the suffix sub and we get the padha krta. We take dasarathi a taddhita word a taddhita pratipadika and we add the suffix sub to it and we get the padha dasarathi. Similarly, we take rajapurvisha a samasa and we add the suffix sub to it and we get the form rajapurvishaha which is a subanta. Similarly, we add a feminine suffix to a pratipadika. So, if we take krt through which is a word which is a krdanta pratipadika we add the feminine suffix e to it and we get the form krtri which is once again not a pratipadika but krtri expresses the feminine gender. These are the two important functions of a pratipadika. To summarize, the technical terms in the Paninayan grammar reflect the structure of Paninayan grammar. Tatu and pratipadika are the basic building blocks also noted as the linguistic atoms these represent the lexicon of Sanskrit language. This lexicon is both derived as well as undirived. The derived lexicon is interlinked with the internal lexical items and the derivation of such a lexicon is theoretically at least infinite. This lexicon is static as well as dynamic. It also reflects the productive capacity of Paninayan grammar. This capacity to produce such n number of sequences is the strength of Paninayan grammar. Using this capacity modern Indian languages derive vocabulary to express newly arrived and arriving meanings. These conclusions that we have drawn, they are similar to what we also drew earlier. This similarity is the highlight of the analysis. The roots, the technical terms dhatu and pratipadika, they are the backbone of this derivation system of Paninayan grammar and so the effective use of these two technical terms smoothens the derivation process on the part of the Grammarian Panini. This is what is to be highlighted by this similarity in the conclusions. Now, we shall study some more saudnya sutras in the coming lectures, notably the karakas and some other technical terms which are called krima technical terms, the artificial technical terms. But before going there and before closing today's lecture, let us follow our practice and recite one more Mangala Charana. This is taken from a commentary called Vishama Padabhyakya composed by Nagesha Bhatta 18th century CE and the Mangala Charana reads like this. I repeat. And the five sutras of today are taken from 631 up to 635 and they are sastrti yayaha manasas saudnya yam and adhnya yinicha. I repeat. Thank you for your attention.


Hello, my name is John Garbert and I'm Principal Engineer at StackHPC. Today I'm going to talk to you about the projects we've been doing at Cambridge University, which is expanding their CSD3 supercomputer with some new hardware and making use of OpenStack to do that. So a little bit of context on CSD3. It's the Cambridge service for data-driven discovery. It's got a mixture of regular CPUs, Intel Xeon CPUs, Intel K&L, and Nvidia GPUs. When it was first installed, roughly about November 2017, it was one of the fastest UK supercomputers and it was in fact number 75 in the world and the top 500 list. CSD3 has been, so far, has been provisioned using XCAT. So effectively you take a running machine, you create an image from that node, then that image is pushed out to all the other nodes using XCAT via, effectively via pixie-routing the machine and pushing the image down. And all the resources within the system are accessed via a Slurm cluster. So a batch queue that you submit your jobs to. So there's some reasons that they wanted to change the way they're currently working when they're looking to expand the cluster. The first one really isn't as many people have as an increase in complexity. There's always more different platforms that people want to run and people wanting to self-service their needs. And they need some help managing all of this complexity that's coming along as things get more and more diverse and the workloads that need to be supported within the cluster. At the same time, this is causing problems with knowledge sharing as they're looking to use automation infrastructure as code tooling to try and manage the complexity and help with this resource sharing. So using peer review and checking things, having a git repository with a good history telling you why things happened in the past but applying this to infrastructure. Another part of this is removing resource silos. So the moment when hardware is purchased, it usually gets a specific platform on it and it's often stuck with that for its lifetime. That can look a bit like this over the traditional HPC stack 1.0. You have different silos of hardware for different use cases. So there's a silo that's good for Hadoop and there's a silo that's good for AI and deep learning. There's a silo that does traditional HPC and these are often quite separate. Now the hardware is getting more similar between all these things and people in each of these buckets are wanting hardware from the other one. It's getting increasingly complicated to try and deal with all the shifting, hardware needs, all the different resource requests over time. So what we're looking to do is to bring an open stack to help with that. So you have this single pool of bare metal and hardware resources but we want to expose them through a single set of APIs. So whether you want bare metal or VMs or containers, you can come to open stack and spin those up and on that run your science platform. In addition, they're also trying to look at building these science platforms in a more sort of cloud native way such that when there's resource needs that can't be met locally because the system is fully used and there's the option to move those workloads that can move to external clouds where it's generally more expensive to run there but that time can be used if that's a good use of money. One of the key things that we're doing here is to use Ironic to enable those bare metal workloads. So we're looking particularly in this talk at how we expand the CSD3 partition with new nodes using OpenStack Ironic. So let's just take a moment to have a look at Cambridge's High Performance Computing Services OpenStack journey. It started roughly back in 2015. They're one of the founding members of the sort of resurgence of the OpenStack scientific SIG and they've been doing a lot of work telling the OpenStack community and the world what they've been doing and what they need OpenStack to do and trying to make that happen. In particular using the SKA and its need for a performance prototype platform and seeing how you can use OpenStack bare metal to do that. But actually if you look more widely at what Cambridge has done there's loads of varying different use cases. There's virtualised clouds and bare metal clouds although they all generally have a specific sort of a slightly specific flavour. Whereas we come to the new cloud that's been created to expand CSD3 that's got the name Arcus and this is an attempt to create a more unified cloud. And the particular use case that we haven't been able to satisfy until now is actually to be able to look at large scale HPC. So can the main cluster that Cambridge are using be deployed using OpenStack? So this is the expanding of CSD3 using OpenStack. So firstly some notes on the hardware. We're using Dell PowerEdge C6420 servers. So basically you get four dual socket machines within a 2U footprint. For the sake of this talk let's just talk more about the networking. Well there is a local SSD and there's a one gig NIC that can be dedicated for the outbound management network. Now this actually also can be optionally visible inside the OS. So the main networking for the system is a Menonix ConnectX6 card. One of the ports is used as a HDR100 port. So the HDR200 switch with a breakout cable with two HDR100s per switch port. And a very similar setup for Ethernet where the Ethernet 100 gig switch has a breakout cable for two ports each one being 50 gig. So there's a 100 gig of infinite band and 50 gig Ethernet on every one of those servers. So job number one was finding the machines. Cambridge have quite a well practiced path in which they discover the servers where basically once it's racked and stacked then they scan the information using a handheld scanner and that gets exported into some spreadsheets. So you can generate a CSV file that shows what you expect to be in the rack. So what we're going to do is take that CSV file and automate everything from that point onwards. One of the key pieces of information that CSV file is the MAC address for the outbound management port. In this particular case we use Neutron to hand out the IP address to the outbound management network. And this port isn't actually bound but the Neutron DHP server still happily hands out the IP address to the MAC that requests it. So we use Terraform actually to create those ports from the CSV file and then we generate an Ansible Inventory from that same CSV file and that Ansible Inventory is used to basically do all the automation from this point onwards. So as soon as possible we get the node enrolled into Ironic. The first step is actually to enable IPMI so that we can actually add the node into Ironic. We want to use the IPMI driver. We'll come on to more about that later. So we enable IPMI then we enroll it into Ironic. Now we basically use Ironic to track this machine throughout its enrollment state. So in order to get the machine fully functional we actually have to configure in-band the Connector 6NIC and we actually do this inside the Inspection RAM disk. So when it first boots for the Inspection RAM disk it checks the state of the Connector 6NIC. If it's not what's expected it updates the NIC, updates the firmware, tells the NIC which port should be Ethernet which port should be InfiniBand and then reboots and then does the inspection. So now from this inspection we should have mostly the information about the node. And then we in fact, actually what we do is we change the BIOS settings to start to disable the 1GIG NIC and start pixie-booting over the 50GIG Ethernet NIC. Now that's available. And then once that's all configured then we do an inspection again over the 50GIG Ethernet and that updates the pixie MAC address and all the other data so that we're then ready to image the machine. So building up the Slurm cluster, creating the Slurm cluster using Terraform we're actually using that same CSV file that says this is the hardware name and this is the logical cluster name. So the hardware name is the Ironic node name and the logical cluster name is the name of the Nova instance that we create to sit on that specific bare metal node. So we actually use the AZ mapping to target specific bare metal node. The key part of the image they deploy is that when the image boots on the server, the cloud in it as usual via a config drive, it gives the server the correct name, host name and IP address. But from that point it then mounts NFS share which gets the Slurm configuration and Slurm starts up and just joins the main existing CSD3 Slurm cluster. So we've got these OpenStack powered nodes rejoining the main Slurm cluster. The main Slurm cluster having had its configuration updated to include these new expected nodes. But as an aside, the idea is to use Ansible for the image build process as well as ad hoc changes to try and keep these two things in sync. Now in terms of rebuilding the nodes, once the cluster is up, it's quite common for monthly or whenever the next vulnerability is found to have to read and to update the kernel. And obviously any of the vulnerabilities and the stack in the packages installed on the system. Often it's cleaner just to reimage the node. So we really need to do that without interrupting the operation of the system. Now when they do this with XCAP, what they do is they change the Pixie Boot server to start handing out a new image. And that means that when any of the nodes reboot, they just pick up, they Pixie Boot in and get the new image and reboot back out of that. What we've done for OpenStack is that we've actually got a custom Slurm reboot script. So when the reboot command is sent, the reason basically includes a string that includes the fact that we want an OpenStack reimage opt into it. And this is the image UID to reimage on. And so this script actually uses the instance UID from Comfig Drive, well from Clavinet. And it uses that and the image ID that the user specified to re-image to send a re-image API command to OpenStack. And that's actually what reboots the node and goes through all of the ironic process to rebuild and reimage the node. And that's proven to work really quite well. We can within about 20 minutes reimage all 56 servers in a single rack. Now we have to do make some changes to get that. So tuning ironic for scale. So the main focus has been on this rebuild to apply new kernel update and how to do that as quickly as possible. The first part actually was getting the networking working well. So we're using multi-tenant networking with an ironic. In particular using the networking generic switch driver. We started off using the actual networking driver for the cumulus switches, but this proved too slow. We used a networking, moved to a networking generic switch driver, which actually has been contributed upstream and is now merged upstream in the latest release. The main reason this driver seems to be faster was they actually only does one commit of the switch config for every port update, whereas Ansible networking was doing two commits. And that seemed to be where it was bottlenecking on the switch. It's got about an order of magnitude faster. It's taking about 1000 seconds for the slowest ports to bind Ansible networking for a whole rack. It's taking about 300 seconds with this cumulus driver. The advantage of the cumulus drive also was that extra configuration on the port such as like this is an edge port. In terms of spanning tree configuration or that configuration gets persisted and the description of the port. It doesn't get blown away, whereas Ansible networking was actually deleting all of that information. Anyway, we used a networking generic switch and it didn't do that. One extra thing we developed was actually using SCD to batch up the requests. So basically when a request came in, we wrote the request to change the switch config to SCD. And then every request that comes in kicks off an async job to get all the latest requests batched together and submit them to the switch. And then it waits for the result. So anyway, with this mechanism, we're able to get the time down to reconfigure the switch to well under a minute to reconfigure the switch for the whole rack. And when you actually look at the port configurations that happened to happen during a rebuild process, you actually have to pull the port out of the tenant network and then put it into the provision network and pull it out of the provision network and back into the tenant work at the end. So speeding this up was a big help to the amount of time it took to reimage the node. When picking the driver, we can quite get the Redfish driver to work for some reason. So we originally started with the iDRAC driver, but on closer inspection when it set the Pixieboot mode, that was actually requiring a reboot to actually set the Pixieboot mode. So we moved back to just a simple IPMI driver. And that avoided effectively avoided an extra post cycle, which saved quite a bit of time. It was quite a bit of work deciding which deploy mechanism to use. Typically we've used iSCSI. Now this has been deprecated upstream, which also pushed us towards trying to direct deploy. In this case, we're using direct deploy using HTTP, not Swift. Just because we don't have a very particularly high-performing object store ready to use right now. So it seemed sensible to use the HTTP method. Now originally slipping to direct deploy, actually we saw a massive increase in CPU usage in ironic conductor. I tracked this down to the force raw images flag and we set that to false. That went away. In part because of the image conversion, but actually the biggest problem was probably using Python to check some of the image. With the large images, that was taking a long time when all of the instances were doing it every time, to check some. Anyway, force raw images false made a big difference. Moreover, rather than when the IPA round disk is now pulling from the conductor, it can now pull the QCAM image, which is generally much smaller than what the raw image would be. That saves more time in the data copy. Now this does move work from the conductors to all of the compute nodes, but given we're trying to scale this out to lots of compute nodes, that's exactly what we want to do. So the particular problem here is that we're forcing the case where we want to build all of this, almost 700 nodes, we want to rebuild them all at once. That's really what's causing this to be a problem. Now when we were looking at the CPU usage spiking for the ironic conductor process and the ironic conductor process was getting up to, the process itself was getting up to about 100% CPU occasionally. And we turned off the power sink and that really did reduce the amount of CPU, which gave more overhead. But once we get started deploying, maybe that was less relevant, we could probably maybe look at turning this back on, but certainly turning this off gave more CPU available. Now there was particularly tricky issue to debug when we were looking at this. There were lots of connection issues. At first I was fearful that actually downloading the image to the IPA RAM disk was actually interrupting the sort of normal communications to rabbit, to the database, to Keystone, to Glance, to other things. I even actually added trying, there's a Glance retry parameter for ironic. So increasing that, but that didn't really actually help the failures actually getting the Keystone token. With a detailed look at HAProxy logs and in particular looking at the documentation for the HAProxy logs, it turns out what was happening is we were hitting the connection time out. So I believe this is the amount of time it takes for the connection to be established and for the request to be completed from the client. I'm fairly sure this is related to Eventlet and its scheduling of the threads. I think what was actually happening as the connection was started. Then it took an awful long time before basically various other lots of threads started their connections. And eventually it got back to the beginning where it got to finish its connection and send the rest of the request. And certainly we saw raising the connection time out from the default of 10 seconds or the default in color for 10 seconds up to about 30 seconds got rid of all of these connection problems. The first time I bumped the connection in HAProxy, we then started only seeing the database problems, but in a slightly different way. And on closer inspection, ReaDB has its own connection time out, which we also bumped, which got rid of the database problems. I also tried to tweak the database connection pooling so that the connection pool didn't grow quite so big. So there was more chance for it to actually deal with all the connections it had in flight. But in reality, I think it's the connection timeouts that made all the big difference. One final thing when doing the server deletes. The other thing is that we actually saw some RPC timeouts. Things just taking slightly too long when all of the deletes all came in at once. There was no throttling on that. Increasing the timeouts got around that. I'm sure there was something more clever I could do that got us over the hump. So before I leave this topic, I think it's worth highlighting the monitoring. The monitoring really helped actually understand what notice is going on. We used the built-in Prometheus support in Color Ansible alongside the Fluorin plastic search and commander to collect the logs and look at those across all the controllers. And that worked really well to get visibility on what was happening on the controller nodes. In addition, we actually added some extra bits. We actually ran node exporter on the cumulus switches. This was particularly useful for traffic flowing into IPXE and traffic flowing into the IPA RAM disk where we didn't really want to run an exporter. So we could actually get visibility into the traffic between all the compute nodes just by running node exporter on the cumulus switch and that worked surprisingly effectively. Another piece we were using the Redfish exporter just to get hardware metrics. In particular, there were lots of metrics about things like power cables getting knocked and various things. I'm sure in main production this will be much more useful, but in terms of bringing up the system, it was very useful in spotting some of the problems. And some of the insights I was saying about what was happening when I run a conductor using maximum CPU, the guru mediation reports were really useful in telling me exactly what all the event threads happened to be doing. We did see some issues with image download looking like it was stopping progress for other ironic conductor threads like the DB updates. Especially just said that she tuned the amount of time it takes for ironic conductors to think that the other ironic conductor is dead and redo the ring just in case that the DB was busy. Using the guru mediation reports we were able to see what all the event threads were doing. Which was really useful. So what's next? So going back to the original vision of having this one open stack to rule them all. So there's a single hardware pool. We're not there yet. Really, this work has proven that we can actually, for a large scale HPC, use open stack and use ironic to provision it. That's worked really well. But right now we're kind of in the situation that half of the cluster is still using Xcap and the new bits of the cluster are using open stack. Now the old bits of the cluster, we could just let for all this hardware to age out but I think it'd be nice to, may well make sense to move some of that into open stack just so we can get the flexibility that we need between the different pieces. There's some work on SRV we'd like to do. Now we're using Infinity Band rather than OPA on the new cluster. We should be able to get RDMA inside the VMs using SRV. We have to do this elsewhere. We just want to pull this to the system. Building on all of that, we want to use open stack magnum deployed Kubernetes clusters to make use of all this. In particular targeting things like Horovod, we've got distributed machine learning where you want an RDMA transport for low latency links between the GPUs that are attached in all the different VMs. And generally there's some loose ends around operational tooling. One particular one is one of the key things that we want to be able to do is if we've got this over cloud ironic that has all of the Slurm cluster in when some of those need to get converted to hypervisors to host VMs and various other things we want to make that really easy to do to be able to come to take the node out of the Slurm cluster That's a well-known thing, but we just want to be able to easily deploy the hypervisor on there rather than have to... Currently you typically have to move the hypervisor, enroll that hypervisor in the Yfrost that we've been using to deploy hypervisors but really we should be able to directly use the the ironic that's running within the cloud to deploy the hypervisors if that's what makes sense, which should do in this case. There's some bumps around networking so we need to trunk VLANs down. There's no support for that in the NGS Cumulus driver but I'm sure we can work our way around that one way or the other but making this slick will really help make that one open sector with a more vision, more of a reality. So thank you very much for listening. I kind of hate thank-you slides, I always feel like I missed one off. A big thank-you to the OpenStack community. Loads of support through the OpenDev, lots of great discussions actually really helped with this work. Particularly gives a lot of confidence on the direction towards scanning. A lot of people do the scanning to scale out bare metal stuff. Lots of great conversation with the folks at CERN on what they're doing because it's a very similar use case. A great thanks to Cambridge University for being such great partners to work with and great thanks to all the funding bodies that have funded this work. The link at the bottom of this slide is a sort of press release on the background of where this particular expansion of CSD3 came from in the context of that funding and also all the industry partners and vendors that have worked to help support the sort of co-development and co-design of this project, the Dell Intel NVIDIA metal knocks. Maybe they're the same thing now. Thank you very much everyone for listening.


Well as I mentioned it was a big night for Republicans in the state barring potential recounts of too close races. It appears Republicans have taken over control of the Senate by one seat and have increased their advantage in the House by four seats. Malmeyer has more on some beneficiary races that went Republican for the first time in several years last night. After eight years in the House, DFL Representative John Purcell lost to Matt Bliss. He said while they have debated back and forth about policy, they have had some agreements. There is agreement that the issues need to be addressed. The challenge now will be, obviously, though the new Minnesota legislature really take those up or not. He says that during his tenure he helped to get the ball rolling for education funding, transportation and infrastructure, and affordable housing reform. I'm proud of what we were able to accomplish for the state of Minnesota in the last eight years. A lot left to be done. Matt Bliss, a resort owner, says he will work to give tax cuts to small businesses and working families. He says that he hopes to see Minscher abolished and have the previous system amended to fit the Affordable Care Act. We have both Houses now in St. Paul, so there's really no excuses anymore. We need to get down and fix the problem. Bliss described Purcell as humble and gracious when they spoke earlier this morning. I told him that I'd be welcome. I'd welcome his telephone call anytime. Matt Grossell, a retired sheriff deputy and veteran, ran heavily on a pro-life platform. However, he also plans to focus on Minscher. With their finances, the kids have been dropped and they've not been able to get them back on. So the health care has been a big issue. He also wants to work on the proposed bonding bills that were not passed and the creation of veteran homes. The veterans that have served our country, they deserve better treatment than what we've been giving them. His opponent, Jerry Loud, did not return repeated requests for comment. In Bemidji, I'm Mel Meyer, Lakeland News. If you've enjoyed this segment of Lakeland News, please consider making a tax-deductible contribution to Lakeland Public Television.


So in jikandou, let's get Will in here for a second, in jikandou I want to be able to beat him to the punch. Now if I have my hand out here it's already halfway to the target. And then when my foot is caught here I'm getting ready to launch an attack. So I want to be able to attack him before he attacks me because in a street fight situation people are not going to guard and dance around and wait for somebody to launch an attack. They're going to have their hands down most of the time and it just comes out and hits. So in a street fight situation the reason that jikandou is very good is because when he attacks I want to hit him before he can even get his attack off. That's the term jikandou intercepting this. I'm intercepting because he's attacking and I'm already there.


CV 19 What's up my name is Mr. V here. Welcome to another video guys. So in today's video I want to talk to you guys about my top five pharmaceutical companies that are currently working on a vaccine for CV 19 I don't want to use the full name because YouTube is gonna flag my video if I use the full name So I'm gonna use CV 19 and I'm pretty sure everybody understands what that means.  It means we still need to find a way to come out of these come out on top So for you as an investor, you're still looking at opportunities that would help you come out of these Not only come up will come out stronger. So for my pharmaceutical companies A lot of them are currently at work like seriously trying to come out with a vaccine for CV 19 And it's a race to the finish. So whoever comes out with the first vaccine that can actually Allow people to go out and go about their businesses or allow all businesses to open up that company is going to Explode the question is are you going to be part of that explosion? And so for me, I'm actually tracking five main companies that are actually in the process Some of these companies their products or their vaccines are already going through Stage one or stage two or even some entering into stage three trier So keep an eye for them.  So the very first one on the list here is ticker symbol and VAX and again These are all pharmaceutical companies that are involved in the development and distribution of vaccine So NVAX is actually out there putting in the work and trying to come out with a vaccine I think as of right now, they're going through stage two of their of their trier And just trying to make sure that they come out on top because like I said, it's a race to the finish And most of these companies that you see on the list of actually taking money from the government of the United States and other foreign government like I and O on the list here has taken money from South Korean government to try to help them develop a vaccine. So Keep your eye open. So also when I was doing this video and VAX was actually trading at about twenty one dollars a share Again guys, this is a company that if they announced tomorrow that they have a vaccine a viable vaccine for CV 19 they are gonna explode that twenty one dollars can easily Go from there to maybe two hundred dollars three hundred dollars a share So just keep your eyes open next one is CODX again is the same thing working through the process of trying to develop a vaccine As of when I was doing this video, I think CODX was actually trading about thirteen dollars a share Again putting in the work trying to make sure that they come out on top and whoever comes out on top Get all the benefit gets all the money that their vaccine is going to be distributed worldwide The company is gonna get a ton of exposure growth is just gonna Escalate and so the thing is you track all of them and hopefully jump in just at the very right time The the objective is keep your eye on the news watch this company is every single day what they say And what they are doing follow the different levels of their tries If a lot of these news might come out Maybe late at night when you sleep or stuff like that put alerts on your phone to actually track it Even when the news comes out before me and you would hear it I mean top investors out there on Wall Street would have gotten the news already So they would have gotten and bought all the stocks So me and you might not catch the very bottom But at least you can jump in and get your own piece of the cake So don't just give up continue to track them Number three is I and oh this talk has been a roller coaster. It's gone up.  It's gone down like I mentioned earlier. They are in the process of developing the vaccine as well and they actually Got some money from the US government and some money from the South Korean government and so It's really really a pressure time to try to get this vaccine out there So when I was doing this video that I think the stocks were $12 At one point they went up to about $19 then dropped back to six And then now they've started to squeeze back up and again like when I was doing this video They are at $12 a share. So Number four is M RNA again This is another one that has gone through so much wings doing the same thing trying to come up with a vaccine The one thing I want you guys to understand here is that they are trying to create a vaccine for for CV 19 But the approach that they are using is what differs how the vaccine works is what differs And I can actually explain a little bit of that in a different video and last but not the least G I L D Gillette so they are in the process to get face to try it came out really well They had some positive news and now so they're looking at moving into phase three And if that turns out good again more good news means that these companies are Priming to explode so we'll get ready. So just on my top five my CV 19 Companies or CV 19 pharmaceutical companies Let me know in the comment section. Are you tracking any other company that it's in the process? I know a company like Johnson and Johnson is also out there Hustling and trying to get it. So but these are ones that are primed for explosion because the stocks are relatively cheap Johnson and Johnson's are really like I mean that's a big name, you know in the pharmaceutical space Even Gillette is a big name, but not as big as Johnson and Johnson So this one sir if you go in they can explode and make you a lot of money So question of the day, are you tracking any of these stocks on the list? If not, which other pharmaceuticals companies are you tracking that are in the process of developing a vaccine for CV 19? If you haven't already subscribed to the channel go ahead and hit that subscribe button and the notification bell because YouTube tells me that 90% of you guys watching having already subscribed to the channel like share subscribe and as always guys stay safe Stay motivated


I was hoping that Mr. Lewis, can you discuss the relationship between digital redlining and competition and aside from reducing cost and what ways can people benefit from having increased competition among providers in their area? Sure, Ms. Rochester, where we see little competition, I think we're more likely to see digital redlining where a company may choose not to serve or sometimes digital redlining isn't just that they choose not to serve a neighborhood they simply don't upgrade the infrastructure there to get the newer high quality broadband speeds and reliable networks. So competition hopefully will drive them to want to serve those areas in order to get the subscribers that are there. This is happening in urban and rural communities and tribal communities but it's really sad when it happens in urban communities where there is the density but simply not the value placed on those specific neighborhoods. Great, thank you. And in preparing for today's hearing my staff was really unable to gather sufficient data on broadband access because the information is not made public. I'm proud to have supported the Broadband Data Act to require the FCC to reform their existing broadband deployment maps but we also need more public data on broadband pricing speeds and adoption. Ms. Occhillo, in your testimony you stress the need for better and more data as we work together to address the digital.