Funkenrailsdav: Webdav with Rails e.g. for ical

So you want a rails application to give you a webdav? Good, railsdav can do this for you. However, it might take you an hour or two as well to figure out how it works :)

This plugin is a copy of the original railsdav plugin with some modifications to make it run out-of-the-box. Just drop this plugin into your newly created rails application and it becomes a webdav-server. It comes with Authentication, so you can publish and synchronize your ical-files without fear :)

This was done using Rails 2.3.2.

Get it here: http://github.com/funkensturm/railsdav

Presenting: The Funkengallery Demo App

Still in beta mode, but we are proud to present a Rails 2.3 application, modularized in plugins, fully I18n (German, English, Swedish), and of course published at github.

This funkengallery demo application includes demonstration of all our plugins:

  • acts_as_category
  • acts_as_identifiable
  • funkengallery
  • funkenlogin
  • funkenlogin
  • irobot
  • manipulify

Again, this is beta still, which means that for example the admin area wants your models to be called exactly “Category” and “User”. So not 100% modularized yet, but we’re getting there and you can already use it as a perfect standalone application ;)

What’s so special about this gallery is the very dynamic user rights management and the simplicity. It is designed for a complex category tree with many thousands of pictures. However, you might expect flickr design and you get… well… funkengallery. It is different and simpler, but really neat if you want to share your pictures quick, private and with individual user rights.

Screenshots and Demo

Check out our Downloads site to see how you can easily test your local demo.

Git Commands

Weil ich die auch immer wieder vergesse, mache ich mir hier eine Liste mit Git Befehlen.
Sie wird fortwährend erweitert.

Wie bekomme ich eine Datei ignoriert, wenn sie schon vom Index erfasst worden ist, denn nachträglich kann in .gitignore nichts hinzugefügt werden?

# Datei aus dem Index entfernen Syntax:
git update-index --assume-unchanged -- DATEINAME
# Beispiel:
git update-index --assume-unchanged -- db/development.sqlite3
# Datei wieder in den Index aufnehmen:
git update-index --no-assume-unchanged -- db/development.sqlite3

Rails: JPG Bilder kaputt beim Upload (grauer Balken)

Völlig zufällig wurden Bilder beim Upload in Rails mit einem grauen Balken versehen.

Mal viel grau, mal wenig grau. Mann muss genau hinschauen bei diesem Beispiel, ganz unten rechts:

dsc01326jzyuu

Zuerst dachte ich, es sei RMagick, dass versucht das Bild zu verkleinern (resize) und irgendwann merkte ich, dass der Upload an sich schon fehlerhaft war. Dann dachte ich es sei der YUI Uploader, habe aber zum Glück das Problem gefunden.

Zum speichern der Datei habe ich das hier verwendet:

File.open(target, "wb").write(params[:upload].read)

Das darf man nicht! :)
Man muss es so machen:

file = File.new(target, "wb")
file.write params[:upload].read
file.close

Passenger für Ruby on Rails aus TextMate “automatisch” neu starten

Manchmal möchte man seine Ruby-on-Rails-Applikation im Passenger manuell neu starten. Sprich eine Datei my_app/tmp/restart.txt anlegen. Ich habe ein kleines Command-Skript für TextMate dafür geschrieben. Wenn man es ausführt (in diesem Beispiel mit APFEL+R), wird beim nächsten Browseraufruf alles neu geladen. Praktisch wenn man Plugins entwickelt :)

Hier der Command in TextMate:

restart_passenger

Und hier der Code dafür

18
19
20
21
22
23
24
#!/usr/bin/env ruby
 
require "#{ENV['TM_BUNDLE_SUPPORT']}/lib/rails_bundle_tools.rb"
f = File.open File.join(RailsPath.new.rails_root, "tmp", "restart.txt"), "w"
f.close
 
puts "Rails Application will be reloaded!"

Musik vom Apple TV zurück in iTunes retten

Gleich vorweg: Es kostet dich deine Apple-TV-Garantie und ein 2,5″ externes Festplattengehäuse (IDE, oder neu-deutsch: PATA). Aber: Es war’s wert.

Denn plötzlich war iTunes leer (lange Geschichte) und das einzige Backup war… der Apple TV! Der wurde natürlich sofort ausgesteckt, weil der sich sonst wieder synchronisiert hätte und dort auch alles futsch gewesen wäre.

1. Festplatte vom Apple TV ausbauen
Dafür hätte ich nicht einmal eine der zahlreichen Anleitungen benötigt, denn die acht Schrauben (T8 und T10) stellten kein sonderliches Problem dar :) Natürlich musste ich zuerst die aufgekleisterte Gummi-Bodenplatte abmachen. Das ging jedoch ohne Sauerei und man kann die wieder ankleben. Aber vorsicht: Die reißt sehr schnell ;)

2. Externes Gehäuse für 2,5 Zoll IDE (=PATA) kaufen
Schnell gemacht. Kostet 12 Euro ;)

3. Apple TV Festplatte einbauen und am Mac anschließen
Die Platte soll natürlich nicht von Spotlight indiziert werden! Dafür hält man sich ganz ganz schnell folgende zwei Terminal-Befehle bereit und feuert sie ab, sobald die Platte (und ihre beiden Partitionen Media und OSBoot) erkannt wurde.

touch /volumes/Media/.metadata_never_index
touch /volumes/OSBoot/.metadata_never_index

Wichtig: Platte abklemmen und wieder anklemmen, Spotlight wird seine Änderungen die er in den ersten Sekunden gemacht hat wieder rückgängig machen.

4. Drag’n'Drop der AppleTV Media Files in iTunes
Die Dateien auf dem Apple TV haben zwar die gleiche Struktur wie das iTunes Verzeichnis eines jeglichen Macs, jedoch sind die Dateinamen alle nur ein paar kryptische Buchstaben á la DDHX.mp3, NKKZ.mp3 usw. Das ist iTunes beim Import zum Glück egal, denn alle Metainformationen (inkl. Cover) sollten IN den einzelnen Dateien enthalten sein.

5. Apple TV wieder zusammen bauen, anklemmen, synchronisieren, läuft.

PS: Bei der Gelegenheit fragt man sich natürlich, ob es nicht so schwer sein könnte, einfach eine größere Festplatte in den Apple TV einzubauen ;)

Apache2 auf dem Mac macht nur 401 wegen FileVault

Wenn man FileVault benutzt kann es zu Schwierigkeiten mit Apache kommen. Man bekommt ständig einen 401 um die Ohren gehauen. So lässt sich Passenger natürlich nicht verwenden!

Folgender Befehl schafft Abhilfe:

sudo chmod +a “www allow search” /Users/DEINBENUTZERNAME

(ggf. sollte man VORHER noch mit dem Festplatten-Dienstprogramm die Verzeichnisrechte generell einmal reparieren lassen).

ActiveSupport::Memoizable Cache löschen

Auch wenn es vielen von vorn herein klar ist, mir war es nicht sofort klar :)

Das tolle Memoizable in Rails 2.2 macht das Caching von Methoden einfacher. Ich bin dabei auf eine Frage gestoßen:

Wie lösche ich den Cache?

Als ich mir den Quellcode von Memoizable angeschaut habe, dachte ich auf den ersten Blick, dass memoize_all ALLE Methoden einer Klasse memoizen würde und unmemoize_all alles wieder deaktiviert.

Nun, tatsächlich löscht unmemoize_all nur den gesamten Cache und er wird automatisch mit jedem Aufruf einer Methode Stück für Stück wieder aufgebaut. Wenn man also z. B. eine Änderung vornimmt, sollte man unmemoize_all ausführen.

memoize_all hingegen, führt alle gecachten Methoden auf einmal aus (!) und speichert die Ergebnisse im Cache. Aber das kann doch nicht sein, oder? Kann mir das hier mal jmd. erklären :)

Rails 2.2: NoMethodError von create_time_zone_conversion_attribute?

Nachdem ich jetzt mehrere Stunden nicht verstanden habe, wieso meine Rails Applikation nur einen Klick lang funktioniert, möchte ich euch dran teil haben lassen. Ich habe mehrere Libraries und Plugins die alle meine Models erweitern und dachte schon es läge daran, dass immer dieser Fehler auftauchte:


You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.include?

Recherche brachte mich hier her:
http://rails.lighthouseapp.com/projects/8994/tickets/1339

Das ganze lag nur daran, dass in Rails 2.2 ein Bug ist, der einen ein ActiveRecord Model nicht in eine Konstakte packen lässt!

Ich hatte eine Config-Datei die

1
MEINMODEL = MeinModelName

machte und später im Controller dann

1
MEINMODEL.find(....

Und das darf man nicht :) Jedenfalls noch nicht.

C++ mit SDL mit g++ mit TextMate mit Mac OS X

Ich wollte mal das Spiele programmieren anfangen. Matthias schlug C++ vor, so sollte es C++ sein. Dank dieser Anleitung habe ich dann auch schon angefangen diese Tutorials durchzugehen. Das macht auch sehr viel Spaß.

Nun benutze ich g++ und nicht Xcode. Damit ich das kompilieren auch schön in Textmate automatisiert ist, habe ich mir zwei Bundles dafür geschrieben (bzw. angepasst).

Man öffnet also in TextMate den BundleEditor und dupliziet den C++ Command namens “Compile Single File to Tool”, nennt die Kopie in z. B. “Datei kompilieren” um und passt die letzten Zeilen so an, dass sie so aussehen:

1
2
puts %x{ "#{cc}" -o "#{FileNoExtension}".bin "$TM_FILEPATH" -lSDL -lSDLmain -framework cocoa}
puts "Successfully created #{FileNoExtension}.bin" unless $CHILD_STATUS != 0

Dann legt noch einen schönen Shortcut fest, z. B. Apfel + E:

Damit wird die aktuelle Datei die wir bearbeiten in dateiname.bin kompiliert, sobald wir Apfel + E drücken.

Dann machen wir noch eine Kopie von diesem Command und nennen diese z. B. “Kompilierte Datei ausführen” und die letzten Zeilen sollen so aussehen:

1
2
puts %x{ "./#{FileNoExtension}.bin" }
puts "Yeah!" unless $CHILD_STATUS != 0

Dann machen wir das z. B. auf Apfel + R (vorsicht, dass ist der Build-Befehl wenn man XCode verwendet.)

Jetzt braucht man beim programmieren nur noch APFEL + E und dann APFEL + R drücken.

Naja, und dann taste ich mich doch erst mal hier ran ;)