Recently, I found myself re-installing everything from Homebrew and began to notice that MySQL was consuming nearly half a gig of memory. Given that I don’t do too much with MySQL on a regular basis, I opted to override a handful of default configuration options to reduce the memory footprint.
As you can see, a fresh MySQL install via homebrew was consuming over 400mb of memory.
Here is how I reduced my memory footprint:
$ mkdir -p /usr/local/etc
Unless you already have a custom MySQL config file, you will want to add one into this directory.
$ vim /usr/local/etc/my.cnf
We’ll then paste in the following options into our file… and save it.
# Robby's MySQL overrides [mysqld] max_connections = 10 key_buffer_size = 16K max_allowed_packet = 1M table_open_cache = 4 sort_buffer_size = 64K read_buffer_size = 256K read_rnd_buffer_size = 256K net_buffer_length = 2K thread_stack = 128K
Finally, we’ll restart MySQL.
$ mysql.server stop
If you have MySQL setup in
launchctl, it should restart automatically. After I did this, my MySQL instance was now closer to 80mb.
So far, this has worked out quite well for my local Ruby on Rails development. Mileage may vary…
Having said that, how much memory are you now saving?
Welcome to what seems like my tenth installment (actually, it’s the fourth) of showing you how I setup my development environment on a fresh OSX install. In this case, I’m actually getting a MacBook setup for a new employee with Snow Leopard.
Over the years, I’ve evolved these following steps and they’ve helped our team maintain a consistent and stable envirnment for Ruby on Rails development. I know that there are a few other ways to approaching this and I’m sure you’ll get similar results, but this approach has allowed me to maintain a hassle-free setup for the last five years.
As with all things… your milage may vary.
During this initial phase, we’re going to install the primary dependencies and setup our environment.
The first thing that you’ll need to do is install XCode, which almost everything depends upon as this will install developer-friendly tools for you. Apple has been kind enough to ship this on your Snow Leopard DVD.
Go ahead and install XCode from the Optional Installs folder.
(might require a reboot)
You can also download it online.
Now we’ll install MacPorts, which the web site describes itself as, “an open-source community initiative to design an easy-to-use system for compiling, installing, and upgrading either command-line, X11 or Aqua based open-source software on the Mac OS X operating system.”
As I’ve said in past versions of this guide, this tool is about to become one of the most important tools on your operating system. It’ll be used time and time again to maintain your libraries and many of the Unix tools that you’ll be using. If you’re from the Linux or BSD world, you are likely familiar with similar tools… such as:
You’ll want to download the latest stable version from http://www.macports.org/. Once downloaded, you can install it.
Once this is installed, you’ll be able to use the
port command from your console.
Let’s test out your MacPorts install by installing a useful tool called wget, which we’ll use to install oh-my-zsh.
sudo port install wget
Git and Subversion
Every development environment should have some source code management tools available. We’ll install both of these with one command.
sudo port install git-core +svn
This will install git and subversion.
Oh My Zsh is the most amazing thing to happen to shells since… well since I said so. It’s one of my open source projects that I encourage you to give a whirl.
wget http://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
That’s it. The next time you open up your terminal, you’ll be running zsh with a bunch of stuff available. For more information, visit http://github.com/robbyrussell/oh-my-zsh.
Terminal theme (optional)
I never understood why the icon for Terminal has a black background but when you start it up the default theme is black on white.
Anyhow, I’m a fan of the the dark background. To change this, open up preferences in Terminal. Select Pro, then click on the Default window so that this sticks around.
Let’s now open up a new Terminal window..
You should be looking at something like this:
Much better… let’s continue.
We’re now going to start installing everything we need to get this running.
First up, Ruby.
Snow Leopard includes Ruby and Rails already installed, but we’re going to back these up for a rainy day. Just issue these commands:
$ sudo su - Password: :~ root# mv /usr/bin/ruby /usr/bin/ruby.orig :~ root# mv /usr/bin/gem /usr/bin/gem.orig :~ root# mv /usr/bin/rails /usr/bin/rails.orig :~ root# logout
Now we’ll go ahead and install a fresh copy of Ruby and RubyGems via MacPorts.
sudo port install ruby rb-rubygems
You should now see something like this for a bit…
Let’s watch a video about bumble bees.
When it finishes installing, you should check that Ruby is available to you and installed in
We’ll also take a second to create a symlink for this as some tools seem to rely on
/usr/bin/ruby being there.
sudo ln -s /opt/local/bin/ruby /usr/bin/ruby
Great, let’s move on.
Now that we have Ruby installed, we’re going to take a quick detour to setup Passenger with the Apache server already available on your machine. I’ve been a big fan of using Passenger for your development for over a year now.
sudo gem install passenger
Once the gem is finished installing, you’ll need to install the apache2 module with the following command:
It’ll ask you to continue by pressing Enter. At this point, it’ll check that you have all the necessary dependencies and then compile everything needed for Apache2.
Now I’ll force you to watch a highlights reel of Fernando Torres… the best striker in the world!
The passenger install will then show you this output, which you’ll want to stop and read for a moment and highlight the following:
Then using vi or emacs, you’ll want to create a new file with the following content:
Then paste in the following (what you highlighted and copied above.)
LoadModule passenger_module /opt/local/lib/ruby/gems/1.8/gems/passenger-2.2.9/ext/apache2/mod_passenger.so PassengerRoot /opt/local/lib/ruby/gems/1.8/gems/passenger-2.2.9 PassengerRuby /opt/local/bin/ruby
You’ll also want to include the following below what you just pasted.
# Set the default environment to development RailsEnv development # Which directory do you want Apache to be able to look into for projects? <Directory "/Users/ryangensel/development"> Order allow,deny Allow from all </Directory>
You’ll want to quickly start up your web sharing, which will start Apache2 up via your System Preferences.
Simple enough… moving forward.
Passenger Pref Pane
To make things as simple as possible, I’d encourage you to install the Passenger Preference Pane (view this post for a download).
I have a directory named
development/ in my home directory, which is where I end up storing all of my projects. This should match whatever you put above in the apache configuration (
mkdir development; cd development;
Installing Ruby on Rails via RubyGems
Now we’ll use RubyGems to install the latest version of Ruby on Rails (and all of it’s dependencies).
sudo gem install rails
While this is installing, you can watch a video from my old band that ended around the time that business started picking up for Planet Argon.
Great, let’s test out the install of Rails…
Test Rails and Passenger
In your development directory, let’s quickly a new Rails app…
This will generate a new Rails application in a
Now open up the Passenger Preferences Pane and add this directory as a new application.
You should now fire up your browser of choice and head to
http://testapp.local. If all has worked, you’ll see a, “Welcome aboard” screen from the Ruby on Rails application.
Assuming that this worked for you, let’s take a quick break to make some tea…
In this last phase, we’re going to install a few database servers and corresponding rubygems so that you can get to work.
At this point in time, the current stable version of PostgreSQL via MacPorts is 8.4.x. Let’s install that now…
sudo port install postgresql84 postgresql84-server
Once this finishes compiling, you’ll need to run the following commands to setup a new PostgreSQL database.
sudo mkdir -p /opt/local/var/db/postgresql84/defaultdb sudo chown postgres:postgres /opt/local/var/db/postgresql84/defaultdb sudo su postgres -c '/opt/local/lib/postgresql84/bin/initdb -D /opt/local/var/db/postgresql84/defaultdb'
Assuming that you want PostgreSQL to always be running, you can run:
sudo launchctl load -w /Library/LaunchDaemons/org.macports.postgresql84-server.plist
...and to start it right now, run:
sudo launchctl start org.macports.postgresql84-server
Before you can start using it, we’ll need to make sure that the PostgreSQL executables are available in your shell path. Since you’re now using oh-my-zsh, you’ll want to edit
~/.zshrc with your favorite editor.
Just append this to
export PATH= line in the file.
Your PATH might look something like the following now:
@# Customize to your needs… export PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/lib/postgresql84/bin@
Setup database user
To setup a new database (with superuser credentials), just run:
createuser --superuser ryangensel -U postgres
We’ll now test creating a database:
Let’s test that we can access it…
➜ ~ psql test_db psql (8.4.2) Type "help" for help. test_db=# \q
Great, let’s drop it now.
➜ ~ dropdb test_db ➜ ~ psql test_db psql: FATAL: database "test_db" does not exist ➜ ~
Okay, we’ll now install the library that will allow Ruby to talk to PostgreSQL.
sudo gem install pg
Voila… let’s move on to the inferior database…
We’re going to run through the installation of MySQL really quickly because you might need it.
sudo port install mysql5 mysql5-server
This took ages on my machine… so let’s watch a video.
We’ll now setup the database and make sure it starts on system boot.
sudo -u _mysql mysql_install_db5 sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist sudo launchctl start org.macports.mysql5
Let’s test that we can create a database now (and that it’s running.)
➜ ~ mysql5 -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.1.43 Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> create database test1; Query OK, 1 row affected (0.00 sec) mysql> \q
Great, we’ll now install the library that will allow Ruby to talk to MySQL.
sudo gem install mysql -- --with-mysql-config=/opt/local/lib/mysql5/bin/mysql_config
That should be it!
Phase Four, next steps
Okay… so we’ve installed XCode, MacPorts, Ruby, Rails, PostgreSQL, MySQL… and I’ve also got you to switch your default terminal shell from bash to zsh. You might take a look over the available themes for Oh My Zsh so that you can personalize your terminal experience even further.
You also now have a handful of gems installed as you can see with
This is the fourth version of this guide and I’ve appreciated the hundreds of comments, questions, and emails that I have received… let’s not forget all those beers that people buy me when I’m at conferences. :-)
I hope you have found some of this useful. If you have any problems and/or questions, don’t hesitate to post them in the comments section below.
Inspired by some recent posts from Tom on zsh, I decided that I’d do my part to help people give it a whirl. I’ve been using zsh for a few years now and haven’t found myself missing bash.
If you’re interested in taking a few minutes to give zsh a while, you’re in luck. I recently reorganized all of my zsh config into a package and tossed it on github to share. My goal was to create a reusable tool that would allow people to get up and running quickly with some of the fun configuration that I’ve come to rely on on a daily basis.
- Auto-complete rake and capistrano tasks
- Git branch names when you’re in a git project directory structure
- Tons of color highlighting (grep, git, etc.)
- Sexy prompts.. (so say me)
- much much more…
Also, Oh My Zsh is Snow Leopard compatible. ;-)
It’s been over 83,520 minutes since I made the switch from using mongrel as my development environment web server to Phusion Passenger. I’ve been extremely impressed with it. Our team has all switched over and haven’t really hit any obstacles in the transition.
Since some people asked me to let them know how this trial period worked out, I felt it was my duty to encourage you all to try it. You can check out my previous post, Switch to Passenger (mod_rails) in development on OSX in less than 7 minutes or your money back! to get rolling.
Additionally, if you’re looking for a streamlined Ruby on Rails deployment environment that includes Passenger, check out Rails Boxcar.
We recently switched our default builds of Rails Boxcar to leverage the benefits of using Passenger (mod_rails) for deployment of your Ruby on Rails applications and it’s been working out great for our customers. Several of our customers and colleagues mentioned that they also began using Passenger in development, which was intriguing.
But… Mongrel has been working great for us for the past few years. Why switch?
It’s true, I’ve been happily using mongrel since it came out as a replacement to webrick back in early 2006, which makes it about 28 in dog years.
But… over the next few weeks, I’m going to evaluate Passenger in my development workflow. There’s no better way to try something then to jump head first. So… here goes.
Our team will be evaluating Passenger in our development work flow with a forthcoming blog post but if you want to get your feet wet right away, here are some instructions for setting up Passenger on OSX with PrefPane, which were inspired by Manfred’s posts.
Installing Passenger via RubyGems
To install Passenger on your OSX machine, just run the following with root credentials.
sudo gem install passenger
This will install the passenger gem on your machine. Now we need to go ahead and run a script that is provided with this gem (also with root credentials).
You’ll want to follow the instructions that appear. When you see something similar to the following output from the command, you’ll want to copy/paste that into an apache configuration file. I just created a file at
Edit this file with your editor of choice
Mine looks like:
#/etc/apache2/other/passenger.conf # Passenger modules and configuration LoadModule passenger_module /opt/local/lib/ruby/gems/1.8/gems/passenger-2.0.6/ext/apache2/mod_passenger.so PassengerRoot /opt/local/lib/ruby/gems/1.8/gems/passenger-2.0.6 PassengerRuby /opt/local/bin/ruby # Set the default environment to development RailsEnv development # Which directory do you want Apache to be able to look into for projects? <Directory "/Users/robbyrussell/Projects/development"> Order allow,deny Allow from all </Directory>
Once you finish running through
sudo passenger-install-apache2-module, you’ll need to restart Apache on your workstation. This can be done by simply turning off/on Web Sharing in your Sharing Preference Pane.
Alright, we got through the hard part. Now, in order for you to begin using Passenger, we need to setup Apache to point to your individual Ruby on Rails application(s). You can hack on Apache configuration files more, but there is an easier way thanks to the Passenger Preference Pane.
This will manage your VHost files for you!
Setting up Preference Pane
If you followed my post on installing Ruby on Rails via MacPorts, you’re going to need to install Ruby Cocoa, which can be done with the following. If you’re using the Ruby provided from Apple, you can skip this step.
sudo port install rb-cocoa
Once that is done, go ahead and move on and download Passenger Preference Pane. Once downloaded, you can install the preference pane, by double-clicking on the following file.
The next part is really simple as well. Just begin to add your various Ruby on Rails projects into the Preference Pane… and when you’re done, you should be able to run your applications over port 80 without any problems.
As you can see, I’ve already setup a handful of projects and we don’t have to start/stop mongrels for each one or worry about port numbers when running multiple projects. (time savings!)
Voila. Simple enough. You might need to stop/start Apache, couldn’t remember if I needed to or not.
For each host that you add into this panel, it’ll automatically be added so that you can immediately browse to http://yourhost.local and it should just work. :-)
Things to still figure out…
Debugging. If you’re used to doing
--debugger, it appears that you can do something similar with the socket-debugger plugin. Not tried it myself, but worth looking into.
Browser testing via VMWare/Parallels/VirtualBox. Does anybody have any tips on how to best appraoch this? Our designers are curious…
As I mentioned, this is day one of trying it out and managed to motivate our entire design and development team to try it with me so that we can all learn about issues together and find solutions quicker. If you’ve been using this approach for a while, I’d be interested in hearing your story and if there are any issues that we should be aware of.
I’ve been really happy with my purchase of 1Password so far. If you’re not familiar with it, I would really recommend their free-trial. I’ve been really impressed with how quickly it became reliant upon it. 1Password works across several browsers, imports existing passwords, and even has integration with your iPhone. However, over the past month, I’ve been wishing that it worked with my Fluid applications.
1Password 2.6.BETA-2 was released a few days ago one of the features added was integration with Fluid applications.
Signing into Lighthouse with 1Password
I’m glad to see that Agile Web Solutions was so quick to respond to the flurry of people requesting this.