00:00:04.920
Aaron Patterson
00:00:16.500
Hello, I love Madonna! All right, all right, uh oh.
00:00:24.060
My God! Hello, happy Saturday! Uh, my name is Aaron Patterson, also known as Tender Love.
00:00:32.820
I'm Tender Love on Twitter, GitHub, etc. You can Google Tender Love, but the search results might not be safe for work, so be careful.
00:00:38.040
I work for AT&T Interactive, and I want to thank them because I am currently employed full-time to do open source work. So, I work on open source all day.
00:00:50.760
Because I work for AT&T, that means I must be an Enterprise developer, which I am. You can go to this address, and you'll see that I am, in fact, an Enterprise developer.
00:01:02.760
I am a Ruby core committer but not a Rails core committer; I’m just a Rails committer.
00:01:08.280
First, I want to talk about my failure. The first failure is that I am not a Rails core committer.
00:01:14.580
I wonder why I work on Rails full-time and I'm not one yet, and if you wanted the same thing, I encourage you to ask DHH.
00:01:21.420
Continuing on with my failures, I am presenting last.
00:01:28.020
I like Ryan Davis, but my slides suck. I'm sorry, Shane! I use MiniTest, and I enjoy reading RFC 2119 for fun.
00:01:38.040
Oh, by the way, I don't like RSpec. I don't have method parents on method definitions, so my code looks like this.
00:01:43.800
Most people here say that they use Ruby and JavaScript, but really, I code more in C than I do in JavaScript.
00:01:50.760
But really, I want to talk about my failures as a presenter.
00:01:57.440
I really like to have fun and give a talk. I want to have fun entertaining people while also learning something practical.
00:02:07.440
One of the best things about attending conferences is learning something and being able to go home and use that new knowledge.
00:02:18.220
The truth is, I'm a nerd, and I enjoy boring things. One of my biggest failures as a presenter is that I don't know how to combine fun with boring content.
00:02:25.280
Tonight, I'm going to give two presentations: a practical presentation and a fun presentation.
00:02:38.220
So, I like to eat dessert first, so we're going to start with the fun.
00:02:43.980
How many of you were at GoGaRuCo last year? Okay, yeah, all right!
00:02:49.920
I was not a GoGrouper last year. I probably should have listed that among my failures, but I heard last year there was a presentation that was very popular.
00:03:03.240
I want my presentation to be popular too, so I decided to write a guide about making popular presentations.
00:03:10.440
Ryan was reviewing my slides, and he told me that it wasn't about popularity so much as it was about notoriety.
00:03:17.220
So this is actually your guide to presentation notoriety.
00:03:24.000
As far as I can tell, the three bullet points you need are: a provocative title, risque photos, and possibly Ruby code.
00:03:30.180
First step, we need to come up with a provocative title. Using Ruby 1.9 like an engineer is not provocative, sorry.
00:03:37.259
The way to fix this is by making it sexier: 'Use Ruby Like a Sexy Engineer.' Easy, no problem!
00:03:44.040
Next up is risque photos. Everyone, this is super important.
00:03:49.320
What I like to do is take lots of photos and make sure that I come up with these risque images.
00:03:56.760
One of my favorite TV shows is America's Next Top Model, so I created a segment called America's Next Top Engineer.
00:04:02.280
If anyone here watches that show, you'll know that it typically involves a guy and a camera, who shouts out a bunch of words.
00:04:10.560
Then someone in front of the camera tries to act out what those words mean.
00:04:17.220
So, what I'm going to show you next are the words in combination with me acting out those words.
00:04:24.240
These are just some ideas for you to create risque photos for your slides.
00:04:29.640
First one: confidence, elegance, sultry, sexy, thoughtful, fierce, playful, powerful, and finally, provocative.
00:04:34.199
Thank you! Finally, the last thing to have a notable presentation is obviously Ruby code.
00:04:44.580
I went online and found some Ruby code, and I said, 'Hahaha, too long, didn't read, I don't care!'
00:04:51.240
So that wraps up my first presentation. Now, let's move on to the practical presentation.
00:04:56.760
I have a really bad sense of humor, though I should have mentioned that earlier.
00:05:03.300
The title of this talk is "The Hidden Gems of Ruby 1.9." This is essentially a Ruby 1.9 Public Service Announcement.
00:05:09.000
Please upgrade to Ruby 1.9! Ruby 1.9.2 is awesome! You should use it!
00:05:15.960
The reason I titled this talk this way is because I'm not going to talk about gems at all.
00:05:23.040
Everything I'm going to discuss is from the standard library, so please run now!
00:05:29.160
The first thing I want to talk about is MiniTest. This is our normal testing.
00:05:35.580
Normal tests look like the standard test unit stuff, but I'll highlight some differences between MiniTest and a normal test.
00:05:41.040
For starters, instead of requiring 'test/unit', we require 'minitest/autorun'.
00:05:46.080
Next, we inherit from 'Minitest::Test' rather than 'Test::Unit::TestCase'. So a base test might look like this.
00:05:53.220
Another difference is that we don't have 'assert_not' in MiniTest; we have 'refute'.
00:05:59.040
So this makes all the asserts and refutes align nicely. An 'assert_not' would translate to something like this: 'refute'.
00:06:05.880
We have a new method called 'skip', which lets us skip tests that don't make sense to run on a particular platform.
00:06:12.240
So when we run our tests, we’ll see an output that indicates how many were skipped, alongside the assertions and failures.
00:06:18.360
Next up is randomization. MiniTest randomizes the order in which your tests are executed.
00:06:25.740
You'll notice that this test modifies global values while it's running.
00:06:32.460
Sometimes it will succeed, while other times it will cause failures. That's a bad scenario for our tests.
00:06:38.520
So, we see that sometimes all four tests will pass, and everything is fine. Other times, we'll get an error.
00:06:45.900
You’ll see an option that says 'Test run options --seed'. What that seed does is determine the order in which the test should run.
00:06:52.740
You can grab that command line option '--seed', along with '-v' for verbose, and run the tests.
00:06:59.400
Then you’ll be able to see what tests were run and in what order, so that you can debug any issues.
00:07:07.320
Another interesting aspect is test performance. If we use MiniTests, we can see how fast the tests run.
00:07:14.460
For example, if one of our tests is slow, when we run the test with '-v', we can check for performance times.
00:07:20.940
If a test takes an unusually long time, you can find out where those slow tests are located.
00:07:28.200
If you're using rank, then you should add other test options. Testing on the environment variables is useful.
00:07:34.920
Okay, 13 minutes in, and I’m not even halfway done yet.
00:07:43.080
So, does everyone know that Ruby 1.9 ships with RSpec? No? You did not?
00:07:48.060
Take a look at this test; it may look like RSpec, right? Yes? Right!
00:07:54.780
Actually, it’s not; that is MiniTest's spec. MiniTest has an RSpec-like notation.
00:08:01.140
You just have to require 'minitest/spec' instead of 'minitest/autorun'.
00:08:06.420
Okay, apparently you do not need that require. Thank you, Ryan; I made a mistake.
00:08:12.480
Next up is ObjectSpace. How many of you know about ObjectSpace? Yes? I'm sure you've seen code that looks like this.
00:08:19.200
In Ruby 1.9, we have new extensions to ObjectSpace that can give us interesting statistics about the virtual machine.
00:08:26.010
There are four new methods: count_objects, size_of, count_nodes, and count_data_objects.
00:08:33.540
Count_objects returns a hash with keys as object types and values as their memory sizes.
00:08:39.180
Size_of returns the number of bytes that a specific Ruby instance uses.
00:08:45.720
Count_nodes actually counts the number of parse nodes that Ruby has identified.
00:08:52.200
Finally, count_data_objects counts instances of C-backed Ruby objects.
00:08:59.520
For instance, in a specific run, we had 64 instances identified by counting how many were found.
00:09:06.780
Next, let's discuss Fiddle. Does anyone know about Fiddle? It's pretty cool!
00:09:13.080
Fiddle is a wrapper for the libffi library. So, now we have Fiddle as a part of Ruby 1.9.2.
00:09:21.000
How many people have heard of Ruby FFI? Excellent!
00:09:27.660
Fiddle wraps native method calls and closure allocations.
00:09:34.020
It provides two utilities: one to call native methods and the other to allocate native closures.
00:09:41.040
However, it can't do any type of memory management that DL does.
00:09:47.520
I want to discuss how DL and Fiddle interact by calling functions with both.
00:09:54.840
We must follow four steps: open a dynamic library, locate the function pointer, wrap it, and call the function.
00:10:02.640
The final result shows how we wrap the sine function provided by the libm library.
00:10:10.440
Then, we can call this function and perform operations.
00:10:17.280
If we want to create a function that mimics the sine function, we can subclass Fiddle's closures.
00:10:24.720
The important thing here is to realize that when we call 'function.call', it exercises Ruby code only.
00:10:33.600
We can test our closures without interacting directly with native code.
00:10:40.020
The returned memory location from the closure can also be wrapped in a Fiddle function.
00:10:46.560
Now, let’s talk about Psych. Psych is the YAML parser in Ruby 1.9 and above.
00:10:55.740
It wraps the original YAML parser, replacing libraries as necessary.
00:11:03.120
With Psych, you can load and dump YAML conveniently.
00:11:08.520
New features include the ability to parse JSON since JSON is a subset of YAML.
00:11:15.480
Psych can also support evented parsing, which means you can get notifications while parsing.
00:11:22.200
You can write a handler to respond to specific events during parsing.
00:11:28.440
This allows real-time notifications when your YAML is processed.
00:11:37.800
Psych also supports immediate document emission without any buffering.
00:11:43.740
We've seen how this can be an efficient way to emit multiple YAML documents.
00:11:50.220
However, streaming JSON works the same way and can be implemented easily.
00:11:57.000
In fact, Twitter uses streaming JSON APIs.
00:12:03.840
Now, I actually did it! I can't believe I'm under 30 minutes. So, are there any questions?
00:12:10.320
I actually have more slides, so if there are no questions, I can continue.
00:12:16.560
Who does your hair?
00:12:23.040
Hi, Mike! Just get closer to the mic.
00:12:27.000
Apparently, I'll repeat the question, so I can hear you. Go ahead.
00:12:32.520
There’s a plea not to use Psych because it makes it difficult to create JRuby libraries, right? I completely disagree with you!
00:12:45.840
It’s essential because even though it may not be compatible today, it will be crucial in the future.
00:12:52.380
The importance of wrapping libyaml is that it's widely used in the community.
00:12:58.860
There are already well-known implementations in other languages, such as Java.
00:13:06.240
I’m working on the Java version for JRuby, so while some limitations exist today, they won’t last.
00:13:12.780
More questions?
00:13:18.780
Hold on, I need to check what other slides I have.
00:13:25.020
Coverage is another new feature in the standard library.
00:13:30.780
I recently blogged about it, but it's essential to know about two methods: start and result.
00:13:37.620
Imagine we have a class that iterates ten times with some comments and an if-statement.
00:13:44.940
The way to measure coverage is simple. We start coverage with 'coverage.start'.
00:13:50.700
After requiring the file, the output will show coverage data in a hash format.
00:13:59.160
A nil value means a line was never executed; a number indicates how many times it was.
00:14:05.880
Using this information, we can deduce which lines had coverage and which didn’t.
00:14:12.720
This provides valuable insight for optimizing our code.
00:14:19.680
I encourage everyone to check out the coverage tool. It works well with Rails.
00:14:26.100
However, be cautious with what I presented, especially concerning JRuby.
00:14:32.640
Some features may not be available on other Ruby implementations.
00:14:38.280
Thank you! Thank you very much!