Monthly Archive for September, 2007

MCV Ruby on Rails – was gehört wohin?

Model, Controller, View oder Helper?

Die Kommentare zu diesem Post stellen eine Diskussion über die Funktionen der Hauptbereiche von Ruby on Rails dar. Das Ergebnis wird dann hier zusammengefasst.

Es ist auch klar, dass die Unterteilung der Bereiche nicht eindeutig ist, aber vielleicht finden wir eine gute Tendenz.

HowTo: MySQL 5, Mongrel, Capistrano + Subversion

Update: Bis her war ein Fehler in diesem HowTo. MySQL muss natürlich als Server Version installiert werden ($ sudo port install mysql5 +server). Das Update betrifft nur den MySQL5 Bereich.

Damit wir Ruby on Rails auch wirklich nutzen können, sollten wir noch ein paar Programme, Tools und Gems installieren.

Als erstes wäre da MySQL, denn wie wollen wir Datenbankgestütze Webentwicklung betreiben, wenn wir nicht mal einen Datenbank-Server und damit eine Datenbank haben…

MySQL5
Da wir ja MacPorts installiert haben ist das ganze recht einfach. Um auf Nummer Sicher zu gehen, machen wir jedoch erst mal ein selfupdate für MacPorts und installieren erst dann MySQL5

$ sudo port selfupdate
$ sudo port install mysql5 +server
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
$ sudo chown -R mysql:mysql /usr/local/macports/var/db/mysql5
$ sudo -u mysql mysql_install_db5

Jetzt am besten den Mac neu starten, dann kann man gleich sehen ob das LauchItem funktioniert.

MySQL Native Bindings Gem
Jetzt kommt der Teil, der mich die meiste Zeit gekostet hat (dabei sollte er doch die Geschwindigkeit der MySQL Abfragen beschleunigen) und der Grund war, warum ich bis her ohne die Nativen Bindings auskommen musste.
Das MySQL Gem ist irgendwie sehr unflexible, was die Pfade angeht und dazu kommt, dass MacPorts die MySQL Installation im MacPorts Verzeichnis nicht gebündelt ablegt sondern etwas zerfledert… anstelle eines einfachen gem install mysql war hier etwas mehr Finetuning nötig. Mittels der build-flags gelang mir dann aber auch das. Hier das Ergebnis:

sudo gem install mysql -- \
--with-mysql-dir=/usr/local/macports/lib/mysql5 \
--with-mysql-lib=/usr/local/macports/lib/mysql5/mysql \
--with-mysql-include=/usr/local/macports/include/mysql5/mysql

NACHTRAG, ab November 2008 so:

sudo env ARCHFLAGS="-arch ppc" gem install mysql -- --with-mysql-lib=/opt/local/lib/mysql5/mysql --with-mysql-include=/opt/local/include/mysql5/mysql

jetzt wird man gefragt, welche Version man für die Installation wählen will. Nehmen wir also die neuste, zum jetzigen Zeitpunkt mysql 2.7 (ruby), also drücken wir die 3 (da wir uns ja auf einem Mac befinden fallen die mswin32 Versionen für uns raus)

Select which gem to install for your platform (i686-darwin8.10.3)
1. mysql 2.7.3 (mswin32)
2. mysql 2.7.1 (mswin32)
3. mysql 2.7 (ruby)
4. mysql 2.6 (ruby)
5. Skip this gem
6. Cancel installation

Wenn man die build-flags nicht richtig setzt bekommt man solche Fehler:

ERROR: Failed to build gem native extension.
ruby extconf.rb install mysql
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... no
checking for mysql_query() in -lmysqlclient... no

und kann damit nicht so wirklich was anfangen… wie gesagt hat mich einiges an Zeit gekostet, weil auch Google dazu nicht richtig was sagt.

So nun sind auch die Bindings fertig und wir können uns anderen Dingen zuwenden.

Mongrel
Mongrel ist der Webserver. Rails liefert zwar schon einen Webserver mit (Webrick) aber Mongrel hat für mich bis her einen sehr sehr großen Vorteil, man sieht im Development Mode alle Requests. Damit fällt das Debugging viel leichter, da man sogar die MySQL Requests mit allen Werten sieht. Also installieren wir das Mongrel Gem einfach.

sudo gem install mongrel --include-dependencies

es kommen wieder die von oben bekannten Abfragen zur Version und weil es Abhängigkeiten gibt, die erfüllt werden müssen, wird gleich noch fastthread installiert. Meine Versionen sind mongrel 1.0.1 (2 drücken) und fastthread 1.0 (1 drücken).

Select which gem to install for your platform (i686-darwin8.10.3)
1. mongrel 1.0.1 (mswin32)
2. mongrel 1.0.1 (ruby)
3. mongrel 1.0 (mswin32)
4. mongrel 1.0 (ruby)
5. Skip this gem
6. Cancel installation
> 2
Select which gem to install for your platform (i686-darwin8.10.3)
1. fastthread 1.0 (ruby)
2. fastthread 1.0 (mswin32)
3. fastthread 0.6.4.1 (mswin32)
4. fastthread 0.6.4.1 (ruby)
5. Skip this gem
6. Cancel installation
> 1

Gut damit haben wir neben dem MySQL-Server nun auch unseren Webserver. Was jetzt kommt ist erst mal nicht so wichtig aber wir installieren es mal, damit wir uns später keine Gedanken mehr drum machen müssen.

Capistrano
Capistrano ist ein Deployment Tool, was einem die Arbeit des live gehens erheblich erleichtern soll. Ich hab es noch nicht benutzt und genau deshalb installiere ich es jetzt mit um es in den nächsten Tagen zu testen. Darüber wird es dann auch einen Post geben.
Neben dem hoch laden der Dateien mittels SSH, kann man noch eigene Rake Tasks in Ruby schreiben, die dann z.B. einen Dump der alten Datenbank erstellen, bevor die neue eingespielt wird. Naja wie gesagt, bei mehr Erfahrungen gibt es auch dazu einen Post, jetzt erst mal die Installation:

sudo gem install capistrano --include-dependencies

Jetzt noch Termios, dass dafür sorgen soll, dass die Passwörter, die man in Capistrano eintippt, nicht von allen gelesen werden können. Ich weiß nicht, ob das notwendig ist aber weh tun tut es ja auch nicht also:

sudo gem install termios --include-dependencies

Subversion
Subversion ist auch so nen Ding, worüber alle reden, was ich aber bis zum jetzigen Zeitpunkt, außer für Plugin Installationen, nicht genutzt habe. Capistrano nutzt es auch, also installieren wir auch noch dieses Tool. Eigentlich ist es einfach eine Versionskontrolle und wird meistens eingesetzt, wenn man in einem Team programmiert (es zeigt einem Konflikte an, d.h. zwei Leute haben zur gleichen Zeit an einer Datei, den selben Teil verändert, jeder natürlich anders und die Änderungen würden verlohren gehen. Hier springt dann eben SVN ein und man kann den Konflikt auflösen.)

sudo port install subversion

So damit haben wir eigentlich erst mal alles, was wir für die Entwicklung mit Ruby on Rails brauchen. Wenn es noch irgendwelche Sachen gibt, die man unbedingt braucht ab in die Kommentare damit.

ÜÄÖß Umlaute kaputt in Ruby on Rails und MySQL [broken umlauts]

Hier die Lösung, wenn nur “??” für sämtliche Sonderzeichen ausgegeben wird in Ruby on Rails (wenn man Standardeinstellungen verwendet):

Update: Klaus hat in den Kommentaren eine bessere Lösung vorgeschlagen:
Einfach den Entwicklungsstadien (development, test, production) encoding: utf8 zufügen. Sieht dann so aus:
projekt/config/database.yml

development:
  adapter: mysql
  database: projekt_development
  username: root
  password:
  socket: /tmp/mysql.sock
  encoding: utf8
test:
  adapter: mysql
  database: projekt_test
  username: root
  password:
  socket: /tmp/mysql.sock
  encoding: utf8
production:
  adapter: mysql
  database: projekt_production
  username: root
  password:
  socket: /tmp/mysql.sock
  encoding: utf8

Hier die veraltete Lösung:

class ApplicationController < ActionController::Base
  before_filter :configure_charsets
  private
  def configure_charsets
    @response.headers["Content-Type"] = "text/html; charset=utf-8"
    # Nur ab MySQL 4.1
    suppress(ActiveRecord::StatementInvalid) do
    ActiveRecord::Base.connection.execute 'SET NAMES UTF8'
  end
end

Ruby on Rails: TAR-Archive in einem Verzeichnis entpacken [Extract tar archives in a directory]

Hier eine Lösungsmöglichkeit, um in einem Verzeichnis nach allen Tar-Dateien zu suchen und die Inhalte im selbigen zu entpacken (durch leichte Modifikation natürlich anpassbar). Anschließend werden die entpackten Archive gelöscht. Da der UNIX “tar”-Befehl verwendet wird, geht das ganze nur auf UNIX Systemen. Hinweis: Bei mehr als 2000-3000 Dateien im Verzeichnis würde ich das nicht so anwenden, da zu uneffizient/langsam. Aber das ist ein anderes Thema :)

Wie immer sind Verbesserungsvorschläge (Kommentare) erwünscht. Aus pragmatischen Gründen wird dann der folgende Code jedes Mal entsprechend erneuert:

class ApplicationController < ApplicationController::Base
  def untar
    result = ''
    Dir.open(PATH_TO_DIR).each do |file|
      next if file !~ /tar$/
      result += 'Extracting ' + file + '... '
      if system('cd ' + PATH_TO_DIR + '; tar -xf ' + file)
        result += 'done!<br/>Deleting ' + file + '... '
        if FileUtils::rm_r(PATH_TO_DIR + file)
          result += 'done!<br />'
        else
          result += 'error!<br />'
        end
      else
        result += 'error!<br />'
      end
      processed = true
    end
    result += '<br />Extraction completed!'
    result = 'No compressed files found.' if processed.nil?
    render(:text => result)
  end
end

PS: Manuel, vielen Dank für dieses WP! Sehr sehr schön. Viele Plugins, schöne Bilder und einfach schön! Wie wär’s, wenn du jetzt noch GANZ SCHNELL ein Ruby-Syntax-Highlight installierst :) DANKE!

HowTo: Ruby on Rails via MacPorts (aka DarvinPorts) unter Mac OS X

Auch wenn es über die Installation von Ruby on Rails schon viele Posts gibt, habe ich mich entschlossen noch einen zu schreiben. Meistens fehlen mir bei diesen Anleitungen kleine Details und ich denke, dass es besonders für Mac OS X Neulinge, bzw. Menschen, die sich auf der Kommandozeile nicht so auskennen, etwas schwer nach zu voll ziehen ist, was sie da überhaupt gerade machen.

Zum anderen, soll dieses Blog auch ein wenig unsere Entwicklung, die wir mit Ruby on Rails durch mache, wieder spiegeln und da ist es doch ganz gut, wenn man ganz von Vorne beginnt.

Jetzt gibt es erst mal eine Kurzanleitung mit allen nötigen Befehlen, für die Leute, die Ruby on Rails einfach nur ganz schnell installieren wollen und keinen Text mögen. Falls es dann zu Problemen kommt, müsst ihr halt doch noch mal unten schauen ;-).

Zusammenfassung
Source Dateien von der MacPorts Seite laden

$ tar -xvzf MacPorts-1.5.0.tar.gz
$ cd MacPorts-1.5.0
$ ./configure --prefix=/usr/local/macports
$ make
$ sudo make install
$ sudo ln -s /usr/local/macports/bin/port /usr/bin/port
$ cat >>~/.profile
PATH=/usr/local/macports/bin:$PATH ; export PATH
ctrl+D drücken
$ PATH=/usr/local/macports/bin:$PATH ; export PATH
$ sudo port selfupdate
$ sudo port install rb-rubygems
$ gem update
$ sudo gem install rails --include-dependencies
$ rails -v

Update Michael schreibt in den Kommentaren, dass bei Mac Ports 1.6.0 vor $ sudo gem install rails –include-dependencies noch ein $ sudo port install rb-rails kommen muss.

MacPorts

MacPorts (ehemals DarvinPorts) ist ein Packet Management System, wie es eigentlich fast jedes Unix System hat, das es einem erleichtert Programme zu installieren und sie auf dem aktuellen Stand zu halten. Das System berücksichtigt und installiert auch alle Abhängichkeiten, d.h. alle Programme und Bibliotheken, die für das zu installierende Programm benötigt werden. Um bereits Installierte Versionen von Ruby oder anderen Sachen, muss man sich keine Sorgen machen, da die MacPorts Installationen abgeschottet davon liegen und sich nicht beeinflussen.

Um MacPorts und später Ruby on Rails zu installieren, muss man

  • als Administrator eingelogged sein, um das SuperUser Command sudo ausführen zu können (wird später noch ganz oft gebraucht)
  • Xcode Tools installiert haben (sind auf der OS X CD oder bei Apple, auf jeden Fall mal checken, ob das auf der CD die Aktuelle Version ist. Geht ganz einfach in dem man in die About Xcode Tools.pdf rein schaut, da steht die Version drin. Gerade is das 2.4.1)

MacPorts gibt es mitlerweile auch mit einem Installer aber ich möchte es hier einmal selber kompilieren um es gesammelt unter /usr/local/macports zu haben. So kann man es jeder Zeit ohne Probleme wieder löschen, in dem man einfach den Ordner löscht.

Also als erstes müssen wir uns die Source Dateien auf den Desktop runter laden (einfach die aktuellste Version wählen, zum jetzigen Zeitpunkt ist das 1.5.0), ich nutze die MacPorts-1.5.0.tar.gz. Dann entpacken wir das ganze. Dazu gehen wir ins Terminal (zu finden unter Programme -> Dienstprogramme -> Terminal, das ist die Kommandozeile auf der wir uns jetzt die ganze Zeit bewegen werden) und tippen ein paar Befehl ein. Für all, die noch nie mit dem Terminal gearbeitet haben hier noch ein paar Hinweise:

  • das $ signalisiert nur, dass es sich um die Kommandozeile handelt, der Befehl fängt erst danach an
  • mit dem Tabulator kann man Dateien oder Pfade vervollständigen lassen, bzw. sich die Möglichkeiten anzeigen lassen (Beispiel $ cd Des tippen und dann den Tabulator drücken führt zu $ cd Desktop)

Also los:

$ cd Desktop
$ tar -xvzf MacPorts-1.5.0.tar.gz

Es wird die Liste mit den entpackten Files angezeigt. Wir wechseln nun in das neue Verzeichnis und führen das ./configure Script mit dem Prefix, in das wir MacPorts installieren wollen aus. Dadurch wird die Installation vorbereitet (man sieht einen Haufen Tests die das Script ausführt. Wenn ein “WARNING: X11 not available.” auftaucht, ist das nicht weiter schlimm, da wir keine X11 Pakete installieren wollen). Im Anschluss kompilieren wir MacPorts mit dem Befehl “make” und installieren es mit “sudo make install”, hier werden wir nach dem Administrator Kennwort gefragt, einfach eintippen und den Mac arbeiten lassen.

$ cd MacPorts-1.5.0
$ ./configure --prefix=/usr/local/macports
$ make
$ sudo make install

Das Gröbste wäre damit erledigt. Wir legen noch einen Symlink an, um uns die weitere Arbeit zu erleichtern und nicht immer den ganzen Pfad eingeben zu müssen.
Damit die alte Ruby Version nicht mehr benutzt wird und irgendwann Probleme machen könnte, ändern wir noch $PATH, indem wir eine .profile Datei erstellen, in die wir den MacPorts installations Pfad aufnehmen. Damit das ganze auch gleich funktioniert (normal müssten wir uns neu einloggen) ändern wir $PATH gleich noch für diese Session.
Danach machen wir noch ein selfupdate für MacPorts, hier holt sich MacPorts alles was es braucht und macht ggf. noch ein Update (kann also ein bisschen dauern)

$ sudo ln -s /usr/local/macports/bin/port /usr/bin/port
$ cat >>~/.profile
PATH=/usr/local/macports/bin:$PATH ; export PATH
ctrl+D drücken
$ PATH=/usr/local/macports/bin:$PATH ; export PATH
$ sudo port selfupdate

Ein einfaches

$ sudo port install rb-rubygems

installiert uns jetzt die RubyGems mit denen wir nun mit der eigentlichen Ruby on Rails Installation anfangen können. Die Installation von RubyGems kann eine ganze Weile dauern, da ja auch alle Abhängigkeiten installiert werden müssen, also wenn du ein Raucher bist: Zurück lehnen, Mukke laufen lassen und die Kippe anmachen…

Ruby on Rails

Als erstes sollten wir nun ein Update der gems machen und dann Rails mit all seinen Abhängichkeiten installieren. Das kann je nach Mac und Server Status auch wieder ewig dauern… noch ne Kippe? (Machmal spackt der http://gems.rubyforge.org Server rum und sagt, dass er die Pakete nicht lesen kann. Bei mir hat ein gem query –remote geholfen, dass alle verfügbaren Pakete anzeigt. Danach ging der normale install Befehl… kann auch nur Zufall gewesen sein ;-))


$ gem update
$ sudo gem install rails --include-dependencies

Update:
In den Kommentaren hat Phil darauf hingewiesen dass es hier zu einem Problem beim $ gem update kommen kann. Seine Lösung sieht ein

$ sudo port -ufn upgrade rb-rubygems

vor dem $ gem update vor. (Quelle: http://lists.macosforge.org/pipermail/macports-dev/2007-June.txt)

Danke Phil!

So das war es, Rails ist nun installiert! Herzlichen Glückwunsch erst mal =)

Hier noch ein paar checks

$ rails -v
$ ruby -v
$ which rails
$ which ruby

sollte ungefähr das hier ausgeben (je nachdem welche Version du hast):
Rails 1.2.3
ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.10.3]
/usr/local/macports/bin/rails
/usr/local/macports/bin/ruby
Wichtig ist hier, dass die beiden Pfade das MacPorts Verzeichnis beinhalten.

Jetzt gibt es noch nen paar Gems, die man installieren sollte aber darauf gehe ich in weiteren Posts genauer ein.

funkensturm. | Blog

Es wird endlich Zeit, dass auf der funkensturm. Seite was passiert und deshalb gibt es jetzt dieses Blog.

Da wir uns zur Zeit sehr viel mit Rails beschäftigen und unsere Erfahrungen gerne weiter geben würden, wird es wohl in erster Linie um Ruby on Rails gehen. Wie sich das weiter entwickelt weiß ich noch nicht bin aber sehr gespannt.

Online-Patentamt für Dokumente und Skripte

Ich habe eine Idee! Wie hätte es anders sein können: sie kam mir beim Toilettengang. Brillant!

Man müsste eine Webseite (/Webserver) schaffen, auf der man beliebige Texte hochladen und “verifizieren” lassen kann. Und zwar so: man läd z. B. sein wertvolles, neu entwickeltes Rails-Script in einer (z. B. gepackten) Datei hoch. Diese wird durch eine Art PGP-Mechanismus von dem Webserver mit einem Datum versehen, signiert und dem Benutzer ggf. als Email geschickt. Zusätzlich wird das Ganze in einer Datenbank (natürlich nur die Hashs, aus Sicherheitsgründen und wegen Speicherplatz) gespeichert.

Sollte es nun Streitigkeiten geben, wer ein Script (oder ein Buch, oder ein Gedicht, oder die Weltformel) zuerst erfunden hat, kann der tatsächliche Erfinder “beweisen”, dass er es an dem Tag hochgeladen hat. Vielleicht auch dies mit seinem PGP-Key.

Gesetzlich könnte das natürlich erst einmal nicht 100% Wasserdicht sein, aber wenn es eine richtige Zertifizierungsstelle werden könnte (mit der Zeit), könnte ich mir Bedarf dafür vorstellen. Immerhin besser, als sein Script ausdrucken und an sich selbst per Post schicken. Oder für einen Notar viel Geld bezahlen.

Und gibt’s das schon? Belehrt mich eines Besseren, aber ich habe eine Marktlücke gefunden! ;)