 Well, okay huge turn out here That's fantastic. Look. I really appreciate everybody turning up Southern considering all the pretty amazing sessions that seem to be going on This is the sympathy components a travel guide session. So if you're misplaced, this is the time to escape Otherwise, I think the doors will be locked in a few moments. So you're stuck with me My name is Piers Wormers I'm not a Drupal developer. So you probably don't know me and I'm really excited to be here to meet everybody maybe after the sessions over But I've been working in PHP for a long time now more than 10 years and I've also been working with symphony right back from when it was as early alpha stages and Predominantly now I work on symphony based projects So before I get started onto the real core of the topic today I thought it probably is probably better to give a little bit of context as to why we're probably all here and Interested in how symphony and Drupal are getting together. So to take a little bit of a step back in time That's 1996 which is pretty awesome and When PHP gets its first release and it's great the community loves it for the first time we can embed simple script into our HTML documents and that's pretty exciting stuff But it's a powerful tool as we know PHP is and it also Gave us a few problems and we were bad. We did naughty things with our PHP and I'm probably not alone saying that I have been guilty of things like this back in the day and Yeah, not particularly pretty a PHP community grew really strongly and there was a strong open-source ethos that developed in the community and While there were a lot of projects blossoming all over the place and a lot of really cool applications like Drupal and PHP BB these communities were grabbing coded around the place and so were the developers but not to pull any punches by my sort of perspective sharing in PHP really was about copying and pasting and That's not the greatest way to share code now. There were things to help us get it now make it a little bit prettier. I know but Yeah, I don't know how many people here have actually set up a pair channel Right, so it's a good example for a community that's really heavily Focus on open source and sharing code the fact that one of the predominant sharing mechanisms isn't really used by many people at all And that's a big problem so by my thinking Pair really is facing a few problems and it's not a great way forward But in 2009 something changed now PHP had a whole lot of object-oriented support already But it was getting pretty savvy in the way. It was delivering features to us and there are a few features delivered in the PHP 5.3 release Well a couple that we'll be talking about today or one in particular is namespaces which really presented a few good opportunities for the PHP community to Clean its act up a little bit and get serious about sharing code and writing clean code And shortly after PHP 5.3 was released the framework interoperability group put together a couple of recommendations and They were the PSR 0 1 2 and 3 is everybody heard of these Has it is anybody working sort of towards those stands? That's fantastic Look, it's probably worthwhile then I'm glad that there's not many people that really have had much to do it So I'll go through a couple of slides just to give you a very quick run through what it was all about So PSR 0 came forward and made recommendations about how we name classes and how we use namespaces and Then in turn make sure that we put those classes in a directory structure, which is succinct With the class name and namespace so I have nothing too exciting there But it's a good thing to do when you're trying to keep the code clean The PSR 0 1 was about getting a little bit more standardized in the way we name things So we started getting directions how on how classes should be named How constants should be named? How properties should be named and also how functions should be named nothing too special there either But it was really big to see the community actually working towards a single target and that was conforming code PSR 2 got a little bit more extended on that basic premise And told us that we really must be using namespaces from now on. This is important stuff And we really need to be using use statements to declare what classes rely on We're told a little bit more about how should in data into our braces. That's the most important thing in coding, of course I'm a bit of an obsessive compulsive So things like that really disturbed me when I'm writing code and over the years I kind of switched between different styles and I'm just glad someone's telling you how to do it now So it actually makes sense to me We also had to declare how the visibility worked for our methods and properties in classes Another good cleaning tip there And so things were getting pretty organized in the PHP community Okay, I'll leave it there for a second and I'll jump on to one of the main topics today And that is what is symphony so symphony is a little bit hard to describe in some ways I think particularly because it started like a regular regular PHP framework back in the day. So symphony version one was like many frameworks out there a big blob of code that sat there and When version two came along it got a little bit more complicated in some ways. So symphony is These things so first of all, it's a collection of object-oriented PHP 5.3, of course classes They all conform to the PSR recommendations put forward and The classes are all grouped into components. So this is kind of interesting So the components themselves are just simply libraries that are organized in a way where they're reduced into their core functions So PHP so symphony framework, how does this differ? So symphony framework is really just these components put together into a context So it's an implementation of symphony components and this implies something quite interesting and I'll refer to a quote here, which I think is pretty concise and illustrates things really well So symphony is the coupled components that are put together in a context to solve common web problems And that's exactly what's happening with Drupal So what are these components? Well, there's a big list here if we run down the list You'll probably recognize a few little pieces that pop out and as we said before they're there to solve common web development problems things like working with HTTP routing security configuration management Working with forms and form validation. There's some also there's also some very cool components in there for translation with I-18n and also L-10n handling. So all these things kind of put together and Built into a distribution, which is symphony framework But they're not required you're not required to actually use symphony framework to get the benefit out of any of these components They're all decoupled So decoupled components To put it simply these these components can be moved around as you need them So you can cherry pick the ones that are appropriate for your project This has been the core move for the symphony 2 framework now This is even different to the symphony 1 framework, which as I said was much more of a standard PHP application a big blob of code but into everything changed Symphony symphony's core focus was to make these components as decoupled as possible But this actually Causes a couple of pretty interesting questions for the PHP community. What about cross dependencies? If you take a PHP library out to its most reduced minimal function There's always gonna be the case where it requires some other library and that's a really complicated Problem when you start thinking about it. So one component requires another it also requires a specific version Two components that are interlinked together may also share a dependency of a single library So now we start seeing a pretty complex map of dependencies here and that needed to be solved So there's also been another new community that's been popping up recently and that's the composer utility Has everybody here heard of composer? Okay, so that's great. So composer is simply a dependency management utility and it knits a couple of things things like PSR 0 Which defines how packages or all components be structured along with some versioning Specifications to make sure they can be mapped into a release cycle and it maps all these things together and allows you To much more with much greater ease include a component into your project now composer also is Often talked about in relation to Packages so packages is a directory of thousands and thousands of packages Which allows which is a lookup service for composer By the way, if you're not wanting your code open source There's also a SATA server there that you can arm take a look at if you want to work within the bounds of the company It's definitely worth checking out So the composer and packages work together to map dependencies and they do this with a simple configuration system It's a composer json file and each component in a system Has one of these and in turn it maps its own dependencies inside that file. We'll take a look at that in a second There's another part to composer which is a composer dot far file This is actually the command line utility that you run to install the packages on your system if you're familiar with drush It's a similar sort of idea where you download a package and that provides some command line tools for installing these packages and The final part to compose that which is really quite interesting Is a lock file so For whenever you're working with teams and you've got a system which requires one system requires another It can get quite complicated when you have that call from a fellow developer saying it's broken in my system And a lot of the times that can be noted down to a version conflict where you can't guarantee that everybody's working off the same Versions Because they're working on different systems pair was really notorious for this where you'd install a library via pair It would work out for one person with break for another So composer is really good at this It supplies a composer dot lock file which you actually support Send to your git repository or your versioning system and then distribute out across a team And that way you know that everybody in the team is running off exactly the same version pretty cool feature So how does this look back in our dependency maps? Well every note as we said has a composer to json file in that file It will then in turn map out what it requires and what versions Those files look I've taken an example here. This is kind of interesting because this is actually off the Drupal dot org site I found this Drupal git library and the developers here are also defining a requirement Just jump up here a requirement here, which is a project outside of Drupal being dragged in as the Gitter library and in this case this module is Marking it as a dependency So that's quite interesting. So what are the next steps if we're trying to do something like this with a composer json file? Well, we'd have to flip back to the terminal and as we said looked at before there's also a command-line utility as packaged into a far file For those of you who aren't familiar with far files It's an archiving system for PHP and you can embed a micro application in there There's also a pain in the neck sometimes get working on your system because there's a lot of system dependent Sort of nuances with it So there's an installer from get composer org and this first line here is simply grabbing the installer and then it in turn Will build you a composer dot file on your system making sure you don't get in any errors in the process Once you've got that you can actually run it with an install command And it will run off to the web and drag in the dependencies in this case There's two dependency dependencies which have been dragged in the first there is a symphony process component Now that wasn't actually marked over in this composite of json file in the left because it's actually a dependency of the Gitter Library not the Drupal git module So composer has worked out the dependency there and dragged in that other library as well Now the libraries are packed into a vendor directory and Inside the vendor directory is also a very handy utility, which is an auto load script which allows you to include Classes in your code without worrying about where their location is So the top of your code you could simply write something like that and you have access to all the libraries you are wanting So I don't know I'm probably not I don't very I don't project. I think my excitement about this very well I don't know how Crazy I'm looking up here, but this stuff is really really cool I think it's really important to just reflect on how complex that scenario is and how easily composer can be Can sort of act as a bridge between? Including all these libraries and getting them into your code and then moving forward also maintaining versions and doing updates So that's fantastic you get over I think so this number was actually taken last night So on the packages site There's over 7,200 libraries at your disposal there and that's not to say you have to use packages neither You can actually drag libraries in by composer from their sort of their versioning sources as well So that's a huge number and definitely an interesting Directory to go and take a look at It's simple it really is simple once you get your head around it It provides you with an end-to-end way to package your own code and also then grab other people's code into your project in a neat and elegant way So I'm really surprised at my sort of how this has changed my developing cycle now when I start a new project I think the first thing I do is really sit down with the composer file and I go and search for what's already out there Because it's easy. I can go and get really good code I can see code along with its history and see who else is using it And then I can say I can build a shopping list essentially for my project And I think this is a really good way to break the not invented here cycle Which for so often really in the PHP world I think Was very pro predominant go to another source like source forge or to github and take a copy and paste of Somebody else's code and it's not the neatest way you can do things. So this is a really important feature Finally, this is removing the barriers to getting your code out there. It's Really simple to work with packages. So if you're writing a library It doesn't have that any bound not many boundaries at all really to get your library back out into the community I think well, I know the Drupal is very focused on sharing code and the PHP community in general Would really benefit from seeing the Drupal developers Throwing bits and pieces out of Drupal modules back into the greater PHP community and this sort of tool Is a great way to allow you to do that So what it's doing to the PHP community in general Well, I think it's taking a whole lot of really big systems that are out there at the moment Drupal being one of them and Forcing to take a little bit of a look at their own code and identify common logic Because there's no real reason why you should be writing pretty boring parts of the code or code that can be better handled on a community level in general Rather what you want to be doing is taking that repeated logic identifying a likely source which can take control of it and then moving into your own projects so I This is another number. I took off the packages from our website. So over 10 million installs since April last year That's a pretty amazing number. It's a new project. That's growing really really fast So I would expect that in the next 12 months would say a far bigger number So that's packages composed or a little bit of an introduction to symphony The next step here. I think it's taking a look at some code in action And I've taken a few examples Which aren't entirely random The first one here is to look at a very simple request coming through in PHP There's some good reasons why you don't want to handle this with the old-fashioned procedural PHP code it can be more complex than it first looks and In this case here, we're going to use a composer json file And this is actually the entire file and as complicated as it needs to be right now We're taking in a dependency, which is a symphony component the HTTP foundation and inside that component has some classes for handling request objects Once it's installed We can simply get access to that code by including the autoload Which will drag in the classes that we need and when we use the classes at our disposal already We can instantiate it And then we can use it to get a variable back from the get parameter property a Really complicated example, but it illustrates how simple it is to actually include a complicated library a library Which is really really has a lot of function for handling requests In HTTP and getting it into your code is really really simple I'll show another example here, which is of course the next step. This is the response again We're using HTTP foundation cause request and response Toolkits are in the same component again, we look at the autoload and A use statement, but further down there We see the response is being built and that's actually I think a really interesting example there because we can see that the Sending the response back to the browser along with the status code and also a TTL and the by no means of these comprehensive in the example. There's a lot more Handling of the HTTP response available in that class, but this gives you an example of how quickly a very neatly Handled response can be made by using this component So the next example here is a little bit more complex It's actually talking about routing and there's another component which is being included in this Composer.js on the file and it's the routing component it allows you to create a route collection and Via simple handles in this case the say handle to find a routing rule along with default property values Fantastic, I don't know if anybody's actually worked with routing logic before it can actually be quite complicated and by using utilities like this You're outsourcing all of that complexity to the composer and the component And then to use it now This is probably a not the best example here. We go through some setup pieces We go back to our good old response object And now it gets quite interesting. We can actually put The route collection to task and see if we have a match And in this case if we do have a match we can set some content into the response fairly standard arm process But one interesting little detail to note here is the neat wire way Failed route matches a handle. That's in the next section here. So we can actually catch them because it's all object oriented we have a neatly thrown exception and therefore the opportunity to catch these and Provide appropriate responses in one case. It's for a method not allowed. So We may be looking for a route that is only matchable via a get call rather than a post and if the wrong Type of call is found. We can throw an exception for that and the second case there, of course the old 404 era I'll move away from symphony components for a second and Give an example here of twig templating engine, which I know is quite a controversial topic in the Drupal community at the moment and They'll go reflect on some of those Some of those details later in the presentation But to start off with just to give you a very simple example of how we can actually include a Twig into a simple piece of code again We're using composer.json to define the requirement of the twig library and digging into a little bit of code here We can see that the response object can be Decorated or the least the content can be placed in via the twig twig templating engine In the first part here, we're defining actual template file, which is relatively simple and We're also providing a message to send through as a property into that template So look it's a very very simple example here But I think it illustrates how easy it is to include some of these libraries particularly when they've been developed with modularity or decoupling in mind Okay final example to go on with this is actually an interesting one because it's for part of a monologue library Which is a PSR0 PSR3 compliant library PSR3 really outlines a logging Sort of sort of standards and monologue conforms to those It's a great library if you haven't used before and you have any sort of logging requirements Of course getting it started is really really simple Once you've instantiated your object on the constructor You can actually say where your access or where your log file is located and also define the log level and Then of course throwing logs log messages into that file is simple There's a little example down there of what that actually looks like in the file So that's just a couple of examples to illustrate how components can be dragged into your code I Hope they've given a little bit of an illustration of how simple the process is particularly when you start with the composer file composer composer.json files aren't very complex in fact at their most basic they can be ridiculously simple and Dragging those libraries into your code and getting started with it on a functional level can take seconds Okay, so I'll move on to the next part of the talk which is Drupal and symphony really what we hear or to hear about and Symphony as we saw before is a big set of components and Drupal is definitely making use of some of these components Not all of them So Drupal is making use of the following components as of a very recent scan through the Drupal 8 code That I conducted a short time ago. It is changing from time to time So if there's a slightly outdated apologies for that I also noted that there was some conversation the Drupal.org site about the event dispatcher Which I think is now being moved back to Drupal 9, but I'm not entirely sure if that's still the case But you can see the the components that are being used here a few of them will actually be familiar from our examples like the HTTP foundation The routing Actually in this in this example here those two are the ones we use in the examples To give you an idea about what the others are used for well There's a class loading utility there Which is a sort of an extended our library for handling classes and the auto loading which you saw which we saw composer doing Symphony provides some tools around that as well There's also a dependency injection library being included. Um, has everybody used to depends in our dependency injection a Few people I guess I'm pretty sure actually all of you are doing it But just don't know you are so dependency injection is simply a pattern where you take commonly accessed libraries or utility for Classes around your application ones that you load all the time and basically say Instanciate this for me and that's simply what dependency injection is about and the Instanciation process is handled by a service And therefore you can ask the service to give you a complex object back again without having to go through the configuration of that object When you when you're treating it It's really handy if you're working in different separated environments like development to production where you can actually instantiate objects using configuration variables HTTP foundation HTTP kernel we saw the HTTP foundation Being used previously in the examples it provides utilities like requests and response the HTTP kernel is a little bit more of a wrapping utility which can Can take control of more complicated complicated logic like matching routes back to Some sort of logic business logic behind the scenes and also then handling responses it requests and responses To knit all that together There's a routing component. We saw the usage of that as well there's a YAML Component being included. I think that I'm in drivel 8. You're moving to a YAML based configuration system Is that still the case? Does anybody know that for sure? I think it is still the case and YAML is a another sort of a serialized format to store persist Configuration and there's also a library to help with the serialization deserialization Of configuration being included as well But just to reflect a little bit just remember that the inclusion of components into Drupal 8 isn't limited to symphony In fact, there's a number of these components being included. I'll go through those With you now Doctrine is a fantastic library which is works around database support. So there's database abstraction layer and also Object relational mapping. It's a really fantastic library. I don't know if you're familiar with it But it's definitely worth checking out and it's being included in Drupal 8. The guzzle the guzzle Toolkit is there for consuming RESTful services There's also an easy RDF library, which is also another great way to handle RDF documents And there's also the symphony CMF routing Component and this one's actually quite interesting because I doubt what you've heard of this symphony has its own small CMS project going on a symphony CMF and It's also building its architecture on a decoupled model So bits and pieces of the symphony CMF can be taken out and used in other CMS's And that's a pretty cool thing when you think about it So we've got one CMS group having some of its libraries elegantly shared into another CMS Group I think you know just to have a bit of a shoot through to the future Wouldn't it be great one day if we saw in the symphony CMF in its composer Json file a requirement Drupal page Component I think that'd be a really great thing to see in the future I think the symphony community have a little bit of an aspiration that one day will be dragging bits of Drupal out elegantly By composer and using more around the place. So just an interesting little part there Plus there's a couple of very very interesting ones. There's also Chris Walsmith's aesthetic library if you haven't used it It's fantastic. It's a filtering system where you can apply a range of compilation filters to things like CSS files so you can take less and sass Code and then convert it back into seer and CSS and also compress it and minify it Into a single file or just many compressed versions of the files you've got. So it's fantastic for CSS It's also fantastic for working with JavaScript. It'll provide a range of compiles and compressors for your JavaScript files and Finally, it's also fantastic for working with images and optimizing optimizing them for their final presentation on the web There's another really great library and we've already touched on this earlier. It's twig the very ominous twig and This is actually the logo of twig if you haven't seen it before note the cold dead eyes No, twig is not free frightening Twig is awesome in fact and some good reasons why I think it's awesome Twig is really fast. So for a templating language it Compiles back into PHP not just PHP, but optimized PHP meaning it runs very very fast and you don't have The overhead that you might attribute to some other templating languages it's concise so I Look at PHP embedded in templates and I know what's going on, but I know the designers Look at it and fear a little tab PHP tags because they're horrible and they complicate templates So I think twig is really great because it makes the templates very concise by removing a lot of the object logic out of them It's secure really secure. So Output is escaped by default with twig meaning you don't well. It's one more barrier for a Cross-site scripting attack to get to its arm target all the output is Escaped so you don't have to worry if user generated content is being put into your templates It's a little bit of a reassurance to know that's being escaped by default. It's also sandbox So this is really important if you're moving template development to another group, which you may not know Particularly well or just in general you want to have templates coming back into your project knowing that there's been no sneaky additions To the templates no PHP tags, which are either going to be a security risk Proper security risk or just a performance risk to your website operating in a healthy way So it's fantastic with a sandbox The other thing it really forces you to do. I'm sorry. There's also extendable. So you can actually write Custom extensions to it filters and tags another useful thing for when you're building websites and Finally, it's really good for making sure your business logic stays where it should be That's in the business side of things and your presentation logic is kept in the templates So it's a really good utility for making sure you adhere to separation of concerns So that's tweak By the way, there is a tweak panel tomorrow. I think this time is correct. Definitely check your schedules But I should be interesting at the release looks like there's gonna be a lot of opportunity to ask questions about it So the big question I guess for Drupal and this big train change in Drupal 8 Why oh why well Drupal is always improving with every major release It's moving forward and I think the Drupal core team are pushing this idea of improving the architecture making sure that it's at its most most elegant and Up-to-date as it can be This is going to require a little bit of effort not just from the core team, but everybody involved It's an upgrade and there's changes changes are going to be part of that But I hope that through the course of this discussion I've quelled any sort of anxieties that might be floating around what components are and how complicated they might be and Of course the reason why you're really doing this doing this is this huge gains to be made so the gains Well, there's good. You can be moving towards a more standardized architecture and that's really really important Why is it really important? Well, it's not just about improving the code It's also making sure that new people coming into Drupal are provided with a familiar Interface for when they're working with that with your code. So I'm a PHP developer I've been working with PHP for a long time but I would not say that I'm a Drupal developer and It's kind of a funny place to be in considering that it should be far easier for somebody Out of the Drupal community to come in and I think moving towards a more standard architecture will really improve that position It's also going to free up a lot of time for the Drupal core team They don't have to worry about every single function of the CMS. So for instance routing complexities or HTTP kernels if they're outsourcing some of this to the broader community It's a big win for Drupal as well. They get to focus on things like building better features into the core Delivery, which is a CMS. That's a big win. I think it also allows for better integration So I've touched on this earlier. So integration from external projects back into Drupal and then also in the future possibly Taking a couple pieces of Drupal code back into the community and I think that's a really exciting prospect for everybody Finally, I'll just I'll just show you a little quote here, which I think is pretty cool It's from a computer scientist. I pronounce his name terribly. So if there's any people that know how to pronounce it better I'm sorry. It's good district said that One of the most important things for when you're working with technology is how it influences your behavior And I think it's a really profound statement to Just when you think about it What do you want when you're using technologies like Drupal is to make sure the users are subtly and behind the scenes influenced and improved as They work with the technology itself and I think that's a great thing to bear in mind And finally just before I wrap this up look there's some homework if you are interested if I Spark any interest down today. I've put together a little bit of code. This will be available online as well There's some links down the bottom if you are interested But what this will do is take a little guess that I put together. It's not exactly Succinct with the examples I put I showed you earlier, but it's pretty close and actually enhances a few of them like the twig Templating so definitely take check that out. It may need a little bit of tweaking depending on your own personal system But once you run that you'll be able to get amazing Amazing example shown to you so so yeah, definitely check it out Just before I really do finish Some things you might want to have a bit of a discussion about internally. I cut I thought these were interesting topics So this brush support For composer already it is as far as I'm aware. It's a wrapper for Composer functions and will also provide some installation hooks For modules that use composer as well now, please don't take my word for it. There's probably a discussion for yourselves There's also an interesting discussion on the Drupal.org website that I saw which was for moving the vendor Directory from core back down to the root level. This is really an interesting discussion Having the vendor directory inside Drupal core is not particularly normal for external developers Typically you see we would expect Coming into a project which has composer being used There'd be a single vendor directory and therefore of two different say a module has a requirement of a particular Dependency that Drupal also shares. They're both running out of a single vendor System at the moment some of the modules that are using composer actually have their own vendor Directory inside the module. So this is a little bit of an interesting sort of a situation and there's a good discussion going on about it I believe Okay, finally Why not make Drupal core a component and Also a dependency for Drupal CMS So that a Drupal distribution would have a composer file and then also mark as its primary dependency Compose a core. That'd be really really cool by the way. So if you ever decide to Rant at a Drupal core developer, I'd Suggest this might be a good conversation to strike up but possibly an irritating one if you've heard it before so And the final thing is start playing it It's really simple to get your code back out of the community using composer and also if you bear in mind your right code with a decoupled sort of Philosophy behind it It's going to be a win for everybody You're going to be providing feeding back into the greater PHP community and also developing really cool well engineered code for Drupal itself and That's it. I've been instructed to also say you should go to the The website the Drupal com website and provide some feedback from my discussion today Any feedback is welcome. Welcome good or bad. So please do and Look, there's some time for questions. So if anybody has any questions now's the opportunity. Yes, of course That might be let me see what I can do Not oh the slides are also available on the website as well. So you want to take a copy of them That is very recent. Yes, I Think down to about 20 minutes before this started Sorry down the back They they all have a composer file But they all load their dependencies into a single vendor directory. So it's a great question So yes, there are many compositor JSON files each to couple component will hold its own But when composer runs it will then in turn load all those Dependencies into a single vendor directory. There's one root composer file. And that's the project dependency sort of mapping So when you start your project on the very root level, you'll have your own composer file The examples of what I gave earlier were examples of just such a file Yeah, yeah, oh cool. Okay Okay, a good clone took yes, there is yes, you can actually provide say Take an entire local clone as well. So yes, you can do that You would map that I believe in the composer version So you would say you can move to a dev branch if that's what you mean by the question that question, I think I'm not sure I look I actually I don't know there's a great question And if there's anybody else have an answer to that, you know It's a fantastic question. I can definitely look it up for you and I'll get back to you talk to me later Yeah Any other questions Look, I think some of the decisions made Behind what components have been dragged in were based pretty much on what you say I I believe in the very early days there was some discussion about including the form components But there were complexities and you know Drupal's a big system. It's complicated So there's gonna be elements that will have to be sort of mapped in piece by piece or it may never be mapped in at all Drupal may Decide that in the end it should just stick with its own form Component maybe eventually even adding that back into the community as well as an independent component component of Drupal So yeah, there was definitely complexities and just running through the presentation and taking a look at the Cycles of Drupal Drupal's 8th development You can definitely see where decisions have been made and this complexity is all on the way to Integrating that they're doing a great job as far as I can see Any other questions Yeah, there is actually I think there's a PHP extension now for tweak So yeah, I think yeah, definitely. I haven't actually you are installed on my system. So but it should speed things up a little bit Well, look, I'll hang around here. Should anybody want to have a bit of a chat about anything and look Thanks so much for turning up today. I really appreciate it. It was great to see you all