Category Archives: Computers

Mongoid Cache Sweeper

I just needed to add a Cache Sweeper in a Rails 3.1 app for a Mongoid model.

Using a ActionController::Caching::Sweeper didn’t run for updates on the models (even though it should work for non-Mongoid-models), so I ended up using a Mongoid::Observer to invalidate the cache when a model was updated.

To seperate the observers from the models, I created a app/observers directory and used the following code to automatically load the observers:

# mongoid observers/sweepers
config.mongoid.observers = Dir["#{config.root}/app/observers/*.rb"].collect do |full_name|
  File.basename(full_name,'.rb').to_sym
end

This is the app/observers/city_observer.rb file:

class CityObserver < Mongoid::Observer
  def after_create(city)
    expire_cache_for(city)
  end

  def after_update(city)
    expire_cache_for(city)
  end

  def after_destroy(city)
    expire_cache_for(city)
  end

  private

  def expire_cache_for(city)
    # expire fragments/pages for city
    @c ||= ActionController::Base.new

    @c.expire_fragment("city_#{city.id.to_s}")
    if city.state.present?
      @c.expire_fragment("state_#{city.state.id.to_s}")
    end
    if city.country.present?
      @c.expire_fragment("country_#{city.country.id.to_s}")
    end

    # and expire the continent page cache
    @c.expire_page("/continents/#{city.country.continent.slug}")
  end
end

Since the expire_fragment/expire_page functions are not defined in the observer, I create a ActionController::Base object to call them on that.

With this, a model update expires cached pages

OS X: Ignore USB Storage device temporarily

I needed to ignore an USB storage device, or at least disable the automount feature for it, because I wanted the USB device to be available for VirtualBox.
There does not seem to be an device-specific ignore functionality, but in my case it was enough to temporarily unload the USB storage kext:

sudo kextunload /System/Library/Extensions/IOUSBMassStorageClass.kext

This will disable all USB storage media temporarily!
When you are finished using the USB storage device in VirtualBox, shut it down, and then do a

sudo kextload /System/Library/Extensions/IOUSBMassStorageClass.kext

to restore the USB storage functionality.

Open SSH Connections with Butler

How to use Butler, screen, SSH and some shell Skripts to open SSH Connections to some servers.
First, create a directory which will contain the script(s) to connect to the servers – I use ~/bin/Terminals. In that, place a file containing the following code:

#!/bin/bash
exec ssh -t `basename $BASH_SOURCE` screen -DR ; exit

The filename should be the servername to connect to, you can use ~/.ssh/config to define short aliases for your servers:

Host myshortalias HostName long.hostname.tld User ausername

This allows you to do ssh myshortalias to connect to the server in question. So, to connect to this server, name the file in ~/bin/Terminals myshortalias.
Make the myshortalias file executable: chmod 755 myshortalias
Try to open a connection via the myshortalias file: ./myshortalias — if this fails, you problably don’t have screen installed on the server – I really recommend to install it.
OK, if that works, disconnect from the server, and open the Butler Configuration.
Expand the “Hidden” elements, if they are not visible. Select “Add File” from the plus button. Navigate to the ~/bin/ folder and select the “Terminals” folder to add it to the Butler Configuration.
Select the “Terminals” container, open the “Triggers” tab, assign a Hot Key, change mode to “Opens a menu near the mouse”.
Select the “Terminals” folder, select the “Menu Filter” tab, change ‘Menus show…’ to “this folder’s content with X levels of recursion”, activate “Translate subfolders into menus”.
Select the “Options” tab and change the ‘Open with…’ setting to “Terminal” (or iTerm or …).
Pressing your hot key should now show a menu with the myshortalias script. You can add subfolders to the ~/bin/Terminals folder to group your servers. To add a server, just copy (or even better: hard-link) the myshortalias file to a new name which corresponds to a Host config in ~/.ssh/config.

Thunderbird reply_regexp beibringen

Früher, im mutt gab es das schöne “reply_regexp” um die ‘AW:’-Einträge in den Replies von Windows-Mailern rauszufiltern .. lange Zeit habe ich das im Thunderbird vermisst.
Doch nun stolperte ich endlich über Thunderbird FAQ: Aw statt Re und die darin beschriebene user-pref macht nun auch im Thunderbird endlich das vom mutt gewohnte:

user_pref("mailnews.localizedRe", "AW,Aw,Antwort");

Mac Mini und der Spachtel

Wir haben auf der Arbeit einen neuen Mac Mini, der aber mit 512 MB etwas wenig Hauptspeicher hatte. Also mehr Speicher bestellt, und ich sollte den kleinen dann aufrüsten.

Nach etwas google befragen stellte sich dann heraus, das man dem Gehäuse wohl am besten mit einem Spachtel (!) zu Leibe rückt, um an das Innenleben ran zu kommen.

Gesagt, getan, sowas hat man ja in der Werkzeugkiste, also ran an den Speck … eeeh, Mac Mini. Nach einigem Fluchen hatte ich das Gehäuse dann endlich auf und konnte den Speicher ersetzen, das war dann alles relativ einfach.

Mehr Bilder gibt es unter http://unorganized.net/pictures/macmini_aufruesten/

Element.toggle

Note to self: Wenn man mit Prototype und versteckten divs spielt, muss display:hidden inline definiert werden, also im style-Attribute des div-Elements selber, sonst klappt das nicht.

Ajax und IE

Da ich grad auf der Arbeit mit Ajax rumspiele …

Der IE hat nen Bug, wenn man den Inhalt von select-Elementen mit innerHTML austauschen will, dabei geht das erste option-Element kaputt.

Workaround: Das select-Element mit einem div umgeben und das select komplett austauschen, das geht.