Hi I'm Holly Wacom and I'm going to show you how to create this festival look using hashtag flash mob products.  So we're just going to use the tip of this little liner brush to really flick that line out really heavy and really bold. We're then going to apply a purple liner to really give it some contrast or some punch and it just really helps to look quite festive as well. So just apply the liner above the blue line. You can take this one a little bit thinner if you want. So to finish this look off we're going to use a lavender color lipstick. This is going to go perfect with the hair, the skin tone and the eyeliner. So you want to keep your festival makeup looking really bright and colorful and just be bold. So to complete this festival look we added hair chalk to the hair and I'm also going to add some twists and a flower crown. So all we're going to do is just roughly take the front parts of the hair and this is great for making the hair look a little bit more interesting and it's also going to look great with the different colored hair chalks and it sort of kicks out of your face as well. So just grab hair, it can be quite loosely done, it doesn't have to be perfect, it looks better actually than messier it is and just lightly twist the hair like this and then just take a little bobby pin or curvy grit and pin it in place and then just do exactly the same thing to the other side and no festival look would be complete without a flower crown. So we're just going to pop that on top like this. If you wanted you could secure it down with a couple of pins but I think that'll be fine like that. So I hope you enjoyed this festival look. Have fun recreating it if you're going to a festival this year and thank you for watching.


Hi, I'm Yuna, and I'm here to cover what's new in Material Design on the web. We've got a lot to go over, so let's get started. The first update is the Material Theme Builder tool on Glitch. The tool itself is a self-contained application that showcases each of the material components with prompts to update the base theme shown. It helps teams to leverage the three subsystems of theming within Material, typography, shape, and color. The tool uses SAS variables to show users how to adjust an interface style and make their own brands shine by changing just a few lines of code within a theme file. For example, color can be adjusted via a series of variables such as primary, secondary, background, and surface colors. These come paired with on colors, which represent the text color on top of a variable background. Shape customization can be made for three component sized classes, small, medium, and large components. Small components include buttons and input. Medium components include modals and dialogues. And large components include menus and drawers. There's a great shape tool on Material.io to help you visualize these changes on our components before applying them to your code base. And finally, we can adjust typography through the generalized MDC typography variable or through SAS maps that allow you to customize individual typographic levels, such as having a separate weight and font family for primary headlines rather than the body copy. In the end, your theme could look something like this. This is just one example that comes from Google Developer Days in China. We've made thousands of themes around the world so far, so head over to Glitch to add your own. We're also working on a set of guidelines for adapting dark themes using material components. For example, in a dark theme, Google Material's color palette reduces intensity to mitigate visual vibration or strong color contrast against a darker background. Instead of solely adding drop shadows to illustrate elevation and depth, in a dark theme, a lighter overlay is applied. Check out the Material.io guidelines for more design guidance on how to transition your designs into a dark theme considering contrast, depth, desaturation, and limiting colors for accessibility. To help with this transition, MDC Web has released a set of typography theme variables that respond to background shades for text styles. You can now also use the theme variables in three different ways. The most supported and robust technique is with our SAS styling API, using variables and mix-ins to override styles. You can also create CSS classes with the variable names to style them by. And finally, for modern browsers, CSS custom properties can be used for the theme styling. We're still working on full support for custom properties at this time. We provide so many options because theming should not be limiting. You can extend the theme builder to make your own theme as unique as your product. Leverage our code and build on top of our material components to quickly and easily get started building product on the web. The next new feature in Material is data tables. You asked, we listened. Our designers considered these three principles when it comes to data tables. The first is that data must be organized in a meaningful way. Data tables should also be allowed for user interaction. And finally, those interactions should be as logical as the structure of the data table itself. Data tables come with some basic default functionality, such as row selection. But you can also hook them up to other components, such as these filter chips. Check out the links provided below for a deep dive into how you can actually implement data tables in your web projects and combine material components for orchestrated actions. We also have a new density subsystem option in Material. Material design uses low density space by defaults with large tap targets and margins, but offers high density space when it improves the user experience. We brought density into our system for the following reasons. The first is for scannability. Scannability is improved for data heavy applications with a higher density interface. The second is that dense UIs may actually help users focus by reducing space between actions. And finally, more content is available to the user on a single screen and more high density applications. Whether or not to increase your UI's density can be determined by how users interact with a component. Components with high density enable users to process and take action against large amounts of information in a more manageable way. Lists, tables, and long forms are components that benefit from increased density. But density shouldn't be used for every component. For example, don't apply density to components that involve focused tasks or alert the user of changes, such as snack bars or dialogues. Applying high density to alerts reduces their ability to command attention. A series of new styling classes on the web allows for us to access density in three ways. The default component size, a comfortable size, which provides a higher density display while respecting minimum touch target size, and compact, which may be used for pages with a lot of information, but may be inappropriate for user actions. Material.io got an update as well. We now provide a cross-platform view of all of our component offerings on a dedicated components page. This page allows for quick access to components and an overview of cross-platform availability. It should make it easier to navigate our product and implement it for your needs. Check out material.io slash components to browse them all yourself. And finally, we're kicking off a new initiative this year to focus on supporting material across web frameworks. Why? We know that most of you are developing web apps using a framework, and the open source community has stepped up immensely building components for some of the most adopted web frameworks out there. We want to celebrate this work and help bring the material design vision to life along with our open source community. So many of you have already built your own wrapper libraries using MDC web's components, foundations, and adapters. And we're working more closely with the rest of the open source community as well. We've updated material.io to link to three of the most popular open source component libraries. They've already uncovered bugs in the material design guidelines and asked great questions helping us to make material even better. And we're helping them to follow the spec and the material guidelines more closely as well. We look forward to continuing the conversation and working to bring the material design vision to every platform and framework, making it easier for everyone to use material design on the web. There's so much to explore and play with from theming to density to data tables to new website features and our open source community. It's an exciting time to be building the material. So check out material.io and the links below where you can find all the resources that I mentioned today. Can't wait to see what you build with material. I'll see you on the web.


So, how much energy would be required to melt 15 grams of ice at zero degrees Celsius? And then it says the heat of fusion is 6.01 kilojoules per mole, okay? So it's asking us how much energy would be required. So remember, kilojoules is a unit of energy. Is everybody okay with that? And we've essentially got this conversion factor here is kilojoules to moles, right? Kilojoules to moles of ice. Does everybody see that? So, what we're going to do with this one is take that heat of fusion, how much energy it takes to melt something, in this case ice. And they say it's 6.01 kilojoules per mole. So let's just write this out, per one mole. And of course it's one mole of ice. This gives us the mass of ice, which is 15.5 grams of ice. So, can we get from the mass to the moles somehow? How do we do that? What is it? What is that thing called? The what? Molar mass. The molar mass, yeah, that conversion. So in this case it's 18.02 grams of ice, right? Because ice and water are the same molecule, of course. Or mole of ice. So this will give us now the number of moles of ice. And if we wanted to, we could even straight up get the energy, right? So do you see that? We can use this conversion factor as 6.01 kilojoules of energy. But we've got however many grams of ice, or however many moles of ice. So let's figure that out by 15.02. So we've got 0.8324 essentially moles of ice. And then multiply that by 6.01. And I got, so what are we looking for? Q, right? Plus 5.00 kilojoules of energy. So what about this one? Is this one flowing in or out of the system? Into the system, right? The other way you can, so you can also think dyes and stuff. Are there any questions about this one? You guys are getting it today. Good.


Alpha amylase is a widely used enzyme in the starch industry, but its use is limited due to its instability at high temperatures and low pH levels. To address this issue, it has been immobilized using various techniques such as absorption, entrapment, covalent attachment, and cross-linking. These methods have reduced the cost of production while maintaining the enzyme's activity. However, the large size of the substrate's present challenges to immobilizing alpha amylase, which can lead to decreased affinity for the substrate and VMAX. This review discusses the various aspects of alpha amylase, including its applications, structure, starch, immobilization methods, and obstacles to improving its efficiency in the industry. This article was authored by Layton Mifacker, Yasin Amadi, Javad Khalili Fard, and others.


Since several lectures I have been discussing about the geomaterial characterization and in particular the chemical characterization. We have discussed lot of things under the realm of chemical characterization and in particular in the lecture we were discussing about the contaminant transport through porous media and this is where I had coined this concept of sorption, desorption mechanisms or the characteristics we had discussed about the one-dimensional advection diffusion equation and I had also informed you that this is the best way to quantify the geomaterial contaminant interaction. So today's discussion would be revolving around the mechanisms of sorption desorption and how would you determine the KD parameter because if you remember in the previous lecture when we were discussing about the one-dimensional adve there I had pinpointed that unless you know the KD parameter you cannot get the retardation coefficient R and you cannot solve the equation which would give you the concentration of contaminant with respect to distance and time. So this is where the KD becomes very, very important. In other words KD is also important to quantify the amount of sorption or the reverse process which is desorption is going to occur. Incidentally KD is known as the distribution coefficient and having done this I will go back to thermal characterization, electrical characterization and magnetic characterization. So to begin with the first question in mind is that what is sorption? Sorption is a mechanism which constitutes of two components that is absorption and adsorption. So as the name suggests absorption is something which is assimilation, inclusion or incorporation of something in a matrix while the adsorption process is surfacial. This is accumulation of substance on the surface and when we say surface this has to be a sort of a substrate like a clay particle alright. So imagine that on the clay particle the cations are getting packed. So this is a sort of a adsorption phenomena. However coming back to the absorption the molecules or the atoms they have a tendency in the bulk to occupy the porous space or the pores. So like absorption of water by the porous media particularly like sponges or stones which are having very high porosity. So this is the absorption process. The adsorption is something where the atoms and molecules move from the bulk space that is the solid liquid or gases and they get deposited onto solid or liquid surface. So this becomes the adsorption process. So as the name suggests the adsorption is going to be something which is related to adherence alright. We have used this term in conventional geomechanics also in the form of the hygroscopic moisture content where the thin layer of water gets adhered onto the particles alright. And that thin layer could also contain the contaminants and when this process happens we say there is addition of a thin layer of molecules of some substance which is surrounding the surface of the solids or the liquids. So this becomes adsorption. I hope you can realize from this comparison that until now in classical geomechanics we have been using the concepts of absorption. The simple answers to this type of discussions would be if you have to find out the porosity of a porous media. So suppose if I give you a rock sample and if I ask you what is the porosity. So the normal procedure is you soak the water. So soak the sample in the water for 3-4 days, take it out, find out the weight difference of the you know wet to dry and then compute the moisture content and it gives you a sort of indication of what the porous structure would be. Very gross way of finding out the porosity of the system. Because with the discussion which we had until now in this class you must have realized that water molecules might not be penetrating to the very fine pores which are present in the porous media. And hence this method is empirical method, it does not give you the complete porosity particularly the porosity which is going to contribute to most of the mechanisms which control the contaminant transport in the geomaterial. So another way of looking at this would be suppose there is a particle of activated charcoal which happens to be a substrate and this activated particle is attracting the gas molecules or the liquid molecules to get adhered on the surface and this is what the absorption phenomena would be. I can use this concept to create filters of different types alright. So if I create a situation where the particles or the substrates are extremely active chemically these particles are going to attract the cations which are present in the sludges alright or the gas molecules and they have a tendency to create a bonding with them and hence the purification process can be done. So by definition this type of situation can be defined as the purification by adsorption wherein impurities are filtered from the liquids or the gases by their adsorption onto the surface of a high surface area solid which is a substrate such as an activated charcoal. I am sure you must have realized that what we have done is from the liquid or the gaseous phases we have separated out some molecules or atoms which are adhering on the substrate. So we have created a sort of a partition we have created a partition between the system from the liquid phase it has got separated to a phase where these molecules or atoms come and sit on a solid surface and that is the reason we call this as a partitioning phenomena or distribution phenomena alright. So imagine there is some concentration of contaminants in the liquid or gaseous form and when I bring this system very close to an activated surface which could be clay naturally activated or chemically activated. So what is going to happen these atoms or you know molecules they will get parked on the surface of the system which is substrate and hence the partitioning has occurred. This is the concept of sorption phenomena is this okay. Now the terms which we use in sorption for defining the sorption mechanism are adsorbates and the second one is adsorbent. So substrate is also known as adsorbent substrate is a clay particle charcoal particle any surface which is participating in adsorption phenomena adsorbates are the ones which get sobbed onto the surface mostly molecules or the atoms alright cations let us say. So they will get palped on the substrates or adsorbents. So in case of the adsorbed cations they get tightly held on the surface of the negatively charged tri clay particles clay particles are the substrates and the cations are adsorbates I think I have discussed and you must be able to realize what it is. So in a very layman's language the sorption phenomena can be you know simulated like designing a parking lot. So imagine in parking lot what happens most of the vehicles come and they get parked. So many times we use the term that molecules get parked on a parking lot. So this parking lot is nothing but the substrate a clay particle and the vehicles which are coming and getting parked are the molecules or the cations alright.  Something of them of the same sort is happening in case of sorption phenomena also. So sorption would depend basically on the size of the cations as well and the valency of the cations as well and the chances are depending upon their valency they might get preference. But a bulky cation might have to wait because of its size clear. So when we were talking about cation exchange capacity of the geomaterials one of you had asked this question that you know what is the significance of washing several times and allowing the geomaterial to interact with sodium acetate and calcium chloride solution. So I think now you can realize what we have done in the process of determining the cation exchange capacity is we had allowed sorption and desorption to occur clear. So all the sodium ions which are present in the geomaterial under natural circumstances will get displaced by the cations like calcium which have higher preference clear. So this is the sorption process and then in the next step what we have done is we have washed this with the water. So we have done a desorption process. Ultimately what we have done is by repeating this cycle we have tried to quantify how many cations can still remain parked on the surface of the adsorbent. This is okay. So that is the quantification which you have already done. So this is the basic model. If you take the clay particle which is negatively charged the cations will come and get parked on the surface and this is a sort of a sorption process. So I just need a surface. This might happen in air also aerosol formation. So during winter, mornings and nights what you have observed you know the particulate matter which is present in the environment because of the temperature attracts dust particles and these dust particles get logged over there and they cannot precipitate because of their very low density clear. So this could happen in the gaseous phase also desorption phenomena. So desorption is a reverse process. So until now what we talked about is the sorption process. What is desorption? Desorption is the phenomena where the substance is released from or through a surface okay watching cleaning up process is a reverse process of the sorption phenomena. So this is opposite to the sorption process and this type of mechanism is going to occur once the sorption has got equilibrated. After eating sufficient food, what is our tendency we repel the food is it not. So after getting saturated, the tendency is that you say no I would not take anything it is a sort of a aversion, it is a sort of a repulsion. So that means the desorption process will always start after the sorption has occurred and it has achieved its equilibrium position. So equilibration is between the fluid phase that is the gaseous phase or the liquid phase and an absorbing surface. So this absorbing surface could be the boundary of the two fluids or this could be the solids like particles. So I am sure now you are realizing that these mechanisms would control the you know quantification of contaminant geomaterial interaction. Suppose if I ask you a question whether a geomaterial is going to interact with a contaminant or not, the best way to answer this question would be you allow the interaction to occur and see how much concentration of contaminants has got plugged onto the surface. If it is insignificant the you know analysis of the answer would be either your geomaterial is passive or the contaminants are also passive but if it happens to be substantial then obvious the indications would be that contaminants are also active and surface is also very active. So these are the two extremes. You can always create another two extremes by saying that the contaminants are less active, surface is more active, surface is less active and contaminants are more active. So when the concentration or the pressure of the substance in the bulk phase is lowered you know some of the soft substance make move out of the system and they may get again dissolved into the bulk phase. This is what is known as depressurization technique. So if you lower down the pressure what will is going to happen? There could be a process by which the bonding between the surface and the molecules gets reduced and hence molecules are free to move into the phase through which they came onto the surface. These are some basic concepts which I thought I will give you before we start discussing further.  So what I should be doing first I will add some water into the soil so that the cations will leach out into the pore solution and then I may suck out the pore solution and in the process of sucking out the pore solution it might so happen that this pore solution will also accelerate the desorption process of the cations or the molecules. So you are inducing a pressure gradient which might be resulting into the desorption process. Is the mechanism clear? They are in sorption process how can we make sure that only the contaminants are getting adsorbed to the substrate. Like useful whether this will be a D from the geomaterial can also. No repeat your question please. How can we make sure that only the contaminants from the geomaterials are getting adsorbed to the surface. Adorbed or desorbed. Adorbed. So this is the process of sorption because only cations will get solved on a surface. Because of the clay particle as negative charge and cations are positively charged so what is going to happen only the positive will come and sit on the negatively charged particles. If the surface happens to be neutral then this is not going to happen. So you may extend this logic to the situation that sands will not sorb anything. So when you are designing the filters which are made up of sands their sorption desorption mechanism will not work because sands are neutral particles fine. But most of the time what do you see what do you see is that these filter beds are granular media are you realizing where the engineering would be. So if I take these sand particles and if I activate them by using some bioactivity Now what I have done I have done the coating on the surface of the sand particles in the form of a microbial coating and these microbes are themselves negatively charged. So practically there is no difference between the clay surface and the sand surface as far as the charge carrying capacity is concerned. Now this is the technology which you have done you have converted a material which was inert into a electromagnetically charged particle by putting a layer of bacteria got it. Now this is fit for acting as a environmental filter you are talking about whether we can create barriers by using this concept or not yes it is a barrier system. So when we talked about permeable reactive barriers yeah so these are the good examples your permeable reactive barrier has to sort everything at the same time it allows permission through it also. So that means absorption is going on as well as adsorption is also going on imagine you close your eyes and imagine that unless the fluid enters into the pores alright adsorption is not going to occur. So for adsorption to occur first thing is absorption, just a minute, just a minute. So that means the fluid phase has to enter the porous media imagine all the pores are filled up with the fluids when there is sufficient time now what is going to happen now there is exchange phenomena which is going to get actuated between the fluids which are present in the pores and the solid matrix. So absorption has to happen first followed by adsorption clear once everything gets saturated if you take out this system and put it in fresh water what is going to happen concentration gradients are going to develop and higher concentration which is present in the system porous media would move out and this becomes a desorption process. So when you design PRBs you have to talk about desorption-sorption mechanisms yes please. How good they are in like the activator clay particle how good they are in like arresting the heavy metals. These all heavy metals no cations are heavy metals like yes. So when you design environmental filters basically you wanted to get rid of heavy metals which are cations, strontium, chromium, mercury, nickel, cadmium whatever. These are mostly like we assume that in a landfill each of these are the primary. Yes correct, correct. So there are lot of studies where people have done where they have utilized you know different type of contaminants, synthetic as well as naturally occurring lot of studies have been done where the synthetic groundwater has been created and particular this type of studies are done in the atomic industry where you try to simulate the groundwater with different species of cations and then you try to see the competitive sorption taking place and what is the net result of you know sorption phenomena. So these studies are quite prevalent fine. I will try to explain it more and more when as we move on anything else. So this is a simple depiction of sorption desorption process. If you consider the clay particles you know there is a adsorbed cation which is adhering to the surface of the clay particles in the dry condition there is no fluid. So cations are strongly sorbed on clay particles fine. A good example of this would be most of the time you use talcum powder. Why? Have you ever questioned? Talcum powder is in the dry form. So why do you use it on your skin? Question this. That is a beautiful example and talcum powder is nothing but a sort of a clay particle very fine particle surface area is very high mineralogical it is very active. So what is going to do is going to soak all your sweet, agreed? So basically this is a sorption process which is taking place on talcum powder and of the sweet. This is negatively charged fluid having lot of bacteria in it. So this is the mechanism. Now add a little bit of water to this. So the moment you add little bit of water to this what happens the water molecule goes and sits inside the system where the cations and the clay platelets are already present. So the water molecules enters into the interlayers we call them as interlayers once the water is added. A stage comes where this system becomes saturated like this. And once the system becomes saturated you must be noticing that clay layers are getting separated out. Why? This is diffuse double layer concept clear? So diffuse double layer once it gets saturated completely the desorption process starts is a simple mechanism. So once the cations get fully hydrated so water acts as a source of you know the mechanism which causes sorption and desorption to occur because fluid phase particularly gaseous phase sorption is going to be a difficult process to simulate why? It is not easy to park gas particles on a substrate though people are trying to do this carbon sequestration is a good example of this. Cold bed methane is another good example of this CBM. So if you type on net you will get lot of information you know CO2 sequestration and cold bed methane CBM. So what they are trying to do they are capturing carbon dioxide from the atmosphere injecting it into the porous media. So they are recharging the reservoirs of hydrocarbons which we are otherwise consuming and this becomes a sustainable solution fine yes. Water has a strong adherence as compared to the negative the cations like from the picture it depicts like this. It can come in way and replace that cation that were earlier adhered. Is this possible? I mean there is something known as solubility of the cationic suspensions yes it is possible. And sir one question is like slightly different from this at what really that way that day we were discussing like double layer is fully formed at very high water content. So in the simple Atterberg limits we simply say it is around liquid limit it is formed but do you have any idea like around what water content this double layer is fully formed or there is like ambiguity in that. See double layer normally is not ascribed to the moisture content first of all. Double layer is ascribed to the thickness of the system the cationic layer which is getting adhered onto the substrate. So double layer is always at you know associated with the size of the clay particles after the cations have stabilized on it. They have adhered on this we do not normally attribute it to the moisture content. Like compaction theory and everywhere we always talk about this phenomena. So there we are not talking about these mechanisms double layer and all we do not talk about there. We should have in fact sufficient amount of free water for double layer to get formed. So that means all these concepts are valid beyond the liquid limit or at liquid limit.


he ability to converse the way that he does in his videos and learn to dream. I'm not much of a dreamer. I'm more of a, let's just talk about what we know and then maybe speculate on what we don't and then I'd be wrong and everyone get mad at me for it. So go check out his channel. He does really, really great work over there. I would love to see him blow up over the next year, guys. Seriously. Maybe it'll all get my breakout year. Yes. I want him to have his breakout year. Like this year, I know I really push hard to get you over 10K. We got it there. Let's go, folks. I would love to see him blow up past me. I think he deserves it more than I do. So let's do it. Make it happen. I want him to hit 100K before I do. I'm not even joking. That's a funny thing. I think your content is that good. I appreciate that. I think it deserves way more attention than I get. I get really sad when one of your videos doesn't perform well and I'm like, no, no. Why are you watching my content? His content is so much better. Watch it. It's rare that I say that when guests come on, but I legitimately think your content is way worthy of more views than it gets. So please, everyone, go check out his channel if you haven't.  That's what him and I do, even when I'm on his show. I love this fun, man. Which, haven't you even done your show in a long time? I think it's been on hiatus for a bit. I need some Q&As here and there. Yeah, we were on a two-week break, although you know what? There have been less guests lately, so I've been just doing... There's some sort of livestream on a Sunday. Yes, yes, I've noticed that. That's why I said Q&As and other things. Yeah, yeah. Okay, well, go check on all these emails. You should have a podcast on Sundays. You know, maybe I'll pop on one here in the new year, but I'm sure I will sometime next year. You guys are awesome. Thank you for tuning in. And we'll catch you in the next podcast in 2022. 2022, everybody. Happy New Year's to everybody. Yeah. Peace out. Later. See ya.


Hello, welcome back to Brian. I hope you had a great great dinner Your belly's full ready for some more talks Because I am I didn't have dinner, but I'm ready. Are you ready, Benji? I'm ready. You are great to be here everyone Great to have you you're talking about Mona we both writes that is correct. Yes a controversial topic on which I have strong opinions Amazing your slides are ready. I'll leave you to it Appreciate that. Thanks So hi everyone, thanks for attending my talk. I hope you've all had a great conference My name is Benji and I'm one of the core contributors to pants, which is an open source build system And today we're going to talk about python code base architecture and specifically about monorepos And I know that this is a controversial Topic on which there are many opinions. I am going to present mine and I fully acknowledge that there are others A little about me and Why it is that I came to have a lot of strong opinions here I've worked as a software engineer for many years. I Have had the good fortune to work at some really great companies And as I mentioned, I'm a maintainer of the pants open source developer workflow system And in the last couple of years, I have been a co-founder of tool chain, which is a startup in the Developer tools space So a quick overview of this talk Basically three parts. I'll start by defining terms. What is a monorepo? What do I mean when I use that term? A bulk of the talk will be well. What why would I want one? And the last part of the talk will be about Say you're on board with wanting a monorepo. What kind of tooling makes working in a monorepo effective? So let's jump right in to What is a monorepo? so there is one thing that is a common characteristic of Kind of basically every code base almost all code bases that any of us are working on and that is that they grow over time and they grow because You have some set of developers that are adding code over time But also if you're hiring and your team is growing then you're adding more developers who are adding code over time and so your code base can grow faster than linearly over time and There is a very common consequence to this which is that builds Get slower and less manageable. They become unstable. They become unbearably Slow and clunky. Now I can already hear The ejection forming in some people's minds. What do you mean by builds? Python is not a compiled language So I'm using the term build and if you don't like the term build you can substitute develop a workflow In the general sense So it's every step that you take from when you hit save in your editor to having an artifact that's ready to deploy So for example resolving and downloading your external dependencies or generating code or type checking or running tests, obviously is a big one Debugging in a repl linting formatting actually building and packaging those deployable artifacts python definitely has a build It just doesn't have a build time compiler So that's what I mean by build And again these all of these get slower and less manageable as your code base grows So what do we do? as your organization and your code base grows we have basically two architectural alternatives To how to manage that code base in a scalable way And those two are the multi repo architecture versus the mono repo architecture And I should mention that obviously this is a continuum. You don't have to be at the extreme end of either of them Um, but generally this is the these are the two poles through which this continuum goes Now let's start by talking about multi repo Multi repo means as your code base grows you actually Split it up into a growing number of Small or you know, manageable size repos and typically you split them along team boundaries or project boundaries or library boundaries And very often this kind of happens naturally because it's the path of least resistance The easiest way to get a handle on scale is to just take an axe to your code base and just carve it up somehow And worry about the consequences later and we will obviously talk about those consequences soon But there is an alternative and the alternative is What I refer to as a mono repo um And the mono repo is you keep a single unified growing code base that contains code for multiple projects multiple services that share underlying dependencies and tooling and best practices Now a mono repo, for example, may contain code for multiple in multiple languages Or even in the same language it may contain code relating to multiple frameworks And typically you'll have different parts of your team working on different But overlapping parts of the mono repo very often they will overlap on exactly those shared dependencies And as your code base grows as your organization grows your single unified mono repo grows along with them now I should emphasize that We are talking about code base architecture not deployment architecture So a mono repo is like as an architecture is agnostic to whether you deploy You know a few large monoliths or you deploy many microservices And in fact, there are often many advantages to deploying microservices out of a mono repo because when you have a great many services they have to They share dependencies and in particular they often share protocols Because that's how they talk to each other and so it is often very helpful to have those be in the same repo And that leads me on to the second part of this talk, which is okay mono repo defined why should I want one and I will freely admit that multi repo does sound better at first It's more decentralized. It allows you to make local decisions Um You you can sort of do your own thing in your mono repo you can put a boundary around it and sort of maintain order In your repo and keep all the barbarians from from other parts of your team out of your code It sounds good and and these are good buzzwords. Uh, and there are cases when I think that is actually valid. Um, I'm not A total fanatic here But there are a set there is a set of core problems in code-based management that multi repo Not only doesn't solve, but it hides them It obscures the problems until you encounter them down the line Uh, whereas a mono repo makes these problems explicit so you can reason about them And there are various ways to convince yourself of this. Um, because of shortness of time. I've boiled it down to uh, really one main Point that I want to make which is that uh, from my experience, uh, the hardest code-based problems are managing changes and managing dependencies And the overlap the intersection of these two is particularly tricky. It is where so much of the pain Of code-based management, uh, lives and to the extent that we can pick a code-based architecture That makes handling these problems easier. I would argue that we should consider doing that So when we think about managing changes, um, in a world of dependencies Or managing dependencies in a world of changes Let's look at first how these challenges are handled in a multi repo world so Multi repo relies on publishing So if you have a bunch of repos and you know, some of them consume some code some library or some utility from repo a It has to publish an artifact say in python that would be an estus or a wheel or whatever Now when I say publishing this could mean to a private internal Corporate repository not necessarily to public pi pi because remember that we're talking about an organization's internal code base here So we rely on publishing But unless repo a never changes which I mean let's be realistic here. It will It's not just that you need to publish but the artifacts you publish need a versioning scheme So When you make a change or someone makes a change to this repo a they have to republish that under a new version And why because otherwise those changes might break the existing consumers of repo a at the old version So if you know to look at a more Specific example here if we have repo b that depends on repo a it does so add a specific version So now say you're an engineer working in repo b and you need some change to this upstream dependency so First you have the organizational task of finding out who owns repo a You know figuring out are you even empowered to make a change in repo a but let's say that you are or you've convinced The owner to make the change that has to be Published under a new version and then you need to consume that new version presumably in a new version of your repo and now something needs to happen and you have two choices when it comes to Change management through these dependencies So first of all you can decide to be a good citizen and make the virtuous choice The virtuous choice is you find all the other consumers of repo a that could be many um You ensure that their code still works with your change You modify those repos as necessary until say their test files or until you've figured you know qualified that your change is good for them And that is a lot of work Because first of all, how do you know who all the consumers of repo a even are remember that? Uh dependency consumption metadata lives on the consuming side So repo a there's no metadata in repo a that says here is the universe of my Of other repos that depend on me. So you have to find them somehow Then you have to figure out. Well, how do I? test the change what do how do I know enough about this repo to even run its tests or You know figure out how to qualify that this Change is good But let's say I figured all that out and I've done it um I'm still not done because I actually have to do this recursively if I made any changes to the direct consumers of a So repos, you know, sure. I made changes to b because that was why I started this whole Laborious piece of work, but say there's you know cd and e that also depend on a if I've made any changes there Then I have to recurse this process and I have to find all the consumers of those libraries So those repos and do the whole thing over again. This is a tremendous There's a lot of friction here is a tremendous amount of work so even though You know being a good citizen is good, but very often you end up making the I would call it the lazy choice Which is I'm not even going to worry about the other consumers of repo a because that's what versioning is for right They're safely pinned to that earlier version And when those other consumers need to upgrade I will let them deal with that problem but This isn't very nice because by the time They have to do that upgrade. Uh, they may have no context for your change. You may have lost context for your change Maybe maybe you're not around anymore Um, so essentially what you've caused is You know the problem famously known as dependency hell. Um, you've you've effectively Caused these other repos are potentially you've caused a dependency resolution problem Where if they don't upgrade but they depend on a through two different paths They may end up with two different versions Which is impossible like one of them has to be picked and it's possible that neither of them will work And this is exactly what I meant by Hide that the multi repo hides problems It allows you to essentially push responsibilities off onto other people at a future time So you've left a little time bomb in the code base And that is not a great way to be part of a of a productive and cohesive team So that was multi repo But in a mono repo, there's no versioning or publishing all the consumers Again, we're talking about a continuum But in the extreme case at least all the consumers are right there in the same repo You can find them using like ripgrep or whatever your you know code-based comprehension Utility of choice is you can run all the tests You can run all the tests in the repo You can run just the relevant tests if you have the right tooling to do that to ensure that your changes are good and Any breakages are immediately visible. You're essentially making self-contained changes that are Guaranteed if you are scrupulous about running tests and so on they guarantee to be good at head Like you are keeping everything in lockstep And so you can see an example here a really important one in my opinion of how code-based architecture actually enforces good teamwork and responsibility So more generally this was a big example. I would argue that Even though it seems counter-intuitive Mono repos can often be more flexible than the alternative. So for example, they are easier to refactor They're easier to debug because you can transit easily through all the sources that affect your the Code under debugging You have unified change history. So it is very easy to reason about The mutation of the code over time It's easier to discover and reuse code because everything's right there in this single repo Putting repo boundaries between different parts of your code base reduces flexibility and my last point here and more generally is that I have found I have seen from experience without naming names that The code base architecture is very often a reflection of the structure and functionality of your organization So there are many cases where localized decisions and creative chaos are desirable sort of wisdom of crowds type thing But an engineering organization Is not a bottom-up kind of thing like by its very name and nature It's organized and in a well-functioning engineering team priorities and decisions and effort allocation flow Top-down and some sort of top-down organization is required and in engineering organizations code base Very often reflects those organizing principles. And I think this is why many large companies You know google facebook twitter many others have adopted this monorepo architecture Because it helps keeps the organization unified even when they're at huge huge scale So that's kind of what I had to say about my my sort of advocacy in favor of monorepos for python and in general But focusing a little bit on python I did want to For the remainder of this talk about tooling for a python monorepo. So we are Accepting that we for the sake of argument. We've accepted that we want a monorepo. How do we work in one effectively? so The observation is that standard python tools the tools that you all use every day from Pi test to pip to my pi to flake a to you name it Generally are not really designed for a monorepo architecture Typically they rely on the reasons are that they rely on global state And they rely on sort of side affecting into the file system They they leave virtual m's and files all over the place and they're expected to be there when you need them and As a result Small changes tend to trigger full reruns of whatever task it is. You're doing whether it's running tests or running I don't know my pi for type checking Lintas formatters you tend to sort of run them universally The tools generally are designed to expect that they run on an entire Package hierarchy on an entire repo now some individual tools may have special case mitigations for some of these issues But it's very ad hoc So typically when you end up using when you use these teams these tools sort of naively in a growing Monorepo environment they do a lot of repeated work And that slows things down So how do we speed things up? really There are two ways to speed up work. There's one is do less of it and the other is do more of it concurrently To do less work In this context of developer workflows You really need two feet two important features. You need fine-grained invalidation namely the ability to analyze at a pretty fine grain what the effects of changes are And caching so that if work has been done before you don't have to do it again Done by you or potentially done by someone else on your team if you have shared remote caching When it comes to doing more work at once First of all, you need to be able to reason about concurrency You need some system that can say these pieces of work are allowed to run at the same time They can run concurrently because they don't one does not depend on the output of the other And you want to at least have support for remote execution so that Instead of concurrency being limited to the number of cores on your laptop or on your ci machine You could potentially have dozens or hundreds of cores working for you at the same time So what kind of tooling has these features? To work effectively in a mono repo unsurprisingly, you need a build system designed for that Now these build systems Or more generally developer workflow systems don't reinvent the wheel for the most part You want one that sits on top of existing standard tooling But it orchestrates them for you it figures out when to run which one and on which inputs and so these tools tend to be very different from things like make or talks or running the underlying tools directly like literally just running PyTest directly on the command line and there are good reasons for those differences and we will get into some of them So Fortunately such tools exist. Here are some examples of them I and there are several others now I am Freely declaring my bias here I have as I mentioned one of the core contributors to pants and have been for many years Through two major rewrites of it. So I'm naturally biased towards it But I will mention to back up that bias for this audience that pants was The most recent iteration of pants that we launched last year was specifically designed with python use cases in mind So it's not tacked on to a c++ System it is we designed for python But I each of these systems has their strengths and they tend to work in similar ways if you squint, which is what I will Go into for the remainder of the talk So there are many interesting aspects to these tools I'm going to look at three that kind of To me stand out and what makes them different from other types of tools You might be familiar with and the three are that they have a goal-based command interface That they rely on bill graph metadata And that they implement a workflow That has no side effects and relies on those side effects and that you can extend with custom logic And I will now go into what I mean by all of this so um Let's start with the what I referred to as a goal-based commands interface So with a monoripo build system You don't say, you know run pip on this or run pi test Instead you specify I want to achieve a goal and these goals are generic verbs like test or package or lint And the system translates that into execution of underlying tools like pi test setup tools pilin flake eight whatever My pi whatever test whatever tools are necessary here This is important for a couple of reasons one is To support in that it's necessary to support invalidation and caching Like you need a conceptual layer between what the user wants to achieve and the expensive part Which is actually running processes because maybe you don't need to run a process. Maybe You can resolve get a result from cache or maybe You don't you know, you only need to run it on some subset of files So you let the system figure that all out for you And so you can see some examples here of the types of command lines you can run You can say run on this file. You can run on this glob of files. You can run on just files that have changed in Git since This tag that kind of thing So that's what I mean by goals The next point I mentioned was The build graph the idea of this code dependencies So monorepo build systems need Extra metadata to figure out sort of the packages and the dependencies between them and like what the structure of your code is Some tools require this to be very explicit and handwritten and other tools and pants included can infer This metadata by looking at import statements and other aspects of your code And having this data allows the tools to do fine-grained invalidation. So for file changes We know Which transitive dependencies are affected? So now we know for example, which tests might need to be rerun and which tests can be skipped or resolved from cache And another example of how this data is used is that the system knows Which internal and external dependencies need to be packaged into your deployable binary because in a monorepo You may have multiple binaries that you're deploying And with the standard tooling, you know, you sort of have to pull in an entire requirements.txt for example And you know, you might need many requirements.txt if you had different requirements for different Servers and keeping them in sync is difficult. Whereas a monorepo tool can just Slice out just the dependencies you actually need So These are code dependencies. There's another type of dependency that these systems care about which is The dependencies between units of work And this is a static mapping that you can construct at startup time before any work is actually run And what it is is just a set of rules that knows how to transition between inputs and outputs And these rules form a graph That maps the initial inputs, which are things like files on disk and the Then sort of state Two final outputs, which is the goal that the user requested So you could imagine work just flowing through this graph from Output to input to output to input Until you achieve a final result And this is where the extensibility comes in You can in all of these systems because Everybody had you know, very many organizations have little custom scripts and build steps You can plug them right in there Into this rule graph And it runs exactly the same as any other part of any built-in rule And this is where we get to the workflow So those Based on the code dependencies plus the task dependencies You can create a with both of which are static You can construct a dynamic workflow at runtime And what actually runs depends on invalidation on what's available in the cache and so on And the important point here is that this workflow relies on no side effects causes no side effects other than outputting the final results And it has no global state And why is that important because that is what enables concurrency and remote execution Right, think about it. If you rely on local state or you rely on side effects, you cannot run You cannot take work and parcel it out to a remote System to a cluster With any kind of confidence So this explicitly modeled workflow Enables these four features, which if you remember from a few slides back was Were exactly the features which speed up your builds and make it scale as your monorepo grows So to sum up I claim that monorepos are an effective code-based architecture in many cases That they require appropriate tooling And fortunately this tooling exists and I have been fortunate to have had a hand in creating some of it So thank you all so much for listening. I'm very happy to take any questions And you can find us at this URL Pants is part of a very friendly open-source community and we're always happy to help out with any build questions you may have So thank you again Thank you Benji for the great talk. So there's there's quite a few questions not a lot of time So I'll just go quickly through them Have you tried to use having dependency versions for all projects in their own separate repos? Like the example of the main main project that's the parent project Which defines the actual versions of So Having dependency versions for all projects in their own separate repos I'm not sure I understand the question. Is this where there is a project that specifies all the dependencies um, I I'm I'm not super familiar with that to be honest. I don't want to give a glib answer here. I suspect that you still end up with the problem of So the problem is less where you maintain the version numbers and how changes flow through your dependencies And I'm not sure that this would solve that but again, I I'm not entirely sure what the uh, I'm not entirely sure. I understand the question Fair enough Next one. Do you do you just need to have the same release cadence for all products in the monorepo? Oh, great question. I know you you actually don't because well You always regardless of architecture need to make sure that if you're deploying servers and clients Like services that talk to each other that they are capable of talking to each other through the upgrade Uh, and that's a problem that uh, in many cases, uh, you know, that is a nuanced problem Uh, but no, you can actually release different parts different services. Uh, whatever cadence you like There's no requirements to have the same release cadence Good to know And how do you tools like pants compare to tools like poetry? Do they have different purposes? Uh, yes, so interesting question because we actually in the most recent version of uh, pants the one that we will be releasing In a few days, uh, now has poetry support. So I mentioned that these tools orchestrate underlying tools and now pants is able at this most recent version to consume, uh, poetry dependencies from your pyproject.toml And I think they do have somewhat different purposes. Again, pants is much more about orchestrating a wide variety of tools when you have multiple, uh, potentially when you have multiple binaries multiple, uh, You can where you may have multiple distributions in the packages that you're releasing from the same repo. Um, I'm not You know, I'm not a regular poetry user, but I'm more familiar with it as a tool that you use predominantly to manage Sort of a set of dependencies in a single world It is sort of poetry again is one of those tools that expects to own the world Uh, and again, we we now and we now support it Yeah, you have you have many tiny worlds inside the same repo Right So the example would be for, you know, if you have 10 different services that you're deploying from your monorepo Um, a tool like pants can say okay poetry determines the universe of dependencies I can Select from but pants will actually slice out just the ones that you genuinely need based on your actual dependencies So you can you know, if only one server needs this big heavy library only that server will Use that bit will will be deployed with that big heavy library Right Last question then, um, in a monorepo, how do you distinguish, uh, get changes from different parts of the repo? Um So again, I'm not entirely sure I understand the question. Um, you can So I can explain Yeah, please So just because I put the question in I'm assuming that that there's different services, uh inside the same repo Yeah So like so there will be like a change that's unrelated to the to the whole product by itself But it's just specific to a service for example I see so I would actually distinguish between looking at git and just looking at changes in general so, uh Pants for example has you have the ability to say I don't really know what changes have happened I the I don't know which parts of the code base I care about I care about the ones that have changed in git So just figure that out for me and you can you saw an example of a command line like that earlier But the way change management is done in general is through content hashes So essentially if a result has been cached You can say, you know run these tests or run these subset of tests And work has been cached based Entirely and purely on content hashes So if no changes have propagated if no changes where no changes have happened The fingerprints will remain the same and the work can be recovered from cache where Anything has changed the fingerprints will change and so essentially these tools do their own change detection Git is a layer on top At the sort of user interface level where you can say I happen to know as a user that the changes I care about are these changes in git But that is not what any of these tools use to detect changes For robustness for for If that makes sense Yeah, it makes sense makes sense right so change detection has gone through fingerprinting Sure, I'm happy to take more questions in chat or come find us online Yes, go to the breakout Group and if you want to ask Benji some more questions. Thanks again. Cool. Thanks


James welcomes to Braffa City. Three year deal just completed. Just talk us through how that happened and how it all came together. Yeah, we received a phone call from the manager pretty soon after the season finished. He told me he was interested in bringing me to the club so we began talking and from the minute I spoke to him I had a great feeling about the place and I'm just glad to get it done. Like we say in the pipeline for a while, how does it feel to have finally got it over the line presumably quite relieved to be a Braffa City player? Yeah, definitely. I mean it's been in my mind for a couple of weeks now. I've been away with the family on holiday so that's the only reason it's been delayed but I've been looking forward to this for a couple of weeks and I'm glad to get it finally signed. A three year deal like we say which at 30 years old which you are now comes at quite an important time in your career. How much of that was a factor were you looking to get here and sort of sort your future out as quickly as possible? You know where you are now. Yeah, definitely. I mean it's a big commitment from the club but also from myself. I feel like I'm doing a big project. Speaking to the manager and knowing his ambitions it was important for me to feel like it was a project going forward and with the three year deal I can feel like I can get my teeth stuck into it and help the club get back to where it deserves to be. You've got a lot of experience in the football league, you've got a lot of goals. What will you be looking specifically to add to the team? I think I'll bring a bit of experience now. I've been around, I've seen most things in football. I feel like I can help in the change room. Gaffer wants me to be a bit of a leader so I'm looking forward to taking that role and the main thing for me is scoring goals so that the team gets promoted. This is the first time you'll have played in the fourth tier. What kind of encouraged you to take the step down if you like and what made you think that Braffers City was the right place for you? For me I don't feel like I'm joining the league two team. I know that's a position we're in now in league two but for me speaking to the manager it's a project going forward and that's why the long term contract sees me wanting to build something with the club and invest a lot of time and effort into it and be a part of something special. You spoke about Gary a bit. How much should he sell the move to you and how much are you looking forward to working with him next season and beyond? Definitely. I've known him from afar for a long time and he's tried to sign me before and he was always someone I'd have enjoyed playing for so to get the opportunity now I'm really looking forward to it. The fans I'm sure you'll be aware of. You've played at Valley Parade on a few occasions before the vocal. They come out in the numbers and they're quite passionate. How much of a factor are they in the move and how much are you looking forward to getting out in front of them and showing them what you can do? It's massive. Every young lad wants to play in front of big crowds and every time I've been to Bradford it's been massive crowds, very hostile for the opposition so I'm looking forward to being a part of the home team this year and hopefully we can build on something special. And what else then finally what are the aims for you personally on the pitch and as part of the team what can be achieved next season do you think? There's only one thing really we've got to be aim for and that's promotion and if I can be a part of helping the team then that's all I'm really looking forward to doing.