Talks

A Year of Ruby, Together

EuRuKo 2016

00:00:03.560 our next speaker is Andre Arco he is the leader of the bundle team and DQ the
00:00:09.710 co-author of the Ruby weight book he found it to be together a year ago and he's heard there was how it's been so
00:00:16.850 welcome on stage Andre
00:00:23.960 Thanks uh hi everyone thanks for coming
00:00:29.660 I guess let me introduce myself a little bit as you are all just inform my name's
00:00:36.290 Andre arco on the internet I'm pretty much always indirect that is my internet
00:00:41.540 web page picture you might recognize me from an internet web page I work at
00:00:47.079 Cloud City as a ruby and rails consultant doing architectural consulting and senior dev pairing and
00:00:54.019 other stuff like that if your engineering team could use architectural
00:00:59.660 consulting or senior dev pairing maybe talk to me later I co-authored a book that came out this year it's cool the
00:01:06.050 Ruby way the first edition of the Ruby way actually is the book that I first learned Ruby from way back in the early
00:01:11.780 2000s and so I'm super happy to have updated it for Ruby 2.2 and 2.3 and now
00:01:19.520 i have my own thing with my own name on it that i can use to prop up my monitor when it needs to be taller which is
00:01:24.679 pretty great I lead the team that works on bundler and I guess that and that's
00:01:32.450 an entire different talk i guess it's turned out to be a lot of hard work but a really great way to learn about Ruby
00:01:39.200 and a really great way to interact with kind of the whole community we've recently put a lot of work into trying
00:01:47.600 to make it clear how to contribute to bundler and how to get started contributing to open source so if that's
00:01:53.000 something that you're interested in doing but kind of feel like the way to do it isn't really clear I encourage you
00:01:58.850 to talk to me later either online or here in person and I would love to try and help you out with that the other
00:02:06.049 project that I work on is the one that I've actually here to talk about today which is Ruby together Ruby together is
00:02:11.510 pretty new it's actually been around for like just about 18 months now um maybe
00:02:17.630 you heard of it if so that's really cool if not well I'm going to tell you a bunch more about it right now so what
00:02:24.560 even is a ruby together very very briefly Ruby together is a nonprofit
00:02:30.380 that pays developers to work on Ruby infrastructure like Ruby gems and bummer
00:02:35.390 and the servers that run rubygems org it gets that money from nonprofit members
00:02:42.890 members can be any person or any company that uses ruby and the work that we pay
00:02:47.900 for is free for anyone who uses ruby to then in turn use so what exactly are the
00:02:55.820 details behind that well that's basically what the rest of this talk is about so keep listening the reason that
00:03:02.750 this happened is ultimately ruby has kind of grown up the Ruby community is a
00:03:10.700 lot bigger than it used to be and that means that the Ruby community has kind
00:03:15.920 of outgrown its roots as volunteer-run
00:03:22.480 set of infrastructure right as you've probably noticed bundler makes it a lot
00:03:27.530 easier to use gems than it used to be before long there existed well they're also makes it easier to create gems than
00:03:33.350 it was before bundler existed and so over the the six years that I've spent working on bundler mom the number of
00:03:39.320 gems has multiplied and there are now excuse me there now more than a hundred
00:03:45.230 thousand named gems there are now more than a million versions of those hundred
00:03:50.269 thousand named gems and the number of gem downloads has gone up exponentially
00:03:55.390 how exponentially you ask well in the first decade of rubygems existence from
00:04:02.959 two thousand four ish to 2014 approximately 2 billion gem downloads
00:04:09.860 happen which is super cool two billion that's like a pretty big number right and then 2015 happened and from the
00:04:17.959 beginning to the end of 2015 we served four billion gem downloads so that's
00:04:24.680 like one decade and then twice as much as that decade in one year as you may
00:04:32.150 have noticed that is very large increase I am very sad to say we did not see the
00:04:39.140 same increase in the number of people volunteering to work on Butler and we gems most people don't even realize
00:04:46.470 this but the team that works on rubygems.org is incredibly small it's never had more than four people on it at
00:04:53.010 a time and most often it only has two people on it and the bundler team is even smaller bundler has never had more
00:04:58.919 than two people consistently working on it at any given time and honestly most of the time has only had one person
00:05:04.530 consistently working on it most of the time and all of those team members when
00:05:09.900 I say up to four people what I actually mean is up to four people who have full time paying jobs that are not working on
00:05:16.590 that thing and who sometimes spend nights and weekends and a few volunteers
00:05:22.590 giving up their nights and weekends to the community was enough during that decade that we served two billion gems
00:05:28.680 but it's not enough during the year that we searched for billion gems so let me
00:05:35.789 give a single example from it's a few years back now but this example kind of encompasses all of the points that I'm
00:05:41.580 trying to make in one thing so it's really a good illustration so about three years ago rubygems.org went down
00:05:48.840 completely and it was down for like an entire week and it turned out that the
00:05:54.270 underlying reason that that happened was that there was a security issue depending on how long you've been doing
00:05:59.490 ruby stuff you may remember there was a thing where if you were really clever with your yamo you could make a rails
00:06:05.490 app execute any code you wanted and so the rubygems.org team at the time was on
00:06:13.349 top of things enough to bump the rails version so we weren't obviously vulnerable anymore but hey it turns out
00:06:21.349 if you decompress a dot gem it's really just a tarball there's a dot yambol
00:06:28.500 inside that tells you all about the gem and somebody realized oh hey I could put
00:06:35.700 that clever gamble that makes Ruby execute any code I want inside the yam
00:06:41.250 well inside the tarball that rubygems.org will read when i push a jam and they pushed a really cleverly
00:06:48.750 constructed gem and they took over the entire rubygems.org server
00:06:55.500 so we had to take down the server completely like they had had access to
00:07:02.020 run literally any code that they wanted on the server we had to make completely
00:07:07.060 new servers from scratch and this is really the thing that took forever we had to download every single dot gem in
00:07:13.210 existence and run a checksum against it and compare that checksum to check sums
00:07:18.340 from other gems that we've gotten from mirrors and from people who happen to have collected most of the gems that had
00:07:24.670 ever existed before the server was hacked the problem was we knew that the
00:07:29.860 hacker had had enough access to have potentially replaced any gem file with anything that they wanted to replace it
00:07:36.010 with and so we knew that if we just brought the server back up it was entirely possible that rails was now a
00:07:42.790 Trojan horse and the next person to run gem install rails would get owned and so
00:07:47.890 since we had no guarantees about any gem file that existed we spent I want to say
00:07:54.250 was about four days just downloading gems and check something home and comparing them to other gems that we've
00:08:00.100 gotten from mirrors and in the end it turned out that the hacker had been
00:08:05.110 relatively benevolent and hadn't actually replaced any gems with trojan horses but that didn't mean that we
00:08:11.980 didn't need to check every single gem before we could let anyone install them again and so the part of this story that
00:08:21.280 really illustrates the ongoing problem that Ruby together exists to try and help is that while rubygems.org was down
00:08:29.040 literally hundreds of developers showed up online and said oh my boss said that
00:08:34.419 I can help like please how can I help I just want to get rubygems.org back up faster and I don't know how many of you
00:08:41.890 have read the mythical man month but a hundred developers working on a week-long problem does not mean that the
00:08:48.250 problem is solved in 15 minutes not a
00:08:53.410 single one of those volunteers could do anything useful none of them had any idea how our existing servers worked
00:08:58.870 none of them had any idea how you set up a working set of new servers
00:09:04.199 none of them were familiar with any of the things that needed to be familiar
00:09:09.269 with to like actually do helpful work and then of course after that
00:09:16.879 rubygems.org came back up and at that point we went around and followed up
00:09:22.740 with all of those people who had offered to volunteer and we said hey we actually have some time to work with you now to
00:09:28.709 familiarize you with the system so that you could help us in the future and we got exactly zero people who were willing
00:09:37.379 to help now that it was back up ah and I
00:09:43.769 guess the the lesson that I learned from that is that when there's not an emergency no one's really interested in
00:09:50.339 contributing back to make sure that our community resources continue to work and continue to be resources for the
00:09:56.790 community um so this is the point at
00:10:02.249 which almost everyone says to me but what about those companies that pay people to work on open-source full-time and I guess businesses are ultimately
00:10:11.399 answerable to shareholders and shareholders ultimately say give us profits and most businesses seem to have
00:10:19.649 kind of the mindset that says hey we can get all the benefits of the community by
00:10:24.689 doing nothing so let's do that and while
00:10:30.449 there are some exceptions and over the years I guess this list is maybe I don't
00:10:36.839 know there's there's a few Engine Yard Sun 18t Heroku Red Hat Shopify github
00:10:42.870 other companies but and this is really an illustration of how it's not a
00:10:48.899 solution at one point in time engine yard by it self employed the entire Rubinius team the entire day Ruby team
00:10:56.149 everyone getting paid to work on Rails and everyone getting paid to work on Butler one company and then not too long
00:11:05.249 after that they changed their mind and when they decided to stop the jruby team
00:11:14.519 had found another company to fund their work but Rubinius no longer had a full-time team and rails no longer had any full-time
00:11:21.579 developers and bummer no longer had any developers of any kind getting paid to work on it today for example if a single
00:11:31.120 Salesforce executive changes their mind Ruby core is going to have a really bad time and so one of our goals and one of
00:11:41.019 like the the driving forces behind making Ruby together this kind of nonprofit is to deliberately spread the
00:11:47.949 cost across many companies and across many people because I totally understand that individual people will have
00:11:54.399 financial ups and downs and I totally understand that individual companies will have financial ups and downs but
00:11:59.790 these resources are for the entire community and the only way that we can
00:12:04.920 sort of make the entire community able to use them is by making the entire
00:12:09.999 community where we get the resources from and so because of the way that Ruby
00:12:16.990 together works a single company changing their mind or needing to cut costs no longer means that our entire plan is now
00:12:23.769 gone so the way that I wound up starting
00:12:33.519 Ruby together is after working on bundler and working a little bit on rubygems over the last six years this
00:12:41.139 set of problems that I just told you about was really clear to me but it
00:12:46.600 wasn't really clear to other people right like if if you're not having a problem it's hard to understand that
00:12:52.300 there's like a problem coming that you haven't hit yet and Butler and Ruby gems
00:12:59.230 have to be perfectly clear in the past always manage to get along with volunteers doing the work companies have
00:13:07.179 built huge wildly successful businesses on top of Ruby open source and that makes everything seem pretty okay right
00:13:15.480 and so kind of seeing this coming where it we weren't going to be able to scale
00:13:22.300 to continue to support the community I actually spent years like trying
00:13:27.880 different experimental things like can we do support contracts can we do
00:13:32.890 feature bounties can we do Enterprise only features can we you know I tried
00:13:38.130 everything I could think of I tried everything anyone I talked to could think of and and ultimately on the one
00:13:48.100 hand none of them were like a big enough improvement for a company to really be super interested in paying for them but
00:13:54.690 while they still weren't convincing for companies to pay for they took a ton of
00:14:00.400 time away from being able to actually just work on the open source projects and so that really none of those options
00:14:09.460 worked out in the end the thing that actually made all of this happen was
00:14:15.670 that there was one company that just said hey would it be easier to work on bundler if we just gave you money and
00:14:22.380 once I recovered from that question because it was shocking I said yes and
00:14:30.460 stripe actually just said okay here's some money and that was amazing and so
00:14:36.940 because of that money from stripe I was able to research different kinds of nonprofits I was able to hire a lawyer I
00:14:42.580 was able to found Ruby together as an actual us nonprofit and we're a specific
00:14:48.370 kind of nonprofit what the US government calls a trade association so other trade associations that you may have heard of
00:14:54.220 include the Linux Foundation the jQuery foundation the sequel light foundation and the American Dairy Farmers
00:14:59.650 Association I guess the underlying idea there is that many people and companies
00:15:07.180 from that trade or kind of profession all pitch in money together and by
00:15:13.750 spreading that cost out across the community you're able to do things that no one individual company or person could have done by themselves and the
00:15:21.070 got milk ad campaigns are actually a really good example of that where the American Dairy Farmers Association is
00:15:27.610 able to buy really expensive nationwide ad campaign and television commercials and
00:15:33.790 billboards and magazine ads and it's because all of the dairy farmers are
00:15:39.580 working together to get these ads that help all of them by advertising milk so
00:15:46.269 each trade association uses dues from members to benefit everyone in that trade even the people who aren't dues
00:15:53.350 paying members if you're a dairy farmer and you don't pay the American Dairy Farmers Association got milk still helps
00:15:59.740 you out and if you use Ruby what Ruby together does still helps you out even
00:16:04.870 if you're not giving money to Ruby together so speaking of benefiting
00:16:10.149 everyone let me give you a brief rundown of what we've gotten done over the last year year and a half so the big
00:16:17.200 underlying thing that Ruby together has done in the last 18 months is that we paid for 1100 hours of developer time
00:16:24.630 and that sounds like a really big number I guess it is a really big number it's
00:16:31.810 much much bigger than I thought would be possible initially and we've gotten a
00:16:37.149 lot of stuff done with that time so let me briefly give you a rundown of what we've gotten done and some of the work
00:16:42.790 that goes into keeping all this infrastructure actually working so we've released five significant versions of
00:16:48.430 bundler in the last 18 months in month or 1.9 we started using a new dependency
00:16:53.829 resolver called Milenio which was funded by a grant from stripe and is actually now shared between bundler and Ruby gems
00:17:01.300 and cocoa pods and that means that anyone who finds a bug in any of those things and gets it fixed means that
00:17:07.150 those bug fixes are now shared across multiple things that resolve dependencies and that's pretty cool in
00:17:12.990 bundler one point ten we added a lock command we added optional groups we added conditional groups and this is my
00:17:19.540 favorite we added the ability to mute post install messages one gem at a time so now you can never be told to HTTP
00:17:26.169 party hard again in bundler 1 point 11 we dramatically improved error messages
00:17:33.100 across the board and we dramatically improved the errors that you see when
00:17:38.230 have conflicting requirements and the resolver is unable to successfully complete in wonder one point 12 we
00:17:44.980 shipped the results of a three year long project to replace the metadata
00:17:50.049 information about gems I guess this is
00:17:55.059 maybe not common knowledge but in every version of bungler between 1.1 and 1.2 times bundle install it has to re ask
00:18:03.730 the server for all the information about every single gem that it might need to install this takes a while and it's why
00:18:12.190 when it says fetching gem metadata there are a bunch of dots every dot represents another round trip to the server because
00:18:18.850 it just found out about some more gems but it needs more metadata about and so the new index format completely does
00:18:27.190 away with that system and you're able to keep information about gems that you've downloaded in the past and not have to
00:18:33.730 download it again it's a huge improvement in wonder one point 13 we
00:18:40.270 thanks to that new index format we were finally able to support required ruby version on gems and so now it is
00:18:47.410 theoretically possible I hope we worked out all the bugs to put a ruby version
00:18:52.419 in your gem file and then stop trying to install gems that don't work in that ruby version right it's amazing rocket
00:18:59.530 science we also added a doctor command to fix broken compile gems and we added
00:19:06.280 the ability to add and remove platforms so if you want bundler to resolve on Java and on non Java Ruby you can now
00:19:13.900 explicitly opt into that or opt out of it we also ran multiple Summer of Code
00:19:20.620 projects as part of Ruby together we managed to Google summers of code and
00:19:27.660 two rails girls Summer of Code teams for a total of I think about 11 students
00:19:36.130 across those two summers in the last six months since our more than six months
00:19:42.070 now in the last nine months since the beginning of the year we've actually taken over maintenance of rubygems
00:19:49.230 bungler depends on it and in another example of why open-source jobs are not a solution two
00:19:57.040 years ago AT&T interactive wound down there Ruby open source Department leaving Aaron Patterson and Eric Hodel
00:20:04.630 out of a job Eric Hodel had been working on rubygems as part of his job at AT&T
00:20:09.640 interactive and in the two years since that was no longer his job rubygems
00:20:15.100 hasn't had a maintainer there's been there was I'm gonna get this number
00:20:20.320 wrong I think there was just one security release that was basically an emergency and there were bugs that were
00:20:28.450 two years old with no fix so since the start of this year we released one minor
00:20:35.260 version and eight bug fixed versions of Ruby gems which is pretty exciting and in those versions we fix bugs ranging
00:20:41.530 from one week old 22 years old I am very happy to say that the two year old bug
00:20:47.020 is now squashed Windows users are able to install compile gems again on Ruby
00:20:54.010 versions older than 2.2 yeah on the
00:21:00.460 circuit thank you thank you
00:21:06.010 as very exciting I'm very excited on the server side we have also done a lot of
00:21:11.740 work both on the rubygems.org rails app and servers and on the bundler
00:21:17.950 dependency API Sinatra app and servers it's a long story I've actually given an
00:21:23.380 entire talk about why they are two separate applications what is that
00:21:29.290 called rubygems extreme makeover something something you can find it
00:21:34.720 online anyway so for long legacy reasons
00:21:40.750 there are two completely separate applications as a result we actually have to do operations work on two
00:21:47.140 completely separate systems hosted on completely separate platforms one system
00:21:52.210 for gem metadata and one system for the actual gem files in the last year and a
00:21:58.120 half we've applied more security patches than I could count in a timely manner
00:22:03.310 yes we've deployed the server side part of the new compact index format that
00:22:10.420 funds our one point 12 uses and we even actually managed to port the bundler API into the main rubygems.org app which
00:22:18.850 means very very soon we will only have one platform to do ops on instead of two and I'm very excited about that as well
00:22:24.970 um we also switched or i guess i should
00:22:30.820 say we've started using fastly as our CDN and we've also done a ton of work to
00:22:36.450 migrate rubygems.org to BCD and agnostic in the past we'd used cloud front
00:22:42.970 because it was easy to integrate with but that meant that we want up with a ton of hard-coded engine X configuration
00:22:49.060 and rails app configuration that only worked with cloud front and when we had
00:22:54.310 problems with cloud front which as the person who looks at the tickets every
00:23:01.150 few weeks someone would say hey this gem doesn't exist and it would turn out that that gem only didn't exist in canada or
00:23:07.480 only didn't exist in south america or only didn't exist and and so Club
00:23:14.860 thought was very frustrating to troubleshoot because all you had to do was wait one three days and it would suddenly be fine
00:23:20.270 but like what do you tell the guy in Canada for that one two three days so we
00:23:26.790 migrated rubygems.org to be CDN agnostic so that we can actually use any CDN and
00:23:32.549 we've actually gotten a new CDN with more data centers and more visibility
00:23:37.620 and control for us to troubleshoot and so nowadays you can actually get gems
00:23:43.200 from a nearby data center instead of from us west which is where every
00:23:48.360 request had to go even if it was eventually going to go to a CDN in the past on top of proactive maintenance
00:23:56.210 we've also handled a bunch of incidents paying developers means that you can afford to be on call which is really
00:24:01.980 cool it also means that you can afford to prioritize fixing failures because
00:24:07.650 you're still getting paid you're not having to stop getting paid in order to fix incidents which is also very cool so
00:24:15.480 the Ruby together team has handled multiple incidents involving rubygems and the bundler API over the last year
00:24:21.510 and we've been able to restore everything to full operation with very minimal downtime like I obviously I
00:24:28.110 can't prove this but believe me when i say rubygems.org would have been down more and for longer if we hadn't been
00:24:34.350 paying people to make sure that it stayed up one more thing that we did we
00:24:40.830 build a completely new tool to help people manage gems um as we talked to
00:24:45.960 people who were joining Ruby together a thing that we kept hearing over and over is we really need a way to have our own
00:24:54.720 internal gems and we really need a way to keep copies of the gems that we need from rubygems.org somewhere locally that
00:25:01.380 we can get to quickly and gem staff actually does both of those things it's pretty sweet you can run it on your
00:25:08.070 laptop to avoid downloading gems from rubygems.org twice you can run it in your office to keep a local copy so that
00:25:15.780 you can install every developer machine really quickly and you can run it in your data center so that when you deploy your gems are coming from you know like
00:25:23.669 the next rack over rather than coming from a multiple data centers away on top
00:25:28.980 of that it acts as a server private gems you can put all your company's internal gems on your gem stash that you keep in
00:25:34.590 your data center hopefully everything will be happy I would love for more people to use gem stash this is a direct
00:25:41.429 result of us having time to be able to pay people to work on stuff that the entire community can use starting to
00:25:50.220 wrap up later this fall we're going to release bone the one point fourteen and then bundler 12 point 0 after that so
00:25:57.570 when we were designing Don there one point 0 we made a bunch of trade-offs that were based on a world where thirty
00:26:04.409 percent of rubios still used ruby 1.8 and they were based on a world where
00:26:09.470 fifty percent of rubios weren't even sure that a dependency manager was a good idea and those old trade-offs some
00:26:19.080 of them still make sense but some of them are actually pretty problematic nowadays it would surprisingly to me
00:26:28.110 people realize that a dependency manager is actually a good thing that you would want basically all the time and we don't
00:26:35.220 actually use ruby 1.8 that much anymore so it would be cool to be able to stop supporting ruby 1.8 so the raw
00:26:43.950 functionality isn't going to change but the the interface will change a little bit and the the way things work in the
00:26:52.020 background will change a little bit and really it'll just mean that things are better and easier to use and work a
00:26:58.950 little bit better and a little bit faster because we no longer have to keep things working in the old way that they
00:27:04.049 always used to everyone will be able don't freak out everyone will be able to
00:27:10.049 keep using bundler one and one or two at the same time you can have some projects on one in some projects on the other
00:27:15.690 that's really the other big breakthrough that we made this summer so I'm really excited about their improvements that
00:27:21.960 this will make possible and I'm really excited about sharing all of that with you like maybe later this fall or maybe
00:27:27.480 early next year looking a little bit farther forward into the future the last
00:27:33.390 thing that I'm super excited about I spent six years is basically sad that rubygems and bone
00:27:41.340 there are two separate things because they do fifty percent overlapping stuff
00:27:46.950 and they have forty percent overlapping code that tries to do the same stuff and
00:27:52.140 almost almost almost does the same stuff but it doesn't quite and it's super
00:27:57.720 frustrating to try and keep those two things in sync when it's really two completely separate code bases and so we
00:28:03.330 actually have a plan to like get those code bases into one place and stop re-implementing everything across
00:28:08.880 projects and that's going to be super awesome so after been there two comes
00:28:14.160 out the main focus of the combined bundler and Ruby gems teams is going to be getting the two code bases together
00:28:19.170 into one thing and then we will release bundler and Ruby gems three-point Oh from a single code base it's going to be
00:28:26.100 awesome so somehow this is working the
00:28:31.920 last year and a half has been honestly more successful than I expected it to be
00:28:37.040 Ruby together is paying developers for work every single week we fixed more
00:28:42.060 bugs and we made more progress on Butler and on rubygems in the last year then we managed in the three years before that
00:28:49.820 we started out super strong and we saw new companies and developers signing up every single month for an entire year
00:28:56.100 and for the last six months even as we set new hours for paid records for new
00:29:03.630 records for paid hours even as we've managed the google Summer of Code project for all of Ruby even as we've
00:29:10.620 made these really exciting plans that I am just ecstatic about to bring rubygems
00:29:15.630 and bundler together membership has been totally flat we've seen a few new members we've seen a few members leave
00:29:21.800 overall we're in the same place after 18 months as we were after 12 months so we can consistently pay for several people
00:29:29.190 for a few hours a week but we can't even afford yet to pay to developers halftime
00:29:36.350 some companies like stripe as I mentioned before and code minor 42 in base camp and Travis New Relic Airbnb
00:29:43.620 few others have stepped up to support us with actual money but honestly most
00:29:49.080 companies tell us this is a great initiative we're so glad this just keep it up we haven't seen any
00:29:57.860 companies significant companies join in the last six months and if that keeps up
00:30:03.110 we can't keep doing this we're eventually going to recreate the old
00:30:08.750 world of unsustainable volunteers burning themselves out as we slowly lose the ability to pay them so in the end
00:30:16.640 what Ruby together offers for individual Ruby developers is pretty straightforward it's free tools and it's
00:30:22.940 free hosting and you're able to share Ruby code with anyone and use anyone else's Ruby code and what we offer for
00:30:30.140 companies is a little bit more complicated but still pretty cool and it's a cost so low that it would only
00:30:36.920 pay for 10 or maybe 15 hours a week per month and instead you get the benefits
00:30:42.740 of one or two full-time developers working on Ruby infrastructure directly benefiting your company we're working on
00:30:50.240 that and so for now we're asking help us be able to work on bundler and Ruby gems
00:30:56.360 and Ruby gems org and all of those things go to ruby together org sign up
00:31:03.470 take ruby together org to your managers get them to sign up and everything that
00:31:09.680 we build with the money from the community will be freely shared back with the community and that's what Ruby
00:31:15.350 together is really
00:31:29.110 Thank You Android the work that you do for the community just amazing you know well I guess no we just take all these
00:31:37.250 tools and disgusting for granted it's actually so many people working behind that and it's so hard so thank you very
00:31:44.000 much okay
00:31:54.150 this Mike oh hello uh can you put my computer back up real fast also I
00:32:04.480 brought the swag everybody can get stickers I've so many stickers you should come get stickers I have ruby gem
00:32:09.880 stickers and gem stash stickers and bundler stickers and Ruby together stickers and and this is a world
00:32:16.960 premiere I have fancy rui together pins if you are Ruby together member if
00:32:23.950 you're not a member go to ruby together org right now and if you are a member or
00:32:29.170 as soon as you are a member come to me and I will give you a cool pin all right
00:32:42.260 you