So, we will discuss normal shock waves in this lecture. Normal shock waves are compression waves, this is very important, normal shock waves are compression waves that are usually seen in nozzles, turbomissionary blade passages, supersonic intakes. So, these are intakes that are provided in front of the engine of supersonic aircraft like SR 71, Concorde, F-15 and so on, they are also seen in shock tubes. In fact, the reason for discussing shock waves in this course is precisely because they are encountered in nozzles. Since our focus is on learning or understanding compressible flow through nozzles and since this appears in nozzles regularly, we need to learn about normal shock waves. But normal shock waves are seen in external flows also, flow over aircraft, flow over aircraft wings and so on. Good example of that is shown here. I must apologize that I am not able to ascertain the source of this picture but you can see here the picture of an F-14 which is a supersonic aircraft as it breaches the sound barrier. So, you can see this vapor halo which is actually condensation of water droplets but that shows what happens when the aircraft starts to move at supersonic speeds. So, you can see these types of shock waves only when the aircraft begins to move with supersonic speeds or in a frame of reference where the aircraft is stationary, the air moves with supersonic speed over the stationary aircraft either ways. So, this is a very nice illustration of a shock wave and this is in external flow. The same sort of thing is seen in internal flows also as I just mentioned nozzles, turbo missionary blade passages and so on and it is a compression wave that is important and we will discuss that in greater detail as we go along and the compression process across the shock wave is highly irreversible and so and as we as I mentioned in the previous lecture any irreversibility flow is tantamount or any loss of stagnation pressure is tantamount to irreversibility and irreversibility as you know results in loss of exergy. So, this is undesirable in most cases although in some cases actually we can exploit the efficiency of normal shock compression process. So, you can actually think of normal shock as a means of compressing a flow without any moving parts. So, we do not utilize a compressor, you can actually compress a flow by means of a normal shock. So, when you look at it that way for certain sorts of examples we can actually exploit this fact, it is very desirable, we will take a look at these things as we go along. Now if you really think about physical situations where one would encounter this for example in addition to this, for example normal shock wave is rather like a blast wave you know which goes across it is a single wave very powerful and moves at the wave itself moves with supersonic speed if you are an observer standing like this and looking at the wave. So, ahead of the wave is a quiescent air for instance and behind the wave is actually air that has been affected by the passage of the shock and in the case of the shock wave the air behind it moves with very high speeds as well unlike that of an acoustic wave and the wave itself moves with the supersonic speed. Now this is in contrast to an acoustic wave which is actually a wave train. So, it is a it is alternating compression and rarifaction as the wave goes through. So, that is the big difference between an acoustic wave and a normal shock wave. Normal shock wave is not a it is not a wave train it is a single wave front whereas an acoustic wave is usually composed of wave fronts with compression and rarifaction. Now, we use the term normal shock wave and the term normal is used to denote the fact that the shock wave is normal or perpendicular to the flow direction. Just like what we showed for the for the acoustic wave in our view of things for example, in a frame of reference where the nozzle I am sorry where the shock wave is stationary the direction of normal shock wave is perpendicular to the flow direction as you can see here oops as you can see here and there is no change in the flow direction as a result of passing through a normal shock wave. So, in this case the flow is perpendicular to the normal shock wave as it approaches the shock wave and it remains perpendicular to the normal shock wave after it passes through the shock wave. Now, this is in contrast to oblique shock waves which are more frequently seen in nature where the flow is deflected or turned as after it passes through the shock wave it may be perpendicular approaching the shock wave, but after it passes through the shock wave it actually is inclined to the shock wave. So, we will now take a look at take a look at thermodynamic and flow aspects of normal shock waves in calorically perfect gases only. And the theory is far too complicated in the case of steam or refrigerant, so we will not do that we will only look at the thermodynamic and flow aspects of normal shock waves in calorically perfect gases. So, in a frame of reference where the shock wave is stationary and the situation is as depicted here more or less similar to what we had earlier for an acoustic wave. The only difference being let me just show that the slightly different color, so in the case of an acoustic wave, so this is 1, this is 2, so the speed of the fluid as it approaches the wave is equal to the speed of sound and the speed of the fluid after it passes through if you recall we said this was V2 equal to V1 plus dV1, so it changes only by an infinitesimal amount whereas in this case as we have already said the speed is usually supersonic, so this is actually greater than the speed of sound corresponding to this state A1, so if you want to be very specific we can say this is equal to A1. And V2 is also not infinitesimally different from V1, it is actually considerably different from V1. So, we have mentioned this and changes in properties across an acoustic wave are infinitesimal and hence isentropic whereas they are large and irreversible across a normal shock wave, so which means that S2 is greater than S1 in this case and here S2 is equal to S1. So, once again we write the governing equations in the usual form continuity momentum and energy equation and by using the definition of the Mach number and calorically perfect assumption we can come up with expressions like this. In fact, if we combine all the three expressions we end up with something that looks like this. Notice that M1 is known because that is the speed of the fluid approaching the shock wave, so given P1, T1 and V1, so those are known. So, in this shock wave if you see T1, T1, V1, so this completely describes the state of the fluid before the shock wave. So, given these quantities how do we determine V2, P2 and T2, so that is the question that lies before us. So, that means M1 is known, so M1 is known and M2 is not, M2 is unknown. So, although this equation looks somewhat complicated it is actually, it actually is not, it is in fact quadratic equation and M2 square. So, in fact if you go ahead and solve this quadratic equation you can do so in closed form and obtain an expression for M2 in terms of other quantities. Notice that once M2 is known all the other properties may be evaluated say using this relationship and using this relationship. M1 is known if M2 is also known then I can get P2 and T2. V2 can also be obtained once M2 is when these quantities are known. So, if you solve this you get only one meaningful solution to this other solutions are M1 equal to M2 and so on which may be neglected. So, we get this expression for M2. Now, this actually admits two solution one for which M1 is greater than one the flow is supersonic approaching the wave and M2 being subsonic. So, after passing through the shock wave the flow becomes subsonic and S2 is greater than S1. So, this is a compression solution that is very, very important this is a compression solution. So, P2 is greater than P1 and in fact T2 is also greater than T1 in this case. The other solution that is admitted by mathematics is that M1 is subsonic and M2 is supersonic. So, the flow is accelerated to supersonic speeds after passing through the shock wave and S2 is less than S1. Since this is an adiabatic flow remember our energy equation looks like this. So, there is this corresponds to an adiabatic flow Q is equal to 0. So, that means that the entropy must remain the same or increase in an adiabatic flow. So, S2 less than S1 is not possible this is forbidden. So, this solution is not permitted or not seen in real life although mathematics allows it in real life this is not seen because it would violate second law of thermodynamics. Because one more solution that is possible is simply that of an acoustic wave M1 equal to 1 M2 equal to 1 and S2 equal to S1. So, this is isentropic process with the Mach number approaching the wave being equal to 1. So, this is the solution that we will focus on. Now, let us try to show this solution normal shock solution on a TS diagram. So, on a TS and a PV diagram. So, state 1 P1 T1 and V1 are given. So, you know that this is equal to 2 Cp and this is the stagnation state corresponding to state 1 0 1. So, T0 and P0 for this stagnation state are also indicated here and the same information is shown on a PV diagram here. So, this is this is S equal to constant line state 1 lies here. This is the isotherm corresponding to the stagnation temperature. So, the point of intersection of the 2 is the stagnation state and this is P01. So, the point of intersection of the S equal to constant line and the stagnation temperature line gives us the stagnation state. Same thing is shown here also. Now, remember this is a solution for which M1 is greater than 1. So, we need to show that explicitly here which we have done here. So, once I have T0, I can calculate T star in the same manner as I showed in the previous lecture. So, the acoustic state star state is shown here. So, this is the M equal to 1 line all states that lie below this or supersonic states and all states that lie above this line or subsonic states. So, clearly state 1 is a supersonic state. We have done the same thing. So, we have drawn the isotherm corresponding to T equal to T star here and the line of and the point of intersection of the T equal to T star isotherm and the S equal to S1 line uses the sonic state. Clearly, this is a supersonic state. So, now we wish to locate the downstream state on this diagram. Remember the important things for the downstream state or that M2 should be less than 1. So, that means it is a subsonic and S2 should be greater than S1, which means that state 2 since S2 is greater than S1, state 2 lies to the right of state 1 and since it is subsonic, it should lie above the M equal to 1 line. Now, bear in mind that T0 itself remains constant because the flow is adiabatic. So, as you can see from here, so which means that T star will remain the same. So, this is always the M equal to 1 line because T0 does not change. So, that means state 2 should or probably will lie somewhere like this. So, that S2 is greater than S1 and M2 is less than 1 and in this case, this is S equal to S1. Let me show it here like this. So, this is S equal to S1 and we now draw a new line S equal to S2. So, this is S equal to S2 and again the state is subsonic which means that it will lie above this. So, state 2 will most likely be somewhere there. Let us see. So, state 2 is shown here. This is P2, T2 and remember T0 is the same. So, you can see that T0 is the same. So, the line of intersection point of intersection of S equal to S2 equal to constant line and the stagnation temperature gives us the stagnation state. Same is true here. This is S equal to S2 and this is S equal to S1. So, the point of intersection of S equal to S2 and the isotherm T equal to T0 gives us the stagnation state and this is P02. So, you can clearly see from the PV diagram that P02 is less than P01 which means that there is a loss of stagnation pressure as a result of the irreversibility S2 greater than S1. So, we have now we are now encountering a loss of stagnation pressure which is a concomitant of the normal shock compression process. What is that? We have connected state 1 and 2 with this line but there is really no line. So, it is a dashed line and you must be clear that it is a wave solution which means we have state 1, we have state 2. The process there is no process connecting state 1 and state 2. It is an irreversible process and we do not know how the two are connected. So, we are treating it as a wave like solution which means it is discontinuous. So, the flow jumps from. So, if you actually look at the illustration here, the flow jumps from state 1 to state 2. In fact, if you actually again think about the acoustic wave and the normal shock wave. In the case of an acoustic wave, we get a series of a train of compression and rarifaction fronts and so when I hold up let us say let us say a pitot tube like this where I want to measure the static pressure and the sound wave actually passes over the pitot tube. The process undergone by the fluid as we measure its pressure is isentropic which means the pressure disturbance increases or decreases the pressure only slightly. So, if I try to sketch that on a PV diagram like this, so let us say this is our S equal to S1 line. So, what would happen is that you would see something like this.  I have exaggerated that greatly here. So, you are going to see a fluctuation of the pressure about a mean value both on the positive side and negative side as the train of compression and rarifaction front passes through the pressure just goes up and down like this as I have shown here. Now, in the case of a normal shock, it is a single wave which passes through. So, the fluid would be at some state and then as the flow as the wave passes over this, it would jump to a higher pressure just in one go and then the pressure will remain the same for some time and then it will slowly relax back to the ambient condition. So, it would not look like this. It will probably jump to a higher pressure like this from here to here and then it will slowly relax over some time and then come back to the atmospheric value or what are ambient pressure value. So, that is the difference between an acoustic wave solution and a normal shock solution. So, this is in a slightly different frame of reference. So, in case you find it confusing, we can always do this in a stationary frame of reference where the wave is moving. Remember, this is in a moving frame of reference. So, let us do it like this. So, let us say that this is P ambient, this is the initial state beneath my probe. So, this is P ambient and it is at let us say T ambient. So, this is the initial S equal to S1 line and let us say that this is T equal to T ambient. So, now when an acoustic wave passes through my probe, we are in a stationary frame of reference. So, the acoustic wave comes through here alternating compression on dry refaction waves. So, what happens is and the process is isentropic. So, I move along this isentrope, I am sorry. So, I move along this isentrope like this, up and down like this. So, the pressure increase or decrease is infinitesimally small. Now, in the case of a normal shock wave, what would happen is we start from here and we jump to a the pitot probe shows an instantaneous increase in pressure and temperature like this. And then it slowly relaxes back to the ambient temperature. So, it slowly relaxes back to the ambient temperature. And then it slowly comes back to the original state that it was in. So, it will jumps like this and then it comes back like this. I suggest that you consult the textbook. I have given this in great detail in the textbook. So, please look at it if you are interested. So, that is the difference between an acoustic wave and a normal shock wave. So, what I have done here is what I have done next is, so we have this solution M2 and I have plotted all these quantities P2 over P1, T2 over P1, P02 over P01 as a function of the initial Mach number. So, let us take a look. So, this is done both for diatomic and monatomic gases. Although we will probably not discuss that aspect too much in this course, we will only take a look at the qualitative trends. So, as you can see, as the initial Mach number increases, the Mach number after the flow, after passing through the after passage through the shock wave keeps getting smaller and smaller and it sort of reach, it seems to reach an asymptotic value. It is not going down to like 0 or anything like that. It seems to be reaching an asymptotic value which we will show in a minute.


Police evacuated the shopping mall and surrounding areas in the eastern German city of Dresden on Saturday due to a suspected hostage-taking, according to a police statement. The Dresden Police Department is currently carrying out an operation in downtown Dresden. The background is a suspicion of a hostage situation, the police said in a statement on its website. By 12.30 local time, the police confirmed that the hostage situation was over. Two people are externally unharmed and in our care, the police wrote on Twitter. One daily build reported that an unarmed man had killed a woman since stormed a local radio station and fired shots before fleeing into the shopping mall where he took several hostages. Nobody picked up the phone at the Radio Dresden broadcaster or at the Altmark Gallery shopping mall when called by Reuters. Radio Dresden said on its website earlier that an unarmed man had entered the Amonhof office building where the radio station is located at around 8.30 local time and that shots had been fired. The police did not confirm the details reported by Radio Dresden and build, but urged citizens to avoid the city center. It added that the famous Streasel Mark Christmas Market would remain closed for the time being.


If you want to bulk edit your video descriptions in YouTube, you can do it with TubeBuddy and their bulk edit and find and replace tools. So if I come into my YouTube studio, click on this little area just up at the top here with the TubeBuddy bulk and miscellaneous tools and you got find and replace. So you simply enter the text that you want to find and the text that you want to replace it with. These boxes are quite small, but actually they extend down and you can fill the whole of the text box. So I replaced the whole of my standard footer for my video descriptions and replaced it with some new text. And that included all of my Amazon affiliate links for the gear that I use. And by doing that, I saw a 10 times uptick over the past two weeks in the number of click-throughs on my affiliate links. And it all was done with TubeBuddy in a matter of moments. So thank you very much TubeBuddy. If you want to try out TubeBuddy for yourself, go to takeonetech.io slash TubeBuddy.


So here I have with me today Dr. Martin Keller who is the Director of the National Renewable Energy Laboratory in the United States and Martin is here in Australia on a visit to the Energy Change Institute and he's kindly agreed to talk to us today about a number of the key issues. So Martin let me just start off by talking about your role as the Director. You obviously see many different new technologies in your laboratories and maybe you could tell us a little bit about some of the key technologies that we need to keep an eye on looking into the future. So Ken, first of all let me say thanks for hosting me here. I had a wonderful visit here to this campus, a tremendous amount of tours and great discussion with a lot of very brilliant scientists so I'm really enjoying myself here a lot. So as you mentioned I think there's a lot of really nice technologies on the horizon. When I look into this for example in the solar areas what is the next generation of different solar materials so we're having a very large program in in pair of skites and I know that your university also working a lot on this new molecules which could completely change the way we're doing solar panels in the future by combining this with new manufacturing technologies such as roll to roll or even spray on. It's very early in the research so we still don't know exactly how this will go but this type of technologies can have the way to revolutionize the way we're looking at solar panels in the future. In wind as another example there's a lot of very exciting developments happening where we're looking at this how can we even build higher wind towers which will require a brand new way of making them and so what we're working on is can you make them on sites so instead of putting them on railroad cars or big trucks to transport them from their manufacturing place to your site could you do it on site and this would enable us to go to higher hub heights which then at least in the US would open up wind to all 50 states so overall I think there's a lot of big innovations coming forward and I think we need to continue to drive them forward. And so with all these new renewable technologies as we sort of drive the decarbonization process forward what do you see as being the key issues as we approach a very large percentage of renewables in the electricity sector? So when you go to a deeper penetration of renewables sooner or later we will hit this that we need storage I mean there is there the interesting thing is right now within the community there is this discussion at what level do you need storage when you go to deeper penetration of renewables and right now I'm seeing this that it's getting extended out where a couple of years ago people said oh we might need it when you go to 30-40% and now is it 50-60% is it even higher it's not completely clear because we are learning also to work with different ways to control and the load and upgrade and manage this so but sooner or later I feel when you go to really deep penetration that storage will be one of the big things we have to get a handle on and also new control systems to work with the grid the grid will become bi-directional where we send the electrons back and forth and this is a big change from where we are right now. Right and so you know we can see a decarbonization pathway to 50-60 maybe 80% but what about the last 20% is that going to be really hard will we need to still rely on large thermal generators whether they're nuclear coal gas and if we do will we then need some way of offsetting that through growing biomass or through carbon capture and storage or other other techniques? I think it's the verdict is still out there so I think a lot of people right now would argue that the last 20% will be very hard but my argument over says well it's it's when you look at this how much we have right now we have even a long way to go to go to 80% so I think the point is let's approach this level and then we will see beyond that but right now the opinion is that the last 20% might get hard and very expensive suddenly having also the issue about seasonal variations and storage which is another problem but they said what if we go a very different direction that we see that we having our over production that we are not saying well we only have exactly the electricity we need we might have much more electricity available which we then use electricity and funnel it into other products so that's why I say we don't know at this point because if if we're seeing the trend continuing which I think we do in making solar and even more cheaper you might reach this level that we on purpose have an over production and then taking the electrons and funnel them into different products such as hydrocarbons or hydrogen as an example. Right and so let's say we achieve the 100% decarbonisation of the electricity sector then how can this also feed into the other sectors we need to decarbonise like transport and industrial processes these sorts of things is this what you mean by looking at other products? Yeah because I mean when you look at the way and in the energy sector where we're emitting CO2 the electricity generation sector is a very important one they said industry and transportation is equally as important and this is sometimes some of these areas like long haul transportation, airplane ships, heavy duty trucks it's very hard to imagine that we can electrify them this means there will be a need for something like long hydrocarbons in the long future and the question is how do you get to them in a sustainable way and in transportation in hydrocarbons will we gain them from biomass which is probably the closest to reality but even there we need to do some more research could it be that we do synthetic fuels from new molecules we regenerate out of electricity such as hydrogen and then combine this with CO2 and do fissure drops to go to hydrocarbons it's not clear how we will solve these issues but it's very clear we need to decarbonize not only electricity generation but also transportation and industry which is a lot of process here. Right and so a lot of people might argue that you know we have seen pretty much the development of much of the technology we need we've got solar panels we've got wind turbines we have these other storage mechanisms like batteries and pumped hydro so we're kind of at the point where we can see where these are leading so is it true to say then that kind of we're at the point where we don't need to do much more research and development or do you think that actually we're still always on the path of R&D and innovation in order to achieve these goals? So my argument is that we're just at the beginning so when you see we're reaching so-called great parity with some of these technologies but this is it would be a tremendous mistake in my opinion to stop the innovation right now we're just at the beginning we continue to have to drive this forward because you know when you look historically I was making the example on automotive when we had the first cars which were better than a horse we didn't stop innovating we continue to drive this and nowadays these days our cars are much more than just a transportation mechanism from A to B they are your entertainment system they're having all your heated seats and very soon we will all have autonomous driving I would say that in the energy and renewable side we are just at the model T we now now reaching this where we have great parity to a lot of degrees but I think we will continue to drive this to to change this the cost will come further down I could see in the future that the way we are buying electricity at our homes might be completely changed very similar perhaps what you're seeing on your cell phones when you originally bought minutes and now you have a service plan so we have to continue innovation it would be a tremendous mistake to stop at this level and indeed I think that means that there will always be a role for institutions like ours which basically fundamental research and development organizations which have a social license to achieve these goals so I think this this is a very exciting future and thank you very much today Martin Kelly for sharing it with us okay thank you very much thank you


Your scribes are going to receive a yellow sheet here and This is going to be our task. We are going to answer a few questions based on this text We've just read and as a team we're going to work together to to make some claims about Thomas Paine and this and this text and Back it up. Of course with evidence we find In the excerpt that you read who's our scribe? All right lucky winner Ashley and everybody's got one so I'm going to give everybody else their own copy, but as we look there are three questions that that we're going to ask your Team to answer the first is together decide based on what you've read Do we think Paine is most likely a patriot or a loyalist all right? And then we're going to need to back that up prove why you think that With evidence from this text and then finally Question three as a team decide. What do you think his purpose? What was the purpose of this text of writing this pamphlet common sense? All right, so we're going to take about 10 minutes right now as a team to come up with some some really well thought-out answers Okay, let's go ahead and get started We believe this Thomas Paine the author of common sense is most likely a patriot or loyalist I think he was a loyalist It says I have heard it assumed by some that as America have grown under her connection With great Britain that the same connection is necessary towards her future happenings So it could mean a patriot to Then he says they're arguing arguing and then he say says we may as well assume that Because a child has thrived upon milk that is never to have meat I answer that America would have grown as much and probably much more that no European power had anything to do with her So yeah, I would think


All right, Ola, Bondia, but it's not morning, so it's Bono Tarda? That's about all the cattle, and I know, so sorry. So hopefully you're here to learn about features for Drupal 8, and I hope we don't all fall asleep after lunch, so I hope to keep you entertained in the next hour or so. I'm Mike Potter, and I'm the Prime Maintainer of the Features module, and the Features Override module. I'm also the Architect for the Open atrium distribution, if anybody has used that. I'm just curious, so raise your hand if you were at Matt Cheney's session this morning on CMI deployment. Okay, so we're gonna overlap a little bit with that, and then go into some new stuff. Is anyone here who's already heard me talk about this at maybe DrupalCon LA, or we got a brand new audience? All right. And how many people here want to be brave and raise their hand to admit that they don't even know what Features is, or they don't use Features, and they're just brand new here to learn something new? Okay, good. So we're gonna have a little bit of intro, and then we'll get into, so then presumably the rest of you use Features and probably wanna throw tomatoes or something, right? So in Drupal 8, about a year ago, a famous core developer said that they asked who has wasted more than 100 hours with the Features module, and that in Drupal 8 that was gone, problem solved. So therefore this can be a really short talk, because if we don't need Features in D8, why are we here? All right, so why are we still talking about Features, especially if you're at the earlier talk, like we have CMI, woo, Drupal 8 is great, who needs Features? So to review a little bit about what we're talking about here, and the problem we're trying to solve, and this overlaps a little bit with Matt's session this morning, when you build a Drupal site you have this database, and in the database you put a lot of stuff. You put all of your content pages, all of your articles, your blogs, your comments, your users, your user profiles, and we call all of this collectively the content of the site. It's what your end users are creating, it's what your content creators are creating, the content of the site, but in that same database we have things like custom content types, and fields, and views, and just random check boxes that you select in your configuration, we call that all configuration, and having that stored in the same database can be a problem when you're trying to deploy things to different sites, or just when you're trying to control that config. What Features does is it takes that config part of the database, and it writes it to code, and so now you can manage it as code. So why is that a good thing? So it's a good thing because if you can get your configuration into code, you can version control it. You know, let's say someone goes in your site and changes the name of a view, how do you know? You know, if you can get it into code and put it in version control, you can see when it was changed, who changed it, you can revert your changes, all that good stuff. So it allows you to then deploy your configuration, like your new views and your new content types, from your development environment to your testing, staging system, and then on to production, because it's in code, so it's treated just like the rest of the code of your site. It allows you to create reusable modules, so you can put all that code into a custom module, put that a module on another site, turn it on, and have that same functionality. So Features was never intended to be a configuration management system. It was never intended to be CMI in Drupal 6, where it was first invented. The reason Features was invented was to bundle functionality into reusable modules. It was actually invented by Development Seed in Drupal 6 as part of the OpenHRM1 distribution, and the idea was they wanted to put package functionality, like a blog in a photo gallery. They wanted to put that together. So what it was meant to do to use photo galleries, an example, is for a photo gallery, you've got a custom content type. So you take that content type, you have some fields on it, like to store your image asset, then you've got the instance of the field, you've got a view to display those fields in a nice kind of gallery grid. Maybe you have an image style to size those images appropriately. Maybe you have some other miscellaneous config variables. All that stuff gets packaged together and written to a module called my photo gallery module. And now once you have that module, you can move it from site to site. And Freelancers, developers, use this all the time to gain efficiency. If you build some functionality for a client, you don't want to redo that over and over and over again. You want to make it reusable and then deploy it on your other client sites. That's why Features was invented. But because it could write config to code and nothing else in 777 could, it got abused. So why was Features bad? And why do we sometimes, including myself, curse Features? So one of the problems with Features is there's no consistency. How do you put this stuff in code? It's not code, it's data. It's like a view, a view in code, like a view is an object. Some things are objects, some things are arrays. I was just in the issue queue dealing with this issue of arrays versus objects. How do you write that to code? There's no consistent way to do that. Code is just not good for data. Like I say, we're trying to write objects with properties or arrays with keys or string values or things like that. And trying to write it out as PHP code is just not very good. PHP is not a very good data language. And then you have things like now you've exported it to code. Someone goes and changes your view name in the system and now it's marked as overridden. Or you install some new module and something's marked as overridden. Or it's Tuesday and something gets marked as overridden. And it's like, who overwrote it? What do you do? All that good stuff. But Features is all we had. And it's a very complex, hard problem to solve as anybody on the CMI team in Drupal 8 will attest to. But now in Drupal 8 we have CMI. CMI stands for the Configuration Management Initiative. The idea in D8 was to separate configuration from content, do it nice and clean. And we can thank a bunch of people. The original initiative head was Hey Rocker, Greg. He's now passed the torch to Alex Pot.  I mean the whole community contributed. And Angie and Dries were committing patches from people across the whole community to CMI. In my opinion I think it's one of the most successful initiatives in Drupal 8. It was started early. It had a very clear focus, very clear purpose on what it tried to do. They did it. It's done. It's in there. We can all use it and be happy. So let's talk about CMI a little bit. Why is CMI so awesome? And Matt talked a little bit about this this morning. So first of all in CMI configuration, instead of trying to write this into PHP code, we're going to write your data into these things called YAML files dot YML. And YAML is a standard format. It exists outside of Drupal. We didn't invent our own format for a change. We adopted something community wide. And it's a great format. It's meant to store data. We have in CMI a built-in import and export. And that was demoed this morning. You can go into the UI and core Drupal. You can import your configuration. You can export individual things like a single view, like you could in D7. But now you can do that for any entity or any system that has config. So we don't have to worry about implementing any of these hooks anymore. The hooks are all gone in D8 as far as configuration goes. There's no magic. If your config in your YAML file says that your site name is my Drupal site, nobody's going to change that. That is your site name. There's no magic way for some module to do an override hook or an alter hook and change it on the fly. And that was done on purpose. And it just works. If you've used Drupal 8, CMI is just there. It works and we can be happy. So again, if CMI is so awesome, why are we still talking about features? Why am I still up here? So features, exports config to code. CMI exports config to YAML data files. That allows version control for both. That allows us to deploy from development staging to production for both. And in features, you can reuse bundled functionality. And in D8 CMI, you can't. There's no mechanism for doing what features was designed for. So there's some issues with CMI, as great as it is. Everything's got issues. We can't have a perfect world with no bugs and no issues. So one of the things is, what if you do want to put... What if you want to make that photo gallery module that we talked about? And you can store YAML files as part of your module. There's a directory structure. You stick your YAML files in there. And now your module can have a view or anything else. So what they want you to do in D8 is to go find that content type for your photo gallery and copy and paste that YAML file into your module directory. Go find the fields. Go find your view. Go find that image style. And what else am I supposed to put in here? Like what else is Drupal's storing configuration in for my photo gallery? I don't really know because I'm not a developer. I'm just a site builder. And I just want to make a photo gallery module. So it's a little hard to do that. Even though CMI allows you to import and export individual things, it's hard to pull that out as a separate piece of functionality. The other fun thing is when you put a YAML file in a module in Drupal 8, it's in a directory called config slash install, that YAML file is read into Drupal when you install the module. So it provides the initial default configuration for that, whatever it is that's in your module. If you then go change that file in your module, nothing happens. That's only the initial value. If you want to change it, you need to do that through writing update hooks. So you can say, okay, I release a new version of my module. If you change that YAML file and you put it on a site that already has that module, it's going to ignore your change. You've got to go into an update hook and say, change this value. And so that's how you deal with site-specific changes. The other thing that's interesting is if you uninstall a module, it doesn't necessarily remove all the configuration associated with that module. So for example, if a module defines a view and you uninstall the module, the view is not necessarily gone. Depends on your dependency chains. In the newest versions of Drupal, you can actually end up with a system where you have some configuration dependencies that will prevent you from even uninstalling that module because maybe it's defining a field and you have data in that field and you don't want that field to go away. So this is good.  I don't want to remove a field because I might have data in that field. And features did the same thing in D7. And some people sometimes think this is a bug where you have a feature that has a field. You turn the feature on, the field pops up. You turn the feature off, the field is still there. And people expect it to clean up after itself. But you don't want to do that because people might have already put data into that field. So CMI did the same thing, and that's good. But the tricky part with CMI is if you try to enable a module and the configuration of that module already exists on your site, Drupal 8 will refuse to install that module.  So for example, if your module has a view and that view already exists on your site, you can't turn on that module. So that's a problem for developers trying to make one of these pieces of like photo gallery functionality, right? And my photo gallery has a view. Maybe there's a bug in that view and I need to release a new version of it. There's no way for you to install that new module because it already exists. So you get this wonderful little catch 22 where if it lets you disable the module with config, you then can't re-enable the module. So some fun issues. So we still need features to create bundles of functionality. And that's what we finally get to go back to our roots in D8 and do with features. So what is features going to do? And I'm going to demo features for you today. It lets you do the same things you could in D7. You can import and export configuration much like CMI. In fact, it uses CMI. You can detect changes. If somebody changes something like a view, you still can see those changes. But there are some new features as well. In D7, features was kind of this black box. You sometimes didn't know what to put in a feature. How do you know to make a photo gallery to add all those things to it? When you go into features in D7, you just kind of have this blank page. In D8, we have this concept called assignment plugins, which will automatically package your configuration into suggested features. So when you first go into features in D8, you don't have a blank page. You have a whole bunch of suggestions for saying, hey, do you want to export this, or export this, or export this? And it's a very pluggable, configurable system that we'll show you. In D8, we now have namespaces, which we call bundles, which I know is a little confusing because there's bundles and content type in entities as well. But basically, a bundle in D8, it's kind of like in D7, where you had categories on those tabs on the left where you could categorize your features into different categories. Same concept. Except here in D8, it's going to help you enforce namespacing. So you're not going to pick a name for your module that might conflict with somebody else. So if you're working on open atrium modules, you'll be in the OA name space, and every one of your features will have OA underscore as part of the name. We have support for the latest Drush, actually Drush 8 support as well, but we also support Drush 7. And features is very modular in D8. In fact, the UI is a separate module. So if you no longer want your end user clients messing with your features, you can turn off the UI, and so they can't do that. But even better, you don't even need features on production. Features is now a development module used to create bundles of functionality. You then deploy those pieces of functionality as normal modules, and you work with them on production as normal modules, and you don't need features anymore. So in some sense, features did go away in D8 just on production. Now I have to put a slide and a shout out here. This was a really fun collaboration. When I first started getting into doing features for D8 this past year, I surveyed the landscape, and I found this module called Config Packager that was written by Nejo. If any of you know Nejo, he's a really prolific contributor to Drupal, great guy. And Config Packager, that sounded like what we wanted to do with features. We want to take configuration and package it up into things like photo galleries. And so I looked at it, and I'm like, this looks like a lot of the base of what we want features to be. Contacted Nejo, I said, hey, do you want this to be features, or do you want to maintain your own module? And he's like, I'd love to have this be part of features. So Nejo is now a co-maintainer on features, and we built features D8 around his Config Packager module. And it was really an example of how Drupal Contrib is supposed to work, because he had ideas, I had ideas, I had experience from the D7 features. He has things he's wanted to put in features for years. We're able to kind of put that all together and end up with the result being better than the some of the two parts for how that goes. So if you see Nejo, shout out to him, thank him for his work on this. So let's jump into a demo here. So here I am on my local D8 site. So features is located with CMI.  And this is where CMI lives. It's just that we've added some feature or a tab to it. But this is where your full import and export for CMI is that Matt showed this morning. This is where your single import-export is, again part of core where you can go export a single view if you want and do that. But now you can go to the features tab and look at your features. And you'll see that by default it has auto-picked or auto-packaged several things together. You can click on this to expand it. And it will show you that in this article feature that it's suggesting, it has all these different things that are part of that. And it says that it is currently not exported. So if you want to export something, you can just essentially click on it and export it and be done. So that's what features looks like at a glance. Now in order to make a feature, let's make that photo gallery that we talked about, that we've talked about for a long time. So in order to make a feature, we first need to create the photo gallery. We need to do all those things that I mentioned earlier. So let's go back to our local site and let's go create some stuff. So we have a content type. We need to add an image field to it. And now we're going to go create our image style. If only it was this fast in real life, right? Now we're going to create our grid view. So the grid is a view of our image content type. And we're going to show all of them. We're going to add the image field to the view so that it shows the images. We're going to select our image style. We're going to give it a menu link called gallery. So now we need to make some content to display.  So we're going to upload a bunch of cat pictures into our gallery and click gallery and there's our photo gallery. All right. So we've created a photo gallery. All right. So now let's take all that work and we don't want to do that again, even though it was really fast. We don't want to do that again. Imagine you spent weeks on this photo gallery. It's like the world's best photo gallery. Now we want to featureize it and move it to a new site. So with features, how do we go create the feature? So we go back to where features lives, which as I said is in the development configuration management area. And now we will see that our gallery is listed as a new feature we can export. So right at the top there is my image. And if we click on that to go look at it, you can see it's got a name. And here's all the things that are added to the feature. We've got our content type. We've got our field and our field storage. We've got our view.  It does not have a dependency on its field formatters. So we add that manually. And we can come down here and just like in features one, we can click right, which is equivalent to generate and poof. We just made a module. Now if you want, you can also click download archive and it will download a tar ball of that. If you want to move it to your site manually that way, you can do that just like in D7. Okay, so now we've made a module. The features page does not allow you to enable the module. You'll notice it says uninstalled, but this is a normal everyday module. We go to our Drupal extend page, which is where the new module page lives in D8. And we go find our new module and we enable it. And now we have our image gallery enabled on our site. And now if we go back over to the features page, just go back in the browser to where we were and refresh the page, you'll see that where it says uninstalled, it now switches and now it says enabled. So it shows us that that module is now enabled on the site. So there was a trick there, right, because when we were doing the fun thing with the music, we created the content type and the view. But now we just enabled a module that had that same content type and view. So we just bypassed that Drupal 8 thing I told you about where it doesn't allow you to enable a module that has existing configuration. And that's one of the tricks of having features on your site will do for you. We extended the core config installer class and we said in this extension, oh, you're installing a feature, we will let you do that. And we will bypass this config exception. So that is one reason why you might still want features on production is if you have a situation where you're trying to install modules that have pre-existing config, if it's marked as a feature, it will allow you to install that. Okay, so we've now made the feature. We exported it to a tar ball to this module, so now let's go to another site. So actually, this is pretty trivial, but we're just going to copy this tar ball. So we go into our modules directory and we're going to copy that tar ball that I downloaded into this directory and we're going to unarchive it. And there's our module. Okay, so now we're going to go to our new D8 site. We go to the modules page, the extend page. And now there is no features module on this site. And so I'm going to type in features and see, look, no magic. There's no features module. But we're going to find our My Image module that we just installed. There it is. So we now enable it. Save. And now when we go to our main site, we'll see a gallery link. But of course, we have a gallery, but we don't have content. So yes, once again, we have to upload more cat video or more cat images. So we'll do this really quick. I'm just going to put two of them in here. Add our second one. And now when we go to our gallery page, we see our gallery. Okay, so we just created our gallery on a brand new site without creating the view or anything else. So features works. Everyone's like, wow, we've been doing this in D7 for a long time. And now you can do it in D8. So let's talk about some of the more nitty-gritty details. So what happens when somebody changes your site? So in this case, we're going to use the in-place editor. We're going to go edit this view. And our CEO hates that it says My Gallery. They really want it to say My Cat Gallery because that's what this really is. So they go and they change the view. And we save the change. And now we go over to our feature. We're just going to go back and look at our feature and we're going to refresh the page. And where it says enabled, it now says that it's now changed. And we can click the change button. And actually if we expand it, it will show us that what's actually changing is the view. And if we click on where it says change, that's a link. And that will take us to a diff page so that will show us that what has changed is the name. So in the active configuration in yellow, it says My Cat Gallery. In the code configuration, it has just gallery. So if we want to undo this, we want to import the code back to the site. We just check the box, click import. And now it's going to be back to just saying My Gallery. So if we actually go look at it and see it says My Gallery. Let's do that same change again. Let's change it back to My Cat Gallery. And let's say this is no. We really, really, really want it called My Cat Gallery. We want to put that back into the code. So we change the view. We save that. We go back over to features. And we refresh the page. And now from the front page, we can just click the box and say write. And it will now export that feature again. And now our change is in code. So in fact, if we go look at it in code, so it says My Cat Gallery is still on the site, if we switch over to our code editor, we're going to go into the YAML file for this view. So this is for the real techie geeks here. Here's the view in YAML. We go down and look for title. And we can see in code it says My Cat Gallery. So that's how you handle both import and export. So you can see the names have changed a little bit. This would be in D7 the equivalent of doing either a revert, which is now import, or an update, which is now export. So we've changed the terminology to be consistent with CMI, so we're used to using the same import-export. Because that was a problem in D7, right? Revert, update, like it was generate, like what do you call it? It was all very confusing. So we fixed all that. So let's look at something new. Let's look at this new bundle functionality. So as I mentioned, bundles are kind of a way to group together your different features. And so there's this little drop-down called bundles. We can go to a config bundle tab to create a new one. What a bundle is, is both a namespace, but also, and I'm going to try to... Is it control? Okay. Try to pause this a little bit here, because I like to talk about this page a little bit more. So a bundle is not just a namespace. It's also all of the settings for how you want your features to be auto-packaged. So when we saw, when we went into features the first time, it was, you know, it had things like article pre-selected as a feature. How did it do that? It did that through these things called assignment plugins. And there's lots of different assignment plugins that you can see listed here, and they run in a specific order. So for example, that first one called packages, it goes out and it looks for existing feature modules, and it brings those in as lines in our features listings. The existing one then takes those modules and figures out what config goes into it, and so on and so forth. The really important one is the one kind of midway down called base type. Base type controls how you want your features organized, and by default it's organized by content type. So article is a content type, so you get a suggested feature. Page is a content type, you get a suggested feature. But as you'll see, there's options in the config for that, where you can bundle your features however you want. Maybe you want a feature for every view on your site. So you go change it from content type to view, and now it's going to suggest features for every one of your views. So really powerful functionality for controlling how features are displayed. And all of these settings get saved as a bundle, and you can have more than one bundle on your site, and you can switch between them. So you can have the content type view of your site, or you can have the views view of your site, or the fields view of your site, and so on.  So for example, if you don't want features to ever show you these auto-detected dependencies, you just unclick the dependency plugin, and now it won't show you those anymore. If you don't want it to do namespaces, you can actually turn off the namespaces. Okay, let's proceed here. So what we're going to do now is we're going to go show you the configuration page for this base type, and you'll see all of the things that you can organize your features by. And there is content type selected. You can select more than one, you can select views if you want. Honestly, you can get really weird looking stuff by checking all sorts of different boxes there, so it's not something you're probably going to typically do most of the time. Your bundle has a name. In this case, let's say we're going to work on open atrium features. You give it a name, you give it a machine name. In this case, we want OA to be the prefix. Now, all of our feature modules are going to get namespaced with OA underscore. So we'll go ahead and we'll create this bundle. And now back on our main page, when we list our features, it's going to show us all the features within the atrium bundle, and then it's going to show us down below all the stuff that's not yet exported. So if we want to put article and page into our atrium bundle, we can just select them, click the right button, and now you can see we've created two new modules. We have OA underscore article and OA underscore page. We can go look at all bundles by selecting none here, and now we'll see those two plus our original My Image. Now let's say we want to put My Image into this bundle. We just click on My Image, we go down to the bundle field, we select open atrium, and then notice it tells you it's going to prefix this with OA underscore, and we can just write this out, and now we'll have a new copy of the module called OA underscore My Image. So if we go back now to our features page, you can see it says that this conflicts. So we're currently looking at the atrium bundle. If we expand this to look at all the features on our site, we can see that we actually have two copies of the My Image module. Now we have the My Image and we have the OA My Image. So that's why it conflicts. You've got two modules with the same config. So let's just remove the old one. Just remove My Image, refresh the page, and now our conflict is gone. Now it knows that stuff is in the OA bundle just because of the prefix on it as well. So let's talk about this for just a second. What it just did there is actually kind of interesting if you used D7. How many people have tried to make a copy of a feature module in D7? How many renames do you have to do to do that? You have to change the file names, but then you have to actually edit every file because there's all these hooks and these module names and you have to go edit all the module names. It's a huge pain. Here we just made a copy with a couple clicks. So features lets you make copies of modules with conflicting configuration. Again, not something CMI is normally going to let you do. Features lets you do it because it knows that that's just a temporary thing. You want to do it as a developer. You don't want it to get in your way. You're going to remove the duplicates, hopefully when you're done, but it's going to let you in the meantime have that conflict. So really easy to copy stuff now between namespaces and move things around. So what makes a module a feature? Like let's look at this My Image. Let's go look at the code. So in the My Image module, there's this YAML file and you can see it wrote features into that. If I just remove that Features key and then refresh the page, it's gone. It's still on the site. It's still a module on your site. It's no longer considered a feature. It's just a regular old module.  That's all you have to do. So you can take an existing module if you want and mark it as a feature. There's no magic there. It's just a key in your YAML file. Now it actually knows this is in the Atrium bundle because it sees the OA prefix. So if you wanted to actually be more correct instead of just saying true, you would actually specify what your bundle is. So you would say bundle OA and then that ensures that things don't get confused in the future. But that's all there is to it for the difference between a module and a feature now. It's that one key. No longer, like in D7 again, if you look at your .info file, there's a bunch of stuff in there. It has to tell you all the things that get exported. In D8, we don't have to do that anymore because all that stuff is in the CMI YAML file directory. Let's briefly look at Drush. We've tried to maintain some compatibility. All your favorite Drush commands still exist. Drush.fl shows you your feature list. It shows you that things are changed. So it doesn't say overridden anymore. It just says changed. It's a little bit less geeky. We can look at a specific feature there and we can see all the config that's in it. We can look at the difference. So FD is feature difference. And just like in D7, it shows us that our title is different. So if we want to import the code, we can say FIM for feature import. And that would overwrite the view change. Or if we want to export, we can do FEX. And that would export the change back to code. So just like the UI. So again, going back to our feature difference, I've maintained compatibility with the old command. So if your fingers are used to typing feature revert, FR is still there because of course we had to keep FU. So FU is still there and of course FU wall is still there. We also have FC still there. So FC is feature component. This shows you all the components that you can export. So here I've shown all the views I can export. And then feature add is DrushFA. So I can say feature add. Give it the name of a feature. Give it a component. So here I just added a new view to my feature. And if I list that feature, there's the who's online view that's been added. If I go look at the directory, there's the who's online YAML file that's part of my feature. And if I want to remove it from the feature, I just delete the YAML file. It's as simple as that. And if I now do a feature list, you can see that who's online view is gone from the feature. So there's not a lot of magic going on in D8. Configuration is in the YAML files being controlled by CMI and features is really just manipulating those YAML files for you. But you can also go delete them and create them yourself, edit them yourself if you want to do that. So that's the demo part. Let's talk a little bit about some future stuff. So overriding. So you can see, as I said, we've changed it from saying overrides to changed, which again is consistent with what CMI is doing. You still need to be able to save overrides. We're still going to have the problem in D8 that we have in D7 right now, of let's say we've got open atrium in D8 and you want to change something that open atrium does. It's in a feature. Now your feature is marked as changed. And when you upgrade open atrium, your change is going to get lost. You have to save that change somewhere. How do you save that? So that's the features override module in D7. So we don't have that yet in D8. There's a variety of ways to work around that. There's a module, which is one of Nejo's modules actually called config synchronizer. What that one does is it kind of monitors your config in the background. And whenever somebody changes it, it kind of marks that feature as unsafe to revert. And it will help stop you from overriding a client change basically. So with this module turned on, you could actually write an auto update that every time you install a new version of the module, it could automatically import it if it's safe. And it would know if things have changed or not. That's one way around it.  What your kind of recommended solution is is the same as it was in D7 without features override, which is to do all of your changes in update hooks. But update hooks that require is developer knowledge and so forth. So I think there's still a problem to be solved here. It's something I'm still very interested in because I'm working on things like Atrium where this is going to be an issue. What we're going to try to do and feel free to talk to me after or at the con if you have some ideas around this, what we're looking at is doing something of merging partial YAML files. Something, for example, where in the update process it could look in a certain update directory, find a partial YAML file with, for example, just the title of a view, merge that in with the active configuration to make that one change so that you can save these things where you're just changing one little thing as overrides. So that's something coming. Something that happened this summer, some brand new functionality got added to D8 called optional configuration. And this is fairly interesting. In normal Drupal, if you have a module that, say, adds a view, in order to enable that module, you have to first enable the views module because otherwise you have a dependency that's not met. What if you want to make that optional? Like maybe the view is just a little side feature of your module. You want it to be there if they're using views, but your module provides some other functionality and you don't want to be blocked by that dependency. So now in D8 you can mark something as optional config. You put the YAML file into the config slash optional directory. And so let's say you have a view. If views is not installed, which of course doesn't make a whole lot of sense in D8 because it's part of core, but let's just, for example, say that it's not, it will still let you enable your module. And then when views is enabled, it will magically go back and say, hey, this module over here has a view. I just enabled views. Let's enable this module. So it lets you kind of do stuff in any order now for dependencies. So there's some really cool stuff you can do with that. What we want to do is add that functionality to features where there's a user interface that allows you to mark configuration as optional. Excuse me. So right now everything goes in as a normal dependency. We'd like some way to be able to change that. So that's coming soon. I wanted to segue just for a couple of slides on D8 actually. And now that we've heard from Dries, as it's coming like in two weeks, I think this is very exciting. This was my really first dip into the D8 pool. I worked on this back in April, phase two, the company I worked for was actually very generous and they essentially donated a month of my time to work on features because I told our CEO Jeff, yeah, I'll take about a month. And so he said, okay, go do it for a month. What I found was D8 was actually really fun. It was really refreshing compared to D7. Now I've got a background in object-oriented programming, so I know what MVC frameworks and stuff are, but I'd never looked at any of the D8 core code before. I didn't get involved in core. It took about a week to really kind of get the lay of the land and figure out where configuration was stored and how things worked. Reading a lot of stuff online went to one of Larry Garfield's sessions on D8 development, which I highly recommend. So about a week of learning and then a total of three more weeks later, so four weeks total and features alpha one was done. And it was pretty much from scratch. So for a module like Features, which is really, if you've looked at it in D7, it's not an easy module. That was pretty good, I thought. So if you've been out there waiting, especially if you've got a module in D7, this is a really good time to start looking at porting that module to D8. And don't just look at it as a line by line port or a function by function port. Take a look at some of the new stuff in there. A lot of stuff is different, but it will make your code a lot easier to maintain. These are some stats for people that love little pie charts and graphs. So in the top one, in blue is the Drupal 8 version and red is the Drupal 7 version. So yes, you can see in red there's this huge spike on the right, which is essentially implementing CMI in D7, which is what Features had to do. And that's gone. There's no blue line for that because it's built into Drupal now. What we replaced all that work with in blue is some of the new stuff, like the new plugin stuff and the new assignments and the new bundles. So we basically ended up with the same number of lines when we were done, but all the stuff we got rid of, we replaced by new functionality. What was interesting is we were able to reuse almost verbatim the user interface. So you'll notice in D8, the user interface looks really familiar. It works just like in D7. It's because we were able to reuse all the JavaScript and all the form API stuff came over with very little change. So if you've got a module that's more UI-based and more of a form-space module, you're going to have a pretty easy time at it. And then, of course, we had the Config Packager providing a lot of the core code, and then I wrote a bunch of new code to make it all work together. So it was a very fun project. Highly recommend getting involved in D8. So we talked about, let's just summarize. So D8 or Features, we're violating a couple CMI rules in Features. If you have Features turned on, and I mentioned if you have a module marked as a Feature, it's going to let you enable that even if it has existing config. It allows you to have duplicate config across multiple modules so you can make copies, but that's only temporary. So those are the two things that are kind of CMI rules that Features needed to work around. And then, of course, you can import. Your module config is no longer just your initial config. You've got that import function now so you can overwrite with new changes. So we're now using Features. The way it was intended to bundle functionality into reusable modules, it's a development module. You don't need it on production. It has some new functionality that's kind of cool for suggesting features and auto-creating features and kind of like CMI, it just works. So if you want to get involved, we're currently in Alpha 3. I pushed this about a week ago for Beta 15 of D8. I expect a new, are they going to do a new Beta before I see one? Probably, who knows. If there's a new version, we'll keep this updated. There have been some changes going on in Core and 3s referred to them as kind of the single big issue that's left in terms of some of the, for the developer guys in the room, some of the safe markup stuff. I've had to kind of update features to keep up with that. So there will be updates. What we're waiting on, so I review the code, make suggestions. If you really want to help, help us with testing. There is an issue that I posted here which is kind of the meta issue for the automated testing of features. That's a Beta blocker. I'm not going to release a Beta version without automated testing. I'm not the greatest guy when it comes to automated tests, so I would love for some help on that. That will get us pushed to Beta status. Once we're in Beta status, then we'll be able to preserve any kind of compatibility as we move forward in the Drupal chain, which is also what RC is going to give us in D8, by the way. What, the reason why RC1 is so important is it's going to give us upgrade paths from RC1 to RC2 and RC3. If you've been playing in the Beta world of D8, every time a Beta comes out, you're kind of on your own for doing updates. So help if you can, and now we can finally stop hating features and start loving Drupal 8. If you want to learn more, Alex, who's the current lead of the CMI team, he's going to go into a deep dot of configuration management on Wednesday. There was a great talk on configuration deployment. That's already happened, but I didn't know that until I updated the slides this morning. But you'll be able to find that video online if you want to go see deployment. So that talks about really how you deploy. If you're really interested in how do you go from dev to stage to prod, now that we're not using features for that, we're using CMI for that, that's the talk you want. And go to D8 sessions. Learn about D8, start using D8. It's time for D8. So with that, open it up for questions. And for questions, there's a mic back there, or I can repeat things. Thanks for your introduction into features, because to be honest, I was always asking myself, why do we still need features for Drupal 8? Now I know more, and I see why it might be better than just having CMI purely. My question is, first of all, I want to invite you to join my session on Thursday, where I talk about the experiences we made while developing distributions. And I will tell you why we think feature... I only talk about Drupal 7, and I will tell you mainly that building a distribution that should be a base for somebody else to start his project on, you should not use features because then the other person has a really hard time overriding. I know there's stuff like F-Tools Unlink and there's features overrides, but they, in very complex projects, they don't work out so nice. So I suggest some solution that we have on Thursday, and I was hoping that when I visit your session today, I could give an outlook on how it would be on Drupal 8, but now I don't feel it would solve that problem that when there is a feature, you cannot override much. Yeah, so yeah, just to respond, I mean, I do the open atrium distribution, which is one of the largest distributions of Drupal, and I think you can use features. Actually, we use them all the time because features override, as a module, does mostly work. It's got similar caveats to features in that it depends upon a lot of modules to support it properly, and there's some that don't, like Panelizer doesn't really support it very well. What you just have to be careful of in your distribution is your distribution can use features. Your distribution can't use features overriding. In atrium, that's particularly an issue because atrium is built on Panopoly, and Panopoly has features, and so in atrium, we want to override the Panopoly feature, but then people can't override our atrium features. So, you know, it can get complicated, but it can work. It does take effort to make it work. I think it's going to be a lot easier in D8. We're looking forward to porting atrium to D8 here in the coming months, and I think, you know, features was a blocker, actually, if you talk to the Panopoly people as well, they couldn't release Panopoly on D8 without the new features. Atrium is the same way. So distributions are still going to use features even in D8. I think having a cleaner way to do overrides is going to be super important, and I kind of alluded to how I think we're looking at doing that with doing layered merging of these YAML files and much more of kind of a get merge method. So I think the future is going to be a little better. But yeah, I'll come to the session Thursday and take a listen. Then I'm excited what you have to say about what we did in the design. Cool. See, there was a question over here that I can repeat. Oh, same question. Wow, a miracle. Yes. I missed the last part. Is features ready for translated configuration? That's a really good question, especially here in Barcelona. So the translation stuff in D8, if there's a session, I think right after this on the translation that I highly encourage you to go to, because that's another core initiative that I think has done a good job and done a lot. Because they worked with CMI on that and they did some things in CMI specifically to support translations, that should automatically work with features because features doesn't need to get into it at that low level anymore. It basically is calling CMI functions. So I think we're okay. I haven't personally tried it yet but personal translation, I'm kind of waiting to get feedback on it. But I'm hoping that's the case. Now they did do some little tricks that essentially are like overrides to do language specific versions of configuration. But they didn't do that in kind of a generic override mechanism that we can reuse for like normal overrides. So kind of pros and cons of that. But I think it should just work. And as far as it's ready, even though it's alpha, it's fully functional. It doesn't get in stuff like that. So it might be, if a new version of Drupal comes out, it might be a week or two before I kind of get in and patch it so there's some potential downtime there. But since it's just a development module, we shouldn't care as much, right? Other questions? Yup, back there. So the question to repeat it is why does CMI give you that exception when you try to install a module that has existing configuration? Like why did they build it that way? As to why they actually made it an exception error, which for non-developers is you kind of worry when you see a general exception error when you type a drush command, right? But you have to understand the CMI guys, I said in the beginning, they had a very specific set of goals and very specific set of rules. One of their rules was in D8 the site owns the configuration. In D7, we're used to the modules owning the configuration, especially when we work with features. So people are getting used to. The site owns the configuration. The configuration that exists in your active directory, in your site's config, wherever you tell it to store your staging, that is the configuration. If you go into one of those files and you change the site name, the site name is changed. And so they didn't want modules to own configuration because they were trying to get away from this problem of not knowing who's in charge. They didn't want to know who's in charge or configuration or any of that kind of stuff. They want you to just have it one place so they can do that import-export. That allowed them to keep CMI really clean, which is really important when you have it in core. You wouldn't want something like features in core because it's not the fundamental piece that's needed there. So back to your question, why they went as far as making it an exception instead of mainly you can read the issue queue about why they did it that way. I personally kind of disagreed with making it that level of an exception. It could have just been informational. But again, they're trying to make it easier for people that aren't developers and aren't doing features to manage their site. Any other questions? Great, well thanks very much for coming. Have a great time in Barcelona. I should remind you to please rate the session. If you go to the session page on the website, there will be an evaluation button. It's really important. It was actually your evaluations from the people that went to Drupalcon LA that got me here as an encore for Barcelona. So thank you very much. But yeah, please go rate. That's how we make Drupalcons better.


Hi, I'm Martin Etchos. I work on migration toolkit for virtualization. Before I will start the full talk, I want to introduce or give you an image of who this talk is for. Let's say that you are an sysadmin. You maintain some virtualization, vSphere, redhead virtualization, Overt, whatever enterprise level virtualization. And you want to move to the newest thing, OpenShift or Kubernetes. And first thing, you have all your infrastructure set it up in the virtual environments. So you need some way to migrate your VMs to the OpenShift. For that, you can use this tool. And you can use this CNV, container native virtualization, which is VMs inside containers. Because migration toolkit for virtualization is kind of mouthful, I will call it MTV throughout this talk. And if you want to check out the source code, the upstream name is Forklift. Previous engineers had really interesting naming systems. And what it does, either from VMware vSphere or redhead virtualization, migrates VMs to the OpenShift. Currently, we have a few engineers working also to include OpenStack, work in progress. Hopefully, it will be finished in a few months. You can install it with OpenShift operators. It comes all in one solution that you install it and sets up everything for you, configures all your CRDs, which are objects which you can configure and see what is displayed. Throughout the talk, we have named for the providers, which either provides the source or the destination where we want to migrate the VMs to or from. So when we install the operator, it sets up all the ports, services, all in one solution. When we want to use it, currently, we have our custom UI running in port. We have a few people working on integrating the custom plugin to the OpenShift. So when we want to start, we want to set where we want to migrate from. We can choose either from the three solutions, and it's only one direction. We cannot move VMs from CNV to OpenStack or VMware. So in this example, I'm adding ref. The quality isn't perfect. I'm adding a ref provider with the address admin user so we can log in and gather all the information from it. We get all the clusters. We list all the VMs, the necessary information about them, the storages. So we added a provider. Now we can create a migration plan itself. After we can choose from which source to which target, from ref provider to host. By default, when you install the MTV, the OpenShift cluster, which is installed on, it's added by default with name host. And you set the target namespace where you want your VMs to be migrated. We have also a validation. It validates when we gather the VMs, we check if they can be even migrated and in what way they will be affected. If the migration, for example, names are correct and we do all sorts of the checks. We need to, some way, to map the infrastructure itself. We need to map the storages, which storage goes to where and which networking goes to where. We need to say here, we have network mapping, so we want over management system to pod network. Those are both defaults. Or I have a storage domain in a data center named test, original name. And I have pre-created a storage class inside the OpenShift. So I choose it for here. We have multiple types of migration. It's either cold or warm. The cold migration itself, it shuts down the VM and copies the data. And that's the most primitive and, like, trustful. If you want to minimize downtime, you can use the warm migration, which creates a snapshot from the VM. It's still running, moves the snapshot data. And after some time, after it's migrated, it creates another snapshot and checks it's incrementally migrating the VM. And on the last time, last time when it does it, it shuts down the VM, moves the last data to the cluster, minimizing the downtime. In this example, I choose the cold migration. There are also possibilities to add ansible webhooks. We can add some tasks, which we want to do before the migration or after it, some cleanup, or changing the host names, whatever we want to do in the VMs. In the end of the creating of the plan, we have some review, what we are doing, that we have selected just one VM, but where from, so on. It created the migration plan. Now we can start it. And the migration itself creates an empty VM inside a CNV and starts moving the data from the provider to the CNV. For the vSphere, there are some problems that we need to use the word v2v to change the host. And in the end, we have running VM inside the OpenShift cluster, which was previously running on the Overt. Our current plans is to replace our custom UI with OpenShift plugin. And adding some 4.4 compabilities and adding the OpenSec, which I mentioned in the beginning. This is the example of the console, which our engineers are working on right now. And that's everything from me. Anybody got questions? Oh, OK, sorry. Can you hear me? Yeah. Yeah, so at the very beginning of today's DevConf, it was mentioned that the application should be aware that it is running on Kubernetes. So how does this toolkit solve that whatever we are hosting on our virtual machines is going to be aware it is running on Kubernetes? Yeah, when we install it with the operator, we check on what system it is installed. You can, of course, install it without the operator itself. You can install. Those are just pure ports running nothing special. The operator just makes everything easily. We have also written the operator for both of them. So it should be working. OK, so basically this toolkit is for moving Kubernetes from another solution to OpenShift, right? Yeah. Oh, OK, get it. Sorry, I misunderstood first. Anybody? Oh. OK, I have another question. What do you show the uncivil hooks? Is it possible to use some public repo and reference to some Git repository where you store uncivil playbooks and not just copy paste the uncivil playbooks or content here by hand? Very good question. Currently, no, but that's interesting suggestion, which I will suggest to our team to implement it. Currently, either you can paste it or pass the custom container image. It's not what I would do this, but I am not. I understand. Very skilled with container images, so. Yeah, go ahead. Will this work on just generic Kubernetes with Qvert installed or it's just the OpenShift variety plus CNV? It works also on the Kubernetes with Qvert installed. For example, our CI test, which I'm working on right now, it's not even Kubernetes itself. We are working on KIND, which is Kubernetes in Docker. Pure installed Qvert, and the migration works without problem. And one more question I do not understand. So this warm migration that you've covered, does it shut down the VM in the end or still? So yeah, it will shut it down and turn it on. Yeah, it shuts it down. The difference between cold and warm is in the cold migration, or in the warm migration, we are trying to minimize the downtime. Thank you. I wanted to ask if you tried to use OpenShift console or any UI in native Kubernetes? Yeah, well, we have working engineers on it right now to implement the plugin. You mean to make it working in native Kubernetes? Not in native Kubernetes, in the OpenShift itself. I think it is already implemented. I don't know. The UI goes completely out of my scope. No, I just wanted to say that I had issues trying to run OpenShift console just because it is the single UI, which you can use for Qubect right now. And it wasn't working for native Kubernetes. I would really like to have any UI which would work in native Kubernetes, not only with OpenShift. Thank you. This is just feedback. Anyone else? OK, thank you, everybody. OK, thank you very much.


Hello everyone. My name is Urvashi and I'm a third year undergrad at Delhi Technological University. So I'm currently pursuing computer science and today I'm going to talk about my internship experience at Outreachy with Wiki Education Dashboard. So basically the purpose of my talk would be three topics that is what is the Wiki Education Dashboard, what is React and what is Outreachy. So I do really wish to talk about React but I saw that there has been a lot of talks already talking about React and I don't think 20 minutes are enough to cover these three itself but I want to give a really small brief about React and how to get started with it. So initially let's start with what is Wiki Education. So according to the website it says Wiki Education connects higher education to Wikipedia ensuring that the world's most red source of information is more representative, accurate and complete. So it says Wikipedia is the world's most red source of information and I truly believe it's that so because ever since I've known how to use the internet or how to Google I've known Wikipedia but how does it connect higher education with Wikipedia and it does that through the Wiki Education Dashboard which is also known as the programs and events dashboard but what is this dashboard and what does it do. So this dashboard provides a tool that helps instructors and students to share the knowledge and track their contributions. So instructors can create and manage a Wikipedia assignment and students can stay informed and learn how to edit Wikipedia. So I'm sure everybody knows about Wikipedia in this room and has anybody already contributed to Wikipedia but we all all of us have read Wikipedia or have gone to it for some kind of information or maybe doing a homework or projects. So me being an instructor suppose I am at some university and I don't want my students to copy each other's assignments and submit homework on which they have not really worked on so and I want my students to work on something which is also useful for other people and being a student I want my homework to not end up in trash by the end of the semester. So I can create suppose I take a class in history and I can create an assignment or a course on the dashboard. So this is the dashboard and these are some existing campaigns. So suppose I want my students to learn more about national women's studies association or I want them to contribute to it. So I will create a campaign and I will add some courses to them for example radical women in Latin American art. So my students would edit Wikipedia articles or they can create Wikipedia articles or they can submit any media that is images or videos or anything that they can and what this dashboard does for me is I can track the contributions. So these are the articles that have been edited under this particular course and what I can track is the number of characters added that is the sum of characters added to articles by enrolled editors between the start and end dates and these are the number of views that these articles got and this is just a quick article viewer which tells me visually what that student has edited. So right now it's loading. So yeah all the text in this lavender color is what this student contributed to yeah. So apart from Wikipedia we also know Wikipedia is not just text it's also images. So my project was to work on this tab the uploads tab. Earlier it used to look quite different from what it is right now. So I initially began with creating a gallery view of it what you can see on Google search or Flickr and after that I decided to do a user research which all of the and talk with the users who use this dashboard and ask them what they would like these the dashboard to do and what they don't really like what the dashboard already does. So when I talked with one user he said that he hated this gallery view because it reminded him of Tumblr. So the question was what to do. Then I noticed that Flickr also has these three views which is the gallery view the list view and a card or tile view. So we so I talked with my mentor and we decided to keep all these three views. So the tile view was what it used to be earlier the list views what it used to be earlier but I also but we also added more information to the table and the tile view was a combination of the gallery view and the list view. So it also has the images we can also see the images that we want along with the text. So this dashboard currently runs in two configurations. This is the education dashboard which is mostly used by university professors and students and this is the programs and events dashboard. So suppose I really want to make an article about the Fossacea Summit this year. So I would create a program for Fossacea Summit 2019 and I can share the link with all of you to enroll into that program and add articles what happened in this summit or images that you have and I can see all the edits and all the images that have been contributed. So these are some stats. So ever since the dashboard came out in 2010 we've had about 2.8 thousand WCA education courses yeah and about 58 thousand students have worked on it and 75 thousand articles have been worked on approximately 53 million words have been added and 438 million views for all of the articles combined. Now the dashboard now coming to the development side of the dashboard the dashboard uses react on the front end and Ruby on Rails on the back end. So I worked on react mainly on the front end on the uploads tab. So what is react? React is a JavaScript library for building user interfaces. It is the V of an MVC framework the view from a model view controller framework. So the model is a data view is what you see on your screens and controller controls that data how it is presented on your screen. So when I learned react the document I am a learner who learns while coding. So I really enjoyed working on the dashboard and if I'm sure people would have heard about Code Academy. So I use that to learn a lot of things and it helps me to get a structure of how these frameworks work and documentation. So the documentation of react is excellent. So you can work or you can learn react with the documentation and by coding using Code Academy. Now how did I get this internship and how did I get a chance to work on the VK education dashboard? What is Outreachy? Outreachy provides internships to work in free and open source software for us. Outreachy internships are open to applicants around the world and you have to work remotely. You don't have to move to another place and all the interns are paid a stipend of five thousand five hundred US dollars for three months and also along with that stipend the interns also have a travel stipend up to five hundred US dollars. So that's the reason why I'm able to come here and speak because I got this travel stipend