It's not strong. If you crossed Legend of the Mystical Ninja with Smash TV and a dash of Perodius, you'd get the two Paki and Rocky games developed by Natsume, and if that sounds like a bizarre combination, that's because it is. The Japanese title of this game is probably more telling since it translates to Mysterious Ghost World, The Riddle of the Black Mantle. Nowadays, that sounds like a title of an indie game somebody slapped together in six weeks, but back then, I mean, nothing had a title like that. This series started as a Japanese arcade game back in the late 80s, eventually getting ports on several home computer systems and the PC engine. There is a standalone Famicom game as well, the title of which translates to The Story of the Angry Waves. I don't know about you, but I love these titles. And on from there, into the Super Nintendo titles, and later a Game Boy Advance release, as well as games much later on the Wii and PS2. Anyway, one day a young shrine maiden named Paki is just hanging out when a raccoon, or a tanuki really, named Rocky, shows up to tell her that his tribe of people, the nopino goblins, have all gone out of their minds or are under a spell or something. Point is, everything is all batshit crazy and it's up to Paki or Rocky to fix it. So yeah, you can play as either character or as both with the second player. Take one glance at Paki and Rocky and you get to just do the gameplay right away. It's a classic top-down run-and-gun game where you shoot in eight directions, slide to avoid enemy fire, collect power-ups and clear all bombs, get rid of all sorts of bizarre-looking enemies like jack-o'-lanterns, zombies, flying, things, all sorts of stuff from Japanese mythology, and you make your way across the level until you meet a boss. Whether that be a genie, a knight, a pirate, a cyclops, or a bamboo shoot. Pretty simple, right? Yeah, also pretty dang weird. With the power-up system, you can either choose to upgrade to a stronger fireball or spread out your attack with the weaker cards that you throw. Look, there's a lot of Japanese mythological stuff that's going way over my head with this game and the North American port did us no favors. The quote-unquote cards are actually Ofuda or Talisman. Rocky is actually a Tanuki instead of a Raccoon. The Ahem Magic Stick is actually a Harai, which is used in a purification ceremony. Yeah, there's tons of stuff they just flat-out ignored and didn't bother to explain, so whatever. Back to the gameplay, this game is hard, as you might expect. Most games of this nature are, but there's unlimited continues here, so no excuses. There's six levels total, with a cutscene at the end of each defeated boss. Although I've learned that these were cut out of the PAL region cartridges, sorry guys. The level design is as you'd expect, it's pretty plain, and you get less and less space to work with as the game goes on, restricting your range of motion and making the game much tougher. What curbs the difficulty and makes this game even more fun is, as you might expect, a second player. Paki and Rocky, and its sequel for that matter, are two of the best multiplayer games you can find on the Super Nintendo. What I love especially is that you can slide into your partner and make them bounce around, destroying everything in sight. Yeah, they take damage, but whatever, that's their problem. Now, what's unexpected and kind of interesting are the minor differences between Paki and Rocky. For instance, Paki's slide attack is quicker, while Rocky's travels farther. Rocky's clear-all bomb is a bit more powerful. Rocky can use his tail, and I could be wrong, but it sure seems like Paki is just faster in general than Rocky. Another nice feature is that if one player dies, you can borrow lives from the other to join in again. So yeah, Paki and Rocky is a good time. And if you're bummed out that there's only six levels, there's a sequel, Paki and Rocky II. The Japanese title is simply the rescue here. Aw, man. So earlier, I compared Paki and Rocky to a combination of the Legend of the Mystical Ninja, Smash TV, and Perodius. The sequel sees the balance sway much more toward a game like Legend of the Mystical Ninja, because here there's kind of an open-world RPG-ish feel to things. As you can talk to people in the middle of stages to find out where to go, and stop in stores to buy items to help you out along the way. Paki and Rocky II has nine levels this time around, and while the game mostly looks and sounds the same, there's a lot more elements to the gameplay, like how you have a partner even in single-player mode. You can pick up icons to switch from one to the other if you'd like. There's Rocky, Bomber Bob, and Little Ninja, or at least those are their English names, and there's at least three or four more helpers you'll run into as you progress. The clear all bombs and slides from the first game are gone. The emphasis is mostly on what you can do with your partner, like Bomber Bob can clear pathways, Rocky can search for hidden treasure, and so on. You can only do these things when you quote-unquote combine with your partner, and you have a limited amount of time to do it because you only have so much magic to use.  That's always fun. So yeah, don't be fooled, Paki and Rocky 2 looks like more of the same, but the gameplay is actually quite a bit different, and there's a lot more replay value here too, because of the helper dudes that you work with. In principle, I don't like when people try and fix something that's not broken, and the first Paki and Rocky game is not broken at all, but they still took the risk of removing key features and adding new dynamics to the sequel, and everything clicks just as well, so Natsume should be commended for that. Anyway, yeah, both Paki and Rocky and Paki and Rocky 2 are worth playing today, and oddly enough for different reasons. The first game is more of a straight-head run-and-gun game like Smash TV, while the second stresses teamwork, even if you're playing by yourself. Whatever sounds more appealing of the two is for you to decide.


So, today's topic is some kind of general discussion about covering spaces, namely what are the properties shared by both the base space and covering space? By properties I mean topological properties. Since a covering projection is a local homeomorphism, automatically all local properties are shared such as local compactness, local contractability, local connectedness, local path connectedness, being first countable and so on. But it also shares a lot of what are some kind of local global properties and some global properties also ok, manifold, being analytic manifold, C infinity manifold or being a topological group. So, many of these properties are shared by both X and Y. So, it is not possible to discuss all of them. So, here I will give you a sample of that one simple thing because we are just doing lot of simplicial complexes and so on. So, let me just discuss that being a simplicial complex, being triangulable that property is shared by base space and top space of a covering projection. For that I need another topological concept here, recall that a space is called compactly generated if a set is open, if we do not leave it is open in its intersection with a compact set is open inside compact sets for every compact set. So, the compact sets of a topological space determine all other open sets as well as closed sets. It is the same thing k intersection a is closed in k for every k, then and then only a contained inside x will be closed either open or closed this two can be one from the other you can go back to back and forth. Simplicial complex says the width topology is compactly generated why because we have proved that any compact set is first of all you know covered by compactly many as a finitely many closed complexes and each closed simplex is a compact thing. And finally, week topology is nothing but the topology controlled by each closed simplexes a set is closed if and only if intersection with each closed simplex is closed in the simplex ok that is the relevance of compact generated when you are dealing with simple shell complexes. So, the first thing that we proved a prove here is compactly generatedness is a local property. What is the meaning of local property? I have been using this word, but you may not know what the meaning I have in mind. What I mean is each point it is a neighborhood such that the given property holds like local compactness and local connectedness the same thing as you have an open cover such that on each member of this open cover the property is true ok. So, this can be taken as definition of local property right now suppose you have an open cover you such that the subspace topology on each you belonging to you is compactly generated then I want to say that x is compactly generated. In fact, if x is compactly generated every subspace you is compactly generated that is easy ok. So, now you are taking use an open cover then I want show that you can come back ok. So, this is a proof take any subset G such that G cap G intersection K is open in K for each compact subset K, K is fixed set and G intersection K is open in K. If this happens for every K we have to show that G is open ok for this because U is an open cover it is enough to show that G cap U is open in U if G cap is open in U then G will be union of G cap U and G cap is open in U so G cap is open in X because U is open in X. So, union of G cap U over U will be G which will be open ok. So, now at K we any compact subset of U then it is compact in X as well as because compactness is not a relative notion it is independent of where X is ok.   So, G cap K is open in K therefore, G cap U is open in U ok. So, this is if and only if ok it is no property then for each open subset this will happen and if this is the case then it is it is happens for the whole thing ok. Now, take any covering X bar to X ok instead of covering I am proving a more general result here namely take a surjective local homeomorphism then apply it for covering also. Any surjective local homeomorphism then X is compactly generated if it known this X bar is compactly generated.  This you can do because P is a local homeomorphism ok and of course, local homeomorphism means P U is an open subset in X.  Now, you can use the previous lemma to go up and down suppose X is compactly generated what does that mean that the topology on U for each U is compactly generated.  So, when coming back if X bar is compactly generated each U on each open subset is compactly generated therefore, P U is compactly generated the P U is an open cover for X is compactly generated ok.  So, you shall surject your homeomorphism local homeomorphism is good enough. So, now, we come to the main topic of today's agenda. Let X be a covering projection X and X bar locally path connected and connected. This connectivity is not exactly necessary all the time anyway, we have told several time. Let H from mod k to X be a triangulation of a connected topological space X ok. Then for every covering X bar like this there is a triangulation of X bar namely H bar from mod k bar to k and a simplicial mass V from k bar to k such that this diagram is commutative. So, even the H bar here which is which is a triangulating map is not arbitrary. In other words, you can forget about X bar and k what we get is mod k bar to k mod k ok that map V bar itself will be a covering projection ok. In other words start with mod k take a covering then there will be a simplicial structure on this covering such that the map P the original covering map becomes a simplicial map. So, this is the gist of the first part here. Further moreover for each n simplex k the cardinality of the set of n simplex system k bar is equal to alpha where alpha is cardinality of the fiber any fiber. Remember if this is where connectivity is necessary that is all. If X is connected the cardinality of the fiber is a constant ok. So, this part says this every n simplex of k there will be alpha many simplex is in the X bar exactly same. So, look at the vertices how many vertices where for each vertex here there will be alpha many vertex is above right ok I will make it clear in the proof of this far. So, what I am going to do is V be the set of vertices S be the set of simplex is for k then we are going to define k bar V bar S bar S for all. V bar is P inverse of H of V remember H is a homeomorphism from mod k to X. So, I am picking up the vertices in X bar to be P inverse of the vertices in X that is the meaning of this H of V are the images of those points which are vertices vertices are just P inverse of that that is the vertex side. What are the simplexes? This S bar is collection of all H bar of F what is the H bar and what is F I am going to tell you where F is a simplex of S ok like vertices triangles edges all those things have to be coming from S. Then look at this H bar H bar is a function from mod X mod of F to X bar that means a lift of this H H restricted to F. Mod F is a subspace of mod k H is a homeomorphism mod k to X restricted to the mod F then you must you must get a lift of this one H bar is a lift because P is a covering projection take all possible lifts all of them look at this all these H bars then take H bar of F F is a finite set remember that. So, H bar of F will be a finite set and what are the these are the vertices of simply so they will be inside H of P inverse of H of F. So, they will be vertex of this one to declare the mass simplexes if you have a subset A of B which B is H bar of F then A is nothing but H bar inverse of some F prime where F prime is subset of F. Therefore, you can restrict the same H bar to this subset A mod A so every subset of B finite subsets there they will be also subsets of S bar by this definition. So, what we have seen is that this k bar is a simplicial complex that is easy to define but why modulus of k is homeomorphic to X bar in such a way that when you take composite with P it will be a simplicial map from k bar to k. So, that is the harder part to show already definition is over before proceeding further I will want to tell you some simple situation look at the circle easiest way to triangulate is take one omega and omega square three points join one omega and join omega to omega square omega square to omega by those arcs okay.  So, what is the corresponding triangulation on the real line which will make this namely exponential map itself look like a linear map. So, what is that declare all the inverse image of these three points as vertices. The inverse image of one we are familiar already we have done this over time namely all the integers come inverse image of omega all one third integers will come one plus one third two plus one third three plus one third all of them will come then omega square one plus two third one plus two plus two third all those things will come. So, each interval music interval will divide it into three parts okay. So, now exponential map from each interval to another interval can be thought of as as a linear map of course it is arc there. So, when you take actual triangle to that one that homeomorphism is precisely the linear map what is that homeomorphism you look at the triangle and push it back to the circle that that is the homeomorphism right by the radial projection right. So, what are the triangles what are the what are the edges I have declared by this formula what I have declared is you take an edge here lift it lift it at various points okay if we have a lift then join the two points the end points by a simple x. So, that is precisely what this h bar of x means I cannot join just one third two some five by three or some other 25 by three that is not possible one third you have to lift there are two possibilities. So, one going backward one coming backward that is the only two lifts will come there. So, what you get is a real line okay. So, this condition is very important that we cannot take orbital subsets of v bar as simplices of this one of course that will be a simplification complex but it will not be giving you mod k bar will not be put x bar okay for that you have to use this x bar itself and the lifts of lifts of this homeomorphism piece of homeomorphisms restricted to each simplex and then you get a simplification complex okay. So, now even if you do not understand all the details which are getting lost in notation you must be able to figure it out yourself okay. So, let us go through some of the proofs here clearly k bar is a simplification complex which we have seen since for each f in s mod f is a simply connected mod f is actually contractible it is homeomorphic to a disk right. So, lifts are always possible the cardinality of lifts is precisely equal to alpha at each fillet to one point you lift it you will get that many disjoint lifts in fact every under a covering space every contractible space every simply connected space we have seen the university may you know disjoint union of copies of this they are all evenly covered okay. So, look at this h bar in the h bar whatever you lifted and look at the endpoints declare those endpoints as union of those things as the simplex system okay and then you have you can fill it the filling you will be also done by h bar that is all okay so that is the trick. So, what happens is compatibility compatibility comes because uniqueness of the lifts okay. So, suppose f1 and f2 are inside s bar and intersection is f3 is non-empty if it is empty there is no question of compatibility suppose h1 bar h2 bar h3 bar are corresponding lifts of this edge from mod f1 to mod f2 and mod f3 into x we claim that h1 bar restricted to f3 is the same thing as h2 bar restricted to f3 that is nothing but h3 therefore compatibility is there why this is true this follows because as soon as the lift is defined at one point take one point here okay it is defined uniquely on the whole connected sector the f3 is non-empty so if you take one point here okay so wherever that goes because if it is non-empty here there is one point then whole h1 bar will be same on a whole of f3 which is empty then there is no question there is no so but that is same thing as h3 because at one point it coincides okay it follows that uniqueness of lift connectivity of f3 this we have to use okay. So, it follows that if you have this one all the various lifts will patch up on the intersection they agree so there is one single function h bar such that p composite h bar is x okay automatically on each this simplex is its continuous so it will be continuous also so this is where we have to use that mod f mod k has the what is this width biology a function is continuous if and only if it is continuous so on each simplex so now we have got a function h bar from mod k bar to x bar such that when you composite with p come back come come here okay and restrict it to each k here that is h so I have to define what is the map from k bar to k can you guess now what is the map it is very easy what are what are the simplex of k bar they are lifts of some f so you map them accordingly what is p inverse of what is v bar v bar is what v bar is p inverse of v so wherever it goes to you define phi to v that map so that is the simplex map that is the vertex map it will become simplex map by the very definition so vertex map is already there so that becomes simplex map because of the very definition okay so diagram is commutative is fine finally what we have to do is that show that h bar is 1 1 on 2 and homomorphism once again on each simplex it is a homomorphism by very definition the lifts are automatically homomorphism okay and they go into compatible things therefore the bijectivity automatically follows okay on toness follows because take any point in x bar come come down to x it is inside a simplex okay so that simplex will be can be lifted up so that is subjectivity all right so I have written little more details of this one here okay so h component phi equal to p component h bar I have written down complete detail here so what we can do is look at the star of a vertex the star of a vertex is an open subset of mod k under h it will be open subset of x the star of x star of v are all contractible spaces so it is in particular they are simply connected therefore the inverse image will be disjoint union of open subsets which are mapped on to each star v this star v is evenly covered okay so you can use that to to establish that there is such a homeomorphism diagram commutative diagram h is restricted to star v this extra star v p is a homeomorphism on each connected portion of the inverse image okay and that will become star of v prime okay so this will automatically show that this h prime which is restriction of h bar okay is both open as well as continuous okay this is another way of doing this one it's a homeomorphism at each each each open covering of this one okay so I have given you a heuristic argument why it's a bijection here is a straight forward proof to show that h bar is a bijection okay so there are many interesting properties shared by by covering projection under covering projection by top space in the bottom space but in the right in the beginning we remember we have we have cautioned you that half stars nest etc are not shared regular cover regularity or normality etc are not shared so you have to be careful about that well I have given you some exercises so there will be chance to look into these exercises and then discuss them also maybe next time we will discuss some more examples and then go to the next topic so we will discuss some more examples of covering projections then go to the next topic okay so thank you


Now that we have gathered the natural gas and run it through a processing plant, we have the residue natural gas, which is approximately 98% methane. This again is what we call commercial or market grade natural gas, and it now meets the quality specifications of the transmission pipeline. Again, the overall function of the transmission pipelines is to take gas from large producing areas and get it to the market areas. Here is a simplified map of the natural gas pipeline grid throughout the United States. There is pipe literally running from the very south tip of Texas and Brownsville all the way up to New York City. That happens to be Transcontinental Natural Gas Pipeline Company, which is owned by the Williams companies out of my home city, Tulsa, Oklahoma. But you can see there are pipes traversing the United States, a very extensive grid. And if you'll notice the concentration in the Gulf Coast, there is vast amounts of supply in the Texas, Louisiana, Oklahoma, Arkansas, Mississippi and Alabama areas. So we have both offshore and onshore production. The shaded areas represent large supply basins. Here's the normal flow from large supply basins to the market areas. Your largest areas of demand in the United States include the northeast. The basically the Washington D.C. all the way up to Boston Corridor, the upper Midwest, which is going to be cities like Cleveland, Detroit, Chicago, Minneapolis, Milwaukee, the West Coast, most of the entire state of California, as well as New Mexico and Arizona along the way. Texas itself consumes a considerable amount of natural gas largely due to air conditioning loads in the hotter months, but also due to the petrochemical refining process. So that would also encompass the states of Louisiana, Mississippi and Alabama. So a considerable amount of production in that area stays at home, as we like to say. These are the all important new gas shale plays in the United States. There are various basins that you can see here. The single most important one in my opinion is the Marsalis shale in the northeast. The northeast part of the United States consumes a considerable amount of natural gas. It is the premium price market for natural gas. So now you have substantial amount of natural gas production in the largest consuming area in the premium market. It has had a profound impact on supplies in the other areas as a lot of that gas no longer goes to the northeast because it's not needed. And so the price impact of the Marsalis shale has been dramatic in just the last two years. It is one of the major causes of the lower natural gas prices that we see today. This is an indication of some of the activity and the estimated recoverable reserves over a three-year period. You can see that the Hainesville is among the largest, but the Marsalis is very significant because of the location of the potential reserves coming out of there. This map also does not show the new Utica shale formation that has occurred in Ohio and is being drilled and explored as we speak. So we talked about gathering pipe, which runs from anywhere from about two to six, even 12 inches transmission pipelines. Because their major function is to connect supply areas to market areas. And because they literally have thousands of supply sources, wellheads, pipelines, processing plants, etc. They run in a diameter more in the range of 16 inch on the low side to as much as 42 inches on the high side. The used compressors to move the gas along the range of pressure can any be anywhere from a low of 200 to as much as 1500 pounds per square inch. Natural gas flows to the point of least resistance. That is the point of consumption is going to have the lowest pressure and all the supply areas are going to have the highest pressures. Pressure is increased along the system to maintain the flow from the supply area to the market area. And again, we use large mainline compressors to accomplish that. This particular map illustrates in a very generic fashion what would be the difference between transmission lines and gathering lines. These are the assets of One Oak. You can see the spidery yellow lines represent gathering lines whereas the red lines represent a transmission system. Yellow squares show you processing plants throughout the gathering systems and the red squares represent underground natural gas storage facilities. These are pictures of actual pipeline construction. The very top left picture, they have cleared a right away. That's the total area that the pipeline would lease to dig a trench and lay its pipe in. Pipes are generally in 40 foot sections in this particular picture. It's the first stage where the pipe is actually laid in the trench. In the second picture in the center there, pipe is welded together at each end of those 40 foot sections. In this particular case, they're bringing the pipe over a hill in some rough terrain. And in the lower right picture, you can see the machinery that's actually used to lower the pipe back down into the trench once it has been welded together. And then the trenches are covered up with dirt. That becomes then the pipelines right away which they are obligated to maintain. And the pipe, maybe it must be buried at least a depth of six feet. You can see here that you finish pipeline. That's the right away cutting through the trees, the ground over. You won't see the pipe except occasionally you'll see one of these above ground valves stick up out of the ground. This is a point where the pipeline can control the flow of gas. They can allow flow through the pipeline here or they can close it off in case of an emergency or if any type of maintenance has to be done. But again, you'll see these types of right-aways. They can be looked very similar for pipelines, electrical lines, and other. But we have some terminology. We talk about the receipts into a transmission pipeline. That's just what are the sources of gas that come into the transmission pipelines themselves. We already know that we have some well heads. So single high pressure wells could be tied directly into a transmission pipeline. We also have the gathering systems. Multiple wells are brought into a common point, otherwise known as a central delivery point or CDP. The processing plants have their residue lines where the 98% methane residue gas is delivered into the transmission system. And as you saw on that simplified map of the US pipeline grid, pipelines cross one another. So when they cross one another, they have a tendency to go ahead and tie together so they can exchange gas, both the interstates and the intrastates. Interstate pipeline companies are pipes that cross just one state border. Intrastates, all of their pipe is contained within a single state. And then we have underground storage facilities. Those storage facilities, when they are withdrawing gas, are providing gas to the transmission pipeline systems. Therefore, they represent a source of supply or receipt as well. We then have the deliveries or the takeaway. These are the places that the transmission pipelines will ultimately deliver natural gas. We refer to the gas companies as local distribution companies. The point of delivery between a transmission pipeline company and an LDC we refer to as the city gate. It is dropped off at the city. There are multiple end users that are directly connected to the transmission lines. They do not receive their supply by gas company. One of the primary examples is that of power companies where power plants are tied directly to the transmission pipeline. Again, this idea that the pipelines are all connected through a grid system. One pipeline delivers gas to another pipeline. Therefore, that becomes a delivery point for the first transmission pipeline company and storage facilities. Gas that is stored underground is delivered to the storage facility by the transmission pipeline company. Pipeline systems run 24 hours a day, 365 days a year. And so they have electronic monitoring systems. The term for that is known as SCADA, which stands for supervisory control and data acquisition. All the information on the pipeline is transmitted electronically to a central monitoring and control center. They're looking at gas pressures, the amount of flows. And they can also electronically control a number of pipeline facilities. The more sophisticated SCADA systems for natural gas transmission pipeline companies can actually remotely open and control valves, start, stop compressors, open and control regulators. Regulators basically regulate the pressure at certain points in the pipeline. Here's a picture of an actual gas control center. These people are in there 24 hours a day monitoring all the activity across the pipeline system. This is an actual pipeline explosion, a pipeline mishap that occurred because pipeline pressures were not being monitored closely enough. And also because the pipeline was not being inspected on standard intervals as required by the Department of Transportation. This explosion occurred in Arizona through a recreational campground. You can see the crater that was blown out when the natural gas was ignited in the foreground is actually some molten dirt. This picture shows that there's still the natural gas in the pipeline burning out. Again, look at the very large crater that was created by the explosion of the natural gas. There's the cutaway. This is where the pipe was welded to the next section of pipe and the weld actually gave way. This is the scorched earth that was in the area around this particular explosion. This is an actual piece of the pipeline itself, the tube that we call it. Steel sheets are actually rolled into those pipe sections horizontally and then the weld is done on the circumference when the pipe sections are joined together. So this is an actual rolled piece of pipe that was part of this explosion and blew right out of the line. Here we see the lateral seam on what was the rolled pipe. Notice that there's snow in this picture where there was absolutely none in the prior pictures. Again, this is what can happen when pipelines are not properly monitored for pressure and they are not properly inspected and maintained.


I came across this concept a while back that basically says that within a romantic relationship, the relationship itself is a third entity. So when you look at it that way, it's easy to see where an imbalance could occur. One, one or both people completely lose their own identity and lose themselves within the relationship, making that relationship the only entity. Two, one person completely loses himself within the relationship so their own identity is gone and solely based on that relationship and the other person because then there becomes two entities, the relationship and the other person. Or three, the ideal scenario. All three entities remain imbalanced and intact and therefore imbalanced into harmony. Each partner takes care of themselves, keeps their own identity and interests and likes while contributing wholeheartedly to the relationship entity. So which one do you tend to fall under?


Hello everyone. We're getting started slowly. So this presentation is about we're going to build our own Hiroku with cloud native stack, which is essentially like cross-lane backstage and Argo CD and some bit of like, you know, get repository, of course. So this is kind of like what we're going to go through. The first we're going to talk about like, you know, the Hiroku experience and like, you know, what they give you and then architecture of our solution that will do like, you know, that will give you a similar experience.  And then a group of a Chikario who is a big company, they have this setup in their production with lots of like, you know, cross-lane resources and different configurations. And they will they're going to do a demo as a he's going to do a demo as well. Cool. Yeah. Well, I'm Wafak. I am an engineer at Upbound and maintain a cross-plane. I'm the tech lead of the control plane squad that maintains cross-plane and providers. I'm Siddhartha. I'm director of infrastructure in cloud at Group of Chikario. Cool. So the Hiroku experience, right?  And on top of that, they've got this like, you know, metrics and activity.  And what you get from them is like deployment and then scaling and monitoring and some of the security guardrails that they have in place. However, it's not as flexible. Like, the more opinionated you get, the more like, you know, the less flexible it's flexibility you can provide to your users and customers. So a lot of companies, they start with Hiroku, but everyone knows, like, you know, they're going to outgrown Hiroku, right? So what you don't get from Hiroku, and one of the some of the reasons that you would not continue using it is that they don't deploy stuff in your own internal network, because like, you know, it's all in the, in their accounts and like, in their essentially hosting service, right? A cloud service, to some extent. And they don't allow you to use your own cloud accounts and complex applications developed by multiple teams. For example, if you want to have like lots of microservices, some like auto scaling with AWS, like advanced scenarios, essentially, with more than like, you know, a few dino, dino's they call. And also like your own guardrails, right? It's just like, the opinions of Hiroku's design are good, but they don't work for everyone, especially the big companies, right? So what we want to have is a Hiroku that you can customize more. And you can have like, you know, under, you can feel it under full control. So I'm going to go through like a few tools that we're going to use. The first one is cross-plane, right? So cross-plane is this tool that allows you to build your own internal cloud platform to provision cloud resources, essentially. And you can interact with it through IAC tools, like Terraform or Kubernetes applications, or CI-CD pipeline through GitOps, because it's essentially built in Kubernetes API. It gives you, it installs CRDs and you can interact with them with that, just like all other CNCF tools. And backstage is another CNCF tool that allows you to have a service catalog in your company. And on top of that, they allow you to have a software template concept where you can click and create a new application like Git repo with some of the like, you know, presets and like, you know, CI-CD actions if you want to.  Where is it located? Is there like, you know, docs for it that I can look up? And what's the API? It's essentially like an internal service catalog. And then what we're going to do is to interact with Kubernetes cluster. We're going to have a cluster. We're going to deploy all these three tools, all two of the tools, and then also Argo CD. And we're going to manage all of that, like, you know, our platform consumers who are developers are going to interact with it through backstage.  We're going to write our own software templates, for example, for Node.js or other languages. And in a very high level, this is like a really basic diagram.  When you request a new service, it's going to create a Git repo with all the CI CD, and then Argo CD will take over to deploy. And what it deploys is both application and infrastructure. And then crossplane is going to talk to the provider. So with one click, you're going to get like, you know, for example, RDS instance, like buckets, even cluster, if you would like to, together with your application. And yeah, without further ado, we can, we can just start the tutorial. Do go to that page because there are places where I will just like copy and paste the ML because it's just too long so that you can like, you know, keep an open tab and you can just copy and paste the same thing. And also like, you know, later you can, you can follow it. Cool. I think everyone got it. So the first thing is that open the repo, open the repo. So the first thing is essentially, we're going to go through the like your experience, right? We're going to look at like, you know, how, how it actually works. In order to do that, let's go to heroku.com actually and create a new application. Can you put it like here or something? Cool. So we just created our own application and I already logged into Heroku. So I'm going to create a folder. Just a second. Are you able to see it? No, okay. Is it better now? Oh, it's because of the yellow thing. Yeah, I couldn't get that right. It's just, let me just make this, is it readable now? This is, I'm going to switch to another color light background. Is this better? Is this good now? Okay. Yeah, sorry about that. It's not disabled in this external monitor for some reason. But yeah. So let's get in it, our repo. And we're going to copy some of the Hello World code that I have here. So it's going to be a Node.js application, right? Packages. And this is to have Node.js compile. And we got a very simple server.js, just like in Hello World and using the port that Heroku mounts. And then we're just going to get status, commit. Cool. So I have created my commit. Now I'm going to add Heroku's own remote. Git repo. Nice. Now I'm going to get push your code main. Cool. So one experience that we're actually not going to be able to give is this like, you know, Git log, because we're going to use GitHub. It doesn't allow you to edit this login. It just builds right when you do the push and deploys it. We're going to use GitHub actions to do that operation. Cool. So if you refresh, open up. Yeah. And now we're seeing the Hello World. So whenever we make a change, the same thing happens. Git push and builds it and it deploys it. So that's kind of like, you know, the Heroku experience that I'm going to like, you know, try to get to. And additionally, there is this add-ons concept. For example, let's see. Okay. For example, yeah. So add-ons is like, you know, how you add infrastructure to your Heroku application. But for example, if you want to add buckets, you can use this bucket here. And it would like to make an environment variable available for you like bucket name and credentials to be able to use it. We're not going to do that for now. But yeah, now we are going to start to install our tooling to our cluster. I'm just going to copy a bunch of code here. And it's going to be a kind cluster. We're going to work on a Heroku namespace and deploy everything important there. So this cluster is going to host backstage crossplane and also Argo CD. And I've just set the namespace. So I'm going to create a backstage app.  So it's essentially a TypeScript library set. So that's why they have this MPX command that scaffolds the backstage.  For example, we're going to add an action that creates Argo CD application. In order to do that, we're going to have to like, you know, make some code changes. So let's create our backstage app, actually. So it takes a little while. So I have it already in my local.  Because your Yarn install just takes too long, I have already like, you know, this scaffolding. So what you see here is usual TypeScript. Like, you know, it's got like two packages, one app for frontend and one for backend. And we're just essentially going to just like run the MPM start and see what the initial state is. Oh, Yarn Dev. Yeah, MPM on Yarn. Yeah. So it's coming up. Yeah. So this is like, you know, very initial backstage UI. It's got an example website. It's got create new component. So this part is the catalog part is you're supposed to see like, you know, all the software that your company has up and running, right? And when you go to the page, it's to show a relations, CI, CD dependencies, documentation. And if you click the source, if it has like, you know, GitHub repo, it would take you there. And the create part is where we will work most of the time at the moment is where you have a template, for example, not just template, right? You choose that and it creates a GitHub repo and scaffolds everything. So in order to do that, we are going to have to create a GitHub token so that we can have it. We can give it permissions to create it back. It needs to have repo and workflow permissions. I'm just going to copy this. Okay, I'm going to close this because it doesn't have any credentials. So we're going to put it and then open it again. Cool. So we got that right. And there is, we need to check if it's, so there's this app config. You've got app config local and production. And this is like, you know, the core app config, depending on the environment, these override the main core app config one. For example, when I run re yarn dev, it uses this empty file. I'm going to build an image and deploy to Kubernetes cluster. It's going to use this production one. So I would like to check integrations, integration of GitHub, but it has the token. Yeah. So it's essentially environment variable. So I'm going to do yarn dev again. I'm going to go to this create. Yeah. So I'm going to create a service. So what it does is like, in three steps is the like, you know, the base, you give it a directory for scaffolding. Hey, like, you know, these are like, you know, starting point for my repo and it's got some good templates that it can fill with users input. Right now we just give like, you know, hey, I am the owner. This is the repo address, but we can extend that. And then it publishes to GitHub repo story and then registers it back to, to this instance. So if we go to that repo that is just initialized for us, was it private? Okay. So this added like, you know, a very simple, like some, its own sample and catalog info. This is like, you know, what backstage uses when you want to import a service. So our GitHub token integration is working. That's what we confirmed. So we're going to deploy this to our kind cluster. There's a bunch of options here, but we're just going to use in memory DB. And on top of the standard, we're going to add this template option. Normally it doesn't allow you to add templates in the UI. It has to be like, you know, compiled in with your application, but we're just going to enable that and add it through the UI. So I'm going to production, just remove everything, paste this. Cool. Don't need to have this open anymore. I'm going to build an image and load it to my kind cluster and deploy it.  And then, yeah, first I need to load the image. And there's the next step we are going to create a secret that has the GitHub token that we created in the earlier step. Let's wait. Actually, we don't have to wait. Okay. GitHub token is created. Okay. Image is loaded. So we're going to deploy with like very simple manifest. It's going to have like deployment, one replica using our image and a service that expose it through port 80. And the service account, which will be useful later on. So I'm going to copy this manifest regarded here. Cool. So I am seeing it. It's up and running. And I'm going to open it. Okay. Port forward, connection refused. Demo gods don't like us today. Invalid queue. Did I? Okay. Okay. Oh, the, oh, okay. Yeah, right. The secret, right? Yeah, I just need to stick to the script here. Okay, thanks. So I'm just going to delete the part so that comes back again with the secret. Come on. Yes. Now it's in our cluster. That's cool. So yeah, that's out of the way. And now I'm going to install Argo CD, but the images it uses, it hits the Docker pull limits. So I'm just going to have a script here that will preload the images so that we don't see that problem. Cool. Yeah. And just like, you know, we're going to install it to Heroku namespace. We're going to make it use our preloaded image. Okay. That's, that's okay. The important ones are installed. Cool. Argo CD is there. Let's wait for it to come up. Oh, I preloaded the images. This was supposed to come up fast. Okay. So it's just like, you know, very frequently used images. And in this Wi-Fi, they hit the document because everyone pulls images right now. And yeah, let's kill all of them. They know how to get back up. Cool. So they are getting back. So I'm going to get the initial admin password of Argo CD. If it comes up ever, okay, you got it. And port forward that one as well. It's in Chrome. Yeah, I am taking the risk. Cool. So admin. Okay. We got Argo CD as well. This is going well. And now we're going to install crossplane with helm and then install provider GCP because like, you know, we're going to provision bucket from GCP in our scaffolded application. Okay. So we got these two. So we're going to start with just like the backstage example scaffolding. We're going to start with a very simple template just to validate that we got everything right. So when I installed provider GCP, I also need to give like GCP credentials. So I'm creating a provider config object. That's created. And it's also need to have the secret. I already have this environment variable available for my service account in GCP. I mean, I hope I do. But yeah, cool. So the installation part is done. I think who I hope. So we're going to have a like simple hello world template, just like the similar, just like, you know, the existing template, but with actual, like, you know, some code in it and like from our own template, get up repo. So this is kind of like, you know, how backstage you either compile it into your application templates, or you create a repo and tell it, Hey, like, you know, you can catch that from there. And whenever you make a change, though, you have to refresh it. So I'm going to create a new repo. Get clone. So this is going to serve like, for example, in a company, this repo would be maintained by a platform team, because they would kind of like, you know, set the compositions like, you know, what you can do and like, you know, the best practices of languages. In this case, we're going to go with Node.js. And let's initialize the repo. Cool. So I'm going to talk about a our first templates. So a template a scout, like in order to prepare a scaffolding for backstage, you need to first create a template YAML that will tell it like, you know, hey, go and take the, for example, in this case, we've got some properties like that we will ask to users, Hey, what is the service name? Who is the owner of it? And then choose a location. They're going to like, you know, we're going to choose a repo. And then there are steps. So these steps are very familiar.  So initially what we're going to do is just like, you know, hey, I have a skeleton folder. And these are like, you know, the values that I took that I got from the user, and these are going to be used in our skeleton template so that it replaces them, because we don't want scaffold to be like exactly the same for everyone. We want them to be different depending on the user input. And then it's going to publish the GitHub to our repository URL. And then it's going to import that to the catalog registered using like, you know, hey, go to this repo and take the catalog info YAML that has the backstage information. So let's go ahead and create this in template YAML. So I'm going to create a skeleton folder that will be essentially what's going to go to the repo. And component, this is where you see the go templates that backstage parses and replaces catalog info. Without that catalog info YAML, you can't register the like your service to backstage. We're going to have a very simple back package JSON. Why do I keep opening this JSON?  So one thing to see here, like, you know, I have templates in actual code as well. Like for example, when I create a repo, I expect this to be replaced with service name and owner, which is like, you know, something that we're going to use in crossplane part of the side part of the code as well. So let's continue server.js. And I have a typo here, as usual. Cool. So we've got our first backstage. What is it? Okay. We've got our first backstage template. So we're going to commit and push. And then we're going to go to backstage and click create. Okay. Okay, cool. So I'm so I'm going to take the URL of that template YAML to import it to backstage. It has a really nice integration with GitHub that is able to figure out, like, you know, how to fetch anything from from a GitHub repo. And we imported it and we got it and create and you see hello world on Kubernetes, our own, our own templates, KubeCon.  So move off. This is creating our repo with our own, like, you know, hello world code. Let's see. Yeah. And as you can see, server.js has like, it's replaced with owner and KubeCon and A2. So for example, if you have images or like, you know, GitHub actions, especially, it's very, very useful. You would need to change it like image tag and or image repo. So you need to have, like, you know, some sort of templating in the scaffolding code as well. Cool. So I'm going to clone this very new repo to, was it ER or MPM? It's just MPM start. And let's see. Of course, it's not HTTPS. Cool. So I just, like, you know, went through, like, very small cycle, very simple app. Like, you know, hey, I'm a developer. I just want a hello world on this specific language and I created it through templates. So this is, like, you know, mostly just backstage and backstage and GitHub magic. So in the next step, we're going to go through, like, you know, hey, let's add image and ham chart because we want to deploy this to our Kubernetes cluster, right? So we're going to add image and chart to our template. So we need a Docker file. Well, let's change the metadata to something new so that we have a couple of, actually, let's copy this and create a completely new one. Okay, I have the code here. Okay, this is not the template repo. Cool. So I have one template here right now. Even I can't see it, but zero to hello world. So I'm just going to copy this into another image chart. Cool. So I am adding a Docker file, which is very simple. I think Heroku also supports Docker files, but I'm not 100% sure. But we have to have it. Docker file for bills, just alpine npm install and run it. Very simple one. So let's build it to make sure everything is tight. Cool. Because we aren't going to, it hasn't gone through the backstage template.  So the next thing is we're going to have a ham have a ham chart. We're going to have a ham chart, but there's a detail here. And I think people who work with ham charts a lot will be able to catch it is that if you, okay, in my image chart folder, okay, so I have, I should just use VS code for creation of everything. Okay, I'm adding to the skeleton a chart folder. And it's going to have its own templates folder and also values file. Values. Yeah, I'm all and also chart. Yeah, I'm all. This is a little bit as you see, there are like, you know, some backstage templating here. And I know, like, you're going to realize that, you know, hey, actually, that's what that's how ham does it too. And I put that tag here because when I build it, I want it to be the get commit. We're not, we're not doing much, much versioning really.  The one thing to notice here is that this, like, you know, notation without this, like, you know, the helmet backstage would like, you know, it would clash essentially. For example, if you if you don't have it here, then this dot values, but backstage would try to interpret that and would fail because there's no, like, you know, image intact in the user input, right? So you put this row and end row as beginning and end of the parts where you don't want backstage to touch. It just treats it as like, you know, plain text. So service dot YAML. Cool. We got it. And here, as you can see, like, you know, these two things are going to be replaced by backstage, but this part is going to be overridden by values. YAML. And I will add a GitHub action in right now to replace this tag with the commit once it builds the image chart. And yeah, and our GitHub actions will essentially be, hey, like, you know, check out repo, Docker build. See, this is, for example, this builds, like, multi-platform images, right? We don't want your developer to deal with that at all, right? So we are able to just take that load from them by having it just in the SCA folder. So I'm going to create the GitHub action folder. Cool. And in this CI dot YAML. Okay. So I think this is, yeah, now we're going to, like, you know, create a new commit and push our new image, new template, actually. And let's go and register it. Keep contemplates, image chart and then template YAML. I'm just going to use this. Import. Yeah. So when I go back to the create menu, I have any software template that I can use. That's what they call them. And I click choose. So I create this repository. And this time it's going to do a little bit more magic than the first one. Cool. It's been created. Let's go and see it. Okay. Now we've got the initial commit. It has GitHub workflows, and it started to build the images, like, you know, and it's going to build hand chart OCI image as well. And it will push to GitHub packages to be ready for consumption. And yeah, it'll look like just like this. Yeah. I mean, we can deploy the hand chart, but I think we're a little bit on time. So I'm going to, like, you know, just skip to the next step on where we use these images with Argo CD. But if you want to look at it, how it's going, yeah, it's just building lots of stuff. For example, in this scaffolding in GitHub action, you can have like all technologies like image scanning and everything so that your developers don't really like, you know, need to be careful about those or you don't need to have a wiki page about how to like create a new project in this language. Cool. So packages are pushed. See, like, you know, two packages and developer didn't even do anything. So we're going to create just another template now. Template that is exact copy of the earlier one, but with some changes. Cool. And let's change the name. Hello world with github. Cool. So one thing, this is where we add custom action to backstage. So the extensibility story of backstage, essentially, you make some code changes. And I had to write a new like module for for it to interact with Kubernetes because right now, as far as I remember, there's no like action to interact with Kubernetes. There's core Kubernetes integration with backstage that reads files and shows the status if the labels are right.  So we I have written this like, you know, it's, it's a very simple, but I don't want to want to go into details, but this will let us have the custom action that will create an Argo CD application as part of the scaffolding. And the reason that we did, we don't do this as part of GitHub actions that I don't want GitHub repo to have access to my cluster, because my cluster is kind of cluster is private and private clusters are like, you know, everywhere, right? So you don't want to have like, you know, you may not want to have, you may not want to give typical config to the repo. Yeah, so we're going to go back to our backstage implementation and add this npm packages. So I'm going to show you how you can add them, you essentially to register them in the create plugins part of the application. So I'm going to packages and backend. Here you have the source plugins, and then you got the scaffolder. That's what we're concerned with mostly. And now it doesn't do anything. It just create router with defaults. And I'm going to change it to essentially initially initialize the built in actions and add two actions from my package. One is Argo CD create have an application. And the other one is wait for last workflow, because we want to create the repo wait for the action to complete to push the images and create our go CD application to pick that up. Cool. So we just added that and let's see if it's all good by running it locally real quick. So there's an endpoint called create where we can go and actually create actions. Cool. So this is like a list of actions that are registered in this backstage instance. And when we go to the bottom, yeah, our actions are here. So we're cool. All good. And in addition, our backstage service account needs to have permissions to create these Argo CD applications. It doesn't have them by default. So I'm going to cat. Cool. I just created the permissions, but I'm going to have to like, rebuild and push it to the cluster. Load it to the cluster. Cool. So this is like, a little bit different than Heroku in the sense that we're going to create the repo actions, build the image and like an Argo CD to pick up. But when we make another change, Argo CD is not going to automatically pick it up because Kubernetes or Argo CD, as a concept, they work with like an image tags and they don't continuously check whether there's a new image pushed to that image tag. And if we push like, you know, different tag, then like, you know, something has to go tell Argo CD, hey, there is this new version or digest has changed it, right? So there's a small project called Argo CD image updater, but it doesn't quite work with GitHub container registry for some reason.  But for the first run, it's going to do that. And then later on, I'm going to update the tutorial with, if they fix that problem, essentially. Yeah. So we have, we have to rebuild the, like you have to do this rebuilding for templates as well. But as I mentioned, we enabled it to be able to like, you know, import that from the UI. Cool. Yeah.  Cool. It's going to come up in a minute. And also, these are like, you know, two new steps that I have to add to my scaffolding actions. One is GitHub rate. And the other one is Argo CD create. So let's go to template.yaml right before registering. I would like it to wait for the workflow to complete. And then Argo CD is going to create it. Cool. So I have just pushed my new template. And let me check if Argo CD is up. It is up. This is nice. Port forward. Yeah. So I'm going to, because we're using in-memory database, all the existing templates are gone. So I'm going to import the one that we just created from scratch. Argo CD1 template. Yeah, I'm all registered and import. Cool. Choose it. Move off. So we're just like, you know, going through the same cycle, but like, you know, with different setups like one by one and create. Okay. This is actually not worked. There should be two more steps there. Let me check. Let's go to our template and did we not commit? Okay. I forgot to save, of course. There is no way around it anyway. Cool. So I just like, you know, refresh the template. And yeah, it's all here. I am going to have to register it again. But this time the button is going to say refresh. We got that. I'm going to create another one. Keep calm. And create. Cool. Now we see our action step. And while it's doing its job, let's go to the next step, crossplane, which is the part that I'm most excited about. And in this part, we're going to first, without templates, as a platform team, we're going to define an API for buckets, right? And it's going to be like, you know, it's going to have only one parameter location. And we're going to include its custom resource in our hand chart.  And I will have service account key whose credentials are going to publish in a secret. And I'm going to have like I am member key ring crypto key so that it's encrypted like lots of this infrastructure so that developer does not have to know that it depends on our environment. So I'm going to install it this to my cluster, but not to the templates or the Git repo. So let's check the earlier one. What are we with it? Okay, it's still, yeah, it's still waiting for the github action. Okay, it's, it's completed. So let's look at, okay, it just came into here. Fill the fetch. I know. That's weird. Let's see if the package made it here. Oh, the version is 999 for some reason. Well, let's, let's move on to the crossplane and we can fix it there for now. But, but that's the idea, like, you know, the continuous integration part is kind of like, you know, end to end complete. Now I'm just going to like, you know, improve the skeleton scaffolding by adding like infrastructure resources. So let's copy this template as well. And you're going to see like, you know, in the next part of the presentation, so that is going to show like way more advanced stuff that is built with this methodology crossplane code. Okay, so I am going to create a YAML for, let's say platform that YAML, this is not going to be interpreted by backstage at all. It's just, I'm going to like, you know, keep still apply it, but it could be, you can have it in the single repo, keep templates repo, but it doesn't have to be. In addition, I'm going to add my composition. There's a copy button here that I never use. Cool. So, so as I said, like, I have to apply them like independent of any templating or backstage or anything so that environment gets ready. In production, I can use this in dev. I can use like mean IO composition, right?  Hey, this is like dev environment. So you're going to get to a bucket with container. But in production, I want you to have like, you know, encrypted bucket as long as the secret and token is the same, like application can talk to both.  So this environment is production environment.  So this part is good. Let's change the name of the template to anyone, not just application with bucket. The rest is pretty much the same. Except the new steps didn't make it here for some reason. Let me add the new steps. So we're creating like, you know, our go CD application targeting this chart that we publish, but the chart had a, had the wrong version for some reasons. So we're going to fix this in GitHub CI. Yeah, there it is. I was trying something and I shouldn't have tried it. Okay. So this is also fixed. We've got the image chart, our go CD application, our platform is ready. So what we are going to do is to include in our chart, like, you know, hey, I'm a service that I'm, and I'm going to use a bucket. I'm going to need a bucket, right? So bucket that, yeah, I'm all, let's go back to the crossplane part. Yeah. And this is all my developer needs to know, right? Just a very simple API with a single parameter, even location us, and then they are able to give, like, you know, hey, publish your credentials to this specific secret. And what I'm going to do is like, you know, mount the secret to my service so that when the whole thing deploys, first bucket is created, and then my application comes up with that credentials, and it works with the bucket. So this is like, you know, I didn't have to give GCP credentials. The developer didn't have to know anything. It's similar to, like, you know, Heroku's add-ons experience that they just, like, you know, use the, they just need to use their moment variable. So our Hello World application is going to have to change because, like, you know, we need to interact with Google GCP bucket. So this is a very small, so this may be like really bad TypeScript code because I'm not a TypeScript developer. And honestly, I kind of hate it with the yarn and NPM, but just bear with me. Okay, so what it does is essentially every 32nd, it generates a file, uploads it and lists the files, all the files from the bucket. So this is going to be our new application in server.js. And we're going to have a new dependency, which is Google Cloud Storage. Okay, so server.js is okay. And package is ready. Lacker file is okay. Yarn log is there. Okay, cool. Yeah, I think, I think we're there. We don't need to test it in local at the moment. So, yeah, as I said, like, you know, we just created this bucket. Yeah, I'm all in the chart. Let's make sure it's there. Now my service definition, the deployment needs to change. What I do here is that, like, you know, hey, take this credential and mount the Google Credentials JSON as credits.json, and then mount its address so that the GCP client can see it. One of the nice things about cross-band composition is that I don't have to know the composition to know the secret keys. It is defined as part of the API. So we don't define only the parameters and fields, but also connection secret keys that we can use so that we know what to mount and composition is responsible to populate those fields in the connection details. So I'm going to add here. We're going to mount it. Cool. So that's the final state of it. Cool. So I'm going to deploy this guy. That's, well, not modules. I don't want this.  Okay, this is more sane. Let me just check whether we changed the metadata of the template. Yes. Cool. So we just pushed our new template to our repo. We're going to use it and we're going to see all coming to fruit in our Go CD UI. Register it, analyze. Cool. Okay, so I think we're getting closer to the production platform right now. This is not just application with Bucket and you're going to have go application with something else. Or in case of, for example, a group of folks have one application and input as like, hey, do you want RDS instance? Do you want Bucket? It's like a really rich UI. Keep going. NA6. Yeah, so while it's doing its job, this is kind of the last step that we showed the integration. Next steps for like, you know, like where you can take this angle, right? It's mostly like you can, for example, you can make different choices, like githubs, in githubs, most of the people, they have a different repo for deployment, right? So instead of like, you know, Argo CD picking up from the actual code repo, you can have the GitHub actions to open a PR there, go through some checks, and it would update the Argo CD application from the repo that is used for deployment, right?  And you can use Argo CD image updater, which uses like, Semmer updates and everything. So I think it's pretty cool project, just didn't work for GitHub container history. And you can like, you know, add more input parameters, right? We just added Bucket, but you can add like, you know, hey, Bucket, but you can, you can add like, RDS instance and ask for only storage. And once they click, it creates like, you know, this most secure RDS instance in your VPN or IAM roles and everything. And the funny part is like, you don't have to give them the credentials. Instead of like, you know, like, for example, if you have to do it in Terraform, you have to give them the credentials. But in this case, you don't really. And when you make a new change, you just add another YAML to your hand chart. Hey, I wanted Bucket, but now I need RDS instance. You can just add the database and git push and new release. And you got your infrastructure ready for you. So it's all like, you know, it's part of the same pipeline, just application and infrastructure together. Cool. So this one has created our repo. Let's see. We got it images are pushed. Let's see. And our CD unknown, I think this is trying to fetch the image from GitHub container registry and Internet is too slow. What do you mean? Okay, I think it takes the wrong URL. So I'm going to edit this to fix it. It's probably in one of the skeletons. I got the URL wrong. Okay. This should be correct. Now, did they just implemented pull limits or something? Okay. Nice. So what we see here, as you can see, lots of things happening, like, right? We have our deployment service, but also Bucket. Bucket claim. And it resulted in Bucket composite resource out of sync. It's sinking. It's got 20 events. Okay. So it has created first a service account, service account key, crypto key and curing. So the reason that these are created before the bucket is that they are required for bucket creation. Like we have to give the KMS key name. So they're going to reconcile and like, you know, get up to speed to apply. Let me see what's the error here. Container port required value. Did we have the container port missing here? Okay. So I should have used the one in. Yes, I'm just going to copy this and fix it in the repo edit this file commit. I'm going to have to break this first and then have it refatch it. Is it really ugly? Okay. So I'm going to edit this deployment in the cluster to fix the problem. Apply dash and keep going. It's not even able to apply it. So let's delete this and let's sync it maybe. I have gone through the same thing a few times. It should have worked, but okay. So I'm going to delete this so that it fetches the new hand chart default automatic not get hand chart. It's going to be jr.na6-chart auto create namespace. Okay. Let's, let's create a new template because this one is not actually refresh the template with the fix and create a new repo. Yeah. As I mentioned, you can follow this tutorial when you get back from the conference. And as the next steps, like, I think there are like lots of things that can be improved. We can have different clusters and your Git repo could have branches like dev, prod and like, you know, main, let's say, and then those branches could just like, you know, push to specific clusters, which is similar to what, how Hiroku, I think they call it pipelines. They've got like their pipeline, prod pipeline and other pipelines, whatever you want to name them.  So let's go to NA7. Let's check if our fix made it. It actually didn't make it. Chart. Okay. So it says container port is required, but it's not there. And I just edit the file, add it by my hand. How can I think I added the wrong template. So I'm just going to copy it again. Sorry, folks. It's going to be okay. Okay. Okay. Now I got my new employment with the container port. I'm going to go to templates, crossplane template. Yeah, I'm all and refresh it, create a eight one. This is too much. I'm glad GitHub is not asking for money for this. So cool. This time it should work. Meanwhile, we can take a look at the Argo CD. Let's just delete the old ones. Okay. So our repo is created. So we're just going to take a quick pick, chart, templates, service. And yeah, right. Okay. All good. So yeah, this is kind of like roughly it. We're just going to wait for the image and also like, you know, bucket provisioning to complete. Yeah, but I think like, you know, that is kind of like wrapping up our tutorial. While we wait for it, do you guys have any questions about the architecture or looking at certain steps or frameworks? Can crossplane import existing infrastructure? Yes. The crossplane resources have a notion called external name, which is the way how it identifies a resource in the external API, which is like, you know, AWS API, let's say. So if you use like, if you create the ML with external name annotation and give the VPC ID when you create that, it's going to come up and say it's going to adopt the resource as if it was the one who created it. So yes, it would be possible. And you can do this in scaffolding as well. In composition, you can say, okay, like, I'm going to ask an optional parameter from user if they want to use the existing cluster, right? Or existing RDS instance, and in composition, they can patch that external name with that input parameter from user. So when they create any application, they can just point to something that that already exists. Any other questions about these parts? Oh, it's coming up. Okay, I'm just going to edit this. Small fix. I am calm. Oh, good. Okay. Oh, nice. It's all coming up. Pot it. So see, you did the pot is going to wait for container creating state for a while till the bucket provisioning is completed. And we see here that crypto key events is being created. Okay, Jason, I think my credentials might be wrong. I have a script, but I'm just going to apply this. Okay. So this is going to take a while. I'm going to hand over to Siddhartha to show their production environment built like with backstage cross pane and our go CD. And like, you know, a few other tools as well, all integrated together. Yeah, you can take it. It's working. Cool. We are going to share a little bit how group of what you can implement those tools, use the same ideas to make our developer day to day easier with removing all the complex that they have to create the ICD and the infrastructure and the cloud resource. So first, who is group of what you carry is group of what you carry is a Brazilian beauty company with 45 years of foundation is not built in the cloud. We have 44,000 employees. We have more than 4000 stores. We have two factors and native distribution centers. We are a multinational company. We are present in Brazil in another 15 countries, including us. We are the largest network of franchising the world. And we say that we are very complex ecosystem of beauty because we go from the industry to the point of sales to the logistics to our details to the labs to our omnichannel and we are through omnichannel company from the resource and development products to our clients. And we say that we are omnichannel because we have e-commerce. We have physical store. We have door-to-door sales. We have our distribution channels. So we are truly a omnichannel company and a multi-brand.  So that is a very complex ecosystem. And if you want to know more about our company, you can Google it. But how about try your products? You can go to this QR code and have a 15 discount on your first purchase using the cube 15 code and our marketing will be happy. So why you decide to create our internal developer platform? In 2019, we start our digital journey and a lot of say digital transformation and we can summarize that transformation into four pillars. We have two huge data centers that we are moving to the cloud. At the same time we are moving to the cloud, we are breaking our monolith applications into microservices. We are even moving how those microservices integrate moving from IBM bus to Kafka and APG and we are moving from an appropriate stack to more open source language. And because we are moving to the cloud and create a bunch of microservices, we need to give to the developers the autonomy they need. So that is why we start our internal developer portal. And basically the main idea is to make our developers day to day easier. So our internal developer platform in Portuguese we call PDD is the initial in Portuguese.  So developers don't have to worry about it. So basically it's a self-suffer portal that developers just fill some basic information and they have the application, a production grade and easily we are going to show in a few minutes. So the tool set that we are using is the same as you show in the tutorial. Our entry point is the backstage and we have our templates. So we do the Apple scaffolding, create the CI CD. We integrate with the toolings that we are using, that New Relics, Sonar and we go to the CD step using Argo CD and all the infrastructure that we provisioning we are using cross-plane. And our main provider is AWS. So I have a video if my Wi-Fi not work. So basically we already saw the backstage interface. So I'm not going to deepen the technical, I would say show basically the developers workflow. So they want to create a new component. We have a bunch of templates, the golden paths that are all built in. So FastFly, Serverless, Caught in Jungle. We have our front-end application as well and a more generic key for Docker and Slack, for example. Let's suppose that I want to create a FastFly application. So here is a minimal documentation of that template. So the developers know how that works. And we try to get the minimal information from the developers. They need basically the valor stream is just like a business unit. And they put the GitHub from the team. So basically they can fill the components. And then we go to the infrastructure part. So it gave them the autonomy to create the replication and create an infrastructure. So they can say, okay, I want to create a database. That's not 2002. And again, we try to get as minimal information required. We see there is no VPC ID, no even security group, anything. So they choose the engine type. So let's say I want to create a Postgres and the version. And I can even add more resources. So suppose that I want a S3 bug. Again, I can put a name. This is the same name, I guess. There is some validation. Should work. Yes. So after I select the template and choose the resource that I need, I can create. And that will take around 10 minutes to scaffolding the repository and provisioning the infrastructure. As we don't have that 10 minutes to wait for, I just have another repository already provisioned and created. So for our developers, they go to the backstage catalog, and they see all the information from their application, the repository. And we go there in a minute. They are go CD. So they can see the state, the new relic information, the sonar cube, and even the CI steps that, in your case, we are using GitHub actions. So if you go to the repository, I don't know if it's too small, we have in the same repository, the infrastructure and the application help values basic. So you can see the application information and the infrastructure. Basically, we scaffold the infrastructure. And we populate all the parameters. One thing that our fine ops team is happy because we put all the tagging to keep the cost. And we are using GitHub CI to do the CI and triggers the action in the Argo CD. And we can go to the Argo CD and we have the basically Kubernetes resources for the application. And we can see as well the resources, the cloud resources created by cross plane. So you can see that's the RDS. We see the RDS created. And in a few minutes, we have the application up and running and just the basic application that is basically one health check. And we have the resource. So we can see the database created. And we integrate the tooling that our developers need when integrated. So we go, they don't need to worry about integrating to new relic, to configuring their logs, to get the credentials for the database. We inject those credentials for them. So that's basically the workflow of our developers. And what are the benefits we are seeing with this approach? So currently, we are using our internal platform by our teams. We have 100 AWS accounts managed by this platform. We have more than 100 night applications, building user platform. We have at the moment 13 templates. And we have 195 resource. That could be a bucket, a database, a DynamoDB. And what are the benefits? We give the developers the autonomy they need. They don't have to talk to the infrastructure team to ask anyone. They can go to the portal and provisioning whatever they need. We reduce or deliver time. We don't have more jira ticked between teams. So we get the moment the developer asks for a repository until they have the host infrastructure provisioning takes around seven days. Now we can usually around 10 minutes. We can ensure our security and monitoring standard. So we put this image scanning, code scanning, all in the pipeline. We keep in the same repository, the product life, and the infrastructure information in the same repository. And because we are working in the same structure, it is a bunch of standard, we can have the teams collaborating better. So it is a pretty nice journey. And basically that's it. Thank you, guys. Feel free to reach me if you want to know about what we are doing. We would love to talk to anyone working on the platform because it's something new for us. And that's it. Thank you. I'm just going to show that it finally worked. I would die if I didn't show it. So with all the yellow screen and everything, I think it's finally come up. Okay. Yeah, just similar to the Argos Edis screens that Siddhartha showed, which were way more advanced. But here we've got our application, deployment, and then bucket. And it provisioned like in all these bunch of infrastructure, crypto, et cetera, service accounts. Finally, it published its own secret that has the credentials and it's mounted to the pod. And if we go to the pod, I think we're going to be able to get the logs. Actually, we can take a kind cluster is gone. Okay, my cluster is busted. But yeah, the secret is mounted and pod is running. And if you have any questions, you can come to here or cross lane booths or upbound booths. We would happy to take them. Thank you, everyone. Thank you.