 Dw i oed i'r ddechrau, yr ddechrau a lŵr, yn ein ddweud yma, yng Nghymru o 7 oed y Gymraeg. Ond mae'n cael ei wneud i'r ddweud er mwyn i'r ddweud.yn ni'n cael ei ffau'r ddweud. O'r ddweud i'r ddweud i'r ddweud a'r ddweud i'r ddweud. Ac mae'n wedi bod yn ei ddweud i'r ddweud i'r ddweud. I ddweud i'r ddweud i'r ddweud i'r ddweud. Ac yn ystafod y camau nhw, maen nhw'n rhaid i'n ffordd, dwi'n wneud i'w masylau ffawr, ond mae'r parwysau ffwrdd am gweithio, maen nhw'n ddiwedd yn dweud yn y fawr yn nifelig? Mae'r cyflwyaf sydd yn y cyfle i ddiwedd sydd yn gweithgweithiau i ddwyf sen. Ond mae'n ffordd yma yn dweud beth mae'n dwylo ddwylo, cael y ffordd mae'n dwi wedi eu gufnod arfer. Ac mae'n gweithio, sydd y gallwn gynnwys. Mae nhw wedi bod chi'n meddwl ei wneud hyn yn viw. Felly, cydwyddiad am yr hyn phon o'r ddaf y gweithio sydd wedi'u gifeth fel frir Professor Dawkins, wedi'u myfyd i chi'n dweud y yr unrhyw o'r newid a byddai'r ffordd yna o ddysgol. Y cydwyr wedi'u ddysgu'r perfformaeth o'r ddaf i chi bwyddo,ais i'r ddych yn fair ddysgu'r hyn o'n gyrdd yna i gael pethau, felly dwi wedi'u ddysgu'r hyn i fel cydwyr o'r ddysgu'r bod yn cywir未ies. I am, mae hynny Steve Richards, rydyn ni wedi gyfnod o rhai pryd yma ymlaen, beth rydym ni'n ei fath o bwlynyddiadol, iddyn ni'n gweithio ychydig i'ch cefnod, ac mae'n meddwl i gael i gwybod hynny o rhaid â'r orlygluriad hyn. ac mae'r ddelch yn ystod i'r cymdeithasol'r llwyffol, oherwydd – oedden nhw'n mynd i'r cymdeithasol, ac mae'n gwneud i'n ffordd mwy o'r ddweudio cymsgol a'r ddweudio'r cynsig o'r ddweudio'r ddweudio. Ffawr, mae'n meddwl a'u meddwl o'r panthau na fydd yn meddwl i'n meddwl i ffordd ac i wneud am sylwg i'r ffochol. Fawr, mae'n meddwl i'n meddwl i'r ffordd, ac mae'r ddweud yn ardal yn mynd i, ond rydyn ni'n ffordd. Rydyn ni'n gweld o'n ardal, y dyfodol yn ymgol. Rydyn ni'n gweld o'n ardal yn y dyfodol yn y 10 ym 10. Yn amlwg yn chi, ar y ddechrau, mae'r ddysgu, ac mae'n gweithio'n ddysgu, yn ddechrau, ymddangos. I was an Arsenal fan, so Little Steve had run about in a little Arsenal kit. Those were the days before I found music, before I found computers, before I found Nintendo. Nevertheless, this project held a really big place in my heart, something that I got really excited about when I heard that it was a project that we had won. It was an exciting prospect. It was going to be an extensive project with some really complex goals. Some of those overarching goals, they really wanted to increase their fan engagement. They really wanted to extend the reach of their digital fan base. They wanted to look at ways that they could monetise and drive traffic to their revenue streams, to their shops and to their partners. We had an extensive bid team, and then finally that culminated in a final pitch at our office. Everyone got in their best football kit, and ultimately we won the project. Here is someone who extended our pitch team on that. That culminated in a re-platform. They wanted to optimise their platform for mobile. They wanted to make it future-proof, and they wanted to centralise their content. So previously everything had been split out across a few different platforms. They wanted to add ongoing value and find a way that they could build on what they had and continue iterating it over time. We had an extended team that was led by us in Vika. That was out of a number of different offices. London, Brighton, Manchester and Sheffield. It was also a project that we won and implemented in partnership with another couple of agencies. Phase 2, a number of you will know, based out of the States. Our team extended across the Atlantic as well. And Ask Modern was a London-based design agency. We moved into implementation. That started with a very extensive discovery process, looking at all their long-term goals and analysing all the different platforms that they were currently using. That, of course, ended with us recommending Drupal 8. I think partially because it ticked all the boxes, but also because we had done, at this point, at least one Drupal 8 project. I think we had reached that tipping point where Drupal is no more an option anymore. Drupal 8 really had started to gain traction. So this was back, I think, summer of 2016. So on the recommendation of Phase 2, we moved into an atomic-based design process. That was using that and that. That also recombinated in multiple Drupal themes to handle the various different properties that existed within this single platform. That was arson.com, player.arsson.com, and the junior gunner site. So everything running off the same code base but being displayed in slightly different ways. Then, ultimately, it had to power a REST API. Their existing platform had a REST API that serviced their mobile apps. This platform would have to be a direct replacement for that. So we sketched out a basic architecture diagram for that. With Drupal 8 at the centre of everything acting as a content hub. Delivering Jason to the Android and iOS apps. Delivering RSS feeds and content out through the pattern library out to desktops and mobiles in that way. So continuing the replatform, we also had to utilise their existing CDM. As part of the rebuild, we would also be migrating to platform SH. As well as servicing all those API users of which there is very, very, very many. And migrating all of their legacy content from their existing system. Which, luckily, was PHP and Minus Graph based into Drupal 8 platform. OK, so I'm going to kick off into the first half now. I'm going to go through some components of the project here. So that's the business stuff out of the way. Sorry, I really like transitions. So, as you can imagine with a property such as arston.com, performance considerations need to come in at a very early stage. You really think about how you will be handling that level of data. So to give you a bit of an idea, these are some stats from October 2017. So through the API, they were doing 90 million requests just over October. That culminated in 496 gigabytes of JSON data. Which, in total, when you add in the desktop and the responsive mobile stats as well, culminated in 555 million requests for October and around 22 terabytes of data. So that's some serious heavy load. So, typically, we'd focus on a number of things to improve performance and load times. And so, we'd look at lazy loading from an application perspective, try and avoid loading stuff that's below the fold. We'd look at profiling and how we can manage our code bets up. We might look at internal caching and examine how we could use cache tags and cache context to ensure that we're only serving out things internally as appropriate. Scalable hosting. So, obviously, with PlatformSH, we have something that's very scalable, container-based, and can respond based on traffic. We'd look at load testing. And, ultimately, we'd look at external caching. Sorry, another football type thing. The importance of well-timed headers. So, we wanted to leverage the CDN as much as possible. So, we wanted to really put the focus on how we could optimise the site from the outside in. So, typically, you would use like a CDN or a proxy cache provider for this. So, Platform works very well with Fastly. They're a partner with Fastly. Cloudflare is something that I'm sure many of you have used before. LimeLite was a CDN provider which our client is actually working with at the time. They had a very good relationship with them and wanted to continue on that process. So, we looked at how we could integrate with that. So, if you've used Cloudflare before, you might put your DNS configuration directly into Cloudflare and that would be handled by Cloudflare and you wouldn't necessarily need to worry too much about it. But in terms of LimeLite, there was a lot of configuring things ourselves and going through the steps really to make this work as efficiently as possible. So, what I've got here is a basic diagram of how the traffic comes into your Edge server, your Edge load balancer and then through the CDN and down to Origin. So, what you're really looking to do is to minimise your traffic to Origin as much as possible and to utilise the CDN in the most efficient way possible is the best way to do that. So, we're really focusing on the Edge here and focusing on minimising the traffic down to Origin there. So, we do that, we place an haste, a haste to be off between the CDN and other things and the only thing that can get to Origin is authenticate traffic from the CDN. So, as I said, we're utilising the existing CDN provider. We had to have a seamless transition at launch so that as far as the fans were concerned, as far as the client was concerned, nothing would change between pre-launch and post-launch and obviously serving it across these multiple channels of web and the API and handling our £55 million requests a month upwards of, I quickly checked, January's and it was, I think, significantly more than that. So, we do that using cash control headers. So, Drupal obviously implements this out of the box. There's nothing we necessarily have to do to make this happen, but it's worth knowing. They're counting some of how this works. So, cash control is a header that also specifies this max age value which defines the lifetime of the page and essentially how on the page it's fresh for and how long it can persist in a CDN cache. So, if you were to take your Chrome browser and inspect the request, inspecting the arson.com request here, we can see that cash control is saying that this page would exist for 300 seconds and specifically, this page is 43 seconds old. So, Drupal core has a few cache limitations out of the box. So, you get your performance tab here, you get some caching options or a caching option, that's literally what you can get out of the box. It has a maximum cache lifetime of one day and that's global for your entire application and that might work for 90% of sites. So, straight away, we look to implementing this module. This is the advanced page exploration module. This gives you some additional max age options. It allows you to define some alternate caching options and gives you a UI for managing the original function that you can pass to the client. It also exposes some custom events and hooks that you can also implement to kind of outfit your own logic for covering different scenarios and different business logic. So, the UI for this looks like this. It's very similar, but straight away, you can see we've got one month global exploration time as well as up to one year. So, it also gives you these two different caching levels so you get there out of the box so that you can say generally pages on these paths will cache for this amount of time, but you can specify and say the home page might be 30 minutes. Why is this great? So, that means that you can give different lifetimes different pages based on how regularly the content changes. So, you can really determine from within the Drupal UI exactly how long a page should exist for. So, home pages and news pages might be changing very, very regularly and actually asking when my page changes every five minutes, every minute, maybe. And a player profile, for example, might stay for a month, a year, I don't know. I've got not a massive football down, but I don't think there's changes really. But it also gives us this ability to specify some sensible defaults so that we can have that fallback generally for everything. So, what it meant for us is that we could essentially launch and do a soft launch and through the UI we could configure how long we wanted that global exploration to be, how long we wanted that fallback exploration to be and kind of change that value over time as we kind of measured the performance in the server. So, it allows us to kind of manage that gradual escalation of traffic to origin directly through the UI. So, I don't want to trivialise this. So, our implementation was anonymous only. So, obviously, it's harder to cache authenticated traffic. This sort of aggressive caching will produce its own problems if you find that a page isn't quite correct in the CDN UI, they have to wait for it to expire or go to your CDN UI and start purging objects, which really you want to do as infrequently as possible. So, future scope release for our implementation would be to kind of look at how we could provide regional content, potentially using edge-side includes or a-jaxing in content into the page so that we're still serving out the same page to everyone which is kind of injecting the current personal content into the page. Implementing some kind of deep-level CDN integration so if you've used Farsi, for example, there is a Farsi module that enables you to expire stuff directly in the CDN based on a content change directly and directly using hashtags. And, yeah, extend the exploration logic that we get out of the box. We have a few rules that already exist kind of below the surface, below those kind of two different options and we could extend those to kind of have different ways of capturing different ways. So, how do we know that we're ready for all that traffic? How do we know that we're kind of there? So, obviously, we do that by testing and measuring. And so, in this project, we used Apache JMeter to basically simulate some behaviours, simulate some traffic over time, ramping it up and then reviewing New Relic in the background to kind of see what came out of that. So, to be able to review errors and to be able to review bottlenecks and the overall performance as we're hammering the site through JMeter. And JMeter also gives you a... you can use GlazeMeter to run your JMeter test and that's kind of the tool that we use ultimately. Cool. Okay, so, into the second half. I'm not sure what the score is. I'm not really keeping the score. So, in the second half, I want you to look at the symphony components in core and explore some real-world examples of kind of these components in action. We're going to see how they really bolster kind of a dribble specifically. So, obviously, it's opened the door to a lot of new design patterns and that's something that we really embraced on this project. It enabled us to kind of use external libraries. I guess you could use external libraries before, but I think this kind of provided a slightly more flexible way for pulling in services from packages libraries and stuff like that. Obviously, dependency injection. I'm not going to explain dependency injection now. I think there was a session this morning on that, so it's worth kind of dialing into that. But ultimately, it meant that our code was more efficient. Plug-ins and the event dispatcher and subscriber. And I really want to explore the last one of these because I think this was the one that we really utilised the most. So, one of the key ways that we wanted to utilise this was to notify the fans. So, one of the key requirements was to send match event push notifications. So, we had to replicate this existing behaviour using their API, using their current mobile apps, using the pre-defined external service that they already had. So, we had to integrate with that API. And most importantly, we had to avoid sending fake notifications like BBC did here. So, as yet, we've not sent any fake notifications. Is that right, Felix? You haven't sent any fake ones yet? No. So, take steps to make sure that we can send everything out to their millions and millions of fans, or whatever it is. So, of course, we didn't want to reinvent the wheel. There wasn't a Drew Blake module that integrated with their API. But there was, however, a PHP library available that did integrate with an airship, which is the notification provider here. So, this provided a key opportunity to kind of look at our toolbox. So, I want to introduce you here to Felix. He's over here. Sorry. So, Felix was a symphony developer. I'll say once. I guess he still is a symphony developer. But he has extensive knowledge of a fashion of the symphony and the PHP best practices. However, he was new to Ibiza and Drew for when we started this project. However, being passionate about symphony, he went to Symphony Live and he was inspired by a session that he saw on Symphony Live. And actually, one of the key questions that he kept on asking me throughout the beginning of the project was, why are we doing things this way? Why aren't we doing things in a kind of modern design pattern way? So, a lot of my time is spent explaining freedom of several isms. Anyway. So, Felix was inspired by another employee's Symphony Live presentation and was now able to use these components in a truthful environment. So, he was able to create a reusable implementation using the subscriber and the dispatcher and integrate with any existing work that we have within his site. Utilise that PHP library that we just identified and add that as a dependency in our composer location. So, including that library was fairly trivial at that point. So, this is what that journey looked like. So, essentially, this is driven by the editorial team. They'll put an action into the CMS, that action in this case is a goal. That will fire a pre-safe hook. So, yeah, we all know that hooks still exist in Dream Plate. However, that gave us a jumping point to kind of prepare the event data and then dispatch that event. So, this is a very kind of basic version of what that event dispatcher looks like. The dispatcher. There you go. So, that's the dispatcher. It's a very basic version. It doesn't include all the extra code around it, but it enabled us to implement this and then dispatch this event. And the important thing about dispatching events, as opposed to maybe triggering a function, is it wouldn't break if there was nothing at the other end to catch it. There's kind of a very loose dependency there. So, ultimately, we catch that event with our subscriber. This is subscribing specifically to the event that we've just sent. And then, ultimately, we can utilise the urban airship service to send out that notification and to basically trigger it that way and send it out to the authorities. So, the other thing I wanted to kind of take a look at was another off-the-shelf piece of work that we used and then integrated with. So, essentially, this was managing Twitter media. So, as a bit of an overview, all Arsenal players tend to have a Twitter account. Arsenal themselves has their own Twitter account and, obviously, players continually communicating about the games, about events around the games. So, they want to be able to integrate those into their minute-by-minute flows into their news-art calls and to kind of really harness that rich media. However, they had some strict rules around the kind of storage and kind of the sponsorship and the kind of tone of voice of those tweets. So, we were challenging with kind of looking at how we could pull that data in but in a kind of manageable way. So, we looked at the media entity's Twitter module and this has a tweet feature service built in. So, I encourage you to look at services in Drupalate. Essentially, what this gives you is a service that is available globally that you can call on to utilize any of the functionality around, in this case, the Twitter API integration. So, this enabled us to retrieve tweets using a tweet handle. And then, because it was based on media entity, it also allowed us to map that data to entity fields, store that data locally. So, this was a key requirement of Arsenal in that they wanted to retain full control over the data. They wanted to retain the kind of full control over the display. So, I think that's really important because of, you know, that meant that they were able to kind of use it and display it in any kind of way that they sort of fit really. So, it also, the module also includes a Twitter-based formatter, but, yeah, it does give you the ability to kind of take those fields and as you map them to kind of data locally, you can go into them just using a tweet directly. So, this is the basic media type of Twitter. So, it extends the kind of, the media type base where harness is kind of all the kind of media entity type that's in for and then extends that to kind of create a version specifically for Twitter. It's worth noting that we added a number of different patches over the course of the project to kind of extend the capabilities of this module as well. And that was essentially to kind of make sure it could keep up with Twitter's API, the part that's accessing extended tweets. So, you have a slightly richer level of data in the tweets. Also, to map more fields that then get exposed in that way. Twitter supports animated gifs and videos and we want to be able to map that and have that something that can be kind of displayed in any news feed. And also down to multiple images, which was something which was added to Twitter by a guy over the course of our project. So, I think there's something for me to do on that in terms of finishing the patch, but the code's up there if you need to extend it and you need to use that base. That's all I'm doing for the whole. So, I want to give a little bit of an outline of the journey that you might see as a player tweets about something and then how that might end up within our media storage. So, we associate each player with a Twitter handle and then that goes through into our tweet manager service. We can retrieve all players that they'll have a Twitter handle. And then we can utilise the tweet fetcher service that media entity Twitter has given us and we can use that to access the Twitter API. So, I think what's really key with this is that we have dedicated services to all the sole responsibilities so we split out everything. We don't try and group everything together as we might historically have done in a Drupal server module. We split everything out into its individual components. But additionally, we interrupt the standard media entity Twitter flow by adding this blacklist constraint validator. So, this is another component that we have available to us in core. We can extend the constraint validator class to implement something that will interrupt that flow and stop certain tweets coming in if they match their own criteria. And that was specifically a blacklist of terms or a blacklist of sponsors or a blacklist of things that don't match the tone of voice or match the information which the team wanted to distribute. So, all that means is that then we can automate everything. We can have a cron hook that will build up a queue triggering our tweet manager service to ingest all of the player tweets and then put them in the media storage ready for the editorial team to use as they see fit. And actually, if you go to arsland.com today you'll see a player tweets page and that lists everything that they've tweeted every 30 minutes. It goes off and ingests any of the most recent ones and displays them and filters out and you don't match the tone of voice. But ultimately, because we're just storing it as media storage, they can go in and change those. They can edit those and delete those as they see fit as well. So, if something goes through, they can delete it that way as well. So, here's an example of our constraint validator. So, we're exposing a list that they can add to or just text stop terms that they can add and then ultimately, as we're ingesting a tweet we can trigger this validator to then see if it contains any of those terms. So, it just provides a really nice way of kind of automating math that can be giving it a bit of sanity and giving it some level of checking on the way. So, ultimately, I think it's no surprise that Drupal 8 gains significantly from the symphony components which have been added to it. I think there's a number of different realised benefits here. Specifically, transferable skills. So, I saw with Felix and a number of the other people in our team have been able to jump onto a Drupal 8 project having very little Drupal experience but having a lot of symphony experience and they've been able to kind of get their hands dirty with Drupal straight away which is not something that we saw very often with Drupal. So, I think we've seen that there's kind of less hard dependencies. Obviously, you could code hard dependencies if you wanted to, but there's the toolkit to be able to split things out and to be able to make things a little bit more interoperable. It's more extensible in this way if you're splitting out your components and kind of giving things a sole responsibility. And it opens up to kind of future potential. So, there may not be a module for something today but there might be a PHP library for it and that PHP library might have certain symphony components that it's utilising and so you can use that not necessarily wait for like a Drupal module to come along to wrap around that. And yeah, from a personal preference thing as well it gives you design patterns that you can look at in other frameworks and kind of see kind of how they're being used and you can kind of meet in your code op and kind of follow some of those other standards which you might not necessarily have done before. So, that's full time. So, there's a few other adventures which we could cover. There's not necessarily time for it today but there's a number of other API integrations that we did throughout this project. We integrated with a sports data API called OPTA integrated with the video data API called UALA as well which pulls in videos. Entity and beds, social sign on minute by minute experience and one of the key ones I think, lion match mode. So, when the lion match is happening you'll see the whole front page kind of changes and switches to this different takeover page and ultimately culminating in a kind of platform usage implementation and a full kind of scene change from then everything building using composer and then going out into production in a kind of scalable way that can react when there's kind of peaks and troughs. So, I think overall there was a great team spirit on our project. This is a terrible picture of me so let's move on to the next one. It's slightly better. I think I made over black. There was a great team spirit so this was our most recent game. We lost... 83. Even worse, I scored an un goal. It's just absolutely awful. I shouldn't play football, it's just terrible. But six months on from launch we continue to foster a really good relationship and it's really key to getting the most out driven way I think to be able to have that product owner who's really engaged and is able to help to iterate actually in this case our product owner the guy in green here was actually on our team because we were outnumbered so I think that that goes to show how much of a great integrated team you had. So hopefully next time I won't play and they might score some more goals. So thank you very much. There's time for host match Q&A if anyone has any questions, thank you. It's a football thing to be asked. How long do you feel you're safe? That's a good question. I don't know, you have to ask your idea or maybe Richard, I don't know. I didn't realise it was a Brighton home game tomorrow. Yes, that's a good point. They are playing today. I'm from Brighton by the way and they're playing today. So you mentioned design patterns and I just want to know if you could elaborate on us for what you felt was the most useful one in this project and if there was one which you came across that works really, really well in this context I just want to know if you could talk a little bit more about that. Yes, so I think the one that we've used the most and actually across other projects is the repository design plan. So to essentially keep our content navigable in such a way that you can have a repository for accessing those specific entities. So, for instance, we have a repository for teams, we have a repository for players, specifically a repository for players that are playing in fixtures. That kind of gives us this kind of way of navigating through it and kind of grouping together logic in a very specific way. So that's probably the one I think is the most beneficial. Is that more relevant to simply or would that work really well on Drupal 7? It would be really well on Drupal 7, right? Yes, I've seen it implemented in Drupal 7 as well. And it's really about, instead of kind of maybe putting everything in a dot module file you might sort it out into a class and you access your content through that class. But yeah. And another question specific to a project I'm working on. It's very soft and my server does some scraping and that can slow down the page load speed naturally of our server. And I was wondering if you would recommend giving your scaling experience, obviously far, far bigger scale than I'm at the moment, what your top technique to prevent that would be or if there's anything that's just an actual thing of the design, is it just about offloading that onto a different server even? Is that your size being scraped to your screen? Yeah, my size being scraped to the screen. Legitimately with a degree from the person. I think we've done a similar project where we have to scrape content. Richard knows a bit about that, but no. So in that case, we've kind of offloaded it to a cube. We basically kind of said, yeah, manage it, but manage it kind of in increments over a period of time. So if you can cube on the same server? So we move it to a rabbit MQ I think of what we used. So it's a kind of queuing service, but there's a module that means you can integrate it directly with Drupal's cube API as well. And actually generally we've got a lot of tasks that kind of happen in the background and the way that they operate is by using the QAPI to just queue up different tasks that you might have to do like ingesting tweets or putting content down from different places. And yeah, we'll spread that out over as long a period as possible to kind of distribute the operations really. Thank you very much. Any more questions? I've got a question on the Twitter idea. It's the same that it follows not just from players, the team. So it's their scenario to put in for if they start spurting off some balance to another player or something that could be damaging to the team or they get hacked and some expand and get thrown through. Like how quickly does it get picked up and does it learn from those experiences like is it like self-learning? Oh no, that would be amazing. No, it's not that clever. So is there someone literally sitting there waiting for them to come in? Well there's a bit of that. I guess there's probably, I'd hope there's something in their contracts that says you can't do the X, Y or Z. But if there's something in life it's a no, it's not that happened that. Absolutely, if someone gets hacked then I don't know. We've not had that happen yet. The thing we protect against is swearing against people talking about their other sponsors, because we're asking one specific sponsor they have to work. Sorry for the confusion. We're just about to say that we have a very extensive, there's a few thousand blacklist keywords that if they're found in the Twitter text the Twitter is not being imported into the system and just being discarded. So that would cover hopefully also the situations where the some nastier stuff would potentially be written. So if something does slip through and the content is taken, they delete it and they answer that like is it easy for them to do it? Well I think in that scenario you're not really sure necessarily what the tweets going to contain could be someone just saying something which in general every day might be fine but in context could be deep defensive or whatever. But I don't know there are services that you can use to handle your social integrations and they'll have more extensive ways of managing that. Intermediaries but for a cost. Do most players have two Twitter accounts like one for themselves and one which is their public base and that will just be done by an agent anyway? Not that I know of but I think the only ones we deal with would be the public ones because that's exactly what's really interesting. Exposing API data there's a couple of really useful modules that are proposed like entities as API stuff but that relies on you having your entities mapped the way that service provider that you're providing into it once. You were trying to match it against what they already wanted. Did you match your design for how your entities worked to that or did you just roll your own model? We had to match what they had so I think in an ideal world and this is I think the passion of the client hopefully going forward saying something I'm advocating is for them to use some standard format like JSON API and that's something that we're using on other projects and that gives a bit more of a standardised interface that shows all those different relationships for the content and they can then expose it in a way that the subscribers or the actual devices that are ingesting it can then determine how they want to use it. As it stands I think we're iterating over different versions of the legacy format which isn't ideal but it's still fairly clean and it's something we've built a framework to work with now and it actually made a little bit easier because of Drupal 8 has a certain element of the best API built into it so whilst some of the formatting has to be a little different we were able to use a lot of the serialisation classes to normalise our data and push it through that as well so that was another design pattern we used a lot of normalisers to filter that data Excellent, thank you very much everyone so yeah, we're hiring no you were hiring and we are hiring as well but yeah if you want to come down to our booth down there and correctly on my spelling please do thank you very much so that's it, you have to swing it so that's it you can you tell us if you want to ask the process absolutely thank you how does it work of course, yeah it's simple simple as it is you got your name