Ajax forms testing using capybara, cucumber-rails and selenium

Manual UI testing plays a crucial part in test life cycle. However doing the same UI testing on every other day will became tedious. By using cucumber with capybara we can transform these mundane tasks into some interesting learning. We can easily automate manual UI testing by using capybara with cucumber. While automating, ajax forms testing became a task that required some tweaking. I did some R&D to accomplish this task for my project and also that is what pushes me to share my R&D with you.

Task : Admin should be able to edit footer. By clicking on ‘Edit’ link it sends an ajax request and renders a form in facebox. After filling the form and clicks on ‘Add’ button it creates a footer and render a successful message.

Now we will see how to write feature to fulfill this task.

Step 1:

#features/manage_footers.rb
 @javascript
  Scenario: Footer update
    When clicked on edit link
    And updated footer name 'About Us'
    And updated category 'Learn more'
    And updated order as '1'
    And checked link to other page
    And clicked on add button
    Then user should be able to success message

Notice that above scenario there is tag ‘@javascript’ tag which we will do magic. It tells to capybara sends an ajax request for this scenario. Now we will see step definitions

Step 2:

#features/step_definitions/footer_steps.rb
 When /^clicked on edit link$/ do
    click_link('Edit')
 end
 When /^updated footer name 'About(\d+)'$/ do |arg1|
    within('#facebox') do
      fill_in('footer[name]', :with => 'About Us')
    end
 end
 When /^updated category 'Learn more'$/ do
    within('#facebox') do
      select('Learn More', :from => 'footer[category]')
    end
 end
 When /^updated order as '(\d+)'$/ do |arg1|
    within('#facebox') do
      fill_in('footer[sequence]', :with => 1)
    end
 end
 When /^checked link to other page$/ do
    within('#facebox') do
      check('footer[only_url]')
    end
 end
 When /^clicked on add button$/ do
   within('#facebox') do
     click_button('footer_submit')
   end
 end
 Then /^user should be able to success message$/ do
   page.has_content?('Footer was successfully updated.')
 end

Step 3:
Set default driver to selenium in env.rb file.

#features/support/env.rb
Capybara.default_driver = :selenium

Step 4:
Now execute the feature. Because we set default driver to selenium it opens firefox (by default) and executes the steps. For more read capybara.

I hope this article will reduce your manual testing effort. Any suggestions and feedback would be welcome.

Posted in Ruby on Rails, Tutorials | Tagged , , | Leave a comment

Factory_girl with Non-ActiveRecord classes

In earlier post we have seen how to test active record associations with factory girl. Now we will learn how factory girl works with non-active record classes. When we want to test external API responses, this will be useful.  By using this we can build no of responses at a time and test, how system will handle inputs. It is as similar as to working factory girl with active record classes. Now here is the way:

Step1:

First you need define class and attributes of the class. For example

#spec/support/models/deal.rb
class  Deal
   attr_accessor  :title, :remainingQuantity, :price_amount
end

Step 2:

Create a directory called ‘models’ inside ‘spec/support’ directory and place this class.  Because of following line of code it will includes our class while test environment is loading.

# spec/spec_helper.rb
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

Step 3:

Now we have to create an object by using factory. Create a factory file in spec/factories directory as how we are writing factory file for a active record class. For example

#spec/factories/deal.rb
Factory.define :deal do |g|
    g.title               "Whisky for $10"
    g.remainingQuantity   20
    g.price_amount        10
end

Step 4:

Now use this factory in your specs. For example

#spec/models/deal_spec.rb
deal = Factory.build(:deal)

It will return an object of class Deal. Now it works as a normal ruby object and we can apply our conditions on it. For more see factory_girl

I hope everyone enjoyed this article. Any comments would be welcome.

Posted in Ruby on Rails, Tutorials | Tagged , | 2 Comments

Code + Beer + Enthusiasm = Pune Hackfest!

Damn! Hackfests really work.

At the latest event of the Pune Rails Meetup – we organized a hackfest for the ‘second’ time (ahem – the first one ended before it started). This time however, we had a plan:

“Citizen Empowerment for Better Governance” – the aim was to complete the MVP for this in 2 days! We had a record attendance of 25-30 people on both days. I was skeptical of how much we could do, how much we can organize and if we can manage to keep everyone satisfied – it was make or break!

http://kipwiki.heroku.com — WE DID IT! This portal is almost complete (a few technical glitches but over all I would say it was success in more ways than one. The source code is hosted on github: https://github.com/punerb/kipwiki The hitch was that MongoHQ use v1.6 which does not support $nearSphere conditions for geo-spatial indexing — this causes our geo-location to go for a toss.

These are the lessons we learnt:

Pair Programming

This was not mandated but recommended (LoL — “mandatory pair-programing” — an oxymoron?). This photo says it all. Everyone paired with someone automagically — and it worked like a charm.

There were plenty of more modules build, tracked and tweaked. However, everyone was open to change, talking to everyone AND most importantly committed to “GETTING IT DONE”.

What we did

Initially,we had some mocks that we got confirmed – narrowed down the scope of work to 2 days, discussed with Peter at length what he wanted and then planned this hackfest. The first morning – we discussed the plan and with 1 hour we got down to business. This was our rails stack:

- Rails 3.0.7

- MongoDb (via Mongoid)

- Devise & omniauth for authentication

- mongoid-paperclip (with S3 as storage).

- Heroku and MongoHQ

- jQuery search result filtering

The Party continued into the night

Peter sponsored not just the lunches and dinners – but also ensured there was a steady flow of juices, snacks, fruits and beer! Shardul did not miss the chance to ‘showcase drink-fest’ ;)

Peter even bought a ‘Hackfest’ cake – what more could we ask for?

We worked on the first day till 11.30pm and then crashed to be ready for Day2. Day2 was very very productive and we were coding till 1.30am in the night to reach the finish.

Lots of beer, fun, ‘resolving conflicts’, ‘git blame’ games — and even doing something right like this one of Sergey! ;)

Coding, Designing and Testing

We were able to churn out a LOT of code indeed. But it did not start there. We had to design the web-portal with our designers, we had pivotal tracker to track stories and rspec to test the models. No we did not do ALL this. We used Pivotal tracker to check and evaluate stories and unfortunately we did not do Test Driven Development. Some of the things that we need to improve.

The excellent part of was that we had some rock-star programmers – who churned out a LOT of awesome code and we had some excellent designers who helped with designing.

“427 commits from 17 developers” and here is the impact:

We missed out on Test Driven Development!!

This is one thing that we need to do differently at the next hackfest. Its very important to see this work beautifully and always be ‘code green’.

All in all I think we are ready to be a part of RailsRumble later this year and I do intend to get Pune.rb on the RailsRumble map!

Posted in Conferences, Ruby on Rails | Tagged | Leave a comment

Ruby Conf India 2011 – The Good, Bad and the Ugly

I delayed my post on RubyConfIndia 2011 roundup for a reason! There are plenty of good blog posts doing a round-up of RubyConfIndia here and most of the presentation here.

No point re-inventing the wheel or saying the same things again – However, I thought I would write differently – things that liked about the conference, things that I did not like and things that could have been better!

In typical Ola style — the good, the bad and the ugly ;)

The Good

+2 The organization! All sessions started on time, all speakers were warned about delays and time was respected. The registration process was smooth and the volunteers were very helpful!

+2 The keynote speakers! They were excellent. Needless to say Yahuda, Matz, Ola, Nick and Chad are very good speakers and kept the audience entertained.

+2 The wifi!It was exceptional. For catering to about 400 people (this time there were a LOT more people connected on twitter and IRC), the infrastructure was excellent.

+1 The audience! There were a lot of professionals and companies participating and that kept the Q&A sessions interactive and interesting.

+1 The food! brilliant management and menu. There were more counters and no lengthy queues.

+1 Matz & Chad. The Pre-recorded video of Matz was nice but I was impressed with Chad Fowler making a live video conference. It was very well done.

0 Topics! I give an ‘Ok’ to the topics this year. Some were REALLY good and some were REALLY bad.

I am not usually vociferous on Twitter and I apologize — but when it hurts it, hurts! I know its not good to bad-mouth any speakers but some topics could definitely have been better prepared. People want to see demos if you have a technical topic. People want examples of how to do things rather than preaching about what to do. Humor was missing (except from Brain Guthrie’s talks. He takes the cake!) Nick’s closing key-note took a humorous twist around kids and ruby — it was totally unintentional but very funny.

Some topics were awesome and I enjoyed them! To mention a few I attended – the Ruby Object Model by Karthik, CoffeeScript by Nicolás Sanguinetti, MacRuby by Mark Madsen, Test Load Balancer by Janmejay and Pavan and High Throughput by Sherin. I did miss a few other good topics but I do plan on checking out the videos.

The bad

-1 Students missing among the audience! I was really surprised that there were only a handful of students in the audience.  Maybe we should have some free passes or subsidized passes for students.

-1 Company Branding! Too much company branding on conference material. We need to promote the conference not the sponsors! If I have to wear the T-shirt, I want to showcase RubyConfIndia and not the sponsors.

-1 Snacks and drinks! Considering the larger response among sponsors and audience, I would think that there should be a steady stream of coffee, soft-drinks and some snacks all day long. Yes! I agree that I dont have much insight into the accounts and expenditure — hmm.. I wonder why that isn’t made public anyway.

-1 Post conference party. Where was it? A party with beer on the house, gives every delegate a chance to meet, chat and relax with speakers and their idols. This is always an excellent way to loosen up and have a good time!

The ugly

-2 Proposal selection process! The undercurrent in RubyConfIndia was that a lot of topics were given to speakers from the sponsors. While I agree that the selection process was exclusively done by Ola and Chad (and no-one ever doubts their judgment), I do believe that the selection process should be made more public.

Ola and Chad cannot possibly gauge what an Indian audience would want and whom they wish to hear.  I believe the selection process should be more open — have a look at Red Dirt RubyConf voting process.

(Update) This was JEG2′s response (the man behind Red Dirt RubyConf):

Publc Voting Process for CFPs

-2 Missing Lightening Talks or BOF (Birds of a feature) sessions. Considering there were 70 proposals and only 16 selected, there is indeed a lot more interest to present. Why not keep 5 minutes talk sessions for 1 hour on each day – That way at least 15 more people get the stage!

-2 Missing workshops. I wonder why there were no pre-conference workshops. People come here to learn or to teach. A pre-conference workshop is usually very popular

To conclude, I enjoyed this year’s RubyConf – I do hope to see it in Pune next year and I am definitely going to try be a part of organizing it! Lets hear from you folks now!

Posted in Conferences, Ruby on Rails | Tagged | 6 Comments

Integrity Continuous Integration

Integrity is a Continuous Integration Tool where we can run our tests (Rspec or Cucumber) to check whether the application is running fine or not.  Whenever there is a commit it will run the test cases and checks whether the specs are passed or failed.

Installation

For basic instructions on setting up the Integrity go through http://integrityapp.com/  The post below states errors you may encounter and their solution. Following steps are mentioned for setting up the integrity in the url given above:

$ gem install bundler
$ git clone git://github.com/integrity/integrity
$ cd integrity
$ git checkout -b deploy v22
$ bundle install
$ bundle lock
$ rake db

At the last step i.e. “rake db” – you may get error for require “.bundle/environment” under init.rb

Below is full error trace :

** Invoke db (first_time)
** Execute db
rake aborted!
no such file to load -- .bundle/environment
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:29:in `gem_original_require'
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:29:in `require'
./init.rb:3
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:29:in `gem_original_require'
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:29:in `require'
/home/amit/integrity/Rakefile:25
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `call'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `execute'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `each'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `execute'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain'
/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:583:in `invoke'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `each'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2001:in `run'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:1998:in `run'
/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/bin/rake:31
/usr/bin/rake:19:in `load'
/usr/bin/rake:19

Comment that line  i.e. require “.bundle/environment” and add following lines. The code in init.rb should look like this:

begin
 require File.expand_path("../.bundle/environment", __FILE__)
 rescue LoadError
 require "rubygems"
 require "bundler"
 Bundler.setup
end

Once it is added then run “rake db”.
Now as mentioned in the document run the integrity server by the command

$ bundle exec rackup

In the browser type the url as “http://0.0.0.0:9292” and the Integrity app will open.

Project Creation

Initially there will be no projects created. So lets create a project by clicking on the link.
Project creation page will open:

1: Enter the project name : Enter the name of the project

2: The github url from which we clone the project i.e.
git@github.com:amit/test.git

3: Enter branch to track as “master”.If there are any other branches which you want to run the Integrity then enter that branch

4: Enter build script as the script which you want to run for e.g. rake test
Here if you have already written a script then add that script

Handling database

Before going further you should know that Integrity is dumb :) It takes a repository URL and a command to run in a working copy. It then reports success or failure depending on the exit status of the command. It does not create a database so we have to manually create a database for the application for which you want to run the integrity.

For this create a rake task in the project and enter below code:

 namespace :ci do

 # Be sure you check-in the config/database.yml.ci file which contains the same database details as for the project.
 task :copy_yml do
   system("cp config/database.yml.ci config/database.yml")
 end

 # Command for running the specs
 task :spec do
   system("bundle exec rspec spec/")
 end

 # Running the entire rake task
 desc "Prepare for CI and run entire test suite"
 task :build => ['ci:copy_yml', 'db:create', 'db:migrate', 'ci:spec'] do
 end

Once it is done you can mention the script as “rake ci:build” in the script field in the project creation page
Click on Update project. Now the project is created. Now click on Manual build. It will run the build.Now what happens here is it goes to the git url which we have specified, fetches the latest commit and clones the project.
Yes! For every build we called, it clones the project – this is the drawback of Integrity because it can eat a lot of space for every build. After running the build you can see the output in the UI.

NOTE: Initially when I ran the build i got an error which says

 Build 94fbea34a77d7b78a5572e82a3a490e556abe7b2 exited with false got

After searching i found that some of the code need to be replaced.

So in the integrity/lib/builder.rb do the following changes:

# integrity/lib/builder.rb
# Remove / comment these functions out!
def run
 cmd = "(cd #{repo.directory} && #{@build.project.command} 2>&1)"
 IO.popen(cmd, "r") { |io| @output = io.read }
 @status = $?.success?
end

def repo
 @repo ||= Repository.new(
 @build.id, @build.project.uri, @build.project.branch, commit
 )
end

def commit
 @build.commit.identifier
end

And replace with the below code:

def run
 cmd = "(cd #{repo.directory} && RUBYOPT=#{pre_bundler_rubyopt} PATH=#{pre_bundler_path} && #{@build.project.command} 2>&1)"
 Integrity.log cmd

 # cmd = "(cd #{repo.directory} && #{@build.project.command} 2>&1)"
 IO.popen(cmd, "r") { |io| @output = io.read }
 @status = $?.success?
end

def repo
 @repo ||= Repository.new(
 @build.id, @build.project.uri, @build.project.branch, commit
 )
end

def commit
 @build.commit.identifier
end

private
def pre_bundler_path
 ENV['PATH'] && ENV["PATH"].split(":").reject { |path| path.include?("vendor") }.join(":")
end

def pre_bundler_rubyopt
 path = ENV['RUBYOPT']
 #ENV['RUBYOPT'] && ENV["RUBYOPT"].split.reject { |opt| opt.include?("vendor") }.join(" ")
 path = path.gsub(' -rbundler', '/bundler')
 path && path.split.reject { |opt| opt.include?("vendor") }.join(" ")
end

Restart the server and the build will run successfully!

Email Notifications

After every build we can get email notification. Configure like this:

# Gemfile
gem "sinatra-ditties"
# init.rb
require 'integrity/notifer/email"

$ bundle install

Start the server.  Now in the UI click on the Edit button beside the project,you will see email configurations.  Enter the desired settings and click on update and again run the build.  Once the build is complete you will get email notification.

Post commit hook configuration

Till now we are running build manually. Now we want to run the build automatically after every commit has been done, you need to add the post-commit hook. For that go to the desired github repo

  • Click on the admin link
  • Below click on the Service hooks-> Post receive Url
  • In the textfield,add the url as : http://(integrity-url):9292/(project-name)/builds

Once it is added click on update settings and click on test hook

After clicking the build should be started. Now do a dummy commit and check whether the build is getting running automatically or not. It should run! :)  You can run Integrity for number of projects.

Deploying Integrity on Heroku

The Integrity installation for heroku deployment does mention that need to uncomment the postgres gem in Gemfile and do the standard ‘git push heroku master’.

Once all is done run heroku open and in the browser you will see integrity running :)

Following is the link where you can have a look at the Integrity app in heroku

http://gentle-summer-888.heroku.com/

Make sure to deploy your github tokens. More detailed instructions at http://integrityapp.com/

 $ c.github ENV["GITHUB_TOKEN"] || "TOKEN"
 $ heroku config:add GITHUB_TOKEN=secret

Issues:

  1. The problem with Integrity running on heroku is it does not run builds for private repositories
  2. For every build integrity will clone the whole project which will gradually eat up the spaces.

Let me know if you have any doubts. I would love to help you set this up / fix some issues.

Feedback is more than welcome — after all, this is all about continuous integration!

Posted in Ruby on Rails, Tutorials | Tagged , , | Leave a comment

Testing associations with factory girl

Associations are very important when we are working with relational databases. Writing relations in models is easy but when it comes testing them, it is a painful task.

Factory girl associations makes this easy. Before going into details, lets get the basics right.

What is Factory Girl?

   Factory_girl is a fixtures replacement with a straightforward definition syntax, support for multiple build strategies (saved instances, unsaved instances, attribute hashes, and stubbed objects), and support for multiple factories for the same class (user, admin_user, and so on), including factory inheritance. Read more of it here.

Testing Assocations

has_one association

Scenario : ”user location” has one “email preference”

There are two ways to implement this.

  • You could define relation in user location factory.  First the factory creates the email preference object and then it creates user location object.
# spec/factories/user_location.rb

Factory.define :user_location , :class => UserLocation do |ul|
   ul.email_preference { |ep| ep.association(:user_location) }
end

  • You could alternatively define the same association in email preference factory. First the factory creates user location object and then it creates email preference object.

# spec/factories/email_preference.rb

Factory.define :email_preference , :class => EmailPreference do |ep|
   ep.association :user_location
end

has_many association

Scenario: ”City” has many “deals”

Note, the factory  automatically creates the deal object and then it creates city object and associates the two.

# spec/factories/city.rb

Factory.define :city, :class => City do |c|
    c.deals { |d| [d.association(:deal)] }
end

has_many => through association

Scenario : ”User” has many contests “through” ads

First the factory creates contest object and user object and then it creates ad object.

# spec/factories/ad.rb

Factory.define :ad, :class => Ad do |ad|
   ad.association :contest
   ad.association :user
end

  (or)

First the factory creates ‘user’ object and then it creates ‘ad’ object and then it creates ‘contest’ object.

# spec/factories/contest.rb

Factory.define :contest, :class => contest do |c|
   c.ads { |ad| [ad.association(:ad)] }
end

And in ‘ad’ factory

# spec/factories/ad.rb

Factory.define :ad, class => Ad do |ad|
   ad.association :user
end

Polymorphic relations

Among all relations defining polymorphic relations is a little bit complicated task.

Scenario : They are many type of ads like video, print, audio etc. So here video is one type of an ‘Ad’. First it creates ‘video’  object and then store resource type and ID in ‘ad’ object. Let’s see how we can define this in factories :

# spec/factories/ad.rb

Factory.define :ad, :class => Ad do |ad|
    ad.association :resource, :factory => video
end

I hope this was helpful. Feedback for this would be welcome. Let me know if there is any complex scenario you found which made testing difficult. I’d like to give that a shot!
Posted in Ruby on Rails, Tutorials | Tagged , , | 6 Comments

RedDotRubyConf – fun times ahead

RedDotRubyConf could be renamed FunConf (I know there is already one) but this one would rank way up there! Considering there was Robin, Batman and Superman in the crowd, this conference could not have been any better! (Only the aussies can pull that one off!)

There were awesome speakers having varied presentation styles and it kept everyone interested – like Dave’s ‘Ok Lah..” keynote, a live demo by Tom, Gregg doing ‘nervous’ stretches on stage and Ryan taking off his T-shirts! What more can you ask for? I also liked the fact that there was only 1 track. So, as an attendee, I never fear missing out on some really good topic in a different track and as a speaker, I am never concerned about an empty audience ;)

I got to see both sides of a conference – as a speaker and an attendee. On the eve of the conference, there was speakers dinner organized by Andy , Jason and Carl (the organizers) at ‘Din Tai Fung’ – It had really tasty Vietnamese food – the best I have had so far. The Loof that we went to later too I think set the tone of the conference. Loads of beer got everyone talking and interacting as if it was a group of old friends. Sarah Mei had had an especially long day as she conducted her training for a group of about 30 – I am sure the beer soothed her sore throat!! :)

Though the conference started on a slightly wrong foot Ian  saved the day by going first up instead of Matz. In retrospect, it seemed appropriate as Day 1 could have been touted as ‘Pivotal Tracker | Agile | Pair Programming’ day and Day 2 as ‘Ruby X | Kick Some Agile/Pivotal butt’ day!  Ian spoke about practices at Pivotal Labs – breakfast, stand-ups, pair programming, the hiring process and co-located clients. Little did he know that ‘almost’ all the talks right through the conf would take a dig at them.

Matz came on next — and boy, Did he get some ovation! It has been people’s dream to see the man himself and the tone was set when he said ‘I do C programming so that you don’t have to!’. Matz also spoke about RiteVM — which he is hoping is the next embedded Ruby VM and could change the world. Yeah! Mikel took the stage by storm in a typical Australian way and went on to talk about how things work and what the best practices are – how he wrote and rewrote Mail and their new product StillAlive. He spoke about how everyone must go ahead and contribute back to Ruby and Rails.

The local speakers Sau Sheong, Tze and Alex spoke on nice heavy technical topics like R, Smalltalk and MongoDB. The talks had excellent content (maybe a tad too heavy on code snippets). Considering that R and SmallTalk are not quite common topics and especially difficult to talk about in 30 minutes,they were really good. It does indeed showcase the standard of the Singapore Ruby community! Well done! Nate spoke about TDD and why only TDD succeeds. He should give talks more often! It was fun, very well planned and evoked lots of participation from the audience. Robert Berger’s presentation on chef was very good and calculated. Maybe a comparison between Chef, puppet and any other techniques would have .

Paul joked about bringing down the standard of the conference talks by “talking about Rails”. Multi-tenancy is a common (and good) problem to have a scalable application and Paul very nicely categories today’s Rails apps, the sector they belong to and how they solved multi-tenancy problems using scopes. The talk was an excellent mix of information and code.

My talk Rails and Outsourcing was well received (I guess) as there were loads of questions being asked and I hope I got at least some change in people’s outlook on out-sourcing. I may have succeeded when at the post-conference party, Tom told me that my talk did get him thinking that ‘maybe’ outsourcing work would have helped out in the github early days after all. I couldn’t have asked for more!

Andrias and Alam spoke about Viki and PlayMoolah and how and why they used Rails for their product. These were precise and practical reasoning and it showed how much they have learnt and want to share that with others! Really inspiring!

Dave talk start Day Two with a ‘Creole Bang’ – the messiness of Ruby and the beauty of its mixed nature. He spoke about his famous m/n/o explanation which is simply awesome. His confident poise and analogies leave a lot to think about. Consider this:

He was asked about ‘ruby internals for beginners’ and he explains that you cannot and do not want to take a car apart just to learn about its internals. Though you could do it about 20 years ago, thats not what is recommended today.. Move on! If you are doing your first jump out of a plane, you dont want a lecture on aerodynamics – just ‘tell me what to pull and when’.

Tom did a live demo to on how git really works. After a minor hiccup (which was hilarious but comforting – good to know nothing is every perfect) – he spoke about not Non-Pivotal Github was and why git is comforting – once you get to know how the objects, refs and trees and commits work. An awesome presentation followed by yet another unique one from Gregg. He had admitted earlier that he was nervous talking just after 2 excellent speakers like Tom and Dave — but did he steal the show!

Gregg was the only speaker to prance all over the stage and even do stretches! Un*******believable and amazing! He took everyone through a deep dive into Rails3 architecture. A code heavy talk but he too could not resist the ‘devil in Pivotal’ joke. When the videos are published– be sure not to miss this one. Hilarious, serious and educative. Mikel took the stage (along with Ryan in the audience) answering questions on Rails 3 with Gregg. The RubyX day began!

Ryan took off seven T-shirts during his talk on how to do Rails, the right way. Though he spent most of the time at the conference writing his book ;) he was seen all over asking questions, answering them. Matthew and Ryan were among the active and leading participants / winners in the competition conduted at the end of the day. Matthew’s talk on his financial application and his gems (Cashish) and his own custom State machine were really impressive!

“Secret Agent Andy” finished the competition in 7 minutes with his closest rival finishing about 15 minutes later. The guy is a genius (I didn’t need to mention that did I?). Please help me post some more details about him.

The post conference party was a blast — with Gihub sponsoring the drinks! Needless to day, my night ended at 5am in the morning and I think Tom and Ryan just about made their 6 am flight.

Things I missed out on: Pecha Kechu. Somebody please let me know how that went. If you have a blog post, I’d like to link it here!

Posted in Conferences, Ruby on Rails | Tagged | 3 Comments