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");
Mail.app im vertikalen Layout
Finally! Zufällig bin ich grade über http://harnly.net/software/letterbox/ gestolpert, was Mail.app zu einem vertikalen Layout verhilft, was ich dann doch sehr vom Thunderbird gewöhnt bin.
Nice!
Spass mit Druckern
Auf der Suche nach der Möglichkeit, eine riesige Mindmap auszudrucken, bin ich über zwei nette Programme gestolpert:
CocoaBooklet ermöglicht es, zusammenfaltbare Booklets auszudrucken
PosteRazor erlaubt es, Grafiken auf mehreren Seiten auszudrucken, und sollte somit die Lösung zu meinem Problem sein.
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/
Webseiten Render Dienst für IE6+7
Da man beim Entwickeln von Webseiten (leider) immer wieder darauf achten muss, das eine Seite auch im Internet Explorer gut aussieht, ist der Dienst von http://meineipadresse.de/netrenderer/ sehr praktisch, um mal schnell ohne ein vorhandenes Windows das Aussehen einer Seite auszutesten.
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.