This is Bill Grenke. He is a safety engineer with a state highway department. He has been reading about a highway safety improvement program management system. According to the National Cooperative Highway Research Program report he is studying, this system will identify real problems instead of perceptions. The solutions will be cost-effective. And in the event of legal action, the existence of the system will aid the defense. The system has six phases. Phase one, identify safety problems. Phase two, identify alternative improvements. Phase three, evaluate alternatives and select improvements. Phase four, develop and implement the Highway Safety Improvement Program. Phase five, evaluate each safety improvement. And phase six, evaluate overall safety program. In the previous program of this series, identifying highway safety problems and solutions, we followed Bill as he learned about the system's first two phases. In this program, Bill will work his way through the third phase, evaluating alternatives and selecting improvements. And the fourth phase, developing and implementing the program. For the third phase, he will find the best alternative improvement through an economic analysis. The best improvement is the one returning the greatest net benefit in terms of the cost of the improvement, as well as reduced costs to society by preventing accidents. His first step is to look at the alternative improvements for each high accident location. Then, he must estimate the reduction in number and severity of accidents for each alternative. His agency may have results of previous, similar improvements. If not, there are international research results. These forecast documents provide information like percent reduction expected and service life of an improvement. Now, starting with the first location. Bill has to calculate the expected accident reduction for each alternative. He should use this formula. The accident reduction, A sub R, is in terms of accidents per year. It is calculated by using the annual accident rate, or R, in accidents per million vehicles per year, approaching the spot or intersection, or little M, and the expected percent reduction in accidents for the type of proposed improvement, or P sub R. Next, Bill will calculate the safety benefits to society for each alternative. He will figure this value by multiplying the number of accidents prevented by the total cost of each accident to society. The cost of an accident will vary depending on the country and jurisdiction. In the United States, the Urban Institute estimated societal costs in 1988. The costs associated with motor vehicle accidents and injuries were $4,490 for property damage, $69,590 for non-fatal injury, and $2,722,550 for fatal injury. Now, based on the average distributions of types of accidents, Bill can determine the average cost per accident. In 1988, one state estimated that the average cost per accident was $51,770. By using a consumer price index, Bill can calculate current year costs. Here's the formula. C sub A is the current year cost per accident. C sub X is the cost of accidents in previous year X. R is the annual rate of growth in accident costs in percent. And N is the number of years of growth. In other words, the difference between current year and previous cost year. This procedure works for any country with accident cost figures. If data is not available, engineers can convert USA figures using a relative cost of living index. Then update the costs to current year figures using a local consumer price index. That should only be an interim measure until there is more precise local data. Now, Bill can estimate the first year benefit from each improvement. B is the first year safety benefit from the accidents prevented in monetary units. A sub P is the annual reduction in number of accidents. And C sub A is the current year cost of an accident in monetary units. There is still one last calculation. It adjusts first year safety benefits to allow for future increases in traffic growth. It also converts benefits to equivalent uniform annual benefits so they are comparable to improvement costs. EUAB is the equivalent uniform annual benefit in monetary units. B is the total first year safety benefit in monetary units. And EUS is the equivalent uniform series factor based on the traffic growth rate and the money interest rate for the number of years of service life of the safety improvement. As an example of the size of the EUS factor, if the traffic growth rate is 2% per year, the interest rate is 6% per year, and the service life of the improvement is 15 years, the EUS factor is 1.151. Next, Bill has to calculate the improvement costs. Initial capital investment or implementation costs are usually the largest. They may be design and construction costs for large improvements like a grade separation interchange structure or simply labor and equipment costs for maintenance forces doing removal of a roadside obstacle. Initial investment costs can be estimated from the cost of similar projects in past years. If the previous costs are more than one year old, they should be adjusted to the current year using a suitable price index. The formula for updating costs has C sub i as the cost of investment in current year monetary units. C sub i x as the cost of investment in previous year x. P sub i as the price index for the current year and P sub i x as the price index for previous year x. After determining the initial investment cost, Bill must convert that to an equivalent uniform annual cost. This formula places initial costs on the same annual cost basis as all other costs and benefits. In this equation, EUAC sub i is the initial investment cost expressed as an equivalent uniform annual cost. C sub i is the initial investment cost in current monetary units and CRF is the capital recovery factor for a given interest rate and service life. There is still the annual maintenance and operating cost of the improvement. Bill must figure that as well. Routine maintenance costs include items such as damage repair, sign cleaning and signal light replacements. Operating costs include items such as energy consumption for traffic signals or street lights. Bill can get cost estimates for these items from the maintenance or operations manager. He simply adds the annual cost of operation of the improvement to the annual cost of maintenance of the improvement. Finally, Bill must find out if the improvement may have some terminal or salvage value at the end of its service life. For example, rusted or damaged guardrail may have some value as scrap metal. If the salvage value is small compared to initial capital cost, say 1 to 2%, Bill should ignore it. If not, he should estimate the value of the salvage for the terminal year and convert it to an equivalent uniform annual cost using a sinking fund factor. Here is the formula. EUAC sub s is the salvage value in equivalent uniform annual cost. C sub s is the salvage value at the end of the service life. And SFF is the sinking fund factor for a given interest rate and service life. Now, Bill can figure the total equivalent uniform annual cost of each improvement. He does it by combining the initial cost, the operating and maintenance costs, and the salvage value. Some improvements will have an abbreviated service life. For example, the service life of an improvement may be 10 years. But if a major road reconstruction project is scheduled on the same road in 5 years, the improvement will really only have a service life of the 5 years. When he has computed the total cost of improvement for each alternative, Bill is ready to evaluate the alternatives. To do that, he must figure out the net annual benefit. The greater the net annual benefit, the more desirable the improvement. If the NAB is positive, then society will experience a monetary net benefit as a result of making the improvement. If the NAB is zero or negative, then the money would be better spent on a different type of improvement or on a different location. Another useful measure is the benefit cost ratio, B over C. When the B over C ratio is greater than one, the project is desirable. The larger the B over C ratio, the more desirable the project. Bill's last step in this phase is to rank the alternative improvements. There are convenient worksheets for recording the economic analysis for each alternative at each location. These worksheets should be included in a safety project planning report for each location. Normally, Bill would recommend the most cost-effective improvement. If funding is limited, however, he might hold off on something like a major grade separation interchange and pick a lower priced improvement. Now it is time for Bill to learn about phase four, developing and implementing a safety program. It will not be easy. The program must have quick, efficient, and orderly improvements, and they must be within the limits of available funds and other resource constraints. The first step is development. A safety improvement program is a bit unique. Projects are wide-ranging, from minor improvements, such as signs and pavement markings, to major at-grade intersection reconstruction or grade separation interchange construction. So dealing with them is a bit different. Some work may be done by in-house forces and some by private contractor. Engineers often like to concentrate on large, glamorous projects and ignore small but urgently needed ones. Creating a separate safety improvement program may ensure that small but urgent projects get appropriate attention. Some countries have dedicated funds for safety improvements. That means developing a separate program to utilize funds properly. In any case, development is basically applying available funds to proposed projects in priority order. If the cost for all improvements is high, it may require a multiple-year program. The next step is implementation. The agency will handle large safety projects the same as regular capital improvement projects. They will involve design and either in-house or contract construction forces. Traffic or maintenance forces may perform smaller projects with a minimum of design work. The key to success is to make sure procedures and responsibilities are well-defined and carried out. Managers must understand safety improvements are generally low-cost, quick projects with highly effective results. Also, a traffic engineer should be on-site for small jobs done by in-house forces without construction plans. There may be questions about such things as size, type and location of signs and signals or proper placement of pavement markings, guardrail and other safety devices. The engineer can make sure improvements conform to acceptable standards and address the safety need at the location. A last, very important step is documentation of the as-built improvement. There are two important dates to document as well. The date of the last day the unimproved condition existed and the date that traffic began operating under the improved condition. Safety analysts need this information to compare accident experience before and after the improvement and determine the extent of the improvement success. In this program, Bill Grenke has worked his way through the third and fourth phases of the Highway Safety Improvement Program process, evaluating alternatives and selecting improvements and developing and implementing the program. In the next program of this series, Evaluating Safety Program Results, we will cover the final two phases. For more information on this or other IRF videotapes, write to the International Road Federation or call the numbers on your screen.


So my beautiful people, today I am back with another Elden Ring video, and if you are a farmer of this game, there is an item that you need in your life, it is called the Silver Scarab and today we get into it all. How's it going guys, my name is DPJ and if you did enjoy the video, living alone truly helps out and if you like what you see want to see more, be sure to subscribe. Okay so the Silver Scarab Talisman raises the item discovery. Now if you are a farmer at this game, it's a certain thing you like to farm, if you like to go around collecting armours, farming enemies, force said armour, this is something you are definitely going to need in your life. Materials from enemies, you name it guys, this raises the item discovery by a stat value of 75, so you need this in your life people you really do. And to get it guys, well it's a weird one to be honest, you'll see what I mean in a minute. Now you need to come up to the hidden path to the Hallig Tree, to get access to these guys you need access to the Grand Lift of the Road first, you gain access to that by beating the Omen King right here within the capital, then gain access to the Forbidden Lands and then the Grand Lift of the Road, but you can't come up here just yet, you need to get the Hallig Tree Medallion, where you get one half from defeating the boss here at Castle Soul called the Commander Nile, then the other half comes from an NPC located here at the top of a hill in a basket, go and punch the basket, clear all his dialogue, he gives you the other half. Then guys you can come up to the Grand Lift of the Road, go here, press right on your d-pad or left, and it will give you access to this place right here. So when we're here guys, this is what you need to do. Now I don't know if you've come out of here, it's been so long I think you may come out or go into here actually, you know what, we're going to test it out just for research purposes because obviously if I tell you to actually come here it's your first time, you're probably going to end up on the other side, so this guy would make no sense to you. So yeah we'll go from this side, so yeah when you get the Halletry Medallion guys, come up this way to the Grand Lift of the Road. Now you want to stand on the plate obviously and you'll see it says Hoist Medallion, first to the left it says Hoist Secret Medallion, that's what you want to do. Now you can watch the cutscene if it's your first time but I'm going to skip it, I'm going to skip it people. Okay so you will then, after you get another cutscene, come here, very dark mysterious place and now guys you have to fight your way through this actual place, so let's go, let's go, let's go, I'm just going to run through everything, in fact I think we can just go straight from here guys to get this Silver Scarab, that's what we're going to do. So you come this way and then we want to take a left up here just like this, ignore the enemies, they do hit pretty hard though, so you hit this guys, step off, step off, there like that, then go forward people, turn right and it's in this chest right here and it really is that simple guys, that is how you get this Silver Scarab which raises that item discovery. Guys if you enjoyed the video leaving a like really helps out if you like what you see and want to see more out of the ring, be sure to subscribe and hopefully people I will see you on that next one.


I'm going to talk about some plans and goals of mine for 2021. So this is just, I guess, me being like a way to keep myself accountable, I guess. So this isn't, apart from like one thing on here, none of this is like an official announcement or anything. It's more just kind of like keeping you in the loop on kind of like where my head's at and like what I kind of want to be doing with this and also outside of this and where this falls into that outside of the, yep, cool. So one of my plans for this year is to kind of potentially consider looking into the possibility of maybe having something like a Patreon. I have never considered that before, mainly because I don't think anyone would be interested, but also because I frankly don't know what there would be for me to offer that people would be interested in. That is to say, I mean like beyond the content that I already post, because like with Patreon or something like Patreon, I would need to come up with something additional or extra or different from what I already do to be like here, patrons, you get to have this, you have you join my Patreon. And I like to be quite honest, like what I do on my channel already is kind of like that's all I've thought of. So I don't have any ideas really for what I might offer patrons as the as a benefit as an exclusive as a thing. So I guess I kind of want to like figure out if I feel like people would at all be interested in because there's no point in thinking about it at all. If no one would be interested, we're just fine.  Like what is it that you envision you'd be getting from me? And there was an idea thrown around with some of my fellow world hoppers, which like I kind of thought that might be a good idea because I don't really like talking about Sanderson on my channel because of the hatred, the vitriolic violent hatred that I got for expressing a dissenting opinion about Way of Kings, because I was basically saying like I this is basically the reason that like, I can't read, I can't give Stormlight Archive a second chance, because if I talk about everything I read and if I read it, I would have to talk about it.   I don't really want to have either conversation. But like, I also don't like that these cruel people have had such power over my reading choices and that they are dictating what I can and cannot read by virtue of being awful and me not wanting to deal with it. Because originally, before I got dumped on like that, I had not like absolutely 100% planned on, but I had it had been in the back of my mind that I would probably still give Words of Radiance a chance because you know, may as well, people seem to love it. I agree that Words of Radiance is better than Way of Kings. Maybe give it another go, I don't know. But again, like because of the reaction I got, I was like, well, that's off the table. But so anyway, all that to say how this relates to a Patreon is that some of my world hoppers suggested that it be a Patreon exclusive, that that would be where I talk about my Sanderson opinions and like the videos that currently get get so much hatred get moved to my Patreon and that future videos about Sanderson would be patrons only.  So like that was a thought for like what I could offer that would be outside of my normal content. But beyond that, I don't really, I don't know that I have any other ideas for what I could offer, which is another, I was like, I think I was like, oh, okay, yeah, I could start a Patreon. I could offer that. But then I got thinking and I was like, but what else can I offer? I can't, it can't just be a Patreon for dumping on Sanderson because I also don't want that. I don't want my Patreon to be just a place to be mean and rampty despite popular belief. I actually like to enjoy what I'm reading. I prefer it, which is why I get so angry when I don't like what I'm reading because I like to like what I'm reading and I get mad. I don't like it. Anywho, yeah, so this is, I guess, just me saying I'm thinking about it. So do let me know in the comments down below your thoughts about that, I guess, like if you think a Patreon is a terrible idea and I shouldn't start wanting to be a waste of my time because no one's interested. Let me know because then I could just like take it off my mind.  Don't bother. Or if there that is something you'd be interested in, what would you want out of me as a patron? What is it you'd be expecting from me?  Anyway, yeah, so that's one thing that I'm thinking about. Next up is rereading the first law. So the last book in the Age of Madness and also the last book that is currently like slated to be published at all in the world of the first law is coming out this year in September. So I want to reread all of the first law before that happens. So more or less, if I read a book a month, I can be right on target to read the new one when it comes out. I'll be slightly off because I would be needing to read The Trouble with Peace in September as well as the new book when it comes out. But because it comes out at the end of September, I might possibly squeeze that in and or just read it the beginning of October. It's, it's pretty, I mean, it's pretty close to being on target. So, um, yeah, that's the goal of mine. I don't think it needs too much explanation. I love the first law. So I just want to reread it. Do I need a reason? But it does kind of tie into my next goal, which is I want to do standalone reviews for a lot of favorite books of mine that I've never done standalone reviews for because either I read them before I started my booktube channel. Um, or I just for whatever reason just didn't do a review at the time when I read it because I feel I felt at the time that like, well, I talked about it in my wrap up and that's sufficient. But I've come to appreciate kind of the value of a standalone book review as a consumer myself. Wrap ups are fine and good, but they're more for just like, if you're interested in what this person has been reading as opposed to interested in this book and you've happened to found this person who read it too. Also, I also want to like balance. I have, I feel like I haven't actually checked the numbers on this, but I think I have more rant reviews than positive reviews on my channel or it's like 50 50. And I just kind of like want to tip the scale more in favor of positive reviews, because I'm kind of low key sick of people thinking that all I do is rant. That's not true. I just often have a lot more to say about something if I hate it. And I think a lot of people are that way.  When you're happy with something and you're positive about it, you're just like, well, it was great. I would change nothing. It's excellent. So for that reason, I've ended up with a lot more negative minutes of view time. But yeah, I want to equally represent things that I love because I'm tired of people being like, she thinks everything she reads. That is not true.  So I very often am not able to point to like, well, look at all these reviews I have of books that I love. So I wanted to fix that. Plus it gives me an excuse to reread those books because that's another thing that's part of this and that's part of rereading the first law. I never did standalone reviews for any of the first law books. I started doing standalone reviews with a little hatred and I did one for a little hatred and for the trouble with peace. But I never did standalone reviews for the blade itself before they were hanged. I mean, I don't have to list them all, but I didn't do any for any of the others. And my kind of first Abercrombie video was kind of my instead of because I kind of regretted not doing any standalone reviews, but then it seemed too late. So I just kind of did an overall, like this is my love of the series video. And like, it's one of my most watched videos. So like I'm fine with that, but I would really like to have standalone reviews for all of those books. Even very few people watch them. I just feel like that's missing from my channel for such an Abercrombie fan, like, where be the reviews, bro? So yeah, so I'm in addition to just generally wanting to reread all the first law books as I reread them. I intend to do a standalone review for each one as I go. Do it right this time. But there are not every book that I would like to reread and have a standalone review for. It's not realistic that I can get through them all this year, but there are many that I would like to do that for. So obviously, again, first law is top summary, since I'm planning to reread the series anyway. Now's a good time as any to like handle that part of the project. But there's other books to a lot of Neil Gaiman books. I always say Neil Gaiman is my favorite author, but there's very little evidence of that on my channel because a lot of Neil Gaiman I read before I started my channel and or like just happened to not do standalone reviews and he hasn't really had like a bunch of new releases for me to review since I started my channel. So like, I would love to actually do a standalone review for American Gods, for Ocean of the End of the Lane. Once again, I did a Neil Gaiman video akin to my Abercrombie video that's kind of like an instead of where it's an overview of like kind of why I like the author and why I like his books and some of my favorites, but I would still like to have standalone reviews. So again, American Gods, Ocean of the End of the Lane, I'd like to review some of his children's books. I'd like to review. I'd also had a video on Sandman because that was that was a recent read of mine. So I did do that. But basically review, I'd like to review Lives of Black Lamora, which I've read twice already. And I would like to read a third time. Because I love that book. So I have no problem rereading that, as well as the other gentlemen Basterds books, Red Season, Red Skies and Republic of Thieves. I don't think I ever did a standalone review for any of the Black Wing books. The Ravensmark trilogy, that is the first book is Black Wing, read that trilogy, love that trilogy, have mentioned that trilogy many times, but never did stand standalone reviews. That's what comes to mind right now, Red Rising. I've talked about Red Rising a lot, but I've never did standalone reviews for Red Rising. So yeah, there's quite a few that I would like to actually do standalone reviews for, which said like a bajillion times now, I think you get it. I would like to do more vlogs. I mean, I have been doing more vlogs already, but like that's one of my goals is kind of keep up with that. And I don't know if any of the videos that I've posted before this one has said this yet. So this might be your first time hearing it that I'm moving. I've said that before in things I've filmed, but I don't know if you've seen it yet. So I am moving quite soon. And so I'll have new digs and everything. So and I'm quite excited about being able to vlog there because I'm really excited about my new apartment as it will be and is not yet. So I'm excited to have the opportunity to do a more of a bigger variety of vlogs. And hopefully if the world allows for this, COVID will go away. And because like all my vlogs by necessity have been just like me on my couch, me in the kitchen. So I'll have a slightly bigger apartment. So you might the setting will be slightly less monotonous. It'll still be just an apartment. But like my apartment complex will have a lot of cool areas. So like once COVID is less COVID-y, hopefully I'll be able to film in other parts of my apartment complex, which are really nice. It's a really historic building. So there's like nice areas to film and also just like out and about because like before I ever started vlogging and before COVID, I was going to tons of author events and then vlogging and COVID happened around the same time. So like the history of me vlogging has been a pandemic vlogging. But I now that I have a while when I was going to those author events, I didn't have a vlogging camera and I was going to haul around my like heavy DSLR and my phone was shitty. So now I have an iPhone with a great camera, which I didn't have before, and I have a vlogging camera. All I need is with a pandemic to go away to be able to actually have events to go to again. Because again, I was I went to a lot of author events, so it'd be fun to be able to vlog stuff like that once it happens again. So that's kind of a goal of mine, just generally like world situation allowing to vlog more and more diversely, not just me on the couch drinking coffee and reading books because like as much as I'm sure you love seeing that, I'm sure I get sold. I would also like to prioritize writing. Like I I totally dropped the ball on writing in 2020 for many reasons. I mean, many, many reasons that don't need explaining 2020 was crazy. But I'm really, really excited about my new apartment for one of the reasons being that like not everyone is this way, but I personally, I need the space I'm in to be conducive to reading and writing. It's one of the reasons that I'm constantly like so focused on kind of creating an ambiance and an environment that is similar to and puts me in mind of what I'm reading, like having a candle scented like the world that I'm immersing myself in, having music that sounds like the world that I'm immersing myself in, eating foods that are similar to the kind of foods that people in this world that I'm immersing myself in would eat. Like I need that and my apartment has not been the best place for me to be writing for many reasons, many, many reasons. And also the fact that I felt quite stuck and I don't do well feeling stuck. I don't even necessarily need to leave. It's just knowing that I can and that just like it has been eating away at me this feeling that I cannot leave. And it's not just the pandemic. The pandemic is a big reason, but it's also that my neighborhood is really not the best neighborhood and that like the parking situation is insane.  So like I never feel like I can leave to go for a hike. I also hurt my ankle. Johnny Johnny, it's like really couldn't go hiking, couldn't leave my parking space, couldn't go out around my neighborhood because my neighborhood is scary. So like I just felt so trapped and that trapped feeling made a lot of things just like I was harder for me to read, it was harder for me to write, it was harder for me to do everything. And my new apartment is in a better neighborhood. The parking situation is not so crazy. My ankle is feeling better and hopefully the pandemic will be ending. So and there's a there's gym facilities in my new apartment. So I am hoping then mentally I'll be in a space where I can write again. And I want to because I didn't even bother prioritizing in 2020 because I knew I wasn't a head space to do it. I knew that even I said I had time for it I just wasn't I wasn't in a headspace where I could do it, which I already said, but it's just the only way I can explain it. So I am very hopeful that in 2021 I will once again be in a headspace where I can. Another goal of mine is to actually read my book The Month Club books as they come. So ideally, because each book or each month there is a book of the month and then you can also choose two add-ons if you would like, I would like to keep up with reading my book that is of the month as it comes. So they usually like it's like your your January book will kind of come mid January, even though you order at the beginning of January. So like not in the month that it comes because like I will have already set my TBR before then, but kind of in the following month. So like read my January book in February, read my February book in March, etc. And then hopefully also get through a lot of the add-ons that I have because I mean I keep my pile of book of the month club books is piling up and low keys resting me out when I'm just like I have any ideas, but I keep getting a new one every month because I can't resist. So I would like, I would help me feel not that it really matters because I'm constantly buy books that I don't read. It's just something about them being of the month that makes me feel like well, I should then read them of the month as they come. I would just make me feel better and more accomplished unless like it feels kind of like an inbox with unread emails. I don't know how else that's kind of the same feeling I have about all my book of the month club books. I want to read have read them. It's also because the book of the month site kind of tracks it, which like once I realized that added to my stress when it's when they keep wanting you to rate the books that you got of the month and they have their own reading challenge where like the challenge you win you win or you don't lose the challenge if you read 12 books because in theory, even if some of them were add ons and not of the month in theory, you read a month for the year. So I just I'm not a competitive person with other people, but I'm competitive with myself. So I'm like, yeah, I want to beat that challenge. And I can just got to do it. I realized way too late in the year in 2020, that that was a thing. And I was like, well, let's do it now. I can't beat that challenge. But now I want to challenge accepted. I also want to prioritize series. I frequently put off continuing series because the start of a new series that's super hyped is like on my TBR. And I will frequently prioritize the start of a newly hyped, newly released series over continuing an existing series, partly because like I'm a whore for clicks. And I'm like, well, people will care more about this than about me just plugging along in a series and I'm already reading that everyone else has already read. And partly because I get sucked into the hype. And I'm like, well, I want to know what everybody's reading, what everybody, this book that everybody talks about, like, how I want to know what it's about and how I feel about it. So I'm trying to prioritize just reading series and I'm already in the middle of that I am enjoying and not get sucked into the whirlwind of hype. Like, that doesn't mean I won't start any new series. I don't know. But yeah, to ignore some of the hype and just read what I am reading, finish what's on my plate before I go back to the buffet. Basically. I would also like to prioritize reading more nonfiction. There was a chunk of the year where I was kind of reading a little more nonfiction. And then I kind of went back to the dessert bar, which is grimdark fantasy for me. You have to get back to my greens and read some more nonfiction. I will feel better. I will be better. This will be better. I have a lot of nonfiction books that I've acquired that I would like to read. It's just that like, you know, especially in 2020, feeling trapped as I did. I wanted to go on mental adventures. And reading a nonfiction book is not a mental adventure. I mean, it can be, depending on what it is, depending on what kind of nonfiction it is. But I think you know what I need.  I would like to incorporate more greens in my reading diet and kind of going along with that. I'd like to watch less TV. Again, part of the TV watching was 2020 being horrible. And like, where even reading fantasy books is not enough of an escape, like mentally, I was too exhausted to do anything, but like, watch random YouTube videos for like 10 hours. Not great. So I'm hoping a lot of habits are formed based on kind of the space you're in. And so I moved into this apartment where I am currently right at the start of the pandemic. So like all of the habits that I formed in this apartment were like early pandemic habits. And that was just terrible. So like this place has always been a place that has felt like a holding pattern, a wait and see, like this is just for now feeling. Because it's all just been kind of like, like I never ever ever got to establish a routine here in this space where I would wake up early, fix some coffee and go to work and then come home and then read and whatever. Like this has always been a space. I was moving in in during the pandemic. So it was always like, I guess we're working from home. Don't know for how long. Maybe we'll go back. Looks like we're not again. Maybe we'll go back. No, we're not. So it's always just kind of been this like weird limbo. And it's always been like, we're like, do I make plans? Do I not? Like, I don't know if we are still doing this for a while or not. Like, I felt like this inability to create routines and establish patterns here because it's all just been kind of like, don't know what we're doing here yet. So now that like things are settled, I know what my routines will be. I know what my responsibilities and obligations will be in 2021 a lot better than I did in 2020. I can establish better routines and better patterns in my new digs because like I have the opportunity to create new associations with this new physical space. And I really want to seize on that. So like the way that I arranged my furniture and everything, I want it to be more conducive to more reading, more writing, better like open mental health feelings. Like I'm like looking at this as like I'm not pinning all my I don't want to expect a new apartment to just like fix everything. But it is an excellent opportunity just like how like new years is a good like mental breaking point to be like, well, this is a new year, a new start, like a fresh year, fresh chance to do things differently. A new apartment even more so is that way a chance to form new patterns and behaviors and habits. So I'm really hoping to form newer, better habits in my new space. And you'll see if I succeed or not because I'll be vlogging because that's one of my goals. So yeah, I think that does it. Those are my goals for the year more or less.  If you know, whatever you want to let me know. I post videos on Saturdays, other random times as well, but definitely Saturdays. So like and subscribe and I will see you when I see you. Bye.


Yusuf Amrani, you are the Foreign Affairs Counselor to His Majesty King Mohammed VI. And I noticed in the speech by the king that he made a big stress on Morocco as part of Africa. Why? Why the stress on Africa as opposed to the Arab world? Well, Africa today is a priority in our foreign policy. Two, Africa is a continent with a lot of perspective as far as growth and economic development. And number three, Morocco is working now in Africa in investing, in creating opportunities for young generation to create jobs. That's the most important. You can see the point, but it seems to me that until Morocco and Algeria somehow resolve their differences, there's always going to be something missing in terms of regional trade. Yeah. Well, unfortunately, at the level of the Maghreb, you are right. Because of the crisis, the Maghreb is not moving. We're not creating jobs. Because if we had this Maghreb Arab Union working, we should create jobs which promote growth. Unfortunately, today, we need political vision. We need leadership. And we need commitment to be able to move towards building up this regional integration. But at the level of the rest of Africa, our business people are very successful, creating job, promoting growth, and working to respond to the expectations of the wrong generation in Africa and a continent with a lot of perspective for the future. Insha'Allah, things will definitely improve. Thank you very much, Yusuf. Thank you. You're welcome.


In this short video, we will show you how to download boundary data from the UK Data Service. The Boundary Data Selector tool offers a range of digitised boundary data in several GIS formats, including boundaries designed for use with census data. To start, go to ukdataservice.ac.uk, select Learning Hub, Census, then Census Boundary Data. Scroll down to the section on Obtaining Boundary Data, where you'll find a link to the Boundary Data Selector. There are two tabs where you make selections, what and where, and format. First, let's select our boundary type and area on the what and where tab. Select the country that you require data for from the country drop-down. Next, select the type of data from the geography drop-down. I'm selecting census. Next, I select the date. I'm working with 2011 census data, so I select 2011 and click find. The box underneath is now populated with all of the data sets that are available for my selections. I can only download one of these data sets at a time. Click on the boundary type that you want to download, for example the English Census Merge Awards. Then click on the list areas button. I now have a list of areas to select from. Note that the areas shown will differ depending on the boundary data set that you select. So let's select our areas. I can select more than one area holding down the control key and clicking on each area that I require. For some data sets you can click expand selection to see smaller geographies for the area selected. I can select any of these smaller areas if I wish, but for this example I'll stick with the districts. The search summary at the bottom of the screen lists my selections. It also tells me the current data format, shapefile, and that the data will be delivered in a zip file. If you're happy with those options you can go ahead and click extract boundary data. To change this default method click on the format tab. For this data set there are four formats available. Shape, this is actually shapefile format and works with a range of GIS software. KML, which is commonly used on Google Earth. Map Info, for use with Map Info GIS software and CSV. I know shape works with my software so I'll leave that selected. Next you can select whether to zip up your data files or not. For shapefile I would recommend using zip to make it easier to store all your files together. So now we select extract boundary data. I receive a confirmation message on screen that my data is currently being prepared. If you need to go and do something else you can bookmark this page and return later. Your download request will be kept for seven days before being deleted. When the files are ready you will see files extracted on the page. Click on the file and save to suitable folder. Next you need to unzip the data. Go to the folder where you saved the file and right click on it. Select an unzip or extract option and extract your data. Now we can view our data files. For this download we have a shapefile which covers our requested districts. Keep all the other files with the same name as your shapefile as they are all required in order for your boundary data to function correctly in GIS software. We hope this video was useful. If you would like to find out more about Census Boundary Data and Geographies you can check out the information on the UK Data Service website.


This research explores the accuracy and applicability of the finite element method AFEM, in calculating the resonance frequency of multineck Helmholtz resonators with various configurations, including cylindrical or spherical bodies, flanged or unflanged necks, and single neck resonators. The FEM results are compared with a theoretical model and lumped element approximation, multineck, and reveal little deviation between the FEM and theoretical model but significant error in comparison with the lumped element approximation. The FEM can be used to expand our understanding of multineck Helmholtz resonators performance under various conditions and configurations, and its applicability extends to special cases where analytical formulas are not trivial. The method can be applied in various fields such as acoustic metamaterials, musical acoustics, and noise mitigation. This article was authored by Nikolaos M. Papadakis and Georgios E. Stavrilakis.


And before I start, I wanted to clarify something that just came to me. Rob picked this title for the talk, which I realize now might have missed a lot of few people. So this is not about dependency injection, but rather about, well, I mean, the title kind of suggests something like that. It makes a lot of sense to me that you said that. This is more about handling dependencies to external libraries that Kruple is now increasingly using and that you might be using for modules or some project that you're working on. More specifically, this is really just managing these dependencies with Composer. So there are probably other ways of doing that, but I'm specifically going to talk about a tool called Composer, how that tool works, which is a tool for all kinds of PHP projects not specific to Drupal. And then later on, I do want to take the conversation part quite literally and talk about how to use Composer better in Drupal, what kinds of things one could do with Composer in Drupal in the future that isn't quite possible yet, and maybe also about what I think is wrong with how Composer is currently used in Drupal, but we'll get to that part later. I'll just start with the introduction so that we're all on the same page and what Composer is, what you can do with it. To explain the background bit, I'm not actually a Drupal developer at all. I installed Drupal in the previous session. So I'm going to rely on all of you to, on your input on the whole using Composer in Drupal bit. I do work in PHPB as my teacher kind of gives away, and work in various other open source projects. I really enjoy working in these kinds of open communities, which is why this conference is great, just getting to know another open source community and seeing what these people have to say about certain things, how they interact with each other, and just seeing another one of these communities is always really exciting. And, right, that's also how I got into Composer. So about a year ago, a bit more than a year now, we decided to move to Symphony with PHPDB, similar to what Drupal's been doing. And we wanted to come up with some new, properly designed mechanism for installing plugins for the software. And we started talking to some of the Symphony people, and they had come up with this bundle concept. And they also needed a way to handle dependencies between bundles, libraries that they want to use in bundles. And we realized that this is really the same problem. And there's no point to finding another specific solution just for Symphony or for PHPB, but that we should really try and address this problem in a generic way that will help all PHP projects that can be used for various tools and projects out there. All right. So that was how Composer got started. And you might think that there's already something like this in PHP. I'm curious, who here has used Pair? All right, that's a lot of people. Who here used Pair to install PHP unit? That's so quite good. Who's used Pair to do something else? All right, that's actually a surprising result. Typically when I do this, but 95% of the room used Pair to install PHP unit, and they've never used it for anything else. Here it's a larger group, which suggests that people here are building bigger projects, maybe trying more of these tools. But basically the experience that I hear from most people who've used Pair is that it's really tricky to set up. I actually look at a documentation for Drush while compiling the command line tool for Drupal. And it actually, first it starts with the line that you have to execute to install it with Pair. And then come about 10 other lines to force install some package that you can try if it doesn't work. And then maybe you can overwrite this other package, or you can try all depths, and maybe that'll work. So that already suggested to me that there's something wrong with this, and it's just a bit too complicated, more complicated than it should be, at least. So that's the other rationale for behind building a new tool to handle dependencies rather than using the one that already exists. Composer's made up of a couple of different pieces, or the Composer ecosystem. Composer itself is the command line tool that you use to install dependencies for your project. The focus, as I said, is on being easy to use, not having all these little flags that you have to use to install it properly. And a key difference to something like Pair is that we always install dependencies on a project level, so like within the directory that you're in. So more in the natural way that PHP developers like to work, where they maybe have a set of directories with a different project in each, rather than the way that Pair typically is used, even though it can be used in this way as well, where you install some system-wide library that is then available across all PHP code on your machine. It's also designed to be embeddable, so it's really just a very thin CLI wrapper around a library, which can also be used to build, for example, a web UI to do the same thing, which again comes back to our PHP vbackground because we want to use this to let end users install plugins. So we don't need a command line tool to install dependencies, but we need this to be accessible from a web user interface. And a few things we pay attention to is encouraging best practices, PSRs, for example, a naming standard for classes and auto-loading that I'm hoping most of you have heard of at this point. SPDX, which is a standard naming scheme for licenses so that you can automatically filter by certain licenses and make sure that you don't install some dependency that actually has a license that is incompatible with what you're doing, and semantic versioning, which is just a standard description of how you should version releases so that the numbers actually represent in a commonly understandable format what kind of or what level of change is taking place between these versions. And there's packages. So we've had this tool that you install dependencies with, packages to the central repository that all these packages are available on that you can install them from. Composer is not centralized, so there are alternatives to this, but it's like the one big thing where anybody can just push with whatever PHP code they have onto for whichever frame rate they like. And it has a great search so that you can just find things that might do what you're looking to do. And it's extremely easy to use again. So typically you just enter the URL to your version control system and it automatically picks up versions from the tags that you used in your version control system. All the metadata is just read from the version control system. So when you do a release, you don't actually have to do anything on the site. All you do is you tag your release in your version control system, which you would do anyway, and that's really all there is to it. There's a little screen share from that website where you can see the kind of metadata. Twig, which is going to be used in Drupal 8S, well, I think that's certain at this point, right? You hope still? I wasn't sure how far that was. All right, never. So you might be familiar with Twig. And you see the different versions listed with its dependencies. In this case, it's just a PHP version that's the only dependency and some metadata, as well as some information about how often it was installed. And at the top, you see the search box where you can just type things in that you might be looking for. Then I said it's not necessarily centralized. This is just a very simple way to get to open source projects. If you, for example, have code that you don't want to publish to the entire world, but rather have some internal, set of libraries that you use within your company or something that you just want to have local, there's another one of these repositories, which is a lot simpler to use, it's just a command line tool that dumps this kind of metadata, which can then be used by Composer. So for example, you can run this in some machine in your local or internal company network behind some VPN proxy, whatever you want to set it up like. It really just generates a single file that you can use to load the metadata for other dependencies. There's a bit newer one, which is called Composer installers, which is actually a package that you can install with Composer, which makes it easy to then install packages in the way that is required by a particular framework. So the standard way that Composer installs things is just to unpack them into some directory, but typically frameworks have some other directory structure that they follow, well, Drupal itself does. So this is a very simple way to just define certain mappings for which files need to go to which directory inside of these frameworks. And there's actually already one available for Drupal there, and I'm gonna show how that works later. First, I'm gonna just run through how do you actually use Composer. I've used the example of setting up a new Symphony project here, this is actually their standard recommended way of installing Symphony at this point, so it's a good example for how one's supposed to be doing this. I start here in this case by taking their Git repository, and then installing Composer. Composer is actually just a single file, have you heard of file files? All of you know of, right. So the problem with file files is that the file extension in PHP has a lot of really weird issues, and a lot of the time, when you try to run a part file, it'll just die on you without any kind of error message or output some random crap, and you don't know what that actually means, or it won't provide you with an error message, which is why we then ended up writing this installer script, and all this installer script does is check a bunch of PHP configuration settings, and then download the file for you. So you can instead just download the file yourself as well if you're certain that you can execute file files. But that's why we recommend installing it just with this little snippet on the command line. But again, if that's not something you can do, then you can just download the file for yourself. All right, and then all you do is you run PHP Composer for install, and that's really the only thing you do to install all of the dependencies, and it just goes and looks through the metadata of this package that you, or the project that you have, which was the symphony standard edition, and installs all the dependencies, like the templating engine, symphony itself, the entire framework, some extensions for Twig, and all the dependencies, all the dependencies, et cetera. And there's a little note at the end, which is kind of interesting. I'll get back to that. It says something about generating autoload files, because Composer also makes it a lot easier to then use this code without having to think about where it installed this and where all the code is located. I mentioned this, typically it's put into the vendor directory, so this is the result after running Composer install. You have, monologue is some logging library that symphony installs, but if symphony itself, Twig, the Twig extension that you saw. And there's autolo PHP, which contains this autoloading mechanism that you can just include and use right away. And within Composer, there's a bunch of metadata, like the list of the installed packages in which versions they were installed and a few things like that. There's an alternative to the setup that I just showed. With a package that's set up like this, you can actually run the command called create project. And what this does is exactly what I described earlier. It takes a copy of this project. It then runs Composer install within this project. So it installs all the dependencies for this project. So you can imagine doing something like PHP Composer for create project, triple project or something like that. And you would just instantly have the entire Drupal installation with all the dependencies installed without Drupal itself having to contain all of these in the downloadable distribution. All right, so we've seen how you use this, but the question is where does the metadata come from and what format does it present it or do you define these dependencies? And we use a JSON file that is typically located in the root directory of the project in which you have a require key with which you define the packages that your project requires to be installed in order to operate. The first part is the name. We follow a standard of having a vendor prefix and then the package name itself to make sure that names are sufficiently unique. And the second part is some kind of version constraint. So you can require some particular version like 21 dev in this case. You can require anything larger than 100 dev where you can require any one point version as you see with a quick example which will install 1.5, 1.6 depending whatever is the newest currently but won't install a version two because that will probably have API changes that break your code and that you would have to first make changes in order to be compatible with. And the second part required dev is kind of a nice tool for development where you can additionally specify packages that you just need during development. For example, to run tests and kind of utilities that you just need during development but they don't want to actually have you on your deployed system in the end. And anything here in the note below you can specify preferred source when installing and rather than downloading some target zip, zip file, whatever and unpacking this it'll actually do a Git clone SVN check out CVS or whatever you're using so that you can actually go into this vendor directory make changes and commit them right there and done. It's kind of a problem if you just work with pair and you have the system wide installation you can't easily just if you've got a problem with some package in pairing you want to make a small change it may be bug fix you can't just go edit this committed there but you will have to well first debug this make the change and kind of take this diff send it to them hope that they'll apply it install a newer version it's kind of a long loop and this makes it really easy to during development to just commit this kind of change maybe even to your local fork of this package and to then later update to the official fixed version. If you want to publish a package you need to add a bit more metadata like the name of this package it's exactly the same composer JSON file that you're using your project if you want to publish this as a package you can add a couple of keywords which are used for the search on packages for example I mean the rest is really self-explanatory and the last bit is this is how you define auto loading in this case with the PSR zero standard you can also find a class map and it will automatically generate the necessary auto loading code All right there's this part you can install composer packages you can define them you can publish them there are a few neat things to composer that it does differently from other systems that help you avoid chaos this kind of version chaos that starts to exist if you want to work on a project with many people or if you want to distribute a package to a lot of people because something you quite frequently encounter is that someone on your team install builds a package with particular version of a dependency and then you distribute this to a coworker maybe a week later coworker installs the same thing and he also installs the correct pair package let's say and it doesn't work for him and after a couple hours of debugging you realize that he did install the correct pair package however there was a minor bug fix released within this week and that actually broke compatibility with the code that you originally wrote so just a small delay already resulted in broken code and having a really hard time finding out why it broke so instead composer has a composer lock file so when you're in composer install with something like the one point asterisk which will just install any one point version it'll record which version actually picked so for example in this case it could record that it install version 1.0.0 and then you typically commit this file into your repository and share it with your coworkers or with users of your product and when they run composer install it'll install exactly 1.0.0 even if 1.0.1 was released within the time frame from you sharing this code and them installing it and you then explicitly run composer update to update this lock file and this just makes sure that all your again all your coworkers always have exactly the same version if you distribute a product everyone using the product has exactly the versions that you tested your product with and if you have a large set of machines you also make sure that each of them has exactly the same version because that as well might be a problem if you have something like 10 web servers and I don't know if you add a new one and that one suddenly has a different version of some library that will call a lot of problems. All right this is some details on the all loading that I mentioned already you can also have a class map where you just specify some directory of files that'll just look for classes inside it if you're not following PSR0 yet and for especially older code like peer code you might need a include path that's not recommended because adding a lot of these makes including files a lot slower because it'll help check each of these directories every single time it wants to load any kind of file but it is there if you still need it. That's the file it generates that I mentioned and all you do is you require this file you can immediately start using all the classes you find in all of the dependencies that you have.  All right I mentioned that we have different ways of defining repositories this is how you do this in your Composer JSON you basically specify the type like Composer which is the same type that packages itself uses or you can directly load packages from a VCS repository for example like Git repository without actually setting up anything like SATA sort of packages. You can disable packages itself as well if you want to for example only use packages from your reviewed package list on your internal network and don't want to use any of the open source code and there's a neat trick here as well there's also a repository type called package which allows you to define a complete package in line so that if you want to include some code that you just have a zip file for which doesn't contain a Composer JSON or maybe this is something like jQuery that they won't care about Composer because it's some PHP dependency management thing. Then this allows you to define a dependency on this other project without them supporting Composer so you just provide all the metadata that Composer needs within the repository definition and essentially this is a Composer JSON within the Composer JSON so you can also define things like further dependencies of this package and then in the end again you require the package that you just defined. All right, okay that's basically what I wanted to explain how Composer works I think you all have a good idea of an intuition of how to use Composer, what you can do with it. I wanted to say a few things about the state of Composer as I mentioned at the beginning it's only a year old. We've had a huge amount of contributions though. This is actually a bit outdated I think at the screen share but there are a couple of hundred contributors in GitHub at this point I think, so we've gotten a lot of feedback, a lot of help with this which has allowed the project to grow this quickly and to be actually very usable already after such a short time frame. Packages already has over 2,700 PHP packages so that's a really large amount of libraries and whatever kind of problem you come up with there's most likely already a package there that solves exactly this problem. So the next time you're working on something and you think you've got some new problem that you need to write some new code for maybe first check there, there isn't already a library which does exactly that for you. We've just released an alpha five version so again it's still pretty young. At the same time it doesn't matter that much that it's still an alpha release officially because it's a tool that you use during development. So it's not something that could crash your site which is running or deployed. It's solely used during development where basically the code doesn't run once the site is deployed. There are a bunch of frameworks and libraries that have started to officially support Composer which has helped adoption of spreading this. Like I mentioned, Symphony does send framework too. It uses this as the recommended standard way of installing any Zen framework to project. There are a lot of other ones that I don't remember just now. I don't know, libraries, even the Facebook PHP SDK is using this, it's got a lot of adoption at really quick time. And there's also some support by platform as a service providers. I think Pagoda Box, which is one, they actually automatically run Composer for you when you deploy something on there. Some of these PHP hosting services do this automatically now. And I've seen at first a few attempts using Composer as a library to install plugins in an application which is what we originally started with to install the plugins in PHP. Right. There are a few things we still wanna do which are preventing us from having a better at this point. We do wanna improve support for web assets through like JavaScript files, image files a bit because at the moment they all end up in the same vendor directory. But typically you have some other directory where you keep all of these or if you wanna separate your web accessible directory from the directory that all your dependencies are in. This is maybe not something that happens in Drupal all that often. But it's the same thing with PHPB so we don't have this problem either. But it's something that we wanna work on so that you can actually collect all of these files from all the different dependencies that you have and keep them in a single directory. There are just various cleanup things to do, small missing features. But that's why we're grateful that we have so many contributors now because they've helped us identify all of these strange bugs that we ourselves wouldn't have come across with certain proxy configurations and all these kinds of things that you have to consider with a tool like this. So we're hoping to release better in September and we're definitely hoping for some more help. So go to GitHub where all of our code is hosted if you wanna help us out. All right, so that's Composer. Let's talk about how Composer is already being used and Drupal can be used in Drupal and might be used in the future. First off in Drupal 8 which is now using, well we're potentially using twig for example which is now using some symphony components. Composer is used to install these. There's a Composer.json file which unlike what I explained earlier is located in the core directory rather than at the top level of the repository. And these dependencies after insulation are committed into the repository. So for any regular developer this doesn't make a difference because they don't have to run Composer install to get these dependencies because they're already in the repository and you can just start working on this. So it's certainly an upside that people contributing to some other part of Drupal don't have to even think about this. I'll come to what I think is not that great about it later but for now that's kind of how to play. The other thing that already works is a Composer module for Drush. Is it Drush or Drush? Drush I guess, right? Which basically is just a wrapper on Composer for Drush which has a few nice features. For example, if you use Drush to install some module that module can actually contain a Composer.json file for dependencies which will then automatically be installed when you run Drush.gl. So in this example there's a module called less. Less is this language for CSS well defining CSS in a slightly nicer way which you can compile into CSS. And there's a library called lethal less PHP which is the implementation of less in PHP. And the less module simply uses this library to provide this functionality as a Drupal module. To make this a bit nicer, there's another module, the Drupal Composer autoload module which basically makes sure that these generated autoload files within each module then get loaded when you're running Drupal so that again like I explained earlier you don't have to bother with loading the code from the right directories. Or having to instantiate the autoloading for each module yourself when you need it. All right, so we'll get into the discussion after this. So basically what I'm trying to say is you should rather than always writing code yourself maybe you're using libraries but you're at least always building a set of modules for your project that might contain some functionality in these modules which is really something that could be shared with other PHP projects which aren't necessarily Drupal projects. So this kind of sharing across projects becomes a lot easier if you separate your code into these kind of single purpose small libraries which you can easily publish on something like packages and then you can find these from other people as well as make them available to others and get help from people even outside of the Drupal community because these small and reusable libraries which you then wrap in modules for example are just as useful to people who are not using Drupal but PHP. All right, these are adventure links if you want to learn more about this. There's also help in a Google group if you just have questions after or on a pre-note IRC, there are always people around to help if you want to try some of these things. And at this point I really want to start the conversation part of this. There are a few items in here that I put there which are I think points that we should discuss. Like I mentioned the composer JSON of Drupal is currently located in the sub-directory which means that if you for example have a Drupal project and you want to have your own dependencies you will have to separately install them or you will have to modify this composer JSON in the core directory which is really not a great idea. And there's no simple way to just add dependencies to the system that already exists but you're kind of always stuck separately installing your own dependencies from the ones that Drupal core itself has which can actually result in problems if you end up with different versions which is kind of what composer is trying to solve by having a single way of installing these dependencies for the entire project. We've seen that you can install modules and with their dependencies however currently with this Dresch tool that I showed these are installed per module. So you have three different modules that all have the same dependency. You actually get this dependency three times which again it's typically not a problem as long as they're in the same version but it's some amount of overhead because you've got the files lying around and the auto loader would be instantiated three times. It wouldn't actually get loaded multiple times so it's not, it still works, it's just a bit overhead. And then something else, a discussion that actually came up on Drupal.org somewhere at some point is whether or not one should simply use composer.json files instead of the module info files. And I'll actually point out another one that says you can actually have both like in this example and not have too much of a problem. And something that I would like to suggest is that Drupal core itself might actually become a dependency of a Drupal project so that you have a composer.json on your project level which defines the Drupal core as a single dependency which is then installed where if you ship basically what you would ship for a new user is a version of this skeleton project including the already installed Drupal core. But what this allows you to do is have a composer.json on the root level where you for your project define all your dependencies that you yourself wanna have. At the same time, Drupal core is a separate package with its own composer.json where it itself can define all the dependencies it has. And composer then takes care of making sure that the versions match each other and that you can correctly install dependencies that you have on your level as well as that are compatible with what Drupal core supports. All right. Questions, ideas. Anyone wanna get started? I'm right here. There's, yeah, there's a microphone in front. Everyone over at home for this? I mean, I have more stuff if I should just keep going but I figure at this point there were probably some questions or there's, yeah, comments, like really conversation, yes? So you don't have to ask me something, you can just tell each other something that you think about this if you want to. Come up to the front, just line up for the microphone so we can record the sound. So I'm pretty sure the only reason that composer.json was put in the core sub-directory was out of some kind of fear that if it was in the top level directory people might think it's something that they can mess with. And but I mean, I don't think that justifies going against the convention. Is there already an issue to move it? I don't know what the problem currently is but that actually doesn't make sense because you do get into trouble if people start editing this file. That's why I'm suggesting that you actually have Drupal core as a dependency because if you wanna update from one Drupal version to another that typically involves changing the version of these dependencies, right? So in an update of Drupal this file might be modified during the update. So if someone goes and modifies it themselves you then kind of end up with the situation where there might be some merge conflict between the two and it gets really tricky. So I do understand why it was put in the core direct and this actually to a degree makes sense. I mean people might still go and edit it but I think the clean solution to this is to simply separate the two and have a composer.json for the Drupal dependencies and consider like the Drupal core a separate package and to have a composer.json which requires the separate package which is made simply for users to mess with, right? So where they can define their own parts. So I think that the correct way is to simply split this up into two parts. So I see two directions that one is you have a module that is only made for Drupal and it knows about the surrounding and you can make a lot of assumptions that things are there. And the other thing is that you have a package that only works, that works in Composer and that is meant to work everywhere. It just has to be PHP. And so one direction would be that you still make your modules that gets a lot easier because you don't have to be so general. Or the other thing that would be modules become components and then they have to be, they have to work everywhere. It's like what now is a Drupal module would turn into a component and then you can use it everywhere. So you also have higher cost at making it work everywhere. So the first thing is that a composer project doesn't have to work everywhere or a composer package, right? So you can just have a Drupal module be a composer package which only works within Drupal. There's actually something, I think I kind of skipped over this earlier when we looked at the definition here. It's actually type in the second line. So I mentioned these custom installers that automatically install, for example, Drupal modules into the right directory. And that you would define a composer JSON for a Drupal module that only works within Drupal is by selecting a type like Drupal module.  So for one thing, these two don't end separate. And the other thing is it's extremely useful to separate these, to have a module that wraps a generic purpose PHP library. But at the same time, that doesn't mean you always have to do that. In simple situations, it might just be faster and easier not to do that. I was just hoping to encourage you to think about whether that might make sense, whether there might not be some benefit from doing that. So with this type thing, you could actually have some of the rest for free, like it would be implicit, like the autoload would always use a Drupal standard outloading, whatever that is. The autoload you can really skip over. Just to know where the folder is and everything. Yeah, you can actually, the autoload might be an exception to that. But in general, that should sort of work. There's another thing to mention here is that you actually have an extra key which I haven't shown here, which allows you to just define any kind of data that this custom installer might need. So if you want to add some kind of metadata that is only useful to Drupal modules, then you can just add this to this file and it'll be available to this installer. I'll have to get back to you whether you can skip the autoload part automatically. Okay, the other thing would be if you separated the module and the Composer packages, would you already ship that in the module or would you have to some separate download thing? Basically you can do both. You can basically use Composer to install this and you can ship a version where this is already installed, which just allows users to then update this dependency themselves maybe to replace it or something. But it still doesn't require that users necessarily use Composer to install the dependencies. So I would typically recommend that you have some kind of built process where you run Composer, install once, and then you package this up and ship it. Okay, yeah, so do you know what Drush make? Sorry? Drush make. I do not know, that's why I'm sorry. Sure, no, no, that's fine. So we actually go to the last page. Yeah, sure, that's fine. I'm not even sure why I'm asking that now, but because you had a nice list of, oh no, I thought the very last one, you had this list of things that we could consider. Oh, yeah, yeah, yeah, yeah. I'll figure something. Right, okay, yeah. So, yeah, using Composer to install modules and this notion that you're talking about where we have core as a dependency essentially that's pulled in, that's the same principle that drives Drush make files, which are basically manifests that, and then Drush make runs, it finds everything, it downloads it, it drops it into place, it applies patches if necessary. So it's same principle, way less flexible in terms of the actual number of things that you can do and Drush make typically cannot be rerun in order to update dependency, it doesn't have a lot of concepts. So there are a number of substantive additions in Composer that I would say are improvements over Drush make, but essentially it's the same concept. So the community at large is not at all, the notion of treating core as a dependency is not at all foreign and maybe if people were hearing him say that and scratching their heads, like can we really do that? I just think, we've been doing this for years, this is Drush make, this is not crazy. It's good that you say that, because I don't know, right? No, no, no, for sure, for sure, and because I was trying to process it for a second, I'm like wait, no, this is exactly what we do with Drush make, it's the same idea, where what you start out with is basically a manifest file of some kind, and then it just assembles everything together. I've actually got a, yeah, another slide here, actually let's just start with this one, which is kind of how you could imagine this working. So you can use this create project thing to create the basic composer JSON, which just has core as a dependency, which you see down there, and it would generate something like default directory structure, as well as a company code, is that exactly what you were saying? Yeah, the place where it is actually maybe a little trickier is the versioning, which we barely talked about at all, but we are nowhere close to semantic versioning in Drupal. I realize. Yeah, and there are some actually, I've gone back and forth on this, Pat should get up and make his points about this as well, but given the fact that we include the major version that our software itself, that our module is compatible with in its versioning string, it's not a bad thing. No, the thing is that becomes entirely unnecessary with this, because what you do is you always define Drupal core as a dependency of your individual package, and through that you define exactly for which version you're compatible with, and you're still free to, for example, if you have your listing of modules on Drupal.org, to just display them the same way. The only necessity really is that Composer needs to be able to compare version strings for a larger, less-done, which becomes really tricky with this kind of setup, because there's a lot of logic in having it constructed like that. Yeah, yeah. Potentially, we can actually make that work, although I'm not entirely sure how. Yeah, I was gonna ask is the mechanism for doing version comparison pluggable, would we be able to write a Drupal-specific version comparator that just plugs in? Again, Composer itself is just one big library, which all uses dependency injection, so for example, you could just build your own wrapper around this, just load all the regular code, and just replace one of these parts of it, or maybe even better, you can just modify Composer to support this if it detects that format of a version string, because there's really no downside to supporting this in general, I think. As long as we can separate them from the other kinds of version numbers.  I think it might be that, yes. It might be, it might be, and I'm trying to get myself there, but. It's a very important piece of information, but as long as you make sure that you always require the Drupal version that you depend on, you at least, like functionality-wise, you don't lose anything. Right, and that's actually, and I'm clear on the technical side of it, the part that I'm sticking on is whether or not there's some important part of the fact that we include the major version string for people who are choosing their modules. Right, so I think to some degree, it's really a matter of displaying this kind of information in the right places. Yeah. So there's a lot, you can basically, I would imagine that Drupal, if they went to do this, would have something like packages, but integrated Drupal.org, which has the same functionality, and it would just focus more on which version of Drupal does this module actually work with, and display it in a very similar way to how it does it now. And I think that would cover most of that. Yeah, the other note to just quickly make is that we do, as part of our packaging process, we inject a license file. So we do have to do slightly more than just say, tag it and push it. We actually have to say, we're gonna roll the release on this because we do inject a license file. You do not have the license file in the repository? No, we do not. It's not directly included in the repository. I mean, that has its own whole long history, but it seems like a really strange thing to do, because you do want to verge on the license information with the kind of like... Well, no, that's the thing. In order to push to get on Drupal.org, you have to click something that says anything I put on here is GPL. So by putting it on there in the first place means it has to be GPL. So if you put your own license file in, then you actually kind of can't do that because by putting the code there in the first place, it was GPL. So what we're doing is when, at packaging time, we are enforcing the contract that we set up when you agreed to get access to version control in the first place. So again, I would imagine that Drupal would not necessarily use packages directly. Yeah, sure, sure. So for example, then framework does something very similar where they have a different packaging process and they just run their own repository. Right. And it's really not very difficult to set this out where you just package, like you would just continue to have some kind of packaging process and all you need to do is in the end generate this kind of metadata that composer can then use to find these packages. Right, yeah, and I don't think that's impossible, although the one piece in here that I've still missed is where is the information kept about what a vendor source actually is? So how does Packager figure out that Drupal should be looking at something like for Drupal slash core. It looks at vendor as Drupal, so it knows that it's looking for something on Drupal.org? So this is really just a string, like it doesn't separate the Drupal and core. So it's just a Drupal core string and it just goes through all the repositories that you've loaded and looks for the string and it'll return all the packages and all the repositories that you've loaded that are named this way. And then it'll match the version constraint that you defined to only get the packages in that version that you wanted to use and then it will install that. All right, I should sit down so that you can ask questions. There's plenty of time. So I agree with you completely about it'd be better to not check the symphony components into components into core directly. The primary reason that we still can't move to that at this point is that since we're chasing dev versions of symphony right now and of Twig and everything else, that means it's quite possible that someone working locally will have a branch of Drupal core that they're working on and another branch of Drupal core that they're working on that require different versions of some library. And that's easy to switch. If you remember that command and if you have a network connection at the time, given how much Drupal code is written on airplanes, that second one might be a challenge. I'm not sure though, but even in that situation with the current one, you still need these different versions of symphony present, right? So I'm thinking of this branch, we have symphony to master these three libraries from this date and this branch, we have the same libraries from three months later. Right, yeah. And if I'm working on this branch what you're saying is you don't actually have these installed at the moment, but on the plane you switch to the other branch and you want to then install these dependencies. Right, so it's other dependencies. And that's not an uncommon workflow for Drupal core dev. So how would we go about solving that problem so that we could do that? So one thing is that composer might start solving that somewhat because there's a proposal for having local caching. So then on the plane, as long as you've at least once checked out this branch before and downloaded this version, it would have these cached locally. So if you just ran composer install in a different branch, it will realize, oh, these are the versions and see, oh, I've got these locally so I can just move them back. So I think that kind of local caching would solve this problem. To a large extent, not completely, but to a large extent. Yeah, but. Okay, do you have any idea how far along that concept is? There's a pull request open for it, I think. So that kind of needs reviewing on a few minor changes, but it's basically there. Post a link on the project or on the presentation note on the site after I can try and harass people to review that. Yeah, okay. Thank you. All right, more questions. In that case, I've got more slides. Yeah, so we talked about this. And just to complete that, that would basically be the update process for if you wanted to update Drupal. You basically just replace the version of Drupal Core that you wanna now work with. You can maybe leave the modules that you're using in the same version and either the composer's gonna complain when you try to update and say, well, this isn't actually compatible and you might have to update one of the modules as well. But it basically takes care of figuring out whether these things are compatible or not. And again, you can wrap this in some kind of Drupal tool so you don't necessarily need to use Composer SS. Another point on that following up on what he was talking about. One of the side effects of our current versioning approach is that some modules will reset their version between Drupal major versions. So as an example, the Organic Groups module got up to a version like eight something for Drupal five and then dropped back to 1.0 for Drupal six, which works totally fine in our current model.  Again, it would just be having the version comparison work on that kind of version numbers, which is not that big a deal. That argument could certainly be made. No, but there's some conversation. If you all haven't read it, Tom Preston Warner is the one who originally authored the semantic versioning proposal. It makes sense. And when I say that Organic Groups did it wrong, I mean they did it in a way that wasn't very semantic and didn't make sense. And really I have yet the only case that I have seen which doesn't entirely fit the semantic versioning proposal, which is a well thought out proposal and really all of us can pretty much follow me. Now the colonel's doing it. Is this case where we want to express some like external dependency information with our leading digit, which is not strictly something that we ought to have to do. That information could be recorded somewhere else and I agree with you on that. It's really just the sort of can we make the shift? Can all of our in for shift and can all of the expectations that everyone has around it shift easily enough? Which ultimately is a question of how centrally controlled can we make the process of managing that shift so that we don't have people in different weird and consistent version states for some unknown period of time? But yeah, the OG did it wrong. Is Moj in here? No, good, so I... Maybe? He agrees that he did it wrong. He didn't realize that that was what the major numbering versions were for and you increment major numbers at certain different types of things. The fact that we reset when we actually change across major version numbers is itself a little bit of an oddity but we have an issue inside of the community right now where it's like, so for example, I can talk about panels two or panels three and those exist across different Drupal major versions and we maintained our major version numbering because those actually represent different applications and have significantly different functionality but so it made sense that we retained that there was never a 7.x, 1.x or 2.x whatever branch for panels because this is panels three and that's what that major version number represents. A lot of the time when we do, when there's sort of this resetting of major version numbering, I think it's because we're not following a very disciplined numbering schema in the first place and switching to the system would actually encourage us to be more proactive in thinking about that which I think would be beneficial. Highlighting that we would have to make that shift. We would definitely, yeah and that is one of the things that would make this shift difficult is there's a lot of retraining involved that people think about it but yeah. Someone besides us get up here and talk a lot. Anyone? Well I can show you a few more cool things you can do with Composer which is like the thing I've always got leftover for the end which is, it goes a bit beyond the simple examples I gave earlier. I kind of touched on this with the example of you have some peer package that has a bug and you want to edit it and that doesn't really work all that well. So in this example where I think basically you're working on some kind of symphony project and you have a dependency on this monologue bundle for symphony which itself has a dependency on the monologue library, right? So you've got this kind of your package, the bundle and the library itself. It's like three items, kind of a chain of dependencies and this library has this, it's missing this essential feature for me. So I'm gonna fork this library, add this feature that I really want to have and then I want to keep using this. Now I've got this other package in the middle, right? Because I wasn't originally using the library directly but I'm using this bundle thing in the middle as a dependency and this bundle itself says it depends on a particular version of my library which I just forked and made a new version of. So aliasing in Composer is a way for you to define that some branch that you created, in this case it's actually Git branch which is automatically mapped to a version that you can use that my feature branch and you can pretend that this is version 1.1.0 of the same package so that the monologue bundle which depends on 1.1.0 can still correctly install because it thinks its dependency is satisfied because you aliased your own new feature branch version as the version it was expecting. So through these aliasing things it's very useful if you're working on a project or on multiple parts libraries of a project so that you have development versions of various parts and you wanna try this out while you're working on individual parts and this allows you to very easily use these branches without having to edit all the dependencies just to try this out, all right? Yeah, that's actually kind of a neat feature I didn't really mention before. As I said, for example, packages automatically extracts all the version information from tags from something like GitHub or your SVN repository and it also automatically creates a depth version for each branch that exists so that you can always specify kind of this running target as a dependency for your project which is useful in development. Mike? This is me thumbing my nose at other people on infra. What mechanism do you use for generating those? Because you have an actual tar ball that can be pulled down, whatever, right? So how do you pull the external repository to determine that a chain has been made on a branch and that you should repackage the branch tip? So the package, well, basically at the moment we're relying on whichever repository there is to provide us with the package version already so this works perfectly if you're using GitHub. I see. Because GitHub automatically provides you, yeah. We're not hosting any code. So if you're using something like an SVN repository at the moment, it'll always install an actual checkout of the SVN repository because there aren't any zip files for those. So it's okay. We are planning on adding that to packages. We can talk about that later. It's just one of these things nobody's done yet. No, for sure. We can talk about the approach to that later because we've talked about it a lot on our infraside and I can tell you what not to do. Right. All right. Yeah, any more questions? Anyone? All right, I think in that case, thank you all for listening and participating. Yeah, and I'm still here for the rest of the day and tomorrow if you want to, if you think of something that you want to know about Composer that you want to talk about, please talk to me. I'm happy to have any conversation whatsoever about this project.