High-Performance Ruby Editing with Vim

Posted 7 months back at GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS - Home

Announcing our newest screencast series: Navigating Ruby Files with Vim.

This 3-part series was created by vim superstar Drew Neil (author of Practical Vim and creator of vimcasts.org).

With his famously-soothing accent, Drew will teach you ultra-efficient navigation through Ruby files. Rather than typing out long pathnames or searching for method definitions, you’ll learn to jump directly to the code in which you’re interested. You’ll also learn about a powerful set of plugins that let you edit Ruby at a higher level of abstraction. Finally, Drew covers Vim’s powerful use of ctags.

Once you’ve mastered these super powers, you’re likely to find yourself relying on documentation less and less, preferring to go right to the source. Over time, you’ll gain a better understanding of how the gems you use each day are put together.

I’ve been editing Ruby with Vim for six years, and I learned an immense amount from the videos.

If you’re ready to push your Vim accelerator to the floor, check out Navigating Ruby Files with Vim.

thoughtbot at Rocky Mountain Ruby

Posted 7 months back at GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS - Home

We’re in Boulder this week!

Our Denver office, along with representatives from San Francisco and Boston, will be at Rocky Mountain Ruby, a Ruby conference taking place at the beautiful Boulder Theater in the heart of the downtown area. Here are the events that some of us will be involved with:

If you see anyone wearing a thoughtbot logo on their shirt, please feel free to say hello. We’d love to talk about Ruby, our Learn offerings, our open source projects, the best local hiking trails, or anything else!

thoughtbot at Rocky Mountain Ruby

Posted 7 months back at GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS - Home

We’re in Boulder this week!

Our Denver office, along with representatives from San Francisco and Boston, will be at Rocky Mountain Ruby, a Ruby conference taking place at the beautiful Boulder Theater in the heart of the downtown area. Here are the events that some of us will be involved with:

If you see anyone wearing a thoughtbot logo on their shirt, please feel free to say hello. We’d love to talk about Ruby, our Learn offerings, our open source projects, the best local hiking trails, or anything else!

Build Phase Podcast Episode 8: The Levy Has Broken

Posted 7 months back at GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS - Home

Build Phase Podcast Episode 8: The Levy Has Broken:

On this episode Mark and Gordon talk about everything iOS7.

Build Phase Podcast Episode 8: The Levy Has Broken

Posted 7 months back at GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS - Home

Build Phase Podcast Episode 8: The Levy Has Broken:

On this episode Mark and Gordon talk about everything iOS7.

Giant Robots Podcast Episode 67: The Data Optimist

Posted 7 months back at GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS - Home

Giant Robots Podcast Episode 67: The Data Optimist :

Ben Orenstein and Hilary Mason, Data Scientist in Residence at Accel Partners, talk about Data Science, Bitly and Cheeseburgers.

Giant Robots Podcast Episode 67: The Data Optimist

Posted 7 months back at GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS - Home

Giant Robots Podcast Episode 67: The Data Optimist :

Ben Orenstein and Hilary Mason, Data Scientist in Residence at Accel Partners, talk about Data Science, Bitly and Cheeseburgers.

Episode #405 – September 27th, 2013

Posted 7 months back at Ruby5

Ruby 2.1.0 preview1, Rails Console on the Browser, Splatting in Iterators, Unix Preprocessing, Cucumber and Global Rake Tasks all on today's Ruby5!

Listen to this episode on Ruby5

This episode is sponsored by Top Ruby Jobs
If you're looking for a top Ruby job or for top Ruby talent, then you should check out Top Ruby Jobs. Top Ruby Jobs is a website dedicated to the best jobs available in the Ruby community.

Ruby 2.1.0 preview1 released
Ruby 2.1.0 preview1 has been released, lots of cool new features. 2.1.0 final is scheduled for a Christmas release.

Rails Console on the Browser
The Rails organization on github released rails console which lets you spin up a console from inside your browser.

Splatting in Iterators
Andrius Chamentauskas wrote a blog post explaining how Ruby actually splits arrays in iterators by allowing you to access multiple parameters passed to a block.

Using UNIX to preprocess CoffeeScript
Mateusz Lenik wrote a blog post this week on how to use the UNIX C preprocessor as a replacement for Sprockets, when working with CoffeeScript outside of Rails.

An Unusual Case for Cucumber
Jon Frisby explains that the real value of cucumber is the ability to describe intention within your tests.

Rake Global Tasks
Jacob Swanner wrote a blog post explaining how to define global rake tasks, which you can call from anywhere within your system.

Episode #405 – September 24th, 2013

Posted 7 months back at Ruby5

Ruby 2.1.0 preview1, Rails Console on the Browser, Splatting in Iterators, Unix Preprocessing, Cucumber and Global Rake Tasks all on today's Ruby5!

Listen to this episode on Ruby5

This episode is sponsored by Top Ruby Jobs
If you're looking for a top Ruby job or for top Ruby talent, then you should check out Top Ruby Jobs. Top Ruby Jobs is a website dedicated to the best jobs available in the Ruby community.

Ruby 2.1.0 preview1 released
Ruby 2.1.0 preview1 has been released, lots of cool new features. 2.1.0 final is scheduled for a Christmas release.

Rails Console on the Browser
The Rails organization on github released rails console which lets you spin up a console from inside your browser.

Splatting in Iterators
Andrius Chamentauskas wrote a blog post explaining how Ruby actually splits arrays in iterators by allowing you to access multiple parameters passed to a block.

Using UNIX to preprocess CoffeeScript
Mateusz Lenik wrote a blog post this week on how to use the UNIX C preprocessor as a replacement for Sprockets, when working with CoffeeScript outside of Rails.

An Unusual Case for Cucumber
Jon Frisby explains that the real value of cucumber is the ability to describe intention within your tests.

Rake Global Tasks
Jacob Swanner wrote a blog post explaining how to define global rake tasks, which you can call from anywhere within your system.

Phusion Passenger 4.0.19 released

Posted 7 months back at Phusion Corporate Blog


Phusion Passenger is a fast and robust web server and application server for Ruby, Python and Node.js. It works by integrating into Apache and Nginx and turning them into a fully-featured application server. It has high-profile users such as New York Times, AirBnB, Juniper, Motorola, etc, and comes with many features that make your life easier and your application perform better.

Phusion Passenger is under constant maintenance and development. Version 4.0.19 is a bugfix release.

Phusion Passenger also has an Enterprise version which comes with a wide array of additional features. By buying Phusion Passenger Enterprise you will directly sponsor the development of the open source version.

Recent changes

Version 4.0.18 was a test release for testing Debian packaging fixes and Heroku fixes, so its announcement has been skipped. The changes in 4.0.18 and 4.0.19 together are as follows:

  • Fixed a problem with response buffering. Application processes are now properly marked available for request processing immediately after they’re done sending the response, instead of after having sent the entire response to the client.
  • The "processed" counter in `passenger-status` is now bumped after the process has handled a request, not at the beginning.
  • The Enterprise variant of Phusion Passenger Standalone now supports customizing the concurrency model and thread count from the command line.
  • On Nginx, the Enterprise license is now only checked if Phusion Passenger is enabled in Nginx. This allows you to deploy Nginx binaries, that have Phusion Passenger Enterprise compiled in, to servers that are not actually running Phusion Passenger Enterprise.
  • Fixed a performance bug in the Union Station support code. In certain cases where a lot of data must be sent to Union Station, the code is now over 100 times faster.
  • `passenger-status –show=union_station` now displays all clients that are connected to the LoggingAgent.
  • Added a workaround for Heroku so that exited processes are properly detected as such.
  • When using Phusion Passenger Standalone with Foreman, pressing Ctrl-C in Foreman no longer results in runaway Nginx processes.
  • Fixed backtraces in the Apache module.
  • [Enterprise] Fixed an off-by-one bug in the `passenger_max_processes` setting.

Installing 4.0.19

Quick install/upgrade

Phusion Passenger Enterprise users can download the Enterprise version of 4.0.19 from the Customer Area.

Open source users can install the open source version of 4.0.19 with the following commands. Note that these instructions are very basic and may not cover steps that may be relevant to your specific system, such as setting up the right file permission. Please refer to the in-depth instructions if you have trouble installing.

gem install passenger
passenger-install-apache2-module
passenger-install-nginx-module

You can also download the tarball at the Release Archive page. We strongly encourage you to cryptographically verify files after downloading them.

In-depth instructions

In-depth installation and upgrade instructions can be found in the Installation section of the documentation. The documentation covers.

  • Detailed tarball installation instructions.
  • Detailed upgrade instructions.
  • Installation troubleshooting.
  • Installation through APT and YUM.
  • Installation through OS X Homebrew.

You can view the documentation online here:

Final

Fork us on Github!

Phusion Passenger’s core is open source. Please fork or watch us on Github. :)

<iframe src="http://ghbtns.com/github-btn.html?user=phusion&amp;repo=passenger&amp;type=watch&amp;size=large&amp;count=true" allowtransparency="true" frameborder="0" scrolling="0" width="170" height="30"></iframe><iframe src="http://ghbtns.com/github-btn.html?user=phusion&amp;repo=passenger&amp;type=fork&amp;size=large&amp;count=true" allowtransparency="true" frameborder="0" scrolling="0" width="170" height="30"></iframe><iframe src="http://ghbtns.com/github-btn.html?user=phusion&amp;type=follow&amp;size=large&amp;count=true" allowtransparency="true" frameborder="0" scrolling="0" width="190" height="30"></iframe>

If you would like to stay up to date with Phusion news, please fill in your name and email address below and sign up for our newsletter. We won’t spam you, we promise.



Episode #404 – September 20th, 2013

Posted 7 months back at Ruby5

Today only! Make your shell explain itself, tweaking (not twerking) your MRI GC settings, gsub with blocks, rconsole and something about pirates!

Listen to this episode on Ruby5

This episode is sponsored by New Relic
New Relic is _the_ all-in-one web performance analytics product. It lets you manage and monitor web application performance, from the browser down to the line of code. With Real User Monitoring, New Relic users can see browser response times by geographical location of the user, or by browser type.

Explain Shell Gem
Richard Schneeman released the explain_shell gem this week that allows you to invoke http://explainshell.com from the command line.

Gsub with blocks
Bozhidar Batsov goes over using gsub with a block.

Hexpress
A gem from Kurtis Rainbolt-Greene that gives a nice DSL for crafting regular expressions.

jQuery autocomplete with Capybara 2
A quick explanation of Capybara 2's wait-and-retry find behavior by Trang Le.

Tweak your MRI GC settings
In a very short post, Fred Wu shows how to tweak your GC settings in MRI.

Rconsole
Rconsole lets you log from your Rails app and see those messages in your browser console.

Experiences with Firefox OS and the ZTE Open

Posted 7 months back at townx - tech

Exit Galaxy S2

I had a Galaxy S2 for a couple of years, which was a brilliant phone. It's Android, so you are spoilt for choice as far as apps go: my main use of the device was for multimedia, watching Netflix, iPlayer, stuff on my NAS drive (via BubbleUPnp, the best Android UPnP client, by the way), Sky Go (it's one of a handful of compatible devices), listening to music and radio shows. Using the excellent SwiftKey virtual keyboard, typing was fast and easy, so I also used it for personal email, Twitter, Facebook etc. The camera was great; so good that I'd stopped using our digital camera in favour of the S2.

But problems started a few months back. The microSD card somehow got corrupted, so I lost a load of photos. The USB port (or the system's detection of it) got flaky, so sometimes it continued to behave as if it was charging, even when unplugged. I couldn't reliably connect the USB to download files from it. I couldn't update the operating system, so more and more apps were becoming incompatible.

Enter ZTE Open

Eventually I realised I was going to need a new phone, contract-free (I use giffgaff). Because I like a challenge, and I work in open source, and some of my friends and old colleagues work on it, and because it uses HTML5 for its whole UI, I went for a SIM-free ZTE Open running Firefox OS (£60 on eBay).

On paper, Firefox OS sounds like a great concept: fully open source, most of the userland apps in HTML5, extensive web APIs for third party developers to interact with system services. However, my disappointment on first trying the phone was almost palpable. In fact, my first impressions were so very bad that I contemplated selling it on eBay within about an hour of unwrapping it. I was going to write a thorough review explaining why, but then this Phones Show video summed it up. As a phone, this device is barely adequate, for all the reasons explained there. I'll summarise the salient points:

  • The capacitive screen is so unresponsive, it feels like a resistive screen.
  • The camera has no flash and is only 3 mega-pixels. I could have worked this out beforehand, but it never occurred to me that a phone would be sold without a flash in 2013.
  • The onscreen keyboard is unpredictable, fiddly and generally a very poor experience. I end up having to correct mistakes so often that I've practically given up using it for anything other than text messaging. Even then, the experience is about as good as typing on hardware keys 10 years ago (remember that?).
  • The user experience when using some of the applications is just dreadful. For example, if you use the Twitter app to follow a link, the link opens in a browser and the Twitter app disappears (closes itself, I'm guessing). You end up having to restart the Twitter app and scroll back to the place you'd got to in the status updates list.
  • The app-store is full of hobby projects or very thin wrappers around mobile websites. The quality is generally quite poor.
  • Some mobile sites don't recognise the phone, or think it's Android, or are so slow they're unusable. So iPlayer, Amazon Cloud Reader (there's no Kindle app), and Evernote are inaccessible. I'm guessing there are lots more. Other sites like GMail look like they did 5 years ago, as you get the default "we're not really sure which phone you're using" interface.
  • Because there's no widgets API as far as I can tell, you can't easily shortcut to tasks you might need to do often (e.g. change screen brightness: to do this, you have to dig into the configuration app, which takes a click, a scroll, another click, and a slide; I can't bear auto-brightness, as the screen brightness fluctuates madly in the British weather).
  • Setting up the email app for an IMAP server took me forever, until I realised that it was because the SSL certificate the email server was using was registered to a different domain name. Once I ping'ed the IP address and got the "real" domain name, and used that instead of the alias, it worked. I've never had this issue with any other email app, on Android or Linux or Windows or Mac, which will either carry on regardless or give you a decent error message about why they're hesistating. No normal user is going to know how to sort this out (though admittedly they'll probably be using GMail or Yahoo).
  • Setting up the weather app to show me the weather for where I live, automatically when I open it, took forever. I ended up going to the mobile site (instead of using the Accuweather app, which couldn't seem to remember my location), finding the weather for where I live, and bookmarking that instead. And of course there's no widget (see above) so you can see it at a glance.
  • The contacts app has no integration with Google contacts, only Facebook. It can import contacts from a SIM, though in my case they are a complete mess as I was maintaining contacts in Google contacts.
  • Updates failed for me for about a week. I kept getting a notification that there was an update, and when I tried to download it, I got a generic "update failed" message.
  • The web API has some big gaps which prevent you from writing certain types of apps (e.g. anything using udp). This is a bit developer-specific, but it puts a leash on how useful the phone is even to developers.

Within a few days of purchasing it, I realised it just wasn't going to do for general day-to-day use. I actually forked out for a very cheap (£50) Android (Jelly Bean) tablet from Amazon (I think I should have spent a bit more money, as the web browsing on it is a bit crap, but games and multimedia work fine; the screen is only adequate; and the system clock drifts incessantly, which is irritating).

Having said all this, the good points of the ZTE Open are:

  • It was dirt cheap.
  • The phonecall and text functionality are acceptable (I am using it as my everyday phone).
  • It integrates with Google calendars.
  • It is light and compact.
  • The battery life is excellent (though probably because I don't use it much).
  • I like the data usage monitoring (useful if you're on a capped-broadband or pay-as-you-go SIM).
  • Wireless works fine. I haven't had any issues with it on my wifi, unlike the chap in that video review. Though it does randomly drop off wifi occasionally.
  • Firefox is a decent mobile browser.
  • It is an incredible achievement to put together an operating system for a mobile device and get it to market. I have only admiration for the team that managed it.

It's also worth bearing in mind the context for the device. It's not a "first world smart phone", more a "developing markets first smart phone". In that context, it's great. I imagine even having internet access on a phone would be a massive boon in some countries (I remember how exciting it was when I got my first hand-me-down HTC phone a few years ago). Data usage is likely to also be important in countries where phone companies are still developing infrastructure, and contracts are likely to be capped.

Marconi

And, this isn't the end of the story from my point of view. Once I got over the initial disappointment of how incomplete, inadequate and substandard this device is as a phone, and ordered an Android tablet to take up the slack, the "pressure" was off the ZTE Open. I could lower my expectations because I didn't need it to be anything more than a phone. Any functionality on top of that was a bonus. With this new (more realistic) perspective, I could more easily see the possibilities. Here was a phone which I could develop apps for, using my existing skills and toolchain, without having to run cumbersome SDKs and emulators (I have tried Android development in the past, but it's not really my thing).

Recently, I've been downloading radio shows and podcasts, and listening to them while walking around, after dropping the kids off at school, picking them up, shopping etc. Firefox OS has a music player, which is OK though basic. But this app, like most other music apps, is focused on playing music: generally short pieces of audio that you might listen to in one sitting, from start to finish. By contrast, listening to radio shows is more like watching a film on Netflix or reading a book on a Kindle: you might listen to the first half hour, then switch it off, then go back to it later.

Most music apps don't cope with this use case, where you "pick up" an audio file for a while then set it down, so you can come back later. The main feature you need for this is to track progress through an audio file and persist it, so a user can return to the same point they reached earlier. (The way Netflix and Kindle do for movies and books respectively.) On top of this, I also wanted a music player that showed me the full title and album for a track without truncating it or scrolling it leisurely into view; group by album as the default (as the album for a podcast or radio series tends to be the important thing, rather than the artist). Another useful feature is a slider for scrubbing through a track, while being able to see where you are in it (the Firefox OS Music app isn't great for this); and skip buttons to jump over the start of an audio file (where they tend to do introductions and adverts). I also wanted standard features music app features, like being able to quickly go back to the last thing I listened to. And I didn't want loads of other features that I rarely use or care about, like playlists and album cover art.

I started a project called Marconi, and audio player focused on audio rather than music. My first step was ripping some files out of the Firefox OS Music app for decoding the ID3 tags out of mp3 files (the beauty of open source). I then wrote a wrapper round the Firefox OS deviceStorage API, so I could read audio files from the phone's hard drive and get their metadata. Initially, I just had a very simple list view of the files as an HTML file.

Next, for testing, I installed and setup adb (Android Debug Bridge) and the Firefox OS simulator (as documented on the Mozilla developer network). Shortly, I got Marconi running in the simulator (once I'd recognised this bug was holding me up).

After that, it took me a while to realise the steps I needed to be able to push stuff to the phone. For those of you who might be similarly struggling (it was the main barrier for me), on Fedora Linux the steps are:

  • Unplug your Firefox OS phone from your development machine.
  • On your development machine, close Firefox.
  • On your development machine, you need a rule so that udev will recognise your phone when plugged in via USB (at least, I think you do; I get so confused sometimes). Add a file /etc/udev/rules.d/60-fxos (owned by root:root, chmod 644) with this content:

    SUBSYSTEM=="usb",ATTR{idVendor}=="19d2",MODE="0666",GROUP="plugdev"
  • Restart udev, probably sudo udevadm control --reload-rules. It all gets a bit vague here, but I just checked and this seems to work.
  • Kill any existing adb server instances.
  • Start adb as root. AS ROOT. You can probably do it as non-root, but will have to fiddle about with all sorts of permissions. I spent a while on this before giving up and resorting to root.
  • Run adb devices and ensure you see a line like "roamer2 device". If you get "Insufficient permissions", restart adb with your fingers crossed and/or a prayer on your lips and try again.
  • On your Firefox phone: make sure you have remote debugging enabled (Settings > Device information > More information > Developer > tick "Remote debugging"); and turn USB mass storage off (Settings > Media storage > untick "USB mass storage" so it is disabled).
  • Open Firefox, then the Firefox OS simulator.
  • Plug the phone into your development machine. Hopefully it will show up in the simulator tab. You should now be able to push apps to it.

One other thing which wasn't very clear from the docs: you will need a manifest file, called something like manifest.webapp (the .webapp is important) to be able to load your app into the simulator. It's explained in detail on the Mozilla developer site.

I continued developing the app, which uses Bootstrap 3 for most of the UI (I'm not 100% sold on it, but it's quite lightweight and looks pretty good), jQuery UI for the slider (it's the best HTML5 slider in my opinion), some media player code I wrote on a previous project (which wraps HTML5 <audio>), localStorage to persist progress data, and Stapes for event handling and the model layer. There are a couple of screenshots below.

Notes: the screen on the left is scrolled up a bit so you can see the progress bars for two files; the buttons are positioned so I can reach them with a thumb when holding the phone with one hand; the slider updates the progress text at the top as you slide, and you can slide it to reach right to the start or end of a track - difficult to do precisely with the default Firefox OS Music app; progress bars on the home screen update in real time as you're listening to a track; the top-right notes button takes you back to the "last played"/"currently playing" track.

Finally, after quite a bit of work, I have an app which does what I want, for now. It won't scale to thousands of files, only copes with mp3s, doesn't do playlists or album art; but it is optimised for me: it remembers what I listened to last, it tracks my progress through audio files, it shows me full album and track titles, and it has BIG UI elements and fonts which I can easily see and press while I'm walking around. Yes, it's fairly ugly, the proportions are all wrong, it's not perfect by any means, but it suits me very nicely.

The moral of this story is that while Firefox OS is terrible as a end-user phone in 2013 (well, about as good as the phone I had 10 years ago), it is great as a platform for experimenting with HTML5 web apps in a real mobile environment. I don't think of my ZTE Open as a phone so much; more as a custom media player which I wrote myself, with the phone functionality as a bonus. Which is a rewarding feeling to have.

Episode #403 - September 17th, 2013

Posted 7 months back at Ruby5

We set the Collect the Garbage, setup the Environment, and lay down some Expressions about Onebox and Shortcodes on this episode of Ruby5.

Listen to this episode on Ruby5

Splash Shower Tunes
Splash Shower Tunes is a Bluetooth, waterproof speaker that gives you complete control of your iPhone in the shower. With it, you can skip tracks, play and pause your favorite music apps, or even telephone answer calls without the need to dry off. Listeners of this podcast can get it, for just $40.

Use of Rails Environments
Enrico Teotti recently put together a blog post called “Use of Rails Environments”. In the post he gives a quick introduction to the default environments in Rails and some pointers on how to use ENV variables to configure your systems.

Onebox - Gather preview data for URLs
Have a URL and need to display some information about it? Open Graph not cutting it? Check out the Onebox gem from Team Dysania. Onebox is a gem which implements "engines" to collect useful, preview-like information from many websites and services.

Create custom content macros with Shortcode
WordPress provides a macro-like functionality for content writers called shortcodes. And, now with the Shortcode gem, from Jamie Dyer, you can get the same functionality for your application.

Ruby 2.1 Garbage Collection
Last weekend at Baruco, Matz announced that Ruby 2.1 will sport a generational garbage collection engine and it is expected to be released before the end of 2013. Over on InfoQ, Manuel Pais put together a post with some GC links and benchmark details.

Postgres_ext adds rank and common table expressions
An update to postgres_ext was recently released which adds rank and common table expression support to ActiveRecord.

TDD and BDD in Ruby
Roy Osherove wrote in to let us know about his TDD and BDD udemy course which he just released and is offering for free to Ruby5 listeners if you use the link in the show notes. In it, you’ll learn how to go from zero to RSpec, including mocking, stubbing, and other isolation techniques.

Ruby Science Turns One Today

Posted 7 months back at GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS - Home

One point oh, that is! I’m very pleased to announce that Ruby Science 1.0 has just hit the digital presses.

Ruby Science has come a long way since its initial release last December. The book now contains 40 action-packed chapters - pun intended. It also received a complete redesign and typographical refresh in the pursuit of improved readability. Since the beta releases, the book has received a thorough technical review by the developers at thoughtbot as well as professional editing. Lastly, we’ve updated the chapter lineup a bit.

By reading Ruby Science, you’ll learn to detect code smells, discover ways to refactor sticky code, and read about patterns you can use to solve common issues. You’ll also read about useful principles for writing fast, fun, and flexible code. Your purchase gets you access to the 1.0 release, all future updates, and the companion example application.

Previous purchasers and Prime subscribers can grab the release on Learn.

Get your copy of Ruby Science today!

Available For Free With Learn Prime

If Ruby Science strikes your fancy, you may also be interested in our subscription service, called Learn Prime.

For as little as $29/month, you get ongoing to our books like Ruby Science, screencasts, access to exclusive subscriber content, a forum to ask thoughtbot your toughest Ruby, Rails, and refactoring questions, and more.

Subscribe now.

Ruby Science Turns One Today

Posted 7 months back at GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS - Home

One point oh, that is! I’m very pleased to announce that Ruby Science 1.0 has just hit the digital presses.

Ruby Science has come a long way since its initial release last December. The book now contains 40 action-packed chapters - pun intended. It also received a complete redesign and typographical refresh in the pursuit of improved readability. Since the beta releases, the book has received a thorough technical review by the developers at thoughtbot as well as professional editing. Lastly, we’ve updated the chapter lineup a bit.

By reading Ruby Science, you’ll learn to detect code smells, discover ways to refactor sticky code, and read about patterns you can use to solve common issues. You’ll also read about useful principles for writing fast, fun, and flexible code. Your purchase gets you access to the 1.0 release, all future updates, and the companion example application.

Previous purchasers and Prime subscribers can grab the release on Learn.

Get your copy of Ruby Science today!

Available For Free With Learn Prime

If Ruby Science strikes your fancy, you may also be interested in our subscription service, called Learn Prime.

For as little as $29/month, you get ongoing to our books like Ruby Science, screencasts, access to exclusive subscriber content, a forum to ask thoughtbot your toughest Ruby, Rails, and refactoring questions, and more.

Subscribe now.