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