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 ;)

SVN Commands

Weil ich sie immer wieder suche, hier eine Liste von SVN Befehlen, einfach erklärt und mit schönen Beispielen. Besonders svn:ignore benutzt man immer wieder. Auch wenn ich gerade git installiere, der ein oder andere versteht SVN sicher besser mit diesem Dokument.

– SVN PROPERTIES –

ANZEIGEN

Properties des aktuellen Verzeichnisses anzeigen
svn pl

Zeige alle Änderungen für den nächsten commit, ignorierte Dateien sollen trotzdem angezeigt werden:
svn st –no-ignore

Alle Properties rekursiv anzeigen
svn pl -R
Merke: “Properties on ‘config’: svn:ignore” bedeutet nicht, dass “config” ignoriert wird, sondern dass im Verzeichnis config, gewisse Objekte ignoriert werden. “config” ist in gewisser Weise nur der Träger der Eigenschaft, die Werte widerrum sind die Inhalte in config, welche ignoriert werden.

Alle svn:ignore Properties rekursiv anzeigen
svn pg svn:ignore -R

Details über ein Property erhalten
svn pg PROPVAL PATH –strict
Beispiele:
Welche Objekte werden im aktuellen Verzeichnis ignoriert?
svn pg svn:ignore . –strict

SETZEN

Property des aktuellen Verzeichnisses setzen
svn ps PROPNAME PROPVAL PATH
Merke: Der aktuelle Wert des Properties wird dabei überschrieben! Möchte man ihn behalten, muss man ihn neu mit hinzufügen.
Merke: PROPVAL für z. B. svn:ignore ist ein Objekt je Zeile. Das wird mit z. b. “objekt1[RETURN]objekt2″ erreicht.
Merke: Ein mit “svn mkdir” erstelltes Verzeichnis kann nicht direkt ignoriert werden. Verzeichnisse die ignoriert werden sollen, müssen manuell erstellt werden und können anschließend ignoriert werden.
Beispiele:
Das Verzeichnis test im aktuellen Verzeichnis ignorieren
svn ps svn:ignore test .
Das Verzeichnis test im Unterverzeichnis public/images ignorieren
svn ps svn:ignore test public/images
Die Verzeichnisse test1 und test2 im aktuellen Verzeichnis ignorieren
svn ps svn:ignore “test1[RETURN]test2″ .
Alle *.log Dateien im Unterverzeichnis log ignorieren (Das hat keine Auswirkung auf das Verzeichnis log an sich, sondern nur die Dateien dort drin)
svn ps svn:ignore *.log log

LÖSCHEN

Property PROPNAME von PATH löschen
svn pd PROPNAME [PATH]
Merke: Wieder hat das keine Auswirkung auf das Verzeichnis PATH, nur auf dessen Inhalte! (Es sei denn natürlich PATH ist eine Datei)
Merke: Wird PATH weggelassen, wird das Property vom aktuellen Verzeichnis gelöscht
Beispiele:
Alle Objekte im aktuellen Verzeichnis sollen nicht mehr ignoriert werden
svn pd svn:ignore
Alle Objekte im Verzeichnis public/images sollen nicht mehr ignoriert werden
svn pd svn:ignore public/images

– LEGENDE –

PROPNAME ist ein Property
z. B. svn:ignore oder svn:executable

PROPVAL Wert eines Properties
Die Belegung des Properties mit z. B. dem Namen eines Unterverzeichnisses

PATH Verzeichnis zu einem Verzeichnis oder einer Datei usw.
z. B. dir/subdir oder .

[RETURN] Entertaste
Ist ein Zeilensprung mit der Returntaste