Pivotal Labs

How to tell Apple/DotMac/MobleMe Backup that .Trash is trash

edit Posted by Alex Chaffee on Tuesday August 26, 2008 at 07:14PM

First of all, fie on Apple for giving both their cloud storage service and their backup program names that are almost completely google-proof. They've recently corrected one of those by renaming "dot mac" to "MobileMe" but calling your backup program "Backup" is a great way to make it really hard to investigate. It's like, imagine how hard it would be to do a background check on someone named John Doe.

So I use the Dot Mac Backup and it works pretty smoothly, which is the second most important feature in a backup program. (The most important feature is the ability to actually restore files.) But then one day it said that to incrementally back up my "Home Minus Media" set -- the set containing my Home Folder, but excluding big-ticket items like Music, Movies, Backups, Downloads, and so on -- would require 63 DVDs. WTF?

It turned out that the problem occurred after I trashed a few old DVD rips that I had finished watching, and the culprit was the directory /Users/chaffee/.Trash. Seems like the UI was helpfully excluding it from the list of subdirectories of /Users/chaffee, it being a system file and all, so I couldn't mark it to exclude. That's OK, I think, I'm a power user, so I'll just check the box that says "Show invisible system files."

Except there's no such box. Try as I might, I can't find a way to exclude the Trash folder from the UI. I had to dig into the file system and edit Backup's own data file, as follows.

Removing Old Ruby Source Installation After a Leopard Upgrade

edit Posted by Chad Woolley on Friday February 22, 2008 at 02:38PM

Removing Ruby

I just upgraded to Leopard on my Mac. Previously, on Tiger, I had installed Ruby from source, in the default /usr/local/lib prefix. After reading the discussion on the Apple-provided Ruby installation, I decided to try it - mainly to ensure that my apps, such as GemInstaller, play well with it (on Pivotal's Mac pair workstations, we still install Ruby from source, so everything matches our demo/production environments as closely as possible, and things are in consistent locations).

So, I wanted to uninstall the old Ruby source installation, and only have the Apple-provided Ruby on disk. Googling for a few minutes did not provide exact instructions for this, so I'm writing up what I did, in hopes that it will help you!

I didn't use the "--prefix" option when I originally installed Ruby from source, so it was in the default location of /usr/local/lib/ruby, with binaries in /usr/local/bin.

WARNING: Use 'rm -rf' at your own risk - a sleep-deprived encounter with 'rm -rf' and a stray file named '~' is what "motivated" my Leopard upgrade in the first place...

First, I deleted the old ruby libraries/gems, which was easy enough, because they all lived under /usr/local/bin/ruby:

sudo rm -rf /usr/local/lib/ruby

However, this left all the old ruby/gems executables in /usr/local/bin. This resulted in errors when trying to run executable gems that I had not yet installed under the Apple Ruby installation:

$ cheat
/usr/local/bin/cheat:9:in `require': no such file to load -- rubygems (LoadError)
from /usr/local/bin/cheat:9

Instead of a cryptic rubygems error, I should get a 'file not found error':

$ sudo rm /usr/local/bin/cheat
$ cheat
-bash: /usr/local/bin/cheat: No such file or directory

So, I want to purge everything ruby-releated from my /usr/local/bin folder. I whipped up a quick ruby one-liner which just prints out (almost) all ruby-related files in /usr/local/bin:

ruby -e "old_ruby_execs = \`egrep 'rubygems|bin/ruby|env ruby' /usr/local/bin/*\`; require 'pp'; pp old_ruby_execs.split(\"\n\").collect{|line| line.split(':').first}.uniq"

Yeah, I know, ugly and obtuse, but one-liners are kind of fun, and help me remember that Ruby is great tool for sysadmin scripts. Feel free to put it in a class and test it if you are so inclined.

Even though I tried to make a fairly specific regexp for egrep, when inspecting that list, I did find a 'jgem' file, which was part of JRuby. I'm planning on reinstalling JRuby anyway, so I didn't care if that got deleted along with the other ruby stuff.

Anyway, if the output of that looks like everything you want to delete, then run this one-liner to do the actual deed (the 'sudo echo' is to 'prime' the sudo auth, so you don't get a noninteractive password prompt):

sudo echo; ruby -e "old_ruby_execs = \`egrep 'rubygems|bin/ruby|env ruby' /usr/local/bin/*\`; old_ruby_execs.split(\"\n\").collect{|line| line.split(':').first}.uniq.each { |exec| p 'removing ' + exec; \`sudo rm #{exec}\`}"

After that, the only thing that I saw left was the 'ruby' executable itself, which I whacked as well:

$ sudo rm /usr/local/bin/ruby

That seems to be about it, as least good enough to get all the old invalid executables off my path. I'm sure this could have been done cleaner if I had taken more care with the original source install. However, a good brute-force approach never hurt anyone. Much. Feel free to post links to relevant and helpful stuff.

CPU Leak

edit Posted by Alex Chaffee on Wednesday January 02, 2008 at 12:42PM

I just had to quit Firefox for the umpteenth time because it was taking up 25% of my CPU and 1.5 GB of virtual memory. It makes my lap hot and burns down my battery and activates my fan and slows down my click response time. I have no idea if it was Gmail or Google Reader or one of the other JS-heavy apps and frankly, I'm sick of guessing.

Let's face it: the browser is an operating system. It's time it started acting like one.

Here's what I want my next browser to do:

  • Put every tab's JS in its own thread or process space
  • Pause that process when I switch tabs (i.e. I don't want Gmail to check for incoming mail or chats unless it's in a visible tab)
  • Show me a list of the CPU and memory usage of each JS slice like "top" or the Windows process monitor and allow me to kill them without restarting my browser
  • Same goes for Flash but even moreso: I want every seizure-inducing, focus-stealing, ringtone-blaring flash app to be individually killable and blockable
  • Show me the content of the page now even if some stupid ad or web bug or analytics script on a different server is slow to load

And for Santa's sake when I tell you to quit don't swap in every little JS object and free it individually. Throw the whole heap away and quit, damn your eyes!

OK? OK.

Multi-clipboard for Mac

edit Posted by Alex Chaffee on Wednesday June 13, 2007 at 06:27PM

IntelliJ IDEA has a great feature: if you hit control-shift-V you see a list of the ten most recent selections you cut or copied onto the clipboard. Here are two ways to get the same thing on all Mac OS X apps.


Quicksilver's "Clipboard" and "Shelf" plugins

Bottom line:

  1. In QS preferences, go to (top menu) Plugins / (left menu) AllPlugins
  2. Check the 'Clipboard Module' and the 'Shelf Module' so that they get installed
  3. Bounce QS
  4. Go back into QS preferences and go to (top menu) Preferences / (left menu) Clipboard to tweak your clipboard size and behavior
  5. Now copy some text from some app
  6. Now hit Command-Space, then immediately afterwards once QS comes up Command-L to see the Clipboard History window pop up for you.

I think the Shelf module lets you store clips permanently, but I haven't figured out how to use it yet.


JumpCut

A scissors icon will appear in your menu bar. Whenever you cut or copy a text item, it'll be added to that menu. Clippings can also be accessed by a hotkey (default is Control-Option-V.) A little window like the one you see when using the application switcher or the brightness controls will appear. While holding the modifier keys , use the arrow keys to scroll through the stack.

Automatic invocation of multiple OS X terminal windows

edit Posted by Dav Yaginuma on Tuesday March 20, 2007 at 08:35PM

As the righteous wave of Intel iMacs surges into the Pivotal Labs offices, more Pivots are finding themselves working with multiple OS X Terminal windows. The opening and positioning of terminal windows often follows the same pattern: cd into project directory, run mongrel, open next window, cd into project directory, tail the test log, etc.. To avoid violating DRY, I've hacked up some simple ruby scripts that automate the process. See my original post for details and links to the scripts.

Now it's just a matter of running one command: $ terminals.rb myproject This opens up all of the standard windows from the project in their specified positions and running the right processes.