Posts Tagged ‘Howto’

Samstag, 21. Mai 2011

Kodierung von Windows-Dateinamen unter Linux anpassen

Heute hiess es ernst: Auf einem meiner Teilzeitstellen wurde der Dateiserver migriert: Die Nutzerdaten wurden von einem uralten Dell-Server auf einen neueren HP-Server kopiert. Auf der Dell-Kiste lief Samba 2.2, auf dem HP-Server Samba 3.2.

Wie es die Samba-Konfiguration des alten Server so wollte, waren alle Datei- und Ordnernamen mit der Windows-Codepage 850 abgelegt. Erst seit Version 3 legt Samba Dateien intern mit UTF-8-Kodierung ab (falls nicht anders eingestellt).

Zehntausende von Dateien von Hand umzubenennen wäre hirnverrückt gewesen — doch wofür gibt es das Tool convmv?

Installation

Nachdem der Quelltext heruntergeladen worden war, konnte ich das Tool folgendermassen installieren:

# wget "http://www.j3e.de/linux/convmv/convmv-1.14.tar.gz"
# tar xvzf convmv-1.14.tar.gz
# cd convmv-1.14
# make
# make install

Anwendung

Anschliessend startete ich das Tool unter /home/public:

# convmv -f cp850 -t utf8 -r .

Nachdem ich mich an Hand der Testausgabe abgesichert hatte, dass die Sonderzeichen in den Dateinamen tatsächlich korrekt nach UTF-8 übertragen wurden, führte ich den Befehl noch einmal aus — doch dieses Mal wurden die Dateinamen auch wirklich angepasst:

# convmv -f cp850 -t utf8 -r --notest .

Tags: , , , , ,
Labels: Linux

1 Kommentar | neuen Kommentar verfassen

Donnerstag, 24. Februar 2011

Das erste kleine Ruby on Rails 3-Projekt

Nachdem man Ruby on Rails 3 auf seinem Entwicklungsserver eingerichtet hat, kann man sich sofort hinter die Entwicklung einer ersten Testapplikation machen.

Meine Anleitung richtet sich an Web-Entwickler, die mit einem PHP-Hintergrund Ruby on Rails ausprobieren möchten und mit dem MVC-Paradigma vertraut sind (sprich schon mit dem Zend Framework, Symfony, CakePHP etc. produktiv gearbetiet haben).

Vorbemerkung: Versionschaos

Im Netz gibt es unzählige How-Tos und Tutorials um eine erste Rails-Applikation hinzubiegen — sehr hilfreich war für mich Enabling Rails 3 for your application. Leider beziehen sich die wenigsten Anleitungen auf Ruby on Rails 3. Leider vernachlässigen es die Autoren solcher Werke oftmals zudem, darauf hinzuweisen, auf welche Rails-Version sich die Anleitung denn eigentlich bezieht. Dies hole ich hier explizit vor — meine Version lautet:

$ rails -v
Rails 3.0.4

Notabene: Es gibt anscheinend die Möglichkeit, mit der neuesten Rails-Version auch Projekte anzulegen, welche nach einer der älteren Versionen aufgebaut sind (rails _2.3.5_ APP_NAME via How can I create previous version rails in rails 3?). Wenn aber jemand Rails lernen möchte, sollte er dies mit der aktuellsten Version tun — so meine Überzeugung.

Beispielapplikation: Arbeitsjournal

Um rasch Gemeinsamkeiten und Unterschiede zu PHP aufzuzeigen, habe ich mich hierbei entschlossen, eine bestehende PHP-Webapplikation mit Ruby on Rails nachzubauen: Das Arbeitsjournal. Mit diesem führe ich für einen meiner derzeitigen Jobs Buch, wie lange ich arbeite und welche Aufgaben ich wann erledigt habe. Das Tool zeigt mir die Gesamtarbeitszeit für einen Monat und berechnet auch gleich, ob ich die gemäss Arbeitsvertrag erforderlichen Stunden abgearbeitet habe oder nicht.

Der Projekttitel liegt auf der Hand: arbeitsjournal.

Applikations-Skelett erstellen

Ich habe mich entschieden, meine Projekte unter /var/rails abzulegen. Nachdem ich dieses Verzeichnis erstellt habe, welches alle zukünftigen Ruby-Projekte enthält, wechsle ich da hinein und erstelle mir die Projektstruktur. Dank Rails ist dies Sache eines einzigen Befehls:

# mkdir /var/rails
$ cd /var/rails
$ rails new arbeitsjournal -d mysql

Die Option -d gibt an, dass man die Modelle und Daten in einer MySQL-Datenbank abgelegt haben möchte (Standard ist sqlite3)

Datenbankverbindung herstellen

Als Datenbank habe ich MySQL gewählt. Das Vorgehen ist identisch wie bei PHP-Web-Projekten: Zuerst erstellt man sich eine Datenbank (bei mir ruby_arbeitsjournal), einen MySQL-Benutzer (ruby) mitsamt Passwort und weist ihm Schreibrechte auf die neu erstellte Datenbank zu. Nach einem FLUSH PRIVILEGES; liest die MySQL-Datenbank den neuen Benutzer ein. Ich verwende dazu als Relikt vergangener Tage das GUI phpMyAdmin, obwohl ich auf der MySQL-Kommandozeile mittlerweile viel rascher ans Ziel kommen würde.

Unter Rails gibt man die Datenbankoptionen in der Datei ~/config/database.yml an:

...
development:
  adapter: mysql
  database: ruby_arbeitsjournal
  host: localhost
  username: ruby
  password: ********
...

Modell erstellen

Nun ist es an der Zeit, das Modell zu erstellen. Da es sich um eine Applikation mit ein, zwei Datenbanktabellen handelt, welche wiederum kaum Felder beinhalten, kann man dies bequem auf der Kommandozeile machen. Als Objektbezeichnung für einen Arbeitszeiteintrag habe ich mich an die gute, alte Stempeluhr erinnert und das Objekt deshalb Stamp genannt:

$ rails generate scaffold Stamp date_start:datetime date_end:datetime description:text

Das Objekt heisst Stamp und es weist drei Felder auf: date_start, date_end und description, denen die jeweiligen Titel zugewiesen werden. Nützlich war mir hier eine Liste der für’s Scaffolding verfügbaren Feldtypen.

Dies erstellt den Controller, welcher für das Auflisten (index), Anzeigen (show), Erstellen (new), Speichern (create) Editieren (edit), Aktualisieren (update) und Löschen (destroy) zuständig ist. Natürlich ohne, dass ich als Entwickler eine einzige Zeile Code schreiben muss. Genial!

Datenbanktabelle erstellen

Zuletzt erstellen wir nun die physische Tabelle in MySQL:

$ rake db:migrate --trace

Webserver starten

Ich habe einige Zeit damit verbraten, die Applikation über Apache 2 bereitzustellen. Leider momentan noch fruchtlos, u.a. weil sich die Anleitungen auf Rails 2 beziehen, welches offenbar noch ein dispatch.fcgi mit sich brachte. Dies fehlt im DocumentRoot ~/public einer 3er-Applikation.

Die Verwendung von Apache ist dabei gar nicht zwingend nötig — für Web-Entwickler stellt Rails (natürlich!) einen eigenen rudimentären Web-Server zur Verfügung. Man startet diesen über

$ cd /var/rails/arbeitsjournal
# rails server

Aus dem Intranet kann man nun auf den Testserver zugreifen, indem man Port 3000 anspricht. In meinem Falle war dies mad4you.homeip.net:3000.

Routing einrichten

Wer obigen Link aufruft, erhält die Standard-Willkommensseite für Rails-Projekte zu gesicht, die unter ~/public/index.html abgelegt ist.

Benennt man diese Datei kurzerhand um, kriegt man eine Fehlermeldung zu Gesicht. Rails kann nämlich nicht hellsehen und weiss nicht, was der Benutzer eigentlich für eine Seite angezeigt erhalten möchte. Ein Abstecher in die Routing-Datei ~/config/routes.rb und eine klitzekleine projektbezogene Anpassung hilft weiter:

...
root :to => "stamps#index"
...

Auf Deutsch: Diese Anweisung sagt Rails, dass falls ein Request namens GET / reinkommt, dieser auf die Stamps-Objekte weitergeleitet werden soll und dort die Auflistung aller Datenbankwerte

Views und Helper anpassen

Jetzt folgt die Knochenarbeit — zum ersten Mal muss Ruby programmiert werden. Hier sollte sich jeder Web-Entwickler rasch heimisch fühlen, denn abgesehen von einer anderen Programmiersprache ist das Vorgehen nun jedem mit dem MVC-Paradigma vertrauten Entwickler bekannt: Views anpassen, Helper-Funktionen entwickeln und im Controller Kollisionsabfragen etc. implementieren.

Die Pfade zu den entsprechenden MVC-Elementen lauten in meinem Fall:

  • ~/app/models/stamb.rb
  • ~/app/views/stamps/*.html.erb
  • ~/app/controllers/stamps_controller.rb

Insbesondere in ~/app/views/stamps/index.html.erb kann man genügend rumfuhrwerken. Hier vermischen sich HTML-Code und Ruby-Code, und hier kann der Entwickler genauestens steuern, wie die erfassten Daten ausgegeben respektive ausgewertet werden sollen.

Sehr wichtig ist ~/app/helpers/stamps_helper.rb, um die View nicht mit Ruby-Code zu überladen. Dorthin lagert man sich alle nützlichen kleinen Methoden aus, die mehrmals im Code benutzt werden und es deshalb Sinn macht, Redundanzen zu vermeiden.

Fertig? Fertig!

Ab jetzt verfügt man über eine funktionierende Web-Applikation, um Arbeitsstunden zu erfassen. Rails hat die entsprechenden Controller-Aktionen automatisch bereitgestellt und ich kann sofort mit dem Einfüllen von Daten beginnen.

In einem weiteren Artikel werde ich mich um einige Finessen kümmern, die für PHP-Entwickler anders, ungewohnt, oftmals aber äusserst erleichternd sind.

Tags: , , , , ,
Labels: Web

3 Kommentare | neuen Kommentar verfassen

Mittwoch, 23. Februar 2011

Ruby on Rails 3 unter Debian GNU/Linux installieren

Aus gegebenem Anlass habe ich mich heute Morgen das erste Mal seit langem wieder mit dem Web-Framework Ruby on Rails aus der Küche von David Heinemeier Hansson (einer der Partner hinter 37signals) auseinandergesetzt.

Nachfolgend habe ich zusammengefasst, wie ich das Framework auf meinem heimischen Entwicklungsserver zum Laufen gekriegt habe.

Installation Ruby

(Ich folge der englischen Anleitung Debian Lenny – Ruby on Rails von SliceHost)

Zuerst lädt man Debian-Pakete herunter und installiert diese:

# apt-get install ruby-dev ruby ri rdoc irb libreadline-ruby libruby libopenssl-ruby sqlite3 libsqlite3-ruby libsqlite-dev libsqlite3-dev

Anschliessend lädt man die Quellen von RubyGems herunter und kompiliert diese (man sollte auf das vorkompilierte Debian-Paket verzichten weil es mit Version 1.2.0 unglaublich veraltet ist):

# cd /tmp
# wget "http://rubyforge.org/frs/download.php/74234/rubygems-1.5.2.tgz"
# tar xvzfz rubygems-1.5.2.tgz
# cd rubygems-1.5.2
# ruby setup.rb

Nun noch die obligatorischen Update-Anweisungen, die man sich als Linux-Benutzer von vielen Paketmanagern kennt, und dann ist man bereit:

# gem update

Bei mir erhielt ich bei der Ausführung von gem update folgende Fehlermeldung zu Gesicht:

# gem -v
/usr/bin/gem:10: undefined method `manage_gems' for Gem:Module (NoMethodError)

Der Anleitung unter RubyGems: undefined method ‘manage_gems’ for Gem:Module (NoMethodError) – easy fix folgend wurde ein veraltetes Binary installiert, welches zuerst mit einer aktuellen Version ersetzt werden muss:

# mv /usr/bin/gem /usr/bin/gem-backup
# ln -s /usr/bin/gem1.8 /usr/bin/gem

Anschliessend aktualisiert man das System (nun hoffentlich erfolgreich):

# gem update
# gem update --system

Notabene: Bei mir wurden keine Updates nachgeladen, alles war bereits auf dem neuesten Stand …

Installation sqlite3

Damit Ruby mit der Datenbank sqlite3 sprechen kann, muss ein entsprechender Treiber bereitgestellt werden. Falls bei

# gem install sqlite3

die Fehlermeldung

Fetching: sqlite3-1.3.3.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3:
	ERROR: Failed to build gem native extension.

        /usr/bin/ruby1.8 extconf.rb
extconf.rb:3:in `require': no such file to load -- mkmf (LoadError)
	from extconf.rb:3


Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/sqlite3-1.3.3 for inspection.
Results logged to /usr/lib/ruby/gems/1.8/gems/sqlite3-1.3.3/ext/sqlite3/gem_make.out

erscheint, hat man im obigen apt-get für die Grundinstallation vergessen, die Header-Pakete von Ruby zu installieren (via Stackoverflow). Dies holt man mit folgendem Befehl nach:

# apt-get install ruby-dev libsqlite3-dev

Installation MySQL-Treiber

Obwohl man Ruby (on Rails) natürlich auch mit sqlite3 benutzen könnte, ist der LAMP-Web-Entwickler primär mit MySQL vertraut — so kann diese Datenbank mit der ansprechenden GUI phpMyAdmin administriert werden und ist bei grösseren Datenmengen auch klar performanter als sqlite3.

Um den Treiber zu installieren, bemächtigt man sich folgender Debian-Pakete:

# apt-get install libmysql-ruby libmysqlclient-dev

Anschliessend ist

# gem install mysql

Problemlos möglich.

Installation Rails

Mit dem Ruby-Paketmanager gem kann man sich nun endlich Rails aus dem Netz herunterladen und installieren lassen:

# gem install rails

Fertig! Jetzt sollte man eine funktionierende Ruby on Rails-Installation auf dem Server liegen haben und man ist bereit, mit Bordmitteln das erste Projekt anzulegen. Wie dies genau vor sich geht, folgt in einem weiteren Artikel.

Tags: , , , , ,
Labels: Linux, Web

1 Kommentar | neuen Kommentar verfassen

Dienstag, 21. September 2010

Facebook 2010 effizient nutzen

Nachfolgend einige Tipps vom Facebook-Power User, die einem den Umgang mit dem bisher ungeschlagenen sozialen Netzwerk im Web stark erleichtert:

RSS-Feeds

Als eifriger Leser und Abonnent von RSS-Feeds habe ich selbstverständlich keine Sekunde gezögert, auch die von Facebook angebotenen, auf mich personalisierten Feeds zu abonnieren. Es sind dies:

  • Mario Aeby’s Friends‘ Facebook Status Updates
  • Mario Aeby’s Facebook Notifications

Wofür das Abo der Status-Updates? Nun, zwei Gründe: Einerseits möchte ich nicht immer Facebook in meinem Browser aufrufen, um die neuesten Status-Updates meiner Freunde zu entdecken. Andererseits möchte ich kein Status-Update meiner Freunde verpassen, gleichzeitig aber auch schon gelesene Status-Updates nicht mehr angezeigt erhalten.

Sehr oft kommt es vor, dass ich am Ende eines Tages nach Hause komme, NetNewsWire aufstarte und mich dank dieses RSS-Feeds durch die Status-Updates des Tages durchackere. Vielleicht haben einige meiner Facebook-Freunde bemerkt, dass ich — wenn ich Kommentare auf ihre Status-Updates abgebe — oftmals wenige Sekunden später auch auf Status-Updates von anderen Personen kommentiere, auch wenn sie dieses Status -Update vielleicht bereits am Morgen aufgeschaltet haben. Die Erklärung dafür ist simpel: Da ich die Status-Updates an einem Stück abarbeite, benötige ich im Tag vielleicht fünf zusammenhängende Minuten, um über die Aktivitäten all meiner Freunde auf dem Laufenden zu sein. In diesen fünf Minuten entstehen in der Regel auch die Mehrheit meiner Kommentare.

Leider versteckt Facebook den Direktlink auf den persönlichen Feed der Status-Updates seit einiger Zeit. Im Netz gibt es aber einige Artikel, die einem helfen, den RSS2-Link zusammenzubasteln. Die Linkbasis lautet http://www.facebook.com/feeds/friends_status.php?id={ID}&key={FRIENDS_KEY}&format=rss20, {ID} und {FRIENDS_KEY} muss man mit der Anleitung von herausfinden (offensichtlich ist es heute ungemein kompliziert, den {FRIENDS_KEY} zu eruieren). Jedenfalls funktioniert mein Link seit Monaten, wenn nicht gar seit Jahren ohne Probleme.

Nachtrag: Wie Kollege Dänu in seinem Kommentar zu diesem Artikel schreibt, ist unter View Facebook Friends Status Update Feed In Any Feed Reader ein anderer Weg aufgezeigt, der auch heute (Dezember 2010) weiterhin zum Ziel führt. Kurzfassung: Man suche den Link „My Friends‘ Links“, kopiere die URL und ersetze share_friends_post.php mit friends_status.php. Tatsächlich hat dieser Blog-Autor einen (weiteren) Weg gefunden, wie man den {FRIENDS_KEY} herausfindet. Danke!

Die Notifications wiederum sind Spielerei und nicht zwingend nötig — ich lasse mir nämlich alle Kommentare und persönlich an mich adressierten Nachrichten auf mein privates Mailkonto weiterleiten. Dort habe ich einen Unterordner _FACEBOOK eingerichtet, in welchen die Nachrichten automatisch alle fünf Minuten hinverschoben werden. imapfilter sei dank! Der Beweggrund dahinter: Ich möchte soviele Informationen wie möglich aus Facebook rausholen, da ich der Bude bezüglich privater Daten nicht traue. Je mehr ich lokal abgelegt habe, desto sicherer ist es, dass ich auch in einigen Jahren noch auf die Aktivitäten zugreifen kann. Ich finde es trotzdem nett, die Notifications neben E-Mail auch noch über einen zweiten Kanal aufgelistet zu erhalten. Der Link auf den Notifications-Feed findet sich unter http://www.facebook.com/notifications.php.

Facebook-Chat

Wie grau die Welt doch war, als ich mit Adium nur ICQ- und MSN-Chats führen konnte. Kaum jemand meiner Kollegen benutzt diese beiden Urgesteine von Chatprotokollen noch, weshalb ich Gefahr lief, sozial zu verkümmern. Der „Pöbel“ war nämlich schon lange weitergezogen (respektive hatten sich die veralteten IMs gar nicht mehr erst angetan) und chattete munter und fröhlich auf Facebook.

Erst vor wenigen Wochen entdeckte ich nun, dass das omnipotente soziale Netzwerk einen Jabber-kompatiblen Chat anbietet! (Die Entwickler der Plattform sind halt auch nur Geeks und werden wie ich den Web-Chat fürchterlich verabscheuen). Seither bin ich permanent auf Facebook online und für Chats zu haben. Unglaublich, wie viele neue, im Grunde aber altbekannte Chat-Partner ich so in Reichweite habe.

Die Konfiguration ist recht simpel und in der Facebook-Hilfe detailliert beschrieben. Wissen muss man eigentlich nur:

Jabber ID emeidi@chat.facebook.com
Password *****
Connect Server chat.facebook.com

Die Chat-Nachrichten können aber leider nicht verschlüsselt werden.

Der Vorteil dieser Lösung: Ich muss nicht den verschissenen Web-Chat von Facebook benutzen (und so konstant Facebook in einem Browser-Fenster geöffnet haben), sondern kann meinen altbekannten und bewährten IM-Client verwenden. Desweiteren werden alle Gespräche auf der Festplatte abgespeichert und können später problemlos durchsucht werden.

Weitere Pluspunkte: Alle Chatpartner sind von Anfang an mit ihrem realen Namen in der Liste aufgeführt und werden sogar gruppiert angezeigt, wenn man seine Kontakte in Gruppen wie Arbeit, Studium, Politik etc. eingeordnet hat.

Facebook-Chat wird über kurz oder lang ICQ, AIM, MSN, Yahoo! Messenger und wie sie alle heissen in die Wüste schicken — oder zumindest für einen spürbaren Einbruch im Chatverkehr sorgen.

Und ja, falls mir Mal langweilig werden würde: Es liesse sich sicher auch ein kleiner Bot programmieren, der die An- und Abmeldungen meiner Freunde akribisch festhalten würde und dieses Verhalten anschliessend statistisch auswerten könnte. Aber lassen wir das.

Tags: , , , , ,
Labels: IT, Web

2 Kommentare | neuen Kommentar verfassen