Alright, so we are recording now and I guess I'll just start us off. This is a meeting about the community themes initiative is a project where we want to like build WordPress themes under the WordPress username or specifically block themes. It'll be a similar process, I think, in terms of like, you know, community feedback, community involvement, and there'll be a GitHub repository which we'll share and it's hopefully just going to be a lot of fun. I am going to have Maggie's co-host with me and so she really knows more about the project, like I think she has a lot more ideas than I do, so I'm just like, do you want to, Maggie, do you want to just describe what you have in mind for the project? Yeah, yeah, sure. Think about when we all get together to do the default themes once a year and we all collaborate and learn from each other and build a really, really nice quality code block theme that goes into the into the world. Keep doing that all over the year so that we keep teaching and learning, doing more block themes together without the constraints of the deadline that a default theme has and all those yeah, having to meet that deadline, having to that pressure, also allowing to get this feedback loop into Gutenberg, both on issues that we find that blocks us from building better block themes and also when Gutenberg allows for new features we can build themes that use them and showcase them and then other people can look up to those block themes that we build as a group collectively and find something that is good quality that can be used as a reference and also get people who don't usually code into block theming because now you can do block themes without actually knowing how to go at all. I think this is a great place for people who like to learn by doing. Yeah, that's great. So we are, Damien has already had a question in the chat box. So the question is, since default themes usually have year naming convention, what convention shall we use for non-annual? Well, my opinion is that we can name it whatever we want, right? Yeah, it was just it was kind of a I don't want to get hung up on that. That's a small detail. It's fine. Well, that's great.  Yeah, and this I don't see any reason to follow any specific convention. Just name it or whatever the theme review team rules are, you know, yeah. Yeah, yeah. Naming is hard. It's really hard. Yeah, yeah. Since the theme is not getting bundled into a release really or the themes, hopefully there will be more than one. Yeah, I don't think we need to constrain ourselves with any kind of naming convention, really, other than whatever is on the repo rules. Yeah. Yeah. Yeah. Naming is hard. I think Brian had a theme last year or the year before or something that was he had the entire design, all the screenshots and there are all the images right and then the name was unavailable, right? I remember it happened twice, by the way, I renamed it to something else and then I submitted and got rejected a second time. So I've done it three times. I think that got three names right at the end of the process. Yeah. Yeah. That's where good the source comes in handy. So just find something that works. So this is really just an open conversation about like this project. And so there's no small or two complex questions or, you know, that we can talk about. How many people here were involved in the 2023 like community themes? I know I know I submitted one anyway, but for those unfamiliar that was we shipped, I think, 10 style variations with 2023. And so the community could admit some people, but the community could submit their own designs for it. And that was like a really scale back version of this, which would be more geared toward like a full child theme.  But you can also have your extra templates and functions, of course, to odyssey. But yeah, so let's Carolina says it's not allowed. I think you need an index.html template, right? At the very least. No, I'm saying that the reserving names, the team. Okay. Okay. The index file is no longer needed, but styles is a file. But yeah, team information, author, et cetera, that's it. Hey, quick question regarding the index file. Is that still required for parent child themes? I know a while back with powder, like I had to add, excuse me, add back the index file into the theme just because of the way the directory itself was set up, like it was working fine without it, like locally, but because some of the, and I know blockify was another theme that had lead, Lee had to do the same thing, just add the index file just to like pass some sniff test that the directory setup had. All right. PHP, I don't think so. Yeah, I'm actually trying to search for a ticket that there was an issue. I don't know about the directory. I know there was an issue with installing a zip file without the index.php, even though you could activate a theme. Yeah, you could activate it if it was already installed. It was a weird bug or something. But in terms of the directory, I don't know if that's still part of the sniffer or not. I can always remove the file, update the theme, and if it breaks, put it back in again. I was waiting for Lee to go first. I don't know, Carolina, I know you are still with the theme review team some. Do you know if that's still possible? I don't know if you're still kind of doing work there. It's not a big deal. I was just talking to somebody now. We don't have the waste time talking about it, but I'll just, I'll test it out. Mike McAllister, what's up, dog? I don't know. We're going to... Honestly, don't remember because I'll be focusing on Gutenberg now for so long. I remember there was a problem with team check, the plugin, which is used for the team directory, but that shouldn't affect local installations. But I remember we had to add the index file back to pass team check on upload. Yeah, separate issue. Yeah, just to be clear, we're talking about index.php. You have to have a template.index.html, of course, or otherwise you would have had the php file. I think Nick wants to say something. Okay. Yeah. Yeah, so when thinking about this project, it got me thinking about beam iterations. We have 2023 and it's a great rock solid blockchain, but one of the things that I find when doing my training educational material, especially about adding functionality or restricting functionality. Is that me? No. I got it muted, sir. There you go. Okay. I always have to add back a functions.php file or if we're doing variations or whatever, add assets.js, add the variations, JavaScript file, and queue the sheet and everything, or the scripts and everything. So I was wondering if, as part of this project, we have themes that may be incorporate some functionality beyond just like a base 2023. Things that people would want to do, use it as like an educational tool as well. So if you want to add some block styles and add some block variations or whatever, those are demoed in some of these example themes, which give people a direct way to see how it's done. Kind of in a more formal way. Just a thought, because 2023 is great, but you always start adding things back to do some core functionality. Yeah. And I'd actually like to add to the educational aspect of that. When you build those things and the themes, like I would love to have you all talk to me and about getting stuff on the developer blog, just to share those experiences. That's kind of a side thing, but just putting it out there for everybody. Yeah, I think that's really interesting. I think that's something that we would have to discuss on a birth theme basis, I guess. I haven't said, but the repo is up now. I think the link is on the make blog post. I'll second share it later. Right now we have two themes, well, in different stages. One is just a design that they decided to donate for the host that we can build. The other is one of the variations that didn't get to 2023 that's going to be built into a standalone theme. The design that we have right now that we can build, it's a very, I don't know how I would describe it, but I think it's going to have features that are going to be hard to build without adding extras, maybe CSS, maybe I don't know about JavaScript, but I think it would be a good idea to use the repo or this initiative to try and push as much of the limits of Gutenberg to be able to do as much as we can, because if we start relying on CSS or adding assets or something like that, that's the easy way, that's of course totally valid, and it's also a good learning experience for people who want to learn how to do that, but I think we would be losing a little bit of the opportunity to try to put some of that into core. I don't think there's a real reason why we shouldn't add assets, if we really think we need to, that we want a theme that has this particular functionality that doesn't work in core, and we really want to have for this theme to have it, because it's very special, very specific to this theme, and I don't think we should say no to that, like we would on a maybe on a default theme, but trying to push as much into Gutenberg that whenever Gutenberg doesn't have the capabilities, I think it's a good exercise for us. Yeah, and I don't want to just, I mean if this isn't the place for that sort of thing, and that's perfectly fine. Could be, it's a discussion that we can have, yeah, yeah. That's also thank you for the link, it's in the chat. Yeah, I think this is a great opportunity to just explore, like any design itch that you want to scratch, or, you know, function, you know, just, and without having to necessarily build out a full theme, it's a great, you know, great way to explore concepts and, you know, offer them back to the WordPress community. All right, I think the greatest thing of this is that maybe someone has an idea but doesn't know how to build it, but someone else knows how to build things and doesn't doesn't do well with design, so that's like the magic of this, like you can get together and do something really nice. Yeah, I don't know, do we have anybody here that is primarily a designer, not much of a developer, like who writes code? I know most of the people here write code that I know, so I don't think so. Yeah, we would really love to bring in, like, yeah, people who are just designers, because, like, block themes, this, you know, you don't have to know all of the complex stuff of the past anymore. And I think, like, being able to onboard some of the, like, really creative people who didn't think they could build themes and to the WordPress projects would be, you know, it's a great way to do, all right, so we have both kinds, designers and developers, yeah. I think a lot of us are just master of all trades, or what is that, Jack of all trades, master of nine, maybe. Yeah. But yeah, I think it's interesting to, like, exploring, I've been diving into, like, the query of the block and, like, taking a look at different ways to leverage it, so, like, like, there's some, some explorations around, like, if you only had featured images to make, like, like an Instagram profile on your own website, like, something like that, like, using the query of the block, and all you do is add a featured image.  And why wouldn't that be, like, an out-of-the-box way to use WordPress? I think, like, trying to think of, like, the alternate ways that, that historically we've ended WordPress to maybe try to do, but in, like, a weird hacky way, but try to figure out how to do it with blocks, I think is very appealing and interesting to, to mean into. I really like that idea as well, just because I think, you know, when you're thinking about making a default theme, or even something like an in-between default theme, something that's like a default theme, you're really making one kind of theme, and it kind of dictates what kind of website you make, or at least people's creativity, I think, is kind of boxed in by the theme in a way. And I think that's part of the, the trouble with educating folks on these new themes is that it really can do a lot more than we previously had, but if we're just giving them another default theme or something like that, I think we're, we're kind of limiting the amount of experimentation we could be doing, and just that kind of developer relations, that kind of, you know, marketing of the, of the software. And these are, like, more unique use cases. I think we'll start to get into some unique spaces that, like, gets people's attention, gets them excited about making themes. It's, it's fun and exciting to us, but I think if you're a new person looking at the wall of stuff that you need to do to make a block theme, it's not really that exciting. So we have to like, we have to make this more exciting. And I think those kinds of unique use cases could help us get there. Yeah. I was just on Twitter yesterday, I think it was Twitter or somebody's blog was, somebody made the comment of, you know, what we don't need is a whole bunch of other big, like, utilitarian, Nick, what's that word you use, monolithic, like one theme that does all the things, right? Like, so I think the idea of niching down, because really, like what, and I ran into that problem with Frost is, like, I like the idea of like, niching and like, creating patterns that are specific to a use case. Now, obviously it's not a theme for everybody, but I think there's already enough of those already being in, in the directory or in the works. And so like, whether it's a yo with theme or a real estate theme where patterns are actually specifically built for that use case, and people can say, Oh, I can, or even like the full page patterns, right? Like the, you know, I can create like a calendar or scheduling page because, you know, I don't have to sift through 100 different patterns that don't make sense to me in the specific use case. So I'm a huge fan of that. And that's probably the angle I would take in this personally. Yeah, I was thinking when you were, when Rich was mentioning the query loop, I was thinking about themes that we built that were for podcasting or for video bloggers. Those are something that you can't really do with the query loop if you really want to showcase the media that's important, that's relevant for the website. So that's like, that kind of niche that doesn't get built that much because of podcasting website is very, very specific, something like that. That's would be really nice to explore. And the guardrails for this are just core, right? We just want to be using just core. We're guiding ourselves by the same guidelines that any blog theme that wants to be submitted to the repo, really. So the rest is up to discussion, really. So that includes Gutenberg then, obviously, because that's part of the repos install. I was just thinking like, WooCommerce support and the, you know, things that like, you know, once people get past the initial like, Oh, how do I do this kind of thing? Yeah, as long as the team doesn't break if Gutenberg or WooCommerce is not installed, we can support whatever plugins we want as in, you know, recommended, not required. Yeah. Yeah, if you want to build a site that's mainly a shop, that's for sure it can work as long as like Karin and said that when you deactivate WooCommerce it still works and doesn't break. I was looking at, I did see something like mentioned in our notes about potentially like design, working with Figma. With the original 2023 project that you could create a variation through Figma, right? I have no idea how to use that tool. By the way, I'm just confused. I just know what to read. Yeah, so I don't know, you know, I'm assuming we have several people who are like, who prefer to use that now. So like, having like some, like at least been a point of resources and stuff around that would be and anything we can do to like bridge the gap from people who just want to use Figma and create a theme and like kind of transport it over. That would be awesome to see to as, you know, at least at like a just simple level as provide some resources for people who want to do that. I keep coming back to the developer blog. Like I want somebody to write a post on how to do all this for us, you know, like some of you use these tools and how they work in your data, your day to day job. Well, I do think you provide like a real natural flow where you create a theme, it's in the community repo, you write an article on how you did it, you know, I think that's a really nice people can go down use it, you know, so that'd be a really quick thing. Yeah. Damon, your, what was the other thing about considerations around standardizing block patterns and these or I guess I, yeah, I was just thinking, I mean, I see the group net kind of staring towards niches, and I think that's awesome. And I think that will probably have some unique patterns associated with it. But I also think there could be potential for having like standardizing some some patterns that we might pull from like the pattern directory or something that we, I don't know, yeah, what that would look like. But I guess once we see a few a theme or two being developed, and if they're pulling in common patterns, then that might be something a larger project or a different spin off project, I guess. Yeah. Yeah. All right, I'm looking at a food truck, simple restaurant theme without a PDF menu, that would be a great, great thing. I actually have a food truck like literally right down the road from me. It's open three days a week. I'm like, I want y'all to have a, like I want to order online instead of like calling like I just want to click a button to get my burger. So, but it's a little old school. Yeah. But yeah, I would love to, like, so here's a WordPress theme and I just install it. Maybe you have some kind of integration. But yeah, great idea of a specific theme type. Yeah, we got to go ahead. There's also like more kind of unusual things we could think about, like how about a theme that was targeted at like presentation slides, like instead of using, you know, Google Docs and creating slides in that you could actually have a WordPress theme that was targeted for that. That would be an interesting theme to create with using a community theme because it gives it a sort of more, I don't mean authority, but you've got a bit more trust, don't you? If it's been created by people who are experts in WordPress, it gives it that kind of almost canonical feeling. Oh yeah. I would love to say that. I think that's a great idea. Are you volunteering to do this one? Write the JavaScript for the slides. I don't think we need to do any JavaScript with them. Sticky position. Sticky. Yeah, yeah, I think it's more prototyping that. It's really, really cool. So that's amazing. Yeah, we should try that. Oh yeah, that simplifies us for a slight actual just like theme developers, just a UCS or just a sixth position. Yeah, I'll have to get a link if we have one available for that, just to test it. But you should open an issue on the repo. So some designer can actually flesh out the looks of that. Maybe I'll just open appeal. Yeah. Yeah, I think we can, if you have ideas for anybody who's just like, oh, I got this neat idea for a theme, just create an issue. You don't necessarily have to build it all yourself. It's a collaborative process. Yeah. I think another thing to try, it's very difficult would be to not use Figma to start the design inspiration within the editor. It's going to be very difficult, but knowing what those difficulties are and recording them, you don't get an issue like these are the top 10 things that slowed me down, because we know it's slower than in Figma, but having a lot of feedback on what exactly needs to be improved will help that process because it should be as much as an exploration tool as a design tool. And at that point, I think it'll really increase adoption for designers. It also prevents you from designing things that are impossible to do in blocks without custom CSS. Yeah. But I'd like to identify those like guardrails that really shouldn't be there. Like what's impossible that should be possible. Right now it might just be way too difficult to do, unless you're one of us who've been doing it for years and we know exactly how to wrangle it. I think that that would be good to kind of take those binders off and look. Yeah. I will say the most common feedback I have is around navigation, building out anything beyond what you could do with the editor right now. Yeah. Which navigation has always been a problem in WordPress. It's not like the block editor introduced problem edit navigation. So yeah. There's probably hundreds of tickets, and they're probably already filed, most of them around navigation. Yeah. Mega menu thing. Damian added. Yeah. Just one thing that's an entire mega menu. Let's do it. Oh, there's one actually. Oh, you're searching for it. Then you get the name. You have the name. Go for it. All right. Let's see. So yeah, like officially at this point, we're just calling this a proposal. You know, there's not like some top down like we're definitely doing this. Like I may feel like we are. We have, we've had great feedback so far in the theme review meeting last week. So like I do want to like to come away with this meeting. So like, okay, we're going to do this.  I don't know. We don't have anybody who kind of disagrees with that. Right. So I think, you know, now it's just, it's going to be about like kind of, I'd like just getting started there. I think two projects started and those Maggie, you can correct me if I'm wrong. We're both based on style variations from the previous. No. Oh, they weren't. Okay. That's just, there's one that's a style variation that's going to be built on the child theme. And the other is just a design that we are this donated for it to be built. We gotta decide how we're going to build it. What's, what are we going to use as a base? And if it's a theme that we should build as a child theme of 2023 or was a standalone theme, I guess that's up to discussion really. I asked her if she could give us a design. So we had something to start with and it wasn't just an open empty repo. So there's already, she's open in case someone wants to start discussing, start working. So there's something to start with because I didn't want to contribute any once time because this is of course something that we all do for free, basically. So yeah. I think someone had a question. Yeah, I was just, I guess, I might be jumping ahead, but I just straight go into process. But and I'm curious, like, so the community themes repo, are we thinking there's going to be individual themes in there? Are we going to spin off the ideas? We're going to have a folder for each theme and that's how automatic works when they're developing themes. So there's a script that we can reuse that they have for pushing to repo once every theme has been accepted in the directory. So we need to update just with a script, we could just push directly stuff like that and automate everything. So yeah, the idea is that all the themes are going to be in the same repo. Okay, perfect. Yeah, I'm not usually a fan of doing that, but I think it would work in this situation. Yeah, have everything in one place. Yeah, skip the head past the GitHub processes. What are your thoughts about providing examples on the hybrid teams? What do you call them hybrid or universal? Very interesting. I've been trying to avoid them, but people are asking about them more and more. I guess it all depends on the needs of the person who's building the theme, right? Why are you deciding to build a hybrid team instead of a block team? Usually there's some kind of constraint that's coming from that. So we don't really have those. So if we think it's a good experiment to work on for learning reasons, then I guess we can decide to go ahead. But without any real constraints, I don't see the benefit to building a hybrid team. But that's me personally. I want to be clear that this is something that I've started. I got the ball rolling, but I'm not making the decisions here. I just had the ideas and this is something that we all discussed together.  No, I was going to read Mike's comment about agencies are building a lot of hybrid teams and not able to go for block teams yet. Yeah, I could see potential as a learning resource. I just immediately popped into my mind a transition theme, right? That's what I'm thinking as well. Hybrid and functionalities kind of pulled away to show people how you're basically transitioning them to block themes. Rich does have a good question that we're looking to make an examples resource or themes to push to the repo. And I lean towards the latter. I think an example of a repo is a whole separate thing. And I think what this project should be is primarily geared toward putting quality block themes into the theme directory. But that doesn't mean it can't serve these things can't serve as good examples of how to build. I do worry about maybe going into hybrid themes or I'm not even entirely sure what a universal theme is. I haven't had a great definition on that. But at least this is my opinion, I'm saying we, but my opinion is I think I would want this to be strictly block themes like push the block editors as far as we can. Maybe the theme experiments repo is a better place for those kind of things. Yeah, I agree. I agree with that, Maggie. I kind of look at these as like what is the ideal WordPress experience. And that should be what we kind of aim for with each of these that we publish. That's how you would learn WordPress if you're starting with the site editor for the first time with one of these block themes. What would that look like? And start from that point I think. I agree that block themes, I mean 100% block themes is the future. But it's not what I'm being asked when people email me or tweet me or yeah. It's not what I'm primarily being asked about. It's not what people like questions about. It's more about the transition. Yeah, yeah. There is also the opportunity though to change that narrative in by example isn't there that if we start providing lots of examples of hybrid themes then that is going to increase people's sort of thinking oh this is the way to do it. Whereas if we just we put that question to one side and we just say no look these are great examples of block themes. Look what you can do with block themes. There's the whole world of possibility out there because at the moment there's really in terms of default themes there's really only two. So if we can show how many great things you can do with block themes maybe that also will start to reduce those questions because people will say oh I don't need to worry about transition. I can just live straight into this thing. It's ready. Yeah I worry about if we if we're present or that username puts out a hybrid theme it's like we officially recommend it. Exactly. We should make it easier. Yeah. Yeah it's um yeah I agree that's also difficult. Yeah I think there's uh there I do love the idea of like the hybrid themes now that we have like template parts you know in the classic with the classic templates because I think that's the transition we needed like three years ago or two years ago or whatever it was.  There might be room for exploration there. If there's like I think it's going to come down to the need of the theme itself anyway. I don't know like if there's just something that's not possible with the block editor then we it should be like it's well first of all we need like you know to file tickets upstream making sure like folks like Rich are aware and he can build out that stuff maybe for us or whoever else here is you know really working on like core stuff. But yeah I could see us doing like maybe there's a some PHP in these themes too. But yeah I'm trying to catch up with the chat too and talking so I might start rambling. Yeah so we have yeah we took like another 20 minutes or so so we we're still on good on time. I just had another thought on the hybrid thing. I do agree I think this should be focused on non-block themes. But I do think it is and maybe this because I've been just talking to agencies a lot over the past six months. I think it is important to just always keep in mind especially if the initiative of this thing is to increase adoption and to get folks building these kinds of themes. Like we're in a one world one reality of block themes and it seems like everyone else I'm talking to is in a whole different reality about block themes. And maybe it's because they haven't experimented yet they're not quite there and they'll get there. But I think even if we do make this about block themes we have to keep an empathy for those folks who whether they can they're just not interested yet or they literally can't because they have so many client projects that are wired up one way that they can't just jump into a block world and then train and their clients and their dev team that's always a big thing as the financial hurdle. And so I think whatever we do just keeping in mind that this is going to be a transition for a lot of folks and so anything we can do along the way to help with that maybe it's educational materials outside of it maybe it's you know some other kind of hybrid examples I don't know I just think it's just important to keep in mind these two different worlds that are kind of coexisting right now and how big of a transition we're actually going through with the with the folks down on the ground. I personally think that there's a reason why classic themes aren't going away. There's a public for them and there's a use for them so I don't think everyone needs to go and build block themes for everything so it's fair that they don't need to make the change if they don't want to like it depends some people can do the transition some others maybe it's not for them it's going to be a waste of money and they're not going to get anything really worth it back so. Then what you're saying about having two sizes or miss with the education resources is key but also really what is missing is inspiration if you think about it because to the early day I'm going to sign a grammar but if you think about to the early days of theming one of the things that inspired with some of their like are and creative themes and we've had a bit of that but we haven't had enough of that right and having some of that and this is personal bias maybe but having some of that as part of this I think really could be important yes there's practicals and yes there's that and there's that agency but this is maybe an opportunity to do something that doesn't have to be a default thing default thing have to have to be everything right that there's a like anyone that's working on a default thing they are not where you are necessarily getting to flex your creative everything but this could be right that's kind of what excites me is a chance to just like experiment and brew and collaborate that's kind of why I turned up and a chance to kind of do I don't know some banana Kubrick I don't know I'm going to make some old things just some wacky stuff that inspires people I feel we need that in theming just as much as we need some education a moment otherwise theming is just bananas banana smoothie Kubrick block theme that's what we need yes but we need we need that as much as we need the education because otherwise people are just going to not think that there's any creativity anymore and they're going to go to other products for creativity and that's a shame so anyway I'll go back to my grandma working chair but that's kind of what I think you can get the education resources yes we need that but we also just need some beautiful things that inspire very much agreed and that's why I want Mike to specifically design one of our these themes as he and of course we have a great a lot of great designers here so I'm actually looking forward to like every one of you like doing something and hopefully you know this will be a great project because of that and yeah so I don't want us to be too caught up in the weeds of like you know are we like you know doing hybrid themes or you know like let's just like build stuff that's cool and like just show what WordPress can do and figure out what the bugs are figure out where like it really needs to improve like that way like you know for these people who perhaps can't you know move to block themes yet or maybe don't want to because if they feel it's too limiting maybe like we really want to you know try to sell them on the idea of block things and and that's I think really what this whole project should be about but build stuff that's cool I can get on board with that yeah thanks Damon has a good question is there is like channel this initiative should focus conversation around I think we talked about that during the theme meeting the other day I think core themes project is a good channel for this yeah and it's incredibly hard sometimes to get new channels for so but that would be perfect so um quick question when thinking about like what kind of stuff to to design and go after and build might be interesting if I don't know if we have this kind of data but to to kind of look back on some of the most popular themes of the past 10 years and look at what's interesting about them what was popular and then to do like a side by side and show like okay well this is the block version of that see how we can build this and in blocks the most you know your favorite kind of theme now it's fully editable live in the site editor I don't know if we have that maybe it would just be anecdotally thinking about what themes we use in the past but I think that could be an interesting way of taking some of the guesswork out not that I don't want to explore and do random new fun things but I'm also just thinking about kind of using what we have to some degree banana smoothie anyone who hasn't actually seen that theme this is the weirdest conversation we've seen it all right so uh yeah floor's still open um yeah I think the biggest takeaway we think we need to come away with is like yeah we're doing this today right everybody's agreed we're doing this like and I'm excited about uh participating in this I maybe I'll actually get a design done between everything else but if not I will be testing everybody's stuff and playing with it because I enjoy themes and if you want I'm also happy to collaborate with folks like if you just want to design something and say hey Justin build this in the block editor feel free to do that too one thing that might be a good idea is this progress is um staying what someone wants to do to partner with another person so um in the past one of the things has been like hey I've got an awesome design and then someone just wanders around with it and never gets it coded um so if someone just wants to code awesome designs awesome say it well if someone just wants to create awesome designs just say that and then kind of partnering and bedding it up that would be kind of awesome or if someone wants to do everything then awesome go and do everything but just kind of like um opportunities for collaboration might be a good way of doing it as well to help kind of unblock or saying like hey I would actually like to collaborate on something um and doing that uh yeah so mention in the comments are some of the most popular themes are like these big uh multipurpose you know uh themes uh that kind of do everything uh there's a few pointed out like astro cadence uh generate press uh uh but I think there's also like uh Anders uh is that Anders Noran is this like how do you pronounce his last name uh like he's done some things that are very like like uh specific to like you know a certain type of industry or or he's not there haven't been uh these universal type themes there so but the designs are great and I think you can kind of carve out like an area doing like yeah thanks for the link um you know there's a place where in the community where those themes can be popular um yeah they're universal writing uh he does he does some of his are more geared toward like the written word yeah so it'd be beautiful for blogging or just long form storytelling but um but he's also there's the uh like the uh profile page like a single page thing that was really neat I think in the last year um I knew I've experimented a little with that uh Brian I think uh if Brian's still here uh has two um so yeah I mean there I think if you look at maybe like the feedback he gets and what he's done there's room for you know following our specific model um or you know follow whatever you know path you want it doesn't have to and there's a wisdom and also looking at some of the uh really super popular themes too yeah I think um looking into numbers it's a bit tricky because this is again uh the long tail things you're gonna be the the the ones with the highest numbers like they're gonna are gonna be the ones that uh do most things that are like a Swiss army knife or things uh because they are gonna reach many different kinds of uh users but then do you have a long uh a very long tail of users that are gonna use those we call niche themes are we gonna if you want to call it something else uh because they they are more specific to what they need and there's maybe as many users uh using those but they're spread out through very different specific themes a specific theme just by definition it's gonna have a narrower uh user base that doesn't mean we don't need them and we have the the privilege of not needing to cater to to cater to a specific user base we just uh design or develop to our own win so we can decide if we want to go build this uh very useful very popular theme or something that is very um unique and that does nothing like it anywhere else but we think we can do both like it's fair that we explore both avenues yeah um so we have about five minutes left I want to make sure that everyone has uh you know the ability to ask any like final questions or bring up any other uh final topics so might also be interesting to do uh themes look at accessibility things as well so it might be interesting to look at kind of readability um and just kind of explore that on the front um like uh what could be kind of different things there from what could be like the the best readability um and different things in that and when I say suspicion I don't just mean for a particular type just really just strongly accessible as well um and different things like that um and really play with the fluidity so different things like that what's like the best reading that we could do where everything gets out of its way so that's kind of what I mean by just kind of experimenting as well it doesn't have to be like some wacky color combination with some wacky art stuff it's really experimenting with form and function yeah great uh uh just kind of go make sure we get the questions uh how do we assure that themes are updated that's a great question uh there from the chat that's another reason why having all the themes in the same group it's a good idea uh it keeps the conversation all in the same place I mean there's like a block update and all the themes updating on the markup we all we can do them in batches so they all get uh updated at the same time I guess that's uh there's no uh straightforward answer to that we can we should uh strive to keep the themes updated but as you know we have had the four teams except for one year since 2010 right and yeah the default teams do not get updated yeah we have bug reports for well basically all of them at least a couple per week there are three or four people triaging and doing pull requests for these themes it's not enough I do not want this to be prioritized over the current default teams at this point and I do not want this to be abandoned either because I feel like jave fun experimenting and but now my team is published I was going to be responsible in six months when there's a core update and yeah the block might not work anymore this is incorrect and so on yeah I uh I don't think we have that figured out yeah and I think it that's uh not just specific to updating themes there's like that some administrative tasks there that we need to figure out um because that's that's just part of the administrative stuff um I don't have any answers for that yet um yeah but I feel like the more people we have involved these years is to kind of kind of do that um but once you get to like 10 15 themes or something and then a four press makes a major change to like a block that's using every one of them then you need to update everything so um so how much I think is a question of how much updates are we talking and that might be like the walls and also if someone feels ownership of something then they will be more of a life gets in the way so we also have to respect that people's lives change and situations change people are helpful to hide my full time job isn't this anymore so everyone has different jobs that do different things right like have hobbies and do different things um but I think rich just added a little comment which I had to agree with uh one of the things is like if you remember old things yeah the maintenance burden was a nightmare that was one of the whole reasons for the whole new idea of themes right so uh we shouldn't be having huge maintenance burdens otherwise we should all go back to poor and be fixing things so that we don't have a huge maintenance burden so part of that is this right so we will do some way we shouldn't write css for these themes so we don't have to maintain it yes okay but that also blocks us from having some fun and we will get there but we can have fun and I lost my hand um so one of the problems with 2022 and 2023 right is that they are required to be backwards compatible but with these themes I hope we know a little bit more freedom so that we can actually have a minimum required workers version no yeah no no backwards compatibility I'm thinking about for example 2022 still yeah I remember the old commerce form block I remember we can't remove it we're going to be stuck for that I remember yeah not the case yeah okay good that's going to block us for those themes yeah yeah I would agree wholeheartedly that we do not need to be backwards compatible with this project all right so yeah uh I think uh when I we published the uh show notes we will probably need to bring up a question just an open question about a little bit around administrating updating and uh and so on that that needs to be a discussion that happens um because yeah we all want to do it but who wants to like you know do all the boring you know parts you know or you know the less the less exciting stuff um all right uh we are out of time so I just want to say I appreciate everyone who came today and joined uh great feedback from everybody a great discussion and I look forward to you know many more to come uh Maggie do you want to share any final thoughts uh thank you so much for being here it means a lot that you're all excited about this idea um hopefully see you soon in the repo all right bye bye


Everybody forced here ripping 2022 playbook football hobby eight bucks half case number 34 great. I'm team style I'll leave the results on screen for another moment here The results link is currently in chat. You can always find them at latent sports cards comm as well results quick link bottom of the website so Let's sell it's full shield. It's full shield. Let's make this one well worth the wait With the bangles you're hoping for like low numbered chaser burrow I think burrow might have just a very few bit of autos in this I'm not mistaken, but you're hoping for vets with the bangles Maybe But yeah, I hope for something low number like that Bangles are tough to hit with but if you do hit with them, you could hit pretty well if you know what I mean Just because they have no rookie Jersey carton 99 Justin Fields bears are like a rookie that would have been a lot of products burrow has an auto 5 Yeah, see that's that's a That's a tough one right there Justin Fields Jersey to 99 for the Bears your book there Lions with the Jamo nexus dual Jersey rookie to 99 James and Williams Nice lanes boy Micah Parsons hash mark signatures 122 of 199 Cowboys And Cardinals the 99 Trey McBride on the RPA booklet three color patch Zona with the first book careful Donnie careful Donnie You're gonna break the ice What do you do? You really have like a plastic camera We'll see you just you gotta break the ice. Oh, thank you for the in-depth description To 49 George Pickens rookie to color patch card for the Steelers. Oh You mean break the ice to you break the ice break the ice. Oh, okay. Yeah Like this falling over is like makes me think of it never played You should play crash bash though. Should Rhino Cunningham down and dirty game use patch card is 75 Eagles Me a late game. I thought the Panthers in Keynes is over. It was What's quack talking about that may have a replay? I guess game use Cowboys again on the hash mark signatures to 75 this time Travis Frederick Three over times Wait, what Donnie? Oh the goal was not a goal. Oh, I know. Oh, Donnie. Oh, Donnie I Did I just assumed it was a goal? Oh, Donnie David Bell the 299 on the rookie patch on a book for the Browns That's uh, that's pretty brutal. Oh my god. That's a rookie mistake by Donnie That's a rookie mistake by Donnie We'll only dock his pay a little bit wait For change the channel It was pretty crazy That's a whole extra game, I know Everyone's gonna be so tired nightmare times that means you just play hard or hard like okay We only got to get a win out of this at least Wanda Robinson said 99 rookie patch Giants Right like if you don't get a win like you just feel like you just wasted a game exactly quack You know what it is Got a rookie jersey Damian Pierce to one 99 for Houston. That'll be a force's next compliment next week Yeah, but yeah Thursday has been been done for a while now, so there's no more compliments only critiques Alexander Madison goal line graphs the one 99 Minnesota critique Friday Yeah, we've seen longer Vaughn remember 2018 World Series game Four no game three you remember that I was a long game Lightning blue jackets five over T. Yeah, that one was nuts Kenneth Walker the third Seahawks RPA book two out of two ninety nine You go Seahawks. I remember that I don't remember that one Jason Kids falling asleep in the stands. I don't blame him dude Been there for how long now what time the games are like 730 and it's like five hours Patch card Pats to 99 is a Devonte Parker Pats legend Devonte Parker. I might add Gotcha, they've been there for four and a half hours. It's a long time man got an auto Devonte Williams Broncos sauce gardener rookie auto to 15 jets nice hit jets and a Josh Allen to 49 on the game of inches dual patch book card with the hurdle With the hurdle over Eric Reed. That's ridiculous one patch card is 75 Marquise Brown Cardinals Rams Cooper Cup hot routes patch card to 199 And that's that's a name right there goal line grass at 25 Panthers Jonathan Stewart auto That's a name right there Jonathan. So remember him and D'Angelo Williams together on the same team And Kenneth walk at the third again to 299 on the RPA book Seattle two of them now Yeah, those guys are a great combo. What's another great running back duo what you guys can think of just starting name There for a brief time there was Priest Holmes and Larry Johnson in Kansas City remember that maybe not super dominant But AJ Dillon and Aaron Jones It's pretty solid for current day, yeah Are you just me like a general general Josh Allen patch to 25 for the bills Sunday best three color Yes, yeah, it's who books is kind of wild the same player same parallel Travis Kelsey Sunday best jersey to 99 for KC. Yeah That's pretty good Michael Turner and LT. That was really good too. That's that's a good one right there And the Michael Turner was like I can do it on my own and then I never did Seahawks Doug Baldwin on the auto to 49 other goal line graphs cool vets Yeah, it was good when when they both literally like top 10 fantasy running backs craziness man and Derwin James jr. 249 Chargers for color patch auto book nice vet nice vet book Thurman James. He was all pro last year, right? Justin Jefferson patch to 25. There you go Vikings. Come on camera. There we go Jay Jedis rookie yearbook Jersey card Malik Willis the 99 Titans Bucking ears Shaquille Barrett hash marks out of the 25 Shaq Bear to go and David Bell the 299 Browns on the RPA book. We go David Bell Browns All right, last one come on shield time. Who would you guys say is your favorite player in the NFL? Necessarily have to be like crazy stat wise. But like who's yours Donnie you start mine right now. Mine's JJ He does Really even as an eagle fan. I just I like I'm a wide receiver Like first Jersey Carter won that and I'm rookie care Wilson Jets More like an unbiased thing like hurts for my second dude Ricky Williams Ronnie Brown was legit. That was legit Mike Evans is quacks Vaughn's is Aaron Donald Aaron Donald is a good one. Aaron Donald is a really good one Falcons Rookie patch Drake London to 75 on the jumbo there three color So I get pretty much like a big number. I would I would assume there Here's the name. You really don't see that much Dorsey Levin's goal line graphs at 99 Green Bay five miles gear it to I like all these guys And Trey McBride the 299 Cardinals rookie patch out of book second McBride as well So a couple teams doubled up on the same player same style too, which is crazy. Give me a sec Everybody will do a quick recap here I'm also doing the brakes Excuse me either quack me either I mean it's on now At least we're gonna skip the first two over time score a damn goal now We can watch the sudden death third. Obviously, they're all sudden death. Well, yeah, it's up to the third one all right relics of Drake London Garrett Wilson a Malik Willis Justin Jefferson Travis Kelsey Josh Allen Cooper Cup Hollywood Brown Devonte Parker as a Patriots Damian Pierce Wanda Robinson game used down down and dirty is Cunningham for the Eagles George Pickens Jameson Williams Justin Fields autos now we had Dorsey Levin's a Shaquille Barrett to 49 Doug Baldwin Jonathan Stewart to 25 for Carolina Saw Skarner rookie to 15 good hit for the Jets Javante Williams Alexander Madison Travis Fadrick and a Michael Parsons RPA books of Trey McBride David Bell Darwin James jr. Patch out a book to 49 for the Chargers Kenneth Walker the third Josh Allen dual patch book another Kenneth Walker the third Another David Bell so to David Bell's to Kenneth Walker the third's in two Trey McBrides Geez, all right, well that'll do it. Thanks again everybody


Hey, everybody, it's Brian and in this video, we're going to talk about directories, specifically Q Durr. Funny name, Q Durr, kind of sounds like you're making fun of somebody. But remember, in Qt, everything starts with the letter Q and then after that is a self descriptive name of what's going on. You notice how I'm covering up the Q with the cursor. So it says Durr. We're talking about directories. We're also going to touch on file information and file information lists, which you guessed it just contains a lot of information. If we highlight Q Durr and hit F1 brings up the internal help system, which says the Q Durr class provides access to directory structures and their contents. And this is a pretty intuitive little class. There's not a whole lot of mysticism to this. It's just very straightforward. There are a couple little gotchas though. Now, speaking of directory trees, I'm assuming if you're watching this video, you have a vague concept of what a file system is and what a directory structure is and things like that. So this is my file system on a Linux box. And you can see it has folders and files in each folder can have subfolders and other folders and files and so on and so on. That creates a directory structure or a directory tree. Quick segue. Speaking of trees, this is an actual headline for my local newspaper here. Only in Michigan snow today, flirt with the 80 degrees tomorrow and frost again later in the week. What? Yes, this is Michigan. This is where I live. I don't know why I live here, but this is where I live. Anyways, because the temperatures all over the chart trees do this thing called a pollen attack. And I have to apologize. I'm very sensitive to pollen and I have asthma. So when the trees do these pollen attacks, yes, when I when the trees attack, I'm just miserable and I have a hard time breathing. So I may have to stop the video. I may have to edit it heavily. You may actually hear me cough. And I'm coming off of COVID-19 vaccine modern era shot number two. And I'm going to just be brutally honest with you. That shot beat me down. I was dead sick for days and I'm still not feeling 100%. I'm actually I can feel I'm losing my voice. But regardless, the show must go on, onward to creating tutorials in the magical land of kittens and unicorns. All right, we got to start somewhere. So let's find the current folder. I've got this little function here called test current. And this is going to be a little bit confusing, but I'm going to try to explain it in a very down to earth language. All right, so we're gonna say Q info. And we're gonna go Q dirt. Current path. Now when you see current path, a lot of people will tell you, Oh, this is where your applications installed. No, incorrect. This is your application's current directory. And yes, usually, current directory is the directory in which your application was started from, but not necessarily. This is the directory that, well, basically, your application says, this is where I'm going to start from, it could be your current directory where the application is, it could be something the user supplied, it could be something the operating system supplied. All right, so you may ask, how do I find where my application is, see this Q core application application dirt path returns the directory that contains the application executable. So those are the subtle differences. Don't get hung up and think current path is the current path of your application. Instead, you'd want to do Q core application application to her path. Like I said, super confusing, but I think we explained it pretty well. Now if I save and run, you'll see this out on the screen here. Tada, the absolute path absolute path means it's going to start at the very root of this and build the whole path out no hidden file names or anything like that. And this is where we're running from right here. This build QT six E man, I maybe I should change my naming convention, but that's a very long folder. If we wanted to, we can actually go out to the file system here and see, there it is, there's our executable on windows, you're going to see a dot exe. But there it is. Pretty interesting. Now, there is a different way of doing this. And I just want to for completeness include it here. So I'm going to say Q Dur, Dur, and I don't often say Dur, but sometimes I think I sound like I say Dur quite a bit. I actually hate the sound of my own voice. And I don't know why, but maybe it's just a me thing. We're going to say dur dot absolute path. Now you notice how there's an absolute file path, and an absolute path. What are the difference between these two here? So absolute file path, notice how it's got this, give me a file name.  That's another subtle gotcha. Just wanted you to be aware of that. Let's go ahead and save run and see what this looks like. And they should be identical because we're basically calling the same thing two different ways. It's super easy to work with once you wrap your head around it. Remember, when you get stuck with this class, because you often will just highlight cue dur on the screen and hit F1 and you have the entire help file right at your fingertips here. Okay, anybody who's watched my previous videos know I like to take the training wheels off as fast as possible and just throw people right in the deep end. And that's exactly what we're going to do. All right, what we're going to do is we're going to list things recursively. If you don't know what recursive means, let's just say we have a folder, we're going to start here. And we're going to list all these things. But if it's a folder, we're going to jump into it and list those things and if we find more folders, we're going to jump in there and jump in there and just keep going and going and going until we run out of folders. That's what recursive means. All right, this is not for the faint of heart, but cute makes it ridiculously simple. I'm going to say cue dur, root. And one of the constructors for a cue dur is we can give it a path. So I'm going to just take the path from our parameters list and notice recursive is automatically false. We're going to switch that later. But we're going to give it a path. And now we need to, you guessed it, make sure that exists. So I'm going to say, if not root, I could spell root. I did tell you I was having trouble breathing exists. Then we want to kindly hit the eject button. But before we do want to tell the user, Hey, something bad happened. We say Q warning path not found. And then let's just super convenient. Give him the path. Now, why do I do this? Because we're passing a string and we don't know if this thing actually exists. What if the user just hands us gibberish, or what if somebody copies and paste this function to their program, and they have an invalid path and they think the problems with the function and the reality is the path just simply doesn't exist. So it's always good to do a little bit of defensive programming here, just to make sure we've got some good data. Now, what we're passing to this is actually our current path. Now, remember, this is the application's current directory that current directory may or may not exist. That's why we got to be a little careful. Now, this is where things are going to get really murky, really, really fast. And that's why I wanted to cover this section. If you go to the help file for Q Durr, you say, I just want to print the contents of this folder. I want to know what folders and files are in here. And you just go, okay, scroll down. Well, let's start at the top. I don't see it. I don't see like a children or a files or a directories or anything like that. It just doesn't seem to be in there. Okay. Everything else is pretty self-explanatory, like make Durr, make path, refresh, remove Durr. But there's no, like, give me a list of files. But then you stumble across this right here, entry info list and entry list. This is actually what we're going to be working with here. So entry list will return a Q string list or a list of strings. Entry info list will return a list of Q file infos or more appropriately, a Q file info list. And this is why people get just horribly confused when they start working with this. We're going to work with entry info list. And it says returns a list of Q file infos. Ah, enter in this stuff. Q file info. Q file info is a class that provides system independent file information and it has pretty much anything you'd ever want to know about a file. Is it a file? Is it a folder? Is a symbolic link? How big is it? When was it created? So on and so on. I mean, I love this class. It's amazing. Now think of Q file info list as a Q list of you file infos just with a snazzy name. Ah, boy, that is confusing. All right, so let's go Q file info list. Let's just simply call it list because I like simple. I'm going to say root dot. And remember, we've got the entry list, which is a Q string list. Strings are useless to us. We want an entry info list. Aha. Oh, no. complexity. It wants filters. Well, I don't want a filter. I just want to list everything. But there's a problem with this. If we go into it and we say qder filter, and we just look at the filters, you'll see, ah, all there's all entries. That's exactly what I want right here. But let's just scroll down just out of curiosity. You see this. No dot. No dot and dot dot. No dot dot. What is this? It sounds like a foreign language. This is almost comical. This was so confusing to me when I first started Q. So if you don't know what these are, it's actually, it's a part of your file system. Let me explain. I'm going to open up a terminal here and I'm just going to say print working directory. I realize some of you watching this may not be on Linux, but basically this is the directory we're in home root shell. Okay. So if I say change directory and I go to dot, what happens? I'm in the same directory. So dot is simply your current directory. If I say CD dot dot, what happens? Notice how the folder name changed. If I say print working directory, I'm out actually up one. I'm in the home folder instead of home root shell. So dot dot is the parent folder. So this is what I mean when no dot. We don't want the current folder and we want no dot dot, no parent folder. Now this is why it's confusing. Why don't you want these? Think about it. If you're doing it recursively, the first thing you're going to come across is dot yourself.  And if you somehow got past that, you now have the parent folder. So now you're going to scan yourself again and then come to the dot again and it just gets horrible. So we need to do the no dot and dot dot. And if you're still confused, just trust me on this, just do no dot and no dot dot. Sounds like something an Ewok from Star Wars would say. But anyways, now we want to go filter and you don't have to do filter, but I'm just putting it in there so people know where it is. And we're going to say all entries. Yes, you could say only directories or only files, but I want all of the entries. I want to know everything. Now that we have our list, we can simply work with it here. So I'm going to say for each. And of course, there's different ways you could do this. View file info. Let's call this f I in our list. And this is where the beauty of copy and paste comes in here. I'm going to do a little smidge of copy and paste just to save a moment of typing here. So what we're doing is we're just printing out a bunch of these little dashes. We're going to say the name and then the file info file name, file path, absolute file path, the birth time, which is actually when it's created. You notice we're doing a two string because that's going to be a Q date time. The last modified and the size. And then we're going to say a type and initially unknown. And then we're going to say if it is a dirt is a directory, do dirt, otherwise it's a file. And there's other things like you could say, is it a symbolic link? Is it a file and so on. When in doubt, check the help file. And then last but not least, I'm saying if recursive our little bull right here, then go ahead and recall this function using the file info absolute file path, meaning it's going to say if it is recursive, go ahead and rescan it. And if you wanted to, you could take this a step further and say if recursive and is a directory that we're not trying to recursively scan a file. All right, let's go ahead and let's test this. Now the first run, we're going to have it recursive false because false is the default here. Right here, maybe my mouse would cooperate. Save and run. Let's see what this looks like here. And you see, we're getting a lot of information here. Now, let's see what that looks like if we do recursive, save, run. Let's see what this looks like. If your guess we're going to get a lot more information, you are absolutely correct. Now this is one of the caveats with recursiveness, you have to be a little bit careful because you're going to go through everything. So if you did this, say at the root of your file system, it's going to go through every single folder on your system. So you gotta be a little bit careful here. Let's just jump right into the volcano here and see how crazy this can get. So I've got this function called test modify, which we are going to handle a qdir called root, meaning we're going to just say qdir current notice current path is a q string where current is a qdir already created and ready for us. So let's just dive in here. And I'm gonna say if root dot exists. And notice there's two different ways of doing it. So of course, the roots going to exist because it's current directory, but I want to see if a sub folder exists. And I want to see if that folder is named test. If that exists, well, I'm going to just hit the eject button because someone else is doing things on my computer, and I don't want to screw them up. Test folder already exists. Let's save and run and see what happens here. So no errors. So pretty safe to say that folder doesn't exist. Let's go out there and check it out. So I'm going to go to code and then right in here and to not know test folder, I'm going to just minimize that for now, we're going to reference back to that folder throughout this little section here. Now we're going to make a directory. Let's say if root dot mkdir. Notice how there's two different flavors mkdir and mk path these do two totally different things. mkdir will make one and only one directory in the current folder. mk path will make an entire directory structure. And what I mean by that creates a directory path. The function creates all parent directories. So if you say something like test slash a slash B slash C, so on and so forth, it will create all of that for you, but it does it very unapologetically meaning if it screws up, it's just going to try to keep going. You got to be a little careful using make path, but I don't want to deter you from it. We're going to use mkdir. Now what does mk stand for? It stands for make. If you're used to the command line, especially the Linux command line, that's exactly what it does. It's just going to make a directory. All right. Now that we're in here, we're going to make a qdir and let's call this dur and test. Wait, did you just see what happened here? I didn't have to give it the absolute path. I don't even know what folder I'm in at this point. I'm just going to say, Hey, take our current directory and make a sub folder, or I should say make a qdir pointing to the sub folder test that we just made. Whoa, that gets kind of confusing for newbies. But basically when you don't see a path, just think cute is going to do this in the current directory where we currently are. All right. Now that we've clarified that, let's go ahead and just do a little copy and paste. Tada. Double checker folder. There is no test folder in there. Let's go ahead and save run, see what happens. We created now suddenly it knows the absolute path. That's one thing that you're going to actually come to enjoy about q is you don't have to know the absolute path, but you can still get it very, very easily. All right. Now that that's in there, if we rerun this because we did this check right here, it will not progress. See, test folder already exists. Go ahead and wipe that out for now. Now inside here, what we're going to do is we're going to rename that folder. So I'm going to say if root dot rename, not remove rename. There we go. Test. We're going to rename that to S2. Now notice that's going to return a bull. And sometimes that can get a little tricky figuring out why that either doesn't work or seems to work, but doesn't actually work. Usually it's some weird thing with the OS, but 99% of the time it will just work. Now I'm going to copy and paste a little bit of gibberish in here. We're going to say we renamed it Durr absolute path, but we're also going to check to see if it exists. See something interesting happens here. We have Durr up here that's pointing to test. We're going to go to our route and rename test to test to. So drumroll, do you think Durr is going to exist or not exist? And let's double check. There's no test folder in there. Let's see this thing work. It's magic. False. It does not exist. Oh, oh, that is brutal. So you notice how it says renamed and it's now pointing to a folder that doesn't exist.  And that gets a little bit scary. So when in doubt, if you're going to do some sort of operation like that, you should always check for existence. So say if root dot exists, that's two. Then go ahead and do something. Now, another little caveat here is every operating system is a little different. Some are case sensitive like Linux. So there's a difference between upper case test to and lower case test to you can have both of those folders. And on Windows, I believe it's not case sensitive. So there could be one and only one. So root dot exists, is this test to then we're going to go ahead and say if root dot exists, or I'm sorry, RM, there, which is shorthand for remove directory, you'll notice there is a remove and remove recursively. Those are two different things. This actually works with files. We want the RM or removed or and remove path. Now remember path is not a single. And you gotta be a little careful if you were to do a RM path. So this function will remove all parent directories in the dirt path provided they are empty, as opposed to make path. Notice that they have to be empty. Oh, that just will drive you absolutely crazy. There are ways of doing it. But it's really bad practice to just wipe something completely out. We're going to say. RM, there. And we're going to wipe out test two. Now looking at RM, there removes a directory directory must be empty for RM there to succeed this consider this a safety net. This is a safety net because if you try to remove a directory that's got files in it, it's going to say you may still need these files and it will return false from here. You guessed it. We're just going to say if we fail to remove this, then let's go ahead and queue info some stuff out, just letting us know, hey, we were unsuccessful in removing that. So let's go ahead and get rid of test two. So now we're going to load this up. We're going to create tests, rename it to test two and then delete test two. That says false on the screen. But if we go out here, sure enough, it's gone. Reason why it says false is because our queue dir, this little guy is still pointing to the directory that does not exist. Be a little bit careful when you're working with queue dir because as I pointed out several times and I know I sound repetitious, you can absolutely point to directories that are complete gibberish and don't exist and will never exist. So you have to be a little bit careful and make sure to check for existence before you try to do something with it. I hope you enjoyed this video. You can find the source code out on github.com. If you need additional help myself and thousands of other developers are hanging out in the void realms Facebook group. This is a large group with lots of developers and we talk about everything technology related, not just the technology that you just watched. And if you want official training, I do develop courses out on Udemy.com. This is official classroom style training. If you go out there and the course you're looking for is just simply not there. Drop me a note. I'm either working on it or I will actually develop it. I will put a link down below for all three of those and as always, help me help you smash that like and subscribe button. The more popular these videos become, the more I'll create and publish out on YouTube. Thank you for watching.


So, everybody, my name is Paul Vocio. I work at Rackspace. I've been there six years, joined in 2007. And I worked on the Slicehouse product just shortly after the integration. And I've been working on, we started on open source Zen, and we transitioned to Zen server shortly after for primarily the Windows support and a lot of the performance stuff. So, what we're going to talk about is just kind of our internal infrastructure on how we kind of build and run a public cloud, talk about how we deploy and some of the challenges that we have in doing this at scale and kind of what's coming and what we're expecting and some things we hope to see out of the Zen project. So, the way we deploy our cloud is we actually have an internal cloud. We call it INOVA or internal or infrastructure.  And so anyone, actually they authenticate with the Keystone auth system, get the token and then present that. And then it's really just an OpenStack deployment. So we don't do all the public facing features that we get, but it's more of a vanilla OpenStack install. So, for all the same reasons that everyone wants to do this on the public cloud, we offer it to our internal customer. So easy spin ups and down, load balancing, testing, load, spikes, stuff like that. And we also actually do this to boot our public cloud. So I'm gonna go into this and show how it works. So we actually have this internal cloud. We boot all these services that become our public cloud. So when you're talking to an API endpoint at Rackspace, we're actually talking to a VM that's running on Zen, which is controlled by OpenStack. So I'll kind of show how we do that. And a lot of other reasons we want to do this. So how do we react to down hosts? We can migrate services around. It's just all the same benefits. So we have what we call just kind of a seed environment. It's just a generic term. But what we do is we take a Zen server and we boot a single VM on it and we install all the OpenStack services. So here's the API, the scheduler, the kind of non-scalable things, the database, the queue, and then we kind of package this up into kind of a golden RPM. And we take that RPM and then we kind of shove that into a Zen server. So we download that and boot it up. And this kind of one box and this one VM becomes the way we interact with it. And what we do is that one VM actually then we install the compute using that same mechanism onto a bunch of other Zen servers. So each of those Zen server hosts is running a VM that runs the OpenStack Nova compute service that does an interaction. So that single box up top is kind of our seed host. All the ones underneath that are running are now become part of the cluster. So this is kind of what we, when we bootstrap, we have a five to 10 nodes that get us off the ground. And then from there, we actually start provisioning more hosts. So from here, we're interacting with us just like an OpenStack cloud. And so my engineers and the admins and everyone who's building these just start provisioning services, configuring Puppet, kind of doing everything you would for normal kind of web app deployment. From here, these actually become our kind of just generic, what we call units of capacity. A unit is what we kind of quantify as 256 megs of RAM. So this becomes our capacity to go boot things. And so we actually split this up. Our I know environment is shared by all our internal projects. So everyone that's kind of runs an OpenStack or a public service or even a lot of internal dev and test services run in our I know environment which sits next to the same VMs that run our public cloud. So a public cloud API endpoint may be running next to someone's internal test rig. So we use our public cloud like we do our internal cloud like people use our public cloud. So you have dev and test and kind of mixed everything up in the same environment. And we do our best to kind of do performance isolation in the segment. So if you see somebody swapping, we'll start moving stuff around like we normally would on our public cloud. So those units of capacity become our total available capacity. And then from there what we do, I mentioned that we can kind of blur our dev, pre-prod and test environment. So we actually start provisioning more of those API nodes and this is what it ends up looking like. So this available capacity box right here is what we would call I know that no one ever sees except us. And then the public actually talks to our production API endpoints down here. So that's just a little bit of at a very high level on how we manage and deploy this. And then like I said, these become our dev staging and production nodes. So one thing I learned coming to Rackspace. And I kind of grew up in the small startups where at scale for me coming out of a startup was a couple hundred machines. And I thought that when you manage a couple hundred machines with two or three guys, we were being very efficient. We were doing things really well. Rackspace kind of changed my version of scale. And so when we came together and realized that we really wanted to build OpenStack and we really didn't want to do this again, we kind of set our goal at, our internal goal is a million hypervisors. We want the system to, when you move forward and you really want to think about, I never wanted to design this again, what do we want to think about? So we set our kind of internal goal at a million. So as a global cloud, we want to be able to manage hundreds of thousands of hypervisors. And so as we realized, we have to break these down. So we break these down to the region and then our cell into an individual hypervisor. So we deploy things in chunks of hundreds and thousands of individual hypervisors, which kind of gave birth to the cell concept, which we can cover shortly here, but it's something that we kind of had been running internally and then kind of brought it into the OpenStack community as a way to manage clusters of machines for whatever boundaries. So layer two network boundaries is really what we kind of designed ours around, but they could go as wide or as small as you wanted. There's really no constraint on how big a cell is. So it's whatever your, people do it can do it by cabinet or by hardware clash or whatever. We chose layer two boundaries within our network. So our normal deploying release strategy isn't that different than anyone else. So we pull trunk down, we kind of package it, we push it out to a test environment and then we iterate over that. The difference is we do this from trunk. So we don't wait till the major milestone releases or even the big six month releases. We do this every day. And there's a lot of challenges involved in that. And so I kind of equate this to the faster you wanna get to the speed of light, the more energy you have to get to do there. So we have to devote a lot of engineering people and time and resources into keeping us close to trunk. So we pull trunk down, we get all those new bugs and new things that people have fixed that go break us. And so when we pull these down, something that we thought was fixed or something was working is now broken. And now this pushes our deploy window out until this gets fixed or we have to decide is this a blocker or not for us to do this. But I think the advantages for this is we get features and we get fixes very early. And so we are usually a couple weeks behind trunk and that's how long it takes to kind of wash through our system. But I think the advantages that we've seen are good for us and good for our customers. So but usually by the time we hit the summit and the code has been cut and released, we're usually already on it. We put a lot of effort in trying to get the most current release out. So we're gonna do our best to be on the Ice House or at least when we hit the November summit. So when we talk about deploying and again we talked about scale because a lot of the OpenStack components don't work well if they're out of sync. You can't run a compute on a forward version and some of the stuff going forward and backward. We have to get everything else out as fast as possible. So what we kind of see is the number of deploys that we were able to do over our time period. And so we kind of hit a stopping point in February of this year when our scale got too big and the time it took to deploy ran too long. So because, and we used Puppet and we couldn't update the Puppet manifest and it kind of lazily checked in and updated its package, which meant it's now out of sync with the messaging library that's using the RPC go to the far side. So it was kind of an all or nothing type upgrade. So what we ended up doing was moving to a, we were doing Debbie invert packages. So we realized one of the ways we could get around this is just by doing a small virtual environment. So we actually started shipping the libraries and the code and the Puppet manifest all with it. So this kind of cut down on some of our pre-stuff because what we actually do is more like a fabric type deploy. So we'll push everything out and then just resim link it when it comes time to it. So we're actually moving packages at deployed time which saved us a ton of time. And we actually use BitTorrent to deliver a lot of these. So this was kind of a no brainer when you go back and look at it. But at the time, you know, we'd built everything using PSSH and SCP and kind of custom scripts to move everything around and the Torrent actually cut it down by a number of hours. So we're actually able to pre-stage using Torrents. This, an interesting challenge for us was also because of our, we have a fairly flat network and it goes very wide. And so what we ended up having to do was kind of segment this up into multiple seed Torrents coming out of cloud files. So we're able to see serve Torrents out of cloud files, push this across our clusters as long as you're not saturating firewalls. This works very, very, very well. And again, we moved away from a centralized Puppet Master to a Masterless Puppet because I said our updates happen very fast. When everything would check in over Puppet, we're basically DDoSing these Puppet Masters. So we would have to scale these very wide for a very short amount of time, assuming it all worked. If it didn't, then you'd happen to go back and kind of hot patch these certain particular ones that didn't check in. So moving to the Masterless Puppet, coupled with Torrents, coupled with our being able to push this ahead of time made these things go a lot easier for us. So how do we adapt for scale issues? So upstream OpenStack, what we're trying to do is work on more specific use cases on how we do this. So more particular testing around Zen coverage and Rackspace use cases and more production like Dev environment. So the DevStack environment is what's used to kind of gate a lot of the check-ins and that's not necessarily, sometimes the best way to gate how we check-in. So we're looking to get more production type loads either at scale and then again, talking about database and code manager. So something that works really well for 60 lines in a database, 60 rows, doesn't work well for us when we have 60 million.  So something that ran very quickly when you checked it in through Garrett migration for us will take hours. And so we have, by staying up on trunk, we actually realize these are coming and then have to kind of mitigate. What we really like to do is move that step, one more thing, one more process upstream to where if you have large data sets, you run a migration, you know that it's going to work or it's not ahead of time. So we're not having to kind of scram on the backside and kind of struggle with once we've already had the code land. And then we still want to stay close to trunk. I think that's a big benefit to the community because we catch things, hopefully before they go into production, sometimes they slip through, but by having a large system running trunk at the edge of what we do this, I think is very beneficial. So talk about some of these. So we get early detection of codes and issues and we actually found it much easier to do smaller releases. So this is agile-ish in that we do this every couple of weeks. But by not waiting six months before releases, we're not getting these huge three-day never sleep deploys, which nobody really likes doing. So we try to do deploys in all the regions every couple of weeks. We'll take our smallest DC, roll that one first, let it bake, that one looks good, then we'll roll this across the others. What we'd really like to do, and I think some work is underway to do this, is upgrade ourselves at a time because we have dozens of cells with tens of thousands of hypervisors. It really becomes difficult. It's going to get difficult for us to roll an entire region in a night. What we'd like to do is be able to deploy small sets of machines throughout the night or have these roll through to where they can handle different message formats or if a database migration is run, being able to take the data from one column and migrate it to the second one. And on the next deploy, then you deprecate the first column and roll forward. But database migrations are really what holds us back from a lot of this. So some of the things where we'd really like to see this go. So IO scheduling for some of the VHDs, I know this is being able to detect swaps. And so instances that are swapping affect other tenants in a multi-tenant environment. And so when we first got on Zen server, a lot of the multi-tenant protections that we see now really didn't exist. I mean, a lot of the stuff that we had to go bake into it is doing macros spoofing and a lot of tenant isolation and a lot of things that it, I think the product was built for mostly use in a particular, let's say corporate environment where you semi-trust each other and you had a single administrator doing this. And that makes sense.  And so we had to buckle this down really hard. And so one of the things that causes a lot of users, a lot of grief is someone would buy the smallest instance possible and really try to squeeze the most performance out of this. And what you would see is that disc would start swapping really badly because we haven't allocated a lot of CPU or a lot of RAM to them. And so that swapping would therefore affect other users on that same box, which is having to take up CPU time and IO time. And so being able to isolate those tenants on a disk partition level would be really key for us. And getting better VM resource usage. So I know that there's some R&D graphs kind of baked in under the hood, down in Zen server, and we'd get very kind of weird results from it. Sometimes we would pull for bandwidth and we'd be doing a couple of megs a minute and it would spike two gigabits and then spike back down. And because we were testing, we knew we had never sent this. So we ended up having to kind of reinvent our own kind of metering and billing around that. So that was kind of a hard point for us. So just a little better kind of monitoring and introspection on what's going down, kind of under the hood would be good for us. Zappi calls in Zen store, which has been a big one for us. So I think KeterBear was talking about people SSHing in and XMing or XE or XL commands. Yeah, that was good, we did a lot of that just because some of those commands aren't available over Zappi. So we would kind of look at the documentation and realize you can do some stuff on XM but you can't do it on Zappi. And so you're gonna have to kind of split our API calls. Some we would do over Zappi, which we wanted to for the session persistence, but somebody would have to fall back to SSH, come in and twiddle something and come out. So we ended up having this kind of fractured library, which was kind of a mess to maintain. And the upgrade experience has been a battle for us. So we're running probably a, I don't know, half a dozen different Zen server versions from 5.5 all the way up to 6.2. And I think 6.2 is the one where we finally get the live migration. So we're very, very excited about that. Just for the idea that we'll be able to distribute a lot of, you know, we see a hot tenant or someone doing a lot of load, we can move them, isolate them on tour of their own box or upgrade them where they don't notice. And so with this coming out, we've got some new DCs rolling out, we're looking forward to making use of this feature and kind of experimenting with it. Seeing how much it will improve the experience for the customer and that we're able to move them around or give them better isolation or better experience and they won't know that they're being moved. VDI introduction for new VMs. So this was something that we noticed instead of how to do an SR scan, we can just tell it, hey, it's there. And I think incremental backups we talked about. And I think some of this stuff either, so we're on Zen server 6.2. We've kind of been experimenting with going to or towards just OS and taking the packaging from the Zen project and building on top of that. So we've been working with these guys and some of the guys over in Cambridge on how this and we're very interested in how this is gonna work. Something we've been trying to work with for a while, but it seems now with the foundation coming out, we're finally had a good time to move forward. It's kind of been the open instead of trying to figure out how to do this just by ourselves. And I think we've been working with them as well and trying to virtualize the whole open stack experience to make this work better well. So we've been working with open stack guys and with the Citrix guys on how it can virtualize this and move the sword. Push the testing from inside the walls of specific companies actually out to the open to where use cases that we see in the real world using this under heavy load get tested before they kind of slip in downstream. So that's all I had. Anybody have any questions? I just want to thank you for your time. Anyone have questions? Well, thank you Paul. Sweet.