Redmine mit MySQL und Apache unter Debian Lenny

Das auf Rails aufsetzende Ticketsystem Redmine bietet unter anderem ein integriertes Wiki, eine Dateiverwaltung sowie Anbindungen an diverse Versions-Verwaltungs-Systeme. In diesem Artikel möchte ich zeigen, wie Redmine unter Debian Lenny installiert und mit MySQL-Anbindung sowie Apache2 und mod_fcgid konfiguriert werden kann.

Ich gehe im Folgenden von einer Lenny-Basisinstallation aus, d.h. es sind keine Pakete aus Fremdquellen oder ähnliches installiert. Der Server, auf dem Redmmine aufgesetzt wird, ist unter dem Namen redmine.example.com erreichbar und nimmt auf localhost:25 Mails ohne Authentifizierung entgegen. MySQL und Apache müssen noch nicht installiert sein.

Als erstes sollten Ruby, Rubygems und Rails installiert und eingerichtet werden, wie ich es in einem früheren Artikel beschrieben habe. Die Pfade in den weiteren Schritten beziehen sich auf diese Konfiguration.

MySQL

Als erstes werden die für MySQL benötigten Debian-Pakete installiert:

# aptitude install mysql-server build-essential ruby1.8-dev libmysqlclient15-dev

Als nächstes das gem für die Ruby-MySQL-Anbindung:

# gem install mysql

Redmine installieren

Das Verzeichnis für die Redmine-Dateien kann frei gewählt werden (ich verwende /srv/www/redmine). Die einzige Voraussetzung ist, dass der Webserver Leserechte für diesen Pfad besitzt.

Download und Installation

Die aktuelle Version von Redmine kann bei Rubyforge heruntergeladen werden. Die derzeit aktuelle Version ist 0.8.4.

# mkdir -p /srv/www/
# cd /srv/www/
# wget http://rubyforge.org/frs/download.php/56909/redmine-0.8.4.tar.gz
# tar xvzf redmine-0.8.4.tar.gz
# mv redmine-0.8.4 redmine
# cd redmine

Nun müssen die Zugriffsrechte gesetzt werden, so dass der Webserver (www-data) schreibend auf files/, log/, tmp/ und public/plugin_assets/ zugreifen kann:

# mkdir tmp public/plugin_assets
# chgrp -R www-data files log tmp public/plugin_assets
# chmod -R g+w files log tmp public/plugin_assets

Leere Datenbank einrichten

Als erstes wird eine leere Datenbank sowie ein User mit jeweils dem Namen ‘redmine’ angelegt. Dem neuen User werden volle Zugriffsrechte auf die Datenbank gegeben:

# mysql -uroot -p
mysql> create database redmine character set utf8;
mysql> create user 'redmine'@'localhost' identified by 'my_password';
mysql> grant all privileges on redmine.* to 'redmine'@'localhost';

Anpassen der Konfiguration

Damit Redmine auf die Datenbank zugreifen kann, müssen die Zugangsdaten entsprechend eingetragen werden:

# cp config/database.yml.example config/database.yml

In der Datei config/database.yml muss der Abschnitt ‘production’ angepasst werden:

production:
  adapter: mysql
  database: redmine
  host: localhost
  username: redmine
  password: my_password
  encoding: utf8

Die anderen Abschnitte sind nur dann interessant, wenn man Redmine in einer anderen als der ‘production’-Umgebung betreiben möchte. Ansonsten können sie bleiben wie sie sind.

Die Datenbank befüllen

Nun kann Redmine auf die Datenbank zugreifen und das Schema kann per Rake-Task angelegt werden:

# rake db:migrate RAILS_ENV="production"

Es empfiehlt sich, die Default-Konfiguration ebenfalls zu laden, dies ist aber optional:

# rake redmine:load_default_data RAILS_ENV="production"

Testen der Installation

An dieser Stelle kann die Installation bereits mit dem WEBrick Webserver getestet werden:

# ruby script/server webrick -e production

Redmine sollte unter der Adresse redmine.example.com:3000 erreichbar sein und ein login (User: admin, Passwort: admin) sollte ebenfalls möglich sein. Hinweis: Damit der Login nicht fehlschlägt, müssen (Session-)Cookies akzeptiert werden.

Mit Ctrl-C wird der Webserver wieder beendet.

SMTP Konfiguration

Soll Redmine E-Mails versenden können, muss eine weitere Konfigurationsdatei angepasst werden:

# cp config/email.yml.example config/email.yml

Hier muss ebenfalls der Abschnitt ‘production’ bearbeitet werden:

production:
  delivery_method: :smtp
  smtp_settings:
    address: localhost
    port: 25
    domain: example.com
    authentication: :none

Apache installieren

Für diesen Teil der Installation musste ich recht lange herumprobieren, bis das Gespann aus Rails, mod_fcgid und Apache korrekt funktioniert hat. Bei diesem Zusammenspiel kann leider allzuviel schiefgehen.

Zunächst wird das CGI-Script an Ort und Stelle gebracht:

# cp public/dispatch.fcgi.example public/dispatch.fcgi

Eine weitere Anpassung ist nicht notwendig.

Es folgen die benötigten Debian-Pakete…

# aptitude install apache2 libapache2-mod-fcgid libfcgi-dev

… sowie ein weiteres gem:

# gem install fcgi

[Update 24.10.09: Als ich kürzlich auf Version 0.8.5 umgestellt habe, habe ich bemerkt, dass ich hier einen Schritt unterschlagen habe, den ich hiermit nachreichen möchte. Und zwar müssen in der public/.htaccess folgende Zeilen auskommentiert werden:

#<IfModule mod_cgi.c>
#       AddHandler cgi-script .cgi
#</IfModule>

und

#<IfModule mod_cgi.c>
#       RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
#</IfModule>

Ansonsten schreibt Apache den Request bis zum Erreichen des Limits immer wieder um und produziert einen Internal Server Error.]

Zuletzt wird der Virtual Host redmine.example.com konfiguriert. Dazu wird die Datei /etc/apache2/sites-available/redmine mit folgendem Inhalt angelegt:

<VirtualHost *:80>
  ServerName redmine.example.com
  ServerAlias redmine

  ServerAdmin webmaster@localhost

  DocumentRoot /srv/www/redmine/public/

  <IfModule mod_fcgid.c>
    DefaultInitEnv RAILS_ENV production
    DefaultInitEnv GEM_HOME /var/local/lib/gems
    DefaultInitEnv RUBYLIB /usr/local/ruby/lib/
  </IfModule>

  <Directory /srv/www/redmine/public/>
    Options Indexes ExecCGI FollowSymLinks
    Order allow,deny
    Allow from all
    AllowOverride all
  </Directory>

  ErrorLog /var/log/apache2/redmine_error.log
  LogLevel warn
  CustomLog /var/log/apache2/redmine_access.log combined
</VirtualHost>

Nun muss nur noch die Konfiguration geladen und das Modul rewrite aktiviert werden:

# a2ensite redmine
# a2enmod rewrite
# /etc/init.d/apache2 restart

Wenn nichts schiefgegangen ist, steht Redmine jetzt unter redmine.example.com/ bereit. Für die weitere Konfiguration und die ersten Schritte lohnt sich ein Blick ins Redmine Manual.

Was ist Google Wave?

wavelogoAm 28. Mai hat Google auf der I/O Conference sein neuestes Produkt namens »Google Wave« präsentiert, das sich derzeit noch in einer frühen Phase der Entwicklung befindet — die Freigabe ist für »später im Laufe des Jahres« angekündigt. Das Video der Präsentation hat mich kurz gesagt einfach umgehauen. Meiner Meinung nach hat Wave das Potential das Internet in ähnlicher Weise zu revolutionieren, wie die Erfindung des WWW vor 20 Jahren.

Im Folgenden möchte ich einen Überblick geben, was alles mit Wave möglich ist und warum diese Technik weitaus mehr ist, als man auf den ersten Blick ahnt.

Was ist Wave?

Wave ist eine mögliche Antwort auf die Frage »Wie würde E-Mail aussehen, wenn sie heute erfunden würde anstatt vor 40 Jahren?« Wave vereinigt eine Vielzahl von Kommunikationsformen, die wir heute im Internet kennen: E-Mail, Instant Messaging, Chat, Wikis, Blogs, RSS. Eine Wave stellt eine Nachricht bzw. ein Dokument dar, das auf einem Wave-Server gespeichert ist und auf das mit Hilfe eines speziellen Clients zugegriffen wird. Jeder Wave werden Benutzer zugeordnet, die auf den Inhalt zugreifen und diesen ändern können. Waves können neben Text, Bildern und Videos mit Hilfe von Extensions ganze Applikationen enthalten.

E-Mail und Instant Messaging

Das Eröffnen einer neuen Wave ist Vergleichbar mit dem Schreiben einer E-Mail. Ein User schreibt seinen Text und fügt einen oder mehrere Empfänger hinzu. Dem Empfänger wird diese Wave in seiner Inbox angezeigt und er kann seine Antwort unterhalb der ursprünglichen Nachricht platzieren oder auch einzelne Absätze kommentieren. Sobald sich der ursprüngliche Autor wieder mit dem Server verbindet, wird die Wave hervorgehoben und dadurch angezeigt, dass neue Inhalte vorhanden sind.

Sind die Anwender gleichzeitig angemeldet, können sie die Änderungen des jeweils anderen simultan sehen — auf Wunsch Zeichen für Zeichen. Auf diese Weise verschmelzen E-Mail, IM und Chat.

Zu jedem Zeitpunkt im Laufe der Unterhaltung können weitere User zu der Wave hinzugefügt werden. Diese haben die Möglichkeit mit Hilfe einer Replay-Funktion den gesamten Ablauf der bisherigen Kommunikation Schritt für Schritt zu verfolgen und nachzuvollziehen.

Neben Textnachrichten können Anwender auch Bilder in die Wave einfügen und so z.B. zusammen ein Fotoalbum vom gemeinsamen Urlaub erstellen. Der vorgestellte Google Wave-Client ermöglicht es, spezielle Funktionen auf alle eingebetteten Bilder anzuwenden. So können etwa alle Bilder mit einem Klick heruntergeladen oder in eine neue Wave exportiert werden.

Wiki und Collaboration

Benutzer können nicht nur ihre eigenen Nachrichten bearbeiten sondern auch fremde. Fasst man eine Wave nun als Dokument und nicht als Nachricht auf, erfüllt sie die Funktion eines Wikis und erlaubt die gemeinsame Arbeit an einem Text. In Echtzeit werden wieder alle Änderungen simultan allen angemeldeten Usern angezeigt, die in unmittelbarer Nähe zueinander stattfinden können. Mit den gleichen Funktionen wie oben beschrieben können Kommentare und Diskussionen über das Dokument quasi eingebettet werden. Diese »Sub-Waves« verhalten sich ihrerseits wieder wie Waves: so kann etwa die Liste der User, die eine solche Diskussion sehen können, auf eine Untermenge der User beschränkt werden, die das eigentliche Dokument bearbeiten. Mit Hilfe der Replay-Funktion soll es später möglich sein, alle Änderungen einer einzelnen Person oder auch alle Bearbeitungsschritte eines einzelnen Abschnitts gezielt nachvollziehen zu können.

Das fertige Dokument kann anschließend (auch ohne die enthaltenen Kommentare) als neue Wave exportiert werden. Besonders spannend ist hier die Ankündigung, dass es möglich sein soll, mehrere »Arbeits-Waves« in ein Masterdokument zu exportieren und die Änderungen von dort wieder die eigene Wave zu importieren — ganz ähnlich, wie es verteilte Versionsverwaltungssysteme wie git erlauben.

Einbettung in Websites und Blogs

Mit Hilfe der offenen API können Waves in Webseiten und Blogs integriert werden, wo sie sie dann ebenfalls weiterbearbeitet werden können. So wurde z.B. demonstriert, wie der automatisch generierte Blogeintrag kommentiert wurde und die Kommentare als Bestandteil der Wave wieder im Wave-Client angezeigt wurden. Auch der User, der den Kommentar geschrieben hat, gehört nun zu der Wave und kann diese seinerseits weiter verfolgen. Auf diese Weise könnte man Diskussionen zu Blogeinträgen folgen, ohne dass man auf Dutzenden von Blogs regelmäßig nach Antworten suchen müsste.

Mit Hilfe der APIs können aber auch umgekehrt Dienste in Wave importiert werden. So wurde mit Twave eine Anbindung an Twitter demonstriert, die die Twitter-Timeline als Wave dargestellt hat. Antworten innerhalb dieser Wave wurden automatisch wiederum bei Twitter als Tweets veröffentlicht.

Erweiterungen: Gadgets und Robots

Waves lassen sich auf zwei verschiedene Arten um Funktionen erweitern. So genannte Gadgets sind Applikationen, die in die Wave eingebettet werden. Auf der Keynote wurden als Beispiele unter anderem ein Gadget zur Durchführung von Abstimmungen und ein Schachspiel gezeigt. Auch hier steht eine offene API zur Verfügung, so dass die Art und Anzahl der verfügbaren Gadgets allein von der Phantasie der Entwickler abhängen wird.

Eine andere Art der Erweiterungen sind Robots. Diese unterscheiden sich von den Gadgets dadurch, dass sie serverseitig arbeiten. Robots werden wie User zu einer Wave hinzugefügt und haben alle Möglichkeiten diese zu manipulieren wie menschliche Benutzer. Als Beispiele wurden etwa eine Rechtschreibkorrektur (Spelly) und eine automatische Verlinkung von Text (Linky) gezeigt. Den Export einer Wave in ein Blog hat der Robot Bloggy übernommen.

Federation

Wave ist nicht als Google-Dienst konzipiert, der auf einem zentralen Server angeboten wird. Statt dessen soll sowohl das zugrunde liegende Protokoll als auch der Code des Wave-Servers als Referenzimplementierung veröffentlicht werden, so dass jeder in der Lage ist, seinen eigenen Wave-Dienst anzubieten. Waves können dann serverübergreifend verteilt und bearbeitet werden und zwar mit allen Funktionen inklusive der Übertragung von Änderungen in Echtzeit. Dabei werden die (Teil-)Waves nur an diejenigen Server übertragen, die notwendig sind damit alle User, die an dieser beteiligt sind, erreicht werden.

Durch das offene Protokoll ist man ebenfalls nicht auf den von Google vorgestellten Client in Form einer HTML5-Webapplikation festgelegt. Eine Vielzahl von möglichen Wave-Clients ist hier denkbar, die z.B. unterschiedliche Schwerpunkte bei der Interpretation von Waves setzen könnten. Wird Wave von den Internet-Nutzern angenommen, so ist zu erwarten, dass es zukünftig eine Reihe von Server- und Client-Produkten geben wird, auf die man zurückgreifen kann — so wie es bei E-Mail bereits der Fall ist.

Fazit

Es ist in dieser frühen Phase der Entwicklung noch schwer zu sagen, welche Möglichkeiten Wave bieten wird und wie diese von den Usern angenommen werden. Das Potential, das in dieser Technik steckt, ist jedoch enorm. Zwar sind sämtliche Funktionen bereits durch andere Dienste in der einen oder anderen Form bereits jetzt realisierbar, aber die nahtlose Verknüpfung ist in dieser Art noch nicht da gewesen. Die Tatsache, dass sämtliche Protokolle sowie der Code als Opensource veröffentlicht werden sollen, lädt alle Entwickler dazu ein, mit diesen neuen Möglichkeiten zu experimentieren und Dienste zu schaffen, von denen derzeit noch nicht einmal die Wave-Entwickler selbst träumen.

Natürlich ergeben sich auch eine ganze Reihe von Fragen, die in der Keynote noch nicht beantwortet wurden. Allem voran etwa Aspekte rund um die Sicherheit von Gadgets. Auch eine Wave als »Read-Only« markieren zu können, so dass diese nicht beliebig weiter bearbeitet werden kann, ist sicher eine Funktion, die sinnvoll wäre.

Ich für meinen Teil bin ausgesprochen beeindruckt und werde mich in der nächsten Zeit durch die bereits veröffentlichte API- und Protokoll-Dokumentation arbeiten. Ich habe das Gefühl, dies wird nicht mein letzter Blog-Artikel zum Thema Wave sein…

Links

Ein »etwas anderer« offener Brief an ZensUrsula von der Leyen

Sehr geehrte Frau von der Leyen,

mit großem Interesse verfolge ich die von Ihnen initiierte Debatte um die Sperrung von Kinderpornographie im Internet. Es wird wirklich Zeit, dass etwas getan wird, um diesem abscheulichen Verbrechen Einhalt zu gebieten. Dass Sie sich bei Ihrem Vorhaben nicht von ein paar undifferenzierten Kritikern aus der Ruhe bringen lassen und sich unbeirrt und kompromisslos für die Belange der schwächsten Mitglieder unserer Gesellschaft — der Kinder — einsetzen, verdient allerhöchsten Respekt und volle Unterstützung.

Wie Ihnen zweifelsohne bekannt ist, nutzen Pädokriminelle jedoch nicht nur das Internet, sondern missbrauchen in zunehmendem Maße den Postweg, um Bilder und DVDs ihrer Gräueltaten zu verbreiten. Es ist abzusehen, dass diese Entwicklung einen weiteren dramatischen Sprung nach oben erfahren wird, sobald die Datenautobahn der Kinderpornographie erst einmal geschlossen ist. Wir als zivilisierte Gesellschaft, die Kinderpornografie ernsthaft ächtet, darf nicht tolerieren, dass jeder diese Bilder und Videos vergewaltigter Kinder ungehindert verschicken kann! Es ist nicht hinzunehmen, dass Post-Unternehmen Jahrhunderte lang untätig geblieben sind, während sie Drohbriefe, Hetzschriften, Briefbomben und Kinderpornos widerspruchslos ausgeliefert und sich daran bereichert haben.

Damit muss Schluss sein — Das Postwesen ist kein rechtsfreier Raum!

Ich appelliere daher an Sie: bleiben Sie nicht auf halbem Wege stehen. Setzen Sie Ihre Bemühungen weiter fort und schließen Sie auch die Postautobahn der Kinderpornographie!

In einem ersten Schritt sollten zunächst die Adressen aller polizeilich bekannten und mutmaßlichen Pädophilen an die Post-Unternehmen weitergeleitet werden. Diese müssen dazu verpflichtet werden, Sendungen an diese Kriminellen nicht mehr direkt zuzustellen, sondern dem BKA zu übergeben. Die Betroffenen können sich ihre Sendung wenige Tage später nach einer entsprechenden Überprüfung bei einer Polizeidienststelle in ihrer Nähe abholen.

Diese Maßnahme kann selbstverständlich nur der Anfang sein. Um die Verbreitung von Kinderpornos auf dem Postweg gänzlich zu verhindern, müssen die Post-Unternehmen dazu verpflichtet werden, den Inhalt sämtlicher Sendungen zu untersuchen (eine so genannte »Tiefe Ausführliche Paketinspektion« durchführen). Die Unterstützung Ihrer Parteikollegen dürfte Ihnen gewiss sein — schließlich ließen sich auf diese Weise auf einen Schlag zehntausende Arbeitsplätze schaffen. Zugegeben, der Versand eines Briefes würde dann 1€ kosten, aber wo kämen wir hin, wenn uns allen der Schutz der Kinder nicht 45 Cent wert wäre.

Wer meint, dass das Telekommunikations- oder Briefgeheimnis höher einzuschätzen sei, als das Recht auf die Würde und die körperliche Unversehrtheit unserer Kinder, hat ganz offensichtlich jegliche moralischen Wertemaßstäbe verloren. Jedes verschickte Bild und jede verschickte DVD verlängert die Schändung der hilflosen Kinder. Zögern Sie nicht länger und werden Sie aktiv!


Disclaimer: Nur falls es jemand nicht mitbekommen haben sollte: Ja, dieser Text ist als Satire aufzufassen.

Ihr seid eingeladen, diesen Text in euren Blogs zu übernehmen. Über einen Link auf meine Seite würde ich mich freuen.

[Update 24.06.09: Weitere offene Briefe finden sich bei datenschutzbeauftragter-online.de und Nichts als die Wahrheit]

Briefwechsel mit Günter Gloser (Teil 3)

Nachdem sich die Antwort von Günter Gloser auf meine Anfrage bei mir etwas gesetzt hat, möchte ich sie nicht länger unkommentiert stehen lassen. Herr Gloser sagt ohne mit Worten zu sparen … leider nicht viel. Deshalb habe ich heute per E-Mail noch einmal nachgehakt:

Sehr geehrter Herr Gloser,

herzlichen Dank für Ihre schnelle Antwort. Ich finde es bedauerlich, dass Sie auf zentrale Fragen meinerseits nicht oder nur ausweichend eingegangen sind. Begrüßen mochte ich dagegen ihre Feststellung, dass es sich bei den geplanten Maßnahmen um einen Eingriff in Grundrechte handelt.

Ohne mich unnötig zu wiederholen, möchte ich Sie um die Beantwortung von zwei in meinen Augen ganz entscheidenden Fragen bitten, die in der aktuellen Debatte leider zunehmend in den Hintergrund rücken. Wie ich bereits aufgezeigt habe, ist die zentrale These (die Existenz eines Massenmarktes), auf der die gesamte Argumentation der Befürworter von Internetsperren aufbaut, ausgesprochen zweifelhaft und unschlüssig. Lutz Donnerhacke hat dazu eine sehr detaillierte und aufschlussreiche Analyse der angeführten Zahlen veröffentlicht, deren Lektüre ich Ihnen sehr ans Herz legen möchte.

Meine Fragen an Sie:

Wie wichtig ist es Ihrer Meinung nach, dass die zugrunde liegenden Thesen — von deren Korrektheit die Wirksamkeit und Geeignetheit der Sperrmaßnahmen unmittelbar abhängig ist — eingehend und nachvollziehbar geprüft werden? Würden Sie dem Gesetz auch ohne eine solche Prüfung »auf gut Glück« zustimmen?

Wie bewerten Sie die Tatsache, dass die Erfahrungen, die etwa in den skandinavischen Ländern mit der Einführung von Sperrlisten gemacht wurden, genau dem Gegenteil dessen entsprechen, was Frau von der Leyen zu erreichen beabsichtigt?

Antwort von Günter Gloser auf meine Anfrage

Heute habe ich per E-Mail folgende Antwort auf meine Anfrage zum Thema Sperrung von Internetseiten mit kinderpornographischen Inhalten von Herrn Gloser erhalten.

Update 10. Mai: Auf dieses Schreiben habe ich heute per E-Mail geantwortet.

Update 16. Mai: Mittlerweile hat Herr Gloser mit exakt dem gleichen Text eine Frage bei abgeordnetenwatch.de beantwortet.

Sehr geehrter Herr Grandrath,

danke für Ihren Brief vom 01. Mai, den Sie mir ja auch schon über Twitter angekündigt haben. Ihre Argumente sind mir bekannt und sie decken sich ja zum großen Teil auch mit der Petition »Internet – Keine Indizierung und Sperrung von Internetseiten« von Frau Franziska Heine vom 22.04.2009. Wie ich sehe, unterstützen nach heutigem Stand schon über 45865 Personen diese Petition, so dass Sie sicher seien können, dass Ihre Argumente im Petitionsausschuss, aber auch in den anderen mit der Bekämpfung von kinderpornographischen Inhalten befassten Gremien genau zur Kenntnis genommen werden.

In dieser Frage bin ich bereits Anfang März angeschrieben worden, damals aber mit genau umgekehrter Zielrichtung — mit Empörung darüber, dass die SPD angeblich das Recht von Kinderschändern schützen wolle, sich solche Bilder im Netz anzuschauen. Damals wie heute muss ich auf dieses Thema differenziert eingehen und kann mich daher leider auch Ihrer Argumentation oder der oben genannten Petition nicht einfach anschließen.

Ihre Bedenken sind aus meiner Sicht aber nicht unberechtigt. Natürlich bedeutet eine Einschränkung des Internetverkehrs einen Eingriff in das Grundrecht auf informationelle Selbstbestimmung. Die Frage besteht darin, ob dieser Eingriff berechtigt ist und ob das Verfahren geeignet ist, die Ziele der Maßnahme zu erreichen. Beides ist wichtig für die Abwägung der betroffenen Rechtsgüter: Schutz der Kinder und Durchsetzung des Verbots von kinderpornographischen Darstellungen einerseits und Freiheitsrechte andererseits.

Wie Sie wissen, ist das Gesetzgebungsverfahren gerade erst eröffnet. Der federführende Rechtsausschuss wird sich in dieser Woche erstmals mit dem Vorschlag der Bundesregierung befassen, die Beratungen in den mitberatenden Ausschüssen, in den Fraktionen und im Plenum stehen noch aus. Bislang besteht ja nur eine vertragliche Vereinbarung zwischen Bundesregierung und einigen Providern. Es ist also auch noch viel zu früh, endgültig Stellung zu nehmen. Gerne stelle ich Ihnen aber kurz dar, auf welcher Grundlage ich die Diskussion verfolgen und meine Entscheidung am Ende treffen werde.

Zuallererst möchte ich sagen, dass ich es unerträglich fände, wenn wir nicht alles, wirklich alles unternehmen würden, um Kinder vor Missbrauch zu schützen. Und Missbrauch ist dabei nicht nur der Missbrauch selber, sondern auch dessen Zurschaustellung und Weiterverbreitung über welches Medium auch immer. Das Sperren von Internetseiten, die solche Darstellungen enthalten, ist _eine_ mögliche Maßnahme in diesem Zusammenhang. Ich möchte an dieser Stelle nicht auf die vielen anderen Maßnahmen eingehen, die mit demselben Ziel in den letzten Jahren bereits umgesetzt wurden oder derzeit diskutiert werden. Ich will nur darauf hinweisen, dass das Sperren von Internetseiten eben nur einer von vielen möglichen Wegen ist. Wenn dieser Weg aber geeignet ist, den Zugang zu solchen verbotenen Materialien deutlich zu erschweren und wenn die offenen rechtlichen und verfahrenstechnischen Fragen geklärt sind, dann werde ich dem am Ende auch zustimmen.

Nun also zu den angesprochenen Fragen, die aus meiner Sicht noch offen sind. Zunächst hat schon die Bundesministerin der Justiz zu Recht darauf hingewiesen, dass die Frage der Zuständigkeit des undeskriminalamtes genau geprüft werden muss. Für die Rolle des BKA muss es also einen klaren rechtlichen Rahmen geben. Außerdem muss eine gesetzliche Regelung sicherstellen, dass die Praxis der Sperrung wirklich nur für Seiten mit kinderporno­graphischen Inhalten ermöglicht wird. Und schließlich dürfen wir uns natürlich mit dem Sperren der Seiten nicht begnügen. Wenn wir von Servern mit verbotenen Inhalten Kenntnis haben, müssen wir auch international mit rechtlichen Mitteln gegen sie vorgehen, zum Beispiel, wenn sich die Server in der EU oder in den USA befinden.

In den Beratungen werde ich darauf achten, dass diese Fragen geklärt sind, bevor wir einem Gesetz in dieser Sache zustimmen. Auch wenn ich Ihren Argumenten vielleicht am Ende der Debatte im Bundestag nicht folgen sollte, beziehe ich sie also in die Entscheidung auf jeden Fall mit ein.

Für Ihr Interesse an dem Thema und ihren Einsatz für die Freiheit der Kommunikation im Internet bedanke ich mich ausdrücklich.

Mit freundlichen Grüßen

Günter Gloser

Anfrage an MdBs meines Wahlkreises zum Thema Netzsperren

Den folgenden Brief habe ich am 1. Mai 2009 an die Abgeordneten meines Wahlkreises Dagmar Wöhrl (CDU/CSU) und Günter Gloser (SPD) geschickt. Die Weiterverbreitung ist explizit erwünscht!

Update 7. Mai 2009: Heute habe ich eine Antwort von Herrn Gloser erhalten.

Update 12. Juni 2009: Heute habe ich eine Antwort von Frau Wöhrl erhalten. Leider nur in Papierform, weswegen ich sie erst am Wochenende veröffentlichen kann. Viel Aufregendes steht allerdings erwartungsgemäß nicht drin; im Wesentlichen wiederholen sich Statements aus der FAQ des BMFSFJ.

Sehr geehrte Frau Wöhrl,
Sehr geehrter Herr Gloser,

Ich wende mich an Sie als Bundestagsabgeordnete meines Wahlkreises Nürnberg-Nord und möchte mit Ihnen zum Thema »Sperrung von Internetseiten« ins Gespräch kommen. Wie viele andere Nutzer des World Wide Webs habe ich große Bedenken was Geeignetheit und Erforderlichkeit der von Frau von der Leyen geplanten Maßnahmen im Vergleich zur Gefahr eines Missbrauchs der neuen Möglichkeiten angeht und würde mich sehr über eine Stellungnahme von Ihnen freuen.

Mir ist positiv aufgefallen, dass Sie ein Profil auf der Plattform twitter eingerichtet haben. Daher gehe ich davon aus, dass Sie modernen Kommunikationsmitteln gegenüber aufgeschlossen sind und daran interessiert sind, mit Ihren Wählen in Kontakt zu kommen.

Falsche Voraussetzungen

Die Grundlage der Argumentation von Frau von der Leyen fußt auf der Annahme, dass es im World Wide Web einen kommerziellen Markt gibt, auf dem über frei zugängliche Internetseiten kinderpornographisches Material in großen Mengen angeboten wird. In diesem Zusammenhang ist von einem »Millionengeschäft« und 50.000 Zugriffen monatlich die Rede [Quelle]. Andererseits wird die Behauptung aufgestellt, dass ein großer Teil der Konsumenten zufällig auf diese Seiten stößt und anschließend »angefixt« nach immer mehr Material sucht [Quelle].

Beide Behauptungen werden von Experten stark angezweifelt [Quelle][Quelle] und das BMFSFJ verweist als Beleg lediglich auf eine nicht näher genannte »britische Studie«, um die dargestellten Zusammenhänge und Zahlen zu stützen. Eine intensive Suche nach Quellen für die genannten Zahlen endet ausschließlich in Sackgassen [Quelle].

Darüber hinaus verneint selbst das LKA München die Existenz einer »Kinderporno-Industrie« [Quelle]:

»Die überwältigende Mehrzahl der Feststellungen, die wir machen, sind kostenlose Tauschringe, oder Ringe, bei denen man gegen ein relativ geringes Entgelt Mitglied wird, wo also nicht das kommerzielle Gewinnstreben im Vordergrund steht.«

Auch die Vorstellung, dass sich »normale Bürger« beim Anblick von dokumentiertem Kindesmissbrauch nicht unmittelbar angewidert abwenden und die zuständigen Behörden informieren sondern vielmehr »süchtig« danach werden, ist wenig glaubwürdig und wissenschaftlich nicht abgesichert.

Es stellt sich also die konkrete Frage, inwieweit mit den geplanten Maßnahmen tatsächlich Kinder geschützt werden.

Häufig wird Schweden als Beispiel für einen erfolgreichen Einsatz von Internetsperren genannt. Der Chef der Polizeiermittlungsgruppe gegen Kinderpornographie und Kindesmisshandlung in Stockholm, Björn Sellström, hat in einem Interview gegenüber dem Magazin »Focus« hingegen dieses Fazit gezogen [Quelle]:

»Unsere Sperrmaßnahmen tragen leider nicht dazu bei, die Produktion von Webpornografie zu vermindern.«

Die geplante Sperrliste

Sowohl der freiwillige Vertrag mit den Providern als auch der derzeitige Gesetzentwurf geben dem BKA die alleinige Entscheidungsgewalt über die Liste der zu sperrenden Inhalte in die Hand und sehen keinerlei Kontrolle durch ein demokratisch legitimiertes Gremium oder einen Richtervorbehalt vor. Dadurch wird die Gewaltenteilung effektiv umgangen, was im eklatanten Widerspruch zu unserer demokratischen Grundordnung steht. Darüber hinaus werden in hohem Maße Begehrlichkeiten geweckt und zahlreiche Interessengruppen stehen bereits jetzt Schlange, um ihnen nicht genehme Inhalte sperren zu lassen [Quelle]. Analysen der an die Öffentlichkeit gekommenen Sperrlisten aus Finnland, Schweden, der Schweiz und Australien zeigen, dass diese zu einem großen Teil Internetseiten enthalten, die keinerlei kinderpornographisches Material anbieten [Quelle].

Wo eine Einschränkung der Informationsfreiheit und des Telekommunikationsgeheimnisses zum Schutze von Kindern vor Missbrauch zweifellos verhältnismäßig ist, muss diese Frage für andere Inhalte wie etwa Urheberrechtsverletzungen oder Glücksspielangebote dringend geklärt werden und zwar bevor eine solche Infrastruktur aufgebaut wird.

Des Weiteren wurde mehrfach betont, dass es sich bei den Sperrungen nur um eine von vielen sich ergänzenden Maßnahmen handeln soll. Wie genau sehen diese anderen Maßnahmen aus? Was wird beispielsweise dafür unternommen, dass Kinder gar nicht erst missbraucht werden? Und warum wird das Gesetz zur Sperrung von Inhalten nicht mit entsprechenden Hürden versehen, wie z.B. die Voraussetzung, dass vor einer Sperrmaßnahme erst alle anderen Möglichkeiten (etwa das Entfernen der Inhalte durch den Anbieter oder Beschlagnahmung der Server) ausgeschöpft sein müssen oder dass der entsprechende Server in einem Land stehen muss, in dem eine strafrechtliche Verfolgung nicht möglich ist?

Auch wenn es in den Medien und in der politischen Debatte häufig vermengt wird, sind das »Sperren« und das »Abschalten« zwei verschiedene Paar Schuhe. Eine Vielzahl der Server, die gesperrt werden sollen, befindet sich in den USA und in Westeuropa. Ein unmittelbarer Zugriff auf diese wäre folglich durch die Strafverfolgungsbehörden möglich [Quelle (PDF)]. Die Organisation Carechild hat erfolgreich demonstriert, dass sich ein großer Teil der auf den Sperrlisten anderer Länder befindlichen Server durch eine einfache E-Mail an den jeweiligen Hoster nachhaltig vom Netz nehmen lassen [Quelle]. Wie ist es zu erklären, dass die zuständigen Behörden in dieser Hinsicht weniger Erfolg haben?

Das Internet wird zum Minenfeld

Entgegen ursprünglicher Behauptungen sieht der aktuelle Entwurf vor, dass Zugriffe auf die »Stopp-Seite« vom BKA überwacht werden können [Quelle]. Frau von der Leyen behauptet nun einerseits, dass eine Speicherung dieser Daten nicht stattfindet aber andererseits, dass Internetnutzer, die nur zufällig auf diese Seite geraten, nicht ins Fadenkreuz der Ermittler geraten [Quelle].

Wie erklären Sie den damit verbundenen Widerspruch? Wie sollen die Behörden ohne eine Speicherung der Daten entscheiden können, ob ein Anwender nur einmalig/zufällig oder wiederholt eine gesperrte Seite aufruft? Angeblich reden wir hier ja von tausenden von Zugriffen täglich.

Der Pressesprecher des Justizministeriums, Ulrich Staudigl hat bestätigt, dass jeder Nutzer mit Strafverfolgung rechnen muss, wenn er dabei beobachtet wird, eine geblockte Webseite abzurufen. Viele sehen hier wie ich die Gefahr, dass sich das Internet in ein Minenfeld verwandelt, da man keinem Link vorher ansehen kann, wohin er führt.

Fragen Sie sich bitte selber: Würden Sie (unter den geplanten gesetzlichen Bedingungen) diesem Link folgen? http://tinyurl.com/camxkj/

Fazit

Die geplanten Maßnahmen verbinden zweifelhaften Nutzen mit einem erschreckenden Missbrauchspotential. Trotzdem (oder gerade deshalb?) wird diese Gesetzesverfahren mit aller Gewalt vorangetrieben ohne auf Meinungen und Bedenken von Experten auch nur einzugehen. Statt dessen glänzt Frau von der Leyen mit technischem Unwissen und erweckt wiederholt den Eindruck, dass Sie die Folgen, die ihre Pläne für das Internet als Ganzes haben, nicht ansatzweise einschätzen kann.

Mich interessiert Ihre Meinung zu diesem Thema und würde mich über Antworten auf meine Fragen von Ihnen freuen.

<pre>-Elemente mit horizontalem Scrollbalken im IE

In meinem aktuellen Template verwende ich für Codeschnipsel <pre>-Elemente mit der Eigenschaft overflow: auto, so dass ein horizontaler Scrollbalken erscheint, wenn der Inhalt breiter als die Box ist. Dies funktioniert (welch Überraschung) nicht im IE6 und nur eingeschränkt im IE7.

Das Problem

IE6 weitet die Box aus und zerstört dadurch das Layout. In meinem Fall rutschte die Seitenleiste rechts unter den eigentlichen Inhalt. IE7 zeigt zwar einen Scrollbalken an, platziert diesen aber innerhalb statt unterhalb der Box, was bei Elementen, die nur eine einzige Zeile beinhalten, dazu führt, dass der Text hinter dem Scrollbalken verschwindet und ein unbedienbarer (weil winziger) vertikaler Balken angezeigt wird.

Die Lösung

Hier ist die Lösung, die ich nach einigem Googlen und Probieren gefunden habe. Dieser Schnipsel sollte in ein separates IE-Stylesheet eingebaut werden, das per conditional comments nur von IE <= 7 geladen wird (bei IE8 tritt das Problem nicht auf).

pre
{
  /* disable vertical scroll bar */
  overflow-y: hidden;

  /* fallback if scripting is disabled */
  padding-bottom: 20px;

  /* add padding if content is wider than the box */
  padding-bottom: expression(this.scrollWidth > this.offsetWidth ? "20px" : "0");

  /* prevent the box from expanding */
  width: 100%;
  }

Falls JavaScript deaktiviert ist, wird das Padding von 20px immer eingefügt. Das führt zwar zu unschönen Abständen, wenn kein Scrollbalken angezeigt wird (d.h. wenn der Inhalt nicht breiter als die Box ist), ist aber auf alle Fälle besser als die ursprüngliche Darstellung.

WordPress Theme internationalization (Teil 2)

Vor etwa einem Jahr habe ich bereits einen Artikel über WordPress Theme internationalization geschrieben und das grundlegende Vorgehen zum Erzeugen von Sprachdateien skizziert. Ich möchte diesen im Folgenden durch meinen persönlichen Workflow anhand eines einfachen Beispiels ergänzen.

Vorbereitung

Wie bereits im ersten Teil dargestellt, muss zunächst in der Datei functions.php die »Textdomain« eingebunden werden. Seit WordPress 2.7 ist es möglich, zusätzlich zum Namen der Domain ein Verzeichnis anzugeben, in dem nach den Übersetzungen gesucht wird (in diesem Fall das Verzeichnis messages/ unterhalb des Template-Verzeichnisses):

load_theme_textdomain('mydomain', get_template_directory().'/messages');

Anschließend müssen in den Templatedateien sämtliche Strings ausgezeichnet werden, die übersetzt werden sollen. Wenn man ein neues Theme von Grund auf gestaltet, tut man gut daran, das von Anfang an zu tun. Andernfalls ist das eine recht mühselige Arbeit.

Ein paar Beispiele

In der Datei index.php befindet sich innerhalb »Der Schleife« (The Loop) diese Zeile zur Ausgabe des Inhalts eines Artikels:

the_content('Read the rest of this entry');

Dies wird zu

the_content( __('Read the rest of this entry', 'mydomain') );

Die Funktion __($message, $domain) sucht innerhalb der Domain $domain (hier: ‘mydomain’) nach einer Übersetzung für den String $message (hier: ‘Read the rest of this entry’) und gibt diese zurück. Oder, falls keine Übersetzung gefunden wurde, den ursprünglichen String.

In der Datei comments.php findet sich das Label für das Formularfeld »author«:

<label for="author">Your name</label>

Dies wird zu

<label for="author"><?php _e('Your name', 'mydomain'); ?></label>

Die Funktion _e(...) ist äquivalent zu echo __(...)

Automatisierung mit GNU make

Nun geht es darum, diese Strings zu extrahieren und in separaten Dateien zu speichern, die dann jeweils die Übersetzung in eine weitere Sprache ermöglichen. Um das Hantieren mit den .po- und .mo-Dateien (siehe Teil 1) etwas einfacher zu gestalten, habe ich folgendes Makefile geschrieben:

# List of locales to generate (space separated)
LOCALES = de_DE

# List of source files
SRC_FILES = ../*.php

# .pot file to create
POT_FILE = messages.pot

$(POT_FILE): $(SRC_FILES)
        xgettext --keyword=__ --keyword=_e --keyword=_c --keyword=__ngettext:1,2 --keyword=__ngettext_noop:1,2 $(SRC_FILES) && \
        mv messages.po $(POT_FILE)

po_files: $(patsubst %,%.po,$(LOCALES))

mo_files: $(patsubst %,%.mo,$(LOCALES))

%.po: $(POT_FILE)
        [ -f $@ ] && \
        msgmerge -U $@ $< && touch $@ || \
        msginit -l $* -o $@

%.mo: %.po
        msgfmt -o $@ $<

Wichtig: die eingerückten Zeilen müssen mit einem Tab und nicht mit Leerzeichen eingerückt werden!

Diese Datei wird unter dem Namen Makefile (Groß-/Kleinschreibung beachten) im Verzeichnis messages/ abgelegt, das unterhalb des Template-Verzeichnisses angelegt wird:

mytheme/
|-- footer.php
|-- functions.php
|-- header.php
|-- index.php
|-- messages/
|   `-- Makefile
|-- screenshot.png
|-- searchform.php
|-- sidebar.php
|-- single.php
`-- style.css

Damit das Folgende funktioniert, müssen die GNU-Tools make und gettext installiert sein, was unter Debian der Befehl aptitude install gettext make erledigt.

.po-Files generieren

Zunächst wechseln wir in das neu angelegte Verzeichnis:

$ cd messages/
$ ls
Makefile

Jetzt legen wir die .po-Datei an, in der die deutschen Übersetzungen gespeichert werden:

$ make de_DE.po

Übersetzen

Nun wird die eigentliche Übersetzungsarbeit fällig. Es bietet sich an, für das Bearbeiten der .po-Dateien eines der zahlreichen Tools zu verwenden, die es einem erleichtern, sich ganz auf die Texte zu konzentrieren, ohne dass man Gefahr läuft die Syntax der Datei kaputt zu machen.

Vorab sollte man in der .po-Datei noch die Zeichenkodierung auf UTF-8 ändern, um sich Probleme mit Umlauten zu ersparen:

"Content-Type: text/plain; charset=UTF-8\n"

.mo-Files generieren

Ist die Übersetzung abgeschlossen, kann die .po-Datei compiliert, d.h. die .mo-Datei erzeugt werden. Das passiert durch den Aufruf von

$ make de_DE.mo

Jetzt sollten die übersetzten Texte im Theme erscheinen. Falls das nicht klappt, sollte als erstes geprüft werden, ob in der wp-config.php die Konstante WPLANG auf den Wert ‘de_DE’ gesetzt ist.

.po-Files aktualisieren

Wird nun weiter am Template gearbeitet, kann es natürlich passieren, dass neue Strings definiert werden, die übersetzt werden wollen. In diesem Fall aktualisiert der Aufruf von make de_DE.po die .po-Datei – alle bisher gemachten Übersetzungen bleiben dabei erhalten. Die Erzeugung der .mo-Datei erfolgt wie gehabt.

Übersetzungen in weitere Sprachen

Wer sich mit Makefiles auskennt, hat vermutlich schon bemerkt, dass sich mit meinem Makefile eine ganze Liste von Sprachdateien in einem Rutsch aktualisieren lassen. Dazu werden in der 2. Zeile alle Locales, die erzeugt werden sollen, durch Leerzeichen getrennt hintereinander aufgelistet (hier z.B. für Deutsch, Französisch, Spanisch und Italienisch):

LOCALES = de_DE fr_FR es_ES it_IT

Nun können alle .po-Dateien mit make po_files bzw. alle .mo-Dateien mit make mo_files auf den neuesten Stand gebracht werden. Es ist übrigens auch möglich, weitere Sprachen im Nachhinein zu ergänzen. Make erzeugt bzw. aktualisiert immer nur die Dateien, die notwendig sind.

Linkdump März 2009 – Ruby on Rails

Development

Testing

Linkdump März 2009 – Webdesign

Inspiration

CSS

Resources

Prototyping

Accessibility

IE6

Verschiedenes