Today we are here to know something about the reptiles of North East India, we will give emphasis to North East India and we will also know what are the different species of reptiles are found here in North East India. As you know reptiles and amphibians are grouped together into a subject called herpetology. So the subject we do with the study of reptiles and amphibians are called as herpetology. So I am a herpetologist and I am doing this herpetology. So here in North East India as you know the diversity of all the animals like plants and animals both are astonishing. It is very very diverse as you know from this picture this is the different global biodiversity hotspot of the world and marked in red. So India has two biodiversity hotspots and both these two, one is West Bengal and one is North East India. So as you know this North East India falls into two biodiversity hotspots zone. One is the Himalayan hotspot region and one is the Indo-Burman hotspot region of the world. So we might ask a question that why this diversity is so much prominent in North East India. That is just because of the you know North East India's geographical position border shared with China, Myanmar and Bhutan all these international boundaries. Plus the ultitudinal diversity what we met the physiography of the region is so that it supports lot of different types of habitat. So from this picture we can see that the number one, two and three these are the different geographic zones of North East India. So this number one zone is the Himalayan range. Number two as you see the plain area is the Assam plain and the number three is the continuous mountain chains which are known as North Eastern Mountains. So these North Eastern Mountains are low to mid elevation hills and these are also low to very high snow peak mountains and this is Eluvial Assam plain the position of the Brahmaputra river. So this picture probably tell us the single picture tell us the ultitudinal variation in North East India. As you see from this this is the river valley and then it starts the tropical evergreen forest which is the most important habitat for reptiles. And then sub-tropical to temperate vegetation occurs at 1000 to 2000 meter elevation and then we have the snow cloud peak. So as you know the reptiles they are not much pronounced in this zone. So most of the reptiles and amphibians are concentrated in the tropical and sub-tropical zone of North East India. So going into the forest in North East India we have this tropical evergreen forest the close up of the forest. As we see this forest are very thick and impenetrable and all the trees are having lot of epiphytes. So these are most favorable habitat for reptiles and amphibians and these forests are also having lot of mountain streams with big boulders and rocks and with two lines of vegetation which are very favorable habitat for reptiles and amphibians. And as we go higher we have this sub-tropical forest which are all the very cold climates and all the trees are bryophyte laden. So coming to the reptilian diversity what we have in North East India. So far in India we have something around 280 species of snakes but we have in North East India we have 102 species so far recorded. But the total reptilian diversity as you know reptiles consist of crocodiles, turtles, lizards and snakes. So we have one species of crocodile which is very much threatened nowadays the Dharial. 21 species of turtles, turtles, fauna is the most rich in North East India. Out of 29 species in India 21 occurring in North East. 50 species of lizards and 102 species of snakes are being recorded from North East India. So first starting with crocodile in India we have this is called saltwater crocodile, crocodile as porosus. This is a mother crocodile, thresholded crocodile and crocodile as pelustris. And then we have Dharial the most long snout crocodile. So these three different types of crocodile occurring in India. Out of which in North East India Dharial once occurred in the Brahmaputra and Bharat river system but now it disappeared in the last couple of decades. So why Dharial disappeared? So characteristic is that they are the largest freshwater crocodile and rank closest to saltwater. And then Dharial can grow up to 181 kgs which is quite big and males of them grow up to 6 meters and something around 20 feet in length males but females are little smaller so they grow up to 12 feet of length females. Then hatchling at the time of they come out from the egg they are of 32 to 37 centimeter long. So Dharial is the most sexually dimorphic means the male and female is very easily can be distinguished among all the reptiles as males of the Dharial have a big gharalite structure on their snout, knob like structure however the females don't have that. So we can easily identify the male and female Dharial. So from this Dharalite appendage the name Dharial came into being. So nesting you know Dharial has a very interesting nesting habit where females they dig the nest in a sandy beach or sand bar of the river valley and this is the hole nest of the Dharial. So the hole is something around 50 centimeter deep and then after they lay something of 40 to 80 eggs per clutch and these Dharial eggs are supposed to be one of the largest among all the crocodile eggs. So these are the Dharial eggs you can see. So nesting during this monsoon season so the nesting starts and this is the sand beach where Dharial used to nest and in the night time the females climb the sand bar. So you can see the marks on the sand they climb on the top and they dig the sand and deposit their eggs. So this is the time where nesting begins and at this time you can see a lot of all the sand banks and bars are marked with the Dharial belly marking. So that initiate the process of nesting. So then coming to the next group of reptiles we have turtle and tortoise as you know we have the richest diversity of freshwater turtles. So turtles and tortoise we basically divide into tortoise and tortoise what is the difference between them. This is one of the species of tortoise we can say this is elongated tortoise and found in the Shal forest area western Assam part and why they are called tortoise because they have an elephant and limb. The limbs are like elephants and they have a hard shell on their body and they are largely terrestrial they really go into the water. So this is another largest species of tortoise found in northeast India in Mizoram, Kachar and of the southern Brahmaputra hill districts. This is Manawariya and this is Asian giant tortoise. So this is one of the most endangered tortoise nowadays. So you can see the legs it's like more like elephants and they are very much terrestrial. Coming to the turtles, turtles can be divided into hard shell and soft shell turtles. So this is the species called hard shell turtles and they are in Assamese we call them Durakaso. This is very small in size and in the river they bask like this on the fallen logs. They climb when they bask on the morning sun. So these are the hard shell turtles. But why they are called turtles because they are very much aquatic and the limbs are like flippers to swim in the water. Then we have soft shell turtles. In Assamese they are called Burakaso. So the soft shell turtles is completely aquatic they grow really large 80 kgs of weight they can grow. And you can see complete webbed feet for swimming and that shows that they have a very strong aquatic mode of life. And their therapies is also soft. So they are called soft shell turtles. So these are the two groups of large growing reptiles but we have lot of small varieties which actually contribute to the diversity. So this is one of the most common lizard species we call Tespia. So it's because they grow the red coloration on their neck during the mating season to attract the female. So but the other way we mistake that it is it sucks the blood from the human which is completely false. This is just a coloration to attract their mate. So these are the very common lizard always found in our gardens and also cities and also forest areas. But there are some lizard which we don't see much and they live on the high on the hills. So this is one of the green species of lizard and it's very common in higher elevation in the subtropical forest called green callotis. And then this is the blue lizard this is also a mountain species very nice called moustache callotis. So they have a nice moustache like coloration and this is also a breeding coloration. Only male have this color. And then we have another agamid called fan-throated lizard. They have a doughlet. This truck is called doughlet. So whenever they see any female the males of the group they take out the doughlet. And then they show it. So based on the size of the doughlet they are selected for mating. And then another interesting lizard is the Draco or flying lizard we say. But they have a big potassium like potassium or like wing like structure called potassium. And they can not actually fly they actually glide from the higher canopy to lower canopy. When they jump they can glide to a distance and that's why they are called flying lizard. It's also available in northeast India. This is the species which we got from near Guwahati city also. Coming to the most abundant and most popular lizard is the house gecko. We call it deity. So this house gecko we often we find in the human structure in our building.  So these geckos have a very special characteristic is that they are legs. So you can see they have a different this structure. So by which this is the adhesive disc we can say with this they can create a air pressure. And then with the help of air suction pressure they can cling on the walls. So this is the mechanism with their feet and that's why they are very specialized. And they are the reptiles with the voice. So we always hear the tick-tick sound in the evening time from the geckos. The next group of lizards are the skinks and varanose. Skinks as we know we call them monicora. And they are also the lizard but little bit different because other lizards like geckos also they break the tail. And the skinks they are very very common in the forest floor. They inhibit the forest floor particularly the leaf litter and also some of the species found in the towns also. But this is one of the long-tailed lizard. Long-tailed lizard and this is a forest species particularly it inhibit the tropical evergreen forest areas of northeast India. So whenever somebody if somebody catch them by their tail they can break their tail. So this is one of the mechanism but as we grow more into the skinks we find that slowly slowly there is a disappearance of the limbs. We can see the limbs body is more like they are becoming like snakes and then legs are becoming shorter. So we can say that evolutionarily they are going towards something very special. So and coming to the varanose we have three species of varanose in northeast India. The common Bengal monitor lizard and then this is the yellow monitor lizard which is the rarest. And then another monitor lizard is called water monitor. Water monitor lizard is the world's second largest living lizard. The first living lizard, largest living lizard as you know is the Komodo dragon of Komodo island. But this water monitor lizard is the second largest growing species. So can we identify this animal whether it is a snake or a lizard? The question may be asked in this way and then answer may be so many. Some say some will say that this is a snake and some other will say that this is a lizard. But we can easily identify that this is actually a legless lizard. So as we see the lizard which has completely lost its limbs. But we can identify because the lizard has an eyelid but snakes don't have an eyelid. So by this way we can identify. This is the end of one health.


Hello people of the internet, my name is Johnny and welcome to 5 Unreal Nights at Candy's. This is yet another FNAF N-Game made by The Legendary Furby and I've been meaning to check out this for at least a week, basically ever since I came out I've been meaning to check it out but I couldn't get it to work but hopefully now it should be all good and here we are jumping right in. So clearly this is based off of Five Nights at Candy's, hey, Cindy, how are we doing? Dance, great. And it's basically Candy's just made in the Unreal Engine which I think is very, very cool. So we've got a camera here. I have seen a little bit about this game. I know there are some secrets hidden around the place so I know to stay on the lookout for some of those but I haven't seen too much, oh god. Oh crap, am I going to see them like walk past? Can I get it on the cameras? Um, I can turn, I can turn, oh I can lean too. I can lean. That's great and no torture equipped. That's great, alright. Let's open this up. Anyone out there? F? No flashlight, alright. We'll have a light here. Okay, that's great, that's great. There's a whiteboard there, alright, laugh on it, that'll be hip, oh great, alright. Ooh. Alright, nothing out there, I don't know why that camera turned off, alright. What is out here? Uh, a whole lot of nothing, great. Um, what, what did that, what, what, ooh, no muck, aww, damn, that had my coffee in it. Whatever, alright, great. What did this do?  Where is it? Here? Oh, ooh, I got it, wow, I managed to get that. Okay, so, what am I doing here? It's 1am, you guys can't see it, of course, because it is behind my camera, but uh, what am I supposed to be doing here? I keep hearing something, I'm hearing like sparks, is this a, is this, yeah that's a light, oh, hello, I don't have any power do I, so I just, I just keep these clothes, great. How do I, can I change cameras? I don't think I can, I'm just gonna go through every button, oh, what did I do? Okay, what, night vision, great. Actually, wait, this is gonna really help out. Oh, oh I heckin' saw someone, oh I, oh I saw, hello? I, I saw someone, hello? I shouldn't be doing this, oh god. Great, great, is that, I can't tell if that's candy or Cindy. Woo, oh frick, okay, let's go this way. I think I know the candy's map, I think if I go this way, this should be the office down here. Oh, well, well this is awkward. Oh, don't see me, how do I turn this off? Did I actually leave? Maybe, maybe it's not the best to um, to leave the doors closed.  Hello? Hello? Don't turn around. Whoa, I'm going for it. Oh god, I don't even know where the freaking office is. What's this? Hello? Hello? Hey, yeah, sorry, you get down. What, what, okay, so here's the office. Actually, let's open this up just in case I need to get back there. Oh wait, can I actually open these? I should, I should be looking for secrets. I guess on the first night we can just chill out a little bit. This is really creepy though. I don't know how I activated the um, the, oh wait, could I lean somewhere else? I can, with R. That's great, oh no, that's E. Great, great, how do I, how did I activate it? Wait, what was that? V, B, N, N. Oh, N for night vision, I get it, it makes sense. Yes, thanks, Dev. Okay, so, dude, I just want to explore. Can you let me explore? I think they're out, okay, so they're right there. They're actually going into that room. So um, oh no, they're not. No, they're not. Yes, they are. Make up your mind, Cindy. Alright, let's actually head out here. Let's see what's out here. So this is the main out of order. Oh, it's Darko. Hey, what's up? Bob and Lewis, how are we doing? Great, Sing. So Candy is up on the stick. Oh, we did it. I'm pretty sure night one is the only thing here. Yeah, so let's just keep exploring. I'm pretty sure there are secrets. I swear I saw it. Saw something about a servant's secret. So I do want to stay on the lookout for that. I'm not entirely sure how we do that. I'm just going to open these up just in case I do. I have a set amount of power, I don't think I do. I thought I would have ran out in the last thing. Alright, let's check. Let's check everywhere. I don't think there's anything. These are all candies. Kind of weird. There's a fan here. That's great. Okay, there's balloons here going through the table. Of course. Are these lockers? Nope, they are of course vending machines. Look at these. Open. Open. Open. Oh, it's the bathroom. Oh, that's great. That's exactly what I wanted to find here. That's right, everyone. Wash your hands. Oh! Excuse you. Excuse you.  Oh, I don't think I'm going to make it. Oh, I can try and cut around. Alright, we're going to get in here. We're just going to close it right away. That is the wrong side. Don't come back around. Okay, how do I change cameras? I don't think I can. I think I just have to stay like this. That's great. That's fine. We don't need the cameras. I don't know where Cindy went. Right there. Right there. Great. Let's close these. Oh! Hey! What's up? What's this? Oh, that's the light for the inside. Hey! What's up? What's popping? Alright, so they're going out that way. I'm going to head out this way. Alright, I'm going to head out this way. I don't know if... Okay, let's just check these. Are they actually coming back around? No, I don't think they are. Alright, well, that's great. Nothing in there doesn't seem... What's this? Is this a vent? It's a vent that goes to nowhere. That's great. I think they're out there. Anything in there? Nope, of course not. I see them. I see them. Anything here? Nope. Great. Where are they going? Um... I can't... Okay, so they are going in that room. Right? Um... Okay, so they are. So let's head out this way. See what's going on out this way. Out of order. Great. Darko, are you hiding anyone in there? Anything in there? No? No? Alright, just make sure. Is this a can? What's this? Is that a grenade? Can I use this? Can I pick this up? I cannot pick that up. That's great. Oh, I can jump. It doesn't look like there's anything on there. Candy, anything up on your stage. This would probably be the best place to hide something. Can I...? Mmm, that's creepy. God, you literally can't see anything without a night vision. Okay, let's just keep wandering around. Let's keep wandering around. I don't think... Oh, this is the blank room. This is the room with blank. That's great. Excuse me, chair. I can't actually. I don't think there's anything in there.  Wait, I might actually get cornered in here. Ah, I can't go that way. That's great. What's this? Oh, this is the kitchen. This is the room with the penguin. What's the penguin? What's the penguin? Come on, game. Wait, was that doing something? Oh, hey, there's actually lights. That's great. That's great. It really doesn't do anything. Open the ovens? Nope. Okay, anything here? Safe room. Safe room added to my inventory. Like, I took the safe room room and I just kind of like stuffed it down in my pocket. Is that what I'm... Is that what I'm gathering here? And wow, those are really, really glossy ceilings, Candy. Geez, that's insane. Okay, so... Ooh, that would be Cindy. That would be Cindy. Hey, Chester. How are we doing, man? Oh, she's right here. Let's just kind of loop around this way. This is the office. Let's block it off. Boom, and I missed. Great. That's fine. Because she forgot about me instantly. Great, great, great. Now, I don't actually remember... She's in the office. I don't actually remember where the safe room is. I'm gonna be 100% honest where the Candy's safe room is. Anything in there? Nope, nope, nope. Okay, well, I think... No, she didn't see me. Is it over? Oh, my God, it's over here. That's right. Hey, Chester. God, that's creepy. That's great, that's great, that's great. Is it five? It's five. Okay, is it this one? No, but there's the penguin. Oh, can I close this? Can I... Can I close it? Ooh! Nope. Nope. Great, great. That's creepy. Anything in here? Nope, doesn't seem like it. So I think the other room is actually the safe room. It's just... Oh, that's just... Okay, so mid to six, but I think the other room is the safe room. I think. Okay, it's been a little bit since I've played Candy's. We did play The One Master. We did play The One Master. And that is what? Is that Camp 13? That might actually be Camp 13. All right, so it's actually, um... I'm guessing I don't keep the key, so I'm guessing I'm gonna have to go back to the kitchen, which I'm sure Cindy is actually guarding. Yeah, yeah, of course. Why wouldn't she be? All right, well, let's take this time. Let's check out... Let's check out the penguin. All right, let's check out the penguin. There's actually two of them. Double trouble with the penguin. And then we have old Candy back here. That is insane. God, that's really creepy. There's nothing in here. Great. So Chester's out here. What's up, man? These models are really creepy. Really creepy. Okay. I'm guessing I can't like play any of these. Okay.  What? All right, well, here's what we're gonna do. We're gonna go here. All right, we're gonna load them out here. Then we're gonna close it. We're going to loop around this way. All the way over to the kitchen. We're gonna grab the key, and then we're just gonna leg it. We're just gonna leg it. Leg it to the safe room. And actually we should probably get Cindy's jump scare. Is it just Cindy? It might just be Cindy. Which is kind of disappointing, but then again, it is only night one of a beta game, so I'm not surprised. Something I am surprised about is how much I've been able to talk throughout this entire video. All right. I've only just started to lose my breath. Okay, ooh, they're out there. Should we wait? Should we wait? Where are they going? We should probably wait. Come out this way. There we go. There we go. Did they? Oh, God. All right, let's get in here. How do I... How do I use it? How do I use it? All right. How do I use it? Oh, oh, oh. There we go. Open it. Open it. Open it. Game. Game. There was no... Any key? I'm sorry. I used it. Did I not? Did I not use it? What the heck? What? Did... Did I not... Did... What? Hey, wait. Now hang on a second game. You... I didn't use it? I didn't use it? There's got to be a way, right? There's got to be. I'm sure there is. There has to be. Where are you going? Where are you going? Where are you going? All right. Let's play Ring Around the Roses with the... With the dining room table, Cindy. Oh, God. Don't you dare. Got it. Safe room. Right? What are you doing? What are you doing? You're just, like, circling around blanks room. That's not really cash money, are you? Oh, wait. What? Nothing. Okay. So where did Cindy go? Right there. Don't come back in here. Don't... Hi. Where are you going? Where are you going? Oh, are you coming back? Nope. Are you going that way? That's great. Just my luck. Just my luck. All right. We're going to use the same tactic. We're going to go up this way. Lower them out this way. Come on. Close the door. Frick, frick, frick. Okay. They didn't get it. They actually scared me for a moment. Okay. Okay. Come on. Come on. There's got to be a way, right? There's got to be a way. Like this. Maybe... Oh, wait. Did I? Here we go. And it's the rat. And it's fusion. Oh, why are you eating your own hand? Why are you eating and buff healthy? Yep. Just great. That is great. Why? Never again. Never again. Great. Great. Great. Is this a light switch? Can we see you in the light? Oh, we can see you in the light. Oh, my God. That's really creepy. And again, with the ceilings. Oh, my God. That is really creepy. Oh, my God. And that is... That would be fnack for candy. That's great. Okay. Let's die. All right. Let's just die. Hey, Chester. How are we doing? Where's Cindy? Hey. What's up? How are we doing? You want to see the rat? Watch this. Oh, close the door. Close, close. I missed the door. I actually missed the door. Anyways, this was five on real nights at Kenny's. Very good test build. I'll say that for a test build. Pretty good. Pretty solid gameplay. I cannot wait for the full version where we have every single candy character running after us through the hallway. I think I saw on the game drone page that it's going to be more puzzly while also still having the survival fnaf section of the game. So I think that's going to be really cool. A good twist on the classic five nights at Kenny's. Anyways, that is going to be it for this video. Thank you so much for watching. And I'll see you all on the flip side. Goodbye.


Hello everyone, this is Neerau Patel to introduce myself. I have over 20 years experience working with software products, started my career as a part of the technical team, and then gradually I moved into product management world. I have also experienced working with enterprise services team and implementing products like ERPs and CRM for enterprise customers. So thank you for joining today's session. We will be talking about number of product success metrics and the parameters impacting those product success metrics, but yes, we will be touching those parameters which are uncommon ones, not the regular ones that generally we can think of. So a number of these metrics and the parameters that I will talk about today are based on my past experience working with one or two of the products. So let's start what we are going to talk about. To start with, the first one is velocity. It's more about team's performance, how as a team we are performing. The another one is volume. It is more about how the product is used and how it is getting adapted in the market and the progress and the kind of consumption it is bringing. The third one is related to NPS and CSET, promoter score as well as customer satisfaction. It's all about customer health as you know. The another metrics that we will talk about is the cost that indicates the financial health of the project or the product. And the final, the one more is defects. It's all about product quality, as you can see. So let's get into product velocity, the first metric that we are going to talk about. To start with, the first parameter that I will talk about is interdependency. We all know how to kind of prioritize the backlog for product sprint, right? Generally, we all talk about either the value or impact and then we use the estimation parameters. But that is not sufficient, I would say. It is very important that how do you bundle the stories for particular sprint. If the stories are interrelated and associated for a particular role, persona, workflow, then the possibility of turning them around quickly is much higher because people will be focused upon similar functionality and developing them, testing them for the team would be much more easier and faster. So keep this in mind next time when you work upon it. The second parameter is involvement. How is your team involved with you in the backlog grooming as well as developing the understanding of the product? One of the important parameters. So what I would like to say is that does your team properly understand the product roadmap, release plan, upcoming features, etc. Do they have sufficient knowledge to say that yes, this story is ready for sprint in the sprint planning meeting or do you or the team leads are able to identify the need for skill upgrade, knowledge transitions or cross training needs before even sprint starts. These are some of the important parameters. If not handy, it can impact your velocity. One more item is right use of spike. I think you should be aware of spike what it is. If it is not, it's the kind of name that we use for the stories which are not clear and we need to do some research before starting working upon sprint. On an ongoing basis, we come across some stories that requires a lot of extensive analysis as well as system design before we can mark it ready for sprint. Now if we include this kind of work in the sprint, obviously stories cannot be completed. So as a product manager work towards identifying this kind of stories that require spikes much earlier. And then if the story needs to be worked upon in next sprint, you include the spike in current sprint and assign it to someone. What that means is individual can take a jumpstart and do the groundwork before that story is picked up in the next sprint. The next parameter is skills. And yes, this is not the technical skill. It is functional skill. How skilled your team is around the business functionality of the product. There are products which are focused on banking, finance, pharmaceuticals, or medical, or insurance, or retail. This kind of products require a lot of functional knowledge in terms of workflows, user journeys, personas, roles, access. And many times we hire developers based on their technical strengths and they fail to turn around these products faster. Why? Because they do not have sufficient functional knowledge. So this is one of the important parameter to take care of. Another part is testing. And I will talk about two part of the testing. One part is that automation. Yes, you all know automation. So try to derive those items that requires ongoing recurring testing sprint after sprint, release after release, build after build. Try to identify them upfront and plan for automation upfront so that your team do not end up spending the same effort again and again in the manual testing. The second part is that see if your team is unnecessarily spending effort in every sprint to taste something which is not touched directly in that particular sprint, this can save some amount of effort for you and that can help you to increase the velocity. One more parameter is expectations. How is the expectation set up with your team in terms of what you are targeting to deliver? Many times this is very important parameter to consider. Why? Because as a product manager, you may want to go faster to market. You may want to go with the dirty code. You might want to fail faster. You may not be targeting perfection but it is not clear to team and they may be targeting zero debt or the perfection. So ensure that you have right level of sync and expectation setup with your team in terms of what you want to deliver and that is understood very clearly. Another parameter is if your product is not stable enough or do not end up spending a lot of time on taste automation as well as DevOps kind of activities because many times this keeps on changing with the changing product and you end up spending unnecessarily a lot of effort behind this kind of activities. So let's move to next. On the next slide, we will be talking about volume and adepts and related parameters. What is that? So let's start with parameters that impacts your volume. I would start with alignment. How is your alignment or your products alignment with your company's goal strategy as well as your sales and marketing priorities? Why this is important? Because unless your product and your goals are not rightly aligned with your company and sales marketing, they may end up talking about something else. Why? Because their goal and your goals are different. Sales and marketing might be getting incentives on something else plus what they are selling might be different from what you want to sell. So please derive right level of alignment as much as possible. Another part is communication. Is everyone very clear about the purpose and goal of your product? And when I say everyone, its sales marketing is your leaders, yourself, your training and documentation team, your product, landing pages, social media, everything that talks about your product, conferences that you attend, because there are times when the core goal or objective of the product is not clearly conveyed. And so that customer do not know what you're offering. So make it very clear again and again, repetitive mode. The next point is MVP. What is it? So if you're launching new product or if it is already launched and volume is not coming up, check whether all the critical, most important functionality is included in the core product or not. If it is not, it's missing some core areas, so please plan to develop it. If it is already there, check whether those are working properly or not. If there are quality problems, if there are defects in the backlog for your core areas, obviously your volume will not pick up because core functionality is not working. So take care of them. Instead of developing new features, I would say fix the core defects first because it will help you. Another point is attention. So keep sufficient focus on your key accounts users as well as your net promoters. Try to understand their pain areas. See what extra they are asking. What is core to their day-to-day work which you do not have or which you do not have prioritized yet. Try to prioritize them and include it. Possibly that will help you to bring in more volume quickly from your large or enterprise-grade customers. And another parameter is keep understanding of market trends and consumer needs. This keeps on changing. You need to keep your roadmap and your direction aligned to this. Keep on changing. Why? Because due to COVID situations, international border issues or say political environments, travel restrictions, security requirements, things change and you have to keep it changing. So I will get into two detail points here. One is specific to volume. So if you are struggling with volume, you may need to get into little more detail in terms of where exactly the volume not coming. Is it a first-time user issue or users visit your page but don't start the transaction or user drop in the middle of the workflows or user went further but they don't complete the transaction. Each might have different symptoms that you might have to address as a part of the product manager work. So if it is low first-time users, you might have to check marketing sales incentives, alignment, social media reach, etc. If users are not starting the transaction after landing your page, it might be that you have complex look, menu, submenu, tabs, etc. Your goal is not clearly explained. If users are dropping in between the workflows, possibly it could be the data validation or browser issues. Sometimes the workflows are complex enough and then if users go up to almost end but come out before completing transactions and it's a different problem such as validation surprises at the end, some runtime errors or maybe the discount code or referral codes did not work. So check them. Fixing them can help you fixing your volume issues quickly. Many times on enterprise customers, you may want to check something different, some onboarding challenges. When I say onboarding, that means some data transition challenges or problems in configuration of the roles and permissions. At times, some primary scenarios are not working. Why? Because the parameters are not rightly configured or some open defects are there. Testing is not properly completed. There might be training or change management issues with your enterprise customers that you need to resolve with the help of the professional services team, obviously. And then at times it is just that it's not ready for production. Why? Because some integrations for your enterprise customers are not working or master data or profiles are not configured well. So they cannot work. So help your professional services team to get them fixed and that will bring you good volume. I'm pretty sure about it. Yeah, let's go next. So on this page, we will talk about the defects in flow. There are situations when you come across a lot of high inflow of the issues or problem, right? So how do you start tackling this kind of situations? My approach is little different here compared to everyone else. So when you have a large inflow, start analyzing whether this is an issue or a defect. When I say what I mean by issue and what I mean by defect, when I say issues, issues are something that does not require co-changes to fix the problem, right? No developments are needed most of the time. And based on my past 20 plus years of experience, I can confidently say that about 70% of reported problems are issues, not a defect. Okay. So basically, you checked and you found out that it is an issue. So what do you do to fix the issues? There are a couple of things. For example, it could be a wrong role or permission. It's just a training issue. Maybe product is incorrectly used. Just guide your users. Maybe the expectations are not rightly set up for the product. So guide them. It might be user experience issue. Provide some documentation. Or maybe some configuration is not correctly done. So fix the parameters, right? With this kind of quick changes, you can fix about 70 to 80% of your problems most of the times without co-changes. Yeah. Now, what if it is a technical defect? When it is a technical defect, it can be bundled in two different problems, right? Sorry. So when it is a defect, you can bundle it into two different kind of problems. One is the technical defect. One is the non-technical defect. So let's see how we address the technical or non-technical defects. And I'm going on next page. When you come across the technical defects, I still feel that this is comparatively easier to fix because when those are technical defects, it can be validation or boundary condition issues, security performance issues, maybe runtime errors, et cetera, right? So many of them can be fixed with some firewall configurations at times, enhancing the infrastructure or maybe some quick code changes. In a longer run, you may want to answer that you have right level of usage for tools, automation, DevOps, or right level of infrastructure, right? You may also want to introduce right level of testing. Or at times it might be the skill upgrade issue for your technical team. But all of this is comparatively easier to fix when you compare it to non-technical defects. So what are non-technical defects? Let's look at them. Many of these are related to functional areas. Now what are those? So these are the defects that require to develop better understanding of user journeys, scenarios, roles, and permissions. Maybe your team is not using right configurations and data to test the right practical user scenarios. It might be the case that because of the lack of the knowledge of domain, right level of testing is missing at story level, feature level, integration level, maybe regression level or end-to-end business scenarios as well. How can you fix this? Well, it's not a straightforward answer. For immediate needs, you will have to support them really heavily. But in a longer run, you need to build the right level of domain knowledge for your team. That's the only fix. Difficult one, long term, but yes, you have to build the skills in the team and it will take time. Apart from that, a quick thing could be that you quickly introduce subject matter expert on that domain from outside. Maybe this person will be a very quick help in the team to test and write down some of the basic scenarios and guiding your team. So moving to next, in this slide, we will talk about the NPS and customer satisfaction. What are the parameters that can impact your customer satisfaction and promoter scores? I always talk about transparency, a very important parameter everywhere and specifically for your customers. Always ensure that you bring in good transparency with your customers. Give them clarity on your vision, your roadmap, or how you are planning your future releases. On top of that, set up right expectations in terms of what your product is planning to support in terms of NFRs as well as what upcoming features are. Be clear about it. Be transparent about it, even if those are going to be delayed. That will help you to bring in more transparency. The second part is trust. How do you develop trust with your customer and develop healthy relationship? Well, there are a couple of things you can obviously try. No last moment surprises. No one likes and specifically your customers never do. Ensure that any issues that is coming up or it is there, they hear from you first, not from someone else. On top of that, it's not just about making money, right? Or share some tips and guidance in terms of how they can reduce the infrastructure or consumption cost. So when you share this kind of tips with your customer, obviously it helps you to develop the trust. What else? Do you empathize on their problems? Do you care about them? You really have to. You know what? Many times your customers might go through some critical situations, severity one problems, and we just leave it to our support teams to fix them, right? So what that means to you as a core product team or product manager? Well, it's your problem too. Please try to understand this kind of critical situations for your key customers, your enterprise large customers, and try to help them out. If you can't fix the problem quickly, at least ensure that right level of workaround is identified and it is proposed. It is your responsibility to ensure that your customers come out of their critical situations as early as possible. Otherwise, it is definitely going to impact your NPS and CSAT. Another part is protect. Protect your customers from compliance and data issues. It is always our job. Always build the mindset that you have to protect your customer data and reflect it in your ongoing conversations again and again. Ensure that they understand what you are intending to do, right? Just doing it not enough. Ensure that you explain it again and again to your stakeholders, to your customers. Proactively identify some of the issues loophole in the system, some upcoming issues proactively, and then ensure that you inform it to your customer along with some guidance in terms of how they can mitigate it if they cannot completely fix them. This is important one. Another one is how you give consistent common experience to your customers across the channels during supporting them. So what that means is nowadays we use different mediums like emails, chat, mobile, web, social, right? And we capture a lot of details and ensure that how you capture the details across different medium and use it across the channels consistently so that when your customers speak to you, talk to you via different channels, you give them consistent experience because otherwise they will quickly get fed up, frustrated and indicate that I have already shared that detail why you don't have it. So ensure that you have consistent experience building for your product. Yeah, I think if you take care of these parameters, definitely your NPSC site would go higher from where it is. Moving to next one, on this one, I'll talk about the cost. So what are the parameters that can impact your cost? So one of the area is infrastructure and cloud. So here I'm talking about this parameter later differently in terms of how you can bring down your infrastructure cost. So basically, how many environments you have currently and do you really need all of them?  Do you really use or does your team really use all of the environments and services 24 by 7? If not, can you stop them for part of the time?  And believe me, I tried that and I could bring down 30 to 40% environmental cost, ongoing cost month after month. Team mix, important one. So many times we don't realize that do we really need all the senior members in the team who are really expensive? Well, there may be time when introduction of one subject matter expert from functional standpoint can help you to bring down cost. Why? Because you will not need all the seniors. You need strong developers, but not all the senior people. At times you just need the functional knowledge in the team. So think creatively. Do you need full-time scrum master? Maybe one of the team members can play that role. When your product is in the early stages, do you really need separate L2, L3 support teams? Or do you need separate professional services team? Can you still continue with the same scrum team and do all of that until you reach particular stage when you have good revenue channels? So try this. One more is how is your privatization? Do you want to build everything now? Well, may not be. It is okay to not build the administrative module or configuration module right now. What if you do not have some of the features on day one? That is okay. You can go with some dirty code as well. It is okay to configure some of the data and parameters from backend. Well, you can hire some cheaper support member who can manually configure something for your customers, right? You don't need to automate everything right now. So obviously these parameters will help you to reduce some of the cost. People focus. Now this is a tricky one, right? So I always vouch for high moral and least attrition in the team. You would think that how that can help you to control the cost? Well, it does. High moral of the team boosts the productivity significantly in your team and it definitely does. When you have low attrition in your team, it helps you to retain the knowledge in the team, right? And when you have low retention, it improves the efficiency in the team. Why? Because they do some of the repetitive work, right? They are in the performing stage and they know each other very well. All of these factors help you to do the work faster, reducing the cost. Another part is don't reinvent. Your company might have many other products and many times the core framework components remain same for logging or for, say, security or for, say, configuration roles, permissions or something else. See what all parameters or framework parameters, validation parameters you can copy, paste and reuse. Please try to bring this in because it will help you and your team to save good amount of effort and cost both. One more is don't overbuild NFRs, the important one. Many times as a product manager, we want to build in everything. Perfect. It should perform very well. It should handle maximum amount of load, right? And it should have all the security features. It should have 10, 15 kinds of different roles and configured. Well, don't go for luxury. Don't go for everything. Clearly find out what you need to build, what is really required, document it very clearly, objectively and hand it over to your team. Don't go for everything. Go for only what is required for your product and it will help you to save some cost for CR. Yeah. So that was it for today's call.  Thank you very much for hearing me. And if you have any questions, if you want to reach out to me, here is my email, my LinkedIn and my page as well. So thank you very much again for attending this session and it has been pleasure talking to you guys. Thank you and have a great day. Bye-bye.


Okay, so the next speaker here will be Mark Besby. Mark is a long time open BST developer, and he's in charge, of course, of the port system, which he rewrote and brought it to the shape that it is today. So please, Mark. Thank you. So today I'm going to talk about something apparently completely different, except it's not, because obviously it's related to building stuff, again. And well, it's quite a big challenge to talk about that, because it's work that I've been doing for a long time, something over 10 years by now. And like Martin did say yesterday, there are lots of dragons here. Very much so. Oh yeah. Who's fun is that? Is that mine? Oh yeah, quite possibly. No, it's in the other pocket. No, where is it? It's gone. Oh yeah. Yeah, that's it. It goes. Sorry about that. So I'm going to, is it still working, right? Yeah. Start with an example to give you an idea of how many dragons were in there. I hope that everybody knows at least some mech. So for instance, you've got here a fragment of a mech file which starts with a .suffix.is line, which is supposed to tell you what you're going to do when you meet .cfile, for instance. And then you get a rule, which is actually a suffix rule since you got the suffixes already defined here. And then you say that you want to generate an object file from a C file. And of course it works because you have those suffixes. Then you decide that you don't want any more suffixes. So after this line precisely, the b.o is not going to do anything because it doesn't know about the .c2.o translation. And then what's really funny about mech is that if you put that line again, what's going to happen on the .c.o file? Is it going to be generated from the C file or is it not? Three questions. Does anybody know? It's okay. It's actually going to work. Surprisingly enough, you can define some suffixes rule with some suffixes existing. Then you can wipe the suffixes, but it only says that okay, for now the suffixes don't work, but if later you instead the suffixes, then it works again. And it has to be that way. If you change that, you are going to break lots of mech files. Everything is like that, basically. So it's complete minefield. Just to say that you don't have to work in the kernel to break things. You can also very well break things in user land. So like I said, I began this 10 years ago. Right now I should say that some things are obvious, but they were not so when I started. So I'm going to start with a chunk of pieces of stuff that doesn't make any sense. And hopefully, by the end, you will be as confused as I am. To start with, while I got tricked by this guy in MTO into playing with mech, it's obviously not my code. It's crappy code, actually. It's not even Unix code. The mech we have in OpenBSD, which is basically what's also in that BSD, is coming from some experimental operating system called Sprite, which was supposed to be distributed. And you have lots of tendrils about that everywhere. It's mostly a student project. Well, fairly good student project, but still it's definitely not prediction code at the start when I started with it. What you know also is that these days, if you want to build anything on a system, you have to have some kind of mech. Like Beth says this morning, Esconcise crap and most everything else is not very good compared to mech, so you have to work with it. It's supposed to be more or less standard, but it's not very standard. Yeah, I put this line in yesterday. It's mission critical. You have to have a mech that works, a boot as well as your shell. Choose the right one. Please. My initial goal was just to make things faster. If you have to look at the specification, you're going to go crazy. It's a little less crazy than it was 10 years ago, but still it's bad. And there are some things we try a bit more specified, but more fun than not. You will see that new features are just stuff that comes from GMECH as usual. Well, basically you take anything that's on Linux these days, and they have a huge influence over POSIX, so you won't find any of our influence, and we have to fight this, obviously. We have to get people from all the BSD projects inside POSIX somehow and say, hey, we exist. Don't just copy Linux.  And at the time, 10 years ago, Parallel was something which was, okay, it could be a nice feature, but it's not supposed to be working. Of course, but that time we did not have that many SMP systems, and especially not on OpenBSD. I did not have a plan. I started looking at some changes. My initial goal was just to make things faster, to put things into perspective. At the time I started, the Amiga port system just took seven seconds to start doing anything. You went to any port in the port street, and you typed make, and you waited for seven seconds, and then something happened. Usually it crashed, but it went on to one second. Yeah. How much time they are at the end? Actually, I'm cheating there, because the work I did on make is about halfway responsible for making things faster. The rest was changing the port street so that it went sane, more or less. So let's look at the internal. At first sight, you will think that make is mostly working with character strings, but actually it's not quite. More specifically, it's not the right data structure, because you've got lots of constraints inside make which looks like this, and you have to parse them, you have to read them, and you have to expand sucks on them.  I'm going to look until the end. I'm going to change this character, this brace into a zero, so that this looks like a character string. Then I'm going to do something with this variable value. Then I'm going to put the brace back, completely crazy. Especially if you want to debug things because you can't even make a distinction between strings which are read only, and stuff that is modified all over the place, which is completely crazy. So the thing that I started with was to change that, to actually handle a string as intervals, because most of the time, you're going to have a buffer in make, and you're going to want to play with that buffer between this position and that position, and this is really the natural structure to deal with character strings inside make. There's also a shing table, which is something that I introduced fairly along, and looking at the way make did not manage memory, actually. So how bad was the code? For instance, one of the first problems I tried to solve was to look at how make was building new strings, choosing a simple, growable buffer where you add characters, and when you finish, you put a zero at the end, and you do a copy of part of the buffer that you want, and there were actually two zeros at the end of the strings. So I said, okay, let's remove one. Bam, cordump, obviously. So you look through the code, you find one bug, you fix it, and you recompile, and bam, cordump again. There are at least two bugs involved in that, and most of the code was like that. You would look at something, find something insane inside the makes code, fix it, and you realize that something else was relying on that specific behavior. If you've seen Tedu's work on OpenSSL, for instance, it will remind you of something because it's exactly the same issue, exactly the same kind of crappy code. To talk about something more fun, I actually introduced some hashing techniques inside of make to make it faster afterwards. You've got to realize how bad of a research project this was at first, because there was exactly no structure to look for variable names or for target names inside makes. 10 years ago, it was only a set of lists. So you take this normal make file, like stuff that's generated by I make, for instance, which has about 500 variables, 500 targets, and each time you want to get any value of any variable, you have to walk through that list to find it. It's going to be slow, right? I designed OpenAshing to be useful all for it make, and looking at things that managed to find seven places inside of make, which needed some actual data structure to look up names, at least. I even introduced a new one, number eight, maybe we'll talk about that if we have the time. And it's going to be widely successful, at least in OpenBSD, since it's also using M4RT sort, mandoc, and signify, as you know. How does it look? Well, it was designed specifically for make to be fast, so there's mostly no internal memory allocation, if you want to allocate stuff, you have to design it directly into your data structure. So for instance, you're not going to say, I want a new hash table, you say, you have your data structure in memory, and you're going to initialize it directly. You give it an hint of how many variables you're going to store in it, like a power of two usually. And the fourth parameter to hash in it is just to tell it how to allocate memory when it actually needs to. And then you do everything by hand. So for instance, for hashing a data structure, you're actually going to do the hashing part yourself, so you can specialize it, plug it with something else. Then you're going to look into your data structure to find the exact slots where whatever you want to do is going to end. And once you have that slot, you can say that, okay, there is something there already, so I found it. Or if it's not the right one, I have to replace it with something else. But if you didn't find something and you want to insert a new data structure, you don't have to look again, you already did. So that gains a lot actually. That's actually a lot faster to specify looking up for a given slot and then deciding whether you want to insert, whether you want to find your data structure in certain new one or remove a long one. Also, there's this point which is specific to make, which actually, if you look at how we make files, become loaded with actual variables. You've got those magic variables like dollar target, for instance, or you have those special rules like funny, like posix, that's a joke actually. And having the hash value available here means that you can actually build it directly inside your parser. You can take your target name, hash it, and you put it inside the C-switch so that you can figure out, okay, this is already a variable I know. I don't need to create a special entry for it. The next point that I did work on was memory allocation. At that point, you had lists and yeah, well, it was lists, basically. Retail and see, but still lists. Every single data structure inside of make was allocating at least two pieces of memory. You are putting things, for instance, this is a geno, it's actually the internal representation of a target inside of make. And we were allocating a new one each time, duplicating the name of a target. It was on-stored inside the same data structure. And every target had maybe 10 lists and each of those lists was just a pointer to an external data structure, right? So I spent some time working on this. I remembered that I also know some other programming languages like C++ where they have this nice notion that allocating memory and initializing a data structure are some completely different beasts and you don't have to do both at the same time. And by applying this, which was really boring work, but necessary, which was basically changing all of makes source code to just replace constructors with initialization functions. I managed to change the previous code into something that looked like this. So you have exactly one allocation, one memory allocation per target instead of 12 or so. And looking at the end result for Jeep Wroth, for instance, showed me that I managed to divide the number of memory allocation by more than 10. Which was obviously something which made things much faster, as you can guess. So we're probably something like six or seven years ago and while I had just tickled the monster and it didn't bite too hard, so I decided to dive in a little further. And at which point I had an actual image of make, which is more or less the reality, which is that you have lots of small modules which are supposed to do one thing and do one thing well. But some people have looked at those modules and decided that they wanted to add some features that means that some module is talking directly to something else and bypassing some mechanism to do something tricky which probably made sense at the time. But in the end, everything is untangled and nothing works. And I don't want to frighten you too much but that's still the case today. There are still some areas where we haven't fixed everything. And I'm 100% certain that the other projects, so NetBSD and FreeBSD these days are both using BMECH which is a descendant of the same project, have the same issues. So how to proceed? Well, you have to refactor that, as usual, going through one module, trying to understand it, trying not to disturb whatever's going on in the other modules until you can manage to grasp the intricacies and progress beyond that. To give you some actual needs, is the very simplified version of what's in Sidemake. You have variables. That's probably the senus module. It's very complicated but it's mostly self-contained. So it means that if you are going to touch variables, you're not going to break anything else, hopefully. Targets. So yeah, basically that's your initial list of targets. There are some issues in there because it has to support some mechanism which are only used by IMECH, like the double-double-colon rules, which is something completely insane but that you have to support. The parser, which was a bit insane because it was calling each module in turn to try to decide what to do with whatever line and manage more or less to tame it and make it a bit faster. Cone, which was misnamed because it actually deals with every dot BSD command. So that includes conditionals, but that also includes and for loops. So you have to break it up and try to make it center. It's not quite finished yet, but not really important. Things that should work, do work these days. Suffix is online. That one is definitely not finished yet because there are lots of callbacks all over the place from the other module, like the job engine that tries to decide when you try to build something, whether you can apply some suffix rule or not. And since you are able to look in several different places, several different directories, especially on BSD-MECH, since you have this object-gear construct, but also on other MECH, since you have some kind of VPAP mechanism, you're never quite sure what's going to happen until you actually reach the point where you actually want to build your target. Maybe you will discover that you have some new dependencies that you didn't know existed. Can be funny. Compat, the reliable old sequential engine, Job, the new parallel engine which wasn't working 10 years ago and which is still a bit clunky and there's still this problem where we actually have two engines, which is not a good idea. At some point, we want to merge those. Directory caching, yet another place to put open ashing, and trivial stuff like string construction in buffer and non-trivial stuff, but that's so mostly unused that it can break and nobody will notice. The stuff that's supposed to handle achieves directly inside MECH. More or less works, but nobody uses it anyway. What? You have to have it if you want to be posix. So this is what I said, basically. There are some baby dragons in the very small parts that I started with and once we decided you weren't burnt too badly, you can go on to fight bigger dragons and get singed, obviously. Let's talk a little bit more about variables because yeah, this is a baby dragon but it's already complicated enough because if you look at the rule for MECH, you actually have four different kinds of variables at least because what you put in the MECH file will be overridden by stuff that you pass on the command line, but you also have a switch in MECH which means that stuff on the environment will override both of them and then you have dynamic variables, stuff that is only defined within the context of one rule like dollar target for instance and which can be tricky to do because suffixes might happen much later than you would like and in some cases you have to revaluate your lines to be sure you get the right values for a variable. Obviously this initially meant that things went very slow because you had to look up variables at least those four places to be sure you had the right value so I managed to make it down to at least at most two lookups. There's one global list and one list per target and usually when you find things in the global list that should be in the local list you're very unhappy about it and that's a bug, like for instance if you find a definition of your target of the dot target variable in the MECH file it's not a good idea, it should be automatic. Plus laziness which is again a good and a bad idea because you have the laziness explained in the POSIX rules and then you have the BSD extensions which means that some stuff are expanded early and some stuff is expanded light and can be completely crazy but it's not really a problem inside MECH it's more of a problem when you want to use it if you have to maintain any part of a BSD MECH file just run away, just don't do it. It's crazy. Like I said, variable expansion is complicated. I found a bug a few months ago which is related to dynamic variables. There are some features that we didn't have that I managed to add thanks to my work on variables recursive variables which means basically a variable which contains another variable as part of its name so that you can specialize stuff for instance for a given architecture. C flags depending on the given file it's very easy to do as well. Thanks to that. There's something that we had to do to implement FAKE in the port street which is basically to pass everything that was passed on the command line down to SUBMEX and then SUBMEX and then SUBMEX all the way down to turtles. So that for instance this year would work. I think that finally in MBSD realized that they had to do this as well but it took them a long time. And just to say something nice about them as well we borrowed some features like very extended followups which is an awesome idea because then you can do stuff like that say that you have a list which is actually composed of a pair of stuff like a link and a file and you can create a rule that will link every main page to its source just in one simple line of MAKE file. If you're used to make one simple line of MAKE file. Where am I? Oh cool. So like I said we have some basic stuff and when we have some not such basic stuff like taking the lowercase part of a variable for instance and for loops and conditionals and stuff like that. This is something where we came first more or less. By this I mean that by the time I started working on MAKE we had more or less the same modifiers as NetBSD. FreeBSD didn't have anything more or less. And we started adding new stuff like lowercase for instance a few years before NetBSD decided to do their own stuff and obviously in completely incompatible ways to what we were doing.  Or if you want more reasonably you can take our source and look at the modifiers code which is very clean. And if you don't like our modifiers and you want to have something else it's very easy to do. We just don't see the need for us but it's very easy to port that to any other BSD if you want to have OLL or something like that set of variable modifiers that they took from whatever projects. I don't remember the name. You can do that. It's very easy. The interesting part is that at that point ParallelMAKE wasn't working. So by that point you're probably thinking why did that come to see this guy? He said that he was going to talk about ParallelMAKE and he hasn't said anything about that so far. There was the science student project part which is that the guy who wrote this make thought that putting all commands under a target into one single shell was a good idea which is obviously going to break almost every make file in existence because they expect everything online a make file to be run by a distinct shell won't work otherwise. There was also a fact that this ParallelStuff wasn't working so he put more debug stuff in it so if you try to run a make file in Parallel at that point while it won't work because it will display a shit lot of stuff and since some commands expect to have some result produced by make and reuse it later well that won't work. And there was a lot of code that wasn't used it wasn't VMS but it was Sprite and there was a lot of code that was supposed to let you run jobs over machines distantly using whatever interface what we don't have at all. So at that point I decided I wanted ParallelMAKE to work so the first thing I did was remove extra shell execution every line in the target should have its own shell it won't work otherwise. Remove extra display, leave it into a debug mode but not keep it for anything and get rid of all the noise because remote was just noise it was just stuff that was making the code almost impossible to read and definitely impossible to change. So this gave us first version of ParallelMAKE that worked basically there was still remains of one shell per target part which is that the job handler was forking a job manager which would be running each line for a separate shell and then running the last line advancing us okay everything went okay, you have your target it's done. This had one major problem which is that output comes out garbled because you are going to run several jobs in Parallel and you're going to see every job manager saying hey I'm going to execute this at the same time and you get fragments of lines or stuff horrible stuff all through it. So I did something I shouldn't have I did some extra structure to try to gain control of the situation which is that basically at that point the main make process used to have a pipe to each job manager and to select whatever it wanted to display at that time. So if you have some knowledge of concurrent programming it's basically a completely unfair scheduler because I want once I have some output from a given job to give it a chance to output as much as it can before I switch to the next job. So yeah basically you just try to bug a scheduler into works. And at this point it worked for the kernel we managed to build our first kernel with make minus g4 I think and no issues. I needed to add lots of dependencies and boom it worked for the source tree as well. The main issue with the source tree was that Parallel make was completely interested of course since it didn't used to work so people used to forget dependencies all over the place and if you try to build things in Parallel instead of second show obviously you're going to say oh wait I should have built this before that so I have to write it down so that it works.  This was the easy part because then you have to look at the cases where it doesn't work and you have to realize that you're not even halfway there there are still lots of issues to fix. Is the list of the three most important issues that we have that we had, sorry. First one is that pipe means that you don't have any standard input. So that's the difference between a compact make because in sequential make you can have one command which is going to ask the user do you want to continue or something like that? It will block make for a while but it will work. If you have your Parallel job handler which is actually redirecting a studio from each command and getting it into make that means that those commands no longer get what they need in terms of user input. So some stuff doesn't quite work. More serious is that naturally inside of normal way to build unique stuff you have some rules that will create several files. The simplest example I expect that your familiar with it is using YAC since usually you will create a C source file and a header H file. So at that point we did some MacGyver and just did the same thing that the GCC guys did which is to put a timestamp to serialize the build of those files. I'd hope that we did not forget any. And the last problem which is actually the most serious one is that actually Mac doesn't understand the file system. So if you have two targets say dot slash A and A for Mac there are different targets but on your file system usually they have the same file. If that doesn't scare you it should but we'll come back to that in a few minutes. At which point I was probably confident enough to try to decide that I wanted to document things. Which was also a big part of taming the beast because the documentation we had was horrible and not matching any standards at all. So first you document how things work then you look at POSIX then you realize you don't even use the right vocabulary so that people coming from outside won't understand what you're talking about. So you change every term until you more or less match what POSIX says. And there's also very big ongoing work which is that you have to decide which extensions you want to keep because they're actually useful and maintainable and working and not a problem to port to elsewhere and which part you want to get rid of because it's complete crap. And this is actually very difficult. I think that this is a point where NetBSD is actually losing because they're keeping way too much stuff which is unmentionable in the long term. Guilty. This is something that we don't do yet that we should do. And we should have a mode that enables us to say, okay, this part of make is standard and warning you are using some stuff that won't work elsewhere. And this is the best story basically because if the people who are writing bash scripts did have the flag to make sure they don't use bash extensions then they wouldn't be into such a mess where you have to have bash on your system because suddenly half the shell scripts won't work. You have the same issues we've made. It's less of an issue, some ish because it's only used by developers usually but it's still a nightmare. Well, Theo isn't there because it's actually his optimization. If you start looking at recursive make files you quite well know that if you're going to use parallel make you're going to have some combinatorial explosion because at the first level you've got four jobs then second level is 16 jobs and 64 jobs and you don't usually go that much further because your machine has exploded. Other systems like Numek for instance use a kind of token system but it's actually a little brittle for two reasons. One, you could decide to use a socket or something but where are you going to put it? You don't know actually when you're using make which file system is whiteable, which one is not and so if you have for instance some temporary file system or some network file system you can possibly not put a socket on it and have it working. So you have to have some very strong constraints if you actually want to use a socket to communicate between processes. You could decide to use file descriptor but that actually doesn't work. Well, it works but people like Marquette Ennis for instance said nah, it's not standard it shouldn't work, it won't work because you're not passing a file descriptor directly from a make process to the next make process but you have a shell in between and the shell is allowed to do whatever it wants with any file descriptor you pass it besides standard input, standard output and standard error. So the heuristic was very simple.  If that sounds familiar to the people working in Portsland it's exactly the same optimization that we put as DPB per lab. We're going to start stuff which is potentially expensive and we're going to block on starting anything else until we're sure that part is done. Sorry I'm going a bit fast because I want to go to the juicy part. The pipe issue, the solution came from something else entirely. Basically I just wanted to get better messages with a line number and stuff like that and if you have just a job manager that runs in every line in a target building you don't have good error messages because the job manager is just going to say oh something fucked up and you don't know where it went wrong. So I replaced the job manager with a job automaton instead of having one manager which is responsible for forking a lot of stuff have make proper which is forking everything by hand and each manager just keeps track of where it's at at which line it is inside a given job. The nice thing is that once you do that you realize you no longer need to have a pipe because you're no longer printing stuff from within the job manager but from make itself. So you have complete lines. Of course the comments you're going to fork are maybe going to display some stuff. Now it's not that often and it doesn't really matter. It works just fine. So no longer any problem with pipes. Since I don't link become an issue if you don't know about this I'm just going to alert you that this stuff doesn't work. You can't fork jobs and use wait and expect to get signals at the same time because wait won't be interrupted by signals. So it's as simple as that. If you have your make which is building lots of stuff and you want to interrupt it and you do things that way then you may have to wait for a long time. The idea is that you're going to do something funky with signals.  More or less. Side notes while bat is on there so it doesn't really matter. This one is probably the most important. People did say that using one single shell was good because you were forking less processes. Instead of that we can do another optimization. We don't necessarily have to run a shell for each command. Especially if you don't have any shell wildcards in the command. And we already scan the command through. We already look to see if we see a keyword like make. So if we just have a simple command, no shell. So it's even faster. And maybe I will do that but it would make sense to optimize the simple constructs which come up all the time where you change to a given directory and run some command. You could just directly do CHDR inside make and run the command that would work. As far as multiple targets I have to credit David Dolant. I think, if I remember correctly. He told me that when you see something like that it used to be a shortcut to say that both targets have the same dependencies and same commands but in recent POSIX declaration it actually means that you are, you might be building and be together. In order to be sure you have to do some heuristics. Always the same one.  In which case you have some speed commands. You're actually reusing the same rule to build a NB separately. But if you don't refer to the target it's very likely that you're building everything at the same time. And so you just lock one target while you're building the other one so that you don't try to build both at the same time. Notice that it's just a heuristic and if you're wrong it's not really a problem because if you tie some targets which are actually generated separately. Ah, they are not parallel. And that's it. That's the only issue you're going to run into. Okay, I just have time to talk about that which is the only issue that we have left these days. Why is it an issue? It's because when you're running Sec&Shall make it doesn't really matter because you can rely on the file system. Basically you're going to take one rule, evaluate it, build the target which is called A for instance. And then you look again at the file system and if you see a rule which refers to dot slash A. Okay, you look at the file system, you have the file and you have the right timestamps so you don't have to rebuild anything. But if you're trying to do stuff in parallel you don't necessarily know that both targets refer to the same file and you might try to build them both at the same time and it's going to go completely crazy. And even worse with VPF and even worse with suffixes. The first hint I got that there was a big issue with that is when I tried to build recent auto-conf because they rely on this. If you build any recent auto-conf with a separate object directory it will break with our Mac completely and it's not a Mac file issue. It's that problem. It's definitely that it tries to build a file in a given directory and refers to it as if it were in another directory and it has to be the same file and it doesn't know anything about it. It's very complicated. I had a partial solution which is basically to look at the file names and once you have the same file names you try to decide based on the full path whether it's the same file or not. And this works. You can actually figure out which files are supposed to be the same file. But you can't simply put a rule inside of Mac saying that okay, those targets are the same.  Basically, you can build loops inside the Mac file. It's perfectly normal. As long as you only take a tree part and you try to build it. And if you do those equivalents without thinking you're definitely going to create loops that Mac is going to notice and it's going to be awfully confused about it. And this doesn't work. And nobody in BSD land has a solution for this as far as I know yet. So the next step will be to go into the worst part of Mac which is the Parallel Job Builder and take it out entirely because I think that the sequential builder is better. The only thing that needs to be done is instead of building things to put stuff that's supposed to be built inside a queue and to iterate on that. And very often to look at those equivalence targets to make sure that what you've built is actually what you need and that you have everything in sync. And they should work, hopefully. So maybe see you in two years and tell you whether it worked or not. I think that's about the state of what we're doing right now. Yeah, some publicity for some other projects. If you want to have a build system that's sane you should really consider Ninja. As far as I know, it's make-don't-write. It's completely different. The syntax has nothing to do with Mac but almost every problem that you noticed if you played a lot with Mac like recursive Macs, automatically generating dependencies for header files, it's handled correctly by Ninja. The guy who did this has, well, 20 years of insight. He thought really hard about how Mac should work and he did something that does actually work. So please look at it. Don't go to S-Cons. Don't go to C-Mac to give to whatever. Definitely not to GNU-Mac. If you want to do something new, start with Ninja. Ah, I'm almost on time, I think. Yeah, any questions? No, I wait for the mic. In the example for the AB dependency rule change, that looks a lot like the Yak rule. They're using before, so what does make-do now when it sees that rule with Yak? For now, you explicitly have to put this dependency for things to work, which means that you can't rely on the auto-generated suffix rules for Yak but if you explicitly write that Yak rule, it will work. So this is still a bit tricky. You can't just use whatever is designed by POSIX for now because it will only say that to transform a Yak file into a C file, you have Veshul and it doesn't say anything about the header file. You still have to put extra dependency for things to work. This is what we did and as far as I know, we haven't had any races inside the Yak generated stuff for at least one year, so probably works. Actually, two questions. If, have you tried running make with different J values and see how the jobs are distributed among the processors? Yeah. Are they used in a proper way? Can make help that or is it just a kernel scheduler that's crappy? Oh, the kernel scheduler is definitely crappy. Yes, I know that, but can make help with that handicapped, of whom he has? Yeah, I should, but... I was just curious how the distribution looks. The thing I've noticed is that you have a crappy laptop like this 2-core CPU. You usually use a make-managed G4, for instance, because it's better than make-managed G2. That's some overhead that I don't understand anything about. If you really look at how much time you spend, most of the time it's not going to be a problem with make proper, but mostly with recursive make files. That requires that you redesign things to not be recursive at all, and you also spend a lot of time in configure street, for instance. But it's one exception in our source tree, which is bin hotels, which is completely crazy, but you've got all that stuff running in parallel and perfectly using make to build things very fast. But if you look at the most crapiest example we have, which is Xenocara, you will lose completely with make-managed G4, because you spend about half the time running configurals and compressing fonts, which are mostly sequential stuff. There's only one target running at one given time. If you look at it more closely, it's also one reason to have DPB and try to use it for possibly source constructs. Yeah, there isn't verse where you want to yell at me. Because make only deals properly with something which is fairly local. If you have one single directory with lots of source files, sure, you can parallelize it and it will work. But if you have things over several directories and people have already written make files that are separate for each directory, it won't be so good. It should also be possible to replace what we have in the tree in order to build several programs at once. In some cases, like very simple stuff, like LS or shmold or stuff like that, where you have the same options and where you have one source file per directory, you could say, okay, I want to build everything at once in parallel mode and it should possibly work. But there are some other dragons, most of all, TO, because if you start looking at the .mk file and try changing them, usually you're going to break something else. So it's complicated. So my second question was, if you look, is it always worth it to parallelize make in a project? I mean, the time it takes to calculate the dependencies and weight on the objects that need to be built might take more time than actually doing it sequentially. No, if you have one single directory and one single make instance, it's usually going to be worth it. It's going to be a problem if you have several directories, obviously, or if you have the time, if you start from scratch, I'd recommend that you write one single make file and that you reach over into whatever source directory you need and at least you get a chance to get all dependencies right because having make running over several directories and having several make files, it's going to be expensive because you are going to rescind the file system several times and also you're going to have some sequential bottlenecks all over the place. That's actually this anecdotal stuff about Ninja, which is that CMEK can be coerced to use Ninja as a backend and if you start doing that, you will break things because people usually don't supply all interdependencies between directory and Ninja is so much more efficient than CMEK at finding them out that you will find races that you weren't even aware existed, but it's definitely worth it. You just have to learn how to read dependencies, sprinkle a few of them around and it would usually go much faster. For instance, the biggest instance we had was Chromium because Chromium used to build using CMEK and GMEK and now it's, no, sorry, not CMEK, Jeep and GMEK and now it's using Ninja as a backend as a result, the build time has been more than half. Yeah, it was spending half the time just running GMEK rules at at least 50% CPU per GMEK.  Thank you, that's perfect. One question is, let's thank our speaker.


Moodle Workplace – Multitenancy Multitenancy allows you to have different, separate Moodle sites in one single installation with pertinent authentication, branding and more, and an optional shared space. Here, the Workplace admin toggles the Workplace launcher to the left of their profile in order to navigate to All Tenants. Clicking on All Tenants displays currently active and archived tenants and New Tenant allows you to create a new tenant. And when creating a new tenant, you can optionally request a new category with the tenant name to be automatically created. From Users, you can manage users for this tenant only, uploading them in bulk or adding them manually from the New User button. When creating a new user or by editing an existing user, you can assign the tenant administrator. From Roles, you can display and manage the roles for this tenant only and from Authentication, define the ways learners will log in to the site. The authentication methods here are the ones enabled by the main Workplace admin and can be configured by the tenant admin. From Branding, the admin or tenant admin can upload the logos and images for the tenant. You can specify the tenant accent color, add further customizations with CSS, and a useful reset button allows you to restore specific items to their accessible default configuration. Each tenant has its own individual dashboard. By default, it's linked to the main site wide dashboard but can be personalized to suit the tenant. The Workplace mobile app allows per tenant configuration and so from the mobile tab, you can customize the setting specific to your tenant. If enabled, Shared Space is available top left. Anything set up here is accessible to all tenants, for example programs, dynamic rules and reports. Our admin can for instance create a shared report inside of this space, which will then be available to users in all tenants so they don't need to duplicate the same reports. Now the tenant is set up, we can follow the tenant admin as they log in via the customized page. From the Workplace launcher they can, amongst other options, manage the branding and dashboard from the appearance icon, manage users roles and authentication from the user's icon and from custom reports they can access that shared report. To summarize, multi-tenancy allows you to have different separate moodle sites in one installation each with their own authentication, branding and more. Anything added to the shared space can be accessed by all tenants.


Quiz Automatic Grading If you want to assess learners formatively or summatively with questions for which there are specified answers, Moodle's very powerful quiz enables you to do this. We can only look at a few of the features of the quiz in this screencast, but it's worth exploring more yourself and in the Moodle documentation. Quiz allows you to use different types of questions, not just multiple choice, and it also allows you to add, as here, media, images, video, sound files as part of your questions. If we go to our course and see how to add a quiz, the first thing to note is that in the more link from the gear menu, we can access the question bank. When a quiz is created in Moodle, you create the questions separately and store them separately, so they can be reused by you in a later quiz or by your colleague in the same course in a different quiz. So if you wish, you could start by adding your quiz questions to this question bank here and then make a quiz another day. But we'll make our quiz straight away, so to do that, we turn on the editing from the gear menu and then in the section we want the quiz, we click add an activity or resource. Quiz takes us to Moodle's activity chooser and we scroll down to quiz. Quiz is an activity because the learners are interacting with it. If we click it once, we get information as to how best to use a quiz and then we can click the add button or if we understand about a quiz and don't need to read the information, we simply click the radio button twice and this will bring up the setup screen. The first thing that we do is create the front page if you like of the quiz. The name and the description which quiz learners will see and if you want the description to appear on the course page, just tick the box display description on course page. There are many different settings in a quiz and it is worth exploring all of them. If there's anything you're not sure of, the question mark help icon gives you extra information. For now we're just going to click save and display and we have a blank quiz and what we need to do is to start adding some questions, which we can do by clicking the button edit quiz or edit quiz from the gear menu. We then see add and if we already have questions we could add a random question to our quiz or a particular question from the question bank which we might have added to earlier or a colleague might have added to earlier. But we're starting anew from nothing so let's click to add a new question. We are then presented with a list of question types to choose from and just like with the activity chooser, if we click the button next to the question type, we are presented on the right with some information as to what that question type does and note that although most of these questions are questions where you provide the answer, it is possible by choosing essay to have learners typing an essay which we would then manually have to grade. Note also there is a description question. This isn't a question type as such, it's just a text editor into which we could add an explanation, some instructions, images, videos or sound. For the purposes of this quiz I'm just going to add a multiple choice question. We are then sent to the setup for this particular question. We have to give it a name although the name doesn't appear in the quiz but it's important because it's how it would be recognised in the question bank in the future, particularly if we have a lot of questions ourselves and perhaps shared with colleagues. In the question text that is where we type the actual question and then when we scroll down what we see will depend on the question type but we'll always be able to add general feedback for any question and then in the answers because it's multiple choice we add the first possible answer with the grade. None, we add none if the question is wrong or a hundred percent if it's right however there are, as you can see, options in between. We can give specific feedback for each individual answer and if we want to do more than just write simple text we can use the icons in the text editor. So again we write in our other choices, choose the grade and we continue. When we click save changes we have our first quiz question which we can preview by clicking the magnifying glass icon so we then go on and continue adding questions to our quiz. Finally looking at a quiz that's already been made it's easy to change the order of the questions by dragging them up or down and to add or remove page breaks by clicking on the icon and we can divide our quiz up into sections as well.