All right, so thanks to those who came back. So the second lecture will be at least formally unrelated to the first lecture. But if you remember something from the first lecture, then perhaps some of the techniques or the questions will look familiar. So I'm going to start with some motivating questions. Yesterday we looked at how lattice points in R2 distribute themselves with respect to spheres of large radius. So now we're going to consider the hyperbolic plane. So gamma is going to be some group which acts cofinite volume on the hyperbolic two-space. And what we can take is we can take a point at O for 0. And we can take its orbit under gamma. And we're going to get some picture that looks like this. So you get some periodic picture. And this corresponds to gamma acts cofinite volume. This means that this picture really is the universal cover of a fixed surface of some genus. So it looks something like this. And here we have O. And maybe you have a fundamental domain, which looks maybe something like this. Maybe you have a fundamental domain. And you would like to understand, again, the type of question. So Br at O is the ball of radius R around O. You would like to understand the number of orbits of O intersected with this ball. And you could ask, is it proportional to, for example, the volume of this ball? And so this is analogous to the same problem in R2. But now the difference is that there's an issue. If you try to do even the simplest error term, so remember, we could try to somehow try to draw these fundamental domains like we did for the circle, something like this. And we could try to analyze the boundary of the circle. But the issue is the following. The issue is that the length of the boundary is proportional. Well, it's comparable to the volume of Br0. So both quantities are exponential in the radius. So they're very large numbers. And so they're of comparable order of magnitude. So if you try to do the base accounting using the same techniques as in the R2 case, then it's not going to work unless you have some extra ideas. And OK, so this is one type of question. But it turns out that the techniques that I'll explain, they allow you to treat more general types of questions. So here is another type of question that you can consider. So you can take O and you take gamma across geodesic. Here's gamma. And then this is covered by a picture that looks somehow this. This picture is not very accurate, but then you have stuff inside. This is the universal cover of this type of picture. And here's your point O. And you can again can ask if you take a sphere of large radius. So again, Br0, you can ask for the number of geodesics that this sphere meets in the universal cover. So what does it mean that this geodesic is a distance R less than R from this point? It means that if you drop the perpendicular, that this is perpendicular, then this length is less than R. So you see from this point, you might have a perpendicular that goes this way. You might have some perpendicular that goes on the other side. And you could have some other perpendicular that comes on this side. So from this point, you can draw many perpendiculars to this geodesic. And they would just correspond to the universal cover pictures like this. And you can ask how many such perpendiculars there are of length less than R. So you can ask for the number of, I'm going to call gamma tilde the lift of gamma intersect with Br0. This is asymptotic to what? And we'll see that it's asymptotic to the length of this geodesic times the volume of this ball. So we can treat the techniques that I'll explain. They can treat these kinds of more general questions. And the way to treat them is going to be by first establishing some equidistribution result, then see how it's related to counting. So in the case of, I'll just explain the case of this point count. So let's say that you take, again, the hyperbolic plane. Here's O. Now you consider BrO. And now, instead of considering the ball, let's consider the sphere. So the boundary of BrO is SrO. And we would like to say that when we project this to the surface, this curve that you get on the boundary, it lies quite uniformly distributed on the surface. So the type of question that the type of statement that you would consider would be the following. So suppose that you have a function from H2 mod gamma. So a reasonably nice function. And then you lift it. This is the lift. And you consider the integral of f tilde over this sphere. And let's say normalized by the volume of the sphere. Then you would want to say that this converges to the integral over H2 mod gamma of f. You would like this kind of equidistribution result, which you can get from some dynamical techniques. And once you have such an equidistribution result, then you certainly get, so if sears are equidistributed, then the whole ball is also equidistributed. Because if you have a result like this, then you can integrate. You can integrate. And you will get that the ball itself satisfies a similar type of integral property. You'll just replace the volume of the ball. And here you'll integrate over the entire ball. So if you have a distribution of sears, you have a distribution of balls. And if you have a distribution of balls, then how do you get the counting? Well, you can take your f to be a bump function around O on the surface. And then you'll see that the frequency with which the ball projects to a neighborhood of O is going to approach the volume of this ball. And so you get this counting result. So I'll do this in a little bit more detail in a second. But I just wanted to explain, at least vaguely, why such equidistribution results can give you the counting results. Are there questions so far about the idea? No. All right, so now I'll state things in the more general setup and how these techniques work. So I should say the following. So these types of questions about, for example, counting lattice points in the hyperbolic plane, they go back a long time. So I'm not sure exactly who were maybe the first people to do this. But I think maybe Hubbard or Huber and Selberg and some other people had some results about this counting. But the general setup that I'm discussing is following Eskin and McMullen. This is a little bit more recent. And their approach was one of the first ones after Margulis that used dynamics to study these kinds of counting problems. So some of their results were covered by Margulis, but not all of them. And most of the countering results before that were done using spectral methods like in the first lecture. So the setup is going to be the following. G is going to be some semi-simple Lie group. So if that is too much, you can consider SL2R or SLNR. Gamma is going to be a lattice in G. So again, SL2Z or SLNZ. And we're going to have a subgroup H side G. So I'm going to put a technical, this is a technical assumption, and I'll explain in a moment what it means. So such that G mod H is what's called G mod H is a fine symmetric. More precisely, this means that there exists sigma from G to G in evolution such that H is the fixed points of sigma. And to just have some examples, you can take SLNR and H to be SONR. And for SL2, you can take H to be the diagonal matrices. So this also works. And there are some variants of this. What I want to say is that, yeah, so this is going to be the setup. And so we're going to have these equidistribution results and counting results. Sorry. So the key assumption on H, so assume that gamma intersect H is a lattice in H. So this example when G is SL2R and H is this group where some group conjugated to this will correspond to the example of a geodesic. So remember, the geodesic flow corresponds to the diagonal subgroup. A closed geodesic is a closed orbit of the diagonal subgroup. So this means that if you have a closed geodesic, you have gamma intersecting the diagonal subgroup in a Z subgroup. And so this example will be a non-trivial example, which applies to this geodesic counting problem. OK, so this is the setup. And then the first theorem is that these guys proved this is an equidistribution theorem. It says the following. So we define Y to be this group, this thing that we assume is a lattice. So it's gamma intersect H, module H, and G, and X. So it's contained in X, which is gamma mod G. So you have a picture like this. You have your X. Maybe it looks like this. And then you have some subset. So both of them have finite volume, because then they have a natural volume. And Y sits inside X. So the equidistribution result says that for any F, let's say, smooth and compactly supported, it's enough to be continuous on X. So you have a function. You can average it over X, or you can average it over the orbits of Y. So you can do the following. So you can consider the integral over Y times G. So you act with G. So you have G mod gamma, and G acts on G mod gamma on the right. So you can act on the right by a big element in G. And you move around Y. So you apply an element, and Y moves in some complicated way. And you divide by the volume of Y, G, which is the same as the volume of Y, if you normalize it correctly. And you integrate F. So in this approach is the integral over X. Again, the normalization factor has to be the volume of X. The integral over X of F. And this happens as G goes to infinity in G mod H. So this quotient G mod H is some variety which is going to be important. So this is the equidistribution result. So then for a similar setup, we'll have the counting. Yes, well, you have to conjugate it. So you can take a conjugate of H. So everything I say is the group H should be this group up to conjugation. So there will be a conjugate of this group which will intersect as L2Z in a geodesic. And so this group will indeed not intersect as L2Z. But there will be plenty of conjugates of this group which will intersect as L2Z in a geodesic. And it's about those groups that we're talking. So does this clarify it? So I should say that, yes, the group H, I'll usually write it in some simple form like this. But it's always assumed that you can conjugate things to be in this form. It doesn't have to be of this, necessarily of this form. Where equivalently, you can always conjugate gamma. So you see if you have the lattice gamma, you can always conjugate the lattice. So you can take g, gamma, g inverse. And it's always going to be, again, a lattice. And then you can assume that H is of that form. But the lattice is a little bit different. So now you also have the counting theorem. So the counting theorem works in the same setup. But now what you consider is the following. So again, you have your g mod H. And you have here a point, let's call it O. And you can consider the orbit gamma times O. So this is the orbit of O. And so the assumption that gamma intersect H is a lattice is essentially equivalent in this case to the fact that gamma times O inside g mod H is discrete. So the discreteness of this set is equivalent to gamma intersect H being a lattice. So I'll try to come back to these two examples in a second and try to explain what these theorems are saying. But now, if this is a discrete set, we can start trying to count things. So we assume that Bn is a sequence of reasonable sets. So the condition that they introduce is called well-rounded. And I'll explain in a second what well-rounded means. So Bn are contained in this g mod H. And so the theorem, the counting theorem is that 1 over the volume of these sets, Bn times the number of elements in this orbit which intersect Bn is asymptotic. So if you divide the left side by the right side, you get 1. This is asymptotic to the volume of the Bn's. And I assume that the volume of Bn goes to infinity. So the sets get larger and larger. So let me do first the picture with the geodesics. So let's say that G is SL2R. G is SL2R. And H is the diagonal subgroup. Then so as you know, SL2R has a natural representation. So if you think about the adjoint representation, it acts in R3 of these guys. SL2R, so if you want this as the adjoint representation on R3, where equivalently it's locally isomorphic to SO21, so SO21 acts on R3 in a natural way. And so you get these three types of orbits. So the orbit, so hopefully if you've seen the hyperbolic plane before, you know that the hyperbolic plane corresponds to one of these hyperboloids. So this subgroup, this is also a hyperboloid or whatever this outside figure is called. So this is going to be G mod A. So the stabilizer of a point here is going to be this subgroup A. And you get G mod A. So this is the space of geodesics in H2. And H2 is this guy. So this group is G mod K, which is H2, and K is SO2R. So if you have a point here, then you get a geodesic on this plane. How do you get it? You take the orthogonal, the perpendicular, which is going to be a plane, and it's going to cut this thing in a geodesic. And so what does it mean to take a closed geodesic? So gamma inside SO2R acts on this. And so a gamma orbit on this outer hyperboloid corresponds to a geodesic. So let me try to draw some kind of orbit close to live on this outside hyperboloid. So if this orbit is discrete, then this corresponds to a closed geodesic. You see, if you take a non-closed geodesic, a non-closed geodesic is typically going to be dense on this surface. And its orbit in this space is going to be dense under the action of gamma. So gamma doesn't act co-compactly on, even if it acts co-compactly on the hyperbolic space, but it doesn't act co-compactly. In fact, most of the orbits are dense. But there are some points, the special points corresponding to closed geodesics, which will have this discrete orbit. So the counting theorem over here refers to the following fact. You take, essentially, imagine a sphere of large radius, and it will intersect this hyperboloid in some set. And the volume of that set with a natural measure will be proportional to the number of green points that you see in this picture. So this is the counting theorem for the case of geodesics. And for the case of when H is SO2R, this is just a hyperbolic plane. And we're doing the, so this assumption that gamma intersect H is a lattice is trivial because H is compact. So it's true for any gamma. And then we're counting lattice points in the hyperbolic space. OK, so are there questions about these two examples, how they work? OK, so now I can move on to the proofs. I have to explain first what are going to be the main tools that we'll work in. Oh, I didn't explain what well-rounded means. So well-rounded, a set is well-rounded. So this is referred to a family of points BN. So it says the following. It says that for any epsilon bigger than 0, there exists U epsilon neighborhood of the identity in G such that, so you want a set as well-rounded if you can approximate it from inside by smaller sets, by reasonable smaller sets. And you can also approximate it from the outside. So you want the following inequality to be true. The volume of BN, you want it to be bounded by y minus epsilon times the volume of the following set. So you take the intersection, the lower bound probably want the union, yes. So you want the union over all G in U epsilon of the translates G times BN.  And this should not be much larger than the volume of the set that you started with. And you also want a lower and upper bound, which should be 1 plus epsilon times the volume of the intersection where G is in U epsilon of G BN. So this G times BN is when you intersect them, you get a smaller set than BN. And you want this to be roughly of the same size for any epsilon. OK. So now the setup is as it is here. I'm just going to keep it. And so let me mention the tools that will be used. So main tools. So just as a reminder, so this appeared in Amir's lectures. So we have however more mixing, so it says the following. It says that if you have alpha, beta, two functions in L2 of G mod gamma, oh. So I'm going to put this start to mean this is, so this means average 0. So it functions that average to 0 on this group, on this quotient space. Then the following holds, you get that the integral of G pullback alpha times beta over this. I'm going to start abbreviating this space by X. So these functions, they asymptotically become orthogonal as G goes to infinity in G mod gamma. Sorry. As G goes to infinity in G. So you act on the function, you move one of the functions and it becomes asymptotically orthogonal to. Yes, sorry. Yes, thank you. Gamma inside G is irreducible. And this is probably an assumption that wouldn't be bad to make here just to be safe. Yeah, G is non-compact. Yeah, this theorem is certainly false for it. And yeah, it's false for G compact. OK, so now let me formulate it slightly equivalently. So now for any alpha and beta in L2 of G mod gamma, we're going to take, so we're going to do the. So this is just the same theorem, but now you see what happens if the functions have integral 1. And the claim is that this will be approximately the integral of alpha times alpha beta plus a quantity that goes to 0. So this goes to 0 as G goes to infinity. I am sorry for writing here. But does everybody see at least a little o of 1? Let me write it here, plus a little o of 1. So we have this asymptotic equidistribution, so this is just the same statement as over there. So then the other key input which we'll need is the following geometric assumption. So this is where the assumption that H is a fine symmetric comes in, so we have the wavefront lemma. So it says the following. So let me draw a picture on this side. So let's say that this is G, and inside you have H. So what the wavefront lemma allows you to do is it allows you to thicken H a little bit, such that if you move it, so here is GH, then, sorry, I want to act on the right hand, sorry, so HG, then, so if you move it a little bit, then this group is in the neighborhood. So this new neighborhood is not too distorted. So let me say the following. So for any neighborhood U epsilon of identity in G, there exists a neighborhood U delta of identity in G. So this is the type of statement that you see in continuity. For any epsilon, there is a delta such that if you take the group G and then you thicken it by this U delta, this is H times U delta, and then you act by G, any element G, so for any G and G.  So it says that if you've moved it, you haven't really moved. So nearby orbits of H look similar. Sorry, can I say again? Neighborhood, sorry, and BHD, sorry, any neighborhood. So with these preliminaries, we can prove the equidistribution result quite easily. OK, so proof of equidistribution. So first we're going to prove equidistribution, and then we're going to prove how equidistribution implies counting. OK, so what's the setup? We have X is G mod gamma. It contains Y, which is H intersect gamma H. And we want to show, so we'll show that show for B beta continuous, compactly supported, on X, that the integral over Y times G1 over volume of Y, beta, approaches 1 over volume of X, the integral over X of beta. And the way to do it is basically using the two things that we know how to do. So you see the problem with how more theorem is that it applies to functions, not to geometric objects, not to submanifolds. So what we're going to do, we're going to make a function out of our manifold. And we're going to make a function using the thickening that we can produce using the wavefront lemma. So what we do is we thicken Y. So fix an epsilon, which is very small. So we'll fix an epsilon neighborhood, which is very small, and how small it is will depend on beta, which is uniformly continuous. So you can assume that it's not just continuous, maybe smooth. Or if it's compact support, then it's uniformly continuous. So we thicken Y. And we're going to show that this is true up to any epsilon. So if we show that this limit holds up to an error of epsilon for any epsilon, then this is true in general. So how are we going to thicken Y? We consider Y times U epsilon. Sorry, U delta. U epsilon is our precision. And we thicken Y. So this is an open set, X. So if you draw a picture, this is X. Maybe here's Y. Then we've kind of thickened it a little bit. So now you consider the indicator function. So take alpha, let me call it alpha delta, to be the indicator function of this thickened orbit. And the point is that this, by how we more, we know that this will be what we want. How we more it tells us 1 over the volume of Y, sorry, 1 over the volume of Y delta. So let me call this set. So Y times U delta, let's call this Y delta, times the integral over Y delta times G of beta approaches 1 over the volume of X of beta of X. Because we're just integrating. So integrating against this function, alpha delta, essentially amounts to integrating beta over this open set. And we divide by the volume because, so you use the how we more theorem in this form. So you can move the volume of X to the side. So if you work out, you'll get exactly, if you apply just how more, you'll get exactly this statement. So now, but we want to compare. So what do we want to say? So I want to say, the claim that we're basically done is that 1 over the volume of Y delta, the integral over Y delta times G beta, is equal to the volume of Y delta. Yeah, sorry, I was confused. So the integral over Y delta of G times the integral for Y of beta plus something that goes to 0. So I claim that the integral, so this integral over here, so you can move the volume 1 over volume of Y delta over the other side. So this integral is basically the integral of beta over Y times the normalization factor plus some small error. So this follows from the wavefront lemma. The claim now follows from this wavefront lemma because, what is the picture? You see, so I'm going to draw maybe a caricature. So let's say that this is GY here. Can people see in this corner? So if this is GY, so yeah, YG, G acts on the right, then the wavefront lemma tells us that this Y delta, right? Y delta is the Y U delta thickening of Y. So the wavefront lemma tells us that if we act on the left by G on this set, then we're in the epsilon neighborhood of the, so we're in this epsilon neighborhood.  And beta is a uniformly continuous function. So essentially averaging, so the correct thing to be would be to just move this Y delta, so let me, so the average, so 1 over the volume of Y delta, the integral over Y delta of beta is approximately the same as the average over just this volume of Y, sorry, G. So because these, so they're approximately the same up to an error, which depends on epsilon and the uniform continuity of, and the uniform continuity of beta. So we get that these quantities are essentially the same, which is exactly this equality. So we just move one of the volume of Y delta to the other side. And this is what we wanted because, you see, here we have this integral over the thickening. And we just proved that this integral over the thickening is essentially the same as the integral over just the orbit itself up to some small error. And we proved this for any error, for any epsilon. We want this as small enough. So this gives us the equidistribution result. So OK, so I don't think anybody ever complained if I end early, so let me just say that next time I'll finish proving how equidistribution gives counting. And I roughly sketched the idea at the beginning. So if you have that these orbits equidistribute, then you can obtain some counting results. So the sphere equidistribution already gives you the counting for a lot of points. But I'll explain how to essentially kind of transfer these integrals in general. And so this idea of kind of transferring an integral from one homogeneous space to another is going to be useful, and we'll see it hopefully in the next lecture in another context. So I'm going to stop here. Thanks. Thank you.


Extensible integrated workflow solutions for all kinds of apps. I think that the next question that you probably have is something around that So dive a little bit deeper So I was actually doing this presentation the other day putting everything together and I stumbled on this blog post by Jeff Geerling who I think works at aquia And he had done a really good job kind of describing what the perfect local development environment Has the features that it has and these were the nine ones that I kind of extracted from it If you were to put MAMP up here, you could cross some of these off Possibly maybe not But you know usually one Technology has a couple one has another but these are the these are the things that you would want to have if you wanted to have a Perfect local development environment Calibox 2 as a CLI, which is nearly beta has about this many Simple and easy to set up as you might imagine are probably going to be in the GUI version, which we hope to release in a few months So that's kind of where Calibox 2 sits as like a local development product as an integrated workflow solution That has kind of all these features right now where it's at and when we're finished will have all of them so I Think that we've taken a huge step to solving the local development problem We're not quite there yet, but this is about how far we are now Many people here are familiar with version one of the product which was You know kind of a quick proof of concept that we developed quite a while ago Maybe about a year a year and a half ago and kind of put it out there to test the waters see what things are like It might be a good way to just kind of start there and figure out what version 2 looks like from there The easiest way to say it is that there's basically nothing in common between version one and version two That obviously doesn't contain a bunch of information. So I think I'll expand on that a little bit further so if you were to construct a not super Accurate access of things which is what I've done here. Just to give you a picture Mostly between you know vagrant on the left as I get more of a virtual a VM type tool It does do containers, but I think mostly it's virtual machine stuff and docker on the right Symbolizing just like containerization and container technology in general version one was essentially just a Very light wrapper around vagrant We spun up a virtual machine for you. We gave you a bunch of tools You've got what we gave you and if you didn't like it You know Version two is much more the docker side of things which means that we get all the features of docker and containerization Which we'll go into in a little bit greater depth so from a technology standpoint. This is kind of how things Stack up from user experience standpoint. You can also think you could you could think about call box Let's call box to CLI as just a really Superfast highly customizable version of vagrant for containers like a lot of the things that you do on the command line Are gonna be very similar to what you do with vagrant So just dive a little bit deeper This is essentially what the call box one architecture would look like You had to run on Mac. I was the only thing that it worked on it spun up a Vagrant VM from a puppet server Which is basically just an a booted 1204 instance with our calis-tac puppet set of manifests on top of it And then you just had one big monolithic server your entire infrastructure was in this one machine all of your tooling was also in This one machine by tooling. I mean things like drosh or note or whatever And you basically just put all your sites on top of that That entire stack so you had multiple sites running on one machine So each site was its own v-host essentially And then we had some nice integration with pantheon where you could pull a site down And I think it was fairly easy to use in the GUI as well Yeah, and then we gave you these things in v1 and again like we this is what we gave you if you didn't like it Then you were SOL Version 2 that's a little bit different. So this is the architecture in version 2 As you can see it's a lot more fun Fun is good So in version 2 you can run it on anything Windows Mac Linux Although on Linux, we've only tested it on Debian based distro. So if anyone has fedora or people are still using like slack ware Give it a shot. I guess So the architecture now is we still have a VM, but it's basically running boot to docker if anyone's familiar with that It's just a small lightweight VM that's based on tiny core Linux and We were running the docker demon inside of it And we can spin up containers and run certain kinds of apps on these containers So you could have a backdrop app that's running on nginx or an Apache PHP PHP app server with like Maria or MySQL you could have Express on some other containers You could have Drupal running, you know on a cluster of MySQL servers with Redis and memcache and other fun stuff And then with our plug-in architecture, which I'll show you later You can provide all these different connectors to different services so you could push and pull from pantheon or to aquea or or github Or to John Jenkins thing and do Jenkins things One of the really nice things about containerization is allows us to provide this kind of wall separation between The actual infrastructure that's running these apps and tooling that developers need so We don't put so if you're if you're using Drupal with drush as a lot of developers do Normally that kind of like sits like in your infrastructure like if you're running map It's just kind of like on your Mac if you're if you're using something like calis that usually you just put it into your web server And that's like where your drush is or you have it installed locally and you do the remote thing Which is also a good a good model, but in this model. We don't have any tooling in our infrastructure So our nginx cert while php app server or any of our other containers that might be hosting or running a Drupal app The drush does not exist inside that container neither does Grunt or any other set of any other set of tooling that you might be using What we actually do is we set up containers that run just are specifically designed to only run drush commands So we have a drush container and every single time you run a drush command it spins itself off It runs a container it attaches your app onto it. It runs the command and destroys itself This might seem somewhat excessive just to run a drush command But the model is actually quite nice because now you can write you can have one drush container one drush plug-in That can work on any of your apps, which is really nice So you have this ultimate portability and you don't really lose much in the process It also allows you to do fun things like you can have like four different versions of drush in this container If you want and you can kind of tell which one to use Which is pretty cool So much more complicated architecture, but it provides a lot more feature feature richness much more customization options And again more fun So just to go back to like hard numbers Calibox v1, which is most was vagrant based it took about 15 minutes to install it And that's basically like from I have nothing on my computer to I have a Drupal website V2 with with containers and some other things were able to cut that down to five minutes That's like downloading that downloading the actual CLI running the installation and then spinning up an app To compare kind of performance With v1 and vagrant we were using NFS for file sharing if you know anything about NFS and file sharing and Drupal It's not exactly the funnest thing in the world Which and that actually really slows down the web server performance quite a bit So we were implementing this thing that's pure to pure connector called sync thing, which is really neat And that out that actually gives us almost native performance on our on our server or on our containers So you can actually get like if you're just installing panoply like the time that it takes to run the batch API on v1 with six minutes So that's actually a good approximation for any real vagrant stack. That's using NFS to just two minutes on Calibox 2 which is a obviously a great improvement Again V1 was basically just a one monolithic web server with stuff in it v2 you can have a plethora of containers We have ones that we've written that you can use you can write your own fairly easily which I'll show you and Then we gave you these like approximately 20 tools and v2 basically you can use as many tools until you run out of memory Which I wouldn't recommend you try to do but you can't do that if you want and if you do that Please come and find me and show me that you've done it because I'd be interested to see what happens The other fun things are windows support So this whole thing works on windows now, so people who are using windows Congratulations, you now have a legitimate development tool that you can use And people who are on Linux again, we only tested it on Debian so far so Anyone who's using Fedora or some there some other Linux distra be great to see like what it actually does We're more than happy to provide support for it, but we'd like to have someone who actually uses that So one of the fun things about Calibox 2 as well is it's not Drupal specific You can actually run kind of whatever you want in it That's another advantage of having containers if you wanted to spin up like a mean stack and run express You could do that if you wanted to run backdrop you could do that Laraville Jekyll WordPress this other thing called Drupal whatever that is you could do that as well and The nice thing too is you can actually you can build these into repeatable kind of deployable prototypes So we've actually developed to that you can use right now, and I'll show you them back one for backdrop and one for Drupal But you could easily write your own So if you were a development shop that you know ran mostly Drupal sites and WordPress sites you could make an app You know that had the containers that you want to run that you're used to running if you're currently using like puppet Or chef or Ansible or something you can easily use those those manifests and transit them into containers And put them into this And if we can also you can also add additional function functionality with our Plug-in layer, which I'll show you about as well So if you had a workflow where you for example like pull your sites down from Pantheon and then push them up to Get hub to do you know Travis or something you could write that? Very small app it'd be like less than 300 lines of code Probably you'd have to build the containers and then you can deploy that to all your devs And that's what they use which is pretty awesome, and for right now When we have the GUI out you can think about how powerful that will be where you can have your devops person go in and do this And then the callibox GUI becomes kind of your deployment mechanism for all your infrastructure and your tooling and whatever So again, yeah, so one of the really fun things about callibox is this plug-in system I think this is actually what gives it quite a bit of power So almost everything in callibox the callibox to CLI is customizable or over rideable or extensible I'll go into like kind of specifics and show you that a little bit later But just give you a kind of idea of the breadth of the kinds of things that you can do is there's a it's Callibox 2 is a Node.js application So there are lots of events that are admitted that you can lock into and tap into We give you access to quite a bit of utilities to spin containers up and down and do that sort of thing So with this you can add like extra commands to the CLI you can add integrations with other things and You can do that sort of that sort of stuff You can build these apps that I'm describing we actually built the container engine as an interface So if you wanted to actually try to do this with Rocket or LXC directly you could actually write an implementation for that so we just chose to do Docker because Well, you already know so Yeah, so here we go. So this is the container. This is the interface. I was just describing we implemented Docker You could implement other things if you wanted But we just chose Docker because it seems somewhat ubiquitous right now although who knows what will happen Things are moving quickly So that's what we're that's what we're using for right now. That's the back end of pretty much everything It's based on the boot to Docker project if you haven't used it We give it a little bit more of a of an oomph for developers It's kind of not super useful for Drupal out of the box And all this stuff is open source. It's on our github Which just get github.com slash Calibox there's like 30 projects everything that I'm gonna talk to you talk about right now Is on there somewhere either as a repo or in documentation? We also have API docs and all this other fun stuff and it's all accessible from there So if you are taking notes that is the probably the most important thing to write down So what does all of this crazy talk mean? It means these five things that if you that this technology will save everyone tons of time You can finally use the tools that you deserve map is That's really all I have to say So, you know It's it'd be great to you know use use the news modern tools for our local development just like we do in our production Speaking of production with Calibox to you can actually achieve somewhat close to production parody If not complete production parody depending on how you go about doing it This allows you to standardize your team and your tools and your flows and of course It's fun to use the latest and greatest tech and not things that were invented in the Bronze Age of the Internet Again, ma'am. So this is my Like I guess metadata slide that you're not supposed to see that reminds me the things that I'm supposed to do So let's bump out of this and actually start to do some fun stuff And let's check to see how far this timer is good Cool, so that's good. That's always the boring part of everything So let's go in and actually try to do stuff Can all the people in the back actually see this kind of or no? Can I get a is that a is that a power to the people or a yes? Yes, or power to the people Like once Twice Maybe three times a lady Is that good? Okay, so I Call a box is an npm package So I'm not gonna install the whole thing from scratch, but you would just do an npm install global call a box to get it I already have it Here's some fun commands that we give you again I'm not gonna go through all these because you can read and you can use this thing So I'm just gonna kind of get it right to it, which is creating some some apps that we can run These are these two apps backdrop and Drupal these are two completely separate projects that exist that you can So this is you can implement kind of your own if you want and I'll show you as we spin these up I'll kind of show you what these look like so you can get a sense of how easy that that is So yeah, just to go through again real quick actually like so a lot of these commands are You know things that you're used to kind of seeing in vagrant space. They're very similar So let's just start really simply with a kbox create and we'll create a Drupal 7 app like this Actually, let's do this first So for any command you can pass in flag h to get all the options So this gives you a sense of the kind of things that you can do with this command when this command is over what you'll have is Basically two containers a PHP app server container and a web server and a in a Maria DB server And these are kind of the options that you can that you can give it What version of Drush you want to use the PHP version you want to use Whether what I build from a local Docker file or not all sorts of fun stuff If you don't pass these things in the command line will ask you because it is considerate So let's go in and actually do one of these fun things Drupal And I'm passing in this flag I which means just to automatically install it after I create it So what will this app be called? Let's call it awesome Then you get some nice options like what major version of Drupal are you trying to build an app for? I'm just going to do seven And it'll give you some nice options like oh what versions of PHP do you want to use? It'll give you the default probably best version for what you're running So if you put Drupal six in there, it would give you five three So you can choose that and then again you can pick a drush version. We'll use drush six for this example and then just some other fun stuff like my git name so I'll do something like this and But you didn't know that this is email So we can see what's happening right now is we've actually pulled in five different plugins that we use on this app I'll go through those in a little bit And now it's just pulling some containers from the Docker registry. I've actually already pulled them So they're just going to come down really quick And when this is over we'll have a bunch of containers to run our app Which will be exciting and as this is going on it will only take a few seconds I'll just go in and kind of show you what an app looks like so I created this awesome app This is the thing that I just created the architecture of the app is I wish I could make this side thing larger But maybe I can't but this is this is big though. So that's good So the essence of so an app an app is also just a node project And it's it's main meat Well actually so it has a good normal package. Jason. These are where you grab where you can grab specific plugins I'll go into plugins a little bit more in a second But the main the main action is in this cowlbox.json file This is where you can tell it all kinds of fun stuff For example, it's name the name that you want the plugins that you want to implement again I'll go into that in a second. There's this shares ignored directory I can get into that in a second as well, but here's kind of like where you get to the real the real awesome awesome sauce So here's where you can like specify your drush version your PHP version This actually allows you to inject press flow settings We do the database part for you But if you want to add like additional configuration and stuff you can do that It also will inject backdrop settings if you're using for using backdrop Here's again the email stuff that we put in here and here's the real fun stuff. This is the actual This is the actual like manifest file. I guess you would call it. This is where they contain This is the containers that we're grabbing and using There's just two right now this DB container with the has Maria and this PHP app server container So you might ask where do these things come from which would be a great question? And I'm here to answer it which is that they come from the Docker registry right now We've created our own PHP app server We've created our own Maria DB server and by default this will pull from The actual repo is on the Docker registry It's Calibox slash PHP app server and then the version of Calibox that you're running as the tag However, these are all over rideable. So if I wanted to do like You know Bob and like my FP is front page 98 by the way if I wanted to like load my front page 98 web server You know tag stable or maybe Latest would be more fun E You could do that as well or for example if I wanted to add some addition So this is like a very trivial example of like what a containerized infrastructure for Drupal would look like But I wanted to go in here I could also add solar or reddus or whatever and pull those containers down as well So you can kind of put whatever you want in there it doesn't and sometimes you can put seemingly arbitrary things in there in the On our github pages a Calibox app examples repo and in that repo There's a an example of running a Drupal 7 app with a hip-hop virtual machine Which you haven't done is kind of fun or haven't done before is kind of fun. I would recommend you do it I didn't know how to set up the hip-hop virtual machine at all But I found some guy who did and he had a docker container and I just literally put his thing in there I made a couple of small tweaks and it just worked So you have access to a lot of power with this one of the other really fun things about this too is if you If you're if you are almost 100% perfectly happy with our app server But not 100% perfectly happy with it. You can actually make small changes to it or use your own and Actually try it out. So the dockerfiles for all these are actually in the repo for the app itself So I could go in here and say yeah, you know what? I think that I think that the Calibox Maria DB zero seven zero app You know DB server is pretty swell, but what I really want to do is add, you know Vim to it to make it the best app server or the best DB server ever You could do that if you wanted and then Restart your app or rebuild your app with this build local flag passed in and instead of pulling from the repo It would actually Jen it would actually build it from this file So you can go in and you can play around and do all sorts of other things So if you wanted to use Calibox only to try out docker containers and multiple and orchestrate them like you could do It just for that, although I think that would be somewhat missing the point However, feel free to do whatever you want to do of course So that's basically the architecture here. There's this other small key here This basically just lets our reverse proxy, which is Apache. No that this is an app This is a a web server and to like redirect things to this machine for this app So that's all good and fun again, you could add additional containers. You can do whatever So this is already done. So we have an app that's been installed And we go into we called it awesome So now if we just do a kbox start this will actually spin up all the containers to get our app running So there's more so it actually will spin up more than just the app server and The DB server it'll also spin up all these support services and instantiate sync thing Which is the thing that will actually sync your code back and forth There's actually four containers that run by default just to power the whole magic of Calibox One is Apache which functions as a reverse proxy. So that way you can like actually type in, you know, my awesome app dot kbox And have it be directed to the correct container And then there's two other two of the things DNS masks just to handle the actual resolution If you've ever tried to do anything like this and you've managed tried to manually manage Etsy hosts That is like tantamount to suicide So having something like DNS mask is actually quite nice And then we have two special things sky DNS and sky dock which are darker specific containers And those four things are actually completely over rideable too So if you wanted to build your own custom version of Calibox and have engine X as your reverse proxy or just a random Container that prints out. Hello world forever You could do that. I think that second use case is probably what a lot of you are thinking already On how to use this so at this point we have a container. We have two containers running And we have a we have infrastructure that is prepared to receive a payload of Drupal awesomeness Which we will grab and put in there from some place So I'm gonna grab just the pantheon drop seven repo The reason why I'm doing this is because we have a plug-in for a press flow settings And this way we don't have to do any settings dot PHP management Which obviously is also nice So what I'm gonna do right now is run kbox again and what we're gonna see is that we get all these other fun things Inside of this app So we have we have commands that are specific just to this app Plus the other commands that you saw before Some of the ones sorry. I can't actually read this because this thing is in the way, but So you get extra stuff that are provided by these plugins and I'll go into the plugins in a little bit So things like drosh things like get our sink other fun things So we're gonna use the git plug-in really quick So which will be kbox git clone. I'm gonna do depth one because we're in conference Why I finally want to download the entire history of Drupal? And we're just gonna do this so what what's actually happening when this happens is We're spinning up a container. That's only purpose is to run this git command. It's attaching our app onto it It's actually pulling the code down and then destroying itself So you actually don't want so one of the nice things about this is we actually there's actually nothing that you really need to put On your computer everything is just inside of the VM including all your tools that you normally use Which actually becomes quite nice because if you extend this model to things like grunt or note or whatever Now you have a way to make sure that everyone literally is always using the same thing in the same environment Which is obviously gonna be awesome for you. So we have Drupal Now let's go to I guess awesome awesome What's the name of the thing awesome dot barely didn't read this awesome dot kbox and Here we go. Here's Drupal. Yay Drupal So, yeah Yeah, I mean the beauty of Drupal should never be concealed of course It does a good enough job of it itself. I suppose So yeah, let's just go through here. We're just gonna install Drupal 7 really quickly You can see that this is like fairly snappy to do which is which is pretty nice and then We can just bounce around and try some things out really quick. So you can see that there's fun things happening So let's just call this my awesome site And I'll put my email in there We'll make a secure Admin username with password that is also very secure I think that we're in the US And we don't want to receive email And I don't know what that is And yeah, here's Drupal out of the box and you can see that it's nice and quick much faster than even what you might expect for Something else that is local other unspeakable things Um What's that I think it could begin and end lots of things but that might be one of the choices So yeah, so let's just go to our Rex we don't need that Let's just go to our PHP info file real quick, which is somewhere in here Right. So here's our PHP info file This will just tell us some fun things about our instance And let's just figure out how we can go about maybe changing some of these things really quickly for fun um So as you saw before in our app example, we have this nice Version thing so we could switch that out and rebuild the app really quickly and get a different version of PHP So if you have Requirements like that you could do that Which is pretty fun the PHP app server that we have actually contains a bunch of versions of PHP inside of it So you can kind of specify whichever version you want it'll pick it'll pick the one that you're using The other fun thing is we actually have almost all of the configuration That's relevant to you for your services exposed to the outside so in the actual code directory here you get things like your APC config or your PHP I and I or your www.conf which is the FPM pool And your Drush alias and you can go in here and change a bunch of these things and rebuild your server and get that Stuff to take really quickly So you don't have to like actually ssh into anything and like dick around with Vim or nano or whatever those things are that crazy people do and And do that you can just change it in like a nice pretty thing like this on your Mac using the things that you like to use So let's do that really quickly. Let's say that we just like really need a little bit extra from our APC Let's go in here and you know, maybe this is a lot and we don't need that much So let's just bump it down a little bit and then We really think it's important to inject some special environmental variables into this Because we think that that's gonna make everything better So we've done this and now we're going to do this fancy kbox rebuild command and again as I was saying before you could actually You could actually pass this build local thing in so if you wanted to oh actually sorry We actually didn't even switch out this version of PHP either. So let's let's say we want to downgrade because We do So we'll do that as well but if you did this rebuild command all these things will take but you could also go in and use that build local thing and And do an add your vim in or whatever you want to do So you can rebuild in lots of ways So it's really easy to change stuff around and it happens fairly quickly because we're not rebuilding monolithic VMs from Puppet manifests or whatever people are doing these days So yeah, so let's do a kbox rebuild and what we'll do is it'll stop everything And then it will pull it'll destroy all the containers that we're running except for the one that has our data in it And then it will re spin all of them up with all these changes in place So when this is done, we should be able to re go to that info file and it will have PHP 5.3 and it will have The different settings and all of our stuff and it's going to be nice and awesome And while that's happening, I'll go in and show you kind of what these plugins look like really quick So plug-ins are ways to extend extend cali box. In fact, we dog food the entire system for the CLI itself So I'll just show you a really brief example of one You can add them to all of your apps really easily. So for example, we have a drush plug-in We have that same drush plug-in is what we use for triple six triple seven triple eight for backdrop We have a git plug-in you would theoretically probably want to use that for all of your apps no matter what you're actually doing Whether it's a node application or a PHP application or what have you? And they're very simple So I'll just show you a brief example of the git one do not be intimidated by a lot of those files They're mostly just like for CI and testing the meat is actually just this index dot JS file And this docker file the docker file basically just defines a container and this container essentially run This container essentially functions as a git executable itself So even though it is a container and has a service inside of it you can kind of think about it just as a git executable So that's kind of how that works the rest is in this index dot j s all plugins have this sort of structure where you get this kbox object and the kbox object has a lot of fun stuff in it and All that you can find at api dot calbox dot me Which is nice. You can see the kinds of things you'll have access to Certain config the actual engine itself so you can spin containers up and down The event run time so you can actually hook into events. So if you wanted to like say print a Beatles lyric after your app gets spun up because it really just gets you ready to do your stuff You can do that And if you do I would submit that I would suggest that you submit that as a cowl box plug into the npm registry So other people can get that functionality as well Yeah, so api dot calbox dot me that you can get that through the github repo as well But all the things are documented so you can start to write your own fun stuff We'll go back to the git thing, but it looks like this is done. So let's oh We actually have to start it also.  So the structure is pretty simple There's only like a hundred lines of code and this is what allows us to spin up and run git command So for a hundred lines of code, we have an app We have sorry We have a plug-in and a container that can run git commands on any of the apps that we want to have Which is super fun and super awesome, and it's very easy to do So for example when we were looking at that list of tasks before the command line print out We had that git command that we could run this is this is that that part right there We have a framework that you can use this task framework. We can easily add other commands So we added this git command and basically just runs this run git command function which we define further up here We also do some fun things. So like here's like the events system that we're using there's this post install event So when you install this Drupal app, it's also saying oh, hey like I need this I need this git container also like it's pretty important So grab it and install it for me as well so You can you can actually get the tools you need on all these apps too. Here's the actual run engine run Which is accessible in all the plugins. So here's the actual magic that we're happening Here's the git username and get email that we entered earlier. We're sharing our SSH directory So we can get our keys We're sharing the data container which actually has our code and stuff in it So every time this every time this thing runs it's just running a git command in the container with all the stuff we need as we showed you when we pulled down that that Drupal code earlier So let's keep going on Let's see What are we doing? Oh, yeah, we have this app So we've restarted this app and now if we refresh this info page We can see that the version has changed which is nice. We can see that we boosted our APC up by one I want to add a bookmark What's happening? There we go Yeah, so we can see the APC went up by one unit of Meg or I guess two units of Meg. That's fun And our PHP info Sorry, I guess we changed our memory limit so we can see that that got bumped down and then we Added that really awesome environmental variable so we can all be on the same page about the awesomeness factor Which is face melting So it's really easy to go in and like change your stuff around like we've provided same defaults But you can go in and you can you can change these things really easily It's a lot easier than having to reprovision a whole machine You can do it in a matter of seconds, which is obviously helpful So let's let's continue on and maybe look at this Drush example really quickly. Oh, actually this so this is This is a very very simple example Very small amount of code this essentially just adds press flow settings and backdrop settings Automatically to all the apps and containers that you have so that they know that they don't need to use settings on PHP So you could use this for any of your Drupal apps as well The drush example looks very similar to The git one it's a little bit longer, but not that much longer We just define a new task called drush, and it does this run drush command thing With the drush container itself which looks essentially like this Which is we actually just copy from the PHP app server itself, which means that those two things are exactly the same So when we change that PHP version in our config and we run a drush command We know it's the same version that Drush is running with the same version that our app server is running with which is obviously helpful and can alleviate pain down The road so we're just grabbing the app server container and adding drush things to it And that's what we're using so this actually has four versions of drush in it For major five six seven and back drush, which is like a hacky thing that sometimes works on backdrop So so yeah, I'll just show you like running it running a so if we're in the app here, and we just do like a kbox of drush status Now we don't have to have drush like anywhere on our stuff And it'll actually run and give us our our stuff as that we're running it natively, which is pretty sweet We can also go in and see that we provided a Some options as well So if you if you really wanted to just like try things on different versions like you could do this sort of thing So if we just do drush status again and pass in drush version equals five This should run with drush five now instead of drush six which you can see there is five dot eleven So this is kind of the power of having these portable containers You can run these different versions of different things and they're super portable and you can put them kind of wherever So lots and lots and lots of power in this sort of this sort of architecture So you can imagine you know if you're if you're a Drupal shop or an organization That's using like vagrant or something else like you can really simplify a lot of your stuff You can deploy it faster. You can change things faster And benefit quite a bit and of course your your actual development itself Will be a lot faster as you can see by just bouncing around here quite fast The last thing I guess that I can show you that is also fun is So inside of this inside of the app directory. You also get this code Directory which is actually where your Drupal code lives. So this is synced through really quickly So if I were to go in and just edit like Where is it index up PHP and just say like Something like this Right and maybe purchase sublime Don't tell anybody You know and then kick back to our Drupal app we should see that that is now the robots have taken over So that's just how you edit your code. So what's actually nice about this or you can think about this In a deployable terms like now you have an entire repo that has not only Your app configuration in it, but also your code So you could actually put this in github or somewhere somewhere else I don't know a bit bucket or whatever other people do. I don't I think it's just github really I mean but So you could put it online and you could basically have all your developers just grab it all they have to do Is pull it down run kbox install kbox star and they have their they have their app with all their stuff and that's great So you could do that as a deployment kind of like strategy for right now, which I think is pretty neat So that's kind of the meat of it I think time is starting to dwindle a little bit, so I think I think questions might be nice So I'll just kick back to the prezzo. Oh, yeah, let's talk about things to come Yeah, so this is basically everything that we have for right now I would consider it an almost beta for the CLI These are the things that we still have left to do that will make this the solution to all the local development problems So these are the things that we're working on for the next I guess half a year Which is to do push and pull integration with Pantheon and Microsoft Asia and WordPress support for people who are using WordPress also which may be some of you and maybe not be some of you So one of the big things that we had don't have we haven't done yet Which I think is gonna be a real awesome real piece of awesomeness is this idea of pushing and pulling So when you create an app you also say oh, yeah I want to create this app with all these containers and all this fun stuff But I also want to get my site from Pantheon or I want to get it from aqua I want to get it from some other place and you can pass in those options as well And it will pull the site down and then build the whole thing for you right now You have to like pull your code down and set up your database which is kind of a pain So we'll be we'll be providing that sort of thing and those will all be plugins too So if you're an organization who has a weird deployment sort of scenario You can pull from multiple places and push to multiple places for example of Calamuna We have standardized when we use basically Pantheon for almost all of our stuff But we push a lot of our stuff to GitHub so we can do GitHub flow and use Travis and that sort of stuff So at some point we'll create a Calamuna app Which we all use internally at Calamuna and that will have like all the containers that we use It'll have solar and red is the things that we're used to having locally And then we'll have integration to pull sites from Pantheon and push to GitHub and that will be the Calamuna app And actually speaking of apps I can show you what those look like really quickly because those are all Customized customizable as well, so maybe I'm just going to get a page because my sublime seems weird so So when we create this Drupal app See I think it's maybe we'll look at the backdrop one So this is what enables us to just do a backdrop create or create backdrop really quickly It's a small plug-in. It's a plug-in like any other plug-in and it basically just contains metadata, which is You basically just define certain tasks like hey I want to create this thing called back to this backdrop task and I want to like have these be the options that are available to the user and Then eventually and then you basically just build a skeleton of the app In this apps folder Where is it? back Here so this is what contains the actual like the package out jason and cow box out jason and the config and the docker files That we saw in the example That's basically all you have to do like I was able after I made the Drupal 7 app I was able to make the backdrop one in like seven minutes Which is pretty nice and if you're you know an auger shop that wants to like customize these things It's actually quite easy you can override all the stuff in the cow box config With a flat jason file, so all you would need to do is go in here This is just a list of the config. Let's actually oops K-box config less So here's our config So all you would have to do is actually sorry this gives me a lot of config because I'm inside the app So let's bounce out of it Let's do this There we go, so you can actually see up here here the apps that we are actually like using That's the github project that we're pulling from it's actually from the npm registry, but you can make your own You know cow box app, you know for kitchens or whatever and you could Put that on github create a node project with it and just edit this Or override this file with like your app and your version and it'll pull it down And you can you can spin up your app sites really easily so you can see the kind of power that this model has So that's just one to show you what the apps look like really quickly because they're quite simple So yeah, let's get back to the roadmap really quick, and then we'll do some questions Yeah, so the things that we're trying to do Next our integration with pantheon so you can push and pull sites to pantheon when you create these apps Asia WordPress and we're hoping to have all that stable version summer 2015 so not very far away We're actually very close to having that already So that's the exciting thing That's gonna be like DevOps Zen I think for everyone who's like using vagrant currently or any command line tool I think this is gonna be a much better way to do our stuff and faster way to do our stuff And then the big thing after that is the is the actual UI So this will be what we will kind of basically the calla box 2 version of what the v1 UI was And this is where things are really gonna be very very different This is when a DevOps person can write all can use calla box to write You know the kinds of apps and tooling and stuff that their shop needs and then they can Edit that config file get all that get all the stuff that they need and deploy all those tools to all of their people With the GUI so they don't really have to do anything You can standardize everything really easily and of course you have a cross-platform solution that all your developers can be on It's not tied to anything. It's not Drupal specific. You could do it for whatever So I think this is a win for everyone and that will be in fall 2015 If you contributed to the Kickstarter last year first of all, thank you very much and second of all like we'll have Betas of this GUI available for testing before this if you're wondering So again just to rehash these five things You know we're very close to solving this problem for people We think it's gonna be much much better than map much better than vagrant much better than anything else That's out there. It's gonna be the thing to use. I think it's gonna be a big deal And if you're interested, that's right. Yes. Now you have the power Thank you to Andrew Malis for finding this gift somewhere and If you're looking to hear more or just to figure out whether like your organization is maybe ready to start moving over to some Of this tech set up a demo with us if you're here at the column We can do it at the con if not we can do it some other time in the ether With the Google Hangouts or the other things that the crazy kids are doing And that's basically it So there's any questions. I'd love to answer them Hopefully there are or should be if not, I will be very disappointed and I will you will all be dead to me forever Yes, there's a microphone back there if you want to use it So let's say you switched the recipe down from 5.3 to 5.5 and PHP and you've made some APC hacks And then do you go down to using off-cache now? So what happens with those settings they get discarded or you keep that container, right? So if you were right, it's a good question. So if you were to if you were to go into So first of all, this is this is fun project that we did to actually enable us to build this app server Which might be also just useful for casual DevOps people or park or DevOps people Which is this PHP brewer project, which is also on the call a box to get hub repo And this is essentially a PHP app server factory, which lets you build from source different versions of PHP Sorry, I can't read this like so small on my computer. There it is PHP brewers. This is what we use to actually build the app server. It's really quite nice It's it's basically a docker into container that spits out PHP versions. There's good documentations easy to use You can build kind of basically whatever versions of PHP you want You can build more than one they all kind of sit together then you can use those in your other containers, which is pretty nice So that's what we're doing. So the way that this is set up is if you were to switch from five three to five five We're not using APC and five five reason off-cache We don't actually have any off. We don't have an off-cache config file right now But you could put one in there and have it kind of work the same way But by default right now, it'll it'll just disable There's no APC extension for five five in our app server. So it just doesn't get loaded Off-cache gets loaded instead of APC Yeah, it's a good question Yeah, nice t-shirt So you showed how to do like a new Drupal install What would you do if you had an existing code base and an existing database that you wanted to set up using this right? That's a great question. So John who's sitting right there wrote this nice quick start guide. That's on our wiki That shows you how to get to how to currently import a site manually into Calibox I showed you how to do the get part of it. That's fairly easy But the DB is actually exposed to the outside world and you can actually access it with like sequel pro or whatever So that would be the way to get the DB in there, but Yeah, Calibox slash Calibox in the wiki. There is a quick start guide Somewhere there's actually quite a quite a nice amount of things in here for anyone who's interested in learning more But yeah, there's a quick start guide This basically will tell you just how to get like a for example like a pantheon site into Calibox 2 But this should be applicable to many other many other use cases as well. Hi. Hi Well, first of all, I wanted to say This is so cool. You're so much ahead of anyone in the field and I run into your session by Really just an accident because it was named something not related to vague and block your devil Else, I thought it's a workflow like content workflow thing My question is you mentioned that This will be cross-platforms of Windows Mac and Linux. I'm sure you covered that too much So can you elaborate on the what is being used for Windows and Mac and specifically around? syncing code like sync folders sure and the performance of those solutions, right? Yeah, sure. So Cross-platform it's a it's a node. It's a node module. So it works kind of just that way Command line should work on Windows and Linux. We've tested Windows 7 and Windows 8 We've tested debian and Ubuntu. We haven't tried fedora yet It seems to work pretty consistently on Mac as well So you could you can you can follow the install steps in the wiki for Calibox the command line of Calibox And it should just work on all those things Of course like we developed mostly on Macs So there likely are going to be more bugs than the other things But we're waiting for people to use it and find them so we can try to fix them For the GUI side of it because this is node We can actually build an angular app on top of it with node webkit And we actually have a prototype of that that already works on Windows and Linux and so the GUI will be this node webkit app It'll be a dot app file for your Mac It'll be a dot exe on Windows and there'll just be a bin on Linux So that will be how those things work regarding sync thing, which is what we're using for The actual file sharing we try to implement with NFS first and it was just ridiculously slow like depressingly slow We're just like we can't use this.  We found sync thing It's a product that's also still in fairly heavy development. So there are some problems with it And is moving ahead pretty quickly But the nice thing about it is you're not it's it's syncing. It's not sharing So you're not mounting any folders You don't have to do what NFS touch was just like actually check to see if a file has changed every single time You do a read which for Drupal and I'm out of like a ton of small files is really slow It actually just pulls for changes every couple of seconds I think it's like two seconds two seconds and then we'll sync the file over so it's actually It's not so you don't get the change as quickly as you would with NFS But it's virtually the same unless you're one of those people who's just like tab tab tab tab in which case Just like chill out Um But the real nice thing about it is you get basically native file system performance for your web server So you can just develop really really quickly so anytime that you might lose and waiting for the thing to sync you're gonna make up Like almost instantly just by not having to wait 45 seconds for your modules page to load or five minutes for your like features to Diff themselves Which you know it sucks basically so what are you using for the Docker hosts? So the Docker host is is boot to Docker So basically what we when cowlbox installs it'll install boot to Docker Which is just just tiny core Linux with the Docker demon inside of it running in virtual box So that's what the actual infrastructure is all your containers live inside of there Nothing is really changed on your computer at all And that's what we're using for the Docker demon. So when we run commands, we're just we're hitting the Docker room We're using the Docker remote API hitting that stuff and that's how the magic happens. Thank you. Yep Hello Indeed um, can I make your boot to doctor use parallels? And the same thing in solution you've implemented is that easy to reuse elsewhere because that sounds cool Yeah, I think so. I mean we we actually um, I think at some point we're probably gonna publish We basically just build a rest API wrapper node wrapper around it at some point We might want to just publish that for other people to use do that. It is yeah, actually I saw you ping I saw you on some of the issue queues Yeah, it actually so NFS, I mean is much easier to implement It's very simple Sync thing was basically a giant pain in the ass to implement, but the benefits. I think made it justified Yeah, I mean I use it on my computer. I never thought of using it for development. Yeah, we actually we would ping The Borg as we call him about it. He's a guy who like runs a project comic. Yeah. Yeah, I'm age and And asked him, you know, hey, we're using it for this He's just like this isn't really the use case that I had in mind, but I guess it'll work Like good enough for us. It's not a fast. So so yeah, cool. Thanks We're actually currently using where I just started using boxing. Okay I'm just learning about this setup, but it looks very similar to this I was just wondering if you can sort of compare or you know, give me some advantages or disadvantages Sure. Yeah, I'm not super familiar with like the actual details of boxing But they are that I think that they try to solve some similar things. I think that are I mean I think our thing is obviously better I don't know to what extent they've implemented container tech in boxing at all I think they do that to some degree, but I'm not 100% sure if anyone knows just feel free to Like shout out also I'd be interested to see like how they handle the syncing and how they how their architecture is extensible like ours like I think that the fact that we have this plug-in system and you can basically add whatever functionality you want at any time It makes it just a lot different than just a straight-up like orchestration tool like something like figure or even like docker compose promises to be I'm sorry. That's not like a super great answer But that's I think that's the most the most honest I can be with you without just lying about boxing Unless you want me to in which case I can do that as well Hi there. Hey, um, so since this is for local development Version one you have to be online in order to create a new site on your local machine How does this handle if you if you don't have internet? That's a good question. I think I Think that it should work, but I'm not sure we actually have tested. Have you tested this yet? Not I'm not I'm not sure to be honest the way that the DNS is handled it might be it might I think that we'd use open DNS or to Google DNS server So if that's true, then we might you might need to be actually be online, but that's something that we could change So like when you spin up a new site with version one it has to go and download it from the internet's Right does to have to do that as well or do you have something? So if you're if you're just spinning up the containers and you've already downloaded the containers before I Don't think you don't need to have to be connected to the internet to do that because all those all those containers The way the docker works is it basically just like takes these diff these diffs of of images and that kind of piles them on each other So if you have all of them and it sees that you have all of them cached it'll just use what you have already So I think that probably should work Especially if you pass in that like build local flag in which case it'll just kind of like do that cool So I think that it should yeah Hi again, so the question is now that I have this so I can see that this is not intended towards production So how do we once we're done? Let's say making an app my teammates are done How do we take this image of kind of like get a puppet or chef recipe to put it on bare metal or put it on a BPS Is there any plans to we're doing that? Yeah, sure. Yeah, so this is I mean Yeah, this is purely for local only like it would be very bad to try to like put this like to run the Calabox CLI like on Linode somewhere and run your machines with it That would be very bad So there's a that's a good question I The first part of it is the deployment strategy for this is going to be what what happens when we do these push and pull plugins So for example like if you consider like a Pantheon app for example Like the Pantheon app would have an PHP app server MariaDB solar and Redis that the containers that Pantheon actually Uses and those would be very close to production, but they they're not going to be the same But they're going to be very very close And when you go to actually so if you were just if you were just making a site and you wanted to deploy it to Pantheon You would just do a kbox push put in your Pantheon name or whatever And it would just create the instance on Pantheon and push your stuff up And that's how your thing would get on Pantheon for example for something like Linode You could theoretically run if you had if you're using like Puppa chef it chef or whatever to build out your infrastructure And that's production ready stuff You could have all that stuff end up in docker containers and you could use those docker containers on calla box if you wanted In which case the deployment I mean you could write your own app that did the deployment for you as well But it might just make the most sense to have you go in that case you actually I guess you could use calla box to deploy your containers and orchestrate them both locally and for production Like if you follow the containers that you have our production ready, but that is not that is not the intended use case But you could you could do that I suppose You would just have to take your current manifests or recipes or whatever and get them To not generate VMs of the generate containers instead and then just put them into this as I as I kind of like showed Aaron Porter, I'm expecting a heckle at some point also Yeah, yeah, we were actually looking for Fortran developers, but you know couldn't find any Any other questions? I was gonna ask if you were being bought up by Verizon I'm not allowed to discuss that in public Good question. No The actual answer to that is no for anyone that doesn't know that I'm joking I think that yeah, we have time for one more if someone wants to just say something silly other than that I think we're we'll wrap up only no one wants to say anything silly Yeah, it's a good question. So if you if you go to calaminer.com. There's a calla box page Where you can sign up for a demo that will get you on the mailing list. There's also a Google group. What is that? No, it was some random thing Anyway, yeah, so if you go to the calaminer website, there's this calla box section Also, those clouds are awesome Tiago. I really like them. Oh, sorry then go to hell Tiago So you can you can request a demo and you can sign up for email There's also a Google group that you can sign up for which I think that I think just you can get some email like at calaminer.com and Yeah, down here request a demo so All right, I think that's it, but thanks for coming. I appreciate it Handouts at the booth come to the booth and get a handout the calaminer booth. I Don't know what number is it behind four kitchens


Hello and welcome to Around the World in 8 Minutes, a show by People's Dispatch, where we look at the struggles of the working class and the oppressed, as they wage a valiant struggle against capitalism and imperialism. We begin with Venezuela, where on February 4th, tens and thousands of Chavistas took to the streets of Caracas to commemorate the National Day of Dignity. The National Day of Dignity marks the 20th anniversary of the Civic Military Rebellion of February 4th, 1992, an uprising led by Commander Hugo Chavez against the neoliberal government of Carlos Andrés Perez. The rebellion was aimed at stopping the neoliberal package brought to Venezuela by the International Monetary Fund and against the repressive reforms implemented by the government. This year, Venezuelan President Nicolás Maduro led a military civic walk event at the mountain barracks, where the remains of the Bolivarian Revolution leader Commander Chavez are laid to rest. On February 2nd, another event was organized marking 21 years since Commander Hugo Chavez was first phoned as the President of Venezuela. Venezuelan President Maduro and other government officials reiterated their commitment to defend the legacy of Chavez and continue working in defense of democracy, independence, peace, social justice and sovereignty. After winning the presidential elections on December 6th, 1998, against Rafael Caldera, with the highest percentage of popular votes in four decades, 56.2 percent, Chavez on February 2nd vowed to democratically reform the 1961 constitution and lay the foundation for a new and inclusive constitution. The same day, he began the revolutionary process and called for a referendum for the creation of a national constituent assembly to write a new constitution based on the principles of the liberated Simon Bolivar, the principles being socialism, nationalization and state-led economy. The plebiscite for the drafting of a new constitution was approved by 87 percent of the vote. On December 15, 1999, the constitutional draft that established a new social and people-centric model of the state was approved with 71 percent of the votes. It also renamed the country as the Bolivarian Republic of Venezuela. Since the beginning of the Bolivarian Revolution, Venezuela has experienced profound social, economic and political changes. Commander Chavez introduced several policies, improving the people's access to food and housing, free health and education, promotion of employment opportunities and the extension of social security. During the administration of President Chavez, the rate of hunger, poverty and extreme poverty came down by more than 50 percent in Venezuela. This was recognized by the food and agricultural organization of the United Nations in 2012. In the same year, the United Nations Economic Commission for Latin America and the Caribbean ranked Venezuela as the third country in Latin America with the lowest percentage of poverty. Higher education and university education became the right of all Venezuelans during Chavez's rule. It was ranked as the fifth country in the world and the second in Latin America in terms of university enrolment. Currently, Venezuela is the Latin American country with the third highest literacy rate of 97.1 percent. The Bolivarian Revolution created the Ministry of Popular Power for Habitat and Housing, an entity that executes several social programs to provide dignified housing to the Venezuelan working class. Through these programs, over 10 million homes have been rehabilitated and over 30 million families have their own homes. The government of President Chavez also launched several healthcare programs to provide free medical and surgical services to the poorest of the poor of the country and build high technology centers to carry out special medical research and studies. These social programs have been sustained by the current government of the United Socialist Party of Venezuela led by President Maduro despite the brutal economic sanctions imposed by the United States and its allies against the country. In addition to these, many other social security programs have been introduced. These include the local committee for supply and production, CLAP, for house-to-house distribution of basic food products, the humanized childbirth plan, a social program aimed at protecting pregnant women throughout the process of gestation, and the great housing machine, a program to provide housing for people who live in precarious conditions. The government has also introduced several youth and student programs providing scholarships, stipends, and free food to hundreds of thousands of young Venezuelans. This marks a continuation of the legacy of Commander Chavez, which the people of Venezuela determined to protect and preserve despite all the attacks against them. We now move to South Africa where all 2,895 dismissed workers at a Toyota factory in South Africa's Cozooni Natal province have been reinstated. This was after the National Union of Metal Workers of South Africa, NUMSA, intervened and engaged the management in negotiations on behalf of the workers. The negotiation ended with the company agreeing to reinstate all the workers with the written warning. It also agreed to review and reach an agreement on the terms and conditions under which it is obliged to give out bonuses. This was the issue around which a strike took place leading to the dismissal. At a meeting in December, the management of the company had praised the employees at this factory for their work and indicated that they would likely receive a quality bonus for it. However, by January, the management changed its stand. The workers who were asking for their bonus were instead asked to do overtime work by the management. The workers who were even willing for this provided the bonus was paid. Amid this deadlock, when NUMSA tried to intervene, the management refused, saying that it is an internal matter. Frustrated by the management's refusal to engage with the union, the workers downed tools on January 22nd. However, they had not gone through with the arbitration procedures mandated in the labor law in order to have a strike being regarded as protected. Participants in a protected strike cannot be dismissed by the employer for downing tools. The management's refusal to engage with the union did not allow this option for the workers. Soon after the strike began, the company warned the workers in writing that they would be dismissed if they did not return to work. When the strike action continued, the management fired 2,895 workers on January 24th. Production was hit, including of a large number of vehicles which are exported to other parts of Africa and Europe. Due to the impact of the strike, the company agreed to negotiate with NUMSA to bring the industrial action to an end. After successful negotiations, the workers returned to work on February 4th. The company agreed to reinstate all those who were dismissed. It also agreed that it would not take any further disciplinary action beyond a written warning. NUMSA said in a statement that the quality bonus issue would also be reviewed and a standard would be set which would clarify the exact terms and conditions for workers to receive this bonus. The union pointed out that the government has done everything possible to erode the right to strike. It has introduced changes to the labor law to force workers to ballot before embarking on a strike and it has also introduced a poverty national minimum wage of RAN 20 that's around $1.35 per hour which undermines centralized bargaining. Finally, we go to Palestine where a youth, Mohammed al-Hadad, was killed by Israeli forces on February 5th, Wednesday in Hebron in the occupied West Bank. Mohammed was shot during a protest against a Middle East peace plan that is proposed by Donald Trump last week. According to reports, a small number of Palestinians were protesting against the deal near an illegal Israeli settlement in the city on Wednesday when police opened fire on them. The Palestinian Ministry of Health confirmed that the death was caused by a bullet fired by the occupying forces which penetrated Haddad's heart. Hebron in the southwestern West Bank is one of the largest cities in Palestine. It is a small illegal Jewish settlement heavily guarded by occupying forces. The agitation in Hebron was part of the ongoing protests across the occupied territories against a so-called deal of the century prepared by Trump's son-in-law Jared Kushner. The deal was prepared without consulting the Palestinians who have been boycotting the US since December 2017 after Trump recognized Jerusalem as the capital of Israel and shifted the US embassy there from Tel Aviv. Trump's act was in complete violation of international consensus and law. Trump's peace plan is heavily biased in favor of Israel. It recognizes Israel's sovereignty over the illegal settlements in the West Bank and East Jerusalem and allows Israel to annex a large part of the West Bank. In return, it promises a scattered Palestinian state with limited authority and a capital somewhere in the outskirts of Jerusalem. The deal has been rejected by the Palestinians as it does not address their main demands of a Palestinian state within the 1967 borders with Jerusalem as its capital. It also does not address the issue of the end of all settlements and the Palestinian refugees' right to return. Israeli forces also killed another Palestinian youth on Thursday. Yazan Abu Tabaik was killed in Israeli gunfire in the northern West Bank city of Jenin. Several others were injured in the firing. The firing happened when people opposed the demolition of the house belonging to a Palestinian named Ahmad Conba who has been accused of killing an Israeli citizen. That's all we have for this episode of Around the World in 8 Minutes. To read these stories and more, visit our website peoplesdispatch.org and follow us on Twitter, Facebook and Instagram. Thanks for watching.