Rails: July 2007 Archives

Autotest meets Doom

Autotest with SFX

http://fozworks.com/static/autotest-sound10.html

I really like this last one. It uses well engineered audio to bypass the need for visual interruptions. Hopefully it'll help you keep flow better.

at icanhasruby tonight

| | Comments (0)

Eric and I will be at icanhasruby tonight... join us if you can!

them: this brick wall keeps hurting my head every time I bash into it over and over!
them: it never changes! help! why doesn't it work?
me  : what are you actually trying to do?
them: bash my head through this brick wall!
me  : what are you actually trying to do?
them: I'm trying to bash my head through this brick wall!
them: why do you keep asking me that?!?!
me  : do you perhaps mean, get to the other side of the wall?
me  : why don't you just use that door?

There is a certificate course at the UW starting this fall. It is 3 quarters long starting at rubynewb, then rails/web development, then rubyjedi. no, not the real titles. You are not required to take all three courses. do what feels right. To take just one:

http://www.extension.washington.edu/ext/certificates/rby/rby_sce.asp

There is space available. apparently, plenty of space... so take make this a success, if you are interested or suspect someone you know is interested, PLEASE, help make it happen.

ZenTest provides 4 different tools and 1 library: zentest, unit_diff, autotest, multiruby, and Test::Rails.

ZenTest scans your target and unit-test code and writes your missing code based on simple naming rules, enabling XP at a much quicker pace. ZenTest only works with Ruby and Test::Unit.

unit_diff is a command-line filter to diff expected results from actual results and allow you to quickly see exactly what is wrong.

autotest is a continous testing facility meant to be used during development. As soon as you save a file, autotest will run the corresponding dependent tests.

multiruby runs anything you want on multiple versions of ruby. Great for compatibility checking!

Test::Rails helps you build industrial-strength Rails code.

Changes:

3.6.1 / 2007-07-23

My theme for this year is shaping up to be "don't be clever, it doesn't suit you". Here is some real code we found and how it can quickly and easily be cleaned up to be much more readable, more correct, and more efficient all at the same time. (indeed, it took more time to benchmark and write this post than it did to fix the code)

The original code in all its clever glory:

if MODELS.keys.inject(true) {|b, klass| b and klass.constantize.columns.map(&:name).include? association.options[:foreign_key]}

pull out the foreign key, since there is no reason to do that in a loop:

fk = association.options[:foreign_key]
if MODELS.keys.inject(true) {|b, klass| b and klass.constantize.columns.map(&:name).include? fk}

pull out columns to improve readability:

fk = association.options[:foreign_key]
columns = MODELS.keys.map { |key| key.constantize.columns.map(&:name) }
if columns.inject(true) {|b, column| b and column.include? fk}

Oh look, now that we can read it, inject is totally wrong and slow:

fk = association.options[:foreign_key]
columns = MODELS.keys.map { |key| key.constantize.columns.map(&:name) }
if columns.all? {|column| column.include? fk}

Finally, while that map symbol to_proc hack sure looks cute, it sucks:

fk = association.options[:foreign_key]
columns = MODELS.keys.map { |key| key.constantize.columns.map { |c| c.name } }
if columns.all? {|column| column.include? fk}

Measure the change (slightly wrong after minor edits):

  1. 1 line, 132 chars, 131 avg len
  2. 2 line, 140 chars, 69 avg len
  3. 3 lines, 180 chars, 59 avg len
  4. 3 lines, 163 chars, 53.3 avg len
  5. 3 lines, 163 chars, 54.3 avg len

And finally, (rough) benchmarks:

\# of iterations = 100000
iter                      user     system      total        real
null_time             0.020000   0.000000   0.020000 (  0.012905)
benchmark-1          11.350000   0.030000  11.380000 ( 11.564039)
benchmark-2          10.900000   0.020000  10.920000 ( 10.975134)
benchmark-3          10.720000   0.010000  10.730000 ( 10.928107)
benchmark-4          10.520000   0.030000  10.550000 ( 11.300934)
benchmark-5           3.260000   0.010000   3.270000 (  3.275238)

(nevermind: don't look at the times, that wasn't the point... those that focused on the times missed the point.)

Sure does pay to not be clever...

About this Archive

This page is a archive of entries in the Rails category from July 2007.

Rails: June 2007 is the previous archive.

Rails: August 2007 is the next archive.

Find recent content on the main index or look in the archives to find all content.

Pages

Powered by Movable Type 4.1