Freie Software

„Frei, Robust, Ethisch und Innovativ”
„Free, Reliable, Ethical and Efficient“
„Libre, Inagotable, Bravo, Racional y Encantado“
- Akronym zu freier Software.

Links zu freier Software:
- Unfreie Software, eine Gefahr für die Demokratie?
- Perspektive 89 zu freier Software
- Fellowship of the Free Software Foundation Europe - Freie Software unterstützen.
- OpenSource Alternatives - Infos über Alternativen zu prorietären Programmen.

Ich bin seit nun 2004 glücklicher Nutzer von GNU/Linux und anderer freier Software, und die Philosophie freier Software ist für mich ein wichtiges Standbein unserer Gesellschaft.

Sie verteidigt vier grundlegende Freiheiten:

Übrigens habe ich auch ein paar Lieder über freie Software unter meinen englischen Liedern. Hört doch mal rein!

Alternative Geschäftsmodelle im Netz: Eine Million Dollar mit dem Humble Indie Bundle

Gerade hat eine Gruppe kleiner Spielehersteller durch das Humble Indie Bundle mit dem „Zahl soviel du willst“ Modell in nur einer Woche eine Million Dollar verdient – und veröffentlichen jetzt von vieren der Spiele den Quellcode als freie Software.

Sie zeigen damit deutlich, welche neuen Möglichkeiten das Internet bietet, wenn man es schafft, andere für sein Projekt zu begeistern.

Jeder Käufer konnte frei wählen, wie viel er zahlen will, von einem Cent ausgehend und nach oben offen. Außerdem konnte jeder Käufer festlegen, wie viel von dem Geld die Entwickler kriegen und wie viel an gemeinnützige Organisationen gespendet wird.

Gleichzeitig hatten sie auf ihren Seiten Echtzeitstatistiken, wie viel Geld sie bereits verdient haben, aufgeschlüsselt nach dem Durchschnittsbetrag je Nutzergruppe (Windows, MacOSX, GNU/Linux).

Und alleine die letzten 19 Stunden brachten ihnen 200,000$ – nachdem sie gesagt hatten, dass sie, wenn sie die eine Million Dollar Grenze knacken, den Quellcode von dreien der Spiele veröffentlichen würden.

Eine weitere Besonderheit, und vielleicht einer der zentralen Punkte ihres Erfolges: Sie liefen alle sowohl auf Windows als auch auf MacOSX und GNU/Linux. Und waren natürlich ohne DRM.

Meine tiefsten Glückwünsche!

Updates:

Codeswarm

Codeswarms sind eine Methode, die Entwicklung von Programmen zu visualisieren.

Genauer: Mit ihnen lassen sich commits in Quellcode-Repositories visualisieren.

Was dabei rauskommt sieht dann in etwa so aus, nur als Film:

Ein Augenblick im Mercurial Codeswarm

Ich bin ihnen inzwischen seit Monaten völlig verfallen, weil ich in einem Codeswarm nicht nur nachvollziehen, sondern sehen und fühlen kann, wie sich ein Programm entwickelt hat.

Fragen wie

  • Was ist passiert, als X in's Projekt kam?
  • Wer war wann dabei?
  • Wie aktiv war das Programm die letzten Jahre?
  • Wo wurde am meisten gearbeitet?

und viele mehr beantworten sich wie von selbst in schönen Filmen.

Aber was mir mit am Besten gefällt:

Mit Codeswarm werden Coder Rockstars.

Wenn das jetzt weit her geholt klingt, dann schau dir mal einen Codeswarm an und beobachte, wie du die Coder davor und danach siehst.

Probier' das doch mal mit den folgenden:

Um eigene codeswarms zu erstellen, schau mal auf der Video Seite von codeswarm vorbei.

Einige von meinen drehen sich um den GNU/Hurd:

Außerdem habe ich das Projekt shared_codeswarm gestartet, mit dem sich code_swarms aus verschiedenen Projekten einfach zusammenfassen lassen. Eine schöne Anwendung davon sind battle_swarms und der unregelmäßig aktualisierte Mercurial code_swarm:

Viel Spaß beim Schauen!

Jetzt bräuchte ich nur noch einen Großrechner und Subversion Zugriff auf alle freien Programme, und ich könnte einen "Free Software Liveswarm" erstellen: Einen Videofeed in dem man in Echtzeit beobachten kann, wie sich freie Software weiterentwickelt.

Ich denke, irgendwann wird es das oder etwas in der Art geben, mit dem wir zu jeder Zeit sehen, was gerade in unserem Code-Universum geschieht.

CreativeCommons Lizenzen sind riskant für echt freie Werke

Viele reden jetzt über Creative Commons, aber für die Belange freier Kultur sind sie gefährlich unsicher, wenn du kommerzielle Nutzung erlauben willst (bei den nichtkommerziellen fällt die Gefahr weg, sie bringen für freie Werke aber ganz eigene Probleme).

Die Ausnahme der Regel ist die cc-GPL. Sie ist sicher, da sie direkt die normale GPL v2 or later mit ein paar Bildern ist.

Mein Grund dafür, dass CC-Lizenzen bei mir nicht in Frage kommen ist, dass nach meinem Verständnis die einzige "Sicherung" des Quelltextes das folgende ist:

"(IV) when You Distribute or Publicly Perform the Adaptation, You may not impose any effective technological measures on the Adaptation that restrict the ability of a recipient of the Adaptation from You to exercise the rights granted to that recipient under the terms of the Applicable License."
- Das ist aus der neusten Version:
http://creativecommons.org/licenses/by-sa/3.0/legalcode

Das heißt: Ich darf nicht extra beschränken, aber wenn es Teil meiner Leistung ist, dass es als 32kB/s Radiostream kommt, muss ich auch keine bessere Version vorhalten, und Liedtexte oder ähnliches sind auch nicht enthalten, selbst wenn ich sie geändert habe.

Das heißt auch, ich kann einen cc-by-sa Text nehmen und in eine Flash Animation packen, die automatisch scrollt und ihn für jegliche Nachnutzer fast unbrauchbar macht, und ich muss den Originaltext nicht rausgeben.

Aus dem Wissenschaftsbereich: Ich kann ein LaTeX-Dokument nehmen, ändern, und es nur als PDF rausgeben (mit shapes statt Buchstaben), und damit muss ich meine Änderungen effektiv nicht mehr freigeben.

Und das ist für eine freie Lizenz inakzeptabel und zeigt für mich, dass bisher der Denkansatz dahinter wohl nicht "Freiheit" ist, sondern "möglichst leichte Anwendbarkeit, auch wenn es langfristig unsicher ist".

Daher: Finger weg von CreativeCommons Lizenzen für freie Werke.

Für freie Werke sollten nur echt freie Lizenzen genutzt werden.

Für unfreie, nur nichtkommerziell nutzbare oder vogelfreie Werke sind CC-Lizenzen sinnvoll, aber die ShareAlike Bedingung ist zu zahnlos um eine echt freie Lizensierung mit CreativeCommons Lizenzen zu ermöglichen.

Anmerkung: Wenn nur nichtkommerzielle Nutzung erlaubt wird (Creative Commons License), ist dieses Problem weniger präsent, weil damit der Anreiz, die Zielsetzung "wer mein Werk nutzt muss auch mir die Nutzung erlauben" zu umgehen deutlich schwächer wird. Dadurch ist das die einzige CC Lizenz, die ich nutze, abgesehen natürlich von CC GPL und CC LGPL.
Allerdings ist ein Werk, das nur nichtkommerzielle Nutzung erlaubt per Definition inkompatibel mit freier Software und macht auch auch sonst ein ganz eigenes Fass von Problemen auf. – Arne

Weitere Info: Warum wir für unser Rollenspiel-Regelwerk (RPG) die GPL statt den cc-Lizenzen oder der GFDL verwenden.

Emacs

Emacs ist ein freies Textbearbeitungsprogramm, das sowohl in der Konsole als auch mit grafischer Oberfläche genutzt werden kann, weitreichende Anpassung via Lisp ermöglicht1 (lisp lernen) und am Anfang der freie Software Bewegung stand (info).

Es gibt ihn für fast alle Betriebssysteme, inklusive vieler exotischer, und er ist einer von zwei Editoren (=Textverarbeitungsprogrammen), um die eine eigene (ironisch gemeinte) Religion entstanden ist2. In Aktion sieht er z.B. so aus:

Emacs mit Markdown mode

Die Zeile unten ist der Minibuffer, in dem Befehle eingegeben und Ausgaben angezeigt werden können. Das Bild habe ich aus meinem Eintrag Darum Emacs: Markdown mode übernommen.

Hier sammle ich ein paar praktische Resourcen zu Emacs (=Links und Kurznotizen).

Eine Warnung sollte ich dir allerdings nicht vorenthalten: Emacs zu verwenden beinhaltet das Risiko, dass du immer größere Teile deiner Arbeitsabläufe in ihn verlagerst. Er ist inzwischen nicht mehr nur mein Editor, sondern auch LaTeX-IDE (mit grafischer Formelvorschau), Programmierplattform, Zeitplaner (org-mode, und ich kratze erst an der Oberfläche), GnuPG-verschlüsseltes Tagebuch, Darkroom-Schreibprogramm, Musikabspieler (emms), identi.ca client und vieles mehr. In emacs zu arbeiten wird Stück für Stück immer natürlicher und irgendwann wirkt alles andere unelegant und einschränkend. Und emacs funktioniert fast überall, selbst in der Text-Konsole und auf Android-Handies.


  1. Das beinhaltet Dinge wie ein Mailprogramm oder Webbrowser, transparentes bearbeiten von verschlüsselten Dateien (wie in meinem Tagebuch), Integration von Versionsverwaltungssystemen, Hervorhebung und Vervollständigung von Quellcode und vieles mehr; alles vom Benutzer aktivierbar (teils über die zahlreichen Erweiterungen im Emacs-Wiki), wenn er es braucht, und trotzdem relativ schlank (im Vergleich zu vielen heutigen Texteditoren), 

  2. Gemeint ist die „Church of Emacs“. Der andere Editor ist vim, und was Features angeht, geben sich beide nichts. Sie haben aber völlig andere Grundannahmen, was Bedienbarkeit angeht3

  3. Der Grundunterschied ist, dass man in Emacs direkt tippen kann und durch Kurzbefehle auf die verschiedenen Aktionen zugreift (‚Strg-x Strg-s‘ speichert, ‚Strg-x Strg-c‘ beendet), während in Vim (etwas vereinfacht) mit Escape und ‚i‘ zwischen dem Befehlsmodus und dem Tippmodus gewechselt werden kann (‚i‘ bringt einen in den Eingabemodus, ‚Escape :wq‘ speichert und beendet). Dabei ergingen sich Anhänger der beiden Editoren in oft immer weiter zugespitzten Diskussionen, die zu so freundlichen Bezeichnungen wie „Escape-Meta-Alt-Control-Shift“ für Emacs und Aussagen wie „Vim hat zwei Modi: Nur piepsen oder alles zerstören“ geführt haben (was beides eine Spur Wahrheit enthält und wohl nur im Rückblick lustig ist). Welchen von beiden man verwendet ist meist Geschmackssache (ich nutze z.B. meist Emacs). Was natürlich die Benutzer nicht daran hindert, endlos über ihren Geschmack zu streiten :) 

Darum Emacs: Markdown mode

Ich könnte vieles sagen, das ich an Emacs toll finde, aber ich werde mich hier auf ein einziges Bild beschränken:

Emacs mit Markdown mode

Emacs mit Markdown Mode (und visual-line-mode); nur eine seiner kleineren Stärken, aber die, die mich heute gepackt hat.

E-Mail mit Emacs: web.de

Die Einrichtung von Emacs zum Verschicken von E-Mails hat mich etwas Zeit gekostet.

Bei web.de funktioniert das hier (EMAIL, NAME und PASSWORT ersetzen):

; email
(setq user-full-name "Arne Babenhauserheide"
       mail-from-style 'angles
       user-mail-address "EMAIL"
       mail-default-reply-to user-mail-address)
(setq user-mail-address "EMAIL")
(setq smtpmail-default-smtp-server 
       "smtp.web.de")
(setq smtpmail-local-domain nil)
; disable “we now use message mode” warning.
(setq compose-mail-user-agent-warning nil)
(setq compose-mail-user-agent-warnings nil)
(setq message-default-headers "BCC: EMAIL
")

(require 'smtpmail)

; MailMode
(setq send-mail-function 
    'smtpmail-send-it)
; MessageMode
(setq message-send-mail-function 
    'message-smtpmail-send-it)

(setq starttls-extra-arguments 
    '("--insecure" "--verbose"))
(setq smtpmail-auth-credentials 
   '(("smtp.web.de" 25 
   "NAME" "PASSWORT"))) 
(setq smtpmail-default-smtp-server 
    "smtp.web.de") 
(setq smtpmail-smtp-server "smtp.web.de") 
(setq smtpmail-smtp-service 25) 

Emacs als Tagebuch

Ich verwende nun seit einiger Zeit Emacs als Tagebuchprogramm. Mit ihm komme ich zum ersten Mal wirklich zum schreiben.

Der Aufruf bei mir ist schlicht

tagebuch

Den Grund, dass es für mich mit Emacs funktioniert, sehe ich darin, dass er mir genau das bietet, was ich brauche – und dabei verdammt schnell ist. Was ich brauche:

  • Verschlüsselung ohne Aufwand (epa-file integriert transparentes GnuPG, also wirklich sichere Verschlüsselung).

  • Sofort schreiben können (ist direkt bei der Zeile, bei der ich aufgehört habe).

  • Schnell. Ich will nicht warten müssen, bevor ich tippen kann (geht über eine eigene Initfile, die Codevervollständigung und so rauslässt).

  • Datum zum Eintrag (geht dank miniscript über „M-x datum“).

  • (Auch) Auf der (Text-)Konsole. Wenn ich am Systembasteln bin, will ich trotzdem Schreiben können.

  • Optional Versionsverwaltung (nur für backups; wenn es ein Mercurial repository gibt, speichere ich einen Schnappschuss via C-x v v).

Und wenn ich mal was wo anders nutzen will, kann ich es einfach via emacs rüberkopieren, trotz verschlüsselter Datei. Und es gubt keine temporären Dateien, die ich entschlüsselt rumliegen haben muss.

Und es passt sich der Farbgebung meiner Konsole an :)

Einrichtung

(benötigt emacs Version 23.1+)

Meine Einrichtung sieht so aus:

.babrc (alias):

alias tagebuch='/usr/bin/emacs \
-nw --no-init-file --no-site-file \
--load ~/.emacs-init-tagebuch \
~/pfad/zum/Tagebuch.txt.gpg'

Dazu habe ich die Datei ~/.emacs-init-tagebuch.

Um deinen eigenen Emacs so zu nutzen (unter GNU/Linux),

  • kopiere einfach das Alias an deine ~/.bashrc,
  • lade die ~/.emacs-init-tagebuch herunter und
  • kopiere markdown-mode.el nach ~/.emacs.d/libs/markdown-mode/markdown-mode.el.

Das Alias erklärt

alias tagebuch='/usr/bin/emacs \
-nw --no-init-file --no-site-file \
--load ~/.emacs-init-tagebuch \
~/pfad/zum/Tagebuch.txt.gpg'
  • -nw --no-init-file und --no-site file sagen: In der Konsole anzeigen und kein Standarddateien laden → deutlich schneller (Emacs kann unglaublich viel, aber einige Sachen machen es langsam; z.B. die vollständige Programmierumgebung).

  • --load ~/.emacs-init-tagebuch: Fügt genau die Fähigkeiten hinzu, die ich brauche, keine mehr, keine weniger. Details weiter unten.

  • Der Pfad ist klar. Die ~/.emacs-init-tagebuch richtet Emacs so ein, dass es jede Datei, die auf .gpg endet, transparent entschlüsselt (heißt, ich muss nur das Passwort eingeben, dann kann ich arbeiten, als wäre es nur eine normale Textdatei). Außerdem wird in Dateien mit Endung .txt.gpg Markdown-Syntax hervorgehoben und ist so schöner zu lesen und schreiben (daran habe ich mich schlicht gewöhnt und will es auch in meinem Tagebuch).

Die ~/.emacs-init-tagebuch erklärt

Die init-Datei aktiviert einige Features, die ich brauche:

Sie bindet mir den Markdown Mode ein, so dass ich Syntax-Highlighting habe.

(setq load-path (cons "~/.emacs.d/libs/markdown-mode" load-path))
(autoload 'markdown-mode "markdown-mode.el"
   "Major mode for editing Markdown files" t)

Dann aktiviert sie markdown für verschlüsselte Textdateien:

(setq auto-mode-alist
      (cons '("\\.txt\\.gpg" . markdown-mode)
    auto-mode-alist))

Dazu liefert sie schöne Zeilenumbrüche (am Wortende):

(global-visual-line-mode)

und aktiviert transparente Ver- und Entschlüsselung:

(require 'epa-file)
(epa-file-enable)

Außerdem habe ich mir eine kleine Lisp-Funktion geschrieben, die mir das Datum als Titel (zweite Ebene, H2 in HTML) in Markdown-Syntax ausgibt. Sie wird einfach mit M-x datum aufgerufen (im Code unten wird der Befehl durch das Schlüsselwort (interactive) aktiviert). Und ja, ich könnte hier alles einfügen, das ich in Lisp generieren kann. Also so gut wie alles :) (echte Programmiersprache)

(defun datum ()
  "print the current time in iso-format"
  (interactive)
  (insert (format-time-string "%Y-%m-%d %H:%M:%S") "\n-------------------\n\n"))

Abschließend legt sie fest, dass sich emacs die Zeilennummer merken soll (ich will beim nächsten Öffnen des Tagebuches wieder in der Zeile sein, in der ich aufgehört habe), dass ich keine Startinfo haben und Dateien in UTF-8 kodieren will (für Umlaute und Zeug wie ι∫→√).

(custom-set-variables
 '(current-language-environment "UTF-8")
 '(default-input-method "rfc1345")
 '(inhibit-startup-screen t)
 '(save-place t nil (saveplace)))

Damit habe ich ein Tagebuch-Programm, das alles kann, was ich brauche. Und wenn ich noch mehr brauche, kann ich das ohne Probleme später einfügen.

Viel Spaß beim Tagebuch-Schreiben mit Emacs!

Freenet

Freenet ermöglicht anonyme, unzensierbare Kommunikation.

Was du damit machen kannst

Über Freenet kannst du anonyme Webseiten (freesites) veröffentlichen, die anderen Freenet-Nutzern zugänglich sind. Du lädst sie einfach in das dezentrale p2p-Netz, und solange sich Leute dafür interessieren (also sie anschauen), bleiben sie verfügbar, egal ob dein Rechner an ist oder nicht, und niemand kann sie offline nehmen1.

Du kannst auch die vielen verfügbaren Seiten lesen, die verschiedenste Themen von Kryptographie bis Philosophie abdecken, in anonymen Foren diskutieren (Freetalk, FMS und Frost) und dir ein Pseudonym aufbauen: Leute können sicher sein, dass nur du deine Seiten und Forenbeiträge schreibst. Sie wissen nur nicht, wer du wirklich bist (Pseudonymität).

Logischerweise ist es komplett als dezentral organisiert, so dass es keine Möglichkeit der zentralen Kontrolle und keine einzelne Schwachstelle gibt. Nur so lässt sich sicherstellen, dass die Nutzer wirklich anonym sind und wirkliche Redefreiheit gewahrt bleibt.

Wie du es nutzen kannst

Lade dir einfach das Installationsprogramm herunter und starte es (Downloadseite (englisch)).

Nachdem es installiert ist und läuft, findest du eine neue Webseite unter 127.0.0.1:8888, das ist deine Freenet-Startseite.

Du hast nun zwei Möglichkeiten

Der schnelle Weg: Opennet

Du nutzt es direkt. Bereits jetzt kannst du anonyme Webseiten besuchen und veröffentlichen. Allerdings wird es anfangs etwas langsam sein. Gib ihm etwas Zeit, dann wird es schneller. In diesem Modus ist es sehr schwer herauszufinden, welche Seiten du besuchst und veröffenlichst, allerdings können Leute von außen herausfinden, dass du Freenet nutzt.

Von diesem Weg kannst du fließend zum sichereren Darknet Modus übergehen, wenn mehr und mehr deiner Freunde Freenet nutzen.

Der sicherere Weg: Darknet

Du willst noch mehr Anonymität. In dem Fall suchst du Bekannte, die auch Freenet nutzen und verbindest dich mit ihnen.

Klick dafür auf den Link Freunde auf deiner Freenet-Startseite und wähle "advanced mode". Dort findest du eine Liste deiner Freunde und ganz unten deine "Knoten-Referenz". Mit der Knoten-Referenz identifizieren sich Freenet-Programme gegenseitig, um sicherzustellen, dass der andere wirklich ein Freund ist.

Wenn du mich kennst, dann schreib mir doch eine E-Mail mit deiner Knoten-Referenz (am Besten verschlüsselt - mein öffentlicher Schlüssel) oder schreib' sie mir via Jabber o.ä..

Dann kann ich dir meine Knoten-Referenz schicken und sobald du sie hinzugefügt hast, verbinden sich unsere Freenet-Programme direkt.

Wenn du auf die Art mindestens 5 Freunde zusammen hast, kannst du auf deiner Freenet-Seite auf Konfiguration klicken und das Sicherheitslevel auf "Hoch" stellen.

Damit wird es dann von außen fast unmöglich festzustellen, dass du Freenet nutzt.

Außerdem kannst du deinen Freunden direkt in Freenet Nachrichten schicken :)

Ich würde mich freuen, dich in Freenet zu sehen (auch wenn ich dich vermutlich nicht erkennen werde :-) ).

Und wenn du mich kennst, würde dich gerne auch in Freenet zu meinen Freunden hinzuzufügen, so dass wir uns gemeinsam gegen Zensur zur Wehr setzen können (der politische Weg ist zwar ebenso wichtig, aber dafür brauchen wir unzensierbaren Informationsaustausch, sonst sind wir zu leicht auszuschalten).


  1. Um Inhalte in Freenet offline zu nehmen braucht es Maßnahmen, die einen Großteil des Internets blockieren würden. Ein nationaler Firewall wie in China reicht nicht. Das absolute Verbot verschlüsselter Übertragungen (für Privatleute) würde aktuell2 reichen, würde aber gleichzeitig den Großteil unserer Wirtschaft und Online-Kommunikation zerstören und uns wehrlos gegen Wirtschaftsspionage machen. 

  2. Um auch beim Verbot von Verschlüsselten Übertragungen verbunden zu bleiben, sind zum Beispiel Bunny-Cams angedacht: Ein süßes Häschen wird vor eine Kamera gesetzt und ins Netz gestreamt. In den Bildstörungen werden die Daten versteckt (Steganographie). 

Freenet-Project als Sicherheit für Informanten

→ Kommentar zu Journalismus: Chancen für Mistkratzer von DRadio Wissen.

Um die eigenen Informanten online wirklich zu schützen, können Journalisten mit ihnen über das Freenet-Project kommunizieren.

Dort kann niemand wissen, wer etwas bestimmtes geschrieben oder gelesen hat, aber es ist gesichert, dass die Veröffentlichende immer die gleiche ist.

Und entsprechend können Journalisten die Identität einer Informantin einmal offline prüfen und dann über Freenet in Kontakt bleiben. Die Informantin ist so selbst dann geschützt, wenn der Computer des Journalisten beschlagnahmt werden sollte.

Daher sollte Freenet-Kenntnis zum Handwerkszeug jedes Journalisten gehören.

http://freenetproject.org

Korrelation zwischen Freenet Nutzerzahlen und Google Trends zu Zensur

Ich habe eine kleine Grafik erstellt, die die Google News/Trends zu Zensur und die Zahl der Freenet-Nutzer gegenüberstellt. Das Ergebnis ist sehr aussagekräftig:

Freenet size with Google Trends

Die zwei blauen Linien sind von Google Trends, oben die Anzahl der Suchanfragen, unten die Erwähnungen in Zeitungen. Die anderen Linien stammen von Freenet Graphs mit Daten von Freenet Statistics (die beiden Links brauchen ein lokal laufendes Freenet, um zu funktionieren).

Die rote Linie oben ist die Gesamtzahl unterschiedlicher anonymer Freenet-IDs, die in 15 Tagen mehrfach gesehen wurden. Die grüne Linie sind die IDs, die mindestens einmal in 5 Tagen gesehen wurden (alle 5 Stunden wird eine Stunde lang gesucht). Die Lila Linie zeigt die Anzahl der IDs, die in 7 Tagen mehr als einmal gesehen wurden (also mehr einmal oder mehr als fünf Stunden online waren). Die blaue zeigt das gleiche für 5 Tage. Und die rote Linie ganz unten zeigt die Anzahl von IDs, die in einer Stunde gesehen wurden. Das ist also die Zahl der Nutzer, die zu jeder Zeit online sind.

Die beiden wichtigsten Punkte, die mir daran auffallen: Als Google aufgehört hat, in China zu zensieren, ist die Zahl der regelmäßigen Freenet-Nutzer sprunghaft um knapp 2000 gestiegen (von 5000 auf 7000) und als Google seine chinesische Lizenz erneuert bekommen hat, begann ein fast 2 Monate anhaltendes langsameres aber insgesamt fast genauso starkes Wachstum von etwa 7000 auf 8200 Nutzer. Dass die Gesamtzahl der Nutzer in der gleichen Zeit nur etwas stärker gestiegen ist (von etwa 20000 auf etwa 22000, bzw. von 23000 auf 25000) deutet an, dass vor allem lange laufende Knoten dazugekommen sind.

Die Daten lassen also den plausiblen Schluss zu, dass Freenet spätestens seit April 2010 für seinen eigentlichen Zweck genutzt wird: Um in repressiven Staaten der Zensur zu entgehen. Freenet ist also bereits heute ein Garant der Redefreiheit für etwa 4000 Leute. Und so wie sich die westlichen Staaten zur Zeit entwickeln, kann es gut sein, dass es bald auch in in unseren Breiten als Garant der Redefreiheit notwendig sein wird. Wikileaks wurde effektiv ohne Anklage und Prozess zensiert, und anderen könnte es sehr leicht genauso ergehen.

Neuere Daten zeigen übrigens, dass auch die Zensur von Wikileaks einen deutlichen Zustrom von Nutzern brachte:

Freenet Graphs

Immerhin gibt es die cables von Wikileaks inzwischen mindestens zweimal in Freenet :)

(der kleine Bruch in den Linien kommt übrigens nur von einem kurzzeitigen Ausfall des Statistikrechners. Freenet lief problemlos weiter)

Nachdem ich jetzt erzählt habe, was andere machen: Wie sieht es mit dir aus? Willst du mit einem eigenen Freenet-Knoten mithelfen, Zensur auszuhebeln? → http://freenetproject.org/download.html

Die Installation geht schnell und schmerzlos. Das Netz braucht allerdings ein paar Stunden, um an Geschwindigkeit zu gewinnen (dein Knoten optimiert sich, solange du ihn laufen lässt, fortwährend). Wenn du dem Netzwerk helfen willst, schau, ob du deinen Knoten durchgehend laufen lassen kannst (mindestens 16 Stunden am Tag); dann funktioniert die Optimierung besser, du hast also auch höhere Geschwindigkeiten :)

Und wenn du ein paar Freunde hast, die auch mitmachen wollen, könnt ihr euch direkt über das Darknet verbinden. Dadurch gewinnen eue Freenet-Knoten nochmal massiv an Sicherheit dazu, und wenn jeder von deinen Freunden nochmal zwei oder drei andere Freunde für Freenet gewinnen kann, habt ihr bald ein nur über Freunde verbundenes Netz, das auch von außen kaum mehr zu entdecken ist. Klickt einfach auf den „einen Freund hinzufügen“-Link in euren jeweiligen Knoten, da steht alles erklärt (der Link hier führt direkt auf euren lokalen Knoten und funktioniert nur, wenn ihr schon ein Freenet lokal am laufen habt).

Viel Spaß in einer zensurfreien Welt!

Sone: Pseudonymes Microblogging über Freenet

Sone ermöglicht identi.ca / twitter-ähnliche Kurznachrichten über Freenet. Damit bietet es vollständig anonymes und skalierendes Microbloggen. Es ist noch im Beta-Stadium, funktioniert für mich aber bereits sehr gut.

My Sone page
(click for full size)

Zum Installieren braucht ihr ein laufendes Freenet → http://freenetproject.org

Dann einfach das Plugin WoT aktivieren und Sone aus dem Freenet laden:

USK@nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI,DuQSUZiI~agF8c-6tjsFFGuZ8eICrzWCILB60nT8KKo,AQACAAE/sone/-1/sone-current.jar

Plugins eintragen: http://127.0.0.1:8888/plugins/

Dazu benötigt ihr noch eine WoT-ID. Erstellen: http://127.0.0.1:8888/WoT/OwnIdentities

Meine öffentliche ID ist:

USK@6~ZDYdvAgMoUfG6M5Kwi7SQqyS-gTcyFeaNN1Pf3FvY,OSOT4OEeg4xyYnwcGECZUX6~lnmYrZsz05Km7G7bvOQ,AQACAAE/WoT/74

(im WoT eintragen auf http://127.0.0.1:8888/WoT/KnownIdentities )

In Sone bin ich auf

http://127.0.0.1:8888/Sone/viewSone.html?sone=6~ZDYdvAgMoUfG6M5Kwi7SQqyS-gTcyFeaNN1Pf3FvY

Bei Fragen, oder sollte irgendwas nicht laufen, könnt ihr einfach hier einen Kommentar schreiben oder mich über identi.ca erreichen.

PS: Sone wird aktuell sehr schnell weiterentwickelt. Folgt einfach der „sone“ ID, um Neuigkeiten mitzubekommen → http://127.0.0.1:8888/Sone/viewSone.html?sone=nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI

PPS: Die Lizenz ist die GPLv3 und der Quellcode ist unter https://github.com/Bombe/Sone/.

Verwendet Freenet (Programm)! Es ist zensurfrei, anonym und frei lizensiert

Nachdem die Politik immer mehr auf Zensur von allem möglichen drängt, gibt es die Gefahr, dass das internet zu einem vollständig kontrollierten Raum wird und Redefreiheit völlig verschwindet, weil jeder seine Aussagen vor dem Onlinestellen selbst auf mögliche Zensurgefahr prüft.

Das hat mit der Impressumspflicht angefangen, die sagt, dass jede Seite ein Impressum tragen muss, obwohl der Betreiber für die Polizei sowieso leicht zu ermitteln ist.

Dann ging es weiter mit Abmahnwellen.

Und jetzt kommt die direkte und nicht prüfbare Zensur.

Da die Entwicklung nicht so aussieht, als könnten wir sie in den nächsten Jahren rückgängig machen, sollten wir eine Möglichkeit haben, unseren Protest gegen die Zensur in einer zensursicheren Umgebung zu organisieren.

Freenet (das Programm, nicht der Provider) bietet dabei ein sicheres Baumhaus, in dem die Redefreiheit gewahrt bleibt, denn es lebt auf den Rechnern der Beteiligten, und solange ein Beitrag Leute interessiert, kann er nicht entfernt werden. Gleichzeitig kann niemand herausfinden, von wem die Inhalte (Webseiten) geschrieben wurden und wer sie liest.

Wenn es im Darknet-Modus genutzt wird, kann außerdem niemand (ohne massiven Aufwand) herausfinden, ob jemand am Freenet teilnimmt, denn jeder kennt nur seine direkten Kontakte.

Und es ist frei lizensiert und für Windows, MacOSX und GNU/Linux verfügbar, so dass jeder sich an der Entwicklung beteiligen kann, wenn sie ihm wichtig ist (und er programmieren kann).

In anderen Ländern wurden schon zensurkritische Weblogs zensiert. Die Wahrscheinlichkeit ist recht hoch, dass das bei uns auch passiert.

(ich habe diesen Beitrag ursprünglich im Heise.de Forum geschrieben - als Kommentar zu einem Beitrag, darüber, dass Zypries das Recht auf Privatkopie in Frage stellt und rechtlich durchsetzbare "Good-Internet-Kodices" will.

Gegen DRM - Computer werden geblockt

Das eigentlich Schlimme an DRM (Digitaler Rechte Minimierung) ist nicht (nur), dass es vielleicht Inhalte geben könnte, bei denen der Künstler entscheidet, wie sie genutzt werden dürfen, sondern dass zur Umsetzung von DRM der Computer mit dem die Inhalte genutzt werden können, vollständig kontrolliert werden muss.

Und damit müssen alle Computer vollständig kontrolliert werden, damit bei ein paar Inhalten die Künstler komplett kontrollieren können, was mit ihnen passiert.

Werden sie das nämlich nicht, dann wird das DRM immer umgangen werden, und sei es durch den Anschluss eines Kassettenrekorders an den Audioausgang (auch das planen sie übrigens zu verhindern. Dann haben Computer keine normalen Audioausgänge mehr, sondern nur noch digitale Ausgänge, bei denen bei jedem Vorgang erst geprüft wird, ob das Gerät auch für die Nutzung mit diesem Rechner und diesen Inhalten zugelassen ist).

Und das Recht, darüber zu bestimmen was ich tun kann, sollte eigentlich niemand haben.

Es geht aber noch einen Schritt weiter.

Wenn nämlich DRM implementiert wird, dann darf es keine freien Geräte mehr geben, die sich auf irgendeine Art mit einem unfreien Gerät verbinden können. Das heißt: Damit DRM funktioniert muss es illegal gemacht werden, mit GNU/Linux an geschützte Medieninhalte zu kommen (weil die Lizenz unter der der größte Teil von GNU/Linux steht, die GNU Public License, es nicht erlaubt, dem Nutzer bestimmte Nutzungsmöglichkeiten der Software zu verbieten).

Also muss Freie Software von jeglicher "geschützter" Kommunikation ausgeschlossen werden, zum Beispiel indem es verboten wird, Inhalte mit anderen als den erlaubten Programmen zu öffnen.

Also dürfte ich irgendwann keine Word Dokumente mehr öffnen.

Oder könnte nicht mehr ins Internet, weil der "geschützte" Server mich nicht mehr verbinden lassen würde.

Und wenn dir das als unrealistisch erscheint, dann schau einfach, wieviele Leute trotz offensichtlicher Einschränkungen immernoch Windows verwenden.

Zur Zeit haben die großen Medienfirmen alle Macht auf ihrer Seite, um DRM zu verbreiten, und auch „schwaches DRM“ lässt sich nicht integrieren, ohne auf lange Sicht zur vollständigen Kontrolle des Rechners zu kommen (ich denke, die PR Techniken um dahin zu kommen, kannst du dir selbst vorstellen).

Kurz: Jede wie auch immer geartete DRM-Technik wird am Ende die vollständige Kontrolle von privaten Computern nach sich ziehen.

Daher muss DRM meiner Meinung nach schon jetzt gestoppt werden.

Und als Alternative zu massivem DRM Einsatz sehe ich die Kulturflatrate als effektives und faires Vergütungsmodell für Musik, die meiner Meinung nach genau das leistet, was ich von ihr erwarte. Sie sorgt dafür, dass

* Ich unkompliziert an die Musik komme, die ich will, und
* Die Künstler, die ich höre, Geld bekommen.

Und das mit minimal möglichem Aufwand, denn das Mitschneiden von Downloadzahlen ist nicht wirklich schwer (wird z.B. von BigChampagne schon gemacht:
http://www.bigchampagne.com/ ).

Die Aufgabe der Plattenfirmen wird dann wieder werden, die Spreu vom Weizen zu trennen und Stars nicht mehr zu machen, sondern zu finden. Denn dafür zahle ich auch gerne mal was (z.B. ein Abodienst, in dem man Infos zu guten Bands bekommt, von einer Privatperson betrieben, die damit ihren Lebensunterhalt verdient).

Der Weg dahin geht meiner Meinung nach übrigens auch über freie Lizenzen, weswegen auch jedes meiner Textschnipselchen auf dieser Seite unter freien Lizenzen steht.

Damit zahlen dann Musikhörer, weil sie Musik gut finden, die sie gehört haben und weil sie wollen, dass die Künstler noch mehr gute Musik produzieren.

Ja, dafür muss sich unsere Konsumkultur ändern.

Und ja, ich glaube, dass das nicht nur möglich ist, sondern auch passieren wird, wenn wir es schaffen zu vermeiden, in eine komplette Kontrollgesellschaft zu geraten, egal ob die Kontrolle vom Staat kommt oder von mächtigen Firmen (wobei mir in einer Demokratie der Staat lieber ist. Dessen Macht wird immerhin noch halbwegs durch Wahlen legitimiert).

Gentoo

Gentoo ist die GNU/Linux Distribution meiner Wahl: http://gentoo.org

Es gibt mir Flexibilität, installiert aus den Quellen und seine Paketverwaltung (Portage) baut auf Python auf.

Und es hat mich noch nie so kalt erwischt wie das ppc Kubuntu das ich meiner Frau installiert habe ("da muss man nicht dran rumbasteln"), das ich gerade nach dem zweiten dist-upgrade Komplettcrash (mit jeweils 4-6 Stunden Aufwand um es wieder zum Laufen zu bringen) durch ein Gentoo ersetze (das im Gegensatz zu meinem nicht auf Spielereien sondern auf Stabilität gebaut wird).

Automatische Aktualisierungen in Gentoo GNU/Linux

Um mein Gentoo mit minimalem Wartungsaufwand aktuell zu halten verwende ich tägliche und wöchentliche Cron-Scripte.

Das tägliche Update läuft über pkgcore, um wichtige Sicherheitsupdates zu installieren:

pmerge @glsa

Damit installiert mein Rechner die Gentoo Linux Security Advisories, d.h. die wichtigsten Sicherheitsupdates (Damit das Script läuft brauchst du pkgcore: "emerge pkgcore")

Anmerkung: Es könnte sinvoll sein, den lafilefixer zu diesen Skripten hinzuzufügen Quelle).

Das folgende Skript ist mein tägliches update (in /etc/cron.daily/update_glsa_programs.cron )

Daily Cron

#! /bin/sh

### Update the portage tree and the glsa packages via pkgcore

# spew a status message echo $(date) "start to update GLSA" >> /tmp/cron-update.log

# Sync only portage pmaint sync /usr/portage

# security relevant programs pmerge -uDN @glsa > /tmp/cron-update-pkgcore-last.log || cat \ /tmp/cron-update-pkgcore-last.log >> /tmp/cron-update.log

# And keep everything working revdep-rebuild

# Finally update all configs which can be updated automatically cfg-update -au

echo $(date) "finished updating GLSA" >> /tmp/cron-update.log

Und hier ist mein aktuelles wöchentliches Cron (in /etc/cron.weekly/update_installed_programs.cron):

## Weekly Cron

#!/bin/sh

### Update my computer using pgkcore, ### since that also works if some dependencies couldn't be resolved.

# Sync all overlays eix-sync

## First use pkgcore # security relevant programs (with build-time dependencies (-B)) pmerge -BuD @glsa

# system, world and all the rest pmerge -BuD @system pmerge -BuD @world pmerge -BuD @installed

# Then use portage for packages pkgcore misses (inlcuding overlays) # and for EMERGE_DEFAULT_OPTS="--keep-going" in make.conf emerge -uD @security emerge -uD @system emerge -uD @world emerge -uD @installed

# And keep everything working emerge @preserved-rebuild revdep-rebuild

# Finally update all configs which can be updated automatically cfg-update -au

Gentoo auf iMac Flat-Screen 1,25Ghz

Ich habe gestern die Installation von Gentoo auf dem iMac meiner Frau begonnen.

Gestern habe ich die 2008.0 Universal-CD gebrannt und den iMac damit gebootet, die letzten 15 Minuten habe ich damit zugebracht, den "Gentoo" Eintrag auf meiner Seite zu schreiben, also sind wir gerade bei etwa

T=30 Minuten

Der tar-ball ist ausgepackt. Ich formatiere die Platten nicht neu - vielleicht kann ich so die Daten aus Kubuntu erhalten (ja, ich habe ein Backup der wichtigen Daten). update: Hat geklappt. Alle Daten sind noch da.

Bisher hat alles reibungslos geklappt - das einzige Manko ist, dass in den docs noch lynx als Browser empfohlen wird, die CD aber stattdessen links2 hat. Muss ich noch einen Bugreport aufmachen.

T ~ 60 Minuten

Alle vorherige Kubuntu Software entfernt (rm -r /usr /lib /lib64 ..., /home ausgespart!), den stage tarball und portage snapshot installiert, changeroot ausgeführt, portage aktualisiert und die notwendige Konfiguration geschrieben - es wird ein Desktop Profil.

Jetzt kommt der Kernel.

T ~ 2 Stunden

Ich habe statt dem Befehl "genkernel -genzimage all" einfach "genkernel all" genutzt, weil der erste nicht funktioniert hat. Vielleicht ein Bug in der Anleitung?

Von der Stunde musste ich selbst nur etwa 10 Minuten was machen, den Rest hat der Rechner mit zweimal kompilieren des Kernels verbracht (einmal falsch wegen hoffentlich falschem Befehl).

T ~ 4 Stunden

Es war nicht mehr allzu viel zu tun. yaboot wollte mit "yaboot -b /dev/hda2" gestartet werden, weil meine apple bootpartition auf /dev/hda2 liegt.

Dann habe ich noch die locale eingestellt (/etc/locale.gen braucht "de_DE.UTF-8@euro UTF-8", damit /etc/env.d/02locales "de_DE.utf8@euro" nimmt).

Ein bisschen musste ich noch Programme bauen, aber das macht mein Rechner ohne dass ich ihn überwachen muss.

Ich muss aktuell noch beim booten "Linux video=ofonly" eingeben, wenn ich die Konsolen sehen will, weil ich noch nicht den richtigen Grafikmodus habe. Ich hoffe, ich kann das bald fixen. Bis dahin stört es nicht. Der X-Server funktioniert und kdm wird sauber angezeigt, sobald der Rechner fertig gebootet ist.

Und jetzt gerade läuft das "emerge -uDN world", um alle bisherigen Programme zu aktualisieren. Als nächstes werden dann xorg-x11 und kde-meta emerged :)

Erstmal wird es noch kde 3.5.x, weil 4.1.2 für ppc noch nicht in testing ist.

Update: Inzwischen läuft alles. Ich musste noch ein paar Programme nachinstallieren (z.B. Firefox und OpenOffice), aber damit ist die Installation abgeschlossen. Alle alten Daten und KDE Einstellungen funktionieren weiterhin, trotz der Neuinstallierung.

Die gesamte Installation hat etwa 2 Tage gedauert - davon alles bis auf die ersten 4 Stunden und etwas Konfiguration (z.B. X via xorgcfg und WLAN) reine compile-Zeit.

Was meiner Frau noch fehlte waren gimp, openoffice, mozilla-firefox und k3b. Ich brauchte noch sudo, screen, cfg-update, eix, euses, gentoolkit und portage-utils. :)

WLAN habe ich über net-wireless/b43-fwcutter , net-wireless/bcm43xx-fwcutter und wpa_supplicant zum Laufen bekommen. Glücklicherweise hatte ich von meiner alten installation noch eine Kopie der Apple WLAN Firmware auf der Platte.

Update 2009-07: xorg braucht für Tastatur und Maus jetzt x11-drivers/xf86-input-evdev.

Update: Infos zur installation von WLAN auf den alten G3 iMacs Flatscreen gibt es im Gentoo Wiki.

KDM (Login) Tastaturlayout auf Neo umstellen

Ich habe mein Haupt-Tastaturlayout auf Neo umgestellt und die Tastatur umgebaut. Da ich etwas suchen musste, bis ich herausgefunden habe, wie ich es auch in KDM das Neo-Layout nutzen kann, schreibe ich es hier.

Damit das hier funktioniert, musst du "evdev" als Tastaturtreiber nutzen.

Als ersten Schritt muss eine Tastaturlayout-Dateien in /etc/hal/fdi/policy/ sein. Wenn da keine keymapfdi Datei liegt, kopier dazu einfach den folgenden Befehl in die Konsole:

sudo cp /usr/share/hal/fdi/policy/10osvendor/10-keymap.fdi \
/etc/hal/fdi/policy/

Dann schau in die Datei /etc/hal/fdi/policy/10-keymap.fdi und änder die Zeilen

<merge key="input.xkb.layout" type="string">de</merge>
<merge key="input.xkb.variant" type="string" />

so dass sie das folgende enthalten (nur die zweite ist geändert):

<merge key="input.xkb.layout" type="string">de</merge>
<merge key="input.xkb.variant" type="string">neo</merge>

Voilà, dein X-Server fängt jetzt mit dem Neo-Layout an, und auch KDM nutzt das Neo Layout.

Ausführlichere Informationen und Hintergrund gibt es im Gentoo Leitfaden zum Xorg 1.5 update.

Effektiv heißt es: Du verwendest jetzt die Neo-Variante.

Notiz: Damit das hier funktioniert, musst du Neo bereits installiert haben. Falls du es noch nicht hast, findest du im Neo-Wiki einen Beitrag zum installieren und einrichten von Neo unter GNU/Linux.

Vorsicht: Um nicht am Ende mit nicht-eingebbaren Passwörtern dazusitzen, solltest du dir für den Anfang entweder vorher ein Neo-Layout ausdrucken (zum Beispiel den Aufsteller), oder deine Tastatur umbauen, damit du nachschauen kannst, wo die Tasten liegen, falls du es mal vergessen solltest.

GNU Hurd

"Mit dem GNU Hurd können Nutzer alles in ihrem System ändern, das niemand anderen beeinträchtigt."

Und das ist eine Möglichkeit, Freiheit in einer Gemeinschaft zu definieren: "Mach was du willst, solange du damit niemand anderem schadest."

Im Gegensatz dazu benötigen die meisten aktuellen Systeme (GNU/Linux, MacOSX, Windows, ...) root Zugang um z.B. ein neues Dateisystem zu installieren.

Bevor der Einwand kommt: Ich kenne FUSE, und ja, damit ist auch vieles möglich. Der Unterschied ist, dass FUSE auf Linux aufgesetzt ist, während translators im GNU/Hurd tief in's Design integriert sind. D.h. sie fühlen sich deutlich eleganter an. Und inzwischen können sie auch in Lisp geschrieben werden :)

Zusätzlich ermöglichen es subhurds, Prozesse in Umgebungen mit anderen Rechten zu starten, so dass z.B. gefährliche Programme abgeschottet werden können.

Und ich kann einem Programm, das bestimmte Rechte braucht, diese Rechte einfach geben während es läuft (addauth -p PID -g GRUPPE). "Verdammt, ich bin nicht in der Drucker-Gruppe" => "sudo addauth -p APP -g printer".

Ich selbst hacke nicht auf Kernelebene (eigentlich sollte hier kein "noch" rein, aber das Leben spielt manchmal seltsame Spiele ´;) ), aber ich starte meine Rechner nicht allzu gerne neu, und ich mag es, einfach ein neues Dateisystem mounten zu können, und ich mag auch einige der verrückteren Dinge, die mit dem GNU/Hurd möglich sind (Ideen für Nischen).

Was ich bisher im GNU/Hurd mache ist v.a. Zeug wie die Suche nach Nischen für den Hurd (mit vielfachem Dank an das KDE Marketing Team, von dem ich einige der Dinge gerlernt habe, die ich hier nutze! Schaut doch mal bei ihnen vorbei) und der Hurd GSoC 2008 code_swarm.

Meine Freiheit ist mir wichtig, im Leben und in Tech, und der GNU/Hurd ist ein Schritt in Richtung Freiheit.

-> GNU/Hurd

Identitätsdiebstal verhindern mit GnuPG

Entwurf eines einfachen Systems um Identitätsdiebstahl durch Übernahme von Login-Accounts zu verhindern: Lade beim Anmelden deinen öffentlichen GnuPG Schlüssel hoch. Wird dein Acount übernommen, weist du deine Identität mit einer signierten E-Mail nach.

Durch OpenID wird es Stück für Stück unnötig, sich hunderte Passwörter und Nutzernahmen zu merken.

Gleichzeitig wird aber auch ein einzelner Login immer wichtiger, und ich kann schon mit der Übernahme eines einzelnen OpenID Accounts auf hunderten anderer Seiten die Identität des bestohlenen Nutzers annehmen.

Ganz verhindern können wir die Account-Übernahme nicht, denn im allgemeinen gilt, dass die Sicherheit eines Systems nur um den Preis geringerer Bequemlichkeit gesteigert werden kann.

Also konzentrieren wir uns auf den nächsten Schritt: Der Account wurde übernommen und das Passwort geändert. Jetzt will ich dem Anbieter nachweisen, dass ich derjenige bin, der den Account erstellt hat.

Statt nun irgendein neues System aufzusetzen, nutzen wir einfach ein bekanntes und sicheres: GnuPG: Gnu Privacy Guard.

Dabei hat jeder einen privaten und einen öffentlichen Schlüssel. Der öffentliche Schlüssel kann, wie der Name schon sagt, einfach veröffentlicht werden, ohne dass die Sicherheit des Nutzers leidet. Wer den öffentlichen Schlüssel hat, kann verschlüsselte E-Mails an den Besitzer des privaten Schlüssels schicken, und er kann digitale Unterschriften des Besitzers des privaten Schlüssels prüfen.

Wenn nun mein Account gestohlen wurde, kann ich einfach eine mit meinem privaten Schlüssel unterschriebene Mail an den Seitenbetreiber schicken und sagen "mein Account ist kompromittiert. Bitte geben sie mir neue Login-Informationen." Der Seitenbetreiber prüft dann meine digitale Unterschrift mit dem öffentlichen Schlüssel, den ich hinterlegt habe. Wenn sie gültig ist, erstellt er neue Login-Infos.

Die Abfrage kann problemlos automatisiert werden, so dass nichtmal ein Mensch auf der Seite des Anbieters sitzen muss, das System also gut hochskaliert.

Da der private Schlüssel mit einem Passwort geschützt ist, gibt auch die kurzzeitige Übernahme des Computers nicht direkt die Möglichkeit, Accounts zu übernehmen.

Dazu kommt, dass GnuPG seit Jahrzehnten im Einsatz ist und von den verschiedensten Sicherheitsexperten geprüft wurde - von anonymen Hackern bis zum Bundesamt für Sicherheit in der Informationstechnik (das GnuPG sogar eine Weile lang unterstützt hat). Und auch das BKA hat letztens herausgefunden, dass GnuPG wirklich sicher sind, als sie sich an GnuPG verschlüsselten Dateien die Zähne ausgebissen haben.

Wir sollten es nutzen, um unsere elektronische Identität zu schützen.

Schau es dir doch mal an. Vielleicht hast du ja Lust das System zu erstellen :)

KDE

Verschiedenes über das K Desktop Environment, oder wir auch immer du KDE nennen willst, denn es ist inzwischen weit mehr als ein Desktop.

Meine Alternativen sind bisher:

  • KDE Development Environment
  • K(ey) Digital Environment
  • K(ey) Digital Experience

Oder in Langform:

KDE is the key to your digital experience.
KDE ist der Schlüssel zu deinem digitalen Erlebnis.

Und das passt für mich sehr gut.

Aber was ist es nun? Am einfachsten finde ich den Satz: „KDE ist das, was ich von meinem Rechner sehe, wenn ich nicht in die Konsole tauche.“

Doch wie gesagt: Es ist weit mehr als das. Das sieht der Normaluser allerdings zum Glück kaum. Die wichtigste Eigenschaft von KDE ist für mich, dass Ich damit gut arbeiten kann, und dass es das tut, was ich von ihm will.

KDE 4

Ich teste nun schon länger KDE 4, aber erst heute ist es meine Normalumgebung geworden.

Es hat noch einige Macken, aber es fühlt sich so viel angenehmer an, dass ich nicht mehr zurück zu KDE 3.5 will.

Gut, ich kann noch keine Mails abrufen, so dass ich doch dann und wann zurück müssen werde, aber ich habe vor ab jetzt alles mit KDE 4 zu machen, das damit bereits geht, denn ich fühle mich einfach wohl darin.

Ich habe es mir in meinem Gentoo installiert, sobald KDE 4.0 verfügbar war (es war fertig um 22:31:34 am 22.01.2008), und vorher häufiger die Subversion Version getestet.

Und der Unterschied von der SVN Version zum Release ist gewaltig!

Als Fazit kann ich aber einfach sagen, dass sich KDE 4.0 noch mal sehr viel glatter und angenehmer anfühlt als KDE 3.5, und das Amarok2 Preview läuft :)

Der Unterschied ist ähnlich gewaltig, wie der als ich damals von MacOS9 auf MacOSX gewechselt bin, und ich habe das Gefühl, dass es mir den Komfort wiedergibt, den ich damals aufgegeben habe, als ich von Mac weiter zu Linux gewechselt bin, weil mir Apple meine eigenen Entscheidungen zu sehr eingeschränkt hat (was ist der SInn dahinter Configdateien binär zu machen, außer den Nutzer an Änderungen zu hindern?).

Viel Spaß beim Testen, falls auch ihr einen Blick auf KDE 4 werfen wollt!

Für den Fall, dass es euch interessiert, wie es bei mirnun aussieht, habe ich euch einen Screenshot angehängt: KDE4.0 mit Systemsettings und Dolphin.

Ich habe die Fraben auf "Stone Orchid" umgestellt (etwas dunkler), weil ich damit die Fensterrahmen angenehmer finde und das Gefühl habe, besser damit arbeiten zu können.
Ansonsten ist es ein Standard KDE 4 Desktop mit Systemsettings und Dolphin.

Aber erinnert euch daran, dass die Programmierer sagen, dass es noch nicht für den Produktiveinsatz genutzt werden sollte - ich werde mich auf jeden Fall daran erinnern, wann immer Fehler auftreten. :)

Viel Spaß!

KDE 4.1

Gestern (und vorgestern) hat mein KDE 4.1 rc1 problemlos gebaut, und ich habe nun einen wundervollen Desktop vor mir, und den möchte ich euch nicht vorenthalten.

Klickt auf das Bild, um es in voller Schönheit (und Auflösung) zu sehen :)

KDE4.1 rc1 Desktop

Abgesehen von dem tollen Aussehen scheint auch so gut wie alles zu funktionieren, obwohl ich Kontact noch nicht eingerichtet habe und deswegen darüber noch nichts sagen kann (ich will KDE4 erstmal zum Arbeiten haben, und davon halten mich Mails zu effizient ab :) ).

Einziges Manko bisher: Plasma widgets aus dem Netz laden funktioniert noch nicht.

Aber der Arbeitsfluss ist klasse, und ich hätte nicht gedacht, das Folder-View so praktisch ist!

Nebenbei: Installiert in Gentoo via Portage (Overlay).

KDE 4.3.3

Ich dachte, es wäre mal wieder an der Zeit für einen aktuellen Screenshot:

KDE 4.3.3 Screenshot

Klick einfach auf das Bild, um es in voller Größe und Schönheit zu sehen :)

Lizenzausnahme: DIeses Bild steht nicht unter der GPL, da dafür meine Frau noch ihr Einverständnis geben müsste. Daher ist hier eine Version, in der das Bild von uns beiden ausgeblendet ist, so dass die Version unter der GPL verwendet werden darf:
screenshot-dragons-ghost-gpl.png

Was ich nutze:

Mit den Plasmoids:

  • Folderview / Ordneransicht
  • CWP (configurable weather plasmoid)
  • Luna (Mond im Dock)
  • Notizen
  • Umgangssprachliche Uhr / Fuzzy clock
  • Eieruhr
  • Bilderrahmen mit dem einzigen Bild meiner Frau, das ich veröffentlichen darf :)

Die Hintergrund-Farbe ist #2E3436 (aus der Oxygen Palette).

KDE 4.5 rc1 Bildschirmfoto mit Infos zum Selbermachen

Und mal wieder ist es Zeit für einen Screenshot, diesmal von KDE SC 4.5 release candidate 1:

KDE 4.5 RC1 screenshot

Klick einfach auf das Bild, um es in voller Größe und Schönheit zu sehen :)

Im Gegensatz zu meinem Screenshot von KDE 4.3.3 nutze ich diesmal fast nur Standardeinstellungen, weil ich wieder stärker sehen will, wie sich das Standard-KDE entwickelt.

„Quell“ und „Projekte“ sind Ordneransichten, in denen ich Aliase (symlinks) zu meinen meistzugegriffenen Ordnern angelegt habe. In Quell sind das Ordner zu wichtigen Kategorien meiner Ordnerstruktur (Quell ist auch mein Startordner in Dolphin) und in Projekte zu Projekten, an denen ich aktuell arbeite.

Der Hintergrund ist wieder das Drachen-Wallpaper auf Grundlage des Logos, das Trudy Wenzel für das freie 1w6-System gezeichnet hat (andere Auflösungen: 800x600 bis 2560x1600) mit #000433 als Hintergrundfarbe.

Das Bild unten rechts ist das „Bilderrahmen“ Plasmoid und stammt ursprünglich aus Battle for Wesnoth, einem freien Strategiespiel. Alle 5 Minuten wechselt das Bild zufällig zu einem der Wesnoth-Bilder, die wir für das freie 1w6-Rollenspielsystem verwenden (1w6-System).

Unten links ist das Plasmoid „Wetterbericht“, eingestellt auf ‚Mannheim, Baden-Württemberg (google)‘.

Unten rechts dann „Notizen“, und in der Mitte über der Hüfte des linken Drachen „Luna“, das mir immer die aktuelle Mondphase anzeigt (weil ich das einfach interessant und schön finde).

Schlussendlich ist noch die Kontrollleiste etwas schmaler, weil ich so stärker das Gefühl habe, dass sie eine Interaktionsstruktur ist (und ich dadurch Programmfenster nach links unten schieben kann, so dass sie von keinen anderen überlappt werden – fürs Verschieben von Dateien sehr praktisch :) ).

Die Icons sind einfach Standard-Oxygen.

Installiert ist das ganze über den kde-testing-overlay in Gentoo: emerge layman && layman -a kde && emerge @kde-4.5

Den Screenshot habe ich mit ksnapshot gemacht: Alt-F2 → ksnapshot.

Und das wars auch schon – ich hoffe, die Infos waren interessant für dich! Wenn ja, würde ich mich über einen Kommentar freuen! (und sei er nur „schönes setup“ :) ).

Viel Spaß mit KDE!

KDE in Gentoo

Hier finden sich Sachen zu KDE in Gentoo.

update: kdelibs 4.3.1 sind jetzt amd64 stable. Damit ist KDE 4.3 die Standard-KDE-Version in Gentoo.
-> http://gentoo-portage.com/kde-base/kdelibs

Inzwischen ist KDE 4.1 im portage tree.
-> http://forums.gentoo.org/viewtopic-t-708282.html

In den Gentoo Foren:

Um KDE 4.1 (und spätere via SVN) in Gentoo zu testen, nutzt einfach layman, wie im Forum Thread beschrieben.

Dann viel unmasken und keyworden...

Lizenzen

Alle Inhalte auf dieser Seite sind frei lizensiert, solange nicht explizit etwas anderes dabei steht. (Warum das wichtig ist)

Das bedeutet, dass Sie meine Werke verwenden dürfen wie Sie wollen (sogar kommerziell), solange Sie anderen (und mir) das gleiche mit all den Werken erlauben, die Sie mit Hilfe meiner Werke erschaffen und dabei auch sagen von wem die Ursprungswerke kommen.
Die Werke müssen unter der jeweiligen Lizenz bleiben.

Um sie zu nutzen, können Sie beispielsweise einfach diesen Lizenztext dazulegen (z.B. als html-Seite) und einen Link darauf setzen. Andere Möglichkeiten finden Sie weiter unten.

Genauer bedeutet das: Meine Werke dürfen unter den folgenden freien Lizenzen genutzt werden (Ausnahme: Programme sind nur unter der GPL verfügbar). Der erste Link führt jeweils auf den deutschen Lizenztext:

(ab jetzt verzichte ich hier auf das Sie).

  • GPL (en) - Vielleicht DIE freie Lizenz, auch wenn sie vorrangig für Software verwendet wird und auch dafür geschrieben und optimiert wurde (jegliche Version mit der "or later" Option).
  • GNU FDL (en) ohne invariante Abschnitte - Die verbreitetste, die auch von der Wikipedia genutzt wird, aber vor allem für Dokumentation von Software gedacht ist. (Mit der Option auf die SFDL zu wechseln, wenn sie fertig ist.)
  • Art Libre (fr) - Eine freie Lizenz die besonders für künstlerische Werke wie Geschichten, Gedichte, Lieder, Bilder, Filme und ähnliches entworfen wurde. Sie wird von der Free Software Foundation für „kreative Inhalte“ empfohlen.
  • Lizenz für freie Inhalte - Eine freie Lizenz, die zusätzlich die Senderechte regelt. Nur diese Lizenz erlaubt es, Werke in Österreich auch im Radio zu spielen.

Programme stehen dabei nur unter der GPL, sonstige Inhalte sind unter allen vier Lizenzen verfügbar.

Ich behalte mir die Relizensierung jeglicher Inhalte auf dieser Seite unter weitere Lizenzen vor. Allerdings müssen dafür in Frage kommende Lizenzen die weiter unten genannten grundlegenden 4 Freiheiten gewährleisten.

Ich nutze vier Lizenzen, weil zur Zeit im Bereich freier Kultur viel geschieht und ich will, dass so viele Leute wie möglich meine Werke nutzen können. Ich kann noch nicht vorhersehen, welche der Lizenzen sich herausbilden wird. Da jede von ihnen Stärken und Schwächen hat, kann ich aktuell keiner den Vorzug geben. Ich hoffe, dass sie sich zu einer einzigen verbinden und als eine der bisherigen Lizenzen weiterleben.

Wenn Du mit meinen Werken arbeiten willst, übernimm' bitte alle vier Lizenzen. Du musst es nicht, aber du kannst damit einen Beitrag leisten, um für die Zukunft Fragmentierung zu vermeiden.

Falls Du sie unter einer anderen freien Lizenz nutzen willst, schreib mir einfach.

Anmerkung: CC-Lizenzen sichern nicht die Freiheit, sondern nur das Recht zur Weitergabe. Sie sichern nicht, dass die Quelldateien verfügbar sind (siehe deutscher legal code), also könnte jede Person meine Textdateien in Flash-Animationen verbergen, müsste nichtmal die Arbeitsdateien freigeben, und ich könnte damit nichts mehr machen. Für mich heißt das, ich lasse wo immer möglich die Finger davon (ausführlichere Erläuterung auf Grundlage von CC 3.0).

Bedeutung der Lizenzen

Du darfst meine Werke verwenden wie du willst (sogar kommerziell), solange du anderen (und mir) das gleiche mit all den Werken erlaubst, die du mit Hilfe meiner Werke erschaffst und dabei auch sagst von wem die Ursprungswerke kommen.

Die Werke müssen unter der jeweiligen Lizenz bleiben.

Wenn du damit arbeitest, stell' die Ergebnisse bitte unter alle vier Lizenzen, wenn es dir möglich ist (ich weiß, dass ich mich wiederhole, aber der Punkt ist wichtig, und ich möchte nicht, dass er überlesen wird).

Warum Lizenzen wichtig sind

Bei Werken völlig ohne Lizenz ist unklar, wie sie genutzt werden dürfen, und in Deutschland gilt in dem Fall erstmal, dass sie nicht genutzt werden dürfen.

Daher sollte bei jedem eigenen Werk explizit gesagt werden, welche Rechte die Nutzer des Werkes haben, vor allem im Internet, wo die Rechtslage ohne explizite Lizenzen sehr viel weniger klar ist, als in der Offline-Welt.

Und bei jedem fremden Werk sollte geklärt werden, welche Rechte man damit hat, v.a. wenn man es kauft.

Warum Werke unter freien Lizenzen die einzig vertretbaren Werke sind(*)

Freie Lizenzen sorgen dafür, dass jede Person das Werk frei nutzen darf, solange sie dabei niemand anderem die Freiheit einschränkt. In der freien Softwaregemeinde ist das als die „4 Freiheiten“ bekannt. Ich habe sie für Texte übersetzt:

  • Die Freiheit das Werk zu jedem Zweck zu nutzen (Freiheit 0).
  • Die Freiheit das Werk an deine Bedürfnisse anzupassen (Freiheit 1). Zugriff auf die Quelldateien ist eine Vorbedingung dafür.
  • Die Freiheit Kopien des Werkes weiterzugeben, um Nachbarn und Freunden helfen zu können (Freiheit 2).
  • Die Freiheit das Werk zu verbessern und deine Verbesserungen zu veröffentlichen, so dass die gesamte Gemeinschaft davon profitiert (Freiheit 3). Auch hierfür ist Zugriff auf die Quelldateien eine Vorbedingung.

Jedes nicht frei lizensierte Werk nimmt dem Nutzer dieses Werkes und der Gesellschaft einen Teil dieser Freiheiten.

Während unfreie Software den Menschen die Freiheit der Nutzung ihres Computers einschränkt, nehmen ihnen unfreie Kulturelle Werke die Freiheit der Nutzung ihrer kulturellen Umgebung, und damit einen Teil der Freiheit gemeinsamen Denkens und Schaffens.

Daher gibt es auf meiner Seite seit dem Neudesign nur noch frei lizensierte Werke. Ich will nicht verantwortlich dafür sein, dass Andere Teile ihrer Freiheit aufgeben.

Viel Spaß beim freien Bearbeiten meiner Werke!

Einschränkung:
Ich bin (leider) so pragmatisch, dass ich dieses Prinzip wohl verletzen würde, wenn ich meinen Lebensunterhalt mit meinen Werken verdienen müsste und merken würde, dass es mit diesen Prinzipien nicht geht.

Daher kämpfe ich jetzt dafür, dass es irgendwann jedem möglich ist, mit freien Werken seinen Lebensunterhalt zu verdienen (zum Beispiel, weil niemand mehr unfreie Werke kauft). So kann ich es vielleicht mir, zumindest aber Anderen in der Zukunft ermöglichen, dass sie ihren Lebensunterhalt ethisch richtig verdienen. - Zwillingsstern alias Arne Babenhauserheide alias Draketo

BSD und GPL in einfachen Worten

→ Geschrieben auf heise.de.

Sowohl in BSD-Lizenzen als auch in der GPL steht „die Lizenz dieses Teils muss erhalten bleiben“.

BSD Lizenzen sagen „mach was du willst, lass nur hier den Lizenzheader drin.“

Die GPL sagt „mach was du willst, aber du musst das was du daraus machst unter die gleiche Lizenz stellen.“

(das war die Kurzform - der Rest sind rechtlich notwendige Details um das zu ermöglichen)

Wenn ich etwas veröffentliche, dann unter der GPL, denn wenn jemand von meiner Gratisarbeit profitiert, um etwas eigenes zu schaffen, dann will auch ich wieder von dem profitieren, was er daraus erstellt.

Und da potenziell hunderte von Leuten daran arbeiten (siehe Wikipedia), genügt ein "ich will dann auch" nicht, sondern muss ersetzt werden durch "jeder Nutzer hat die gleichen Rechte wie der ursprüngliche Autor".

Bei der GPL stehen sich alle Autoren auf Augenhöhe gegenüber. Jeder hat die gleichen Rechte. Das nennt sich dann „freie Werke“ – sie sind frei und sie bleiben frei.

Bei BSD Lizenzen stellen sich die Autoren als Schenker hin, die am Ende oft die Gelackmeierten sind, weil viele Leute nichts zurückgeben. Das nennt sich "vogelfreie Werke" - sie sind vogelfrei und jeder kann sie einfach nehmen.

Meine Neo-Tastatur - Mit GNU, Plussy und Infinite Hands

Dank dem GNU Head redrawn und Neo-Tastatur.de habe ich eine Tastatur, die meine Begeisterung für freie Software zeigt: Mit GNU, Plussy und Infinite Hands. Außerdem enthält sie die für wissenschaftliches Schreiben praktischen mathematischen und griechischen Zeichen, die Neo bietet. Aber genug geschrieben: Geben wir der Tastatur das Rampenlicht, das sie verdient ;-)

Tastatur

GNU

Infinite Hands

Plussy

Mercurial

Mercurial ist ein verteiltes Versionsverwaltungssystem.

Links zu Mercurial:

- Mercurial Webseite.

- bitbucket.org - Repositories einfach veröffentlichen.

Mit ihm kann man Zwischenstände von der Arbeit an Dokumenten speichern und jederzeit wieder zu ihnen zurückgehen.

Außerdem können mit Mercurial viele Leute zusammen an einem einzelnen Projekt arbeiten und ihre Arbeit automatisch zusammenführen lassen, ohne dass dafür jeder ständig mit den anderen verbunden sein muss.

Eine Analogie zum Unterschied von zentralisiertem VCS (SVN) und DVCS (Mercurial)

Bei SVN sagst du einem Beamten, was du gerne hättest und er gibt dir genau das. Bei Mercurial holst du dir einfach die ganzen Akten nach Hause und lässt dir von deinem Rechner immer raussuchen, was du grade brauchst. Dank effizienteren Algorithmen meist ohne nennenswert größener Platzverbrauch, allerdings viel schneller da du nicht mit anderen Rechnern reden musst.

Warum und wie ich es nutze

Ich verwende es inzwischen für so gut wie all meine Dokumente, und ich habe das Gefühl, dass sich dadurch mein Arbeitsfluss deutlich verbessert hat (vor allem bei meinen statischen Webseiten, aber dazu in einem anderen Artikel mehr).

Und alles was ich brauche ist ein simples
$hg init
$hg add

um mein Repository zu starten, und dann ein
$hg commit -m "Zusammenfassung meiner Änderungen in einer Zeile"

um die Änderungen zu sichern und auch jedesmal auf den Stand zurückgehen zu können.
Und diese extrem kurze Zusammenfassung zu schreiben vergegenwärtlicht mir auch nochmal, was ich eigentlich geleistet habe.

Wenn ich die Sachen Anderen geben will, gehe ich einfach auf http://bitbucket.org, erstelle da ein Projekt und mache ein
$hg push https://NUTZER:PWD@bitbucket.org/NUTZER/PROJEKT/

und schon können andere es sich holen mit
$hg clone https://bitbucket.org/NUTZER/PROJEKT/

Und sie können dann eigene Änderungen einpflegen und es wieder "push"en, wenn sie mir ihre Änderungen geben wollen. Sie können sogar die Änderungen automatisch packen und mir per Mail schicken, wenn ich ihnen keinen direkten Zugriff auf das Repository geben will:
$hg bundle PROJEKT.bundle

Es speichert automatisch die Änderungen zu meinem Repository (es sei denn, der Nutzer gibt etwas anderes an) und ich kann mir dann überlegen, ob ich die Änderungen einpflege, und auch welche ich davon übernehmen will.
Wenn ich sie einpflege, sieht mein's danach so aus, als hätte der andere Nutzer direkt bei mir gearbeitet (enthält aber weiterhin auch meine Änderungen).

Anders gesagt: Mercurial zu verwenden ist verdammt praktisch.

Kurze Einführung in Mercurial mit TortoiseHG (GNU/Linux und Windows)

Das Repository herunterladen

Wenn du TortoiseHG installiert hast, kannst du dir das Repository auf den Rechner laden, indem du in einem Ordner rechtsklickst und im Menü "TortoiseHG" die Option "Clone" wählst (Aktuell brauchst du für den Dialog noch Windows, die anderen gibt es auch in GNU/Linux).

Rechtsklick-Menü, Windows:

Rechtsklickmenü

Clone, GNU/Linux:

Klonen

In dem Dialog gibst du einfach die URL des Repositories ein, also z.B.

http://www.bitbucket.org/ArneBab/md-esw-2009

ein (das ist auch direkt die Adresse des Repositories im Netz).

Wenn du dich auf bitbucket.org anmeldest, findest du eine clone-Adresse direkt auf der Seite, über die du auch Änderungen hochladen kannst (sie enthält deinen Login - ich kann dir auf der Seite "push" Zugang geben).

Arbeitsfluss mit TortoiseHG

Du hast damit zwei grundlegende Möglichkeiten: Änderungen lokal speichern, zwischen den Änderungen vor und zurück wechseln, und Änderungen mit anderen synchronisieren (ich vermute ich erzähle dir gerade zum Gutteil reduntantes Zeug, aber ich schreibe dann doch lieber zu viel als zu wenig - wenn ich schon viel zu selten zum Schreiben komme :) ).

Um Änderungen zu speichern, kannst du einfach im Rechtsklick Menü (in dem Ordner) "HG Commit" wählen. Wenn Dateien HG noch nicht bekannt sind, musst du sie mit "Add Files" einfügen (Die Checkbox neben der Datei anklicken), damit du sie committen kannst.

Committen

Um zu früheren Änderungen zurück zu gehen, kannst du im "TortoiseHG" Menü "Checkout Revision" nutzen. In dem Dialog kannst du dann die Revision auswählen, zu der du willst, und das Icon links oben nutzen, um die Dateien im Ordner auf die Version zu bringen.

Updaten

Update-Ergebnis

Synchronisieren kannst du, indem du rechtsklickst und im Menü "TortoiseHG" den Punkt "Synchronize" wählst. In dem aufspringenden Dialog kannst du "pushen" (Updates ins Netz laden - Pfeil hoch mit Strich drüber), "pullen" (Daten auf deinen Rechner ziehen - Pfeil runter mit Strich drunter), und z.B. schauen, was du pullen würdest. Ich denke, dass den Dialog zu nutzen schnell natürlich wird.

Synchronisieren

Pull

Viel Spaß mit TortoiseHG! :) - Arne

PS: Es gibt dazu im Netz auch eine englische Einführung in TortoiseHG und einen englischen Überblick zu DVCS.

PPS: md-esw-2009 ist ein Repository in dem Baddok und ich eine gemeinsame Runde Mechanical Dream geplant haben.

PPPS: Auf meinen englischen Seiten habe ich nun auch eine englische Version dieses Artikels.

Leistungstests und Vergleiche, DVCS: Mercurial (hg) vs. Git vs. Bazaar(bzr), ...

Vergleiche | Comparisions

Es gibt inzwischen einige schöne Vergleiche von verschiedenen verteilten Versionsverwaltungssystemen im Netz, und da ich sie sowieso lese, habe ich hier jetzt eine Linkliste erstellt. There is now a nice collection of comparisions between distributed version tracking systems, and since I read them anyway, I decided to create a list of links.

Englisch

Deutsch

Warum Mercurial | Why Mercurial

Links zu Leuten, die schreiben, warum sie sich für Mercurial entscheiden haben.

Mercurial vs. Bazaar speedtest clone and log (unscientific)

I just did a test with the provided Python 2.x repos from the DVCS PEP for Python to check the performance of Bazaar and Mercurial.

(this is a slightly changed version of a mail posted to the mercurial list: http://selenic.com/pipermail/mercurial/2008-November/022199.html )

All these tests are done only once with some mostly constant load, so they don't qualitfy as scientific tests, but they give a good impressing of the differences between Bazaar (bzr) and Mercurial (hg).

Versions:
- Bazaar 1.5
- Mercurial 1.0.2

These are the ones which are marked as stable in my Gentoo tree (amd64).


First test: initial cloning from the web.

With repositories containing the same changesets (roughly, since bzr tracks dir name changes) Mercurial is about 9 times faster than Bazaar.

$ time bzr branch http://code.python.org/python/trunk
No handlers could be found for logger "bzr"
[13868] 2008-11-05 11:36:44.358 INFO: Branched 40626 revision(s).
Branched 40626 revision(s).

real 24m0.446s
user 12m47.623s
sys 0m15.842s

$ time hg clone http://code.python.org/hg/trunk/ python-hg-trunk
requesting all changes
adding changesets
adding manifests
adding file changes
added 40556 changesets with 86253 changes to 8166 files
updating working directory
3922 files updated, 0 files merged, 0 files removed, 0 files unresolved

real 2m40.237s
user 1m34.721s
sys 0m13.027s

>>> (24.0 + 0.44 / 60 ) / ( 2 + 40.237 / 60 )
8.989434400294563


And hg only uses about half as much space as bzr for the repository data (with bzr 1.5 that is - that was the stable version in my Gentoo tree as of 2008-10-31):

$ du -hs python-bzr-trunk/.bzr python-hg-trunk/.hg
214M python-bzr-trunk/.bzr
111M python-hg-trunk/.hg


Second test: a full log.

A full bzr log takes about 2.5 times as long as a full hg log in the cloned python 2.x repositories (so hg log is about 2.5 times faster than bzr log):

$ time bzr log
...
real 1m10.258s
user 0m37.236s
sys 0m2.250s

$ time hg log
...
real 0m27.886s
user 0m12.737s
sys 0m0.482s

>>> (1 + 10.258/60) / (27.886 / 60)
2.519472136555978

As I understand it, the new revlog in C should give Mercurial another nice speedup here (am I right in that?).


Third test: local clones.

A local clone in Mercurial is about 11 times faster than a local clone in bzr.

$ time bzr branch python-bzr-trunk/ python-bzr-trunk2
...
real 11m36.265s
user 8m38.400s
sys 0m11.145s

$ time hg clone python-hg-trunk python-hg-trunk2
...
real 0m59.759s
user 0m23.321s
sys 0m5.455s

 

A second run (backwards, with hot filesystem caches) gave even stronger results:
$ rm -r clone python-hg-trunk
$ time hg clone python-hg-trunk2 python-hg-trunk
real 0m38.779s
user 0m23.394s
sys 0m4.635s

With bzr I first cloned backwards to heat up the filesystem caches and then cloned again:
$ rm -r python-bzr-trunk
$ bzr branch python-bzr-trunk2 python-bzr-trunk
$ rm -r python-bzr-trunk2
$ time bzr branch python-bzr-trunk python-bzr-trunk2
...
real 12m8.374s
user 8m44.747s
sys 0m10.782s

Result: bzr is unusable for quick local clones of not-so-small projects.


Sidenote:
$ #cold copy of .hg
$ time cp -r python-hg-trunk/.hg tmp-hg
real 0m53.981s
user 0m0.077s
sys 0m3.486s

# hot copy of .bzr
$ time cp -r python-bzr-trunk/.bzr tmp-bzr
real 0m25.738s
user 0m0.012s
sys 0m1.368s

# hot copy of .hg
$ rm -r tmp-hg
$ time cp -r python-hg-trunk/.hg tmp-hg
real 0m14.702s
user 0m0.085s
sys 0m6.241s


To alleviate some doubts about system load: this is what top gave while I did the first local clone of the bzr repo:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
23202 arne 21 1 359m 255m 3412 R 70.1 12.7 1:39.33 bzr

CPU load due to bzr moved between 60% and 80% while cloning.

The general load on the system while running bzr commands was about the same as while running hg commands (I compiled stuff with niceness 11 = low priority).


Result: So Mercurial is far faster than bzr, while being a lot more newbie friendly than git (especially when the newbies are former svn users - Python currently uses svn).

Mercurial vs. Bazaar speedtest clone and log - update: hg 1.1 vs. bzr 1.10

I repeatet my test with the provided Python 2.x repos from the DVCS PEP for Python to check the performance of Bazaar and Mercurial.

All these tests are done only once with some mostly constant load, so they don't qualify as scientific tests, but they give a good impression of the differences between Bazaar (bzr) and Mercurial (hg).

Versions:
- Bazaar 1.10
- Mercurial 1.1

This comparision should be fair since Bazaar 1.10 is more recent, but Mercurial 1.1 is a major release.

You can do all these tests yourself using the script from the hg-vs-bzr-unscientific repository:

hg clone http://www.bitbucket.org/ArneBab/hg-vs-bzr-speedtest-unscientific/
cd hg-vs-bzr-unscientific
./test.sh


Results

First test: Initial cloning from the web.

With repositories containing the same changesets (roughly, since bzr tracks dir name changes and hg doesn't) Mercurial is more than 6 times as fast as Bazaar. But there might be a better way to serve bzr repositories, so this isn't perfectly decisive. But since local cloning in Mercurial is 6.7 times faster, the reason for the higher speed is likely to be in the client.

Second test: Repository size

A Mercurial repository needs about half the space of a Bazaar repository, even though they contain roughly the same data. Manual repacking in Bazaar doesn't change this size significantly (213M instead of 214M).

Third test: A full log.

Here Mercurial is about 2.2 times as fast as Bazaar: 13s instead of 30s.

Fourth test: Local clones

Local cloning in Mercurial is about 6.7 times faster than in Bazaar: about 38s instead of 4min 14s.

Fifth test: Local clones with shared repository and forced hardlinks (bzr)

As suggested in the Mercurial Mailinglist, I reran the local cloning test for Bazaar using a shared repository and forced hardlinks. With this Bazaar needed just 4.5s for a local clone, without hardlinks about 12s, so by using shared repositories the local cloning becomes quite fast in Bazaar (as long as you restrict yourself to the shared repository).

 

Test Mercurial Bazaar Result
Initial clone 1m23.699s 8m52.962s Mercurial is about 6 times faster
Repository size 111M 214M Mercurial needs roughly half the space
full log 0m12.907s 0m29.207s Mercurial is about 2.2 times faster
local clone 00m37.642s 4m14.102s Mercurial is about 6.7 times faster
local clone with hot buffers 0m32.744s 3m44.461 Mercurial is about 6.8 times faster
local clone with hot buffers and shared repository and hardlinks (bzr) 0m32.744s 0m4.546s Bazaar is about 7.2 times faster (but you must create your clones in the shared repository)


Data

This is a clean run of the script plus two reruns of the last test: hot copy of .bzr and .hg, since there was an error in the script.


$ ./test.sh
bzr --version
No handlers could be found for logger "bzr"
Bazaar (bzr) 1.10
Python interpreter: /usr/bin/python 2.5.2
Python standard library: /usr/lib64/python2.5
bzrlib: /usr/lib64/python2.5/site-packages/bzrlib
Bazaar configuration: /home/arne/.bazaar
Bazaar log file: /home/arne/.bzr.log

Copyright 2005, 2006, 2007, 2008 Canonical Ltd.
http://bazaar-vcs.org/

bzr comes with ABSOLUTELY NO WARRANTY. bzr is free software, and
you may use, modify and redistribute it under the terms of the GNU
General Public License version 2 or later.

hg --version
Mercurial Distributed SCM (version 1.1)

Copyright (C) 2005-2008 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

initial clone bzr
time bzr branch http://code.python.org/python/trunk python-bzr-trunk
No handlers could be found for logger "bzr"
[18778] 2008-12-13 12:39:35.629 INFO: Branched 40761 revision(s).
Branched 40761 revision(s).

real 8m52.962s
user 5m52.733s
sys 0m10.519s

initial clone hg
time hg clone http://code.python.org/hg/trunk/ python-hg-trunk
requesting all changes
adding changesets
adding manifests
adding file changes
added 40690 changesets with 86495 changes to 8167 files
updating working directory
3921 files updated, 0 files merged, 0 files removed, 0 files unresolved

real 1m23.699s
user 1m0.614s
sys 0m9.797s

comparing repository sizes
du -hs python-bzr-trunk/.bzr python-hg-trunk/.hg
214M python-bzr-trunk/.bzr
111M python-hg-trunk/.hg

time for a full bzr log
time bzr log >/dev/null
No handlers could be found for logger "bzr"

real 0m29.207s
user 0m28.022s
sys 0m0.378s

time for a full hg log
time hg log >/dev/null

real 0m12.907s
user 0m12.385s
sys 0m0.244s

bzr local clone
time bzr branch python-bzr-trunk/ python-bzr-trunk2
No handlers could be found for logger "bzr"
| [=============================================== ] Copying content texts 3/5^[18796] 2008-12-13 12:45:55.641 INFO: Branched 40761 revision(s).
Branched 40761 revision(s).

real 4m14.102s
user 3m23.507s
sys 0m6.860s

hg local clone
time hg clone python-hg-trunk python-hg-trunk2
updating working directory
3921 files updated, 0 files merged, 0 files removed, 0 files unresolved

real 0m37.642s
user 0m21.634s
sys 0m5.216s

clone with hot filesystem buffers, hg
rm -r python-hg-trunk
time hg clone python-hg-trunk2 python-hg-trunk
updating working directory
3921 files updated, 0 files merged, 0 files removed, 0 files unresolved

real 0m32.744s
user 0m21.820s
sys 0m4.431s

clone with hot filesystem buffers, bzr
rm -r python-bzr-trunk
bzr branch python-bzr-trunk2 python-bzr-trunk
No handlers could be found for logger "bzr"
[18802] 2008-12-13 12:51:30.879 INFO: Branched 40761 revision(s).
Branched 40761 revision(s).
rm -r python-bzr-trunk2
time bzr branch python-bzr-trunk python-bzr-trunk2
No handlers could be found for logger "bzr"
[18816] 2008-12-13 12:55:16.111 INFO: Branched 40761 revision(s).
Branched 40761 revision(s).

real 3m44.461s
user 3m22.856s
sys 0m5.401s

hot copy of .bzr
cp -r python-bzr-trunk/.bzr /tmp/tmp-bzr
rm -r tmp-bzr
rm: Entfernen von „tmp-bzr“ nicht möglich: Datei oder Verzeichnis nicht gefunden
time cp -r python-bzr-trunk/.bzr /tmp/tmp-bzr

real 0m2.979s
user 0m0.012s
sys 0m1.271s

hot copy of .hg
cp -r python-hg-trunk/.hg /tmp/tmp-hg
rm -r tmp-hg
rm: Entfernen von „tmp-hg“ nicht möglich: Datei oder Verzeichnis nicht gefunden
time cp -r python-hg-trunk/.hg /tmp/tmp-hg

real 0m8.213s
user 0m0.079s
sys 0m2.476s
rm -r python-bzr-trunk python-bzr-trunk2 python-hg-trunk python-hg-trunk2 /tmp/tmp-hg /tmp/tmp-bzr

# testing the hot copy of .bzr and .hg again, but this time really deleting /tmp/tmp-*

$ rm -r /tmp/tmp-* ; time cp -r python-hg-trunk/.hg /tmp/tmp-hg ; time cp -r python-bzr-trunk/.bzr /tmp/tmp-bzr ;

real 0m3.183s
user 0m0.079s
sys 0m2.250s

real 0m2.139s
user 0m0.014s
sys 0m1.593s

$ rm -r /tmp/tmp-* ; time cp -r python-hg-trunk/.hg /tmp/tmp-hg ; time cp -r python-bzr-trunk/.bzr /tmp/tmp-bzr ;

real 0m3.921s
user 0m0.059s
sys 0m2.691s

real 0m3.350s
user 0m0.013s
sys 0m1.632s

An additional test with a bzr optimized workflow gives the following results:


bzr optimized local cloning test using a shared repo.
time bzr init-repo bzr
No handlers could be found for logger "bzr"
Shared repository with trees (format: rich-root-pack)
Location:
shared repository: bzr

real 0m0.442s
user 0m0.328s
sys 0m0.069s
cd bzr
time bzr branch http://code.python.org/python/trunk python-bzr-trunk
No handlers could be found for logger "bzr"
[26234] 2008-12-15 11:55:14.502 INFO: Branched 40773 revision(s).
Branched 40773 revision(s).

real 10m39.557s
user 5m28.317s
sys 0m9.968s

check the size after repacking
bzr pack
No handlers could be found for logger "bzr"
rm .bzr/repositry/obsolete_packs/*
rm: Entfernen von „.bzr/repositry/obsolete_packs/*“ nicht möglich: Datei oder Verzeichnis nicht gefunden
du -hs .bzr
213M .bzr
time bzr branch python-bzr-trunk python-bzr-trunk2 --hardlink
No handlers could be found for logger "bzr"
[26879] 2008-12-15 13:07:07.532 INFO: Branched 40773 revision(s).
Branched 40773 revision(s).

real 0m4.546s
user 0m3.682s
sys 0m0.737s
cd ..
rm -r python-* /tmp/tmp-hg /tmp/tmp-bzr bzr/


Notes

To alleviate some doubts about system load, I stopped all other operations besides this test, konqueror and kmail. During the inital bzr clone top gave me the following (on my system everythign I start from an X session has niceness 1 so X doesn't bog down core processes):

top - 12:31:07 up 1 day, 2:36, 5 users, load average: 0.70, 0.99, 0.95
Tasks: 146 total, 3 running, 143 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 2.0%sy, 97.7%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 2060384k total, 1146140k used, 914244k free, 103944k buffers
Swap: 5111796k total, 4048k used, 5107748k free, 112700k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18778 arne 21 1 209m 89m 3960 R 94.7 4.4 0:14.24 bzr
15922 arne 21 1 416m 134m 42m S 3.3 6.7 4:40.40 konqueror
7591 root 21 1 651m 310m 6568 S 1.0 15.4 21:54.84 X

Bazaar once managed to get a local clone in a shared repository with forced hardlinks done in just 2.598 seconds, but every subsequent run gave results in the range of 4.3s to 4.8s, so that speed wasn't repeatable and I used a medium value for evaluation (about 4.5s).

This definitely shows the danger of unscientific tests: You don't know how unsure the results are - the difference in this case was about 50%, with the variance yet to be determined.


Result

So Mercurial is far faster than bzr when it comes to cloning (except when using bzr with a shared repository), especially for the initial clone, and a good deal faster in generating the log, while being a lot more newbie friendly than git (especially when the newbies are former svn users - Python currently uses svn).

Update: Python decided to switch to Mercurial.

Mercurial vs. Bazaar speedtest clone and log - update: 4 runs with different versions

Some folks in #mercurial @ freenode.net just repeated the tests, so we have now a bit more stable data.

The evaluation shows the following:

  1. Initial clone: hg is about 4.4 times faster (about 2 min vs. 6 to 15 min)
  2. Repository sizes: the hg repo is about 1.92 smaller (~113M vs. 215M)
  3. Time for a full log: hg is about 2.36 times faster (~21s vs. ~50s)
  4. Time for annotating Misc/NEWS: hg is 1.5 times slower than bzr.
    Without the result from bzr-1.6.1 it is 2.6 times slower (~43s vs 17s).
  5. Integrity checking: hg is by several orders of magnitude faster than bzr which just took too long - everyone stopped it after varying time (30s to 17 min), because the output spoke of hours remaining, one had an integrity error. hg needed about 1 min.
  6. Local clone: hg is 11 times faster (39s vs. 7.14 min).
    Without the 1m15 result from the high disk load host it is 16 times faster (26s).
  7. Local clone with hot filesystem: hg is 14.9 times faster (26s vs. 6.5 min).
  8. Hot copy of just .bzr / .hg: The speeds are about equal, so the difference doesn't come from raw filesystem speed (2s).
  9. Additional Bazaar tests to check shared repository cloning performance (you only get this when you use a shared repository and only clone that shared repository): With shared repository and hardlinks bzr only needs about 5 seconds for cloning.

So Mercurial is faster than Bazaar for the initial cloning and for free cloning (Bazaar takes almost 10 mintes for the initial clone while Mercurial finishes after just 2 minutes), while Bazaar is faster when cloning in a shared repository.

Also Mercurial is more than 2 times as fast as Bazaar in generating the log, while Bazaar is faster at annotating.

Additionally Mercurial consumes about half as much diskspace as Bazaar.

The biggest difference is in integrity checking, though, where all testers stopped Bazaar after up to 17min, since it didn't even check a fraction of the repository in that time. Mercurial on the other hand finished after just one minute.

Mercurial vs. GIT, Leistungstest für lokale Operationen (nicht wissenschaftlich)

English: A speed test for Mercurial and git (in german). -> Links to other tests.

Ich habe ein paar Testsskripte geschrieben, um die lokale Leistung von Mercurial und GIT vergleichen zu können.

Update: Ich habe einen neuen Test für die Nutzung in Serverprogrammen geschrieben, weil dort der Unterschied um 30-60ms wirklich etwas ausmacht: hg vs. git for server applications.

Was ich wissen wollte ist, wie schnell die Systeme jeweils bei lokalen commits sind (andere Operationen prüfe ich noch nicht), und wie sich ihre Leistung ändert, wenn ich die Anzahl der Dateien oder die Art der Änderungen variiere.

Meine Anregung dafür war der Mercurial-vs-Bazaar Test

Ich nutze selbst fast ausschließlich Mercurial, daher kann es sein, dass ich ein paar Optimierungsmöglichkeiten von git übersehen habe. Ich habe bei Mercurial allerdings auch keine genutzt.

Meine Skripte dazu sind alle in einem Mercurial repository im Netz verfügbar: - http://freehg.org/u/ArneBab/python_tests/

Die Testergebnisse genügen nicht wissenschaftlichen Standards, weil

  • Mein Rechner teilweise Last hatte, und
  • Ich keine Standardabweichung der Mittelwerte hier berechne, so dass nicht sicher ist, wie ungenau die Daten sind.

Bei den Tests war git in den meisten Fällen schneller als Mercurial, vor allem mit wenigen Dateien.

Bei vielen Dateien kam die Geschwindigkeit von Mercurial näher an git heran.

Die Tests, die ich gemacht habe sind:

  • init: Einfach nur ein Repository initialisieren
  • initial_commit: Ein Repository erstellen und die Dateien hinzufügen.
  • commit_after_append_small: Eine kurze Zeile anhängen (eine Fließkommazahl als String) und committen.
  • commit_after_append_of_many_lines: An jede Datei eine Anzahl Zeilen gleich der Anzahl von Dateien anhängen.
  • commit_after_append_of_one_long_line: An jede Datei eine Zeile anhängen, die für jede Datei 2 Fließkommazahlen enthält.

Bisher hat sich git in Tests mit 2 Dateien als um den Faktor 4 bis 5 schneller erwiesen.

Mit 200 Dateien war es noch um den Faktor 2.5 bis 4 schneller.

Gleichzeitig haben die Daten im Mercurial Ordner nur etwa halb so viel Platz eingenommen, wie in git (ohne repack).

Mit 2000 Dateien war git nur noch um den Faktor 2 bis 2,6 schneller. Das git repo hat dabei knapp 100 MiB belegt hat und das Mercurial repo nur knapp 80 MiB.

Struktur der Ergebnisse: = Für 2 Dateien =

init: - git: 0.01423661708831787 s - Mercurial: 0.13704051971435546 s

initial_commit: - git: 0.086095404624938962s - Mercurial: 0.32350056171417235 s

commit_after_append_small: - git: 0.084930634498596197 - Mercurial: 0.31660361289978028

commit_after_append_of_many_lines: - git: 0.086296844482421878 - Mercurial: 0.31294920444488528

commit_after_append_of_one_long_line: - git: 0.08749730587005615 - Mercurial: 0.32180678844451904

= Für 2000 Dateien =

[git, hg], time in seconds, mean value.

init [0.063668489456176758, 0.14365851879119873] - Factor: 2.25635192571

initial_commit [1.5152170658111572, 3.1502538919448853] - Factor: 2.07907762064

commit_after_append_small [1.4661256074905396, 3.7556029558181763] - Factor: 2.56158335727

commit_after_append_of_many_lines [16.113877415657043, 42.500172019004822] - Factor: 2.63748885031

commit_after_append_of_one_long_line [15.808947086334229, 38.482058048248291] - Factor: 2.43419487953

Anmerkungen:

  • Ein Problem von GIT ist, dass ich Repositories regelmäßig manuell packen muss. So wie ich mich kenne, würde ich das prinzipiell vergessen und mich dann wundern, warum meine Platte voll ist.

Versionsverwaltungen testen - Mercurial (hg) und Bazaar (bzr)

Ich habe gerade einen sehr schönen Vergleich der Versionsverwaltungssysteme Mercurial und Bazaar gefunden.

Für alle, die sich nicht durch einen langen Artikel wühlen wolllen:

Mercurial ist in den meisten Tests 2-5x schneller als Bazaar.

Der volle Artikel:

http://sayspy.blogspot.com/2006/11/bazaar-vs-mercurial-unscientific.html

Falls ihr gerne eine Übersetzung der kritischen Teile hättet, schreibt es bitte.

Nebenbei: Ich nutze Mercurial, um meine Programme und meine Texte (Rollenspielzeug, Lieder, Gedichte und Geschichten) zu verwalten, und es ist ein tolles Gefühl jederzeit zurückgehen oder einfach schauen zu können, was ich wann gemacht habe.

Es gibt mir ein Gefühl der Sicherheit.

Egal, was ich ändere, solange meine Platten bleiben, kann ich es jederzeit rückgängig machen.

Und eine Sicherheitskopie anlegen ist so einfach wie

hg clone . {Zielordner}

Sie zu aktualisieren und nur rüberzukopieren ist ein einfaches

hg push {Zielordner in dem eine Sicherheitskopie ist}

--- Nachtrag ---

Ich habe jetzt auch eigene Tests durchgeführt und viele andere gesammelt:

Leistungstests und Vergleiche, DVCS: Mercurial (HG), Git, Bazaar(bzr), ...

Webseiten einfacher aktualisieren mit Mercurial und lftp

-> Webseiten auf den FTP-Server laden wird einfach "hg push".

Ich schreibe seit langem eigene Webseiten, und die Notwendigkeit, sie jedesmal von Hand auf den Server hochzuladen, wenn ich etwas geändert hatte, war mir seit Jahren ein Dorn im Auge.

Vor kurzem habe ich nun angefangen, die Webseiten mit Mercurial als Versionsverwaltung zu bearbeiten, und Mercurial hat eine sehr praktische Funktion: Hooks (also Anker).

Damit kann ich einen Befehl ausführen, wenn ich in meiner Versionsverwaltung eine bestimmte Handlung ausführe.

Ich verwende sie, um meine Webseiten direkt auf den FTP-Server zu kopieren, sobald ich Änderungen in Mercurial "push"e.

Das heißt, sobald ich eine Webseite so weit aktualisiert habe, dass ich sie veröffentlichen will, gehe ich nur kurz in die Konsole und tippe

hg push

und schon landet meine Webseite automatisch aktualisiert auf meinem FTP-Server.

Und wenn ich nichts geändert habe, merkt Mercurial das und ruft den FTP nichtmal auf.

Damit es auch bei euch funktioniert, braucht ihr nur Mercurial und lftp. Ich bin mir sicher, es geht auch ohne lftp, aber damit geht es bei mir gut, und es war schnell installiert. Warum sollte ich mir die Arbeit machen, wenn es andere schon für mich gemacht haben?

-> Mercurial: http://www.selenic.com/mercurial/
-> lftp: http://linux.maruhn.com/sec/lftp.html

Danach müsst ihr nur noch das folgende in hgrc im Repository der Webseite eintragen (in ".hg/hgrc" - Zeilen, die mit "#" anfangen, sind Kommentare):

default-push müsst ihr noch für euch anpassen. Bei mir nimmt es mein Mercurial repo auf freehg.org

------ ------ Datei ------ ------
[paths]
# default-push = http://USER:PASSWORD@freehg.org/u/ArneBab/erynnia/

[hooks]
# Update my website automatically when I push the repo.
# Explanations: lftp -c 'COMMAND'
# COMMAND:
# open CMD -u USER,PASSWORD FTP_SERVER
# CMD:
# -R: Reverse -> local_source remote_source
# -X GLOB: Glob: Shell-style -< exclude the .hg dir

outgoing = lftp -c 'open -e "mirror -R -X .hg/ ABSOLUTER_PFAD_LOKAL RELATIVER_PFAD_FTP" -u USER,PASS ftp://FTP_SERVER '

------ ------ /Datei ------ ------

Und schon ist es nur noch "hg push", um die Webseiten zu aktualisieren.

Und es wird nur hochgeladen, was sich geändert hat (dank lftp).

Effektiv ist das ein "push content to FTP" mit Mercurial.

Viel Spaß!

PS: Wenn du Webseiten mit noch weniger Aufwand basteln willst, kannst du deine Webseiten auch mit pyMarkdown_Minisite schreiben, einem Projekt, das ich gestartet habe, weil ich nicht alles in HTML kodieren und trotzdem einfache und schön aussehende Webseiten haben wollte. Die Technik in diesem Artikel nutze ich dabei zum automatischen hochladen der Seiten.

Peinliche Situation: „Warum ist der Rechner so lahm!?!“

Eine wirklich wirklich peinliche Situation…lies’ selbst:

„Verdammt, warum ist das so langsam? habe ich irgendwo im Code was zerschossen?“

(suchen, suchen, 
 am Kopf kratzen, 
 weitersuchen) 

„Selbst das Bauen dauert ewig. Läuft da gerade ein anderer teurer Prozess?“

(`top`) 

„Hm, eigentlich alles in Ordnung. Moment: Java?!? Warum läuft auf dem Unirechner ein freenet??? Klar ist der langsam! Ich brauche jedes bisschen Ram für die Simulation!“

(`pkill java`) 

„Hm, ist immernoch nicht schneller…“

„…“

„Arg!“

(`hostname`) 

„Verdammt!“

(`ssh …`; nochmal…) 

Wer das nicht kennt, war noch nicht via SSH auf einem viel schnelleren Rechner und hat dabei irgendwann vergessen, auf seinen Rechnernamen zu achten :)

*PS: Die Daten synchronisiere ich via Mercurial, so dass auch die Daten gleich sind :)

Python

Ich fange gerade an, Python zu lernen.

Hier finden sich meine Erfahrungen mit Python, und die Programme, die ich damit schreibe.

Ich versuche meine Texte allgemeinverständlich zu schreiben und meinen Code sauber zu kommentieren und hoffe, dass sie für dich damit nützlich sind.

Und wenn du schon python3 installiert hast, probier doch mal das hier:

python3 -c "import antigravity;print(antigravity.__doc__)"

...dazu hätte ich gerne docs ;)

Blob Schwarm

Ich habe einen kleines Programm geschrieben, das einen interagierenden Schwarm von Blobs zeigt.

Jeder der Blobs sucht sich am Anfang einen Partner und nähert sich ihm.

Wenn die beiden Partner sich zu nahe kommen, flieht einer von ihnen und sucht sich einen neuen Partner, dem er sich wieder annähert, bis er ihm zu nahe kommt.

Durch diese brechenden Zweierbeziehungen bleiben die Blobs zusammen, das heißt es entsteht ein Schwarmverhalten, obwohl jeder Blob nur an seinen aktuellen oder nächsten Partner denkt.

Das ganze ist in Python und pyglet (GUI) implementiert. Die einzige Abhängigkeit ist Python 2.5.

Wenn du es anschauen willst, lade dir einfach den Blob Schwarm herunter, entpacke sie und klick in dem Ordner die Datei blob_swarm.pyw an.

Alles andere sollte von selbst gehen.

Viel Spaß!

Blob Valentine

Ein kleines Geschenk, das ich meiner Frau zum (bzw. am) Valentinstag 2008 geschrieben habe.

In seiner Gänze kann es allerdings in diesem Screenshot nicht genossen werden. Um das ganze animiert zu haben, musst du schon das Programm runterladen :) (es braucht nur Python (>=2.5) ).

Blob Valentine

-> Blob Valentine 0.3 herunterladen

Essenzielle Infos zu Python (mMn)

Hier führe ich Links und Texte, die meiner Meinung nach (mMn) essenziell für Python-Programmierer sind.

Die Liste wird sich wohl langsam erweitern.

Allgemein ist der Link zu den python Tools im SVN wichtig. Er enthält so interessante Dinge wie pygettext.py (das ich vorher stundenlang gesucht habe)...

Angefangen mit Übersetzung (l10n) und Internationalisierung (i18n), vll. irgendwann auch Multinationalisierung (m17n).

Geschwindigkeitstest - eine Liste summieren, selbstgeschrieben oder mit sum()

Hier teste ich kurz, wie lange ein selbstgeschriebenes Programm zum summieren einer Liste von Zahlen braucht und vergleiche sie mit der mitgelieferten Funktion sum().

Die Funktionen, die ich nutze sind:

def summieren(liste): 
	"""Summiere alle Zahlen der Liste manuell."""
	# erst brauchen wir einen Zähler, 
	# auf den wir alle Zahlen aufsummieren.
	gesamt = 0
	# Dann summieren wir 
	# alle Zahlen der Liste zu dem Zähler. 
	for x in liste: 
		# Das heißt, wir erhöhen ihn
		# für jede Zahl in der Liste um die Zahl. 
		gesamt += x
	# und geben ihn dann zurück. 
	return gesamt

und

def summieren(liste): 
	"""Summiere alle Zahlen der Liste mit sum()."""
	return sum(liste) 

Die benötigte Zeit teste ich, indem ich die Funtion in einem doctest jeweils 100001 mal ablaufen lasse und prüfe, wie lange python braucht, um das Skript zu auszuführen.

Die vollständigen Quelltexte habe ich an die Seite angehängt.

Die Aufrufe sind damit:
time python summieren_selbst.py # Selbstgeschriebener Code
time python summieren_sum.py # Eingebaute Funktion

Und ich erhalte die Ergebnisse:

$ time python summieren_selbst.py

real 0m7.536s
user 0m7.430s
sys 0m0.030s

$ time python summieren_sum.py

real 0m4.362s
user 0m4.260s
sys 0m0.070s

Damit braucht meine selbstgeschriebene Summierfunktion etwa 74% länger als die eingebaute.

Fazit: Ich konnte mir bestätigen, dass es besser ist, die eingebaute Funktion zu nutzen, statt sie selbst zu schreiben. Der eingebaute Code ist effizienter.

Geschwindigkeitstest - zwei Arten des for loops über tuples

Ich habe getestet, ob es einen Geschwindigkeitsunterschied zwischen zwei Arten des for loops über eine Liste von tuples gibt:

liste_von_tuples = [(1, 2), (3, 4), (5, 6)]

Es gibt 100.000 tuple, und jeder tuple enthält 2 Zufallszahlen.

Art 1:

for i in liste_von_tuples: 
   res.append(i[1])

Art 2:

for i, j in liste_von_tuples: 
   res.append(j)

Ich hatte erwartet, dass die zweite Art schneller ist, da bei Art 1 eine Zuweisungsoperation von zwei Werten und danach eine Auswahloperation und eine Zuweisungsoperation nötig sind, während bei Art 2 die Auswahloperation wegfällt.

Der Test bestätigte meine Ansicht.

Art 1 braucht bei der Liste mit 100.000 Tuples von je 2 Zufallszahlen zwischen 4% und 12% länger.

Fazit: Bei for loops über tuple, sollte Art 2 verwendet werden:

for i, j in liste_von_tuples: 
   res.append(j)

Die verwendete und ausführlich kommentierte Testdatei ist angehängt.

Anmerkung: Meine Python Tests können jetzt auch mit Mercurial heruntergeladen werden: http://bitbucket.org/ArneBab/python_tests/

Ideen und Patches wären cool :)

Hallo Welt! (PyQt)

Ich habe mein erstes Programm mit PyQt erstellt.

In guter Programmier-Tradition heißt es "Hallo Welt!", und zeigt einfach "Hallo Welt!" an.

Ich habe es allerdings recht ausführlich kommentiert, so dass ich denke, dass es PyQt-Neulingen ein paar interessante Einzelheiten zeigen und Programmier- und Python-Neulingen ein paar einfache erste Einsichten geben kann.

Ich habe es angehängt, stelle den Code aber auch diekt auf diese Seite, denn Python Code ist schön genug, dass ich ihn offen auf die Webseite stellen kann.

-----

#!/bin/env python
# encoding: utf-8

#######################################################
#                                                     #
# Hallo Welt!                                         #
# - Mein Erstes PyQt-Programm mit Kommentaren         #
#                                                     #
#   Copyright (C) 2007, Arne Babenhauserheide, GPL    #
#                                                     #
#   This program is free software; you can            #
# redistribute it and/or modify it under the terms of #
# the GNU General Public License as published by the  #
# Free Software Foundation; either version 2 of the   #
# License, or (at your option) any later version.     #
#                                                     #
# This program is distributed in the hope that it     #
# will be useful, but WITHOUT ANY WARRANTY; without   #
# even the implied warranty of MERCHANTABILITY or     #
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      #
# General Public License for more details.            #
#                                                     #
# You should have received a copy of the GNU General  #
# Public License along with this program; if not,     #
# write to the Free Software Foundation, Inc., 51     #
# Franklin Street, Fifth Floor, Boston, MA 02110-1301 #
# USA.                                                #
#                                                     #
#######################################################


# Erst holen wir das System-Framework. "sys"
# Qt Programme brauchen von ihm die 
# Kommandozeilenparameter. 

import sys

# Dann die benötigten Qt-Klassen. 
# Erstens das grundlegende Widget für Programme
# QApplication

from qt import QApplication

# und Zweitens einen Knopf, den wir beschriften wollen
# QPushButton

from qt import QPushButton

# und dann noch Signal und Slot, 
# damit ein Druck auf den Knopf
# das Programm beenden kann. 

from qt import SIGNAL, SLOT

# Jetzt können wir uns das Programm app definieren 
# und ihm die Kommandozeilenparameter übergeben: 

app=QApplication(sys.argv)

# Der Knopf ist ähnlich schnell geschrieben. 
# Er erhält den Text "Hallo Welt!\nIch kann 
# (ein bisschen) PyQt!"
# Das \n erzeugt einen Zeilenumbruch. 
# Einfallsreicherweise nennen wir ihn "button". 

button=QPushButton("Hallo Welt!\nIch kann (ein bisschen) PyQt!", None)
# button=QPushButton(u"Hallo traumrose!\nIch liebe Dich!\nKüsst du mich?", None)

# Jetzt machen wir ihn zum Haupt-Widget 
# des Programmes "app", 
# so dass er auf der obersten Ebene liegt: 

app.setMainWidget(button)

# Dann sagen wir ihm, dass er angezeigt werden soll. 

button.show()

# Kurz vor dem Abschluss fügen wir noch 
# als kleine Spielerei 
# etwas Interaktivität hinzu: 
# Das Programm soll sich beenden, 
# wenn der Knopf gedrückt wird. 

# Dafür verbinden wir das Signal "pressed()" 
# des Knopfes "button" 
# mit dem Slot "quit()" des Programmes app. 

app.connect(button, SIGNAL("pressed()"), 
		app, SLOT("quit()"))

# Als letztes führen wir das GUI-Programm aus. 
# Erst hier wird der Knopf wirklich sichtbar. 

app.exec_loop()

# Um das zu testen kannst du das Programm einfach 
# Schritt für Schritt in der Python-Shell ausführen. 

# Das beendet mein erste Programm. 
# Ich hoffe, Du hattest Spaß beim Lesen!

Python Speicherverwaltung

Ich habe einen kleinen Test gemacht, um zu schauen, wie die Speicherverwaltung von Python funktioniert.

Dafür habe ich eine Klasse erzeugt, die eine extrem lange Liste als Attribut hatte, so dass viel Ram verbraucht wurde.

Dann habe ich mehrfach eine Instanz dieser Klasse der gleichen Variable zugewiesen.

Das Ergebnis war, dass höchstens der doppelte Speicherbedarf einer einzelnen Instanz verbraucht wurde.

Außerdem habe ich herausgefunden, dass ein dict mit 3 Millionen unterschiedlichen Schlüsseln, die auf das gleiche Objekt zeigen (None), etwa doppelt so viel Ram braucht wie eine Liste, die diese Schlüssel als Werte hat.

Das Skript zum Testen habe ich angehängt und poste es auch nochmal hier.

Viel Spaß beim selbst mit Python spielen :)

#!/usr/bin/env python
# encoding: utf-8

"""This file tests the memory purging of python by creating an instance of a
class over and over again.

It shows, that the instance is created at only one of two places over and over
again, so the maximum additional memory consumed when replacing an
instance is the size of the instance 

The reason seems to be that the instance is first created and then assigned
to the variable. Only after that, the previous object gets deleted. 

This seems easy to understand, because this behaviour is necessary to allow
for recursive functions where the new value of the variable depends on its
previous value. 

"""

# We want random, so that no optimizing of same objects can be done. 

from random import random


# Now we create a memory hungry class. 

class MemoryHungry(object): 
    """MemoryHungry is a class which just has many attributes which consume 
memory.

For me one instance of MemoryHungry takes about 140Mib with 
number_of_atts=3,000,000 - bab.

When I use a dict where I assign keys with random names to the value None 
(all the same object), this takes about 250MiB per instance. - bab
"""
    def __init__(self, number_of_atts=3000000, mode="list"): 
        if mode == "list": 
            self.liste = [] #: list of random numbers
        elif mode == "dict": 
            self.liste = {} #: dict with random numbers as keys

        # We add random numbers to teh list to make sure, that no memory 
        # usage can be optimized by grouping same objects or similar. 
        for i in range(number_of_atts): 
            self.blah = random() #: temporary random number
            # append self.blah to the list attribute of the class, so it consumes 
            # memory (as object of the list reassigning self.blah doesn't delete the 
            # value/instance of float): 
            if mode == "list": 
                self.liste.append(self.blah)
            if mode == "dict": 
                self.liste[self.blah] = None 
                # None is only one object, so what takes space here are the keys.


# Also we create a class thirsty, which creates a float with the same content 
# over and over again. 

class MemoryThirsty(object): 
    """MemoryThirsty is a class which just has many attributes which consume 
memory.

For me one instance of MemoryThirsty only takes about 70Mib with 
number_of_atts=3,000,000, which is half the amount taken by the same 
number of random numbers -bab.
"""
    def __init__(self, number_of_atts=3000000): 
        self.liste = [] #: List of random numbers

        # We add random numbers to the list to make sure, that no memory 
        # usage can be optimized by grouping same objects or similar. 
        for i in range(number_of_atts): 
            self.blah = 0.111111111111111111111111111111111 #: just a floating point number
            # append self.blah to the list attribute of the class, so it consumes 
            # memory (as object of the list reassigning self.blah doesn't delete the 
            # value/instance of float): 
            self.liste.append(self.blah)



### Self-Test ###

if __name__ == "__main__": 
    # Create a MemoryHungry instance and give it to a variable over and over again.
    print "hunger"
    for i in range(10): 
        # assign an instance of MemoryHungry to the variable hunger
        hunger = MemoryHungry(mode="dict")
        # And print the instance. 
	print hunger, i
        pass
    print "hunger done"
    del hunger
    print "thirst"
    for i in range(10): 
        # assign an instance of MemoryHungry to the variable hunger
        thirsty = MemoryThirsty()
        # And print the instance. 
	print thirsty, i
    del thirsty
    # We're done. Say so. 
    print "done"

Spiele programmieren (Quellen)

Das hier ist eine kleine Auswahl an Quellen, um eigene Spiele zu programmieren. Sie ist nicht vollständig, sollte aber ausreichen, um direkt anfangen zu können. Sie enthält nur freie Programme.

Wenn du C++ programmieren kannst

Wenn du Python programmieren kannst

Wenn du nicht programmieren kannst

  1. Lies "Hello World" oder "Thinking like a Python Programmer": http://www.manning.com/sande/ , http://greenteapress.com/thinkpython/thinkCSpy/
    (Thinking like a Python Programmer gibt es auch auf Deutsch:
    http://ada.rg16.asn-wien.ac.at/~python/how2think/ )
    Damit hast du sehr schnell die Grundkenntnisse, die du für den 2. Schritt brauchst:

  2. Nimm Blender: http://www.blender.org/education-help/tutorials/#c836

Alternativ kannst du jetzt auch die Python Bibliotheken nutzen.

Spielereien und Problemlösungen

Hier sammle ich Spielereien und Lösungen für die verschiedensten Probleme, denen ich im Lauf meiner Nutzung von freier Software (besonders von KDE) begegnet bin.

Alsa-Gerät in amarok einrichten

Um in Amarok ein Hauptgerät einzurichten, muss es einfach in Einstellungen -> Audio Ausgabe eigetragen werden.

Damit das geht muss das Ausgabe-Modul auf Alsa gestellt und die Änderung angewendet werden.

Ein Eintrag für Soundkarte 1 (also die zweite Soundkarte, da die Liste bei 0 anfängt) sieht im einfachsten Fall so aus:

hw:1

Komplexere Konfigurationen können in einer Mail auf den kde mailinglisten nachgelesen werden:

http://mail.kde.org/pipermail/amarok/2006-October/001619.html

Standardmäßig enthalten die Boxen:
Mono: default
Stereo: default
4 Channel: plug:surround40:0
6 Channel: plug:surround51:0

Die zweite Soundkarte könnte auch mit "plughw:1,0" unter Stereo angesprochen werden.

Ich hoffe, es hilft dir!

(und erspart dir die Stunden an Zeit und Nerven, die ich reingesteckt habe, bis ich die einfache Lösung gefunden hatte. Das Internet ist toll, wenn man weiß, nach was man suchen muss :) ... in meinem Fall: google "amarok alsa device" :) )

ARD muss löschen ⇒ Alle Rezepte runterladen

Nachdem nun die ARD ihre Artikel löschen muss und bereits 80% der Rezepte gelöscht wurden, speichere ich jetzt alle ihre Rezepte auf meinem eigenen Rechner.

Da ich das mit den anderen bisher nicht gemacht habe, nutze ich wget, um das für die noch existierenden nachzuholen. Ich vermute, dass du das auch machen willst, so dass dir die Rezepte, für die du GEZ gezahlt hast, nicht gestohlen werden können.

Deshalb ist hier mein wget-Aufruf:

Einfach in eine shell kopieren (du brauchst dafür wget).

wget -mkE --no-parent http://www.swr.de/buffet/guten-appetit/

Fast das gleiche funktioniert auch bei anderen Seiten, die sie offline nehmen müssen.

Wenn du die Seite nicht vollständig willst, sondern lieber die Druckversion als PDF, kannst du auch etwa 10 PDFs auf der Download-Seite des Rezept-Archivs runterladen.

Aber beeil dich, du weißt nicht, wann sie „dank“ unserer Landespolitiker auch die löschen müssen…

wget -rl1 -kE -A pdf http://www.swr.de/buffet/guten-appetit/-/id=257024/nid=257024/did=307880/xlslkj/index.html

babtools - bashrc

Ich lege mir seit Jahren in meiner bashrc aliase für komplexere Befehle an, und da ich denke, dass einige davon auch anderen Leuten nützlich sein könnten, habe ich mich entschieden meine bashrc zu veröffentlichen.

Vorher habe ich sie etwas aufgeräumt, damit sie auch lesbar ist, wenn man sie nicht selbst geschrieben hat :)

Wenn ihr Tipps und Ideen dafür habt, schreibt sie einfach in's Kommentarfeld, dafür ist das da :)

Die bashrc ist auch im Anhang zum herunterladen.

====== bashrc ======

# /etc/skel/.bashrc:

# This file is sourced by all *interactive* bash shells on startup. This
# file *should generate no output* or it will break the scp and rcp commands.

# This file is licensed under the LGPLv3 or higher.
# Copyright for the babtools section: © 2007 Arne Babenhauserheide

# colors for ls, etc.
eval `dircolors -b /etc/DIR_COLORS`

alias d="ls --color"
alias ls="ls --color=auto"
alias ll="ls --color -l"
alias grep="grep --color=auto"
alias opencd='eject cdrom0'
alias closecd='eject -t cdrom0'
alias startwmiix='WINDOWMANAGER=wmii startx -- vt8 :1 --nolisten tcp'
#alias emerge='emerge --nospinner --tree '

#### babtools - Miniskripte von Arne Babenhauserheide ####

alias babkernel='cp -v /usr/src/.config-babkernel /usr/src/linux/.config; LC_ALL=C nice genkernel --oldconfig --menuconfig --save-config --evms2 --bootloader=grub all && cp /usr/src/linux/.config /usr/src/.config-babkernel; '

alias babstartvnc='ps wwaux | grep auth | grep A: | sed s/root.*\\/var/\\/var/ | xargs x11vnc -auth'

alias babvncviewer='vncviewer -compresslevel 1 127.0.0.1'

alias babsync='nice layman -S; nice eix-sync ; emerge --regen'

alias babchroot32='xhost local:localhost ; linux32 chroot /mnt/gentoo32 /bin/bash; . /etc/profile ; env-update '

alias babquietportage='vim /usr/lib/portage/bin/emake'

alias babquickpkg_kde='eix -IS kde | grep "\[I\]" | sed "s/ \?\[[I0-9]\] \?//g" | xargs quickpkg'

alias babworldremerge='emerge -e system || until emerge --resume --skipfirst; do emerge -pq --resume >> /home/arne/emerge-remerge-fehler; nice rm -r /var/tmp/portage/* ; emerge --resume --skipfirst; done; emerge -e system || until emerge --resume --skipfirst; do emerge -pq --resume >> /home/arne/emerge-remerge-fehler; nice rm -r /var/tmp/portage/* ; emerge --resume --skipfirst; done; emerge -e world || until emerge --resume --skipfirst; do emerge -pq --resume >> /home/arne/emerge-remerge-fehler; nice rm -r /var/tmp/portage/* ; emerge --resume --skipfirst; done; emerge -e world || until emerge --resume --skipfirst; do emerge -pq --resume >> /home/arne/emerge-remerge-fehler; nice rm -r /var/tmp/portage/* ; emerge --resume --skipfirst; done;'

alias babworldupdate='babsync; emerge -utDN world || until emerge --resume --skipfirst; do date >> /home/arne/emerge-update-fehler; emerge -pq --resume >> /home/arne/emerge-update-fehler; emerge --resume --skipfirst; done '

alias babdate='ntpdate -u de.pool.ntp.org'

alias babmencode='mencoder -o Titel1.avi -oac copy -ovc lavc -lavcopts vcodec=mpeg4:mbd=1:vbitrate=1800:aspect=16/9'

alias babkde4merge='layman -s kde; cat /etc/portage/package.keywords/kde4 | sed s/^\#.*// | sed s/\\*\\*// | sed s/.*kdenetwork.*// | sed s/.*kde-base\\/kde*// | xargs emerge -tDN --oneshot || until emerge --resume --skipfirst; do date >> /home/arne/emerge-kde4-fehler ; emerge -pt --resume >> /home/arne/emerge-kde4-fehler; emerge --resume --skipfirst; done; rm /etc/env.d/44*; env-update;. /etc/profile '

alias babdep_rebuild='nice revdep-rebuild || until emerge --resume --skipfirst; do date >> /home/arne/emerge-kde4-fehler ; emerge -pq --resume >> /home/arne/emerge-update-fehler; nice rm -r /var/distfiles/* ; done'

alias babtar_wolshin='cd ~/Quell/eigenes/Uni/Theoretische\ Physik/TheoPhys2\ \(Elektrodynamik\)/Skript/Wolschin-Skript/; tar -czf theo2-skript-2007-src.tar.gz 2007*.tex stuff.tex skript.tex GPL.txt *.png *.svg pngtops.sh'

alias babjectpod='eject /dev/disk/by-label/Klangfeuer'

alias babdep-rebuild-verbose='revdep-rebuild; until emerge --resume --skipfirst >> /home/arne/emerge-revdep-rebuild; do date >> /home/arne/emerge-revdep-rebuild-fehler ; cat /home/arne/emerge-revdep-rebuild >> /home/arne/emerge-revdep-rebuild-fehler; emerge --resume >> /home/arne/emerge-revdep-rebuild || cat /home/arne/emerge-revdep-rebuild >> /home/arne/emerge-revdep-rebuild-fehler; done;'

#### /babtools ####

# Esperanto - Spanisch - Deutsch - Englisch

# export LANG=eo:es:de:en

# emerge über screen
# alias scremerge="sudo screen emerge --nospinner"

# Change the window title of X terminals
case $TERM in
xterm*|rxvt|Eterm|eterm)
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\007"'
;;
screen)
PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\033\\"'
;;
esac

##uncomment the following to activate bash-completion:
[ -f /etc/profile.d/bash-completion ] && source /etc/profile.d/bash-completion

export PATH="/home/arne/bin:/usr/local/bin:$PATH"
# Firewire-Platte mounten:

# adds unicode support

#if [ $TERM = "linux" ]
#then
# /usr/bin/unicode_start
#fi

# This line was appended by KDE
# Make sure our customised gtkrc file is loaded.
export GTK2_RC_FILES=$HOME/.gtkrc-2.0

# D-Bus für KDE 4

if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
eval `dbus-launch --sh-syntax --exit-with-session`
fi

====== /bashrc ======

Endlich frei! - Freier radeonhd Treiber für meine ATI Karte

Ich habe heute mein X auf den freien radeonhd treiber umgestellt, und damit bin ich nun endlich wirklich frei!

Das muss natürlich heißen: Mein Computer nutzt nun nur noch freie Software, nachdem ich endlich die unfreien Graphikkartentreiber rausschmeißen konnte.

Ich hatte leider eine ATI X1300 Karte, die vom alten freien Radeon Treiber nicht unterstützt war.

Update: Der alte freie Radeon treiber unterstützt nun meine Karte in der testing version. Da er aktuell besser Beschleunigung bietet nutze ich zur Zeit also radeon statt radeonhd, aber radeonhd hat dafür den Weg geebnet.

Der neue RadeonHD Treiber unterstützt nun meine Karte, und ich bin glücklich endlich von dem unfreien Treiber weggekommen zu sein.

Der folgende Forenbeitrag hat mir geholfen, alles zum Laufen zu bekommen:

"Basically, I unmasked and emerged xf86-video-radeonhd and set the driver to radeonhd" (ganz unten auf der Seite)
- http://forums.gentoo.org/viewtopic-t-625940-highlight-radeonhd.html

Und der Artikel zum radeonhd Treiber:
- http://forums.gentoo.org/viewtopic-t-606785-highlight-ati+screens.html

Außerdem der passende Eintrag im Gentoo-Wiki:
- http://gentoo-wiki.com/HOWTO_DRI_with_ATi_Open-Source_Drivers

Aber was ich eigentlich nur gemacht habe war:

Meinen Kernel mit Direct Rendering Manager aber ohne Radeo Treiber neu bauen:

Character devices  --->
   /dev/agpgart (AGP Support) 
   Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)

Dann modules.autoload anpassen (ich habe ein nvidia board - Details im Gentoo-Wiki):

vim /etc/modules.autoload.d/kernel-2.6

# babcode: ATI drivers
nvidia-agp
agpart
radeonhd

Die unfreien ATI-treiber rausschmeißen und radeonhd emergen:

emerge -C ati-drivers
echo  "x11-drivers/xf86-video-radeonhd" >> portage-keywords/hardware
emerge x11-drivers/xf86-video-radeonhd

Und am Ende noch die xorg.conf anpassen:
/etc/X11/xorg.conf (*brr* fühlt sich das seltsam an ohne tab-vervollständigung :) )

In Section "Device" muss bei "Driver" "radeonhd" eingetragen werden.
(Ich hatte zwei Abschnitte, in denen ich das machen musste).

Damit habe ich zwar sicher noch nicht die schnellstmögliche EInstellung drin, aber mein Rechner läuft endlich nur noch mit freier Software!

Wenn ihr mehr Leistung rausholen wollt, könnt ihr sicher einige Tipps in den Gentoo Foren und dem Gentoo Wiki finden.

Ich bin Frei!
Yay!

hp photosmart druckt nicht mehr - communication problem: lpr 256

Update: Diese Lösung hat mein Problem kurzfristig gefixt - nach einer Weile hatte ich wieder Probleme. Inzwischen habe ich mein System neu aufgesetzt und er läuft wieder.

Ich habe gerade Stunden damit zugebracht, meinen Drucker endlich wieder zum Laufen zu bringen.

Die Lösung war:

cd /dev/bus/usb
chmod o+w */*

ACHTUNG: UNSICHER!
Diese Lösung gibt jedem Nutzer im System Schreibrechte auf die USB-Geräte. Auf keinen Fall auf einem System mit nicht-vertrauenswürdigen Nutzern machen.

Hintergrund:

Probleme:

  • hp-toolbox hatte keine sinnvolle Verbindung mehr zu meinem Drucker (communication error),
  • Keins meiner Programme konnte mehr drucken - hat aber auch keine Fehlermeldung gebracht.
  • lpr hatte keinen Zugriff auf meinen Drucker.

Einzellösungen und Versuche:

  1. Mich in die Scanner-Gruppe eintragen - hp-toolbox erhält wieder Status-Infos.
    vigr
    oder
    kuser

  2. Jedem Schreibrechte auf meine USB-Geräte geben (code und Warnung: s.o.)

Außerdem habe ich eine neue udev-regel Datei von SUSE reingehängt: 55-hpmud.rules

-> http://osdir.com/ml/printing.hplip.devel/2007-10/msg00009.html

In Gentoo liegt sie übrigens bei /etc/udev/rules.d/70-hpmud.rules

Ich bin aber nicht sicher, ob das sinnvoll war.

Bitte schreibt, ob euch das hilft, oder ob ich Schritte vergessen habe (und wenn ja, welche).

Mit Pulseaudio Toneingabe und -ausgabe gleichzeitig aufnehmen (unter GNU/Linux)

→ als Antwort für PiHalbe geschreiben: „wie kann man an einem Rechner einfach von Skype/mumble/… aufnehmen?“.

Zum Aufnehmen: pulseaudio, parecord. Gilt aber nicht als einfach :)

pactl list | grep -A2 'Quelle #' | grep 'Name:$' | cut -d" " -f2

oder besser:

LANG=C pactl list | grep -A2 'Source #' | grep 'Name:$' | cut -d" " -f2

Das gibt dir deine Geräte.

Bei mir gibt es das:

$ LANG=C pactl list | grep -A2 'Source #' | grep 'Name:' | cut -d" " -f2
alsa_output.pci-0000_00_14.2.analog-stereo.monitor
alsa_output.usb-M_Audio_MobilePre-00-MobilePre.iec958-stereo.monitor
alsa_input.usb-M_Audio_MobilePre-00-MobilePre.iec958-stereo

Dann in der .bashrc:

# record via pulseaudio, usage: `babrecord file.wav`  
alias babrecord='parecord -r --format=float32le --file-format'

und in zwei shells:

babrecord [ich.wav] -d [gerät von oben]
babrecord [du.wav] -d [gerät von oben, das auf .monitor endet]

(gefunden via recording from pulseaudio )

Bei mir sieht das so aus:

$ babrecord du.wav -d alsa_output.pci-0000_00_14.2.analog-stereo.monitor & babrecord ich.wav -d alsa_input.usb-M_Audio_MobilePre-00-MobilePre.iec958-stereo &

danach:

fg # in den Vordergrund holen)
Strg-C (Aufnahme stoppen)
fg
Strg-C

am Ende:

$ audacity ich.wav
(du.wav importieren)

fertig.

Tastaturlayout prüfen und evolutionär entwickeln

Ich habe ein kleines Python Programm geschrieben, um das Neo Tastaturlayout zu prüfen und mit evolutionären Codes zu verbessern.

Inzwischen hat es von verschiedenen Leuten Verbesserungen erfahren, daher ist das „Ich“ oben nur noch eingeschränkt richtig. Dank geht an die wundervolle Neo-Community!

Es braucht Python 3.

Seine Lizenz ist wie üblich GPL (frei).

Das Ziel dabei ist, eine Belegung zu finden, die schnelleres und weniger belastendes Tippen ermöglicht und so hoffentlich hilft, Erkrankungen der Handgelenke durch viel Tippen zu vermeiden.

Ergebnisse der Optimierung schreibe ich dabei meist auf der Mailingliste der Neo-Gemeinschaft.

Einige weitere Informationen gibt es auf EvolvedLayouts und Neo3 im Neo-Wiki.

Anschauliche Ergebnisse

Um die Optimierung anschaulich zu machen, gibt der Optimierer Bilder der Buchstabenhäufigkeit und Bigrammübergänge aus (nach einem Design von Wolf).

Hier sind sie für einen Ausschnitt aus der Entwicklung der Tastaturbelegungen erstellt. Hellblaue Übergänge zwischen Buchstaben sind gut, dunkelblaue/lilane sind unschön und gelbe sing grausig.

Qwertz ist die alte, typische und offensichtlich schreckliche Tastaturbelegung (v.a. durch „de“ und „un“), die selbst ihr Erfinder wieder ändern wollte – Remington (der Hersteller der Tastaturen) verweigerte das aber… sowas passiert, wenn man seine revolutionären Erfindungen verkauft…

Dvorak ist die verbreitetste optimierte, aber durch z.B. „ei“ nicht für Deutsch geeignet. Sie wurde noch von Hand optimiert.

Neo 2 ist die aktuelle Belegung der Neo-Gemeinschaft. Ihre Hauptschwäche sind die Fingerwiederholungen (z.B. „la“).

Haeik ist das Testlayout, das ich seit Februar 2011 nutze, um zu testen, ob es Probleme gibt, die erst bei höheren Tippgeschwindigkeiten auftreten. Seit Anfang März 2011 bin ich wieder bei über 300 Zeichen pro Minute und habe ein paar Anpassungen vorgenommen.

Tnrs ist ein aktuelles Ergebnis des Optimierers (aktuell=2011-03-13).

Die Dicke der Übergänge zeigt die Häufigkeit an. Die Richtung wird durch die Transparenz gezeigt: Von durchsichtig zu vollständig sichtbar. Einwärtsbewegungen machen dabei einen Bogen nach oben, auswärts einen nach unten.

Der Grauton der Tasten gibt die Buchstabenhäufigkeit an und der kleine Punkt zeigt, wie oft das Zeichen am Wortanfang steht. Hell ist selten, dunkel ist oft.

Alle werden erstellt via

./bigramm_statistik.py --svg --svg-output neo2.svg -l "xvlcw khgfqß´
uiaeo snrtdy
üöäpz bm,.j"

(die Belegung wird zwischen den Anführungszeichen eingefügt)

Parameter

Zur Zeit (2010-08-05) optimiert es auf

  • Gute Tastenpositionen (auf der Grundlinie ist z.B. besser als links unten).
  • Möglichst wenige Fingerwiederholungen (einen Finger mehrfach hintereinander nutzen).
  • Handwechsel bei Richtungswechsel (horizontal).
  • Wenige Zeilenwechsel auf der gleichen Hand.
  • Handwechsel, wenn eine Hand aus ihrer Grundposition gezogen wird.
  • Gleichmäßige Fingerbelastung (aber nur halbe Last auf dem Kleinen, weil er sonst frühzeitig aussteigen kann).
  • Minimierung bestimmter Fingerübergänge (z.B. Mittel- auf Ringfinger).

Funktionsweise

  1. Annahme: Es gibt eine Idealtastatur. Auf ihr braucht Tippen weder Zeit noch strengt es an. Für jede Abweichung davon werden der Tastatur Kosten berechnet.
  2. Es wird eine zufällige Belegung erstellt oder eine vorgegebene durch zufällige Vertauschungen geändert.
  3. Zwei zufällig gewählte Tasten werden vertauscht (Mutation). Dann werden die Kosten der Tastatur berechnet. Sind sie geringer, wird die Mutation behalten, ansonsten wird sie verworfen. Das wird etwa 4000 mal wiederholt (mit Abweichung: Stichwort „Simulated Annealing“).
  4. Optional werden am Ende nochmal alle möglichen Vertauschungen geprüft und jeweils diejenigen gemacht, die die Kosten am stärksten reduzieren. Das läuft so lange, bis es keine Vertauschungen mehr gibt, die die Kosten reduzieren würden.
  5. Mit den erstellten Tastaturbelegungen werden Texte generiert, mit denen Tipper testen können, wie sich das Tippen mit diesen Belegungen anfühlen würden. Die Erfahrungen aus den Tipptests werden genutzt, um die Parameter zu optimieren (Gewichtung und Suche nach weiteren relevanten Parametern).

Details dazu findest du in der Quelldatei (sollte auch ohne Programmierkenntnisse recht lesbar sein), weitere Informationen zur Optimierung auf EvolvedLayouts und Neo3 im Neo-Wiki.

Testament: Freiheit für meine Werke

→ http://draketo.de/deutsch/freie-kultur/licht/testament-fuer-freie-werke

Im Vollbesitz meiner geistigen Kräfte verfüge ich hiermit, dass nach meinem Tod all meine Werke, für die ich ausreichende Rechte habe, unter freien copyleft Lizenzen im Sinne der vier Freiheiten verfügbar sein sollen.

Das heißt, nach meinem Tod dürfen alle Werke, für die ich ausreichend Rechte habe, unter freie Lizenzen relizensiert werden, die den im Folgenden beschriebenen vier Freiheiten genügen und verlangen, dass alle abgeleiteten Werke unter den gleichen Lizenzen oder zumindest unter Lizenzen, die auch diesen Bedingungen genügen, verfügbar sein müssen.

Die genannten vier Freiheiten sind:

  • Die Freiheit das Werk zu jedem Zweck zu nutzen (Freiheit 0).
  • Die Freiheit das Werk an deine Bedürfnisse anzupassen (Freiheit 1). Zugriff auf die Quelldateien ist eine Vorbedingung dafür.
  • Die Freiheit Kopien des Werkes weiterzugeben, um Nachbarn und Freunden helfen zu können (Freiheit 2).
  • Die Freiheit das Werk zu verbessern und deine Verbesserungen zu veröffentlichen, so dass die gesamte Gemeinschaft davon profitiert (Freiheit 3). Auch hierfür ist Zugriff auf die Quelldateien eine Vorbedingung.

gezeichnet
Arne Babenhauserheide

--

Wenn auch ihr mit allen Werken, über die ihr verfügen könnt, zumindest nach eurem Tod freie Kultur unterstützen wollt, dann setzt einfach euren Namen in den Kommentar, oder besser noch: Übernehmt dieses Testament auf eure Seite (es ist frei lizensiert).
Dann schreibt es handschriftlich ab, setzt Ort, Zeit und Datum dazu und unterschreibt es (nach der letzten Zeile).
- (Rechtlche Grundlage)

Und wenn ihr einen Anwalt kennt, der bereit wäre, dieses Testament unentgeltlich zu prüfen, würde ich mich sehr freuen, wenn ihr mir von ihm schreibt, oder ihm einfach die Adresse diesser Seite gebt.

Videos sauber in Webseiten einbinden (html5)

Ich habe die letzten Wochen mit dem html5 widget experimentiert und bin dabei auf die wundervolle Seite video for everybody gestoßen.

Carmen von Video for everybody hat seinen Code inzwischen aktualisiert. Schau also am besten direkt auf video for everybody vorbei.

Besonders interessant für mich war der code mit youtube integration, weil dadurch die Notwendigkeit entfällt, selbst einen Flash-Player zu hosten.

Um das nochmal zu wiederholen: Die aktuelle Version gibt es auf video for everybody.

Das Prinzip dahinter heißt "graceful degradation": Wenn jemand die bestmögliche Technologie nicht hat, wird automatisch und unsichtbar die zweitbeste Möglichkeit genutzt, und wenn er die nicht hat die nächste, bis am Ende ein Download-Link da steht, mit dem selbst Leute mit Textbrowsern die Videos herunterladen und dann z.B. als Text-Video ansehen können.

Auf die Art kann wirklich Jede/r die Inhalte der Webseite nutzen. Jede/r beinhaltet hier Nutzer auch von iPhones uvm.

Ein Beispiel wie der Code dann aussehen kann (das Beispiel hier verwendet youtube als Quelle für das Flash-Video):

Camen von video for everybody hat den code unter cc-by freigegeben und mir auch per E-Mail nochmal bestätigt, dass ich ihn unter die GPL relizensieren (und daher hier verwenden) kann.

Ich habe daraus ein kleines generisches Codeschnipselchen gebastelt.

Um es zu verwenden musst du nur

  • den html code rauskopieren,
  • Höhe und Breite anpassen (aktuell 480x360; wegen youtube),
  • "__VIDEO-URL__" durch den Namen eures Videos ohne Endung ersetzen, und
  • Die Youtube URL durch die Youtube URL eures Videos ersetzen.
  • Darauf achten, dass dein Server die richtigen MimeTypes schickt (z.B. indem du eine passende ".htaccess" Datei in den Ordner mit den Videos legst - der Dateiname der .htaccess Datei muss mit einem Punkt anfangen!).

Du brauchst dafür außerdem die Videos nur im mp4 und im ogg theora Format (und auf youtube).

Wenn du also Videos auf deiner Seite wirklich sauber einbinden willst, dann lad den generischen Codeschnipsel herunter, editier ihn und benutz ihn auf deiner Seite.

Da meine Schaffenshöhe hier sehr gering ist, kannst du ihn wie das Original auch unter cc-by verwenden, musst also nur sagen, dass er von Camen stammt.

PS: Die Zeilenenden sind *nix-Stil ("\n"). Wenn du keine Zeilenumbrüche siehst, probier mal die Datei mit OpenOffice als Text mit Unix-Zeilenenden und "UTF-8" als Kodierung zu öffnen.

„Freie Software“ in 62 verschiedenen Sprachen

Der Name „Freie Software“ in 62 verschiedenen Sprachen.

  • Afrikaans: Vrye sagteware
  • العربية : برمجيات حرة
  • Asturianu: Software llibre
  • Azərbaycan: Azad proqram təminatı
  • Bahasa Indonesia: Perangkat lunak bebas
  • Bahasa Melayu: Perisian bebas
  • Bân-lâm-gú: Chū-iû nńg-thé
  • Български: Свободен софтуер
  • Brezhoneg: Poellad frank
  • Bosanski: Slobodni softver
  • Català: Programari lliure
  • کوردی : نەرمەکاڵا خۆڕاییەکان / Soranî
  • Česky: Svobodný software
  • Dansk: Fri software
  • Deutsch: Freie Software
  • Ελληνικά: Ελεύθερο λογισμικό
  • English: Free software
  • Español: Software libre
  • Esperanto: Libera programaro
  • Eesti: Vaba tarkvara
  • Euskara: Software libre
  • فارسی : نرم‌افزار آزاد
  • Français: Logiciel libre
  • Gaeilge: Bogearraí saora
  • Galego: Software libre
  • Gaelg: Cooid vog heyr
  • עברית : תוכנה חופשית
  • Hrvatski: Slobodna programska podrška
  • Magyar: Szabad szoftver
  • Հայերեն: Ազատ ծրագրային ապահովում
  • Interlingua: Software libere
  • Ilokano: Nawaya a software
  • Ido: Libera programaro
  • Íslenska: Frjáls hugbúnaður
  • Italiano: Software libero
  • Kurdî / كوردی : Nermalava azad
  • Lietuvių: Laisvoji programinė įranga
  • Latviešu: Brīvā programmatūra
  • Malagasy: Rindrankajy malalaka
  • Македонски: Слободен софтвер
  • Nederlands: Vrije software
  • ‪Norsk (bokmål)‬: Fri programvare
  • Occitan: Logicial liure
  • Polski: Free software
  • Português: Software livre
  • Romani: Mesto software
  • Română: Software liber
  • Русский: Свободное программное обеспечение
  • Slovenčina: Slobodný softvér
  • Slovenščina: Prosto programje
  • Shqip: Program kompjuterik i lirë
  • Српски / Srpski: Слободни софтвер
  • Suomi: Vapaa ohjelmisto
  • Svenska: Fri programvara
  • Тоҷикӣ: Барномаҳои озод
  • Tagalog: Malayang software
  • Thai: ซอฟต์แวร์เสรี (thanks to thep)
  • Tiếng Việt: Phần mềm tự do
  • Türkçe: Özgür yazılım
  • Українська: Вільне програмне забезпечення
  • اردو : آزاد مصنع‌لطیف
  • Cymraeg: meddalwedd rhydd (dank richardsmedley)

Etwa 8 Namen fehlen leider, weil mein Browser die Schriftzeichen nicht kopieren konnte.

Quelle: Artikel zu freier Software auf Wikipedia -> Artikel in anderen Sprachen.

„Frei“, „Free“, „Libre“ Akronym

In identi.ca und twitter haben tzk, jargon, freezombie, chaosstar666, akfoerster und ich Akronyme zu dem „Frei“ in Freier Software für verschiedene Sprachen gesucht. Was wir bisher haben:

  • Frei, Robust, Ethisch und Innovativ”
  • Free, Reliable, Ethical and Efficient“
  • Libre, Inagotable, Bravo, Racional y Encantado“ (von tzk)

Wenn du weitere schöne Versionen hast, würde ich mich über einen Kommentar, einen dent oder tweet freuen!

Wie es dazu kam: