Well, that was a chore, wasn't it? Now you can have some idea of what I'm talking about, so that's good. Welcome. Thank you all for coming. I'm Ian Smith, and this is my presentation about how to identify guest authors for your blog. I am the co-founder of Fedsmith.com. Sorry, I just realized I've got something missing here. And I've been running that company since 2002. It's an online news service for the federal workforce. And I do currently have, at any given time, about 20 authors that write for my site, including myself. And I've been using WordPress since 2012. And my site is very niche content, and that will be relevant later in the presentation. I'll come back to that point. But also to give you an idea of a rough overview of the traffic I have on my site, I've got three free email lists that people can sign up for to follow content that we post. My main list has about 128,000 subscribers on it currently, and I get roughly 400 unique visitors per month to the site. So as I said, I'm talking about guest posts. And so why would you even want to do guest posts? And let me ask you all, how many of you currently have a blog that you run? That's cool. Can you expound on that? Do the words have asked made anything to you? It counts, I guess. And I assume if you don't, you're maybe thinking about it or planning on launching one. Okay, cool. Just curious for where everybody stands. But here's some reasons why you might want to do it. It's a great way to expand your content, and also you can potentially get new regular authors for your site. You may not think you have anything to offer people who would aspire to write for your site, but you do. You're reaching an audience that they potentially are not reaching. Like in my case, I cater to the federal workforce. There are people out there who want to reach that audience. Maybe they have a business where they provide training to that group, or maybe they've written a book that pertains to it. So regardless of what you're writing about, you are reaching people that potential authors are on it. So you do have something to offer, and it's just important to keep that in mind. And so that's why, you know, why would anyone want to write for you for free? Well, it helps the potential authors build their businesses as well. Because again, maybe somebody as a consulting firm is looking for new clients, and a great way to publicize that business is to write articles. I'm not talking about just a blade and ad for the business, nobody wants to read that, but something that's relevant to your audience. And then at the end, you have a bio or a byline or something about the author. And by the way, here's a link to my book, my website, that kind of thing. It really does work in that sense. And it's a great way to grow your traffic. Obviously, the more content you're posting, the more potential readers you're going to have on your site. By the way, I'm a big college basketball fan, so you'll notice a theme in some of the pictures on my slides. So bear with me. But I stumbled onto guest posting early on. As I mentioned, I didn't even start using WordPress until 2012. I launched the site, it didn't exist. Guest posting was certainly not a formalized trend by any means. And I stumbled onto it because, again, I found there are people who wanted to reach the audience I was reaching. They had a message. I needed the content. They needed business to sell their books, promote their business, whatever they were doing. And it's become a real trend in the blog realm, I found. And I believe that because I get more emails in a week than I can count from people who are offering to write from my site. That's what I'm going to talk about next. But, again, it does work because it's a bartering system. Because, again, you do have something to offer even if you don't think you do. And there are people out there who want to tap into that. But there are problems. And as I said, I get more emails in a week than I can count from people wanting to write for me. And they all have a very familiar ring to them. They frequently will contain or start off with something a lot like this. And sometimes I think that there is some kind of template out there in an Amazon S3 bucket or something that people copy and paste into an email and send out for, here's how you get to write for other sites. And as a site owner, it's off-putting. I mean, if I find irony in getting an email from somebody who wants to write for me and inside of the email, he hasn't even bothered to proof it for typos, grammatical mistakes, things like that, and yet he wants to write for me. I don't get it. Does anyone remember? I think I noticed it back in the late 90s. I was getting emails from somebody who claimed to be a prince in Nigeria who had this windfall. And I felt so lucky because, wow, he had $25 million, he didn't know what to do with. And all I needed to do was give him my bank account number and I would get all this money. So now, to be fair, I'm not trying to equate these spammy type emails I get from would-be authors to stealing money. It's not on the same level, but it just, I put the slide in there because it just kind of had the same, it made me think of it, it's kind of a spam meme out there on the internet, if you will. Warning signs that you'll find when you get these emails, as I mentioned the typos, broken English, it comes across as, again, somebody who's wanting to write but can't form a complete sentence, off-putting as a content editor to get an email like that, to say the least. The familiarity of it, I showed you some snippets of the emails I'm getting and later in the presentation I'm going to show you some actual emails I've gotten. It usually starts off the same way, it'll say something like, I'm an avid reader of your blog and I think it's so great what you're doing and I read it all the time and I'd like to offer you a 100% completely unique article and I was wondering if you accept guest posts and I'm thinking, well, if you've read my site, yeah, I have an entire page dedicated to guest posts so that it outlines the process. So again, a very familiar pitch and then no identifying credentials. One thing I find frustrating is I'll get these emails and a lot of times it won't even, not even suggest a topic. I'd like to write for your site, I'd like to send you 100% completely unique article. Okay, what's the article? Why didn't you attach it to the email? Why didn't you give me a link to go read something comparable on another site? It's something, some of them do that. But usually I find that the articles, if they're even offered, whether it's a potential topic or an actual article, have nothing to do with my site and when I told you I produce very niche content, I'm catering to a very specific audience and so if you've got an article about how to make more money babysitting or foosball or something like that, that's great but if you've read my site for more than about a minute, you're going to realize it's not going to fly with my users and that's the kind of stuff I run across with this. So the person's clearly not read my site. The article's likely to be very general in nature. Some of the articles that I have gotten, they're like one, it was actually relevant to a topic that would pertain to my audience but I did simply Google searching. It took me about 30 seconds to figure out how he'd written the article. He'd gone out to a government jobs website and pulled pieces off of it and put it in the article. There's nothing wrong with that but, again, my audience, usually it requires to write for me, it requires a very in-depth expertise on a subject and so if all the person's done has gone out and grabbed some paragraphs off of a federal agency's website or something, it's not going to, it kind of dilutes my content. It's not something I would want to post. These people are often relentless. What I mean there is, I've gotten to where I ignore most of these requests for a lot of the reasons I've mentioned because, again, there's a lot of typos in it or there's a pitch but there aren't even suggested topics or something so I just kind of look at it as you're wasting my time, essentially. But if I ever have gotten one that's intriguing, again, I usually get an article that's very general that's not going to help me a lot and then if I do respond and say, hey thanks, I appreciate taking the time for sending it but I'm not going to post it. It leads to this almost endless back and forth where the people just will not let go. I interacted with a lady a couple months or so ago and she wrote back and said, what do I need to change to have you post the article? And I'd already given her a very in-depth explanation in front of, first of all, the kind of content I'm looking for, the kind of expertise I like to see. She ignored all of that and sent me a very general article anyway. It was well written but just didn't pertain to my audience and I had heard from her two or three more times and I was thinking, I'm sorry but I don't have time to write this article for you. And also watch for copyright violations. I would not have even mentioned this until about a month ago. I was sitting at lunch one day, I got an email, I have a forum on my site where people can submit articles to me and I'm going to cover that in a moment. And I read the news all day long scouring for content and the article sounded very familiar to me and it came from somebody who at least claimed to run a healthcare blog site or something. He had copied and pasted an article from another news source, verbatim into an article, put his name on it and it was done so hastily, lazily. He'd even left in the middle of the article a little tagline about signing up for the other company's email list. And I wrote him back and I was very direct. I said, this appears to have been copied verbatim from another site. I provided the link to it and I said, it appears to be a violation of this other company's copyright therefore will not be considered for publication. And he wrote me back and he said, well that's odd because I wrote it myself. I'm going to have to look into that and I'm thinking, yeah, and I'm going to ask you if I could look into that. So anyway, if I hadn't recognized it from having not already read it, you could probably find something like that with just a quick Google search. It's just something to be aware of. So does all of this mean that you would never ever get anything good out of this? No, absolutely not. That's not what I'm saying. These are some things to look for for potentially valid authors. You'll get a lot less of a canned email. Again, if you've read five or six of these things, you've read most of them. They also are very similar. If the person actually provides credentials, whether it's a bio, a website that you can actually go look at, maybe it's just an email address but with the domain attached to the email address, you can go look at the person's site. And you see, oh yeah, this person is retired from the federal HR sector. This would be good for me. So I can see things like that. Maybe the person has articles on his or her website or actually sends you an article. These are good things. And these are some tips for how you can get better authors in that same vein. I mentioned very briefly, I have a page on my site for recruiting guest authors. I actually really like to have people write for the site. As I said, I have about 20 currently and do it any time. And some things you can put on there to help guide the submission of content. Include your terms and conditions. What do you have to have from somebody to post his articles? For me, that's going to be certain required fields. I need a name, I need a bio. Do you want me to include your email or not with the article so people can contact you? Some people want that, some don't. This lets you also ignore the illegitimate request. Like I said, if I get an email that starts off with, I read your site all the time and it's so great and I'd love to write for you. Or do you accept guest posts? Well, immediately I know you don't read my site all the time because if you did, you'd see, yes, I do accept guest posts. And here's how you can send them to me. So, and as part of the terms and conditions, you can put things in there too, like we put something in there. By submitting this form, you're agreeing to these terms and conditions. You agree that you won't get paid for the article? That we have the right to edit it? Things like that, you own the copyright, that sort of thing. And this is actually, these are screenshots of said form. I put on here, these are some benefits of writing. And in fact, one thing I've done that I have found has helped me a lot too, is I mentioned that there are some benefits if you start writing for me regularly. You get a lot of one-off authors who might just send one or two articles and then I don't hear from them again. But I do have people who have been writing for me for years. And one benefit I'll offer them, I will include the person's picture and set up a bio page on the site. And what I'm doing essentially, I'm actually going inside a WordPress and adding them as a user. Whereas if it's just a one or two thing, I don't set up a separate user to post their articles. And so that will have the person then show up on an author's page I have on my site and it lists all the current authors. And people like that. In fact, I took it a step further and I've written an algorithm so that people who write more frequently show up higher on the list. If they haven't written in a long time, they don't show up at all. And it actually created a little bit of competition. One guy really focused in on that and he would try to send in more articles that his name would get bumped up higher on the list. So anyway, just a little carriage you could dangle like that. And then this is the form itself. You can see those are the fields I'm looking for, short bio. Sometimes people will send a, here's my bio and it's like five pages long. Well, that's too long. So in a form like this you can force it to be no longer than a certain length and that helped me a lot too. And I also have a canned response for dealing with these things. It's helped me a lot. It's just a very short and sweet email I send. If somebody sends me an article to be considered for publication, a lot of times it's completely irrelevant to my audience. Not a bad article, just not relevant. And so this is a, again, by having this form they're kind of automating the process. And so I just send a very polite but direct response like this and say thank you very much for sharing it, but it's not got direct relevance to my users. And then again, you can ignore, when you have a form and a process like this you can just ignore the spammy requests. And one thing I didn't mention, part of why I consider them to be spam is sometimes I'll get emails that go to the public address of one of my email lists. And I have it set up so it doesn't go out to the whole list. Fortunately, all 130,000 people. But I see them. And that's kind of how I know like, okay, somebody's going out there and scraping the address or whatever. I'm not sure this will be a good article. So what about copyrights? Offending the attorney in the audience. But this is a guidance from my counsel so that's a good thing I guess since I'm not a lawyer, but that disclaimer on it. What we do is we require the author to own the copyrights. That's worked out very well and also that's one of the terms and conditions in my guest form. I get questions from the authors, particularly the ones who write for me regularly about can I post this article on another site? And my response is sure, you own the copyright so ultimately you can do whatever you'd like to do with it. I do usually ask in that case, would you maybe add a line at the end or something that says this was originally posted on Fedsmit.com with a link to it, something like that. Also, we get requests from our users periodically wanting to reproduce the article. Again, we defer those to the author. For me personally, I do that on a case by case basis. If I had one guy who he regularly goes around to news sites, most of them are my competitors and it includes mine, and he will copy and paste the articles into an email and then he then sends the email out to a bunch of people in his agency. And I told him no, I didn't want him to do that for a couple of reasons. One, it's an email and so I'm thinking, it's an email, you can put a link in there, people can click on it and go to the site. The other problem too is I found it kind of diluted the content a little bit because he wasn't including images in there. A lot of times it's just a stock image or something with the post so it's not a big deal but sometimes I might put a chart or something in the article and it's very relevant to the content and if that's missing it can confuse people.  And I usually grant that and again with the stipulation it's being reproduced with written permission from the author and then a little teaser from my site to get people to come in, to come back, sign up for my email list, whatever. But that's how we handle the copyrights and they work very well. This is a quick tip I just wanted to give everyone a quick technical tip. I mentioned I have a lot of just one authors who write one or two articles and then don't hear from them again. You can obviously never predict that but if I'm assuming up front that may be the case I found this very helpful. WPBeginner has this article with this address and it's how to add a guest author custom field to your theme. You just use a custom field inside of the WordPress editor called guest author, whatever you choose to call it. You put the person's name in there and then it explains how inside of your theme you can then capture that and have it display so it seamlessly integrates with your overall website. Before I did this the author name would show up as my company name is how I had it set up and I had to manually put the person's name in the body of the article and it just didn't integrate as well. And also the author's name didn't show up inside the WordPress editor when you're browsing your posts. It had my company name or something. And now it takes whatever you put in this field and actually puts it in there and it just makes it easier to manage. So I've explained about how people coming to you things to look for. What if you want to go out and approach other companies that you'd like to write for? Could you ever do that? Absolutely. I've done it. I'd recommend it. It's a good way to get your name out there as well. These are some things as a business owner and a content editor what I would want to hear if the shoe was on the other foot. So you'd obviously want to explain up front introduce yourself, your website, what you do. Basically explain why you think you'd be a good fit for writing for that site. And you'd want to talk certainly about your content what you would plan to write about but above all avoid saying we're making it sound like here's what you can do for me. I've had people approach me in business deals before and their entire approach was here's what you can do for me. I'm thinking that's great but why would I do that? I don't get anything out of this. There was a guy we were trying to work out an advertising agreement or something with him and his whole approach was here's how you got you know I've got this conference and you guys can promote it and it'll be so great you can put an ad here I'm thinking yeah I guess that would be great for you but I don't see what I would get out of this. So anyway, just a lot of business decisions can be settled by as simple as just switch shoes with the person. And if you're pitching yourself as an author like I said oh and I sorry I screwed up a little bit this I jumped ahead I'm sorry this is if you're approaching authors so if you find an author out there who's writing he's got a blog he's you know writing for other sites whatever this is how I would approach a person like that because he may not know you're out there and you can see he's already writing for other sites so sorry I jumped ahead this slide is going the other way around if you want to pitch yourself these are some suggestions I would have again for having been on the other side of it try to avoid all the canned emails and tailor your approach to the site or the company that you're pitching so don't say you have a great blog and I read it all the time and it's so awesome trying to be a little more concise talk specifically about again what can you do as a writer for that company show that you've read the site that's huge again I can't tell you how frustrating it is when I get these emails and the people clearly have not read the site and yet they want to write for me and so it's just not going to work but again I won't even consider it so I've gotten to that point for all the reasons I just mentioned but providing relevant sample articles that's very good that's something I like to see is come as close as you can certainly I mean if you've obviously been ever written for the site maybe you don't have something that's exactly a fit for their content but if you're wanting to write for them there's probably a reason so there's probably a good match in your mind as to why you'd be a good writer for them so my last thing before I come to the end here these are some actual emails I have received from people who would like to write for my site so yeah this one I don't know what the site was it's probably great foosball sure that's cool interesting but I write about the Thrift Savings Plan and CSRS in first and you know how to determine your annuity supplement I don't think foosball's going to fly so anyway totally free to you Ian totally free for you I like overflows with information if you're not anywhere else Dave most of them say this it's a very hackneyed message to be sure so this one probably kind of self-explanatory you might notice some typos in it I realize most of you all haven't looked at my website but suffice it to say that I don't teach people how to be a better weatherman I like how to perfectly edit you blog content so this one's got the same kind of generic approach I talked about I'm an avid reader of your blog I love what you're doing it's so awesome I've got this great idea for an article only he didn't tell me what it was a few dollars for every blog he mentioned you have six bucks at least he did acknowledge I do cater to a specific niche that's right to the point one thing I did not cover is I know that part of this trend is paying for posts whether you hire somebody to write for you or go in the other direction you pay to have your article posted I've personally never done that I can't really speak to it I've talked to people who have used it successfully though my hunch is that's a pitch for something like that if I didn't even respond to something like this I would just say we don't offer anything like that sorry anyone has any questions just a quick comment I wonder if you guys have a really massive inbound link profile because I imagine most e-mails are people looking for search engine boost back links that's the case so just that's what you might do that would be my hunch and I might not have said that until Friday when I was at the happy hour for word cam the pre thing I was talking to somebody and I can't remember who forgive me if it triggers a bit he was saying that as his traffic has gone up he's running into the same thing and so I can see that if you have any links from .gov domains there's kind of an SEO community usually gold if you get a legitimate one so if you're getting a lot of links from them just kind of spill it over and we do there are people who link to us we get passed out on social media a lot sometimes I'll have a post that's popular that'll on Facebook at least according to Facebook it'll be read 10, 20,000 times sharing that much I'm getting guest writing if someone writes you a legitimate e-mail and involves a phone call do you appreciate that to annoy you? well my feeling would probably be shocking off how'd you get my number truthfully I work for the CIA so that's not a problem but other than that and the only reason I say that is is because I don't have a business phone or anything posted out there if somebody did it probably because I handed out my card so that would be fine but yeah I think that's good, that's a good approach because it's more serious and actually I did have I approached an author he has his own blog he writes in the same space I do and he was writing for some competitors as well and I approached him and he wanted to have a phone call beforehand just I'm sure to get to know me and learn more about my company and what I plan to do with his articles and it's led to a steady of likes writing for so I think it's helped him get more traffic to his yes do you have a process for how often do you host a guest writer do you have like weekly, monthly or just as the opportunity arises really just as the opportunity arises the way I prioritize articles to content management flow is if something's more timely I'm gonna post it a lot sooner for example I've got a lady who's started writing for me she just sent me her third or fourth article and actually she writes about travel like great places to go on a cruise that sounds like it's something I would not want to post but she runs a site with her husband that it seeks out discounts for federal employees for cruises and so that's the tie in and she's just sent me one that's about upcoming summer discounts and it's got a kind of a limited time window and so I'm gonna post that sooner than I would something that's more general so that's how I take the approach on that yes sir how labor intensive is this do you have an idea of providing opportunities to students high school students to practice writing for like my site is to meet some college students but I want to get an idea of how much labor is given them the opportunity to build on that skill but how much work do you put in to work on this week it's not bad like as far as setting up the form goes I use contact form 7 I guess is the plugin I use but there's a myriad of them out there there's ninja forms there's another one I used to use I use ninja yeah there was a there's another one it's escaped gravity yeah that was it but so that part's not bad then truthfully it pretty much just comes down to how many of these are you gonna get right I don't get through my form I don't get a ton of them most of the articles I'm getting are from the established authors and once that relationship is established generally they're just emailing me directly it ebbs and flows though that's an advantage and a disadvantage an advantage is I'm not paying them as I said it's a bartering system and it works well for both of us the disadvantage is it does ebb and flow somebody might write for me for months or years and then I don't hear from them again so since I'm not paying there's not an expectation of hey I'm paying you so you need to send me one a month or whatever so do you put a limit on your power I don't put a hard limit on it people will ask and I usually say around a thousand is good but it's not a hard limit if somebody sends me a really long article it could be triple that if it's really good I don't mind posting it now I am gonna edit it and make sure it's got section headers to break it up if it sometimes though I mean one lady emailed me and said I'm working on an article but it's gonna be about 5,000 words I think and I said well let's break that up into maybe several articles and she told me what it was about too and it should have been because it was they fell under the same category but they were fairly broad it would work better but I think as long as it's good content I don't put a hard limit on it sure so they don't send you an image do you find an image to attach to it yes in fact I prefer that because again coming back to the copyright stuff I don't know where the image came from and so if I go get it myself from my stock or whatever then I know I'm safe but by requiring the author to own the copyright we felt that also takes some of the liability off of us as well if somebody does violate a copyright or plagiarize or something we can say well the author agreed when he sent it to us that he was adhering to copyrights and he owns it and so we can might not keep us completely out of hot water but we can push a lot of it back so yes do you have an example of a guest author really benefitting from having posted on your site yes and that's an outstanding question I had a lady tell me that she was just starting her business that caters to federal workers and she does like motivational type stuff I think of how to climb the leadership ladder and what not enjoy your job more she said that writing for me had her email list go from zero to a thousand in a month or something and she was just starting out I had another lady tell me that she worked for the postal service but she was also running some businesses on the side that she started like writing ebooks and doing motivational things speaking whatever career stuff she told me she got some public speaking invitations that she would not have gotten had she not been writing for us because we were reaching people part of the ebb and flow of getting the articles and not I was talking about some of that is my fault in the sense that some of our authors have their own consulting firms where they do training for federal workers on the side and when they write an article or series of articles they might put a little plug at the end of hey I've got this conference coming up we're thinking about doing a conference whatever it is and then they get very busy and can write for a while because they get an influx of work from the publicity yeah so yeah anything else well thank you all the keynotes are going to start at 1130 down in the auditorium


Hello, everyone. We will be getting started with the live Q&A webinar shortly. We are going to wait just a minute or two to help ensure that everybody who has registered gets a chance to join the meeting, and then we will start taking questions. In the meantime, feel free to open up the chat tool on your Zoom toolbar. Let us know where you're joining from and what kind of work you oversee. It's always nice to get to know you a bit better in these sessions. My name is Cara, and I am joined by my team member, Tiffany. We work on the onboarding team at When I Work, and our goal is to help get new users up and running with When I Work scheduling and attendance tools. Myself and Tiffany have both been with When I Work for a while now, and we have seen accounts for a wide variety of workplaces and industries from all over the world. So no matter what your workplace needs, I am sure our team has seen it something very similar, and that we can help get you set up for success. Thanks for chatting in Kendra from Ohio. Kendra's running a crumble store. Awesome. We have a lot of crumble stores already in our system. So welcome. Great to have you with us. Jeff is from College Hunts, Moving Junk in Fort Worth, Texas. We also have a lot of those workplaces using When I Work as well. Fantastic. Thanks, everybody. I want to be sure we get to as much as possible during this time. So let's get going for anybody who has just joined. Welcome to our live Q&A session. We are excited to help you get started with When I Work today. In the next about 30 minutes, we will be answering your questions about When I Work scheduling and attendance tools. We're going to show you some ways that you can save time creating the schedule, managing time sheets, and communicating with your team. We'll get to as many questions as we can during this time, but if for some reason your question does not get answered or you think up another question afterwards, or would like some further help, you can always chat with us after. We'll provide some more information at the end of the session on how you can get in contact with us. So stick around for that. So this session is centered around your questions. To ask us a question, click that Q&A button on your bottom zoom toolbar and type out your question. Tiffany will be going through and asking some of those questions out loud so we can demonstrate in our When I Work account. Also, depending on where we are in the session, she may also rearrange some of the questions that come in or type them out, type out some answers for you, but we will be sure to get to as many questions as we can during this time. So with that, I am going to switch over to my When I Work account and give a quick overview of navigating the web app. So right now I am logged in as the main admin on the account. The admin level user has the ability to manage everything that is within the account. So managing the scheduler, managing attendance, managing the settings, being able to configure all of the employees and other workplace items, and also having access to the account and billing page where the plan can be selected for the account. As you log in, you will be directed to the dashboard. This is a great snapshot of what you have going on in your workplace for the day, including today's schedule, an overview of who is scheduled, clocked in, if you have any employees with time off. You can also jump to these different areas of the account right from the dashboard. We also have the attendance notices section. If any employees have clocked in or out early for their scheduled shift or were in no show for their scheduled shift, they would be listed right here and you can address those notices right from the dashboard. We also have a few graphs to help you out. Breakdown of assigned shifts. You can see this broken down by position or if you use job sites by job sites. Worked labor costs for the last seven days so you can see which positions and job sites, what percentage of your labor costs they make up. And your pay period forecast, which compares those scheduled hours from the scheduler to the worked hours on the time sheet so you can always make sure that you are on budget throughout your pay period. Moving over, we have the scheduler. This is where shifts are added and you can publish them out to your employees to notify them of their schedule. Our next section here is the attendance section. So this has everything to do with those worked hours. You will see some options for clocking in and out depending on what's enabled in your account. We also offer the time tracker section, which is a super useful tool for seeing who's currently clocked in for the day, whose shifts are still in progress, and you can hover to compare that to the shift on the scheduler. We also have the time sheet section. This is where you're going to spend the most time in the attendance area, managing those clock in and out times for employees and closing out your pay period so you can generate reports. Next over, we have the work chat section. This section is an in-app messaging system with all of your employees. There are a few different ways that you can set this up. If you want this to just be an all workplace announcement channel, you can or if you want to allow employees to be able to start conversations and chat amongst themselves. You can certainly do that as well. This is a super useful tool for keeping all of your communications right within the same place that you're doing scheduling in attendance. This can help reduce those random text messages or post-it notes on your desk and keeping all of your communications with your employees really streamlined. Next over, we have the request menu. This is where you can add time off requests, view and process those time off requests. We also have a section for processing shift requests which are going to be those shift coverage options we offer like swapping and dropping shifts and open shift requests, which is part of our shift bidding feature. Next over is the workplace menu. This is where you have the building blocks of your account. Those workplace items like your list of employees, positions, schedules and job sites to manage locations. If you have any pre-made shift templates, you can easily apply shifts to the scheduler. A report section, task list that you can set up to assign to days on the schedule or certain employee shifts, and a document storage section for sharing any needed PDFs with your team. Next over is our settings menu under this gear icon. You'll have all of your settings from general scheduling attendance. This is also where you will set up any integrations like those payroll integrations that we offer. And as the admin, you can also jump to the account and billing page to manage your plan and billing. Lastly, we have the profile menu. This is where you have those personal settings for your profile where you can update your contact information, do your personal schedule, your personal availability and manage your notifications that you're receiving. So with that, let's get started with some questions. Awesome. Our first question is how can I input availability for my employees? Great question. So availability is one of the features that is super helpful for giving your employees the flexibility and responsibility for managing their own shifts and schedules. This makes it super easy for both employee and employer to get employees into the shifts that they want to work. So to add availability for yourself or another employee on the account, you can hover over the workplace menu and select employees. From there, you will press the circle check mark icon to jump to that employees availability calendar. And employees can also add availability preferences through the mobile app so they can do this on the go as well. You can add a preference to any future date. So as you add a preference, you will have the ability to mark that as unavailable to work or prefer to work. You can set certain times or have that preference fee all day. And you can even set that up to repeat up to a year out. So let's head back to the scheduler so I can show you what those look like. So on the scheduler, you will see these availability preferences to help guide your scheduling. If somebody has blocked off a full day is unavailable, you will see that as a block on the scheduler. If they have only blocked off certain times as unavailable, you will see this gray flag, and you can hover over that to see exactly what times they input as unavailable. Very similar for availability preferences when they prefer to work, you can just hover over that green triangle and see at the times that are preferred to work. The really great thing about availability preferences as as you are scheduling for employees, any shifts that fall in that unavailable preferences will be great out so this can help guide your scheduling. You can select one of the shift templates that aligns with their preferences. But since this is just a preference you can still select shifts that interfere with their own available preferences. If an employee wants some guarantee that time off they would want to use our time off feature instead which will give them time off or a certain time range or time off all day preferences are just a loose way to help guide the scheduling. Our next question is how do I create a shift template. Great question so there are two ways that you can create a shift template for a bit of background shift templates are these pre made shifts that you see as you schedule on the scheduler. And you can click them to quickly apply them to the scheduler this can help save you a lot of time if you have shifts that you use over and over. So to create a shift template, you can do that directly from the scheduler by pressing an open cell, pressing create custom shift, adding in all of those details so the time the position a job site is needed. And then you can check this save as template checkbox, and that will automatically save that shift and its details as a template that you can use later. We have one more way you can create shift templates, and that's by hovering over the workplace icon and heading to the shift templates page. So from here you can add a new shift template or if you have an existing template that you want to delete or edit that can be done from this page as well. Awesome. Our next question is, can I track tasks during the day for my employees. Great question. Absolutely. I am going to hop over to our task list area here under the workplace icon so I can show you how to set up those different tasks lists. So we offer two different types of tasks lists in the system, the first of those being team tasks team tasks are assigned to a certain day on the scheduler, and anybody who is working a shift that day can complete those tasks. If you want tasks that are assigned to a specific employee that you would like them to accomplish during their shift, you can use shift tasks instead. So when you're assigning team tasks, you will set up your task list with the tasks that you want employees to complete. And then you can set this up to repeat on certain days through the week. For a shift task, you can go directly to the scheduler, open up a shift and select the task list from there. So let's select this one and save that shift. Then as the administrator I can click on this clipboard icon for the date to monitor the tasks that are being completed. You will see your list and the percent completed it is. If you click into this list, you will also see which ones have been checked off and who checked them off and what time that task was completed. So this gives you a really great view into what still needs to be done for the day. There's also that shift tasks section. So if an employee is assigned a shift task list, you can do the same and see what has been checked off so far and the percentage that it is done. One thing to note is that employees will check off the tasks from their mobile app. So we offer both a app for Android and iOS devices and employees will just see a flag on their dashboard when they log into their profile. That says this many tasks are yet to be completed for the day. They can click into that and check off their tasks. Wonderful. Our next question comes from Victor and his question is do separate sites only have access to their location and I think it's a great time to go over schedules and job sites and how schedules completely separate your employees on the scheduler page. Sure. This is a wonderful question. So we have two different ways that you can manage your different locations within when I work. The first of those is schedules. So you can set up schedules by hovering over the workplace menu again and hopping into schedules. So here you can add your schedule and the address schedules are a great way to manage if your employees are working out of different departments or different regions and you would like everyone to have their own schedule that they are assigned to without having access to all the schedules on the account. So I have a separate account here that is set up with multiple schedules. So let's hop into that so we can get a better view of what using multiple schedules will look like. So I hop over to the scheduler. I have a few different schedules on this account for my coffee shop each location has its own schedule. So I can flip between the different schedules and see which employees are assigned to that scheduling grid. What's great about this is if you have employees that go between locations, you'll see like Ari here he is scheduled on the Northeast schedule that will show up in the background in gray so you don't double book employees. And you will see from the employees page here that employees are only tagged to the schedules that they can work. So for example, Graham will only see his schedule for south side, he won't be able to see any of the other schedules so it's great way to narrow things down or if you have certain advisors that work in certain schedules, a great way to help manage those different departments, regions, front of house, back of house, all of that. So I'm going to switch back over to the first account I was in. So we can go over job sites. So job sites again you can set up under this handy workplace menu by clicking in a job sites. Here, this is where you have the option to add a particular location to a shift. So instead of tagging an employee to a certain scheduling grid job sites are optional and can be attached to shift. So let me show you what that looks like on the scheduler. If you are scheduling out shifts, you can see in the details there is a job site menu where you can pick the location of that shift, and the employee will know that hey, I have to go to Nicolette mall today for my shift, and that is where I'm going to clock in and out. And the great thing about job sites that is really helpful to a lot of accounts that want to have all of their employees on one scheduling grid is our different options for viewing and filtering the schedule. So let's say you want to have everything in one view but you also want to narrow down so you can see those different job sites. So one of the tools would be viewing shift colors by job site. This will highlight all of the shifts that are at a particular job site so I have a nice easy view of where employees are going for the day. And we also have a job sites filter which will filter out all of the job sites that are not what you selected. So, for example, if I just want to see who is scheduled at Mears Park, I can click that, and I will only see the employees who are scheduled for that Mears Park job site in my view. And that option is super awesome. So handy gives you a great overview of each location when you're using job sites. Our next question is, how do I copy a shift. So it sounds like we're on to our awesome shortcuts. Awesome. All right, so as you are creating shifts on the schedule, you may want to copy a shift exactly how it is and sign it to another employee. What you do is hold down the control key on your computer command if you are on a Mac, and you can click the shift and that will make copy that you can then drag and drop into any cell on the scheduler. So thumbs up and thumbs down icons are going to help guide you. So, for example, that thumbs up is going to appear when my employee is assigned to the team lead position. And it will show a thumbs down icon when I try to assign it to somebody who is not a team lead. So this is a great way to help guide your scheduling. A few of the other options we offer for copying and speeding up scheduling are our copy previous week or day option. And this can be done if you head to the next week out on the scheduler. Let's say I want exactly the same schedule as I had last week. I can simply click this wrench icon, select copy previous week. If there's any conflicts already scheduled shifts on the schedule that might overlap, I can choose what I want to do with that. Since I don't have any, I'll just do allow. And then that copies right over into the current week on the scheduler. And then you can publish that out to your employees. So they are notified of their shifts. Another great way to copy schedules is our schedule template option. So instead of just copying to the week directly after, you can basically take a snapshot of your scheduler as it is and apply it to any week in the past or future. So to do this, you will build out your schedule exactly how you want it saved. Press the wrench icon up here and select save as new template. There you can name it and add a description, decide if you want to include any repeating shifts in that. And then when we head to a different week on the scheduler, we will click that wrench again and select load template. There you can select your template and just like that, you can apply those shifts to the scheduler. So that's a great way to speed up scheduling. If you have a similar schedule week to week. I've also seen this work really well with workplaces that have schedule rotations. So you could create a new template for week one week to week three and then just apply those in order. Another way I have seen schedule rotations or schedules that repeat manage is through our repeating shifts option. So as you are creating a shift on the scheduler, you will see this repeat shift option on the bottom. You can check that to open up the repeating options. You can repeat the shift every week to every six weeks out to a year in advance. So that's a great way to also manage those rotating schedules if you have them. Awesome. Our next question comes from Crystal. Can we track PTO and vacation time through the app? Absolutely. Let me show you how that is done. So underneath our request section or tray icon here, you will see the option to request time off. So employees will see something very similar on their end when they are logged in on a computer. They can also submit time off requests from the mobile apps as well.  So by default, we do have holiday personal and sick that which can be paid or unpaid. So you can enter that in, press send request and since I am the admin, that is automatically approved and added to the scheduler for the day. I am going to hop over to my general setting so I can show you some of the customization options we offer with time off requests. The first big one that I know people ask about all the time is can I review those time off requests before approving them for my employees? Absolutely. We have two settings for this require approval for employees require approval for supervisors. So I have both of these checked meaning that both users at the employee and supervisor level. Once they submit that time off request is going to be routed to me as a manager, and I can either allow or deny that request. We also have days noticed required for time off max paid hours per day. And then we also have the options to toggle on and off the different types of time off that you would like to offer. So if you don't offer a paid holiday, then you can just uncheck that, press save, confirm. And that won't show up as an option for employees to request off. One of my favorite things about the time off request section is that we have made it super customizable to fit the needs of your workplace. Great. Our next question is how can my employees clock in. Alright, I love talking about our time clock and attendance add on to our scheduling product. It works seamlessly with scheduling to track those worked hours of employees. So I'm going to hop into the attendance settings to help illustrate the different options that we offer. The first of which is probably our most popular because it really gives employees the time clock in their hand it gives them the flexibility to clock in and out and take control of their time sheets. And that is our clock in with mobile app option. When that is turned on employees can download the when I work up for iOS or Android, and they will have a clock in clock out take lunch button on their dashboard that they can use to record their work times. You can also enable a location restriction for clock in clock out or both. This just means that the employee needs to be near that address entered in their schedule or job site for the day in order to clock in. So this completely puts you at ease you don't have to worry about employees, you know, clocking in and out from the bus or from the parking lot, you can set it to where your employees need to be for clocking in and out. Our next option is the personal computer option. This is really great if you maybe work at an office and employees are all at their desk with their own computers, employees can open up a browser login to their when I work profile. And simply hover over the attendance menu and select clock in. You can also restrict the location to an IP address. So you can ensure that employees are clocking in from the right place IP addresses are going to be added to your schedules. So this is the IP address section. And if you are sitting at the place where you want your employees to clock in, you can just press this I'm at this location button, and that will automatically fill in your IP address. So it's very easy to set up and get started with those computer clocking. The last option that we offer that's always on because it's set up by a manager admin is the time clock terminal option. So a time clock terminal is the clocking option that we offer that's most like a traditional time clock in that employees will clock in and out at this central location. It can be set up on a computer by pressing lock as time clock, or else we also have time clock specific apps for iOS and Android that will let you set up that device as a time clock terminal. So when you set that up, it's going to look just like this it's going to have the current time, the name of the schedule, and employees can then enter their email address that's in their profile, or the employee ID set in their advanced details to clock in and out. Our attendance options are so great personally mobiles my favorite it just really is right there in your hand. It's so awesome. Our next question comes from Amber question is how can employees find substitutes for ships they are wanting covered and how does that work for the system and how does approval work. Awesome question. All right, let's pop into those scheduling settings so you can go over our shift coverage options. We have a few different shift coverage options that can help you manage the finding replacements for shifts. You can toggle them on or off depending on which ones you want to offer to employees, but we'll go over all of them right now so releasing shift this means that an employee is assigned to shift, and they can drop that open shift, drop that shift into the next row of the scheduler. So any eligible co worker can pick up that shift dropping the original assigned employee is able to drop that shift. And it notifies directly other employees saying hey, can you cover the shift, and one of the co workers can pick up that shift and that shift is automatically transferred to their schedule. So swapping is a one for one swap of a shift for shift with a co worker only shifts that the employees are eligible to work are allowed to be swapped. So you don't have to worry about somebody who is not able to work a certain position or role, switching shifts with somebody. And then we have the require manager manager approval for swaps and drops. This makes it so if an employee starts and initiates a drop request. First it's going to go to a management level user that the management level user can then approve or deny before it gets sent over to the co workers to drop. So many great questions today, and that's all the time we have. Awesome that time flew by thanks everybody for questions. We are just going to go over a few more things on plans and how to get in contact with us. So as far as plans, we wanted to make it as easy as possible by offering two main plans, our small business plan, and our enterprise plan. So our small business scheduling plan includes all of the scheduling scheduling features that we went over today. So access to the scheduler team member availability, communication tools, the shift coverage options, notifications. You can set up as many schedules and job sites as you like. And then we also have some of those more advanced features like auto scheduling task management and shift bidding all included in the scheduling portion of the plan. So this small business plan is usually a good fit for workplaces with less than 100 employees. If your workplace exceeds 100 employees, we do also offer an enterprise level plan. And this just has some features that are specifically designed to accommodate larger teams. So features like single sign on global privacy, access to the API are included in the enterprise plan. If you are interested in any of those enterprise features or are expected to grow above 100 employees, feel free to reach out to us and we can provide you some more information. If none of those enterprise features are necessary for you and your team, you can also use our small business plan beyond 100 employees. There's not a hard cap on employees for that plan. So that was our scheduling section. In addition to that our attendance product can be added on to the scheduling plan. This includes all of the time tracking features that we went over today. So all of those clocking methods, the location enforcement for those clocking methods, time sheets, ability to record paid and unpaid breaks. All the exports that we offer including that custom time sheet exports, and then access to any of our payroll integrations are included in the attendance add on. So if you would like to preview or mock up your pricing, you can do that by logging into your account on the web. From there you are going to head to the account and billing page found underneath the gear menu on the toolbar. You're going to press upgrade my account then check out to activate. I know that's kind of an intimidating button to press but I promise nothing will be purchased or changed until you press purchase and you add in that billing info. On the modify account screen that appears you can adjust the number of user spots for the plan, turn on the time clock and attendance add on out and also toggle on annual billing if you need that. So by default, we offer a monthly billing cycle, but that annual switch can be enabled to pay upfront for your service. The annual billing cycle also provides a 5% discount as compared to the monthly billing cycle. So I usually suggest that if you're not quite sure that you're going to use when I work long term, you start out on that monthly billing cycle and then when you are ready to commit to a long term plan, you turn on annual billing to help save a little. So if you have any questions about what plan is the best fit for you or any of our features. Do not hesitate to reach out to us, you can get in contact with us from within your account by pressing this little chat button in the bottom corner that will direct you to myself, Tiffany or our coworker Marie, and we will help answer any questions that you have. We also have a wonderful need help section that you can access in the sidebar over here. When you press need help you will have access to our wonderful help center with articles that go through everything that is possible to do on the account. We also have a great training center that has guides and video tutorials of how to get set up, either from a management or employee perspective. So be sure to check that out. Tiffany is also going to send a list of resources in that chat section that we used earlier. Feel free to copy and paste those into a word doc or notes app to save it for later. That list has more information on getting started our plans and pricing and a link to those training resources as well. All right, so we have made it to the end of our session and I just want to wrap up by saying thank you so much for joining us today and thank you for all of your fabulous questions. Do not hesitate to reach out to us if you need anything. Our team is here to help. I hope everybody has a wonderful rest of their Thursday and the great start to their weekend.


Rhyw gwaith, fel chi'n gweithio ar gyfer y ddechrau Newyddion yma, ac rydw i ymddangos i'r Cadw Cymru. Rwy'n gweithio ar gyfer Y Orochol Lwyddiad. Dw i'n gofio'n ddifodol o ddodol i fynd i'w gwirio. Ddodol o'r ddodol i fynd i'w gyfrifiad. Ardod o'r ddodol i'r gyfrifiad gyda'r gyfrifiad. Y Orochol wedyn yw'r gwirio ar gyfer y dyfodol. Mae yna rhai o'r gwirio ar gyfer dyfodol. ei wneud tynnau ei cael ei fod yn y buddur o'u cyfarfod sydd gyda'r cyfrant o'r wneud yma'r cyfranau endohedd. Fel y cyfranau rwy'n bade i'w gwneud yr hynny yma, ac nid yw rhaid i'n ymweld yn rhoi rhoi rhaid o'r cyfranau sy'n aeddwn yn gwneud y cyfransau cyfranau a'r cyfransau achos ei gwybod. Ac mae'r cyfransau cyfransau allan yn ei cofio'r rhno o botl yn bwysig o'r dwyloedd cyhoedd i'w awdraff. ac mae'n meddwl i'r cyfnodd ydych yn ei ddweud ar gyfer cael cyfnodd. Dyna gweithio o'r newydd ein system hefyd yw'r Jei Rybyd yn ymwneud. Efallai'r rhubi yn ymgwneud o'r newid o'r Llyfrfridau Llyfridol, bym o'r labn o'r projeg yng Nghymru, gyda gyda genedlaeth genedlaeth JVM, ac yn ymddi'r ymddiadau. Mae'r gwerth o'r JVM yn ymddiadau, yn ymddiadau i'r prydysgol, a'r community JVM yn ymddiadau i'r prydysgol, ac yn ymddiadau i'r prydysgol yn JVM. Yn ymddiadau genedlaeth JVM, ymddiadau i'r newydd gympailer, yn ymddiadau i'r JVM, yn ymddiadau i'r grwp, ac yn ymddiadau i'rolisgol gympailer gympailer yng Nghymru, ac mae'n targedo'r gympailer yng nghymru. Mae'n ddych chi'n ei wneud fakeidol gyda'r rangos o'r rŵmdenau yn hipon mwywg, yn enwedig i rhai ardal gyfadau, a'u dod o'r rhaid i'r rhaid i'r ryth deis o'r rhaid. Ein ei ddweud o gwir o gympailer gympailers fath o gympailer oedd mewn pethau, o ddweud o herfodol i endurance. Ein ei ddweud o gweith o gympailer oedd yn digwydd, Iyn o enw i Lleiddau newydd a Lleiddau Paiddau, ar un o Lleiddau Paiddau sy'n gweld nhw'n ardal yn gynnig i'r un sgol bai gyda Lleiddau Paiddau. Bydd yna ein pethau lleol oedd bai gennu un sgol, Tom Salt, beth sawl yn cynnig i'r rhaid o Lleiddau Paiddau ychydigau y unigengor ym Mhwysg Bwrthynol. Ond yr unig yw gweithio gyda'r POSI Ivaluatio, o'r JVM oeddech chi oedd yn gweithio mewn teimlo? Ar y cyhoedd ychydig yn gweithio ym Mhwysg Bwrthynol rywbeth rhywbeth arwyr ar y galaxydd, ac oedd ychydig yÙr yn gwneud yn gweithio'n gwybod. Ychydig yn gweithio ym Mhwysg Ymhwyr. Ych chi'n gallu gyhoedd ar gyfer gweithies rhywbeth ym Mhwysg Bwrthynol oherwydd i gweithio'r language. They're good features of it because it makes it easier to program. Asked what we care about more, new people' are improve yr hwb i ngillaeth amio. Why they're community features. There's probably things to seeinaly we talked about many times before. When we started implementing truffle, we'll go the blog post by Charles Clutter on why you need to implement it rwbi and why you can start making performance to quite quickly. Listen to a lot of the things here. They also listen to a lot evolved people's blog posts on what is part and about Sergey Moise luncheon.  We have it at an integer roedd yn rhoi fael, mae'r bwysig ei ddadwyd fydd yn gweithio. Mae'n ddweud ar ôl e, iawn mae'r bwysig yw'r mountainorfeidliad. Mae'r bwysig yn cael ei ddweud gofynion ar y brif. Mae'r bwysig mae'r bwysig yn cael ei gwylau cael eu chyflogu a'i gwneud. Mae'r gofynion yng nghymru wedi'i rhesweddol â'i gofynion awddentol pof, oherwydd y gallwn gallu rai amgarjor, oedd y gallwn gallwn meffer i ddweud y methaf oherwydd That means you always need to continue to check that the method hasn't been redefined. So if you matter if any of the bit of work you're doing, you also have to do some check to check that something hasn't been redefined or you haven't overflowed. And quickly, the checks become more work than you're actually doing in terms of real work on the processor. Binding, so, kernel binding and proc binding. These are frequent listed as a couple of the things that are the most hard to implement in Ruby. Personal binding allow you to get an object's receptor so that all of your local variables are wrapped up so you can manipulate it like a Ruby object, and the proc binding allows you to do that for a proc, or a block or a lamb, or something like that, which you've already got. They make it very tricky to optimize Ruby because they mean that you can't… An implementation of Ruby can't store its local variables on the stack like Seawood, because you're always able to get them and modify them as a Ruby object at any time. Object space is listed as one of things which is tricky to optimize Ruby for, o'i bod ni'n fwy o bobl yn ychydig i'r byw, ond ni'n gwneud o bobl sy'n bwynt o bobl o'r byd, ond o'ch dda'u gynhyrchu i'w byddai gynhyrchu i'w byddai gynhyrchu i'w byddai gyrdd. Yn jay Ruby, y gwaith o bobl o bobl o'r byd i ddechrau'r byddau dda, ond mae'r cost yn ymgwneud. Yn dechreu panethau, mae'n dechrau'r byddau ddechrau o bobl o'r byddau ddechrau o'u byd i ddechrau'r byd i ddechrau'r byddai gyrdd yma, to tastes. Again these checks become more work than you're actually doing and threat rays allows you to send a exception for one thread to another. Again you need to keep doing checks therefore have I got something I should be raising in this thread. So those checks are the problem that we need to get rid of and deoptimization elegantly solves all these problems Where we the optimization elegantly solves all these problems. When we talk about jet compilers, we talk about optimizing code. We go from a slow interpreter and we want to jump into fast jitted code. That's how J微by works. This is how Rabinias works. It's how TOPAS works, all these implementations. They go from a slow interpreter, ids fast jitted code. The optimization is going the other way. It's going from your fast jitted code into your slow interpreted code. My idea is, if we can de-optimize at any point, we can make the compiled code forget about the checks. We can make the compiled code not allocate objects, as long as we can rely on the interpreter to have the objects there for real. It's going the other way to JITs which is why we talk about it as being the antidote to JIT compilation. Before we talk about stuff at a more technical level, let's provide a bit of an illustration. I'll use Alice in Wonderland as an analogy here. So, in Alice in Wonderland, Alice goes down a rabbit hole. She's chasing after a white rabbit. The white rabbit disappears into a room when she enters the room or she can see these tiny little doors. And she wants to follow the rabbit to see where it's going. And she bends down and she can open these doors up and she can see a beautiful garden on the other side. However, she's far too large to fit through.  But thankfully, on a table, she finds a bottle of medicine which is labelled Drink Me. And she very courageously drinks this bottle without knowing what it will do. And she shuts up like a telescope and she suddenly lies in small. Now she can go through the door into the beautiful garden. But there's a problem. She realises the door was locked and she's left the key for the door on the table. So now she's not able to get through. And because she's shrunk herself, she can't get hold of the key anymore to get through the door.  And she eats the cake and she blows up again and now she's able to get the key. But her problems continue from there, but that's where we'll stop the analogy. So relating that to de-optimisation, Ruby is Alice. She'd like to go through the little door into the garden of Utopia of High Performance. But she's simply far too big. She does too much work. She's got all these checks. She always needs to have these objects available to really compare them and use them as real Ruby objects. The Just-In-Time Compiler is the bottle labelled Drink Me. Because if she can drink that, she can shrink down as small as possible and then she can hopefully get through the door. But when you do that in a conventional implementation of Ruby, you leave something behind. You leave behind the set trace funk. You leave behind object space. And in reality, most implementations can't get that small anyway because they've got no good way of shrinking beyond those checks. So de-optimisation is the solution to that and that it reverses the effects of jit. So de-optimisation is like the cake which allows you to restore back to your original size. And the idea is if you can drink the bottle of medicine at any point and you can eat the cake whenever you like, then we can make our compiled code much simpler because we always go back to our full implementation of Ruby whenever we need to. So what does de-optimisation do for Ruby? Let's talk about fix num to big num promotion. As we said here, the problem is checks. We want to get rid of as many checks as possible. We want to make our code smaller. We want to shrink the code. And the medicine of jit is about shrinking it. So let's consider an example to start with. A plus B plus C. We'll assume that we know these are fix nums to start with. Perhaps because we worked it out through some type specialisation or perhaps it's some future implementation in Ruby where they're annotated as fix nums. This is the code we need, a pseudo code, to add together these two numbers. First of all, we add together A and B as fix nums. But they may have overflowed. So we need to check, did that overflow? If it does, we need to redo the calculations as a big num. And then we continue with the next set of calculations, so plus C as a big num. If it didn't overflow, then we continue as a fix num, but we need to check for overflow on plus C as well. Now that's a huge amount of code. It's got branches in it. Processors don't like branches. A branch will often destroy any kind of pipeline you've got in a processor, even if you can predict them fairly well. And remember, if you have a language like go or a language like C, the code you'll get when you add together two numbers is pretty much one machine instruction, add. Here we've got literally, potentially hundreds of machine instructions. And this is why fix num plus big num is really slow. So the solution to this, using dynamic deoptimisation, is to say we'll add the numbers together, we'll check if they overflowed, and then if they will, we'll just forget it. Everything will stop. We're not going to bother trying to handle that case. And what we do instead is we deoptimize. So that's our compiled code. If we get an overflow, we'll jump back into the interpreter, which implements all this logic, but in our JIT code, we simply implement this logic. Do the A plus B as a fix num if it overflowed, deoptimize. We add C onto it if it overflowed, deoptimize. This means you then don't have any branches, or you've got one very simple branch on each case. You don't have a code in it, and you've shrunk your code. Literally, you've reduced the amount of code you have, and less code is pretty much always faster code. You've got a finite amount of space for instructions and a processor, and a valuable resource. This allows us to reduce that. So that's fantastic if your code doesn't overflow, if your numbers don't overflow. If they do, isn't that really expensive? Deoptimisation sounds like a really complicated thing, and it is, and it certainly isn't free. It takes quite a long time to deoptimize on the order of many, many nanoseconds. So what happens if you frequently overflow? If you've got some code path where the numbers always overflow. Well, after we've deoptimized back to the interpreter, the next time we can compile, we can compile a slightly different code. So if A plus B frequently overflows, or has overflowed ever, we can now recompile with that branch in that handles that case. The other one which didn't overflow will keep that as a deoptimize. So we can gradually make your code more and more open to using the different dynamic programming aspects of Ruby as it goes, but we only add them as we need them. We call this a type of specialisation, and over time your program specializes with the code it needs, and each time we can deoptimize, go back to the interpreter, then when we compile again, we can include a bit more information that we need, but we're getting bigger very gradually, rather than having it all at the first place. Monkey patching methods. So whenever we have something like myObject.myMethod.xy, we need to have a check. And the simplest implementations of Ruby, which have no cache units like that, don't need a check because they simply do the look up every time. So the simplest case is look up my method in myObject, and then call it with x, y. But any non-trivial implementation of Ruby these days will do, has the object changed, then look up the method and call it. If it hasn't, use a cached version of that method, and then call it with x, y. But what we need to do therefore is each time we need to check has the class been changed at all? Has anyone monkey patched the methods on it? And again, this then becomes a check. So the tiny bit of code we're really interested in doing the call has again become swamped by all this bookkeeping and stuff like that. So we can improve that by, like we did with the overflow checks, we can say if the class has changed, we'll stop everything and we'll de-optimize. We'll jump back into the interpreter and we'll handle it there. If it hasn't changed, we'll continue and we'll use the cached method. Now we can actually do one better here than the overflow checks. We can remove this check even further. What we can do is we can say use the cached method and call it with x, y. Without any checks whatsoever. So we've removed all the dynamic programming, meta programming, monkey patching features of Ruby here to simply have use the cached method and call it. So how do we support de-optimization here? One of the things we can do in de-optimization if we go back to the analogy with the cake, we can force someone to eat cake from afar. So if Alice has shrunk herself and then you realize that she's shrunk herself too far and you want to stop her, you can stop her what she's doing, you can force her to feed cake and she'll grow again.  So if your code is still running, then the method you're using cannot have been redefined because if they had been redefined, someone would have forced you to eat cake and you would have gone back to that interpreter code which does those full checks. But your compiled code you're using in the fast path can be nice and fast like that. Binding. So the problem with binding we said was that it allows you to get access to your local variables at any point. So if you consider some simple rubal code such as these local variables where you have A is 14, B is an array of 8.2 and 3.4. The way almost all ruby implementations represent this will be that I'll have a stack. So this is the program stack with your local variables on it, A and B. A points to a fixed num. We may be able to do a little bit of optimizations with something like tagged integers to simplify that but in the conceptual case it's pointing at an object 14. B points to an array which points to other numbers as well. Now this is really inefficient because to allocate these objects we have to call malloc. If you're calling malloc it's thousands of times slower than actually just using registers into that. It's really, really slow. So what we'd like to do in a really performative implementation of ruby is to put those values directly on the stack. But the problem is if they're on the stack how can you get a binding of them? If we have anything allocated on a stack of this and we call dot binding or we've allocated a proc and it's gone somewhere else and been stored somewhere else and we call dot binding on that, how do we get access to these values? Well in de-optimization we can recreate the interpreter state so we can recreate all those objects. What we do is we take the call stack with the local variable values on it and we pull them off the stack and put them back into the real objects. Now that sounds like real magic be able to access your own stack take values off it which have been optimized away but remember we're writing the compiler here so the only person who puts anything on the stack is us. So we know where everything on the stack is so we can put it off if we want. This is part of de-optimization. In our compiled case we use the call stack and in our interpreter case we use the full objects. When we de-optimize as well as jumping into the interpreter we take all the values off the stack and put them really into their objects. This means we can support binding effortlessly because we can use local variables, sealant style local variables on the stack for all our Ruby local variables but at any point we can take them off the stack and use them again. And anyone who's using that local variables on the stack will be de-optimized as well and they'll start using the method the object which represents these local variables as a Ruby object. There's a few other techniques which we can talk about using de-optimization which we can relate to the other example. So something like object space the problem normally is that you can't store your Ruby local variables on the stack because you need to get access to them as objects like we do in binding we solve it in exactly the same way. We de-optimize everyone we tell everyone that whatever local variables you've stored on the stack I want you to put them into real objects. Tell everyone to do that and then you can enumerate all these objects. And then there's nothing stopping you using the stack for local variables because you can simply put everything back into objects later on. SetTraceFunk we can implement very much like monkey patching. So if we have a call to setTraceFunk on every single line we simply make that a method which does nothing and we inline it. And then instead of checking whether someone's installed a new setTraceFunk all the time we de-optimize them if we install a setTraceFunk. So to install a setTraceFunk you tell everyone to stop you make them all eat cake they all become large again and they all do the explicit checks for a setTraceFunk. So this means these features like object space and setTraceFunk don't have any overhead.  Checking for overflow has an overhead. SetTraceFunk has an overhead. Object space has an overhead. And they simply don't.  But apart from that these features literally have no overheads whatsoever. In our implementation of JbPlus Truffle we have them enabled all the time and if you did switch them off it makes no difference to the machine code generated at all. So how do we support de-optimization? Well there's only three things we need to be able to do. We need to recreate the interpreter stack frame. We need to jump from the jitter code back into the interpreter and we need to allow us to force threads to do this. Now the first two are pretty simple. Recreating the interpreter stack frame as we said each thread knows what's on the stack because it put it there. The compiler knows what variables it put into which stack locations. So we can simply tell it go through your listing of what you put where and put it back onto the stack. Jumping from the jitter code interpreter again is pretty simple. It's not much more than a go to. Goes from this compiled code to the interpreter code. The stack's already there and you can keep executing. But I'll explain how we force other threads to do this in a bit more detail. But this is pretty interesting and it's pretty unique in modern VM implementations. So say you've got this code. Loop do, A is 14, B is 2, A plus B. Now that's tight in a loop so we'd like to compile that so it has no checks on the method add there. We'd like it to keep running without any of these checks in. What some of implementations of Ruby do at the moment is they check a flag on every time they loop should I de-optimize at this point. So if you wanted to redefine add or if you wanted to raise an exception in this thread they have to keep checking this flag again and again. And checking that flag takes this from something which is a tight operation which just uses local variables or probably just uses registers to something which accesses shared memory and that's got implications for things like concurrency for your caches, everything like that. Suddenly it's gone to a shared memory operation where it was really simple before. So we could have been more implemented like this. We could say de-optimize if someone set this flag. What we actually do in the JVM is we use something called a safe point. This is a fantastic trick. What we do on each loop is we read a location in memory. That's all we do, we simply read it. When we want it to de-optimize what we do is we change the permissions on that page of memory to cause a seg fault. So what we effectively do is we cause your thread to crash and then from that point we can reconstruct the state and keep going. So effectively when you use a safe point when you redefine a method, when you use threadplace, raise what we do is we cause your thread to crash by causing something very much like a null pointer exception. And that's really simple to do. It's simply one instruction, read. These safe points as we call them are already in your code because they're necessary for GCs. You may have heard about garbage collectors doing a stop the world collection but to stop all the threads you need to tell them to stop somehow. So we have these safe points which allow us to do that by changing these page permissions. So we've already got these safe points in. So this is how this can be zero overhead because we already have these safe points to support GC. We can reuse them to do method redefinitions, set trace func, object space, stuff like that. So all modern implementations of Ruby part of Marvia MRI use de-optimisation to some extent more or less. But JRublus Truffle uses de-optimisation more pervasively and more aggressively than any other implementation in Ruby. And actually more aggressively than a lot of other implementations of other languages such as the V8, such as spider monkey and systems like that. So we're presenting the implementation of Ruby here. How do you know I don't just have a toy implementation which doesn't really implement Ruby? And that's a really legitimate concern. I know in the past we've had some questions raised about other implementations of Ruby, how much of Ruby they actually implement when they start talking about performance. So I'm just going to take a couple of minutes to convince you that we have a real implementation of Ruby here. First of all, we support 86% of the Ruby spec language specs. That's provided by the Ruby spec project. We're very grateful for them providing that code. So the general language features, we do support the vast majority of them and we're closing the gap on getting to 100% pretty fast. We don't support the same level of specs on the core library, but that's something that's just a case of implementing more libraries. It's not a case of new language features. If there's a language feature which someone thinks will impact our performance and we haven't implemented yet, we'd love to know about it and we'll stop everything and we'll implement that language feature right away. So we've used things such as Charles Nutt's list of difficult things to implement before you start talking about performance. We've gone through them systematically. If anyone else has anything else that they think should implement before we start talking about performance, we will do. We implement all these difficult parts of Ruby. Method invalidation, dynamic programming such as send, method missing, stuff like that, binding, threads. We have initial support for C extensions, frame local variables, object space, regular expressions in codings, eval, concurrency debugging, closures, promotion, all those things. And actually, some of those we implement better than the other implementations of Ruby. So as I said, our object space is always on. Our set trace funk is always on. We have a debugger which is always on. You can always stop our programs, introspect them using a shell and then continue running at the same performance. Our support of threads is a little bit limited in that it only provides concurrency at the moment. We have a global interpreter lock, but we actually recently took on a PhD student to work full-time at looking at that, so we hope to have some progress on that soon. Our support for C extensions is also pretty minimal at the moment. We're starting to look at making that more featureful, but we run them much, much faster than any other implementation of Ruby. We actually interpret C code when you have a C extension. We interpret it using the same system we use to interpret Ruby. The big question you're going to ask is, no, we don't run Rails yet. And we're not likely to run Rails for another year or so, probably. So no one here is going to be able to use JV Plus Truffle to do anything at the moment. And we're not proposing that anyone should try and do it. It's a research project, that's all it is. The rest of the JV community are working on other implementation techniques in Ruby which are relevant to what we need today. This is a research project and we don't run Rails. However, we are working towards it. Do I think that we'll actually provide any performance increase to Rails? Well, let's think about what Rails does and why it makes it slow. It does lots of things like dynamic programming. It uses method missing, it uses send, respond to and stuff like that. And it also uses lots of little objects all the time. Well, actually JV Plus Truffle is awesome at that sort of problem. If you have lots of objects, we can allocate them on the stack instead of on the heap, because we can always go back to the heap if we need them. JV Plus Truffle can inline through method missing, through send, through respond to, because it can always de-optimize and go back to the full interpretive it needs to. So, actually, I think there's lots of promise for Rails. Rails isn't something that might trip us up. I think it's something that Rails will be surprisingly effective. So, let's talk about performance. As I said, the blog post backs this stuff up. You can recreate our experiments if you'd like to. Please do. So, first of all, you can pair it against some classic benchmarks. These are the benchmarks that language implementers use, computer scientists use. So, they're very well understood and the reason we use them is because everyone in our community understands them, but they're not representative of real Ruby programs, but we'll start with them. So, on something that's highly numerical and highly computation-intensive, such as Fanko Redux or Mandobrot, Mandobrot is a fractal generator, we can be up to 35 times faster than MRI. And JV and Rubinius are only about twice as fast on that sort of highly computationally intensive stuff. I also show on this graph Topaz, which is the Pi-Pi implementation of Ruby, which was started a couple of years ago now. It's gone quiet. I don't think there's any recent development on that, but we can compare against Topaz as well. Having Topaz is really good, actually, because it shows that our numbers aren't absolutely out of nowhere. Topaz is achieving something vaguely similar. On some benchmarks, we don't do any better than anyone else, really, such as binary trees and Pi digits. These are very much memory-bound benchmarks and we can't allocate memory faster than anyone else magically. So, we're limited on those. Those are synthetic benchmarks, as I said. They're not really representative of any Ruby code. So, let's talk about some real code. We've been using two Ruby gems over the last few months, chunky.png and psd.rb. Chunky.png is an implementation of the PNG file format in pure Ruby. psd.rb is an implementation of the Photoshop file format in pure Ruby. This is production code written to make money for business. It's a real Ruby code that people are using in production today. We're very grateful to the authors of these gems for writing this code in the first place. On these real-world gems, we took the kernels of them and, on average, we are 10 times faster than MRI and JRuby and Rabbinius are no faster than MRI on these. That's because these are highly computationally intensive work. This is about decoding images. It's about applying filters to images. If you call malloc in one of these benchmarks to allocate something like a temporary array, you've already lost. So, you need to have de-optimisation to be able to remove those allocations. You need to have de-optimisation to have highly efficient implementations of the basic operators like add and multiply. If you don't have those, you're never going to be any faster than MRI. Again, we're also a lot faster here than topaz. That's because our ability to de-optimise is well above what topaz can do at the moment. I'll pick out a few benchmarks and show where this 10x figure comes from. If we look at some example benchmarks, on some of them we can be up to two orders of magnitude faster. So, chunky operations compose takes one image and compose it on top of another. If there's no filter there, it's effectively doing memory copy. If you've got de-optimisation, you can get rid of all the temporary intermediate arrays and hashes and method calls and the monkey patching that goes into that. You can simply write pretty much the same thing you'd get if you wrote mem copy in C. Clamp is a really good example, but it clamps a value between two extremes, so sort of min, max. And they implement this in this library by creating an array with the values in, sorting it and taking the middle value. And with de-optimisation, we can actually allocate that temporary array on the stack and then we can trace the values simply through as registers all the way through to where they're used. So this is sort of what Rails does, isn't it? Allocates little, tiny arrays, little, tiny strings, keeps using them. If we can allocate those away, we can do much better than other implementations can. So I think that de-optimisation is the single most important optimisation there is in Ruby. If you apply de-optimisation, you can get rid of everything that makes Ruby slow. You can get rid of the overflow checks. You can get rid of the monkey patching. You can get rid of the temporary data structures which clog everything up. Any implementation which wants to look at creating a high-performance version of Ruby and maths is talking about making a jit for MRI. If you want it to be high-performance, then you need to look at using de-optimisation. And de-optimisation is the key optimisation to make. It's not simple to implement, though. We're only able to use it because we've got the massive power of the JVM behind us. Implementing it for a simple implementation I understand is pretty much not as attractable. JVM plus Truffle builds on a lot of other projects. So we're very grateful to JVM for taking us into their repository and we use their parser, the implementation, regular expressions, implementation strings, everything like that. Of course, we depend on Ruby itself for the definition of that language and we're starting to use the core library implementation for Rubinius. So JVM plus Truffle is taking what's best from the other implementations and is bringing it together with a really high-performance jit core. The other thing Truffle depends on is the team which make the Grail compiler at Oracle and JKU University in Lin's. So there's not more people than work on it than just me here. That's my Twitter handle. As I say, if you want more information about this, I've written a really detailed blog post. So if I've covered over anything today, if I've given you a simple summary of what we're doing, all the hard details are there and you can rerun those benchmarks for yourself, you can look at the performance yourself. And as I said, it is just a research project you won't be able to buy at any time soon. Thanks very much. There's no more good questions.