This is going to be a little bit of an informal session. All right, so I'll tell you a little bit about myself, kind of open you up to hopefully give you an idea of what kind of questions you can ask. First of all, it's literally ask anything you want, hopefully related to plugins, but you can ask me other things if you want to. So my name is Pippin Williamson. I'm a plugin developer. I live in Hutchinson, Kansas, and I've been building plugins for about eight years now, I think. I started building plugins my sophomore year in college, which is at the University of Kansas, and I built them just kind of for fun. I was doing some client sites at the time, and I was building special features for clients, and then eventually decided, you know, this could be kind of fun as a plugin, and there's this cool website called CodeCanyon.net run by a company called Envato. Let's throw it up and see what happens, and it was my very first plugin I ever released. It was a little plugin called Font Uploader, and it allowed you to upload a font file to a website, and then apply it to an element on the site. And this was before we had really, now there's much, much better options, but anyway, I put it up there, I put a little price tag on it, and on my first day I sold a copy of it, and I went out and bought a cup of coffee, and I was hooked. And I was like, awesome. So I managed to sell enough to buy a few cups of coffee every month, and as a broke college student, I cannot tell you how awesome that was. I mean, three bucks for a lot day on your way to class is like the best thing in the world in the morning. So anyway, that was about eight years ago, and I write plugins. It's my full-time job now, and it has been that way for five or six years now. And I do a few things with plugins. So first of all, I run a website called Pippinsplugins.com and this has been kind of my personal portfolio website for a long time. It's a personal blog. I write about plugin development there a lot. I used to be very active in producing tutorials for plugin developers that wanted to learn how to build plugins. And I mentioned development a couple of times. If you're not a developer, that's totally fine. I want any kind of questions you have, whether it's using plugins, what should you use, what should you not use, how do I build a plugin, how do I sell a plugin, anything that you have. So if you hear me talk about dev or code a couple of times, don't worry, don't run away, it's okay. It's just what I like to do. So sometimes it comes out. Anyway, so I run a little website called Pippinsplugins.com and it's been my personal site for a while and eventually that led me into building a whole slew of different plugins that have been released and eventually led to a much larger project called Easy Digital Downloads, which is an e-commerce plugin for WordPress. Eventually, I started to get to a point where I wanted to sell plugins through my own website and through my own systems, take control of the payment process of the licensing of how I gave the plugin to the customer, how I communicated with them, etc. And so I ended up building this plugin and that turned into my full-time job pretty quickly, was building that plugin. And that also led into building another plugin called Affiliate WP, which is an Affiliate Marketing plugin for WordPress that connects to an e-commerce system, whether it's Digital Downloads or WooCommerce or any of the other e-commerce platforms or membership systems out there for WordPress. And then I also built a plugin called Restrict Content Pro for selling memberships to your website, and it's actually one of my oldest plugins out there. In total, I don't know how many plugins I've built. I've built a lot of them. You can find a lot of them there at a link on the bottom, profiles.wordpress.org. My username is Morbach.  I used to want to be a fantasy writer and I created a character and that was the bad guy. And I don't know why I picked that name for myself, but I did. So anyway, that's my name around the WordPress world. And anyway, I also do review plugins for WordPress.org, so people that submit plugins there to the plugin repository. I'm one of the people that review the submissions there and either approve or deny it or help you get it submitted and get it listed on the repository there. So we see a lot of plugins come through. There's about 50 to 100 plugins submitted every single day to wordpress.org. And there's two of us that go through them. And for every plugin that I review, Mika Epsinu does 500 of them. So she's the real badass for sure. Anyway, so I propose a session to Devin who's sitting over here as one of the organizers. It's just kind of a thing. Anything you want, anything you want to ask about plugins, it can be development, it can be selling, it can be using plugins, it can be anything. If you don't know what a plugin is, that's okay too. I think people have a lot of questions about plugins and sometimes it's not very clear on where to get your answers. I've been in the plugin space for a while now, so ask me anything. Okay, so the question is what's the best plugin for A.B. testing in WordPress? Well, there's a few different options. There is a developer sitting in the room, his name is Josh Pollock. He is building a plugin right now specifically for that purpose. Inget I believe is the name. So that's one to go check out. There used to be one called OptimizePress, I think. No, that's the wrong name. That's a totally different plugin. Unfortunately I don't remember the name of it, but it's been around for a while and it was pretty good. Another thing that you can do, one of the things with plugins, people sometimes want to use a plugin for everything and sometimes that's not always the answer. Sometimes also, there's a service that you can use that can work for you as well. I personally use something called Optimizely.com which is a really good A.B. testing service. Sure. Okay, so what was the, for me, what was the course from going from being a Broke College student to being a profitable company? So now I run a company that, my company is called Sandhills Development and basically these four websites, Pivensplugins.com, EasyDigitalDownloads.com, FLAWP and Restrict Content Pro are our websites and our products and we are now, last year we did 1.3 million, I think, in revenue and we're profitable. We have a team of, we're now seven full-time employees and X number of contractors depending on the day. Tomorrow there's seven, yesterday there's three, I don't know, it varies. But anyway, so it's done very well for us. In terms of A to B, A to Z, I guess it's much more A to Z than A to B, but it was a lot of starting out when I first wrote the first plugins that I built and I put them up. The very first plugin I ever wrote was a commercial plugin. I put it on a website called CodeCanyon.net, which most people are probably familiar with ThemeForce.net CodeCanyon was kind of the plugin version of that. The very first plugin I ever built was on that website and it sold for $8. It was not, it was not a money maker, it was a sold two or three copies a month and at the time like I said I was a broke college student, it paid for a cup of coffee or two. But what happened was it was, it kind of triggered something in me that said I think I can keep, I can do more of this. Like okay, this little plugin makes $20 a month. Well what if we do a second one? Or what if we do a third one? What if we do four of them? And we build them up and we build them up and build them up. So I built another plugin. I built a slider plugin. How many people have used a slider? How many people really love the slider? So I actually built one of the very first slider plugins for WordPress and it was called Sugar Slider at the time. Thankfully the plugin is not available anymore. I still have a copy of it on my computer but it's not sold anymore. But for me the transition was going from I built a little plugin as a hobby. It was fun, I had a good time building it and I built another one and it just kind of cascaded from there, kept building them and I actually had a turning point at one point in college. I was engaged to my soon to be wife and it was my summer between my junior and senior year college and I was still broke and I said I've got a summer I've got three months before I go back to school and then I'm getting married and I don't know what I'm doing. So I had to figure it out and so I said I'm going to test it. If I can survive and I can pay my bills with plugin development and WordPress development for the summer I think I can make it work and that was my experiment.  I built a lot of different plugins. I put things up on Codecany and I started working on building things on my own site and it paid for itself. I did it. I managed to pay the bills that summer. I don't even, I don't know if I had a dollar left over in the bank, whatever it wasn't very much. And it just kind of kept going. I found something that I really, really, really liked and so I kind of went after it and then I found where I had something that I needed and so I went after that and then I found another thing that I needed because there wasn't something out there that fit my purpose or fit my needs and so I went after that and that's where these three products, ease of digital downloads, affiliate content pro came from is filling that need for myself. I needed those features and so I went after that. Is it repeatable? I think so. Absolutely. I think it's different for everybody but I don't know if that really answers your question or not but I hope it helps in a way. Okay, so the question is what's the onboarding process for contractors? What onboarding process? All right, so onboarding, how do you bring a new contractor into existing projects, especially projects that have been around for a year, two years, three years, etc. and get them into the flow? How do you familiarize them with the systems? How do you say, well, these are the way that we do things, whether it's from your development to your support to your planning. We don't have one. We just kind of say here's everything and go? That's not a good answer. We're learning. So yeah, I think that's the reality that most people you know, I think we're very common.   What are we doing? Why don't we have this documented? Why don't, when I bring a new contractor in, why are they not going at full speed tomorrow, everybody has the same problems. It's super common. Questions, what are the most common mistakes seen when uploading plugins to WordPress.org? There's a few of them. So it used to be including your own versions of jQuery, which is for anybody that's not familiar, is a library that lets you manipulate pages, do things on the web page, etc. And there was a problem in WordPress for a long time where developers would include their own versions of it and it would break things all over the place. That's still reasonably common, but we've mostly squashed that out pretty well. Now the biggest problem is people not following directions. They submit it without any code. They just submit a plugin, they give it a name, and then don't give us the plugin to actually review. And so then we have to give them an email that says, we actually have to look at your plugin before we can improve it. It's pretty common. The second one is not what caused someone to not be approved initially, but let's say they have some problem. It doesn't matter what it is. And so we send them an email and they just never answer. There's probably thousands of plugins every year that sit there forever never approved because you didn't answer the one email when we said, why are you doing this or we need you to do this slightly differently. Another pretty common one is security issues. We see a lot of just really, really bad code submitted and that's okay because everybody starts somewhere. There's nothing rough. When we're reviewing plugins on workers.org, we don't judge you on your code. As long as there's not blatant problems with it I don't care if it's written well. I don't care if it has bugs. I don't care if it's pretty. I mean a little bit I care because it hurts me inside when I see really bad things but the thing is that everybody starts somewhere and we're not there to judge. We're there to say okay is this safe for users to use? Okay that's fine. We'll approve it. So security issues are definitely pretty common. Especially people that are interacting with the database. Probably one of the biggest ones right now is we have a rule that says you cannot load assets off of other websites. So you can't load things from Google CDNs. You can't load from whatever service you want unless there's a very good reason for doing that. And that actually comes down to a security thing. Is it anything that's off site? Anything that's hosted on other servers? There's no way for us to know if that's malicious and so we don't allow it. So the question is how do you stay competitive in space? So how do you come up with something that is unique? How do you be competitive? How do you do something that hasn't been done already? I'll tell you that I'm standing here and I've never written a single thing that's original. I don't know if that's really a great answer or not but I don't think you have to be original. I think you just need to do something better. So if there's somebody that's built something out there, whatever system it is and you look at that and you think you can build it better, go for it. There's no such thing as a unique idea. Everything's been done in some form or other. It's just the way that you implement it. The implementation is key. Question is how do you manage time and projects? I don't use a time tracker. I don't know if that's good or bad but I don't really have a good answer for that honestly. So I've tried to, one of my goals throughout the last eight years has been to build things that I want to build. And I recognize that this is a little bit of a luxury that we've managed to get to a point where we can kind of build what we want to build in. Now I say that saying eight hours of every day are still doing things that I don't want to do. I'll be honest, out of every single ticket that I answer in the day or every single bug that I fix during the day, I don't want to do that. They're related to the bigger project of what I want to build but they're not things I want to do. But I still try to focus on everything being we have a goal in mind, whether it's the completion of a particular project or just moving one project a little bit forward. And I try to make sure that those are in our focus every day. And whether it's an hour or two hours I think maybe the thing that's helped me the most in trying to better manage time and stay focused is get rid of distractions. I'll have two little examples for you. One, I originally wrote plugin after plugin after plugin after plugin. I had about 100 plugins on WordPress.org at one point. I think I'm down to 70 now. But anyway, they became distractions. So even if each little plugin only took 30 minutes a month to maintain, when you have 100 of those times 30, that's a lot of time every single month. And so I started saying, okay, I'm going to cut this one out. I'm going to get rid of that one. And then the next thing is getting rid of distractions in my personal life. I will happily wear the same t-shirt every single day. Hopefully it's different versions of the same t-shirt, but getting up in the morning and picking a t-shirt to wear, it's not a problem that I want to address. Give me 15 black t-shirts and I'm happy every day.  That's a challenge. Super hard. I love what I do. My job is my hobby as well. And so it's very easy for me to spend 15 hours building something. It's self-discipline, honestly. Well, it's a couple things.  And eventually you start to not love your hobby anymore. And so you find a new hobby. For me, I really like making beer. And so I go home in the evening and I say I'm done at this time.  I think it's definitely been very important for me to try and find a separation between my work and my hobby. I love my work, but my work is no longer my hobby. Why did I kill it? Okay, so he used my old slider plugin, which was called Sugar Slider. I killed it, I think, three years ago. I killed it for a couple of reasons. Number one, from the development perspective, it wasn't built very well. I built it at the time that I was definitely still learning development. I didn't really know what I was doing. I knew enough to be dangerous. And it had a couple of bugs. So one big example, anybody here who has worked on client sites and has had a client say, I want 70 images in that slider. It's a pretty common thing. I don't know why people do it, but they do it. Well, there was an issue in Sugar Slider where if you put 70 images in it, it just doesn't work. 100% doesn't work. And it was one of those issues that it was rare enough that I just, whenever it happened, I'm like, look, I'm really sorry you paid 15 bucks, but maybe go ask for a refund because it won't work for that. And eventually I got tired of doing that and not fixing it. And I knew that fixing it was a much bigger problem because it was, the bug that caused that to happen was a design flaw. There was no, oh, it's a five line or an hour to fix it. It was a fundamental problem with the way that I built it. And there were numerous other problems as well, but that was the big one where I was like, you know what, I don't think it is worth it for me to rebuild this plugin in a way that works when there's a lot of other better options out there. This is not what I really care about. This is not where, this is not a product that I want to focus on. And so I'm going to discontinue it as opposed to forcing myself, sitting down and torturing myself to go through and fix it and make it work as a way it's advertised. Okay, so the question was, first of all, we had a critical vulnerability a couple of years ago. Now, was this the one from a week ago? Okay, so we had a really bad bug a week ago in a plugin that I built. Super bad, actually, to the degree of let's say that you are running a subscription service and you do $5,000 a month. And then when you install this update, we discovered that subscriptions were tied to wrong customers and we had to go through and fix them and we might cancel every single subscription that you have on your website. Not very good. Not a good bug to have. It was kind of scary. Anyway, we fixed it, we tracked it all down, but the question is, what's a way to prevent that kind of thing from happening? Is there any kind of automated tool that we can use to detect those before we discover it because a customer reports it? There are a variety of tools. I don't personally use them and maybe that's why the bug happened. I actually don't have a recommendation for you on that, aside from higher code reviews. Get an external code review, whether it's from a developer you trust, a friend, someone else. A few months or a year ago, we hired a developer and we paid him quite a bit to come in and just review a code base for easy digital downloads. He spent a week or two going through and the number of issues that he found was shocking and it's because he's looking at it with fresh eyes. We look at this code base every single day and it doesn't matter how good of a developer you are. If you look at the same thing every single day, week after week, month after month, you're going to be blind to problems. There are some problems you will never see bring somebody in with fresh eyes. I think that's hugely important for preventing some of those problems. Don't be afraid to pay really good money to do it too. My personal website, pipinsplugins.com was built for that reason because when I was learning plugins, I did not feel that there was a resource to learn plugins. There was a lot of theme development tutorials out there, there was a lot of generic WordPress, but there was nothing plugin specific. That was what it was built for. I'm not very active on posting tutorials to it now. There is a pretty good archive of resources there. There is a plugin development 101 series there that's available. It is. It's still current. There are a couple others. Tom McFarland who I think is somewhere around here in front of me. Excellent. GoBriga's blog does a lot of excellent stuff. Search how to write a plugin. It's actually a pretty good Google search that does come up with some pretty good results. The biggest thing is I wrote my first plugin and I had no idea how to write a plugin. What I discovered, I built this feature for a client. It was this feature to upload fonts to the website. I thought it was a cool feature. I had no idea how to turn it into a plugin, but somebody asked me to. My response was, I don't know how to do that. That's scary. I finally said, okay, screw it. I'm going to go research it. I'm going to figure out how to do it. I discovered it took three lines of not even code. It was just a common in a file that turned my code that I had already into a plugin. It was so simple it was it made me really mad because I had spent months building this. I'm like, I have no idea how to build a plugin. I don't want to touch it. Then I discovered it took 30 seconds. I was done. If you know how to code, you can write a plugin. Guarantee it. Yes and no. There's a lot of plugins out there that are unfortunately not very well built. There's 40,000, 50,000 plugins on WordPress.org. With that number, you will always have some that are bad. Some that are good. Some that are great. Some that are somewhere in between. Unfortunately, just as a general rule, we can't auto update everything. We cannot trust 10,000 developers worldwide to always push good code. There's also a lot of times when even great developers push big updates that they don't necessarily cause problems, but they change things. Change doesn't always go over well with clients. I think one of my favorite tickets that we ever got was Urgent. This is a catastrophe.  You've broken everything. The only thing that we change from one version to the next version is one button move like three pixels. This was a catastrophe. It's e-commerce. People are picky. I don't think we can auto update everything. I think there's a lot of things that we can auto update, especially when it comes to security vulnerabilities. One of the beauties of the WordPress ecosystem that we have and the platform that we work on is the ability to identify a security flaw and push it out to 30 million websites in 10 minutes. There's no other system that can do that right now. That's pretty cool.  It was a pretty widespread vulnerability that somebody discovered. We got together, we fixed it, and then we auto deployed those updates and we had 50 to 500,000 websites fixed. That vulnerability dawned, obliterated from the Internet in five minutes. That's right there is a perfect example where auto updates are wonderful. That's what we want them for. But as for like new features or other things like that, it's pretty hard to justify doing it. Knowing that there's so much custom code out there, it's not a controlled environment. In order to push out major changes, you have to have a controlled environment. What's the one thing that I would like to build that I haven't built yet? I want to build a hosted e-commerce system. I think it would be really fun. It's not something that we we've got some plans for it, but it's not that far along yet. There's some cool things that you could do with a hosted system. Let's say you have 100,000 customers on it or 4,000 customers or whatever. E-commerce, one of the things that's really important is figuring out how do you optimize that purchase process. Look at something like Amazon. They can do an A-B test where they give one version of a purchase button to one set of customers and another version to another customer and they can, in a matter of days, maybe minutes or hours, they can figure out which one is better. They can say if that button is green it makes an average of one cent more per customer, which is $50 million a year because we're Amazon and it's crazy. When you are on a controlled environment where you control the entire flow of everything, you don't have people coming in and building custom themes or modifying the checkout process or anything like that, you can do really cool stuff. One of the things that I want to do is build a hosted system where hopefully we get to a point where we have a large number of customers and then we can start doing those kind of experiments and say we've discovered that through our testing that a skinny checkout form is 10 times better than a wide one that has the exact same fields or that if there is a link in the menu bar, that loses 0.5% of customers because they get distracted. Those kinds of tests when you control the entire process for 50,000 websites, 10,000 websites, whatever number, there's some really cool data that you can figure out. That's what I'd like to build. So the question is on renewal rates. So what is our renewal rate right now and how are we improving it because it sucks? It is basically the question. Alright, so renewal rates, we sell a lot of plugins and we sell them with a yearly license and so you purchase it today. That license key expires a year from today and we hope that you will come back to renew it in order to we encourage people to renew by limiting support and updates and things like that to people that have an active license key. It's a pretty common sale system that most people who have purchased a premium plugin are familiar with. To be honest renewal rates for manual renewals and manual renewal being I send you an email, you click it, you go through the purchase process, you renew it is terrible. It is awful. We're talking 10% renewal rate, maybe 20% if you've got a pretty good renewal rate. It's really, really not good. So that means that 80% of your customers are never coming back even if they are still using the system. People don't renew for a huge number of reasons either because they didn't see the email it went to spam, they clicked it and they clicked it from their phone and they're like well check out process for my phone is hard I'm gonna do it by desktop and then I forget. Who knows, tons of reasons people don't renew. Even people that are still using software for years to come. So it's a problem and for us as a business in what we have a lot of expenses this is something that we have to address. It's one of, honestly it is more important for us to address renewals and getting those customers back than it is to get new customers by far. I mean if we think of look at whatever revenue is last year and then say well you lost 80% of that. We just threw it in the trash can for the next year. It's a little tough to stomach and so we've decided to get a little bit more aggressive with it and we've actually recently converted all of our systems to use an automatic renewal system that you can opt out of at any time. So let's say you purchase it and you're going to purchase it you want to use it for a year and you don't want to use it after that you can cancel at any time. There is no obligation like that but it solves a problem of people not knowing they need to renew even though if they knew about it. The number of people that don't see an email when you send it to them is astounding or the number of people that don't recognize what they're seeing or what they're doing is crazy. So we've recently actually changed our systems to be automatic renewals and it's going to be a pretty significant impact for next year. So just to give you a quick example let's say that our renewal rate is 20% this year. Alternatively with automatic renewals you're going to see 75% to 80% renewal rate. So our renewal rate will increase by 60% probably minimum. Take a dollar in a amount and now do the math and for anybody who sells a product it's the way to go. There is no doubt. There's a reason that every single company that does exceptionally well in software is a SAS. I hope that kind of answered your question. Most of the time I don't think charging a monthly works. It kind of depends on the service or the product that you're selling.  If you don't pay it next month you don't get to use the service. End of story. Like it makes sense. So a monthly bill is fine for that. But now let's say that you sell a plugin and you bill monthly. What happens on month number two if you don't pay? Okay, well if you completely kill the plugin so it doesn't work anymore that's one thing. But let's just say that it just, it still works as is. Why am I going to come back to you and pay you a second month? I might because I hope to be a decent person. But what if I forget about it? So as a store owner the problem that you're going to see with monthly is customers like, you know what? I'll commit to five bucks a month. I'm not sure I'm ready to commit to $50 a year. So I'll do a month. I'll pay you five months. I mean I'll pay you $5 and next month I forget about it. And I'm a $5 customer instead of a $50 customer. But I receive the same product at the end. So typically, especially for products, monthly doesn't work. So for developers how do you choose when and where to put a hook in a plugin and how do you decide when you realize that you screwed up and you need to take that hook back out? Okay, first of all I like to go with the idea of try to be as flexible as possible. And if you have a function that returns a value it goes through a filter. If you have something that performs an action it fires an action. Before it happens, during it and after. And I think with that basic guideline that tells you everywhere that you need to put a hook from day one.  The answer is you don't. You don't get rid of it. Welcome to the backwards compatibility. There are ways to do it but it's pretty hard. Here we go. Yes, five minutes? Okay, thank you. Okay, so if you have multiple plugins that do the same thing, how do you pick the better one? Personal choice. Personal choice experience. Which one has better support? Which one is updated more frequently? Just in general, which do you have a better experience with? Sometimes there is not a right or wrong answer. So I started building plugins myself. How did I get other people involved into the projects? How did I hire new developers that were interested in and they were good developers? First of all, I think just having a going about product development in an open way and an open source spirit in some way is going to encourage a certain number of people. You're going to get people that use a product and they find a problem with it so they come and say, hey, I would like to I think you should improve this. I'll get you a few like this maybe. Ask people. I think the most successful thing we did with easy digital downloads and getting community involvement was I wrote a blog post that says I'm building a product. Here it is. It's open source. It's on GitHub. Help me. And it worked. It seems kind of silly but ask people to help. And then those people that help, a lot of people will volunteer and be they'll prove their worth.  Those are the people that you say would you like to do a little bit more? Best plugin or combination plugins for security? The one that I would go for would be I theme security. I theme security. So it's by the company called I themes and then it's security. It used to be a plugin called better WP security. I think that's right. And then it was acquired by I themes in the last year or so. I theme security. Don't combine security plugins. It's typically a bad practice just because they do a lot of the same thing. And it may not be apparent that they do the same thing and they might clash or they just cause performance problems on your site. So why I theme security and not something like WordFence? My answer is really that it's what I have a good experience with. And it varies for everybody. People are going to have great experiences with WordFence or with Protect in Jetpack or whatever the particular security issue that you want to address is honestly, I don't use any of them to be frank. I've never put a single one on any of my sites and I'm okay. I'm still here. Business is still alive. And it's because frankly WordFence is pretty secure as it is. The biggest problem in WordFence are developers. Are people writing other plugins to solve, to do various things and then that introducing a security bug. Who's thrown a Panama papers recently? That was not WordPress. That was a plugin that ran on WordPress. And it's okay. This is not a criticism of plugins. This is definitely not me telling you not to use plugins. It's simply that WordPress itself is inherently secure. Depending on the situation you may want to do more but it's not mandatory. One more question. Most of the time, zero. So how dangerous is it to upload a plugin to WordPress that has not been tested with that version? So let's say that WordPress 4.5 which just came out and then you have a plugin that you want to use that says test it up to WordPress 4.4. Is it dangerous to upload that plugin? The vast majority of the time the answer is absolutely not. The reason being that most plugins are not updated for compatibility like tested because they don't need to be. Alright, I have 75 ish plugins on WordPress.org. Rough guess how many do you think actually say they're compatible with WordPress 4.5? About two. The reason being is those are the only two that actually received updates in that time because those are the only two that needed updates. And most of the time those are not because they needed an update for WordPress 4.5. It's because I fixed a different bug or fixed a compatibility issue. The tested up to thing on a plugin is actually defined inside of a plugin file and in order to change that number the developer has to go in make a change in the plugin file and send it up to WordPress.org. It's a hassle. Every time a major version of WordPress comes out I get an email that says, here's all of your plugins by the way that are not tested WordPress 4.5. You should go update them. And I look at it and I'm like... So honestly the answer is not. Very, very, very rarely is it a problem. The only time that it becomes an issue is if you have a plugin that is using a major feature in WordPress that changes between those two versions. Example might be post formats. Post formats changed pretty drastically between a couple of versions not that terribly long ago. So if you had a plugin that was doing something with post formats it might have been a problem between those two versions. Or if you have a plugin that a really old feature is the links manager in WordPress I suspect that not everybody here knows what that feature is because it's been gone for a while but if you had a plugin that interacted with that feature and then you up and let's say that somebody updated from, I don't even know what version that was 3738 and you went from 3738 that feature is gone. Completely. That's a problem for you. But that's pretty uncommon. Okay, I think that's all the time that I got. Let's get a round of applause guys. Thank you so much.


Computer terminology. This is your laptop. You use your laptop for all your activities you do in class. Today we are going to learn how to use your laptop and what some of the features of your laptop are. This is your desktop. When you log on your laptop you will see your desktop. This part of your laptop is called a screen. We also call it a monitor. Your laptop monitor is an example of hardware. This is your keyboard. You use a keyboard to type. This is your mouse. You use a mouse to navigate your laptop. You can also use a trackpad. You can use a trackpad instead of a mouse to navigate your laptop. This is your headset. You use a headset to listen to audio clips and videos on your laptop. You all have your own headsets that you will use in class and at home. When you log on your laptop you will see a desktop. Applications and icons. The trash can you see on your desktop is the icon for the recycle bin. When we delete documents they go to the recycle bin. Microsoft Word is an application. We will use Microsoft Word for writing assignments. PowerPoint is another application we will be using. Microsoft Word and PowerPoint are types of software.


So I'm going to talk about Fogwork. I've been doing this online, so that is probably more useful for the hub and footer and all that. I work for an engineer. They're kind enough to employ me to work on Fog full-time, doing that now since beginning of September I believe. So the amount of progress that I've been able to make in full-time is amazing compared to the bits and pieces of time I've spent together when I used to be a pet product. As has been mentioned a couple of times, we're doing a hackfest tonight. I'll definitely be there probably for the whole time. I can manage to stay away that long. It should be a lot of fun. Do you have any questions about this stuff? Maybe I just ask it. So first off, just to be clear, Cloud is a word that is thrown around a lot these days. So just to be clear what I'm talking about when I talk about Cloud, since it's something that I work with a lot, is that it's something that's eight-guider and it's on-demand. I think those are both key to at least do Cloud as I understand it or Cloud as I care about it perhaps. So some of the core things from that are doing compute or DNS or storage. But there's also some things that are kind of on the fringe that are starting to move into this territory. Things like key dog storage or low-gum storage where there's a few places where you can get them in this kind of way. But in a lot of cases, you're kind of on your own still in those areas. So to dig in a little bit more, it's on-demand. So you only pay for what you use. It's different from traditional hosting. For instance, where you pay for server months kind of instead of server hours or server minutes. So this is really nice, especially if you're working on that project every weekend. You can maybe only run your servers during the week then when you're working on it. Not pay for during the week when you didn't get a touch-up because you're doing your day job. And it's flexible. You can add and remove resources in minutes, not days or weeks or months as it would have been if you had to go and fill out a form somewhere and get somebody to go and pay for these things. And it's repeatable. You can set up so that a server spends up and some configuration happens and make sure they did the right thing and know with some confidence that you can do that. Again, tomorrow if you need one more server or the next day if you need three servers, so on and so forth. And from that you can build more resilient systems because if you don't think about the server necessarily always being there you can account for that and build systems where you can more easily add and remove resources as you need to. So that's great, but why am I worried, right? Like this all sounds very promising. And the problem is that if you quickly run into an option overload there's a lot of different providers, there's a lot of different services it can be very hard for you personally in any space to figure out, okay, do I want AWS? Do I want Rapskates? Why would I choose one or the other? What did they get me and how? Where did it cost? And along with that is this expertise, like a feature set side and you have to learn a whole different set of knowledge to work with these individual providers which can be very difficult and get a lot of upfront effort. And it also gets you locked in, it's very hard to switch once you've made the effort of spending five weeks deciding if you understand AWS and don't actually use it. So there are two rules, but when I was first coming into this I found that the two rules were vastly different from one another, frequently vastly different from the APIs that they were actually serving and the quality and maintenance of those was very, from the project, it was very difficult to tell they were still maintained. So I decided to start working on my own. The other thing too that a lot of people ask me about is standards. Standards is another way that we can possibly approach this. I think the standards process is good, but it's been slow and in many cases the standards end up getting interpreted in such vastly different ways that it's kind of a joke to say that you have a standard in first place. So my approach to dealing with this ended up being this thing called ball. And initially it started out pretty humbling. It just started working on a couple of little services because I wanted to learn them better. It didn't allow me to do low level stuff. It wasn't that fun to use. You still needed to have a lot of expert knowledge. And eventually, it built on top of that, it built abstractions and it got better and better. And eventually it got to the point where I was like, wow, I'm really on to something. And so why I think you're getting on to something is, first off, it's portable. If you use the higher level of distractions and move back and forth between providers, pretty straightforward. You get away from what the actual providers' APIs look like because it's difficult to have one API that is exactly the same matching. But if you use the higher level of distractions, you can move back and forth, which I think is pretty powerful. And there's a lot of different abstractions then that actually provide for this flexibility and power. It's pretty established now. I recently got over a thousand followers on GitHub, I have 85,000 downloads, a bunch of contributors and followers and I work with full time on it. So I certainly hope that that indicates that it's here to stay. And there's also some walking built-ins. There's a lot of cases where you can actually try out what would happen and work on building out exactly what your Norwegian workflow is without necessarily having to worry about explicitly spending real resources that you have to pay money for or that you have to wait for. At some point, you obviously have to do that, but this can get you a long way towards that when you're a student testing and trying to bootstrap and figure out what you're doing. And so also, I just wanted to mention, we already have a decent number of people more all the time that are using it, both products and libraries, which is very exciting. And so, first off, just a little interactive bit and make sure we're going to still wait after the boring definition is sparked, make sure we're on the same page thing. Just a quick show of hands for people that are using the cloud as I defined it in the event. So it's a pretty good number, and then if you can keep your hands up if you're doing it with fog already. So it's a much smaller number, but there's at least a few. It's not completely crushing to where you go, but you can just put it off there. So we'll work on that. So for the rest of you, because most of you didn't actually raise your hand for either, frequently what I get is, this stuff sounds great, but I don't actually have a use base for that. I don't need cloud on a daily basis. So for the purposes of this presentation, I'm actually going to give you a little make-believe purpose and walk through how you might actually go about using this stuff given that purpose. So the purpose is we're going to build an uptime site. We even have a tag one, because who wants the busted site? This is going to be our next big thing. We're going to work on it on the weekends. We're going to kick it out there. I hope we get enough people. We get 20,000 people in pretty soon, and that's our salary rate. It's going to be great. So first off, simply, we just need to do setup, so you can get install, or sugo if you're not using, don't have stuff set up such that it works great. So the first thing to do is just create a connection. So compute is one of the extractions that I mentioned. This represents all the different compute providers basically in an abstract way. So you pass some credentials in. This is what a credential set might look like. This is for Rackspace in particular. So we're saying the provider actually will use the Rackspace, and here are our Rackspace credentials. And we want to go to server.  I'll explain more about that later. And get back the body of this thing, look at server, right? Of course, we can sit around and wait a little bit because we can't really do much with it until then. Then we're going to run some SSH commands. We're going to place our key so that we can SSHM. We're going to turn off root password because Rackspace hands you a root password back which is kind of bogus. And then we're going to start it up. So that's like super easy, right? I mean, no problem. You don't want to take me an hour and I need this stuff all of a sudden. I mean, it's not easy, right? This is exactly why I work, right? There's a lot of very specific things to do that's work. I don't expect that many of you are going to be able to pick up that much specific stuff in a short period of time at all. And this is your weekend project. You don't want to spend the first 10 weekends figuring out how to use plugs enough to build this site when you want to get off the ground, right? So, you know, there are these arguments. I don't know what they are. One in 49 and a half, who knows, right? And it's only going to work on Rackspace in this configuration because it's very specific to Rackspace. So, I mean, this was how I started out but I quickly realized that this was a disservice, really, right? I had tooling, but the tooling wasn't really gaining me very much, right? If I'm still back to square one and making these API calls more or less from scratch, I could use an HTTP and not really, you know, be in a better place. So, from there, I've made a lot of improvements so I'm going to give you a better idea of how that would work. So instead we can get this compute thing and call servers on it, which is a collection of servers that kind of represents all of your servers on that service and you can call bootstrap with a sort of server attributes. So, server attributes then, we can see that 49 is actually an identity. That's helpful. We now know that 49 is well, sort of, it's a bunch of people if that helps, but you at least know where that fits into the slots, right? We're going to say what the private and public you are so that it will be able to place it for us. And then, effectively, this will do everything in that 40 or so lines that I showed you before did it, but you did it in, if you wanted to get the hash in, that's one way to go. So, what is this service then, right? So, it's a collection. It's kind of like an LRM server thing. So, you can just call servers, it's a lazy loaded thing. So, you can call servers or servers not all you get back with this is what you have. You can call servers.get with a particular ID, you can just get that particular one back. You can just reload and say I know that you have a copy of what they did in this slide when I called this in the first place, but I have reason to suspect that it's changed over time, so please make sure you have the most reason. You can use a new. This creates a local version of the thing, so it doesn't actually say spend the server, but it just creates a local representation if you need to manipulate that and get things in order before you get off. And then there's create, which does the new that actually will kick the server off into the cloud as well. So, now what we need to do is actually get into our actual recording of all time together, right? So, we need to ping to do this. So, we're going to use the ssd command on the server that we created with a little bit of code. They call ping-c10 and target. So, target is going to be specified presumably by our customer, right? Maybe they want to check, this is mysideup.com, right? So, that's what the target is going to be. Ping-c10 will run ping 10 times and it's going to kind of aggregate result down at the bottom. So, we're just going to pull the standard out off of the first command that the ssd is staying right. And then, this is a comment to explain what I do next, which is kind of ugly. So, I could have used a redx or an rc expression grammar or something, but instead I just did some splits and stuff because I wanted a quick, easy example, right? So, the line 6 is what that result line looks like. So, I'm splitting the whole result set by new lines and just getting the last line. Splitting it by the right spaces and getting minus 2. So, the a slash b slash c slash d which is the main max out of the standard deviation. Split them by another slash and you have all the data. I know that was very complicated. I apologize. But then the important thing I think to note is that so far the most complex code in the world and hanging something and getting back aggregated status results, the most complex thing is actually the person next to you. Everything else is pretty easy. Sets and parameters need to go. So, the next thing is we're just going to clean up. So, I'll serve it up, store it, I'll shut it down so we don't have to worry about getting charged when we're over 4. And you can just throw the results that we just pulled into a hash to try and do some new provider. Because since we're doing uptime we might want to set it with something in US east of Amazon but also say put something in Rapspace Dallas because we want to go to multiple locations in case one particular backbone is down or something like that. So, going back to my previous example this is a diff of me taking that and changing it so they ran on Amazon instead. And you can see just how much similarity there is here between the two. I mean, the simple like naive low level script there's almost nothing that's the same. I mean it's funny, it's comical because the things that are the same are like largely coincidental like the one. It happens to have a one and you will less the same place in both scripts but I think it means something completely different. So, anyway we can go from that to to this, right? We use the same code we used before but we just set a different set of credentials and we set attributes for the server because there are some discrepancies between the writers. They look pretty similar though and we end up with a server again we can run the same SSH stuff everything else will just work. And from there also you can do simple stuff like taking that existing thing and just use and emerging in a different region for Amazon so that we can ping to from even more locations and have better coverage for our customers. So, from there the subsequent versions are pretty much just moving down the list of other supported providers and this is just a subset of them and you can just add them as you're needed and allow their instance to repeat. So, I mean, it's great but how did I even know what half this stuff was? How did I know that that ID was bunching and so on? So, thought comes in binary when you install it, if you run it immediately it will have something that looks kind of like this which says please create this file that has your credentials in it so that subsequent times when I do I'll actually know what you're dealing with so I can just load that up and you can go and do that. So, assuming we've done it we can get in and there are these kind of signups so the first thing that's going to happen is we'll say welcome to Blog Interactive and it'll let you know using default credentials up because you can specify your credentials and that you now have access to AWS because those credentials are available. So you can call providers so we can do that the same thing if you needed to do that. And then on Rackspace itself you can call collections this will tell you about things like servers but this will give you the whole list that's available on Rackspace. So this is somewhat longer than this. You can see also that it has directories and files which match to Rackspace storage instead of Rackspace compute. So these top-level things share the instructions everything basically that that space provides. If you need a specific one you can say I just want the compute provider and that looks like that. You just get back to the new provider and you can also ask the new provider what the request it supports. This gets down to the low-level nasty stuff that I showed you at the beginning. It is low-level nasty but occasionally you want to do something on a provider that's very specialized to that provider that the abstraction probably doesn't provide but you really need it. So all that's available and this can give you back the list of all of those things that have been implemented to kind of go top-down and what are all these analysis that I keep using. So providers are like Amazon, Rackspace or Zorigo for instance they're kind of top-level it's a company that provides services but it's not the services themselves. The services themselves are EC2 which is Amazon's compute or Rackspace servers which is Rackspace's compute or S3 which is Amazon's storage and so right now many top-level ones are compute, DNS storage and there may be additional ones as kind of demand comes up. So then there are collections. This is like favors and using servers and then those contain models that's the individual ones of those and then there are requests and so the questions and models are all those on top of requests the same as if you were going to do that low-level stuff so just briefly the repository saw since I kind of blazed over that before you can call, say, list servers you get back an X-con response which basically has a body headers and a status so if you know you should use stuff pretty simple and get it from that what we need and so the next thing is to do a sanity check we'll go back through and basically say give me all the servers that are currently ready which is equivalent to checking if it's running or checking if it's active or whatever, different from service to service but it means the machine is up, right? So just check for all of our running servers on both of these services to make sure we didn't forget any so we don't have to have a huge bill because I've literally left 20 Amazon servers running overnight before without realizing it and then we woke up the next day and I was like I'm almost as sad as my credit card as sad but thankfully there were smalls that helped it was still like 70 bucks for like 12 hours so I'm the lane so the next thing was also finding those images how did I know that 49 has gone to so there's a helpful thing inside of here on the collection called the table if you call table without any arguments it will just give you a nice kind of like table in the form I can expect from my school stuff in the console kind of but you can also specify in this case I'm saying I only want the ID and name columns because it'll wrap and look ugly and I won't be able to read it anyway we've got something like this this one that's all the other images just to show you an example and then for any of the other images I actually just cheated there's elastic.com that's sort of the official one too and we just managed to use that because the actual this information is so enormous that it's very difficult to find anything in the first place so the thing about exploring this way though is that it's kind of slow it can be kind of expensive so this kind of segues into the mocking stuff that I was talking about so it's pretty simple to use you can either call the binary with the environment where the fog mocking was true which will move that into the mock mode or you can require a fog and then call the fog before you start making calls it's meant to be a simulation so in most cases things will just work there may be some edge cases but for the most part things work really well for most people and if a mock isn't implemented rather than kind of working or something it's set up such that it will actually raise explicit errors so you know immediately maybe I either should add a mock for it or file a bug that I need a mock for it or so on and so forth so you don't have to hopefully run off track where the mock just has some weird behavior that doesn't matter at all and I actually run the tests against both real and mock modes there are some exceptions we're at any test and stuff but for the most part the specs can be worse on both so if you find an error you need to add a new test to make sure that that edge case doesn't appear or recur or whatever I think it will be so this aside we're back to business right you have all this data from your pain and now you want to do something with it because you don't want to just have this data so you're going to be pretty ticked off so we're going to talk about aggregating the cities and plot storage so this is probably someone familiar who connects to a storage provider here is a traditional set for a connected test 3 and then within the storage providers the top level is directory so this would map the Amazon to buckets but it maps to containers on Rackspace files and some other things basically so we're going to take this directory and we're going to give it a name and we're going to say that it's going to be public and then we're going to score a file into it so we just take that directory and say we're going to create a file give it a body we use file that will open like this it will actually stream the content as opposed to file that will read which will pull all of it into memory before doing it so we're going to create this directory into memory before doing it and then we set the key set that this is public as well unfortunately we have to do it at both levels just because some providers have discrepancies there sometimes you can set it at the bucket level sometimes you can only set it at the object level sometimes you need to set it above in any case, since we are using public we can actually call it public URL and for the services that support it we'll get back a URL that we can give directly to our customer that we can give directly to their data without ever getting our servers which we really need so from there we'll talk about geosourge similar to your geotainting so we can also just use this credential set to set it and have the same go-work for Raxway storage and finally we'll do our cleanup so we're just going to grab those directories, destroy the files that are inside of them and destroy the directories themselves and again, there's more providers it's a short list for storage not as many people have been in it but it's pretty much a lot of the recipe so our final phase then is profit so we have our thing, it works but we want to provide a freemium law so if you have an open source site or something you can use geotainting for free maybe but we're going to be able to charge people for something so what we're going to charge people for we're going to use DNS to provide a special subdomain to user or customers where they can go to their customers to see what the uptime looks like so we can actually have this look pretty similar we have some credential set we're using it as a rego this time and you'll create a zone with the main name and the email address for the administrator and then inside of that we'll create a record it has the IP what our subdomain is going to be it's an A type record and then our customer could be wired up with this DNS to disentangle that sort of on the other end but it should work for you and then we'll clean up similar to the other ones, you get this I don't need the recorders, you destroy stuff etc etc in a lot of cases these things will require you to destroy what's inside of something before you can destroy the parent that's why I destroyed all the files and why I destroyed all the records so then geofremium this should work on all the different DNS providers that's just a subset of them I haven't seen that since then it just lathers and repeats one of the key things I wanted to focus on is that all of these services once you learn one of them it's pretty simple to move to another one and see how those pieces fit together it's a lot of shared stuff so congratulations so now you just need to copy and paste and push and deploy objects and all this stuff so you can all start your app time businesses and maybe cut through if we have that many of them we have customers and as long as we have enough to do it so now you just need to find ways to spend this PowerPoint that I've just given to you I like coffee and bourbon and games for instance just throwing that out right now and in the entire year at least it meets so I hope that this works for some of them, it doesn't seem to work for me so this gets to the love part I talked about why I was worried it's difficult for me coming into this why it's probably difficult for many of you to come into this I mean I was suffering through trying to figure this out so I ended up with this thing I distributed it I hope that many of you will use it it was suffering being coded in Ruby actually I kid it felt a lot like suffering long ways and times but it's really empowering I get this comment a lot from people that it's easier or I didn't know how to do this stuff before now I can just spin up a server when I have some little poppy thing and it will just work like it's great and that's really exciting to really empower other people but also to feel empowered myself I'm not that much of an assistant then I managed some stuff on Slicehost through the web UI basically was the extent of my knowledge and so to be able to say I want to do some computation on a server and I have one and I've run some SSH commands on it but otherwise it's just like awesome it's really exciting for me this cutting edge stuff cloud is I think a future in a lot of ways it's taking some people some time to catch up but I'm hoping that this lowers the barrier to entry enough that the people in this room at least can kind of jump on board and get a leg up kind of on a competition and get out there and do the next set of really exciting things so now I'm going to turn it off so first off if you follow the follow I announced releases there so you can see when this stuff comes out or if things might get deprecated or other things kind of just keep a general line when it's pretty quiet so it doesn't hurt too much to follow you can also follow a GitHub repo if you want to get a little bit more granular in the detail you're getting back you can probably just play as stickers they look like this there's someone on the top here I've piled them in my bag over there so feel free to grab me or find me in the HackFest or later and you can ask me any or any questions you have HackFest would be a good time for it which is probably not really a lot of time into the talk and I have a few carbonated stuff like me if anybody wants to just hang out and play instead of talking tech like I'd love to so I'm going to have a notch normal mark right so you can report issues on the repo issues that also add are actually graded so if it doesn't have a grade next to it if it doesn't have a grade next to it you should probably skip it if that's a grade I've reviewed it and it had a commentary on how you can do it to make it easier there's an IRC channel there's a Google group you can write blog posts or give lightning talks I record those with blue t-shirts the art homework is callworkingonfog.io for giving information if you can come and contribute and the expert homework is to help maintain the positive services you depend on and to become a collaborator and actually get to commit it when you get to Blackshirt and I'm the only one that has one now I'd love to give somebody else one but I haven't had anybody step up to the level where I felt comfortable doing that Blackshirt so I just want to say thanks the examples the code from the top are there the slides are there and it's the repo you can bug me on Twitter or get over with us so thank you very much


and the people of the South will get a new facility. They will get a new facility. It's no longer, they might get, they will get a new facility. Thanks to our friends from Saudi Arabia. The government of St. Lucia, led by Prime Minister Hon. Philip J. Pierre, has achieved another significant milestone in the more than 13-year process to reconstruct the St. Jude Hospital, which was severely damaged by fire in 2009. I say this with the confidence that the government that I lead, we've kept one of our major promises to the people of St. Lucia. And I'm proud of that. I'm very proud of that. Prime Minister Pierre has prioritized sourcing the financing needed to complete the project and pursued bilateral negotiations with the Kingdom of Saudi Arabia. Within two years since Prime Minister Pierre assumed office in 2021, the Saudi Fund for Development has agreed to commit nearly 75 million US dollars for the purposes of completing construction works and procuring the necessary medical equipment, furniture and fixtures for the St. Jude Hospital. Today marks an exciting and bright chapter for the both of our countries with the signing of Development Loan Agreement worth 75 million US dollars for the reconstruction and rehabilitation for St. Jude Hospital. This project signifies Saudi Fund for Development committed to promoting sustainable development in St. Lucia. In May, Prime Minister Pierre, Senior Minister for Infrastructure, Honorable Stevenson King and senior government officials received His Excellency Ahmed Al Khatib, the Minister for Tourism in the Kingdom of Saudi Arabia and the Chair of the Saudi Fund for Development for an official tour of the construction site and the retrofitted George Audlem National Stadium which is where the St. Jude Hospital has been operating since 2010. And of course the people of St. Lucia are going to celebrate this moment. In the Creole language we say, It means that you have not even sweeten it, it's already sweet. And so today the signing ceremony is not just a symbolic thing but rather it is to put the St. Jude Hospital reconstruction project in overdrive. St. Lucia's sports fans, athletics and football fraternities will be pleased to know that the funding from the Saudi Government will also be used to rehabilitate the George Audlem National Stadium having successfully restarted construction on the original construction site in November 2022 and secured the funding to complete the remaining construction phases. Prime Minister Pierre has finally ensured the transfer of St. Jude Hospital operations from the George Audlem National Stadium to its original home is imminent. We cannot remain in the stadium for much longer and this government headed by Hon. Philip J. Pierre is determined to look for all collaborations and to hold hands with all men and women of goodwill from all countries and I'm so thankful that your country has stepped forth and your organization has stepped forth to say yes, we are going to be part of humanity and we are going to assist you to develop your hospital. Hon. Philip J. Pierre is now the fourth Prime Minister to oversee the morbidly delayed St. Jude Hospital reconstruction project. Various government audits and technical reviews on the reconstruction project have unanimously concluded continuing construction on the Phase 1 construction site which was stopped for three years from 2016 to 2019 was the most fiscally prudent option to pursue. Furthermore, part of the original construction site could have been completed from as early as 2018 which could have facilitated the earliest transfer of St. Jude Hospital operations from the George Audlem National Stadium to the East Medical Wing of the original construction site. Office over the Prime Minister.