Okay. My name is Jim Mulholland. I'm with a small company in Texas called Squeegee. And this presentation is going to be about MongoDB, which is a document-based storage system. So, again, this is about MongoDB. MongoDB is a document-based storage system from a company called Tengen, based out of New York. They actually just released the 1.0 version yesterday or Thursday. Thursday they released version 1.0, so it's a production-ready system. And I'll give you more details as this presentation goes along, obviously. So, let's get to it. So, first, Mongo. This is from the MongoDB website, MongoDB.org, if you want to look at the website. Mongo from Umongus is a high-performance, open-source, schema-free, document-oriented database. So, that's the way they say it on the website, and a little bit as an aside. They probably had to use the word Umongus in there because it's been a little bit of a controversy in using the word Mongo, and a lot of people haven't been happy about that word because it's derogatory, apparently, in a lot of languages, including English. I didn't realize this, but you can go to urbandictionary.com and look it up and you can see some interesting definitions. So, it was for Umongus. Obviously, it was nothing they didn't mean to hurt people. Actually, I've seen tweets saying people won't use it because of the name, which is a little ridiculous. So, I just wanted to mention that. So, I don't know if any of you guys have seen the Mel Brooks film, Blazing Saddles. There is a character on there called Mongo, which doesn't really help to cause a whole lot. That's him. A little more volume so you can hear what's going on. You get the basic gist. That's Mongo from Blazing Saddles.  So, that's Mongo. But, he does have a good side because it's the guy that played Mongo, Eric Carroll. So, it's actually the dad on the show Webster. So, that was something I learned in doing research for this show, which I never would have known otherwise. I thought that was pretty cool. But, there's a good Mongo. So, trying to get the nice good image of Mongo because I got the Urban Dictionary image in my head. It has to be a good Mongo. In my search, I did find a good Mongo. Check this out. The big gingerbread man. The whole, I need a hero. So, that's Mongo. What I especially like is that basically Mongo DB, now I can have a theme song. I need a hero. I need a cool database. So, awesome. So, I went through the lyrics and it's kind of fitting. Bonnie Ray, not Bonnie Ray. Bonnie Tyler, thank you. Maybe she was thinking about databases. Check this out. Is there a white knight upon a fiery steed? Late at night, I toss and turn and dream about what I need? Who doesn't do that about a database? Steepen to sit around that night in the bed? Man, I need a better database. He's got to be strong. He's got to be fast. Database. He's got to be sure. He's got to be soon. He has to be large in life. Obviously, could be database. So, to pay homage to Mongo, the Mongo gingerbread man, in this presentation, to map it all together, using this tool, if you guys are questioning what I'm using, it's a tool called presiprezei.com. It's a different way of doing presentations. Instead of doing slides, it's on the canvas. Anyway, so, I decided to do the whole thing in the image of a gingerbread man. So, basically what I'll be doing is zooming in the different sections of the gingerbread man and just to remind us that Mongo's a good guy. Good, happy, positive feelings. So, why MongoDB? This is from the website also. It's a perfect blend of RDBMS and document storage systems. So, overview. Mongo is schema-less. So, like I said, it's document-based. There's no schema. You don't have columns in a table. It's all documents. However, even though it's schema-less, you can still have dynamic queries, which is huge. Before we discovered Mongo, we tried Calix, which is all static views. And to do those static views, you have to map reduce, and it gets a little cumbersome and complicated. You have to know a lot of JavaScript to figure that out. So, dynamic queries is nice. You can have multiple indexes on a single document, or what they consider tables, which is cool. It has replication to fail over. They keep saying auto-sharding is coming. It's in alpha right now, and it's extremely fast. So, there's been tons of tests and stuff done on it. They've had to couch and Tokyo cabinet and MySQL and stuff, and Mongo usually is right up there. Very close to Tokyo, if not faster, which is cool. Great for websites, which is what we're using it for. Caching, logging. A lot of talks about using it as a logger. It's scalable, and it can store large objects in a tool called Grid at Fast, which comes with Mongo. It's an easy way to store big images, videos, all kinds of stuff that you usually store in the file system. You can now store in Mongo, which is nice. You can access it from multiple servers very easily without worrying about going through the file system. It's not great for. It doesn't have transactions, so if you have a transactional app, this is not the database for you. If you have to do a lot of ad hoc business reporting or complex SQL, may not be the best use case. It does have dynamic queries, but it's not as complete as you would with SQL. SQL's been around for 20 years or plus, and Mongo's been around for basically 18 months. It's still new, which is exciting. They've come a very long way in a very short time. It's really, I think, a game changer in terms of what it could do, what it could be for the community, and not only the Ruby community, but any community, because it's just really cool stuff. If it's not this, something else like it. So, compared to other DBs. All right, big fella, let's crash this pocket. So, I thought that was good, because it's basically, it's a new kid on the block. It's crashing the party. These other day bases are out there. Oh, I had that backwards, that quote. But Mongo comes in a little bit late. I think they just, the public release, the public beta release is January or February. So, we started using it early March. And yeah, it's a long way to go. A lot of improvements to be made. So, there's a chart, scalability and performance versus depth and functionality. Memcache, obviously, is very fast, but you can't do a whole lot with it. It's just a nice, easy way to get data quick. Key value stores, like Tokyo Cabinet, also very fast, not as much functionality. The thing, they are just keys and values, right? Keys and a string of a value. Mongo is a little farther down on the depth of functionality because it's key and binary data. So, it's key in all kinds of type data you can tie to it. So, you can have dates and strings and ints and arrays and hashes. And then RDBMS is a little bit, it's more functionality than all of them, but not quite as performant in terms of querying and inserts and stuff in most cases. So, this is actually from, it comes off, it goes off the screen a little bit, but this is actually from the MongoDB website. It just compares Mongo, Couch and MySQL. Just some basic stuff. I won't go through all of them, but Mongo and Couch are document. MySQL is relational. It's the Object Rose Storage, one large repository in Couch. Mongo splits them up into collections, which is their tables. MySQL has tables. So, interface, CouchDB's REST interface actually makes it really flexible, and there's a lot of things you can do with that, whereas MySQL and Mongo use native drivers, which help with the speed. All right, the basics. So, here's just kind of an overview of what Mongo does, not in relation to Ruby, but what Mongo gives you, a little more details on that. So, go Mongo, go! Here we go, Mongo. So, like I said, this is the way Mongo is spread out. It's database collection documents, whereas RDBMS will be database table rows. Mongo is database collection documents, whereas a database is like, you know, a database. It's a database. Cool thing about Mongo, it creates them on the fly. So, like in Ruby or Rails application, if you define a collection, you don't have to do any kind of a create database or anything like that. You can try to insert a record into a collection on a database, and that database is not there. It'll create the database, create the collection, and insert the row. So, it all happens magically behind the scenes. Very fast, too. So, it's nice. You don't have to worry about any of that stuff. Collection, like I said, is similar to a table. It's same as RDBMS, other than it doesn't have columns, right? It's a collection. It's a way to group similar documents into smaller data sets. So, and that really helps out with the speed. It can be indexed by one more keys, which helps the speed. And there are three ways to relate to other collections. You can have an embedded document, which means that if you have a parent document inside that document, you can have just basically an array of hashes, which is another embedded document. Foreign keys is what we think about in RDBMS.  And then a DB reference is just a reference to another table within a parent table. So, there's pros and cons of each of the three ways. That's actually probably one of the most complicated things about going to Mongo or any relational database. So, you have to change it where you're thinking of, you know, how are you going to architect this? You know, the tables are different. There's so many different ways you can relate tables. There's so many different ways you can store data. It's just a different way of thinking. Kind of very similar, actually. I thought about this this morning. Similar to this friggin' presentation I'm using, because it's not slides, right? You've got a big canvas. So, it's just you've got to change your mindset and how you want to relate everything. So, very similar in terms of Mongo or document-based databases. So, a document is the actual data piece. It's the row inside the collection. Each document stores both a key and a value. So, it's just basically you have a hash. So, you have a document is just, it's a single row of an array and a hash. It's basically what it is. And that hash can have, you know, anything in it. So, not going into more detail on that in a bit. So, the storage it uses. It uses something called Bison, is how they pronounce it, which stands for binary JSON. So, binary JSON is the data storage format for documents in Mongo that allows for storage of data types that JSON does not allow, such as date data format and bin data format. But, basically a way for them to store a whole bunch of different types of data. So, out of the box, which is very cool. Quaring. So, this is, Mongo actually comes with a console tool. So, you can actually go straight into the database and actually query it just like you would SQL. It has its own query language. So, these are kind of some of the types of queries you can do. So, here you've got the DB. So, if you got declared database, you know, so DB.connect, so I didn't do all this, but if you had a database name, you connect that database. And collection is actually the collection name. So, this could be like people. So, DB.people.find, and then first name, colon, you know, first name being the column name, or, you know, the entity name, property name, and then what you're looking for. So, in this case, John. So, it also has a very cool feature of regex searches. So, you can search based on a regex. So, this is just an example of that, just using your regex notation of slash slash. But actually, one of our tools is TweetCongress.org is one of the tools we wrote with Mongo. And we just do a Mongo database search. So, if you go to Tweet Congress and do a search, you can do any kind of regex search. And you can search for, like, it's Congress. So, like, one of the searches I'll do is go out and just look for, you know, number values to see, like, dollar amounts Congress is talking about and stuff in Tweet, which is pretty cool. So, you can do that in most other searches. So, that is a nice feature. And here's just fine by ID. Mongo, by default, has an ID field of underscore ID. So, your primary key is going to be called underscore ID. So, this is basically just finding something by underscore ID. So, here's another interesting bit of Mongo, and I'll show you a little bit more of this in a second. Because greater than, less than those kinds of operators are, in this format, dollar sign GT is greater than. So, if you want, in this case, they're trying to find someone that is older than 21. So, instead of age, you know, with a greater than sign or anything like that, it's basically multiple hash notation. So, age colon and then another, you know, brace greater than colon 21. So, different way of thinking about it.  And the cool thing is a lot of the Ruby ORMs, you don't really have to worry about this stuff a whole lot. So, here's just searching for an embedded document. So, in this case, you had a collection of, I don't know what this collection would have been, but person, book. So, this collection is probably book, right? So, you have a book collection or db.books.find. And then you're looking for all books that have an author of first name John. So, in this case, you have an embedded document inside the book collection. So, you have a book with all the book information. Then part of one of those fields in books is author. And then author is first name, last name, et cetera. And here you can just say author of first name John. So, easy way to, you can easily go inside collections and deep dive into them to do queries. So, and then this is something I really don't use a whole lot, but it has a concept of where. So, and this is just an example of how you can use a where clause. So, it's a little, it's JavaScript and some other stuff, honestly. I don't do this ever, but you could. So, yep, yeah. So, that was something I mentioned. So, good point. Thank you. So, yeah, you can do a lot, very flexible. So, I kind of get back to the map-reduced JavaScript stuff. I try to stay away from that. We haven't had to have a big use case for that yet, but it's definitely there if you need it. So, more querying. I mentioned that those notations you can use. These are some of them. You have your in. So, if you wanted to search for something in, you know, just like you would in SQL. And in is not in. Not equal is ne. All is interesting. All is if you wanted to find data where it's in, where in is an or, kind of, all is everything. So, if you pass in all with an array, you can find values that have all of these fields in it. Kind of complicated. I should have had an example of that. And then greater than, greater than or equal to less than. There is also a less than or equal to, which I didn't mention there. Size and where are some of the other ones. Now, the other cool thing. A lot of this, the documentation on MongoDB is actually pretty good. And if it's not documented, the Google group is awesome. And if you have a question about Mongo, you go to the MongoDB Google group. They'll usually respond within them. Literally, if it's more than five minutes, it's amazing. Someone from 10Gen responding to you about whatever your question is. It's been phenomenal. And a lot of times, if there's an issue, they'll have it fixed within a day. So, in a release. And so, that's actually one of the most pleasant pieces about working with this platform, is that the guys supporting it are really responsive and really easy to work with. So, definitely check out the Mongo Google group. So, fields is like select and active record. This is actually really important. Because you're pulling back, when you're doing data, especially when you're pulling back a lot of data. If you have big objects, especially a lot of embedded objects, those objects can be huge. And if you're just looking for, like, a name, it can make the difference between a query coming back in a second versus, you know, a hundredth of a second, a thousandth of a second. If you just, like, name versus, you know, we have, like, Twitter. We have a person that has the person and that person has lots of stats and stuff. They were tying the Twitter type stats or Tweet Congress and some other apps that we have. So, the one piece of data is huge. So, pulling back all that every time is a big deal. But if you do something, you know, like this field and specify what field you want to select, it makes a huge difference. And we've learned that the hard way a few times, learning when pages are taking so long to load and that's why we're just pulling back tons of data. So, something to keep in mind. Limit and offset comes out of the box for pagination. So, really easy to paginate with Mongo. Sort, just like you would with any kind of RDBMS, works on any column. So, and then count and group just out of the box. So, you can just do a person.count and pest in some kind of conditions clause and you'll get the count, the number of items in a deal, a collection. So, other cool stuff. Cap collection. So, this is kind of similar to caching in that it's last you set a collection size that you want a collection to be and once you get to that size, all the old stuff just starts dropping out. So, it's really good for like log, if you want to start storing logs and stuff and all the old stuff you don't care about. So, it'll just, you know, get erased at the end. So, there's a little example on how to create one of those down there. But yeah, it's a nice feature if you just don't need all the most recent data. It's called the older data. Upserts is basically just an easy way to do find or create. So, it has a, basically, if you can call an update and here we have basically, it's a unique field of Joe in this case. It's basically saying, okay, if Joe exists, you know, just update his age to 20. If he doesn't exist, go and create it. So, instead of having to do that in the Ruby layer, our application layer just does for your automatic, magically behind the scenes. GridFS I touched on a second ago, a little while ago. It's a way to store large documents. So, we're using this whole stuff for similar tools and it makes it nice and easy that you don't have to worry about how you can get the file system. Question? Don't think so. Good question. I don't know. What's that? Probably so. Yeah, I mean, we're just, right now we're just storing images, image data. So, it's just, you know, uploading it to the database and just accessing it tied to a model. It's nice and easy that way we don't worry about file system if you have multiple servers and stuff. It's just like you're hitting the database so you can get all kinds of big binary blobs of data. So, it has two collections to store the data. Files stores the, it's basically a collection itself. It has a files document to store the object or collection to store the file metadata, you know, file size, file type, all that kind of stuff. And that has a chunks collection that stores actually stores the binary data. So, and these are all the languages that they support right now. So, C++, Java, Perl, PHP, Ruby, Python, and then SpiderMonkey JavaScript are the drivers that they have out of the box. And they're creating quite a few other drivers or haven't helped create quite a few other drivers. So, it's definitely pretty widespread. It seems like there's quite a good following in the Python community already. A lot of stuff from Python guys, they're getting pretty big. So, Ruby. So, this is how Mongo interfaces with Ruby. It really has nothing to do with Ruby. I just like that last line, more heat less foam. Anyway, so, so, here are the drivers that are currently available for Ruby. You got the Bear to the Bones Mongo Ruby driver, which, you know, if you were going to build your own ORM or something, that's what you do. It's pretty in depth and there's a lot of functionality with it. You can do a lot of things with it. They have an ActiveRecord adapter. I've never actually used it. I'm not sure, you know, what kind of luck you have with it. It's kind of tough to marry the two, but they do have an adapter. So, you're more than welcome to try that. Mongo record is actually what we started using when we first started using Mongo. It's very ActiveRecord-like, but it's its own adapter, so you can use it with, you know, non-rails projects and stuff. We actually submitted some patches of that and created a plug-in on top of that. And then the last one is Mongo Mapper, which John Newmaker created. And a little story behind that, we actually, the whole reason this came about was a chance meeting of Win and I with John at RailsConf in Las Vegas back in May. And, you know, we're big into Mongo then, and literally we're the only person that heard of it at RailsConf as far as I know, RailsConf, because we talked to everybody and anybody that would listen to us about it and no one had a clue what we're talking about. John being one of those guys saying, okay, why do I care about this? And so we got to we went through our whole conference and actually got home and he, like, sent us an email or something saying, this is cool! And, you know, I want to create an ORM for this deal and so I thought he's not, so like, why don't you just extend the ones that have you. Is that excited about it? But, you know, he decided to do his own deal and he did Mongo Mapper and turned out great. So our most recent project that we're using now with Ruby, you're just using Mongo Mapper and it's very it's a very nice ORM. So some of the things that gives you out of the box is type casting, so you can, when you define your keys and I'll go into some more detail, you can say what type, data type you want it to be, and what have you. Which, at first, I thought was silly, but John's point was well, if you're submitting something from a form, like, you know, if you have an age on a form, how would Mongo know that, you know, age should be an int, right? You just store it as a string otherwise. So if you're data typing everything, it's, you know, now you can, it knows that it's an int. So, very good point and it actually worked out really well. Callbacks, aftersave, etc. So those work out of the box. Validations is very cool. Validates presence of, validates numericality of how it works. A little different notation of how it works, and I'll show you that in a second. Per object connection, per object database. So if you have a person object, you can have it connect to a totally different server, if you want it to. You can have it connect to a totally different database. So you just define it in the, in the model. So you can connect wherever you want. So it makes it very flexible. Associations, so has many, belongs to, works. Find all, find first, find last, find. I didn't put in here. But custom finder, like, you know, find by first name works, find by last name works. Custom ID, so the primary key, the underscore ID field.  So if you have a, you know, if you're doing a show on a Rails page, really person, you know, slash ID is going to be person slash, boom, huge ID. So Mongo Map allows you to do a custom ID, just specify what you want your custom, what your ID field to be, so you could be, you know, first name, dash, last name, or something. So your URL will look pretty. Now Dynamic Founders is there, find by name. And then create keys on the fly is cool. You don't have to declare all your keys in your model. If you want to throw in a key on the fly, you can. This is really nice for interfacing with APIs, like Twitter API, interface with live APIs. Right, yeah, sharding is coming. So that's, let's say it's an alpha now, but yeah, we actually have a use case for now that would be awesome. But they say it's coming and it should be soon to shard it. But yeah, right now, they have nothing out of the box. So like going to shard by city or something like that, right, yeah. So it's supposedly coming before the end of the year. So, which would be very nice. Yeah, be, I think it's different day, different collections. If you have a person you want to shard by city, you know, the usual use case is Craigslist, right? You want to shard by city, so you have a Craigslist and you want to have all the city, city, what would you call Craigslist listings? City listings, I guess, in one place, right? If you had Houston or Austin, that would just be your own collection. So, you know, so everything would be based off the city. So everything that's tied, all the listings would be by city, would be separated by city in that case. So, honestly, I don't know how they're going to implement it, but that's my understanding of it. So, actually, the actual physical storage. It's interesting, the storage is, it starts with a single file. That's one thing I did not mention here, something about the storage. It uses memory, memory map files. So, it makes it really fast. The problem is, it makes it look like your memory is completely 100% used, because it basically looks like it's grabbing on the memory, but in reality it's not, it's just there. I mean, if something else needs memory, you can take it. But a lot of people, they install a manga and they look at their memory and they're like, whoa, I can't use this. You know, it's taking on my memory. But it doesn't actually, you know, impact performance. But the actual files it uses, it uses some crazy deal. The first file is 16 mags, and then the next file, it's, you know, twice the size, and it goes up to like 2 gigs. And then it has, you know, multiple files of 2 gigs. It just creates. And it creates a new one. It uses a ton of memory, hard drive memory, physical memory on the machine, because it always spawns another memory file before it needs it. So you could be one point, you know, use, you know, one in three quarters gigs of memory in this one, for one particular database.  So there's no impact. So it definitely can use a lot of memory. And we have a tool that we're creating multiple databases for a single application, and, you know, our memory data usage, physical data usage is big, because it, you know, it takes a lot of memory. So both, you know, virtual memory and physical hard drive. So, but the key's on the fly, and I mentioned this a little more in a second, but it's basically if you wanted to, if you wanted to integrate with the APIs, kind of getting on to, you know, you can just suck in the data from a JSON field and just store it in the manga without having to declare in your model. And then you can still be able to use .notation to get to that data after it's stored the first time without doing any kind of declaration or anything like that in your model, which is pretty cool. So, so here's an example. Sorry about the, I was trying to do color syntax highlighting, so I did a screen shot and didn't turn out as well as I was hoping. But, it's somewhat readable. So here's just a multiple model, a class, multiple classes models, whatever you're going to call them, objects. So you have a person, has many addresses, has many posts, and then here's the keys that we were talking about, first name. So, validation, here in this case, first name is required true, that's the validation. So instead of doing, you know, validates presence of, you just do require true. Same thing, last name, age is, you know, this is a validation numericality of, just say numeric true. And then the data typing there also. So, so we have two different types of relationships here. Address is actually a, an embedded document. So it's actually going to be stored with person. So in this case, you have a person, that person will have a document inside that document will be an address field. So it's actually one document. The second one is a post, which is just going to be a foreign key type relationship, and yeah, I think John actually released a new version of MongoMapper yesterday, and since that reverser dropped yesterday, you have to specify the person underscore ID key, before he didn't. But he decided it was too magic. So now you have to do the person ID, so if you have a person has many posts, you have to make sure you specify that key. So, here's kind of some examples of how that works. So it creates and updates. So, so I'm going over the person, let's let you know what the person looks like, the fields. So I do a create, and then just like you would, any kind of just active record, all this is. So first name, last name, age, etc. After the person, so this is basically on an IRB, this is what I put in, and this is the output, this outputs the object. So, and then this is also a very, very active record ish. Person.last gives me the person object that is entered in there, and then person.fadeColors returns the array that I just submitted when I submitted the doc. So, you know, get the array in that case. So here is an example of a favorite animal that wasn't included in person, right? I didn't mention favorite. I didn't know it was going to be a favorite animal, maybe it was just coming from an API or something. So, you know, grabbing the person data from an API, it has favorite animal in there, equals dog. So, you do that, you save it, and then once you went after you went and got the data, the object again, you can do person that favorite animal, and you'd have a dog. So, that any kind of definition defining. Same thing, this is just go one step further saying you can even do that with a hash if you wanted to. So, if you go in and define a hash that wasn't defined at all in your original model, you could do that. So, I just did a family hash of that person, saved it. So here, the class knows it's a hash, in this case an ordered hash. And then, to access the data within that, just person.family and then whatever part of the hash you want to access and it returns that set of data. So, embedded documents I just touched on. So, this is an embedded document, the address. In this case, it just has the address which is basically the street number, city, state, zip. Right? Yeah, kind of a second class citizen. You can't, so some of the drawbacks in embedded documents is you can't do queries on it, right? So, I couldn't go here and now and do, give me all addresses of people in Houston because it's tied to a person. I can find all people that are in Houston. I can't just get all the addresses, right? If you wanted to do a search on, like if you had posts and comments, right? And you wanted to show all the comments in one place. It probably not, doesn't make sense to do that in the embedded document.  But if you wanted to show just the comments, or be able to search in just the comments, it's not easy to do if it's in embedded documents. It should be its own model. Yes. If you do person.caths or something that wasn't defined, I think it raises an error. I don't know. You know when? I'll have to type it in your head. So, yeah, we'll let you know. So, here's the embedded document. So, to store that embedded document, you create an address.new to get your address doc. And then you just, just like you would in an array, you just set that into person. That's actually bad character return there. A person.save should be on the next line. But that's how you add an address to a person as an embedded document. And then here is, so then you just do person.address.first addresses.first and give you that address. If that person had multiple addresses, you could, you know, obviously get them all there. Person.addresses.last would work too. And then here's a person.findfirst, and here I'm just doing kind of a touchdown what I was doing, the Mongo example. Just doing a deep dive to find the person that lives in a particular city in this case. So, find all people that live in Houston and that we would return, you know, an array of, or in this case one, because it's the first, but if you'd all find a return array of people, all the people that lived in Houston, not the addresses, they would return the people. So, that's a key differentiator there. So, foreign key relationships. So, this is kind of what I just touched on in terms of posts. So, a person who has lots of posts include here would be a Mongo mapper document. I didn't mention but, you know, I think it's there. But yeah, here it's embedded document. That's the only difference with using Mongo mapper in terms of defining as an embedded or not an embedded document. So, here we have a post that's just a document, but it has that person ID. I didn't do a belongs to here. I could have a belongs to person, but person has many posts down there. So, it's just like a cool relationship in that case. So, here you can do a build like you do in Rails or Ruby, person.post.build and that automatically includes the person ID and that's the Mongo ID that gives you by default. So, that's the big good thing it gives you. So, you can do a build, creates the post for you and then you do post.content in this case and this is a post and then save and that saves your post in that way and that person's already tied to that post because you did the build and then this is just how you get it, just like you think you would person that post that first like content and gives you the content of that post. So, validations which I just touched on. So, in this case like I mentioned first name, last name are age, numeric is true. So, if I did person.new in this case I didn't add a last name so I just did first name and my age I did 12 instead of the number 12 I did 12 written out. So, if you try to save that you get, it won't save it will give you your false in terms of the save and it will throw a couple errors. Must be a number, can't be empty just like you would expect with active record. So, I figured that was a good way to end it and that's basically my deal. My name is Jim Mulholland so that's my Twitter and my email so if you guys have any questions let me know. That's it. No questions? Oh, that I don't know. I had not had a need to know that. Right. Yeah, so whatever Ruby goes down to but something I've never had to have that kind of detail. Does this work well with like Amazon S3? Yeah, I don't think it's possible to store it on S3. It's just you store it on a server. So, it has a, you run it as a server on a, you literally do, you download the unzip the tar ball. Right, right. It's kind of a misnomer of document based database because it's still all in memory on your server so it's not really documents at all so I mean it's, you can do types and, you know, store them to wherever you want to store them, zip up a backup and it has all that kind of utility you can use but you can't actually store the physical documents on an Amazon or anything like that. You could have other servers. You can specify, so when you start your server or your, yeah, your Mongo server, you can specify where you want it to store the data and it can be anywhere but I don't think it's going to be S3. I could be wrong. I did, yeah. You could do person not fine by favorite animal and it's more type casting more than anything. It's already there and you have the type casting but yeah, you don't really need it. You don't care about type casting, you don't need it at all. The other thing is if you wanted to do notation of, you know, person so like to do the favorite animal you have to use bracket notation like you would a hash. I couldn't do person.favoriteanimal equals cat because it doesn't know if favorite animal exists yet but the first time you add it you have to do person bracket notation favorite animal equals cat so that's the other difference. Doesn't support transaction at all. They do have two JSON, right? Yeah, so I know they didn't have it at first but yeah, I'm pretty sure I have it now. I don't know about 2XML. Right? Yeah, it's a fast moving deal so it's tons of work being done on here so Oh cool, yeah, definitely. Yeah, no, it's the amount of support it's gotten since the RailsConf like in May. I mean, I've already talked to Rich. I've talked to him Rich Kilmer. So there's lots of people already using it now. It's just one of the first slides. It's the perfect blend of rdbms and database databases very flexible and easy to use and it's kind of natural.  It shows you where things are fast, where they're not, where indexes should be used and all that kind of stuff. So, oh, I don't know if I've seen any studies on that. I don't know. My guess would probably be Linux because that's used as a Pacto and probably not Windows, but that's just because that's normal. So, yeah. Oh, good point. So one big thing Mongo does not work well because of the memory map files. It does not work well in 32-bit system. It works but you can only have a database size up to 2 gigs because of the way it's memory files. So it really prefers 64-bit operating systems. So it's something to keep in mind that if you want to install, like, so we try to do Tweak Congress or something on a 32-bit EC2 instance and we couldn't because we had too much data in there already. So, something to keep in mind, it prefers 64-bit. Yeah. There you go. Mill of seconds. Okay, cool. Yeah. That's a good question. You know, John? Yeah. So, apparently it's being worked on. Yeah, I don't think it's there yet. So, Prezi, P-R-E-Z-I. So, they actually have a free version. You'd have a little Prezi logo down here. And this is not the way you want to do Prezi, by the way. This is just me being silly. You don't want presentations where you draw things. The cool thing about Prezi is you'd have multiple sections of a presentation and then when you're asking questions, you can easily just, you know, find me to answer stuff on something. It's easy to zoom in. And, you know, if someone wants to know about that, you can zoom in to that section and talk about that. So, it's really, it's just a good way to see an overview of your whole presentation and then easily drill down into different parts of that presentation. So, yeah, this is actually a horrible way of doing it. But, man, I'm just excited to do it. All right. Well, thank you guys. I appreciate it.


Earlier today in our keynote, we heard Gartner speak about DevOps value streams. That is the end-to-end workstream that is necessary to deliver high-quality software to your end users. One of the purposes of a DevOps platform is to optimize that value stream, to fulfill that agile promise of delivering more value more frequently to your end users. But you can't do that until you understand the stream itself. You can't optimize and remove high-priority blockers if you don't know what those blockers are and you don't know why they're blocked, for instance. As a DevOps platform that sits underneath and supports everything you do to deliver that software, GitLab has a lot of data to help you understand that context and help you make those decisions. But how do you start? In our next session, GitLab's own Larissa Lane will speak about how to use GitLab to access all of that data and to understand where your problems are and ultimately quantify your responses to those problems so you can benchmark how well you're doing to improve that. Let's take a listen. Thank you for joining my presentation about optimizing your value streams to get ahead of your competition. I'm Larissa Lane. I'm the product manager for the Optimize Group at GitLab. The Optimize Group focuses on high-level metrics that provide visibility into your end-to-end development flow and DevOps journey. Before I get started, a note about forward-looking statements. Our roadmaps at GitLab are ambitious and we embrace change without notice. Anything I say in this presentation about future plans could change. Information presented in this session should not be used for the purpose of any material purchase decisions nor is it a promise of any sort. Today I'll be talking about why speed matters and different metrics you can use to measure it. I'll be focusing on how long it takes to deliver value to your end users, starting with an overview of the benefits of optimizing value streams. Then I'll talk about what metrics are available that can help you understand the time it takes you to deliver value and measuring optimizations to your cycle time. So just to quickly touch on some of the benefits of moving faster. Firstly, by delivering value faster, you can reduce costs. By becoming more efficient in every stage of the software development lifecycle, you reduce the number of personnel as it takes to deliver value to end users. If you'd like to read some use cases on how companies have reduced costs by moving faster. In 2020, Forrester conducted a total economic impact of GitLab study. We have the study available for download on our website and it provides some specific numbers as well as more information about the framework they use to arrive at them. Another benefit of moving fast is to increase customer satisfaction. When you're able to deploy more frequently and turn around customer requests more quickly, you improve customer satisfaction and you get feedback faster. And the final benefit I wanna call out is that you increase competitiveness. If you're able to move faster than your competition, you can stay ahead of them with releasing new features and also realize revenue from paid features sooner. There are a couple of terms you'll hear me mention in the presentation. Firstly, a value stream. A value stream is the flow of activities involved in delivering a product or service to an end user. It's all of the activities from coming up with an idea or receiving a customer request all the way through to delivering that value to your end user. Value stream management is the process of identifying what your value streams are, mapping the flow of work required to deliver a value stream and then tweaking your processes to optimize the flow. So the first step to getting better is understanding your current state. How efficient are you today? Where is work flowing well and where are things getting held up? So let's look at some of the key metrics that can help you understand your current state. First, there are the Dora 4 metrics. This is a set of metrics that were established by Dora which stands for the DevOps Research and Assessment. In 2019, sorry, they were established in 2019 as a benchmark for measuring velocity and stability. Stability is something I haven't touched on yet but it's an important aspect to consider when pushing for faster delivery. I'll talk more about stability in a minute. The Dora metrics quickly gained popularity and became an industry standard. It's actually one of the most common topics I get asked about when discussing metrics with large enterprise customers. This one that you're seeing on the screen is the deployment frequency. Deployment frequency shows how often you are delivering values to customer per day. At GitLab, we deploy on average 62 times per day in the GitLab project. Deploying frequently has a number of advantages. It increases competitiveness by being more responsive to market needs. It increases user satisfaction because your users are getting changes faster. You get faster feedback so you can iterate as needed. And you increase your return on investment by making paid features available sooner and generating revenue sooner. Dora did some research and set benchmarks for what they considered to be an elite performer and a high, medium, and low performer. This is a generalization because daily deployments are not appropriate for all industries or all customer bases for a good reason but in general, a high performer is considered to be a team that is deploying between once per day and once per week. Another Dora metric is the lead time for change. This metric measures how efficient your integration, deployment, and release processes are. According to Dora, a high performer takes less than one week to start development work on a change and get it deployed all the way through to production. In GitLab, we measure this as the time when a merge request is merged until it is deployed into production. These two Dora metrics are available through GitLab's Dora API and also through CI CD analytics in GitLab. The next set of metrics I'll cover are in Value Stream Analytics or VSA. VSA is a tool in GitLab where you can create custom value streams and map them to your workflows by defining stages. VSA has several metrics that provide visibility into end-to-end flow times. Firstly, lead time. Lead time measures the entire cycle from when a customer request is made until the feature is available to the customer. This is useful if you need to track the average time it takes you to respond to customer requests. Then there's the cycle time. Cycle time is the time the first merge request is linked to an issue until the issue is closed. This metric skips the design and planning phases and focuses more on the actual development time. And finally, there's the overview metric. This is the sum of all of the stages you've created in your Value Stream. So these are the stages in my Value Stream along the top. Some of them are cut off, they run off the edge of the screenshot, but the overview metric shows you the sum of each of those stages. This is a great metric to monitor because it is mapped to exactly the steps in the flow that you are most interested in and you can customize the stages and events that contribute to the overview time. For example, the screenshot shows the workflow we follow on the Optimize Engineering team. We created scope labels that we use to track when workflow items move from one stage to the next all the way from problem validation through to final verification and deployment of the feature. You can see from the overview tab here that in our case, it takes us on average from beginning to end a building feature, it takes about two weeks. With VSA stages, you not only get visibility into your end-to-end flow times, but also the time spent in every individual stage in your flow. This helps you understand which stage your work items spend the most time in and helps you identify bottlenecks. For example, I can see here that work items spent the most amount of time in the Ready for Development stage. Once work items are picked up by an engineer, they only take three days to actually do the coding and one day to do review. I've talked a lot about being faster, but being fast and efficient has little meaning of the quality of your output is terrible. It's important to also measure the quality and reliability of products and services. This is where the other two of the four door metrics come in. Change failure rate is the percentage of changes to production or release to users that result in a degraded service and subsequently require remediation. For example, a hot fix or a rollback. To be a high performer, Dora says that less than 15% of changes should result in a degraded experience. Then there's the mean time to recover metric. This is how long it generally takes to restore service when a service incident occurs or how long to release a fix in response to a defect that got released to production. For example, an unplanned outage. Dora's guide for a high performer is less than one day to make a fix. Now that you understand the current state of your value stream, you can take action to reduce the time of some of the slower stages. Let's say you introduce a goal to have smaller MRs to reduce complexity of dependencies, testing and reviews. Or perhaps you want to focus on a more efficient reviewer process to reduce your review time. For example, you can introduce code owners or start using the assigned reviewer feature in Gelab. Or you might experiment with breaking issues down to smaller weight so that you can deploy more frequently. Whatever your goal is, you need to be able to track the impact of changes. To do this, you can use the date selector in VSA to compare stage times across different time periods. If you make a process change in August, for example, you can compare stage times in the months before and after the change. You may also want to measure if a process change has a negative impact on stage times. This is an interesting use case that a customer recently shared with me. In their case, they rolled out SAS testing to a limited number of projects and then used VSA to see if there was any negative impact on the time it takes to run tests and deploy pipelines before determining whether to roll it out to more projects. Another helpful tool for tracking the impact of changes is the deployment frequency graph and also the lead time for change graph in CICD analytics. This screenshot shows the lead time for change graph and this is the deployment frequency graph. These were added fairly recently and they're available in the ultimate pricing tier. But what about business value? Measuring speed and reliability is just one aspect of value stream management. It's also important to measure the business value of what you're delivering. This means not just measuring the speed and reliability of your outputs, but also the resulting outcomes for the business. How do you really know if you are delivering the features that customers most want? Are your outputs giving the company a competitive advantage? Are they aligned with the company vision? Are they actually increasing customer satisfaction? Do employees feel like they are contributing to something important and meaningful and therefore you have a high level of job satisfaction and low employee turnover? Not only are business outcomes important to measure, it's also important to measure how much it costs to build specific features or products. So you can understand the return on investment. Business outcomes and investment are tricky to quantify. Adding a weight or time spent to each issue will give you some insight into investment. But to truly understand the investment, you need to track the cost of the many other inputs that go into building a product, such as design, product management and marketing. These are all things we are thinking about at GateLab. For more details on how we are thinking about measuring business outcomes and return on investment, tune in to the presentation by Gabe and Kristen, titled Agile Management with GateLab Present and Future. While there are plans on the roadmap to make it easier to measure the value of what your teams are delivering, there are tools available today to provide you some insight. For example, the tasks by type graph in group level BSA shows a breakdown of the type of work being delivered. This graph is customizable based on filtering by labels. Consider applying labels to your issues and merge requests to give you greater insight. For example, at GateLab, we use labels such as feature, bug fix, tech debt, direction, SUS to measure our usability score, customer for things that are requested by a customer and CSAT for issues that address customer satisfaction feedback. Filtering this chart by labels can help you understand how much time is spent on unplanned work and abandoned work, how much effort is being made to avoid the accumulation of tech debt and how much time is spent on high priority work that contributes to a high level company goal. I hope this has given you some ideas for how to streamline workflows to beat your competition and grow happy teams and customers. Thank you.


Trouble funding a man. Have you ever considered running about that? Oh, that's a great idea. Let me get a pen. After Sex and the City was nominated for over 50 Emmy Awards winning seven and nominated for 24 Golden Globe Awards winning eight. You have no idea how many men I've had to sleep with to get this award. After Sex and the City spawned two feature films, Sex and the City and Sex and the City 2, and prequel television series titled the Carrie Diaries. She can steal them from you, did she?  She's your family. I don't count on family. After Sex and the City was credited with starting crazes for nameplate necklaces, maniloblonic shoes, flower corsages and visible bra straps. Sex and the City has been off air for over 15 years now but many of us still live for rewatching the iconic series. Beginning its run in 1998, the comedy drama series enjoyed six seasons of solid ratings before ending in 2004. On January 11th of this year, fans, including me, were ecstatic to hear a continuation of the original Sex and the City series was announced. The sequel series will be titled and just like that and will feature the original stars with the exception of Kim Kattrall. So whether you rep nameplate necklaces or any of the many, many trends Carrie Bradshaw and her posse rocked on the series, there's no denying that Sex and the City's influence was iconic. Like I said, many of us are still watching the show in current times and no doubt wonder what our friends Carrie, Samantha, Charlotte and Miranda are up to in real life. Hey guys, it's Carrie the Vampire Slayer and today we're doing a series titled Where Are They Now? We're taking a look at the star-studded cast of Sex and the City and what they're all up to these days. I mean maybe you know what Sarah Jessica Parker is up to but what about Cindy and Nixon who played Miranda? If you want to see more Where Are They Now? Let us know down in the comments who you want us to document next. How about some more hit HBO series or some oldies you probably forgot about like Dawson's Creek. Anyways, let's get into this video. Sex and the City revolved around a group of four women, three in their mid-30s and one in her 40s who despite their different personalities and changing sex lives remained close and confided in each other. The series was criticized for multiple continuing storylines that involved relevant and modern social issues such as sexuality, safe sex, promiscuity and femininity while exploring the difference between friendships and romantic relationships. The writers had deliberately chosen four women in their 30s and 40s as a way of exploring social life from sex relationships through four very different individual perspectives. Nobody knew the show was going to blow up the way it did. In fact, after Sarah Jessica Parker had already signed the contract, she disliked the pilot so much she wanted to get out of the deal. She even offered to work in three HBO movies unpaid wherein the series would ruin her career. So it's a good thing she stuck it out and never turned back. But honestly, if you go back and watch the first few episodes of the show, it's crazy how much it evolved. Let's start with Miss Carrie Bradshaw, the nucleus of the show. After Sex in the City, Sarah Jessica Parker signed a $38 million contract with The Gap. It was the first multi-season contract in the clothing company's history in which Parker was going to appear in their upcoming fall ads and continue until the spring of 2005. Parker released her own perfume in 2005 called Lovely, while in March 2007 Parker announced the launch of her own fashion line, Bitten, in partnership with Discount clothing chain, Stephen Berry. The line featured clothing items and accessories under $20. Parker released her second fragrance, Covet, followed by Covet Pure Bloom, Dawn, Endless, and Twilight. In 2014, she also started the SJP collection, a footwear line at Nordstrom. She Instagrammed herself overstepping the chain residence on 66 Perry Street, put up to prevent overcrowding and unwanted visits to the now famous address to promote the line. Sarah went on to get other lucrative deals in the fashion industry, and much like her character, Carrie, she's always had a passion for this. In real life, Sarah's closet would probably be just like an even more jaw-dropping version of Carrie's. Parker returned to television for the first time since Sex and the City portraying Isabelle Wright in three episodes of the Fox series Glee. She starred as Frances in the HBO series Divorce, for which she was nominated for a Golden Globe Award. Since 2005, Parker has also been running her own production company, Pretty Matches, which has been creating content for HBO and other channels. We also did her house tour here on Famous Entertainment, so if you want to see how she's living with her family, be sure to check that out. Now let's see what wild and fun-loving Samantha's up to these days. Kim Katra was actually born in the UK and spent much of her life living in Toronto, considering she's a Canadian citizen like me. After Sex and the City, Kim stayed busy appearing in movies such as Ice Princess and found success through prominent TV roles like Tell Me a Story, Sensitive Skin and more. Later in 2020, she starred in a drama series for Fox titled Filthy Rich. Though Katra published a book while starring on Sex and the City, she would go on to write two more after the show finished. Her books were called Kim Katra's Sexual Intelligence in 2005 and then in 2006, Being a Girl was released. Kim Katra had faced some adversity and in 2018, she tweeted that her brother Christopher had disappeared in Alberta. She asked for public help in finding him. He was found several hours later, having taken his own. When she posted the news on Instagram, she ended up having a feud with Sarah Jessica Parker, online, confirming rumours that she and Parker did not like each other or get along. The drama between the real-life Carrie and Samantha was always a hot topic in the tabloids. And now with the series reboot in the works, it still is. In December 2020, as reports came out about the reboot, Katra said that she felt lucky to be excluded from revival talks. Kim had previously slammed Sarah claiming she was cruel and suggested that her character of Samantha be recast in any future TV shows and films, but there are definitely two sides to every story, including this one. On the lighter note, let's talk about the good girl of the group, Charlotte York. After Sex and the City, Kristen Davis starred on Bad Teacher and voiced the character on Miss Spider's Sunny Patch Friends. She also appeared in several films, including Couple's Retreat, A Journey to the Mysterious Island and A Holiday in the Wild, a rom-com on Netflix I watched last year and actually loved. The actress additionally dabbled in theatre, making her way to Broadway in 2012 for the Best Man Revival, and her West End debut in the original stage production of A Fatal Attraction two years later. In 2011, Davis adopted a daughter, Gemma Rose Davis, followed by adopting a son, Wilson, in 2018. They reside in the hills of Brentwood, Los Angeles, California. And you might not know this, but Kristen is a recovering alcoholic and says she was introduced to alcohol early as part of her Southern upbringing, saying, Alcohol freed me, I was really shy and I didn't know how to come out of my shell. I drank for the same reason I loved acting, I wanted to feel things and express myself and be free. And I'm not naturally that way. Finally, we'll talk about the actress who played Miranda, Cynthia Nixon. After Sex and the City wrapped, Cynthia went on to appear in the Big C, World Without End, and Netflix's Ratched series. Outside of acting, Trinna New York's gubernatorial election in 2018 against Andrew Cuomo, but she ultimately lost. Nixon has been an advocate for LGBT rights in the United States, particularly the right of same-sex marriage. She met her wife at a 2002 Gay Rights Rally and announced her engagement at a rally for New York's same-sex marriage in 2009. Nixon went on to receive the Yale University Artist for a Quality Award in 2013 and a Visibility Award from the Human Rights Campaign in 2018. In addition, Nixon is also a spokesperson for New York's Alliance for Quality Education, a public education fairness advocacy organization, and also has a history of advocacy in support of women's health. Alright, and with that, I think I'll bring this where they now to an end. After checking out the cast members of Sex and the City, including Carrie, Samantha, Charlotte and Miranda, what did you guys think? Was there anything that I missed? I know we didn't get to see what Mr. Big and Aiden are up to these days, but the show definitely had a lot of notable characters. It's hard to keep track. If you'd like to see more of this series, be sure to let me know who's next in the comments. Don't forget to follow me on Instagram to chat, and I will see you all next time. Bye!


Welcome everyone, thank you so much for joining us today. We are so excited to be here to talk about some of our experiences building globally accessible communities. So just to get a quick read of the room, who here is from Europe or the United States? All right. Who here is not from Europe or the United States? All right, who is building global communities? Who is part of a global community? That one's kind of a trick question because like we all are. Awesome. All right, so just a quick overview of what we're going to be discussing today. So we will start off, you'll get to know us. You'll get to know a little bit of the communities that we're working with and we'll be pulling some examples from. We are going to define what exactly we're talking about when we say global community and then why they're so important. Then we'll get into how to communicate the value, how to build your community and how to advocate for your community as well. So a little bit about us to start, I'm Caitlin Barnard. I run our global community programs at Kong. It's one of the most downloaded open source API gateways and we are also the creators of Kuma. Kuma is an open source service mesh and a project of CNCF. So prior to that I worked at CNCF where I contributed to the Kubernetes community and one of my biggest passions in the open source space is growing both code and non-code contributions because there is such a wide range of talent that our ecosystem can take advantage of. I'm Hannah Ouellette. I'm the community manager at NGINX which is the most widely used web server in the world. It can also be used for load balancing, reverse proxying and more. NGINX is an open source project that's been around since 2008. Prior to NGINX I was at Postman, an API testing platform and before that I was actually at Kong which is where I got to know about the open source community and where I met Caitlin. All right so a few of the examples that we're going to be pulling from the first is Kong. So Kong has over 190,000 community members. One of the areas we've really invested in over the past years our meetup community so we have over 12,000 members there across 46 different countries so that really gives you an idea of how distributed our community is. We also consider Kuma part of that extended community as well. Yeah when I was at Postman there are about 19 million users mostly on the free tier and about 22,000 people on the forum that I managed. Most of the community engagement with Postman is actually within the app for collaboration but I still learned a lot about community management that I bring to my open source work today. NGINX has our largest community presence in the US, China and EMEA. We have folks introducing themselves in our community slack from Turkey to Tunisia to Texas. And then obviously we're at KubeCon so we'll be pulling from some of our experiences within the CNCF community and Kubernetes as well. So what is a global community? A global community are a group of folks that are drawn together with a connection between economics, politics, interest groups or more. We're focusing on global developer communities which are drawn in connection to interest in technologies. A global community accepts and encourages contributions from all around the world. This is in contrast with a local community where someone might be focused specifically on a certain continent or region. Often US and Europe based companies do focus on one continent or region and there's good reason for that. It's often where the employees are, it's where the money comes from and therefore where the resources go. However, a truly global community makes it easy to participate across regions, geographies and cultures. So global communities are important because of talent and opportunity. There are millions of developers around the world who don't have access to opportunities to get themselves out there on stage or to participate in communities to contribute to technologies. Having a global community creates these opportunities and celebrates the talents of underserved regions. So diversity in representation, so diversity of ideas and getting new perspectives on software is so crucial, you know, viewpoints that we don't currently have. We tend to get really inward looking when we only focus on our own region and then it often becomes that echo chamber, right? And it's also important to see people who look like you doing the things you want to be doing. Representation really does matter, especially when you're getting involved in something new for the first time. And then that all creates velocity and momentum. So mobilizing your global community allows you to move quicker and more efficiently, scaling adoption and jumpstarting innovation. So investing in the community is sometimes a difficult conversation to have because it really is that long tail investment that has less direct attribution to the bottom line of your business. So at Kong we talk a lot about the open source flywheel and how we use that life cycle to grow open source adoption and continue innovating. So today I want to talk about that in the context of the community flywheel because it functions in a really similar way. There's a lot of different versions of this, but this is the version that I'm going to use as an example for our purposes today. So the idea is that you want to build your community to lead to that long tail adoption. Community isn't an investment that you make and then reap the benefits of overnight. It's an investment in future champions, users, contributors of your technology. So by building your community you lead to that increased adoption, those passionate users turn into champions, those champions then provide really valuable feedback on your technology that allows you to either improve on your existing technology or innovate on new market needs and then that leads to that long tail repeatable adoption pattern. And that's really where the true value of community build lies, building that strong foundation of users, contributors, champions that allow you to spin that flywheel as fast as possible and increase that long tail adoption. These are oftentimes the people that keep coming back no matter what organization they end up at and they're oftentimes the first adopters of any type of new technology you introduce as well. So different communities have a wide variety of needs that span across cultures, geographies, and regions and as community stewards it's our responsibility to meet these needs where possible. Some regions run into culture challenges that we don't run into in the US and Europe. For example, I was working with a local community leader to host a meetup in a city in Nigeria outside of Lagos and meetups are popular there but most of the venues don't have Wi-Fi available and so members that came were actually hotspotting from their phone. However, mobile data is really expensive so this ultimately was costing community members money to come to a free event. Her request was for a prepaid data plan. While we didn't end up going forward with the meetup for other reasons, we were starting to figure out how to make this work. Another consideration is platforms. Not all countries use meetup.com as their primary meetup platform for example and many use other chat apps besides what we usually use. So for example, WeChat is really popular in China and Japan. The NGINX community in China is largely organized on WeChat that's everything from troubleshooting to event promotion to product announcements. There's also a telegram group for NGINX in Russia where folks are communicating and troubleshooting about NGINX in Russian language and at Postman we had a telegram group called Postman en Español. It was started by some folks in I want to say Colombia that grew to be a whole Latin American region. Employees initially just joined and learned and practiced our Spanish and then eventually helped moderate it. If you're not meeting your community where they're at on these platforms, they might start these areas all on their own for better or worse. It's a great thing when a community takes initiative and is able to drive itself and on the other hand it means that you're losing opportunities for moderation and control. Additionally, passionate enthusiasm from developers also are important resources across regions and it's important to leave door open for opportunities for them too. If you're having a paid workshop or a paid event for example 10 euros to someone here in Europe is really different than that same amount of money for someone in India for example and so by having paid events for community initiatives you might be closing the door on community members across the globe. So let's start with some of the main obstacles that we've run into in building global programs because these can often be a really simple fix but quite a big barrier to entry. You're going to hear me refer to programs a lot throughout this section and a program can really be any type of resource that a community member consumes either virtually or in person or attends things like meetups, events, content, user calls, forums, etc. So the first is complex language and this is one that I struggle with the most personally. So for example we rely on English as our language for our global programs. We don't have the resources to translate everything into multiple languages so we've standardized on English and while many people speak English not everyone speaks English natively, right? So it's really important to avoid things like filler words, colloquialisms, figures of speech like metaphors, idioms, that type of stuff. Keep your language straightforward and to the point while of course maintaining a level of friendliness and then when you're speaking live being intentional with your words, speaking slowly and clearly. So the second piece is localization. So while we don't have the resources to translate every global program into different languages, we do translate regional and local programs where appropriate. So we really rely on our local employees and community members in these cases. I often try to give them a starting point with Google translate and carry it as far as I can and then have them review it to make sure that everything is correct and accurate. This is also where attention to detail is really important. Things like ensuring that the local time zone is correct if they're in daylight savings time or not. If they use 12 or 24 hour time, that your addresses are formatted correctly using Oxford commas or not where they are commonly used. So a lot of times the content should feel like it's coming from a local and you know if you're in doubt bring someone in from that local community who knows for sure. The next is accessibility. So for a lot of global programs, it's going to be hard to pick a time that works for everyone but you can optimize for different time zones. So we do our user call early in the morning Pacific time to cover most of Europe and then we record for anyone that is unable to attend. We try to get that recording out same day so that they have access to it right away and then our information to ask us any further questions. We also are going to start experimenting with later time zones for Asia and then in an ideal world I would love to expand these to regional programs where we have times for North America, Europe, Asia and then tailor the content to those regions specifically. This is also where kind of platform accessibility comes into play. So as Hannah mentioned different platforms are popular in different countries. So for example we're established on meetup for our global meetup programs but ComPASS is more popular in Japan. So we have our local programs, our local meetups on there as well. And then some platforms like Zoom aren't accessible in every country. They're not, it's not even accessible at every company sometimes with different firewall restrictions. So your platform choice is going to depend greatly on kind of what works for the majority of your community members and where they're located. But it's kind of important to pick what works for most of them and then add in those regional solutions where appropriate. And then finally I just want to touch on code of conducts. So this is incredibly important to have in place from the very beginning because it protects both you and your community members by setting a level of expectation of how they should interact and what's appropriate. It also protects you as a company or a community leader to be able to intervene if an issue does arise. So we've based our code of conduct off the contributor covenant. That's what CNCF and Kubernetes uses as well. This is a great starting point if you are creating a code of conduct for the first time or if you just want to make sure that your code of conduct you know covers everything that could possibly come up. So if you've decided to establish a new region first off congratulations and good luck. It is key to get to know folks that are there in the region and have someone on the ground you can talk to for ideas to leverage your local network and to really find out what's going on. Most important when you're trying to establish in a local region is to actually talk to people there and find out what is needed especially compared to the regions you're already in. That shows one you genuinely care and want to have a respectful community presence in that area and two also means you're more likely to get things right the first time instead of learning the hard way which we all do anyway. It's easiest to get started where you have employees and even a single employee can provide good insight or local contacts. And if you don't have employee presence in the region contact your partners leverage the relationship that your channel or biz dev teams have made get to know adjacent communities. Getting to know local communities is also the next step so you could have partnerships or sponsor events. You can build your network out that way. An example from postman was getting to know former Google developer group student leaders and reaching out and saying hey we have this postman community trying to get off the ground champions program and that was able to introduce me to folks who already had previous community experience who already had the resume of building out global communities in their region and who had the passion and enthusiasm that they could drive forward in their professional careers. Also your network is wider than just who you know so you can ask people hey who else to whom should I talk to you in this community who else can you introduce me to. I found it worked really well when I was building out my champions program in Lagos to say I would really like to get to know other Nigerian developers who use postman and have some folks on stage to have multiple representatives from Nigeria. While you want to avoid tokenization folks hearing that they actually want established presence from their country specifically went a really long way in both building those connections and getting people to participate. And importantly representation goes a really long way saying someone who looks like you or acts like you participating in community encourages you to do so the same. If you see someone speaking in Spanish online it might be easier to start responding Spanish and participating as well. If you see someone from your region on stage it might inspire you to be on stage as well. And empower your global community by giving them the tools they need to do things on their own right. So we launched our community organizer program this past year. Shout out to Dahlia who is our amazing global community manager who's in the audience and really spearheaded this. And you know we asked all of our meetup members if anyone wanted to become a meetup organizer. We provide funding swag content when they need it. We provide support but it's really up to them to be the on the ground person organizing these events. So we had a ton of interest but in particular I want to highlight one of our organizers of our Bangalore meetup Avinash. So we have no KONG employees based in India yet. So Avinash has really been organizing these meetups completely on his own. The Bangalore group has quickly grown to be our largest community meetup. We have over 1200 members and regularly 100 people in attendance. You know Avinash is a fantastic organizer in his own right but he has our full backing to go out and really do these things on his own and we're there to help him when he needs it. And then just to expand on our earlier section on communicating the value. So that work doesn't stop once you've established your community. And this is where metrics comes into play because once your community starts growing you can start sharing those success stories. So there's a few different ways to approach metrics. The first is to use common terminology that's already established within your business or your community. So this can be things like monthly active users, signups, general membership numbers like number of Slack members, number of meetup members. This is especially useful if you've standardized on one single hub for your community. But for us we try to be wherever our community is. So we have a ton of different channels. And if that's how your community is you can come up with a metric that's basically total total membership. So add up all the membership across those different channels. The one risky run here is double counting some folks. You can also do total community activities. So things like attended a meetup, started GitHub repo, posted on Slack. This gives you more of that type of engagement metric. And then there's also some tools out there now that helps de-dupe some of these information and automates that tracking. So tools like common room or orbit. A lot of this reporting is already built in and then they are free for non-commercial open source projects as well. This is also a great place to showcase third party metrics. So for example Stack Overflow does a great yearly survey on the developer community and about how 66 percent of developers have some level of influence over technology decisions within their companies. There's also some great studies on top growing tech regions. So Google and Disrupt Africa have done some great reports on the growth of the African community in particular. 19 out of 20 of the fastest growing economies in the world are in Africa. There's over 700,000 developers and startups in Africa have had 1694 percent growth in funding since 2015. But at the end of the day, these are real people behind your community. They aren't just numbers. So sharing personal stories is a great way to showcase the impact of your community. It really allows people to put a face to a name. We do champions profiles that we share out on social media. We do recaps of our local meetups to talk about showcasing our organizers and what the local community is doing there. And then finally, empathy. This in my opinion is the most important way to advocate. I have had the honor to meet and work with people from all over the world during my time in open source. I have learned a ton about different countries and cultures that I wouldn't have been exposed to any other way. And it's really my hope to give back to these communities as much as they have given me. And we have a ton of privilege as tech companies. We have a ton of privilege to be able to invest in these communities and amplify much of the work that they're already doing. All right. Thank you so much. Are there any questions? Hello. My name is Pedro. Just a question. For example, in Nigeria, holding events, is it English speaking or the whole event or typically depending on the country, the local language? Yeah. In Nigeria specifically, it has been English, but we do try to do local languages. So for postmen with our meetups in Latin America, we encourage them to be in Spanish, especially online. We had a couple of Brazilian meetups that were done in Portuguese. When it comes to local events, especially something like meetups, I think that language is really important as an aspect of inclusion. And so encouraging as many local languages as possible is a great practice. When you're growing a community, which do you optimize for? More community members that are only passively engaged? Do you really double down on those that show an active interest and try and create a smaller group? That's a great question. I personally believe in doing both. I think driving awareness to the greatest amount of people is fantastic. And this is going to really depend on what your technology is and how relevant it is to that group of people. But I think casting a wide net is great because you can benefit those people in one way or another and make them part of the community and throughout their journey with you. They can kind of grow and continue their usage. If you have something that's a little bit more niche or more specific to a certain group of developers, then I think curating that smaller group is better. And I think for a lot of programs, that smaller group is better too because it lets people engage and interact and ask questions of each other and network. And that in terms of individual community programs, in my opinion, is a great approach. I personally would focus, if I had to prioritize between the two, I agree with Caitlin on doing both. I personally would prioritize on the highly engaged smaller group of people, quality over quantity, as a step to engaging the people that are further out there. If there are more people that are engaged, it shows that there's something for those other people to join. It gives examples and inspiration for people and, oh, I could be like that too. And it can also help dial in your programs. And so if you're asking someone to engage further by going through one of your programs, having that first group go through is like the canary in the coal mines. Ooh, there's me using an idiom, the exact example of what we don't want to do in our talk. You can use that kind of as the testers for your program as well and dial that in before you open up a wider net. Yeah, it's a great point too. It depends kind of on the maturity of your community. Thank you all. We'll be up here if you have any other questions or want to talk one-on-one. Thank you.


So, within Bioromutant there are many areas for you to explore and loot, but some of them earlier and are truly off limits. Today guys, I bring you two must have abilities to make exploring and just genuinely playing the game so much easier and more fluid. How's it going guys? My name's DP Journey, if you enjoyed the video leaving a like really helps out and if you like what you see and want to see more Bioromutant be sure to subscribe. So there are certain abilities within this game which can assist with combat, but others are there which can help you in terms of exploration at the same time and that's what we check out today. So there are two musts I feel you need to look into. One cast by all points and other one cast side points. So the first one I suggest you take in a look at is indeed Fungi. So the Fungi is an ability which casts four by all points, but it is definitely worth it as it allows you to reach places so much easier which I know you are probably thinking well that isn't that useful, but actually when you use it and get used to it, it's way way more useful than you're thinking right now.  I mean I found myself before unlocking this Fungi ability struggling to reach many certain points at a certain level to a kind of area that I just couldn't quite reach. If I would have had this then those areas would have been explored and I don't know what would have found. So try using this people and I guarantee you will love it and I feel it's definitely worth the points. The next ability I feel you need to check out is the Levitate ability. This one guys will cast you 10 side points so here go a little easy with it and don't waste all your points if you are short, but for those who feel they can spare them and feel they can benefit from what this offers I recommend it. The Levitate is an ability which 100% assists you in battle as you can fly above enemy shooting down at them, but it's another ability which will help you out massively in terms of exploring and genuinely making life easier when it comes to checking this beautiful world out. The Levitate seriously helps out here. So you guys these two months are great and the ones I do recommend early on. What I will say is the Levitate is quite key heavy but the more you level it up the more efficient these abilities will be and the more they will help you out.  But guys on that note the end of the video has arrived if you enjoyed it leaving a like really helps out if you're new around here want to see more bio mutants be sure to subscribe and if you never want to miss a video I upload can turn notifications on by hitting that bell button but guys thanks as always for stopping by and hopefully I'll see you on that next.


they're playing better than a lot of us thought they're more exciting all the stuff we just talked about and it just brings me back to the offseason you say just look at these first four games if you had been willing to sign another starting pitcher maybe tenor hawk is in the bullpen and you don't lose that extra inning game over the weekend if you had been willing to keep justin turner or sign adam duval or even go crazy and splurge on taosca hernandez bobby dollbeck isn't hitting with two guys on in one of those games and striking out you know so you just start to look if you're willing to actually go out and find a lefty for your bullpen joely joely rodriguez isn't pitching poorly into these games so i look at it from the perspective of they should have known someone should have been able to convince ownership hey this team is actually worth spending on you don't need to wait another year give us some more help right now ownership wouldn't do it and maybe the bigger sin is that no one in that front office was able to convince them they've been in it in it each of the last two years they gave up at the trade deadline the team gave up thereafter so like just again from 10,000 feet they're not that far away and the fact that they treated it like they were that far away to me is still perplexing yeah and you know what it is mike it's simple they thought it doesn't matter how good we are because we're still gonna finish last and the math on this one is clear you cannot make the playoffs if you finish last in your division even if you win 85 games they looked at and said the division's too good we're not good enough we're not gonna spend and you know you watch things early uh toronto is getting no hit the last i saw tampon didn't have the best start to the season so you say why did you just give up and it seemed that's clearly what ownership did and they're gonna regret it i think come july they are gonna regret that decision