00:00:21.439
Thanks. I'm also a little bit banged up after that. Sorry about that.
00:00:29.199
Anyway, I've run into this case a lot where you're working on one test.
00:00:34.239
You run it and it's fine, but then you run the same thing in your test suite and, for whatever reason, it's not fine.
00:00:41.360
It's taking longer than I had hoped. There it is.
00:00:47.920
This is the same test, and it runs fine on its own. You don't know why. There's probably some leaky test that's not doing its teardown properly, leaving some state over, and it's mucking up tests downstream.
00:01:05.280
I was using a script for a while that did an operation inspired by Git bisect to go and bisect the files in your test suite, keeping cutting it down until it found the one test with the leaky teardown.
00:01:18.720
At the encouragement of some coworkers, I decided to turn this into a Rake task. You can run this Rake task and, while it's going on, it will cut it in half, see if that makes it fail, then cut the other half, and keep narrowing it down until it finds the one test that fails.
00:01:32.240
It's failing while this is going on.
00:01:37.600
I'm the guy who broke the 1-9 production deploy at New Relic. I'm also the guy who fixed it, so at least I cleaned up my mess. This is not a Rails app; that's how it's so fast. This is the Ruby agent, which I work on at New Relic.
00:01:59.680
Well, it was the agent that broke the deploy, so I had to go and fix that real quick. It narrowed it down to this one test — a New Relic agent test that's breaking that other version number test we were trying to do.
00:02:21.480
If we look, I cheated for purposes of this test. This is the one that we want not to fail. Upstream, there's this version test that just says fail to true. The moral of the story is that this will show up if you don't do your teardowns properly, or your setups properly, depending on which side you want to cut it on.
00:02:40.959
Hopefully, this will help you. By the way, my mouse is not going to work. Also, my text resizing isn't working either.
00:02:58.000
Anyway, it's a gem. It's on GitHub. You can use it. It's very new, so tell me if it doesn't work. Thanks.
00:03:25.280
Okay, I'm Rob Head, and I worked for Pivotal Labs for two years. Now, we're starting a new lab here in Oregon called Zeal.
00:03:31.519
I'm from Ashland, and that means I'm going to talk about the deeper enlightenment of Agile and how it applies to mysticism. So this talk is called Ruby and Rumi, or why Agile works.
00:03:49.840
Okay, so sit, be still, and listen because you were drunk and we're at the edge of the roof — for real. That's a real quote.
00:04:07.840
This is my first Rails project in 2006. Look at that design work!
00:04:13.599
So this woman teaches people how to not be terrible people for a living. She has a business called Virtues Training, inspiring, empowering, and transforming people to achieve their potential.
00:04:20.160
Okay, that's cool. It got me thinking about these issues of virtues like courage, patience, respect, service, and humility.
00:04:33.520
I started to think, maybe philosophy, mysticism, and even religion are not about invisible friends or feeling superior, but maybe they're about trying to develop our character.
00:04:44.560
There's this guy, Rumi, who was a mystic poet in the 13th century. He was Afghani and Persian. Has anyone read any Rumi?
00:04:55.280
He was a mystical poet known for his beautiful headgear. He said this about courage, which is one of the virtues I was reflecting on: "Start a huge foolish project like Noah. It makes absolutely no difference what people think of you." I like that.
00:05:13.360
I have a tendency to do stupid things that people think are ridiculous, so I started to think about who else has done foolish projects.
00:05:25.759
Speaking of foolish projects, Matt decided there weren't enough programming languages in the world, so he created Ruby. He didn't do it just for the sake of doing it; he had this virtue in mind. He said, "For me, the purpose of life is partly to have joy." Programmers can often feel joy when they concentrate on the creative side of programming.
00:05:43.680
So Ruby is designed to make programmers happy. I love this guy. I met him for the first time last week, and it was an amusing experience.
00:06:00.560
Anyway, other foolish projects exist. Some punk kid is going to beat .NET, which would be built by the most powerful company in the world, but he did. This is not the first time we've started to think about what virtues make coding work.
00:06:18.319
Larry Wall had an amusing talk where he discussed laziness, patience, and hubris, but that's not really what we're talking about here. Let's talk Agile.
00:06:35.840
Agile is about larger iterations, cycles of action and reflection. It happens on a minute, daily, and iterative level.
00:06:54.160
I learned this from Rob Me, who anyone who's taken the RPI, which is Rob's programming interview, knows.
00:07:01.120
In 45 minutes, he knows whether he wants to hire you. The first thing he's looking for is empathy because if I'm a jerk or you're a jerk, it sucks.
00:07:18.400
We have to develop our character to become better pair programmers.
00:07:31.759
So why does test-driven development work for these things? Okay, I'll just jump to the end: tell the truth.
00:07:50.319
So why do these things work?
00:08:02.240
I want to tell you about a gem that I released this afternoon called 'Dude.' It came up during a pairing session I had.
00:08:10.240
We hid an exception, made fun of each other, and started making Big Lebowski references. So I thought, let's do something fun with it because Ruby should be fun.
00:08:25.280
I asked Twitter: "Hey, can someone make a gem called 'Lebowski' that monkey patches error messages, frequently appending 'dude' to your errors?" But after a week, no one did it, so I did it myself.
00:08:54.880
It's not that hard; it's like eight lines of code. The issue I faced was loading the code in IRB.
00:09:09.840
I wrote a nice little description of the issue I encountered, and I cc'd AVD because he's smart about exceptions.
00:09:24.720
I want to be able to grow this gem so it doesn't just append 'dude' to everything because that's kind of boring.
00:09:35.600
If you have an idea about how you could override a nil error so that it’s funny or add some randomization to your error messages, let me know.
00:09:50.560
Fork it, make a pull request, and you can use it in your repositories.
00:10:01.760
You guys look different from up here, like the new pope. Is there a new pope yet?
00:10:07.200
No, I don't think so. Anyway, thank you.
00:10:14.880
This is sort of a work in progress. You don't need to plug in because there are currently no slides. This is my slide, and I have four minutes and 43 seconds, so I'm going to go as quickly as I can.
00:10:30.000
So, don't be a poser. Are there any designers in the house? Keep your hand up if you are a designer that lobs PSD files over the fence.
00:10:50.320
Awesome. See, it's 2013. So why are so many web designers still thinking they're web designers if they are just delivering static images?
00:11:07.680
It starts with false assumptions about the relative cost of potential solutions and fails to fully convey the user experience.
00:11:20.000
How many people have received a design spec or user stories that are out of alignment? Yeah, it happens quite often.
00:11:39.920
I used to be that guy, a print designer, thinking I could design for the web just because I liked using apps. That's something we're growing out of, but it’s still around.
00:11:54.400
It's amazing how many consultancies are still working with PSD files. Oftentimes, I ran into functionality scoping issues because of unrealistic designs.
00:12:13.120
At some point, to better understand the medium and communicate design intentions, I learned HTML, CSS, and basic JavaScript.
00:12:28.839
My eyes were opened to the power of working in the medium during the design process.
00:12:35.680
I was given the opportunity to design for apps and create working prototypes, which I handed off to developers. They found it incredibly helpful.
00:12:48.480
There was a lot to refactor because it was designer code, but I started pairing with developers to develop functionality.
00:12:59.680
This mutual understanding allowed me to learn how to write ERB files and basic logic.
00:13:07.760
Today, we work with responsive grids and iterative design — old methods no longer apply.
00:13:25.760
I'd love to talk more over a beer if anyone is interested. Thank you.
00:13:30.880
Hi, I’m Shane. I’m speaking first tomorrow. If you aren't totally hungover, I'll see you then.
00:13:36.800
I had some slides, so who knows about Rubinius? Rubinius is available for use on Heroku due to some work by Terence Lee and Andre Arco.
00:13:44.959
In your gem file, you can specify the version of Ruby you want and which implementation. It's simple enough.
00:14:04.640
You say 'ruby' followed by a version number, like '1.8' or '1.9.3'. You can specify your suspense as an argument.
00:14:10.240
If you want to run your code in 1.9 mode on Heroku using Rubinius, that’s all you've got to do.
00:14:23.840
When you push to Heroku, it will discover and switch rubies.
00:14:30.880
Thank you.
00:14:32.880
Sweet! Alright, five minutes. Since I'm at Ruby on Ale, I figured I should share some cool tips for having a better bar experience.
00:14:41.280
A little background, I'm a third-generation bar owner. My family owns bars in Chicago, where I grew up.
00:14:49.520
I figured I could share some tips since we're going off drinking later.
00:15:05.440
In my perfect world, when you walk into a bar, there’s a setup similar to this. Those bottles you see are call-level drinks; they’re expensive.
00:15:12.960
If you just ask for a gin or whiskey, it's going to come from the well, which is much cheaper. Be careful, as it could be swill.
00:15:25.440
So, if you want something nice, call it out by name. Are there Starbucks aficionados here? I am one.
00:15:37.840
When at a bar, there’s a short or tall glass depending on what you want. A short can also be a rocks or highball glass.
00:15:49.760
Tall can refer to a Collins or pint glass.
00:16:02.160
If you’re a whiskey drinker, you can ask for it neat in a short glass, where nothing touches it.
00:16:10.560
This is Ruby on Ale, so how about pouring beer?
00:16:17.760
Raise your hands if you’re home brewers. Alright, let’s review how to pour beer.
00:16:29.440
Start with a clean glass. You washed it, right? Start pouring at a 45-degree angle, aiming for the bottom third of the glass.
00:16:40.640
When it's about halfway full, tilt the glass upright to build a beautiful head. This is the flavor part.
00:16:54.240
If you get flat beer, you can try to send it back.
00:17:03.200
A cool bartender trick is to take a straw and whisk the top quickly.
00:17:12.640
Hopefully, by now you have a head that looks about two fingers in length, which is good to enjoy that beer.
00:17:21.680
Also, remember there's customer service involved. Don't be that person who critiques the bartender.
00:17:34.240
Be kind; introduce yourself to the bartender. Get on a first-name basis. It helps when the bar is packed.
00:17:47.680
And of course, don't forget to tip. Service industry workers often get pinched by taxes.
00:18:02.080
Hopefully, those tips help you. Thank you.
00:18:12.000
Hi, I'm Jason Clark, and I'm a Ruby agent engineer at New Relic.
00:18:20.000
Today, I’m going to show you how to write a profiler in 50 lines of Ruby.
00:18:25.600
A profiler is an application or library that provides insights into your code execution. It observes what's running and provides useful information.
00:18:42.560
Profiles are often collected by instrumenting methods, but that can double the time it takes for an application to run.
00:18:58.720
We'll take a sampling approach, peeking at the state of our stacks intermittently to construct a picture of our application's behavior.
00:19:12.640
Let's imagine this is our app: a basic web stack where we call through the server down to the SQL.
00:19:26.800
We observe our application at various points in time, collecting data useful for building a frequency profile of what's happening.
00:19:42.720
The code we need to execute runs beside our application code, spinning off into a separate thread that periodically sleeps.
00:19:56.640
Every so often, this thread will wake, and we'll take a sample for our profiler.
00:20:09.440
The most complex code is actually pretty simple. We get a list of running threads and iterate through that list.
00:20:26.080
When we get a particular thread, we can take a backtrace, which has a series of lines that represent the current execution state.
00:20:40.640
Once we've gathered these lines, we can perform a basic count on how many times we've seen each line.
00:20:55.760
With this information, we can build something that looks like a simple report.
00:21:13.920
These stack traces can get deep, and many lines of code can show up. We'll note instances of our code executing.
00:21:28.720
This is just the tip of the iceberg. There's much more you can do with the information gathered from backtraces, like building call trees.
00:21:44.320
Code for this sample is posted on GitHub, and I’ll be giving a longer version of this talk at Mountain West RubyConf. Thank you.
00:22:00.000
Alright, I'm Mike Moore. I work on a project called MiniTest Rails allowing MiniTest and MiniTest Spec within Rails.
00:22:07.200
I wanted to address a problem with ActiveSupport TestCase in Rails. ActiveSupport TestCase inherits from TestUnit TestCase, which is an issue.
00:22:25.200
We've done terrible things to work around this in Rails 4. ActiveSupport TestCase was going to inherit from MiniTest Spec until it got changed.
00:22:38.720
There are many features people want within MiniTest Spec, but we can't access them due to the inheritance.
00:22:51.360
Now, I just need to power on my laptop.
00:22:57.440
Is this working? Can you see this?
00:23:03.680
This new version of MiniTest will extend the MiniTest TestCase with a DSL that can be used.
00:23:19.840
This allows us to use it in Rails without any blockages.
00:23:25.120
And buy my t-shirts at RubyThreads.com.
00:23:43.920
Who can tell me what this means? Yes, and so we are nice.
00:23:52.720
I think this is a great tenet of the Ruby community, thanks to Matt who released Ruby 20 years ago.
00:24:08.800
People were held accountable for being jerks and the community was small enough that we maintained friendliness.
00:24:24.160
The Ruby community has gotten a bad name recently. To keep it awesome, we should build community.
00:24:38.240
I helped found a little meetup outside Washington DC, which has been a great success.
00:24:53.440
The other side is writing nice code, as in kind interactions. An obvious way to do this is by giving back to open source.
00:25:08.640
On a more practical level, use semantic versioning to prevent breaking changes. Ensure your commit messages are clear.
00:25:22.640
Using namespaces and sensible APIs makes code friendly.
00:25:35.840
Let’s keep Minnesota nice and if you're interested in one of these 8-bit Matt stickers, I have five left. Come find me.
00:25:51.440
Thank you very much!
00:26:07.520
Hello! Learning and teaching Ruby is easy.
00:26:14.280
Let me talk about some incoming tools.
00:26:20.280
Visually impaired individuals don't want different treatment; they want to be included.
00:26:32.000
You can understand the programming language.
00:26:42.280
The language requires slow speed for accessibility.
00:27:02.000
Our productivity is often affected by issues in understanding.
00:27:11.960
This includes blame on operating systems for accessibility assistance.
00:27:28.800
Ruby has less code, making it very teachable to the visually impaired and actually enjoyable.
00:27:45.040
The major problem we face while teaching them is interpreting error messages.
00:27:58.720
Error messages need to be accessible, so please consider that there are blind users of Ruby applications.