 We'll just roll over to one o'clock, and I like to be punctual, so I think we'll get started. Welcome to Drupal DevOps on Azure websites. My name's Corey Fowler. I'm a technical evangelist from Microsoft Corporation. I came all the way from Seattle to come here today to talk. So hopefully you enjoy it. I think we're going to have a lot of interesting little piece of discussion to talk about. Before I get going, how many people have actually used Windows Azure before, or at least know what it is? Oh, brilliant. More than half the room. That's awesome. So I shouldn't have to clear through this all that much. What is Azure? Azure is a set of highly scalable data centers all around the world. We have 16 data centers worldwide spanning the US, Europe, Asia, as well as Australia today, which is really, really awesome. We have a variety of services. I just gave out a number of posters that kind of clears out what we have available to you for Windows Azure. I'm going to focus specifically on two parts today. One are Windows Azure websites, sorry, Microsoft Azure websites offering, which is a great, high density hosting platform. We'll get into that a little bit later. And I'm also going to talk a little bit about our VM platform because there's one key DevOps component that I want to show off there as well. We've had some pretty awesome momentum over the last year, bringing new features on at a rapid pace. It's been very exciting to be working in this space because it seems like every three weeks we have something new and fun to play with. So I've been keeping really busy going through and playing with the new features that have been coming out and look forward to new things that continue to come out. We have great support for a lot of open source on Azure. Not only just language support, but we actually have in the galleries for both websites and virtual machines open source CMSs. So we have Drupal in the gallery. So you get an easy click through wizard installation process. We manage a huge Hadoop service called HD Insight, which is pretty interesting because it avoids having to go and set up a high scale cluster of Hadoop yourself. You just click and spin it up and turn it off whenever you need to. Lots of different support. We just added a Redis cache provider to our platform. So you can get a full-scaled Redis server up and running to do caching of your front-end services as well as four different distributions of Linux within our virtual machine offering. And we have great support for a lot of new DevOps tools that are coming out today. So Chef, Puppet, Vagrant, Docker, just a lot of great things coming out. And we're supporting them as quickly as we can. So to clear through, what is Azure websites? Azure websites, like I said, is a high density hosting platform. What does that mean to you? Very simplistic way to start deploying things into the cloud. In fact, it's probably the fastest way to build for the cloud today. So all you need to do is go and spin up a server. It's up in a matter of seconds. You can connect your code into it using source control management. And it just goes out and deploys. You don't have to worry about maintaining PHP, the operating system packages, anything along those lines. We do all that for you as part of our platform as a service offering. And it's open and flexible for everyone. So like I said before, we support a variety of different languages. You can host all of them in a single website, which is interesting. I have a really cool demo that I do at other conferences where I actually have every single language, just a small application, and show off all the support running in a single site. But we're here to talk to DevOps today. So let's talk about Git deployment. This is an interesting way to just go in and deploy your applications out. So I'm just going to go into our portal here. We have two portals currently. This is the full featured portal, we'll call it. There's also a preview portal that I'll show you a little bit later on if we have some time. But the easiest way to get going really is just to go and hit new and custom create a website. And you can see here, all you need to do is enter a URL. So I'm just going to say drupalcon.ms. You can go and deploy that in different hosting plans, which are kind of defined by region. So I'm going to stick with the West Europe reason, because that's right here in Amsterdam. We can create a new database. We have offerings for both SQL database, which is Microsoft SQL and MySQL databases. So you can go in, set something up. For right now, I'm not going to worry about that. And I'm going to publish from source control. So I have the ability to go out and choose from a variety of different sources for this. I can use the Microsoft Virtual Studio online. I can use a local Git repository. But I think the more interesting ones are support for GitHub, Bitbucket, or just any kind of external repository, which could be either a Git repository or a Mercurial. So I'm just going to choose GitHub. And we'll go over here. That was going off to GitHub to do OAuth, but I'm already signed in, so I don't have to worry about that. And basically what it does is it pulls in a huge listing of all the repositories I have access to, which for me, as an evangelist, I have quite a few. So I'm just going to type in, oops. No, do that again. So I'm just going to type in Drupal, which I did just for the Drupal project straight from GitHub. And in order to get the right branch, I just do 7x. And what that will do is create a new site. Once the site's created, it goes off to GitHub and says, hey, I need some source from you. And adding that 7x, it will bring Drupal 7 over to Azure websites. So I already have a Drupal site set up here. So I'm just going to flip over. And basically what this has done, if you look at the deployment tab, you can see the history of the deployments coming from GitHub. And one of the interesting things about this is not only have we gone out and done deployment through GitHub, but we have the ability to trigger new functionality during the deployment process. So I can see here that they've generated a deployment script and it's running deployment commands, which in this case is really just copying a bunch of files. But we're going to talk about hooking into that in a little bit. So this is my Drupal site that I have up and running. This was just pulling straight from the repository. I did have to go in and configure it, obviously. But this means anytime I pull or I push something out to my local or to my clone of the Drupal repository, the new source code is going to come back directly into my site, which is really, really nice. So it continues deployment. Like I said before, choose your own adventure. Tons of different options for you to go and hook into Azure websites. This is how we can go in and manage our deployment process, the whole pipeline. And I'm going to just move over to that in a second. But basically we have a set of cross-platform tools, which allows you to go and interact with Azure directly from the command line. And some of the reasons you might want to go and modify this deployment script is something along the lines of other installing dependencies with potentially composer, compiling source code I have there. Just in case you might have to do some compiling of JavaScript, like coffee script libraries or TypeScript, you might minify JavaScript or expand SAS or less. But you could also do continuous integration tasks, like running your unit tests before the deployment. So if any of those tests fail, it doesn't deploy the new code base out to your site. Everything's good to go. So I've built out a deployment time dependency management thing with composer, but I just wanted to show you the command line tools that we have here. They actually took away my favorite feature recently. We used to have some amazing ASCII art at the top. So I'm kind of disappointed by that. And I think I'm going to go log in issue on GitHub later on today. But you can see here, I can just type in Azure site and I get a listing of commands that I can do for the website. So there's actually quite a few things here. I can start, stop my website. I can create new sites. I can go and add app settings, which are unique values that go into my site. So if I wanted to keep things at a site-specific level, I could add those app settings and they're exposed to me using environment variables. You can set up domains, certificates, being SSL certificates, obviously. And there's another feature called web jobs that I'll get into a little bit later. So going and using those tools, if I just type in Azure site deployment script, and I'm just going to use the help file here. Basically what this does is it generates dot deployment file and that hooks our deployment engine to say, hey, I have a custom version of this deployment that you need to run. And it also creates a script for you. So this could either be in command, sort of like Windows command line or a bash script. And you'll see here, the deployment scripts, there's a couple of different varieties just because we support a number of different languages. But you'll probably want to use the dash dash PHP and that will get PHP-specific deployment script for you. And then your output type is dash T here, which is how you can switch between batch and bash. So I've already created that and I have it up and running here on another page. So in my GitHub repository, I have this project called WAWS-composer. And basically this is the deploy CMD file that it generates for you. It just goes and sets up a whole bunch of paths and everything so you don't have to worry about it. This highlighted part I'll get to in a second. Then it basically goes off and uses website deployment. So we use this command line synchronization tool called kudosync. And basically what that does is it keeps an eye on the different files in your site. So when we do a new deployment, we don't end up crushing any user-generated data that might have been saved off to your website. So this highlighted area up here, this is the section that I added to go and download Composer. So basically what I've done is just used the curl command, go to get composer installer. It runs that, comes back, and then basically just set up the PHP script here. And then you see at the bottom, I do dependency installs. So basically just run PHP, use that environment variable for where the code's been deployed to, run Composer and then just run the install file so it goes out and gets all my vendor files for me. Extending the environment. So there's a couple of different things that you can do here. Once we have our site up and running, it's great. We have a production website, but we're talking about DevOps. That means we wanna do a lot of this continuous integration, continuous deployment kind of thing. And we just set up just get deployment in a single area. So that means, yes, I'm doing get deployment from GitHub to my production site, but say I wanna have a staging environment, something along those lines. Well, that's something that can be achievable by this feature called site slots that we have. And basically what this is, is it takes your main website and associates other web spaces to it. And these are individual web spaces. So they run in their own container. So this isn't like everything's running in the same website, but sort of separated. This is a full brand new web space for you to deploy to, but it gives you a few options. And what that is, is once you go and create that secondary site, you can then either clone the configuration from your previous site or go through the whole process of hooking up the source control management. This provides a nice staging environment where you can continuously pull stuff into, go test. And then later on, we'll show you how you can actually swap between these sites or use this new feature called testing and production to kind of move traffic around to them. The second thing that you can do is this thing's called site extensions. And site extensions are really interesting because they allow you to go and add additional functionality to Azure websites within the same context of your site. So you can use this for administering your site. Like you can see here, we have the PHP MyAdmin tool alongside here, so you can actually use that in say your staging site to look at your database connections and figure out what's going on in your data and not requiring additional tools. So say you're out on the road, all you have is your iPad or some sort of tablet with you. You can log into your website and still be effective by using some of these tools. So what I'd like to show you now is how I've leveraged Azure websites to go and install Drush to be able to do management of my Drupal site with Drush. So we left off here before where I have my Drupal website that I set up and I have Git integration. And you can see the website up here is drupalcon-drush.azurewebsites.net. And this is the public URL. You can go and add a domain name to that to have a nice pleasing URL that kind of conforms to your company. But every site has a different sub-site. So if I was to go here and add .scm, I get into this site here. And what this is, is it's a back-end system that allows you to hook up the site extensions. It provides command line access to your website, which we can do also from the local machine. I'll show you that in a second. But it provides a great little interface for you to kind of go in and see what's happening with your website at this particular time. So what I've done is I've downloaded Drush in my site directory. And I've also downloaded Composer. And that allows me to go and do dependency management for Drush. And then once I have Drush installed, what I've done is run these two commands. And I'm using PowerShell right here. And I understand that you can't see that. But the commands are setting aliases for Drush so I can go off to my web root and use Drush instead of having to have it sitting in my WW root and have other people have access to it, which I don't want. I've moved this away, set an alias for it, and I can still go and do my commands. And then I've also set an alias for Composer just so I can use the just Composer command instead of having to do a full path or anything along those lines. So I'll just cancel out of here. I'm just gonna, I'm in my site root. So I have the ability now to just say Drush. I'm just gonna clear the cache. It's something simple to do here. And I'm just gonna clear all. And I might just have to refresh that. So I'm going to my site here. Just gonna have to rerun these two commands. There we go. And we'll say Drush, clear cache all. And it's gonna go through and clear the cache. Now you can go through and do whatever you need to do from within there. As I mentioned before, we have site extensions. So I'm working with the team to figure out what we can do to make Drush a site extension. So it's a lot easier. You can just go off and add in the Drush site extension. We'll inject it into the site for you, set up the aliases, and you'll be able to go out and use it. And you can see here that our clear cache command was successful. So I did this in the web interface. How do we go and use this from our command line? We have this other tool called Kudu exec. Kudu is the backend deployment engine that we use for Azure websites. So basically what you do is you say Kudu exec, and then you pass in that source control or site control management URL, which is what I talked about to get to the management layer that we were just looking at. Then we enter our username and password and now I actually have full command line access to my site directly from my machine. So you can see here I'm browsing through. I can go to my www.root. There's my full Drupal installation. If I go back a directory, you'll be able to see my Drush file that I had in there, the init script that I used to set the aliases and all those things. So this is a pretty interesting way to be able to leverage the command line against your website and gives you a lot of power to go and do what you need to do to get your site up and running the way you need it. Yeah, quick question. So that command line in particular is running the Windows command line, but they've aliased a lot of those commands for you. Cause I kind of venture back and forth between Linux world and Mac world and PC. So I actually use PowerShell most of the time and that's why I use the PowerShell console on the website. But yeah, a lot of the commands there are aliased for you just so if you are coming from a Mac or a Linux environment, you can use the commands that you used to. Cool. Cron jobs. So everyone's used to Drupal Cron, yes? How many people have issues with Drupal Cron? Anyone? So I think the biggest complaint that I've heard is the fact that the Cron jobs are running in the same context of your website. And that's a big issue, right? If you have a site, it's very popular. You don't want a Cron job sitting there running, taking up CPU power as you're trying to serve up traffic. So this is something that's interesting. We can actually go in, I'm just gonna explain what web jobs are. Web jobs are our answer to Cron on Windows Azure. And basically what it allows you to do is it's a simple interface. You provide us with a script file of any kind. It can be PHP, it can be JavaScript, a PowerShell, it can be Bash, anything. What we do is we run that alongside your site. Now what you're gonna say is, hey Corey, you just said, we don't want these things running alongside our site. Why are you telling us it's gonna run alongside the site? Well, you have the ability to continue to do that. But if you wanna separate them out, you can't, right? So we're gonna go and create a web job. Very simple thing to do. I'll just go into my site here. I already have a site set up. You'll notice it has Drupal Cron. So these sites are all kind of independent pieces. But there's nothing to say that they can't communicate to each other. So if I wanted to write crons for, say my Drupal Cron Drush site, there's nothing wrong with that. I can do that if I expose an API or something along those lines. If I need to actually interact with the site, that's perfectly fine. We do actually expose an API for this. So if you have anything going on in the back end of your site, like triggering web drops or you have web hooks or you like to pull from source control, all of our REST APIs are sitting in the back end here and it allows you to go out and do whatever you need to. So to interact with those from a different site, go into the site you wanna interact with, look at the REST API, go off to the QtWiki and they'll describe how you can actually go and interact with that. I'm just, in these two examples, I'm doing something locally on the machine, but there's nothing saying that I couldn't do otherwise. And I'm just gonna take advantage of the Monaco editor that we have sitting with inside Windows Azure websites. So once again, if you're away, you're playing around on your iPad, you need a development environment to do something quickly. Easy thing you can do, boot up this online editor and you can see here I have a little bit of a convention going on and basically these jobs are built in this convention so you can check them into source control, right? So we have an app data folder. The app data folder has a jobs folder. The jobs folder has two different types of jobs that it can run, one's continuous, one's triggered. Continuous meaning it's gonna run all the time and if it fails, we're gonna try and boot it back up for you as quickly as possible. Triggered means it can either be triggered by a schedule or triggered using the API or going to the Azure management site and clicking the run button. But what I've done here is I've created two web jobs. One's called delete logs and this is a bash script. So you can see here I'm just going through and removing the log file. So D colon home log files, PHP errors. So this is my local file system. If I wanted to go off to the other file system you can see here we have an API for files and it's actually running the API so it's the site that you wanna leverage dash API and then we have VSF which is virtual file system. So you can actually go through and ping and do a delete against that from one environment to another. And the other one is just a PHP file just to show that you can do it but I'm going off and I'm getting the environment, the region that it's actually deployed to. So this is just going off using a simple PHP script and doing something. So now I'm back in the Azure portal and both of these are triggered jobs. So I'm just gonna go here and run this report region. I can do that straight from the management portal and then I have the ability to go off to the logs here to see how well that task went and ran and hopefully I still have internet connectivity. There we go. Awesome. So it just ran 19 seconds ago so we can see what command did it run just in case you have multiple files in there. What it's gonna do is it's gonna look for run dot whatever the extension is first. From there, if there isn't a run dot it's gonna do it in alphabetical order and it's only gonna run one file at a time. So you can go in here. Here's our run details. It was successful. Here's the console output that it had and you can see here we're running in West Europe which is our local data center right here. So that was pretty easy. So I wanted to talk about virtual machines just really quickly. So Azure Virtual Machines, you can spin up from one VM to hundreds of VMs. We have tons of different images available. Both Windows and Linux machines depending on what you have a preference for. All of them are here. I'm kidding. We have tons of them. We have a lot more than this but we have four different distributions of Linux. We have a whole bunch of different Oracle virtual machine images. We have a puppet labs image so if you need a puppet agent that's all ready to go for you. And then we have a couple of Microsoft specific ones. There's also this thing called VM Depot where we have a lot of great images from Bitnami and other partners where they've gone and set up a Drupal environment for you so you can go and leverage those as well. Virtual machine extensions. This is how we take advantage of other useful tools. So basically the extensions get placed in with the virtual machine as they start up. So this is how we support things like Chef, Puppet, antivirus through semantic antivirus and Docker as well as other things like PowerShell, remote management and stuff like that. But this allows us to use Vagrant. So I'm gonna do a quick demo here on how to use Vagrant against Windows Azure. It's very quite easy. I went and ran it earlier just to make sure the machine was up and running for me. But how many people know about Vagrant? Good, a great portion of you. Shouldn't have let that slide to the bottom. There we go. So all I did here was said Vagrant up. I have to pass in dash dash provider Azure. But that says, great, let's go leverage Windows Azure to do this. So it goes through. This red line is not an error. It's just saying, hey, we don't have an existing thing so we have to go and create everything. And then it goes and creates all the deployment stuff off as you would usually see. I'm just gonna clear this out. I ran a provisioning script as well. To get this, all you need to do is say Vagrant, plug in, install Vagrant Azure. Dash Azure. So that's really awesome and ready to go. And I have one more thing here to show you is the actual Vagrant file. So Vagrant configuration. We have a dummy box that you can call whatever you want. The box really takes care of the size of the VM. So you can create a number of different boxes just to delineate the size. Then there's three main things you need for Azure. You need the management certificate. That's how we interact with the Azure API and notice that it's on behalf of you. And then your subscription ID. The image, we use the Azure command line tools. So we can say Azure account cert export. And that's how we got the management certificate. And then to get the image, you can say Azure account image list. That's gonna go out and get the huge list of VM images we have. So you can see it's actually a pretty extensive list. Just grab the full string. So the starting number to the end and then you're ready to go. Once you set that up, you can just say Vagrant SSH. And that will go off and connect to our box for us just like we're expecting Vagrant to do. And there we go, we're in our machine. So I ran a provisioning script with this. So if I say which PHP it should be able to say PHP is installed, we can see yep, it's off in that directory. So this is all set up and ready to go for our Azure PHP SDK as a development environment. So that's really great. We can go back here and say Vagrant destroy and it will go and tear down all the environment stuff for us. So just wrapping up, go off, use Vagrant plugin, install Vagrant Azure, grab the tooling and thank you very much for joining me today. I'm assuming we just switch over. Do you want to leverage that? Do you have quick questions before we move? Yeah, I'll go on and send them. Any questions? Can you actually use image or sorry, the current app gallery extension for Azure website uses MSS QL? But there's nothing to say that you couldn't go and set up MySQL, you just have to configure it properly after the fact. If you want to use virtual machines, all the Vietnamese are going to use MySQL by default, I believe. I was actually wondering like what are the problems if you don't get further than this or something. Is there anyone I can talk to? We have forms on both MSDN, which is Microsoft specific site, but we also have all the product teams looking at Stack Overflow. So if you use to take Azure websites, acu-web-sites, you can go there. There's tons of people looking at that all the time, it's all included. I also have another website, which I'll put a link up later. And before you can reach out to it directly to me on Twitter, my name is Steve. Okay, hi. My name is Tim Kreitzer. I'm going to talk to you guys a little bit about Drupal and Ruby and why we should be friends. I'm Tim. I'm from Portland, Oregon, not too far from where Corey's from in Seattle. We like to keep it weird in Portland. I work for New Relic, a monitoring company. I've run the Ruby agent development. Now, if you're wondering why New Relic sent someone who works on Ruby to DrupalCon, the reason is before coming to New Relic, I also was a manager for Drupal teams and built sites for Nike, Intel, Hitachi, mostly marketing sites, some things from small sites, couple pages to enterprise learning systems. So just a quick little bit about New Relic and what we do, application performance monitoring. You install our agent and we give you detailed statistics and analysis of what your application is doing, help you find performance problems, help you get alerted if there's outages, that sort of thing. Specifically, if you are a Drupal person, we have Drupal Instrumentation. We automatically detect if it's a Drupal site, can tell you if your new custom module that you just installed is making your site three times as slow, that sort of thing. If that's interesting to you, we're downstairs in the exhibit hall way at the end and I have a bunch of little cards that will give you a 30 day free trial instead of just 14 days, so come on by and grab one. So I wanted to give this talk because I really care passionately about developer tools and I feel like especially in the Drupal community after having been in it for about five years, it's very common for Drupal people to see every Drupal, Drupal has the solution to every problem and I wanna have more tools in the toolbox all the time. The professional athletes when they're training, they don't play their sport 12 months out of the year. They take summers, they do other things, they play golf, they have fun, they have a good time, they do other physical activities, they do cross training and I think as developers it's good for us too. Obviously we want to become more proficient at the things that we're the specialists in but we also, a wider base of knowledge is a good thing. So that's why I'm giving this talk. In Ruby, I wanna show a little bit of the fundamentals of the language just so you get an idea of what it looks like. Everything's an object in Ruby so you can ask a string to make itself into uppercase. You can run an iterator through an array and ask and get a capitalized version of all of them or you can even take a range object and convert it into an array. Every object, everything, even numbers can receive methods, strings can receive methods. Here's a quick example of a Ruby class. This is from one of my own applications, a music database, I'm including some modules. You can do inheritance in Ruby but you can't do multiple inheritance so it's much more common to use composition and include multiple modules instead of trying to do inheritance. I've got some custom things for doing database fields. So HasMany is a MongoDB adapter method that creates a relationship to another class. This is an example of Ruby domain specific languages so those are actually just methods. HasMany field and validates are all just regular methods that can be called without parentheses. And then I've also defined a bunch of custom methods myself. One of the real powers of the Ruby language is gems and you can create a gem file that looks just like this. You specify all of the gems that you want. You can say version information, maybe I want anything newer than 3.1 or anything that's in the same family as 2.2 or something like that and then it will automatically resolve and install all of your dependencies for you. If you've used Composer, NPM, they're both inspired by how bundler and gem work. So I wanted to talk a little bit also about Ruby frameworks. Obviously everyone knows Rails and you can find lots of stuff about Rails but there's a couple smaller ones that are a lot easier to learn if you wanna try just a little bit of Ruby without learning a ton of stuff at once. A lot of Ruby frameworks use Rack which is a Ruby object-based approach to building a layered web server. You put little Rack classes on top of each other and you have a full application. Anytime you have an object that can respond to a call method within a response code, headers and content, you're done, you have an application. In New Relic you can see this is an example of a Rails application and all the rack middle layers being instrumented all the way down. Another really common framework that's a really great starting point if you wanna play with Ruby is called Sinatra. It's a micro framework. All it does is just routing templates before and after filters, sessions and caching. It doesn't do database stuff. It doesn't do email processing. It's much lighter. So if you wanna just make a quick little site or a quick little application, Sinatra's really great to play with. This four lines of code is a complete and total Sinatra application. It will work just fine. You can deploy it to Heroku. You can deploy it to anywhere you would normally deploy Ruby. So if you already are using, you might already be using Ruby and not really know about it. Some of the things that Drupal people use, Compass, this is a Ruby application for front-end people to be able to do SAS. It's basically a SAS toolkit. Gives you a mixing gallery, plug-ins, Compass Clean and Compass Compile. This is really great if you have a complex SAS-based theme. It will automatically do all your preprocessing for you or you can even run Compass Watch and it will just do it for you on the fly. So if you're not using this and you are using SAS in your themes, you really should check it out. Also, Chef and Puppet are really famous applications for doing server provisioning and they're both written in Ruby as well. They're actually Ruby, the code you write for a Chef cookbook or a Puppet file are both just regular Ruby. So this is a Chef cookbook to install Nginx. Really simple Ruby. And then Corey was mentioning in his session, Vagrant as well. Vagrant is also written in Ruby. So if you wanna be able to work closely with Vagrant and edit your Vagrant file and do complicated things in it, a little bit of Ruby will help you. Specifically for Drupal, I wanna talk a little bit too. Everyone here at this conference is talking about Drupal in SOA. Services-oriented architecture doing headless Drupal, exposing Drupal data to external applications, new view layers. I am a big fan of the feeds module for Drupal for getting data in and out. It's really simple and really easy to use but there's a lot of different ways to do it and Ruby is a great partner to Drupal in this way. I wanna show you guys a little example of something that I built. This is for a athletics competition called the Wild Canyon Games. It's held in Eastern Oregon. It's a big event. A bunch of people come together and just compete for a long weekend. This is all the bicycles lined up for people ready to go. We wanted to do something specifically at the Wild Canyon Games for a group of about 200 executives. Each one of them was given a Nike Plus fuel band that tracked their activity and we had them train in teams in the weeks leading up to the event. And basically we wanted to do leaderboards to say which team has the most fuel points for each week, each month, individual leaderboards, that sort of thing. It would be really easy and we already had an existing Drupal 7 site at wildcannygames.org. It would not be too hard to talk to the Nike Fuel Plus API and get data and they have a pretty good published API. The documentations are pretty good but as it happens, there's already a Ruby gem that does all of the talking to Nike Plus for you. It has all of the endpoints mapped across. It knows how to do the OAuth authentication. It's really easy to use. So we set up a little architecture that looks like this. The Drupal site is at the very end Drupal PHP. And in the middle, I wrote a little Rails application using Ruby hosted at Heroku which you can do very quickly and easily to take data out of that gem and transform it, aggregate it and basically prepare it to come into Drupal. So the Nike Plus data looks like this in Ruby code. So you can see all the activity stuff that's coming back from Nike. A lot of this stuff we didn't really care about, so that was fine. I was able to go through and do summing and totaling and kind of aggregate it all together and get it into a feed that looks like this. So this is a feed that's JSON. It's ready to be imported directly into the Drupal application. We were able to set up a Drupal cron task that runs and just hits this feed every hour and grabs new things and makes Drupal nodes and then on the Drupal side, we built the leaderboard and actually displayed the data. Questions about that kind of approach? Does anybody have anything? I must have talked really fast because that was like 11 minutes. That's what I have. So hopefully if you guys have more detailed questions or wanna look at some other things we can, we have some time or if you have questions for Corey, that's okay too. That's how we do our PHP instrumentation. Yes, we also monitor ruby.net, yeah. So is the question, one of the questions that Lorna James said that we should ask all our prospective hope is does that, yeah there's a, I don't make that if you want to actually. I don't think it's on. So does Azure accept various PHP extensions? Yes, basically there's a couple of different ways that you can go and provide the extension, right? Cause we manage PHP for you. So in that case, we have a set of defaulted extensions that are enabled. Any other extension that you want to enable, you need to bin deploy. So in your WW root folder, you create a bin folder. That protects it from remote access, like remote execution and anything along those lines. And then the app settings that I talked about, there's a reserved word called PHP underscore extensions. And you make that the key of the app setting. And then if you do a comment delimited list of relative paths, so you do bin slash and then the extension name, that will go and enable them within the built-in PHP version. If you need to manage your own PHP version or would like to have full control over the PHP INI file, there's this thing that you can do, which is like bring your own runtime. And then you go and you configure the actual HTTP handler in the platform to point to a bin deployed version of PHP. Then you can just use the EXT folder of that version of PHP and the PHP INI file from that in order to enable them. I know we're also doing a lot of work on our .NET agent team around Azure and making the Azure experience to be as quickly as easy as possible. But I don't know if that's specifically for PHP. I think that's more around. I think the PHP plugin right now for New Relic is mostly for Linux. Yeah, yeah. So Azure, yeah, Azure websites runs Windows and IES. So the New Relic plugin right now, I don't think actually works within Azure websites. Probably not. Other questions? Was this interesting? I mean, was that, hopefully it was quick, I know, but it was a quick tour of some other stuff that you might not play with every day. And I hope that you'll check it out. Okay, thanks.