ubuntuusers.de

20. Juni 2014

Flo und ich nutzen schon seit einiger Zeit einen eigenen Jabberserver (bzw. XMPP-Server), da wir uns nicht mehr wirklich auf jabber.ccc.de verlassen konnten. Zumal deren Server bei Sicherheitstests nicht soo toll abschneidet ..
Ein anderer Grund ist natuerlich auch: weil wirs koennen ;)

Daher hier mal eine Anleitung fuer alle Arch Linux Nutzer*innen, die schon immer mal einen Jabberserver aufsetzen wollten und den auch etwas absichern wollten :)

Als Jabberserver nutzen wir Ejabberd und als CA nutzen wir CAcert.

Installation

Zur Installation von ejabberd reicht ein einfaches (Quelle):

# pacman -S ejabberd

Konfiguration

Es gibt zwei Konfigurationsdateien in /etc/ejabberd: ejabberdctl.cfg und ejabberd.yml. Die erste Datei muss nicht angefasst werden, d.h. wir aendern nur ejabberd.yml.

Ich beschreibe im Folgenden Schritt fuer Schritt die Abweichungen von der Standardkonfiguration, und werde am Ende eine vollstaendige Konfiguration - allerdings ohne Kommentare - praesentieren.

Die erste Aenderung sind die Hosts, in unserem Falle:

hosts:
    - "albion2.org"
    - "yhaupenthal.org"
    - "localhost"

Zitat aus der Wikipedia:

Die Verbindung zwischen zwei XMPP-Clients wird immer über mindestens einen XMPP-Server aufgebaut. Sind beide Clients an zwei verschiedenen Servern angemeldet, so muss auch zwischen den beiden Servern eine Verbindung aufgebaut werden (Client A ↔ Server A ↔ Server B ↔ Client B).

D.h. wir brauchen einmal eine Verschluesselung fuer Client-to-Server (c2s) und dann noch eine fuer Server-to-Server (s2s). Fuer s2s legen wir die folgenden Optionen fest:

# eine verschluesselte Verbindung ist erforderlich
s2s_use_starttls: required
# Pfad zum SSL-Zertifikat, die Anleitung dazu befindet sich
# weiter unten
s2s_certfile: "/etc/ejabberd/xmpp.pem"

Die verwendeten Verschluesselungsverfahren sind im Folgenden aufgelistet, siehe dazu auch mein Post ueber die Cipher bei lighttpd. Direkt danach deaktivieren wir noch die Komprimierung von TLS, damit wir nicht anfaellig fuer CRIME sind.

s2s_ciphers: "ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA"
s2s_tls_compression: false
# wir wollen kein SSLv3 nutzen, daher schalten wir es aus.
s2s_protocol_options:
  - "no_sslv3"

Update (2015-05-21) Durch Logjam und BetterCrypto haben wir "DHE-RSA-AES256-SHA" aus der Ciphersliste entfernt (auch bei den Clienteinstellungen).

Danach folgen die Optionen fuer c2s (bei listen):

listen:
  -
    port: 5222
    module: ejabberd_c2s
    max_stanza_size: 65536
    shaper: c2s_shaper
    access: c2s
    # ab hier die neuen Optionen
    # Die Protokolloptionen muessen nicht unbedingt benutzt
    # werden, sind aber sinnvoll, zumindest "no_sslv3"
    protocol_options:
      - "no_sslv3"
    #  - "no_tlsv1"
    # wieder wie oben der Pfad zum SSL-Zertifikat
    certfile: "/etc/ejabberd/xmpp.pem"
    # auch hier ist starttls wieder erforderlich
    starttls: true
    starttls_required: true
    # und auch hier wollen wir uns gegen CRIME absichern
    tls_compression: false
    # die Verschluesselungsverfahren (Cipher bzw. Ciphers) sind
    # die gleichen wie bei s2s
    ciphers: "ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA"
    # wir wollen auch nicht den Stream komprimieren
    zlib: false

Als Authentifizierung nutzen wir wie im Standard internal, speichern aber die Passwoerter nicht im Klartext:

auth_method: internal
auth_password_format: scram

Im naechsten Schritt legen wir die Nutzer*innen an, die damit ein Jabberkonto haben (und in unserem Falle Admin sind). Die Namen sind dabei Beispiele.

acl:
  admin:
    user:
      - "beispiel": "albion2.org"
      - "beispiel": "yhaupenthal.org"

Da wir ausser diesen Konten keine weiteren mehr brauchen, verbieten wir die Registrierung von anderen Namen:

access:
  register:
    all: deny

Update (2015-07-02): Wenn wir doch noch Einstellungen vornehmen wollen, koennen wir das via Webinterface oder der Kommandozeile loesen. Bei der Kommandozeile habe ich noch nicht durchgeblickt, da gibts aber hier eine Anleitung.
Das Webinterface ist standardmaessig unverschluesselt ueber folgende Adresse zu erreichen: http://example.org:5280/admin
Dort muss zum Einloggen eine (volle) Jabber-ID mit Adminrechten und das zugehoerige Passwort eingegeben werden.
Unverschluesselt ist natuerlich doof, daher kann es ueber SSL laufen, das habe ich allerdings nicht hinbekommen, es wird aber hier beschrieben. So aehnlich sollte es dann aussehen:

ip: "127.0.0.1"
port: 5282
module: ejabberd_http
certfile: "/etc/ejabberd/webadmincert.pem"
tls: true
web_admin: true

Meine Alternative: per default das Webadmin ausgeschaltet lassen und nur bei Bedarf anschalten. Dann mit einem Proxy (mit Lighttpd, aehnlich zu dem Proxy fuer HabitRPG hier) ueber SSL laufen lassen:

$HTTP["host"] =~ "^(?i:xmpp\.(example)\.org(?::\d+)?)$" {
    proxy.server = ( "" => ( (
        "host" => "127.0.0.1",
        "port" => "5280" ) # oder 5282 je nach der Konfiguration von Ejabberd
    ) )
}

Hilfe ist hier gerne gesehen ;)

Das wars auch schon mit der Konfiguration :)
Die gibts hier nochmal in ganz (ohne Kommentare):

loglevel: 4
hosts:
  - "albion2.org"
  - "yhaupenthal.org"
  - "localhost"
s2s_use_starttls: required
s2s_certfile: "/etc/ejabberd/xmpp.pem"
s2s_ciphers: "ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA"
s2s_tls_compression: false
s2s_protocol_options:
  - "no_sslv3"
listen: 
  - 
    port: 5222
    module: ejabberd_c2s
    certfile: "/etc/ejabberd/xmpp.pem"
    starttls: true
    starttls_required: true
    tls_compression: false
    max_stanza_size: 65536
    shaper: c2s_shaper
    access: c2s
    ciphers: "ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA"
    zlib: false
    protocol_options:
      - "no_sslv3"
  - 
    port: 5269
    module: ejabberd_s2s_in
  - 
    port: 5280
    module: ejabberd_http
    web_admin: false # bei Bedarf einschalten, SSL Konfiguration siehe oben
    http_poll: true
    http_bind: true
    captcha: true
auth_method: internal
auth_password_format: scram
shaper:
  normal: 1000
  fast: 50000
max_fsm_queue: 1000
acl:
  admin:
    user:
      - "beispiel": "albion2.org"
      - "beispiel": "yhaupenthal.org"

  local: 
    user_regexp: ""
  loopback:
    ip:
      - "127.0.0.0/8"
access:
  max_user_sessions: 
    all: 10
  max_user_offline_messages: 
    admin: 5000
    all: 100
  local: 
    local: allow
  c2s: 
    blocked: deny
    all: allow
  c2s_shaper: 
    admin: none
    all: normal
  s2s_shaper: 
    all: fast
  announce: 
    admin: allow
  configure: 
    admin: allow
  muc_admin: 
    admin: allow
  muc_create: 
    local: allow
  muc: 
    all: allow
  pubsub_createnode: 
    local: allow
  register: 
    all: deny
  trusted_network: 
    loopback: allow

language: "en"
modules: 
  mod_adhoc: {}
  mod_announce: # recommends mod_adhoc
    access: announce
  mod_blocking: {} # requires mod_privacy
  mod_caps: {}
  mod_carboncopy: {}
  mod_configure: {} # requires mod_adhoc
  mod_disco: {}
  mod_irc: {}
  mod_http_bind: {}
  mod_last: {}
  mod_muc: 
    access: muc
    access_create: muc_create
    access_persistent: muc_create
    access_admin: muc_admin
  mod_offline: 
    access_max_user_messages: max_user_offline_messages
  mod_ping: {}
  mod_privacy: {}
  mod_private: {}
  mod_pubsub: 
    access_createnode: pubsub_createnode
    ignore_pep_from_offline: true
    last_item_cache: false
    plugins: 
      - "flat"
      - "hometree"
      - "pep" # pep requires mod_caps
  mod_register: 
    welcome_message: 
      subject: "Welcome!"
      body: |-
        Hi.
        Welcome to this XMPP server.
    ip_access: trusted_network
    access: register
  mod_roster: {}
  mod_shared_roster: {}
  mod_stats: {}
  mod_time: {}
  mod_vcard: {}
  mod_version: {}

TLSv1 abzuschalten waere bei IM Observatory zwar sinnvoll, um 100 % bei Cipher score zu bekommen, allerdings koennen wir uns dann nicht mehr zu jabber.ccc.de verbinden :(
Daher beide Male nur 95 % ..

SSL-Zertifikat

Zur Erstellung eines Zertifikats bei CAcert muss sich auf der Website angemeldet werden. Ein Zertifikat kann direkt erstellt werden, allerdings muessen erst noch die Domains eingetragen und per E-Mail verifiziert werden.

Die Anleitung zur Erstellung befindet sich hier (direkt die ersten Punkte befolgen).
Bei den Abfragen haben wir folgendes angegeben:

--- 8< ---
Short Hostname (ie. imap big_srv www2): xmpp
FQDN/CommonName (ie. www.example.com) : *.albion2.org
Type SubjectAltNames for the certificate, one per line. Enter a blank line to finish
SubjectAltName: DNS:www.albion2.org
SubjectAltName: DNS:www.yhaupenthal.org
SubjectAltName: DNS:*.yhaupenthal.org
SubjectAltName: DNS:yhaupenthal.org
SubjectAltName: DNS:albion2.org
SubjectAltName: DNS:*.albion2.org
SubjectAltName: DNS:
Running OpenSSL...
Generating a 4096 bit RSA private key
--- >8 ---

Liegt das Zertifikat von CAcert dann vor, muss noch folgendes ausgefuehrt werden:

# cat xmpp_privatekey.pem xmpp_server.pem > /etc/ejabberd/xmpp.pem

Start :)

Das wars, nun muss nur noch Ejabberd gestartet werden (und optional beim Systemstart gestartet werden):

# systemctl start ejabberd
# systemctl enable ejabberd

Viel Spass mit eurem eigenen Jabberserver! :)

Zu dem NFC Modul welches ich bei Farnell element14 bestellt habe gehört das Modul selbst, ein kleiner Zettel mit Mini Anleitung und eine RFID Karte. Das Modul ist ungefähr so groß wie der Rasbperry Pi und wird direkt auf die GPIO Ports gesetzt. Durch das aufsetzen des Moduls sind leider die anderen GPIO Ports nicht mehr nutzbar.

Damit das Modul genutzt werden kann muss SPI aktiviert werden.
Hierfür auf der Kommandozeile sudo raspi-config ausführen und unter den Advancded Options SPI aktivieren, im Anschluss den Rasbperry Pi neustarten.

Über einem Windows oder Linux Rechner (nicht über den Rasbperry Pi) die benötigte Software hier herunterladen und entpacken. In den entpackten Verzeichnissen befindet sich die card_polling.zip, diese muss auf den Rasbperry Pi kopiert und werden.

Für das kompilieren der polling Software muss zunächst cmake installiert werden.

Als root auf der Kommandozeile:
apt-get update
apt-get install cmake

Nun als Pi user in das Verzeichniss wechseln in der die zip Datei liegt und mit unzip card_polling.zip entpacken.
Nach dem entpacken müssen folgende Befehle ausgeführt werden:

cd ~/card_polling/build
cmake ../source
make

Nun über ./card_polling die kompilierte Software starten und das polling beginnt.

/home/pi/card_polling/build# ./card_polling
/****** Begin Polling ******/
No card or Tag detected
No card or Tag detected
MIFARE Ultralight detected
UID: 04 F1 DE 81 A0 22 80

MIFARE Ultralight detected
UID: 04 F1 DE 81 A0 22 80

No card or Tag detected
No card or Tag detected

Sobald eine RFID Karte auf das Modul gelegt wird, gibt die Software den Typ und die UID der Karte aus.

NFC Paket

NFC montiert

UPDATE:Leider hatte ich vergessen die verwendete Distribution mit anzugeben, ich nutze hier Raspian. Danke für den Hinweis Marco

Ich habe letztens dass Spiel Spacebase DF-9 entdeckt und da ich besonders Aufbauspiele mag es gleich gekauft und erst mal einen Tag im Spiel verbracht.
Spacebase DF-9 stammt von dem Entwicklerstudio Double Fine Productions welche bei dem Humble Bundle Amnesia Fortnight bereits einen Prototypen davon veröffentlicht haben.
Dieser war allerdings nur für Windows sodass sich mir erst jetzt die Möglichkeit bot dass Spiel zu spielen.
Da dass Spiel noch nicht fertig ist gibt es die Möglichkeit eine frühe Version mit ein paar Bugs zu spielen welche jedoch recht gut Funktioniert und Spaß für mehr als 10 Stunden bietet.

Quelle - Bildschirmfoto von Spacebase DF-9
Quelle – Bildschirmfoto von Spacebase DF-9

Inhalt

In Spacebase DF-9 geht es darum eine Weltraumstation aufzubauen und den einzelnen Einwohner Berufe zuzuteilen.
Dabei muss für jedes Objekt und jeden Raum vorher Gestein aus dem All von den Minern abgebaut und durch eine Maschine zu Materie umgewandelt werden.
Danach können Räume von Bauarbeitern erbaut und einer bestimmten Zone zugewiesen werden.
Jede Zone erfüllt eine Aufgabe und die dafür erforderlichen Objekte können nur in diesen Zonen gebaut werden.

Wichtig sind vor allem Lebensunterstützende Zonen in denen der Sauerstoff in der Luft aufgefrischt wird.
Mit der Anzahl der Umwandler erhöht sich auch die Personenanzahl die maximal aufgenommen werden können.
In den Schlafzonen können Betten für die Mannschaft aufgestellt werden, die ruhen sich bei Erschöpfung darin aus.
Daneben gibt es noch weitere Zonen die verschiedenste Aufgaben wie dem sozialen Kontakt dienen.

Ab und zu gibt es auch Katastrophen wie Überfälle oder Meteoritenschauer die schnell zum Tode führen wenn nicht richtig gehandelt wird.
Dafür lassen sich in allen Räumen Feuerlöscher und Alarmsysteme installieren und bei Gefahr auch bedienen.
Die Türen lassen sich auch verriegeln sodass ein evakuieren bei guter Planung recht schnell und die Katastrophe meist ohne Tote vorüber geht.
Neben Banditen fragen auch Schiffe mit Leuten die zu der Crew gehören wollen ob sie andocken können.
Dass bringt nach und nach immer mehr Leute denen verschiedenen Berufe zugeordnet werden können.

In den Forschungslaboren lassen sich verbesserte Gegenstände und Werkzeuge sowie Krankheiten erforschen.
Diese ermöglichen unter anderem den Bauvorgang zu beschleunigen oder statten die Sicherheitskräfte mit Gewehren aus.
Von Zeit zu Zeit kommen auch Krankheiten in der Bevölkerung auf die dann in den Forschungseinrichtungen erforscht werden müssen sodass sie auf den Krankenstationen bekämpft werden können.

Quelle - Bildschirmfoto von Spacebase DF-9
Quelle – Bildschirmfoto von Spacebase DF-9

Grafik

Die Grafik von Spacebase DF-9 ist hübsch gestaltet und stellt dass Spielgeschehen aus der Isoperspektive dar.
Der Grafikstil hat seinen eigenen Charme und wirkt auf mich mit den metallischen Oberflächen passend zum Geschehen.

Infos und Details

Dass Spiel kann derzeit über den Humble Store und Steam für 22.99 Euro erworben werden.
Anschließen lässt sich Spacebase DF-9 über Steam für die Plattformen Linux, Mac und Windows herunterladen und spielen.
Es existiert derzeit noch keine DRM-Freihe Version im Humble Store allerdings ist die Steam Version gleichzeitig eine sodass Steam nur zum herunterladen gebraucht wird.

Der Soundtrack im Spiel fällt mir positiv auf da er zum geschehen passt und auch nach langer Zeit nicht nervend wird.

Die Hardwareanforderungen für Linux sind recht niedrig gehalten sodass dass Spiel auch auf einem einigermaßen modernen Laptop laufen wird.

Linux Systemanforderungen:

– Betriebssystem: Ubuntu 12.04 LTS, aktualisiert
– Prozessor: 1.8 GHz dual core CPU
– Arbeitsspeicher: 1 GB RAM
– Grafik: 256 MB GeForce 8800, Radeon HD 2000, or Intel HD 4000 Graphics
– Festplattenspeicher: 200 MB verfügbaren Speicher
– Audiokarte: DirectX Compatible Sound Card

Quelle - Bildschirmfoto von Spacebase DF-9
Quelle – Bildschirmfoto von Spacebase DF-9

Wertung

Kategorie Wertung
Grafik 9/10
Gestaltung 7/10
Inhalt 8/10
Gesamt 24/30

Fazit

Dass Spiel gefällt mir sehr und der Preis ist für den Inhalt angemessen.
Jeden Monat sollte laut den Entwicklern ein Update hinzukommen welche oft mehr Möglichkeiten und Gegenstände mitbringen.
Spacebase DF-9 hat ein schönes Konzept welches unter Linux noch nicht häufig vertreten ist.
Ich kann dass Spiel bedenkenlos weiterempfehlen, auch denen die sonst nicht viel Spaß an Aufbauspielen haben.

19. Juni 2014

Firefox besitzt mit dem Telemetrie-Feature eine Mess-Infrastruktur, um diverse Leistungsdaten von Firefox anonym an die Mozilla-Server zu übertragen. Ab sofort ist Telemetrie in den Betaversionen standardmäßig aktiviert.

Telemetrie liefert Mozilla wichtige Erkenntnisse zur Nutzung des Browsers, um diesen zu verbessern. Für Nutzer der Nightly- sowie Aurora-Versionen von Firefox war Telemetrie bereits standardmäßig aktiviert, Gleiches trifft nun auch für Nutzer der Beta-Versionen zu. In den finalen Versionen wird Telemetrie auch weiterhin standardmäßig nicht aktiviert sein. Aktiviert kann Telemetrie über Einstellungen → Erweitert → Datenübermittlung werden.  Grundsätzlich sollte jeder Nutzer Telemetrie aktivieren beziehungsweise bei der Nutzung von Vorabversionen aktiviert lassen, da es nur im eigenen Interesse sein kann, dass das eigene System und Nutzungsverhalten bei der Entwicklung berücksichtigt wird.

Die Änderung betrifft sowohl den Desktop- als auch den Android-Browser von Mozilla und wird damit begründet, dass die Nutzer der Betaversionen deutlich repräsentativer in Bezug auf die finalen Versionen sind und dies Mozilla ermöglicht, bessere Voraussagen darüber zu treffen, wie sich eine Änderung für die Nutzer der finalen Versionen auswirken wird, als das bei den Nightly- und Aurora-Nutzern der Fall ist.

Nutzer, welche ihre Entscheidung für oder gegen Telemetrie davon abhängig machen wollen, welche Daten überhaupt an Mozilla übertragen werden, können about:telemetry in die Adressleiste von Firefox eingeben und sich diese ansehen. Die aggregierten Daten aller Nutzer lassen sich online über telemetry.mozilla.org betrachten und analysieren.

Es gibt sicherlich viele Möglichkeiten, stets über aktuelle Updates informiert zu sein. Mailinglisten oder Feeds sind sicherlich eine praktische und vor allem informative Möglichkeit, aber viel einfacher ist es, den Server oder Rechner die Arbeit zu überlassen. Die Paketverwaltung yum, welche bei CentOS und Fedora verwendet wird, bringt glücklicherweise das Kommando 

yum check-update
  mit, welches genau diese Aufgabe erledigt. Falls Updates verfügbar sind, beendet yum sich mit dem Exit-Code 100.

Für diese Aufgabe habe ich mir ein kleinen Bash-Script gebaut, welches die Ausgabe von 

yum check-update
  nur ausgbit, wenn auch wirklich Updates vorliegen. In einem Cronjob mit konfigurierter E-Mail Adresse erhält man so eine E-Mail, wenn Updates verfügbar sind:
#!/bin/bash
YUM_OUTPUT=$(/usr/bin/yum check-update)
if [ "$?" == 100 ]; then
    echo -e "There are updates available!\n\n" 
    echo -e "$YUM_OUTPUT"
fi

Mein Eintrag in der Crontab sieht dann z.B. so aus:

MAILTO="email@example.org"
0 5 * * * /usr/local/bin/yum_check-update.sh

An sich eine sehr simple Angelegenheit. Natürlich kann das Script bei Bedarf auch mehrfach täglich ausgeführt werden, man müsste nur den Cronjob anpassen. Es gibt sicherlich auch umfangreichere Lösungen, aber ich denke so ein paar Zeilen sind schnell erledigt und bringen schon einen deutlichen Mehrwert.

Bereits vor einigen Wochen wurde im deutschen Twitter-Blog angekündigt, dass zur WM einige Addons bei Twitter eingefügt werden. Dazu gehört unter anderem eine Seitenleiste, in der die Paarungen des Tages gesammelt werden, Hinweise in der Timeline zum jeweiligen Spiel, dass gerade läuft und kleine Nationalfähnchen, die bestimmte Hashtags verzieren. Wie das konkret aussieht zeigt beispielhaft der folgenden Screenshots.

Wer wie ich Fußball mag, aber den medialen Hype um die WM im Fußball der Männer eher Unverständnis entgegenbringt, ist vielleicht daran interessiert, Twitter im Webbrowser seiner Wahl wieder unbelastet nutzen zu können. Ein Adblocker, wie Adblock Edge, und ein bisschen CSS-Kenntnisse machen das leicht möglich.

Zunächst gilt es die Elemente ausfindig zu machen, die blockiert werden sollen. Dann müssen hinreichend eindeutige Identifikatoren für diese Elemente gefunden werden. Im konkreten Fall sind das folgende:

  • Seitenleiste: DIV mit id=dashboard-matches
  • Info-Tweet: DIV mit data-name="TwitterFootball"
  • Hashtag-Fahne: IMG mit class=twitter-hashflag

Um diese zu blockieren muss nun Adblock auf sie los gelassen werden. Dafür müssen eigene Filterregeln angelegt werden. Um das zu tun, öffnet ihr mit der Tastenkombination Ctrl+Shift+F die Filtereinstellungen. Links-oben findet sich der Reiter "Eigene Filter". Falls noch keine Filtergruppe existiert muss zunächst eine angelegt werden. In diese Filtergruppe können nun eigen Filter eingefügt werden. Die Syntax ist relativ simpel und wird sehr gut auf den Seiten von Adblock+ erklärt.

In unserem Fall werden wir mittels der gefundenen CSS-Selektoren blocken. Die Syntax ist in diesem Fall realtiv simpel:

webseitenname.kürzel ## CSS-Selector [" spezielle Eigenschaft "]

Die Angabe des Webseiten-Namens ist fakultativ. Wenn ein Name angegeben wird, dann wirkt der Filter nur auf der angegebenen Website. Wenn kein Name angegeben ist, wirkt er überall. Eine fertige Filterliste für unsere oben gefundenen Objekte sieht also folgender Maßen aus:

twitter.com##DIV[id="dashboard-matches"]
twitter.com##DIV[data-name="TwitterFootball"]
img[class="twitter-hashflag"]

Wenn die fertige Liste im Adblocker sollte nun den folgenden Inhalt haben:

Bildschirmfoto vom 2014-06-19 11:42:37

Jetzt solltet ihr Twitter wieder weitestgehend ohne nervige Addons nutzen können.

PS: Wo wir gerade bei nervig sind. Auch der Hinweis zur Cookie-Nutzung, der beim Login angezeigt wird und bei mir regelmäßig das halbe Login-Feld überdeckt, lässt sich mit dieser Methode leicht entfernen. Die Zeile lautet in diesem Fall:

twitter.com##DIV[class="Banner eu-cookie-notice"]

Manchmal ist es praktisch, kurz einen Tunnel zur Verfügung zu haben, mit dem man seinen Traffic über einen anderen Server leiten kann. Dafür braucht man nicht immer ein VPN oder externe Proxy Server, auf die Schnelle geht dies auch mit dem OpenSSH Client, wenn man SSH Zugang zu einem anderen Server hat. Aufgerufen mit der Option 

-D <port>
  lauscht, wenn keine Adresse angegeben wird, stellt der SSH Client lokal auf dem Port einen SOCKS Proxy zur Verfügung und leitet Anfragen an den Server weiter. Die Manpage formuliert dies ein wenig genauer:
Specifies a local “dynamic” application-level port forwarding.

Somit hat man mit zwei kleinen Schritten einen SOCKS Proxy zur Verfügung:

ssh -D 1080 example.org

Und tatsächlich, der SSH Client lauscht nun auf Port 1080:

netstat -antu | grep 1080
tcp        0      0 127.0.0.1:1080          0.0.0.0:*               LISTEN
tcp6       0      0 ::1:1080                :::*                    LISTEN

Nun kann man z.B. in seinem Browser oder anderen Anwendungen die Adresse 

localhost:1080
  als SOCKS(5) Proxy eintragen. Diese Methode ist aber mit Vorsicht zu genießen, da hiermit auch diverse Firewall oder Filter-Mechanismen umgangen werden können, so lange eben der SSH Port erreichbar ist.

Im folgenden Video zeige ich kurz (~ 5 min.) wie meine Toolchain im Live-Betrieb aussieht, dabei nutze ich unter anderem Sublime Text, PHP, Twig, Grunt, Sass, Compass, LiveReload und ein paar Funktionen aus den “dofiles” (z.B. phpserver).

 

Wer den Beispiel-Code aus dem Video selber ausprobieren möchte, hier die Zusammenfassung:

sudo apt-get install git

cd ~
git clone https://github.com/voku/dotfiles/
cd dotfiles/
./firstInstall.sh
./bootstrap.sh
cd ~
vim ~/.extra #1

cd ~
mkdir Projects/
git clone https://github.com/voku/twig-wrapper-example/
cd twig-wrapper-example/
npm install
grunt watch

cd ~/Projects/twig-wrapper-example/
phpserver

#1 füge deine persönlichen Git-Einstellungen hier hinzu

 

Wer mehr Infos oder Erklärungen zu den hier verwendeten Tools haben möchte, sollte sich einmal folgende Videos anschauen: suckup.de/howto/html/moderner-build-development-workflow-via-bower-grunt-yeoman/

 

Man kann über proprietäre Software denken was man will aber wenn Software wirklich gut ist und einem die Arbeit erleichtert / beschleunigt solle man sich diese zumindest einmal anschauen.

Installation

Es gibt unterschiedliche Wege Sublime Text zu installieren. Man kann das Paket direkt von der entsprechenden Webseite laden und mit folgendem Befehl installieren.

wget http://c758482.r82.cf2.rackcdn.com/sublime-text_build-3059_amd64.deb
sudo dpkg -i sublime-text_build-3059_amd64.deb

Info: dev-builds gibt es hier Oder man verwendet z.B. das Linux Mint Repository und installiert Sublime über den Paketmanager.

sudo echo "deb http://packages.linuxmint.com/ debian main import backport upstream romeo" >> /etc/apt/sources.list
sudo apt-get update
sudo apt-get install sublime-text

 

Plugin-Manager hinzufügen

Auf der folgenden Webseite gibt es “den” Plugin-Manager für Sublime, welchen man auf jeden Fall installieren sollte: sublime.wbond.net/installation

mkdir ~/.config/sublime-text-3/Packages/Installed\ Packages
cd ~/.config/sublime-text-3/Packages/Installed\ Packages
wget https://sublime.wbond.net/Package%20Control.sublime-package

Nachdem man Sublime einmal neugestartet hat, findet man unter “Preferences -> Package Control” alle Befehle zum verwalten von Plugins.

 

Plugin Empfehlungen

– BracketHighlighter -> Bracket and tag highlighter for Sublime Text

– DocBlockr -> Simplifies writing DocBlock comments in Javascript, PHP, CoffeeScript, Actionscript, C & C++

Emmet -> Emmet (ex-Zen Coding) for Sublime Text

PHP-Twig -> A TextMate (and Sublime Text) bundle for Twig.

Sass -> Sass support for TextMate & Sublime Text 2

Git -> Plugin for some git integration into sublime text

– GitGutter -> A Sublime Text 2/3 plugin to see git diff in gutter

 

Links:

Sublime Text – Tips-Tricks-Shortcuts

– Best of Sublime Text 3 Features. Plugins and Settings

– Sublime Text – Keyboard-Shortcuts

– www.sublimetext.com/docs/3/

18. Juni 2014

Vor einiger Zeit kam mir der Gedanke, mein Leben zu gamifizieren.
Der Gedanke kam mir kurz vorm Entruempeln eines Schreibtisches und ich dachte an die erfolgreiche Gamifizierung von Lernplattformen wie Codecademy, Khan Academy, Memrise und Duolingo - um nur einige zu nennen - und bei Spielen generell (vgl. Steam).

Also: wir spielen Sims oder irgendein Spiel um dort voran zu kommen bzw. einen Character zu verbessern, trainieren usw., sitzen aber selbst leider nur vor diesem Kasten und bewegen lediglich die Haende ..
Spiele sind nicht grundlegend schlecht, ja sind sogar teilweise gut fuer uns, aber was bringt es, wenn mein virtueller Charakter in einem Spiel die Hoechststufe erreicht hat, wenn wir selbst dahinvegetieren?

Naja, jedenfalls dachte ich mir, ich hab ja schonmal eine Website gebaut mit ein bisschen Gamifizierung, ich kann sowas ja nochmal machen, diesmal aber auf mein Leben anwenden.
Die Anforderungen waren dabei eine Website, in der TODOs usw. eingetragen werden koennen und es bei Erfuellung dieser eine Belohnung in Form von Abzeichen oder aehnliches gibt. Dabei soll das ganze lokal laufen koennen, aber auch zentral, um sich durch einen optionalen Wettbewerb mit anderen zu messen.

Ich wollte mich aber zuerst noch vergewissern, dass es sowas nicht schon gibt und hab mal in der Suchmaschine meiner Wahl danach gesucht. Und natuerlich gibt es solch eine Website schon: HabitRPG :D

Dabei werden sogar alle Features umgesetzt, die ich auch bei mir angedacht habe. HabitRPG kann - dank Open Source - lokal aufgesetzt werden, laeuft aber auch zentral und die Spieler*innen koennen sich in optionalen Wettbewerben miteinander messen. Zudem wird die Gamifizierung sehr schoen umgesetzt, es ist naemlich kein einfaches Belohnungssystem sondern an ein Role Play Game (RPG) angelehnt, d.h. es gibt einen Charakter, der durch "Aufbauen" von Gewohnheiten (Habits) sowie Erledigung von taeglichen (Dailies) und einmaligen Aufgaben (TO-DOs) Erfahrungspunkte sammeln kann um dann mit genuegend Punkten ein Level aufzusteigen.
Einige Level schalten dabei verschiedene Dinge frei, so koennen ab Level 2 Haustiere und Reittiere aufgezogen werden und ab Level 10 eine neue Klasse gewaehlt werden.
Soziale Interaktion ist im Gasthaus oder in Gilden bzw. Gruppen moeglich um sich bspw. mit anderen zu messen.
Mehr dazu im Wiki von HabitRPG.

Startseite
von HabitRPG nach dem Einloggen

[Hinweis zum Bild: ich wollte erst verpixeln, aber daraus koennen die urspruenglichen Informationen wieder hergestellt werden. Daher am Besten: ausschneiden, schwaerzen oder zufaellig verwischen.]

Jedenfalls wollte ich HabitRPG natuerlich lokal aufsetzen, weil ich ja die Kontrolle ueber meine doch privaten Daten haben will. Gerade in Zeiten der Ueberwachung ist das auch ziemlich sinnvoll und wichtig.

Allerdings habe ich nicht mit diesem Aufwand gerechnet (zuerst mal MongoDB und NodeJS-Umgebung bauen) und den leider vielen Bugs. Zumindest als ich es ausgetestet habe, fehlten anscheinend die ganzen Mediadaten wie Bilder und die Sprachdateien.
D.h. es ging einfach nichts und ich hatte nach ein paar Stunden und dank nicht so toller Dokumentation keine Lust mehr und hab mich auf der zentralen Seite angemeldet.

Aber gut, dass ich nicht so leicht aufgebe, ich habe es wieder versucht. Und nach ein paar Stunden hat dann auch alles so funktioniert, wie ich das wollte. Allerdings ist die Doku immer noch schlecht ;)

Daher hier eine moeglichst umfangreiche Anleitung (fuer Arch Linux).
Danach geht es normal weiter im Text ;)

HabitRPG lokal aufsetzen

Die Anleitung im Wiki von HabitRPG gibt schon einige Sachen vor (und ist ausfuehrlicher als die auf GitHub), aber ich will die einzelnen Schritte etwas genauer und an Arch Linux angepasst auflisten.

  • MongoDB installieren und aufsetzen (Quelle)

    # pacman -S mongodb
    
  • MongoDB starten (und optional bei jedem Systemstart starten lassen)

    # systemctl start mongodb
    # systemctl enable mongodb
    
  • Installation von NodeJS und Git

    # pacman -S nodejs git
    
  • Beziehen des Codes von HabitRPG (von GitHub) und Wechseln in das neue Verzeichnis (kann spaeter z.B. nach ~/repos verschoben werden)

    $ cd
    $ git clone https://github.com/HabitRPG/habitrpg.git
    $ cd habitrpg
    
  • Auf richtigen Branch testen (sollte develop sein)

    $ git branch
    
  • Wenn es nicht develop ist, zu develop wechseln

    $ git checkout develop
    
  • grunt-cli und bower global installieren

    # npm install -g grunt-cli bower
    
  • Am Besten noch die Rechte der letzten beiden Pakete richtig setzen

    # chmod -R 755 /usr/lib/node_modules/grunt-cli /usr/lib/node_modules/bower
    
  • Restliche Abhaengigkeiten installieren

    $ npm install
    $ bower install
    
  • Konfigurationsdatei erstellen

    $ cp config.json.example config.json
    
  • Das SESSION_SECRET in config.json aendern, z.B. mit pwgen, der Rest der Datei kann so belassen werden

    $ pwgen -s 50 1
    
  • Datenbank mit Initialwerten befuellen

    $ node src/seed.js
    
  • Starten der Anwendung

    $ npm start
    
  • Im Browser http://localhost:3000 aufrufen

  • Auf Play klicken und unter Register anmelden oder ein schon vorhandenes Konto beim offiziellen HabitRPG exportieren und in der lokalen Instanz importieren (Anleitung siehe unten)

HabitRPG updaten

Ab und zu gibt es am offiziellen HabitRPG Aenderungen, die dann natuerlich auch genutzt werden koennen.
Dazu folgende Schritte ausfuehren (Quelle):

  • Ins Verzeichnis mit dem Code von HabitRPG wechseln und den Code updaten

    $ cd /path/to/habitrpg
    $ git pull origin develop
    
  • Updates installieren

    $ npm install
    $ bower install -f
    

    Wenn du weisst was du tust, kannst du auch die Abhaengigkeiten updaten:

    $ npm update
    $ bower update
    
  • Und HabitRPG wieder starten :)

    $ npm start
    

Datenexport und -import (zentral nach lokal)

Um ein schon vorhandenes Konto im offiziellen HabitRPG im lokalen zu nutzen, muessen die Daten erst exportiert werden. Dazu am Besten alle drei Dateien unter Export (history.csv, userdata.xml, userdata.json) herunterladen.
Da in den Daten kein Passwort vorhanden ist, kann ein temporaeres Passwort (in diesem Fall test) in userdata.json eingefuegt werden, um sich damit einloggen zu koennen. Das Passwort sollte danach direkt wieder geaendert werden!
Dazu die Datei userdata.json mit einem Texteditor oeffnen und die Zeile mit dem Wort email suchen. An das Ende der Zeile dann ein Komma anhaengen und folgendes in die naechsten zwei Zeilen schreiben:

"salt" : "f45185359d",
"hashed_password" : "b04475ce5a970087602f702ffec1af6e4a2eb73e"

Danach die Datei schliessen und mit folgendem Befehl in MongoDB importieren (zuerst gab es bei mir eine Fehlermeldung beim Import, daher am Besten noch --jsonArray anhaengen (Quelle)):

$ mongoimport --db habitrpg --collection users --file userdata.json --jsonArray

Nun kann sich ganz normal eingeloggt werden (mit dem Benutzernamen wie bei der offiziellen Version und dem Passwort test).

Datensicherung

Was manuell geht, geht natuerlich auch automatisch: die Sicherung der Daten.
Die koennen jetzt direkt per mongodump und einem Cronjob gesichert werden und ggf. per mongorestore wieder eingespielt werden.

$ mongodump --db habitrpg --out ~/backup

Der Cronjob koennte so aussehen:

$ crontab -e
@daily mongodump --db habitrpg --out $HOME/backup

Und die Backupdateien koennten dann z.B. in einem Gitrepository gesichert werden.

[An dieser Stelle schwand etwas meine Lust ;)]

Update (2014-07-18): Eingespielt werden koennen die Daten ueber folgenden Befehl (Quelle):

$ mongorestore --drop ~/backup/habitrpg

HabitRPG auf einem Server mit SSL aufsetzen

Das wollte ich heute (2014-07-18) mal nachholen, bin aber klaeglich gescheitert. Es existiert dafuer natuerlich wieder keine Doku, und auch herumprobieren (eher stochern) hat mich nicht weitergebracht.

Ueber jegliche Hilfe bin ich sehr dankbar! :)

Allerdings war mein erstes Problem, dass ich nichtmal die unverschluesselte Version mit Chromium aufrufen konnte, was an HSTS lag :(
Warum gibt es da nicht die Moeglichkeit, die Ports oder auch nur einzelne Ports/Subdomains zu ignorieren?
Naja, geloescht werden kann die jeweilige Domain in den Einstellungen von Chromium, dazu einfach folgendes in die Adressleiste eingeben (Quelle):

chrome://net-internals/#hsts

Unter "Delete domain" kann die Domain nun entfernt werden.

Update (2014-07-19): Hehe, neuer Tag, neues Glueck - so schnell gebe ich nicht auf ;)

Habe es nun hinbekommen. Den entscheidenden Tipp fand ich in diesem Blog, nach einer kurzen Suche nach "lighttpd npm" :)

Bei gleichbleibender config.json muss nur folgendes in die Konfigurationsdatei von lighttpd (siehe dazu auch mein Artikel zum absichern von lighttpd):

server.modules += ( "mod_proxy" )

$HTTP["host"] == "subdomain.domain.tld" {
    proxy.server = ( "" => ( (
        "host" => "127.0.0.1",
        "port" => "3000" )
    ) )
}

Und lighttpd neustarten:

systemctl restart lighttpd

Damit nun nicht mehr via http und Port 3000 auf HabitRPG zugegriffen werden kann, einfach den Port in der Firewall zumachen (Quelle) ;)

HabitRPG sollte auf dem Server am Besten unter einem extra User laufen, der z.B. so erstellt werden kann:

# useradd -d /home/habitrpg -s /bin/nologin habitrpg

Um direkt mit dem System zu starten, reicht bei systemd folgendes (z.B. in /etc/systemd/system/habitrpg.service):

[Unit]
Description=HabitRPG
After=syslog.target network.target

[Service]
Type=simple
User=habitrpg
WorkingDirectory=/home/habitrpg
ExecStart=/usr/bin/npm start
ExecStop=/usr/bin/npm stop

[Install]
WantedBy=multi-user.target

Aktivieren und starten dann mit folgenden Befehlen:

# systemctl enable habitrpg.service
# systemctl start habitrpg.service

Update (2014-08-17): Nach laengerem Laufen haben wir festgestellt, dass der Service das Log zuspammt (einzusehen via journalctl -e). Dies kann durch zwei Wege verhindert werden: alles nach /dev/null, also ins Nichts leiten oder (praeferiert) HabitRPG im Produktivmodus laufen lassen (bisher lief es im Entwicklungsmodus).

Fuer beide Wege gilt: erst mal den Service stoppen:

# systemctl stop habitrpg.service

Ersteres laesst sich dann durch folgende ergaenzende Zeile (bei [Service]) in /etc/systemd/system/habitrpg.service bewerkstelligen:

StandardOutput=null

Zweiteres durch den Austausch der ExecStart-Zeile durch folgende Zeilen ...

ExecStartPre=/home/habitrpg/node_modules/.bin/grunt build:prod
ExecStart=/home/habitrpg/node_modules/.bin/grunt nodemon

... und den Austausch der NODE_ENV-Zeile in /home/habitrpg/config.json durch folgende Zeile (also quasi development in production aendern):

"NODE_ENV":"production"

In beiden Faellen dann den Service neuladen und starten:

# systemctl daemon-reload
# systemctl start habitrpg.service

HabitRPG sollte nun nicht mehr das Log zuspammen und/oder im Produktivmodus laufen :)

Es war uebrigens wieder ein K(r)ampf, das alles herauszufinden, da der Produktivmodus ueberhaupt nicht dokumentiert ist ..
Letztendlich geholfen hat das Lesen des Codes (Gruntfile.js und Procfile) ..

Update (2014-11-13): Ein paar Mal hab ich inzwischen auf die neueste Version geupdated, dabei ist die best practice, den HabitRPG-Ordner zu verschieben (mv habitrpg habitrpg.bak-$(date +%F)), neu zu klonen (git clone https://github.com/HabitRPG/habitrpg.git), Abhaengigkeiten zu installieren (cd habitrpg ; npm install ; bower install) und die alte Konfigurationsdatei zu kopieren (cp ../habitrpg.bak-.../config.json .). Ggf. die Konfigurationsdatei an die neue Example-Datei anpassen (diff config.json config.json.example).
Beim jetzigen Mal wollte HabitRPG aber einfach nicht starten (weder mit npm start (und development) noch mit ./node_modules/.bin/grunt build:prod;./node_modules/.bin/grunt nodemon; (und production)). Der Fehler war dieser hier:

/home/habitrpg/node_modules/winston/lib/winston/logger.js:435
  var instance = created ? transport : (new (transport)(options));
                                        ^
TypeError: undefined is not a function
    at Logger.add (/home/habitrpg/node_modules/winston/lib/winston/logger.js:435:41)
    at Object.<anonymous> (/home/habitrpg/src/logging.js:11:16)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/home/habitrpg/src/server.js:7:15)
    at Module._compile (module.js:456:26)
[nodemon] app crashed - waiting for file changes before starting...

Ich hab nicht wirklich Ahnung vom Code, daher tippe ich einfach mal, dass das Problem an New Relic liegt, was ich aber nicht nutze (die Angaben in der Konfigurationsdatei habe ich so gelassen). Einfachster Weg ist hier, den Logger einfach nicht zu aktivieren. Dazu wird in der Datei src/logging.js folgende Zeile

logger.add(winston.transports.newrelic, {});

durch diese ersetzt:

// logger.add(winston.transports.newrelic, {});

Danach laesst sich HabitRPG wie gewohnt starten. Natuerlich habe ich auch diesmal nichts im Internet gefunden, und ich glaube auch, dass dieser Eintrag der einzige im Internet ist, der die Produktivinstallation von HabitRPG halbwegs nutzbar beschreibt (ausser vielleicht interne Firmendokumentationen ;)). Naja ;)

Erweiterte Rechte

Der Vorteil bei einer lokalen Installation ist nicht nur der Datenschutzaspekt, sondern auch die erweiterten Rechte ;)
So kann das eigene Konto mit Adminrechten und Edelsteinen ausgestattet werden, um alles machen zu koennen, was normalerweise Geld kostet. Das soll natuerlich nicht fuer alles genutzt werden, sonst macht das nicht mehr so viel Sinn ;)

Dazu folgende Schritte ausfuehren:

  • User-ID z.B. hier finden und kopieren. Eine Beispiel-ID ist:

    05e3c0da-f47f-4cb4-be3c-7ab12093ceaf
    
  • In der Datenbank einloggen (Quelle)

    $ mongo habitrpg
    
  • Adminrechte setzen:

    > db.users.update({_id: '05e3c0da-f47f-4cb4-be3c-7ab12093ceaf'}, {$set: {contributor: {"admin":1}}})
    
  • Nun koennen in der Halle der Helden noch einige Einstellungen veraendert werden, unter anderem koennen bei Saldo Edelsteine verliehen werden oder die Werbung abgeschaltet werden.

Noch ein Einwurf, dann gehts weiter im Text ;)
Diese Website waere ja langweilig, wenn es nicht noch ein bisschen geekiger gaenge, so bin ich eben ueber HabitRPG fuer die Kommandozeile gestolpert :D
Getestet habe ich es noch nicht, es steht aber als TODO in meiner lokalen HabitRPG-Instanz ;)

.. und weiter im Text ..

Nach einiger Eingewoehnungszeit finde ich HabitRPG bisher sehr gut. Es laeuft nun seit ca. einem Monat und ich bin sehr zufrieden damit.
Insgesamt bin ich der Meinung, dass dieses Programm wirklich hilft, denn der Anreiz, den Charakter zu leveln und Straehnen-Bonus/Perfekte Tage zu bekommen, ist recht hoch.
Auch der Wettbewerb mit anderen hilft dabei, Dinge auch tatsaechlich umzusetzen.

Es macht jedenfalls viel mehr Spass, die TODO-Liste abzuarbeiten und Gewohnheiten zu veraendern, als wenn es keine "Belohnung" gibt.
Natuerlich ist aber der erste Schritt, die Gewohnheit zu bilden, HabitRPG zu nutzen, ansonsten bringt auch die ganze Gamifizierung nichts ;) Allerdings war das fuer mich kein Problem: ich glaube, es liegt an meiner Begeisterung :D
Es hilft, die Website immer offen zu lassen und z.B. bei Chromium als "pinned Tab" zu nutzen.

Ein paar Tipps:

  • meiner Meinung nach sind die taeglichen Aufgaben besser dafuer geeignet, eine Gewohnheit aufzubauen, da diese quasi Pflicht sind und bei Nichterledigung Punkte abziehen, waehrend bei "Gewohnheiten" einfach nichts passiert.
  • fuer unterwegs gibt es eine App fuer Android und iOS
  • am Anfang moeglichst wenig Geld ausgeben fuer die Belohnungen (also Schwerter oder Ausruestung), da ab Level 10 die Klasse gewechselt werden kann und nur bei der Klasse Krieger diese Belohnungen etwas nutzen. Alle anderen Klassen bekommen andere Belohnungen freigeschaltet.
  • nutzt den Wettbewerb mit anderen Leuten bzw. schaut euch in der Liste mit allen Wettbewerben um, vielleicht entdeckt ihr ja etwas neues.

Ich finde es jedenfalls erstaunlich, wie gut ich mich damit selbst austricksen kann und von mir vorgegebene Dinge auch wirklich umsetze. Das hat bisher immer nicht so gut geklappt (ausser bei wirklich grossen Dingen wie vegetarisch zu leben oder so).
Obwohl ich einige Blogs lese, die ueber Produktivitaet und Persoenlichkeitsentwicklung im Allgemeinen schreiben (wie Steve Pavlina, Leo Babauta, Markus Cerenak, ..), sowie einige Buecher zu diesen Themen wie focus, Zen To Done oder 52 Changes gelesen habe, gelang es mir auf Dauer nicht, gewisse Dinge auch wirklich umzusetzen.
Das wird sich nun aendern ;)

Ein Beispiel: ich hatte mir schon laenger vorgenommen, nur noch mit 10 Fingern zu schreiben. In Verbindung mit Tipp10 wurden meine Fortschritte schon besser, allerdings bin ich nie dauerhaft dabei geblieben, was ich nun aber tue. Grossartig. Und das nach nur ein paar Wochen :)

Ein positiver Aspekt hat die Nutzung von HabitRPG noch: da die deutsche Uebersetzung an einigen Stellen noch ziemlich mies ist, hab ich dabei geholfen, HabitRPG zu uebersetzen :)

So, und nun viel Spass beim Unprokrastinieren ;)

add-folder-to-archiveImmer wieder hab ich mich nun schon mit automatischer Versionierung beschäftigt. Aber leider waren die Ansätze meist zu aufwendig oder auch zu umständlich – wenigstens für das was ich eigentlich haben wollte. Äh …. haben wollte …. ja was wollte ich denn anderes haben als die anderen?

Naja, ich bin kein Entwickler in dem Sinne. Mit geht es überwiegend darum Konfigurationsdateien und deren Änderungen halbwegs im Auge zu haben, bzw. auch nachvollziehen zu können welche Änderungen vorgenommen wurden um ggf. Fehler zu finden. Also möchte ich kein grossartiges ein- oder auschecken, keinen zentralen Server auf dem das “Master Branch” liegt oder so. Nö.

Nun gibt es verschiedene Ansätze. EtcKeeper sei da genannt und man findet auch diverse Ansätze das ganze über inotify zu automatisieren. EtcKeeper hat mir persönlich zu viel selbst gemacht. Die Lösungen mit inotify haben ihren Sinn und Zweck, allerdings für mich ein wenig übertrieben. Ich wollte das einfacher.

Ganz normales Handwerkszeug

Meine Lösung benötigt lediglich cron, git und gitk.

Beispielsweise /etc initialisieren:

cd /etc

git add .

Nun folgende Zeile in die crontab:

0 19 * * * root cd /etc; /usr/bin/git add -A; /usr/bin/git commit -a -m "autoupdate"

Fertig.

Die Zeiten kann man natürlich nach Lust und Laune anpassen und ggf. auch öfter am Tag einen Abgleich durchführen … je nach dem wie viele verschiedene Leute auf einem System arbeiten und wie viel dort passiert. GitK in dem entsprechenden Verzeichnis aufgerufen zeigt nun schnell einen Überblick über die letzten Änderungen (natürlich auch mit den git Befehlen auf der cli).

Für mich eine echt gute Lösung.

Wenn man sich für seinen SSH Zugang nur noch mit einem entsprechenden Schlüsselpaar anmeldet, kann man die Authentifikation per Passwort deaktivieren. Dazu wird die „/etc/ssh/sshd_config“-Datei in einem Editor geöffnet:

nano /etc/ssh/sshd_config

Dort wird die Option:

# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes

gesucht und in:

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

geändert. Anschließend muss der SSH Server mittels:

service ssh restart

neugestartet werden. Damit ist die Anmeldung per Passwort nicht mehr möglich und der Server ein Stück sicherer.

Bei OpenNews handelt es sich um ein Projekt von Mozilla und der Knight Foundation mit dem Ziel, dem Journalismus im offenen Web zum Erfolg zu verhelfen. Das Projekt befindet sich in seinem vierten Jahr, die Bewerbungsphase für Fellowships in 2015 ist nun offen.

Knight-Mozilla ist eine Kooperation von Mozilla und der Knight Foundation. Bei der Knight Foundation handelt es sich um eine Stiftung, die Projekte fördert, welche dem Journalismus zu mehr Qualität verhelfen und Medien-Innovationen voranbringen. Außerdem setzt sich die Stiftung weltweit für die Rechte von Journalisten ein. Knight-Mozilla sucht für OpenNews neue Entwickler und Technologen, welche zehn Monate lang zusammen mit Reportern, Designern und anderen Entwicklern zusammenarbeiten wollen. Gemeinsam sollen Open Source-Lösungen geschaffen werden, welche Probleme bezüglich Nachrichten lösen. Die zehnmonatige Zusammenarbeit wird natürlich auch bezahlt, weitere Informationen dazu gibt es auf dieser Seite. Zu den News-Partnern 2015 gehören The Guardian, La Nacion, NPR, Vox Media, Center for Investigative Reporting, New York Times sowie die Washington Post. Bewerbungen werden ab sofort entgegengenommen, Bewerbungsschluss ist der 16. August 2014.

Im Oktober des vergangenen Jahres hatte die Knight Foundation angekündigt, die Partnerschaft mit Mozilla um weitere drei Jahre fortzusetzen und das Projekt mit weiteren vier Millionen Dollar unterstützt. Im Rahmen von OpenNews wurden bereits über 50 Software-Projekte umgesetzt, unter anderem Tabula, ein Werkzeug, um Daten aus PDF-Dateien zu extrahieren, welches von mehr als einem Dutzend Organisationen, darunter ProPublica und der New York Times, eingesetzt wird.

17. Juni 2014

Der App Manager ist ein in Firefox integriertes Werkzeug, welches das Testen und Debuggen von Firefox OS-Apps mittels Simulator Add-ons oder aber auch auf einem realen Gerät erlaubt. Mozilla arbeitet an einem komplett neuen App Manager, welcher ab Firefox 33 aktiviert werden kann und auch die Erstellung neuer Apps ermöglicht.

Ob der neue App Manager bereits in Firefox 33 standardmäßig den alten App Manager ersetzen wird, steht noch nicht fest. Über about:config kann dieser aber in jedem Fall in den Nightly Builds von Firefox 33 aktiviert werden (devtools.webide.enabled). Bereits der Name dieser Einstellung ist interessant, Web IDE, der Name verspricht also eine integrierte Entwicklungsumgebung für Web(-Apps). Tatsächlich erweitert Mozilla den Funktionsumfang des App Managers, dieser erlaubt nicht mehr nur das Debugging bestehender Apps, sondern auch das Erstellen neuer Apps.

Die auffälligste Neuerung ist zunächst einmal aber etwas vollkommen anderes: Das Design hat sich komplett verändert und der App Manager findet nicht mehr länger in einem Tab Platz (vgl. Bilder vom alten Design), sondern ist nun ein eigenständiges Fenster. Grundsätzlich findet sich hier dieselbe Funktionalität wie im bisherigen App Manager. Wer kein Smartphone mit Firefox OS besitzt, wird sich zunächst noch einen Firefox OS Simulator als Add-on herunterladen. Praktisch: Es können verschiedene Versionen von Firefox OS parallel installiert werden, so dass es sich mit verschiedenen Firefox OS-Versionen testen lässt.

Bereits angesprochen ist die Möglichkeit, neue Apps zu erstellen. Interessant hierbei: Es gibt sogenannte Templates, also Vorlagen, welche bereits ein wenig Boilerplate-Code beinhalten. Aktuell handelt es sich dabei um ein einziges Template, welches nicht sehr viel vorgibt, aber die Tatsache, dass ein Auswahlfenster für Templates erscheint, legt die Vermutung nahe, dass hier mehr zu erwarten ist. Über about:config kann sogar die Template-Quelle konfiguriert werden (devtools.webide.templatesURL), dabei handelt es sich um ein ganz einfaches JSON-Array auf einer beliebigen Webseite. App-Entwickler können sich also ihre eigenen Vorlagen erstellen oder sogar anderen Entwicklern zur Verfügung stellen. Nach der Auswahl eines Templates werden die dazugehörigen Dateien angezeigt, welche direkt im App Manager bearbeitet werden können. Auch eine Autovervollständigung für CSS und JavaScript gibt es, letzteres sogar mit Dokumentation.

Vor einiger Zeit, musste ich von einem Linux Server, über LDAP, auf ein Windows Server Active Directory zugreifen. Ziel war es, einige Daten von Usern abzufragen und weiter zu verarbeiten. Darunter gab es auch Datumsangaben welche benötigt wurden. Beim ersten Blick darauf sah es wie ein gewöhnlicher Timestamp aus.

Als Linux Anwender habe ich mir zunächst nichts weiter dabei gedacht und das Datum wie gewohnt formatiert. Und genau hier begann das Problem!

Das Ergebnis war vollkommen falsch und ergab zuerst überhaupt keinen Sinn. Beim zweiten Blick bemerkte ich auch den ungewöhnlich langen String des Zeitstempels. Wo lag nun der Denkfehler? Ganz naiv, bin ich von einem Unix-Timestamp ausgegangen. Dieser existiert in der Windows Welt natürlich nicht. Nach kurzer Recherche im Internet fand ich heraus, dass Windows mit der Zeitrechnung am 01.01.1601 beginnt.

Überblick über die Zeitstempel

Unix-Timestamp
Berechnung ab: 01.01.1970 – 00:00:00 UTC
Angegeben wird die Zeit in Sekunden seit Beginn der Rechnung.

Windows-Timestamp
Berechnung ab: 01.01.1601 – 00:00:00 UTC
Angegeben wird die Zeit in 100-Nanosekunden-Intervallen seit Beginn der Rechnung.

Berechnung

Bei der Umrechnung gilt es nun zwei Punkte zu beachten. Ersten muss der Windows Zeitstempel in Sekunden umgerechnet werden und zweitens, muss die Differenz zwischen 1601 und 1970 (11644473600 Sek.) abgezogen werden. Schaltsekunden werden zum Glück nicht berücksichtigt.

Umrechnung in Sekunden:
Win-Timestamp / 10000000

Differenz zwischen 1601 und 1970 subtrahieren:
Win-Timestamp-in-Sekundden - 11644473600

Ganze Formel:
( Win-Timestamp / 10000000 ) - 11644473600 = Unix-Timestamp

Nachkommastellen bei der Division können vernachlässigt werden.

Beispiel für ein Datum

14.06.2014 14:47:25 Mitteleuropäische Sommerzeit

Win-Timestamp: 130472236456387269

Unix-Timestamp: 1402750045

Wie Eric Anholt in seinem Blog verlauten lässt, wechselt er seine bisherige Arbeitsstelle und arbeitet nun für Broadcom. Das ist eigentlich relativ uninteressant, wäre da nicht noch eine weitere Ankündigung seinerseits.

Bei seinem neuen Brötchengeber hat er damit angefangen einen unter der MIT-Lizenz stehenden MESA und DRM-Kernel-Treiber für den_BCM2708-Chip zu programmieren, der im Raspberry Pi verbaut ist.

Das ganze wird allerdings noch etwas dauern. Sobald die ersten Ergebnisse vorhanden sind, wir Anholt diese auch in einem Repository bereitstellen.

Da der Kerl vorher bei Intel war, hege ich die Hoffnung, dass hierbei mal etwas qualitativ Hochwertigeres entsteht. Wer einen WLAN-Chip von Broadcom unter Linux nutzt, weiß was mich meine…

Einige Compiz Attribute lassen sich mit Hilfe von dconf variieren.

So etwa alle Fensteranimationen:

1
2
3
4
5
dconf write /org/compiz/profiles/unity/plugins/animation/close-effects  "['animation:None']"
dconf write /org/compiz/profiles/unity/plugins/animation/open-effects  "['animation:None']"
dconf write /org/compiz/profiles/unity/plugins/animation/minimize-effects  "['animation:None']"
dconf write /org/compiz/profiles/unity/plugins/animation/unminimize-effects  "['animation:None']"
dconf write /org/compiz/profiles/unity/plugins/animation/focus-effects  "['animation:None']"
Gut zu wissen: dconf speichert lediglich geänderte Compiz Attribute. Es darf nicht als der zentrale Speicherort der Einstellungen betrachtet werden. Hierzu dient der CompizConfig Einstellungs-Manager (CCSM)

Ein Zurücksetzen aller Änderungen ist möglich:

1
gsettings reset-recursively org.compiz

16. Juni 2014

Nach einem php5-fpm Update auf einem Debian System spuckte der Nginx wie auch Apache Server folgende 500 Fehlermeldungen aus:

Durch ein Update von PHP5 wurde ein alter Security Bug gefixt. Nginx sowie auch Apache Webserver werden nach einem Neustart möglicherweise Fehler im Error Log liefern:

Nginx Fehlermeldung:

connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied) while connecting to upstream

Apache Fehlermeldung:

(13)Permission denied: FastCGI: failed to connect to server "...": connect() failed

Lösung des Problems:

Konfigurationsfile editieren…

vi /etc/php5/fpm/pool.d/www.conf

und folgende Punkte hinzufügen bzw. auskommentieren (Strichpunkt enfernen):

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

Nach der Änderung sollte der PHP-FPM Prozess neu gestartet werden

/etc/init.d/php5-fpm restart

SysADMINsLife auch auf Facebook | Google+ | Twitter | Youtube | Google Currents
Copyright © 2009-2015 - Der Feed ist nur für den persönlichen, nicht für den gewerblichen Gebrauch bestimmt und Inhalt des Angebotes von www.sysadminslife.com

Nach dem Upgrade von Ubuntu 12.04 auf 14.04 war direct rendering deaktiviert, was mir erst überhaupt nicht auffiel. Es ist aber ziemlich normal, denn das Upgrade war auch ein Wechsel von fglrx auf den radeon-Treiber, das gibt immer mal wieder Probleme. Diesmal wurde die swrast_dri.so nicht gefunden:

onli@Fallout:~$ glxinfo
name of display: :0.0
libGL error: dlopen /usr/lib/dri/swrast_dri.so failed (/usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory)
libGL error: unable to load driver: swrast_dri.so
libGL error: failed to load driver: swras
display: :0  screen: 0
direct rendering: No (If you want to find out why, try setting LIBGL_DEBUG=verbose

Lösung auf meinem 32-bit-System:

sudo ln -s /usr/lib/i386-linux-gnu/dri /usr/lib/dri

15. Juni 2014

Muss man ein Projekt planen, kann man das natürlich mit allerlei Software tun. Es gibt kommerzielle Produkte und auch allerlei freie bzw. quelloffene Programme, die einen Projektmanager bei seiner Arbeit unterstützen sollen. Da man aber bei jeder Art von Projekt mit mehreren Personen zusammen arbeiten muss, bietet es sich eigentlich an, eben nicht alles auf dem heimischen Rechner im stillen Kämmerlein zu installieren, sondern auf einem Server eine wie auch immer geartete Planungssuite zu haben, auf dass dann alle Projektteilnehmer zugreifen können. Es gibt gerade für große Planungen sicher auch alle möglichen (kommerziellen) Dienste, aber die sollen hier kein Thema sein.

Bei meiner Recherche bin ich auf zwei interessante Möglichkeiten, die hier kurz vorstellen möchte.

Das Logo von LibrePlan
Das Bild von Regocasasnovas steht unter CC-BY-SA

LibrePlan

Ursprünglich hieß die Software NavalPlan und wurde ursprünglich vom Industrieministerium der galicischen Regionalregierung finanziert. Der Name lässt schon vermuten, dass es ursprünglich um Schiffe ging. Da das Ergebnis der Entwicklung aber universell einsetzbar war, benannte man die in Java geschriebene Software um und veröffentlichte sie 2010 auf Sourceforge.net. Nun steht die sehr umfangreiche Planungssuite unter AGPL und kann kann frei runtergeladen und unter Ubuntu sehr einfach über ein PPA installiert werden.

Um sie zu testen und mit ihr lokal zu arbeiten (es ging nur um ein Planspiel, so wurden alle Netzfunktionalitäten nicht gebraucht) hatte ich sie in einer virtuellen Maschine installiert. Das ging ohne Probleme und erste Tests waren wirklich vielversprechend. Man kann gut Abhängigkeiten von Phasen, etc abbilden, Milestones setzen und recht einfach per

Gantt-Chart in LibrePlan
Gantt-Chart in LibrePlan

Drag&Drop umplanen. Generell merkt man, dass LibrePlan durchdacht ist und gerade für große Infrastrukurprojekte entworfen ist. So kann man externe Firmen, Materialien, Kunden und eigene Ressourcen unter einer Oberfläche verwalten und auch QS-Maßnahmen durch entsprechende Formulare und Zuständigkeiten durchführen. Und für Kommunikation mit Kunden und Partnern, bzw. für die Dokumentation kann man, sofern man vorher fleißig Daten eingepflegt hat Berichte generieren und in diversen Formaten auch exportieren und per E-Mail verschicken.

Muss man mehr als ein Projekt planen, womöglich sogar ähnliche direkt hintereinander bietet LibrePlan auch die Möglichkeit Vorlagen zu erstellen, so muss man sich die gleiche Arbeit nicht zwei mal machen. Ein weiteres “Gimmick” ist eine App für Android, mit der jeder Mitarbeiter seine Arbeitspakete anschauen und bearbeiten kann.

Fazit

Ausgereifte Software, mit vielen Funktionen. Eher geeignet für große Projekte und/oder für Unternehmungen, die oft Projekte durchführen müssen. LibrePlan braucht allerdings ein paar Ressourcen, da ein Applikationsserver benötigt wird. So kann man die Projektsoftware nicht so einfach auf einem shared Hoster installieren.

 

Logo OpenProjectOpenProject

Da ich nun für ein zweites Projekt wirklich auf einen Webdienst angewiesen war, also nicht Lokal in der VM arbeiten konnte, und bei uberspace.de keinen eigenen Tomcat habe, fiel die Nutzung von LibrePlan ins Wasser und ich musste mich nach anderen Möglichkeiten umsehen. Schon nach kurzer Recherche stieß ich auf OpenProject, dass kurz zuvor in Version 3.0 erschienen war. Da die beiden Projekte sich ähneln, werde ich jetzt eher auf die Unterschiede eingehen. Auch hier kann man Arbeitspakete und deren Abhängigkeiten abbilden, die Software ist jedoch eher auf Softwareentwicklung ausgelegt. So gibt es direkte Anbindung an svn und git, sofern diese auf dem gleichen Server installiert sind (Commits können direkt im Paket angezeigt werden, wenn man in die Nachricht die Nummer angibt). Und es gibt ein Plugin, die die Arbeitsweise mit agiler Softwareschmieden (Strichwort: SCRUM) leicht machen sollen. Überhaupt gibt es ein paar spannende Plugins, die man hinzuschalten kann. Möchte man z.B. auch Dateien hinzufügen, Besprechungen verwalten (sehr praktisch!), eine eigene Projektwiki oder github.com anbinden kann man bei der Installation diese Extramodule aktivieren. Im Umkehrschluss heißt das: Benötigt man bestimmte Funktionen nicht, kann man sich den Serverplatz einfach sparen.

Auch OpenProject kann man vor der Installation auf dem eigenen Server testen. Und das noch komfortabler als LibrePlan. Man bekommt mit nur ein paar Klicks eine eigene Testinstanz, mit der man rumspielen kann. Nach 30 Tagen wird dann die Instanz und mit ihr alle Daten gelöscht.

Nachteile gibt es allerdings auch hier: OpenProject ist einfach noch nicht so komfortabel wie LibrePlan. Das fängt schon bei der Installation an. Es gibt zwar neuerdings deb-Pakete, dieses beinhaltet aber keine Plugins und man müsste diese dann von Hand nachinstallieren. Auch sonst ist alles ein bisschen starrer. So kann man Paketnamen und Beschreibungen nicht einfach editieren. Vielleicht ist dies auch beabsichtigt, ich hätte aber gerne die Option dazu. Auch kann man nicht so schön einfach Pakete oder ganze Arbeitspaketbäume per Drag & Drop umplanen. In vielen Fällen bleibt nichts anderes übrig, als Duplikate zu erstellen und die Originale dann zu löschen. Das ist besonders ärgerlich, wenn schon auf das Paket gearbeitet wurde und mit veränderter Paketnummer auch alle Verweise flöten gehen.

Fazit

Gute Software, die das Planen und Durchführen, vor allen Dingen von Softwareprojekten leicht macht. Gute Integration von VCS und nützliche Features, die sich durch Plugins an und ausschalten lassen. Dazu auch Shared Hoster geeignet. Wären die Abzüge in der B-Note nicht, wäre es eine perfekte Software. Aber schon jetzt ist OpenProject für kleinere und mittlere Unternehmungen geeignet.

Zum Blog: www.lioman.de

Ich habe mir nach langer Zeit mal wieder einen neuen Wallpaper mit dem Open Source Programm Gimp designt und möchte ihn hier zum Download zu Verfügung stellen.
Wie alle Wallpaper von mir hat auch dieser einen Namen Bekommen, SoxDev, der hat aber keine besondere Bedeutung.
Als Format habe ich 1920×1080 px gewählt und ihr könnt durch einen klick auf dass Bild den Wallpaper mit dieser Auflösung downloaden.

Wer den Wallpaper auf seinem Blog vorstellen möchte dem möchte ich bitte an die Verlinkung auf diesen Blog Beitrag erinnern.

Quelle - Wallpaper von mir
Quelle – Wallpaper von mir

Viel Spaß beim benutzen. 🙂

Firefox 32 kommt mit einer Funktion zur Übersetzung von Webseiten. Mozilla wird dieses neue Feature mit Nutzern der deutschsprachigen Aurora-Version von Firefox testen.

Mozilla integriert in Firefox 32 ein neues Feature, welches anderssprachige Webseiten per Knopfdruck übersetzen kann. Standardmäßig aktiviert wird dieses Feature noch nicht in der finalen Version von Firefox 32 sein, in jedem Fall wird Mozilla einen Test dieser Funktion speziell mit den deutschsprachigen Aurora-Nutzern von Firefox 32 machen (Bug 1021921, Bug 1022411). Die Übersetzungen kommen dabei von Microsofts Übersetzungs-Dienst.

Voraussetzung zur Teilnahme am Test sind neben einer deutschsprachigen Aurora-Version aktivierte Telemetrie-Experimente (standardmäßig aktiviert). Das Feature wird für 50 Prozent der Nutzer aktiviert werden, für die anderen 50 Prozent nicht, und das für eine Dauer von mindestens drei, maximal sechs Wochen. Es handelt sich dabei um einen Testlauf für den eigentlichen Testlauf, der zu einem späteren Zeitpunkt geplant ist.

Unabhängig davon kann das Feature bereits von jedem Nutzer von Firefox Aurora oder Firefox Nightly aktiviert werden, indem die beiden Schalter browser.translation.detectLanguage und browser.translation.ui.show per about:config auf true geschaltet werden. Allerdings wird dies alleine nicht reichen, da Mozilla die Nightly- und Aurora-Versionen bislang noch ohne dafür notwendigen API-Schlüssel ausliefert. Wer das Feature aber jetzt schon testen möchte, kann sich mit seinem Microsoft-Konto im Windows Azure Marketplace registrieren und für die Microsoft Translator API anmelden. In Firefox müssen über about:config dann noch die beiden Schalter browser.translation.bing.clientIdOverride und browser.translation.bing.apiKeyOverride mit der selbst vergebenen Client-ID respektive des von Microsoft erhaltenen API-Schlüssels angelegt werden. Bis zu zwei Millionen Zeichen pro Monat sind kostenlos. Dies wird zu einem späteren Zeitpunkt natürlich nicht mehr notwendig sein und die Nutzung des Features in jedem Fall kostenlos sein, egal wie intensiv der Nutzer Gebrauch von dieser Firefox-Funktion macht. Die Einschränkung gilt nur für den eigenen API-Schlüssel, welcher notwendig ist, um das Feature bereits jetzt zu testen.

Die Entwickler von Firebug, der wohl beliebtesten Firefox-Erweiterung für Webentwickler, haben Firebug in Version 2.0 veröffentlicht. Die neue Version nutzt Mozillas aktuelle Debugging-Engine JSD2, kommt mit einem überarbeiteten Design und vielen neuen Features.

Ende März wurde die erste Alpha-Version von Firebug 2.0 veröffentlicht, zeitgleich mit der Veröffentlichung von Firefox 30 wurde auch die finale Version von Firebug 2.0 veröffentlicht. Firebug 2.0 setzt mindestens Firefox 30 voraus.

Die wichtigste Neuerung von Firebug 2.0 ist, dass Firebug nun auch die Firefox Debugging Engine JSD2 einsetzt, womit viele JSD1-bedingte Probleme der Vergangenheit angehören; insbesondere die Performance hatte teilweise stark unter JSD1 gelitten. Das neue Design lässt Firebug moderner und besser ins Betriebssystem integriert wirken, alte Firebug-Nutzer finden sich aber sofort zurecht, da die Veränderungen vor allem optische Details betreffen, so ist beispielsweise alles ein wenig flacher und die Farben sind etwas anders, der grundsätzliche Aufbau wurde aber beibehalten. Für viele Apple-Nutzer wichtig: Firebug 2.0 ist auch für HiDPI-Bildschirme aka Retina-Displays optimiert.

Weitere Highlights von Firebug 2.0 sind die Verwendung des CodeMirror-Editors, Syntax Highlighting im HTML-Bearbeiten-Modus, CSS-Bearbeiten-Modus und für JavaScript im Script-Panel, eine Funktion zur Quellcode-Formatierung, besonders praktisch bei minimierten Scripts, eine Autovervollständigung für den Befehlseditor, Autovervollständigung für HTML-Attribute und CSS-Eigenschaften im HTML-Panel, die Unterstützung von CSS Selektoren und Regulären Ausdrücken für die Suche im HTML-Panel, ein DOM-Event-Inspektor, eine Option zur Gruppierung von Nachrichten in der Konsole, die Möglichkeit neue Attribute zu Tags im HTML-Panel durch Klicken auf eine schließende Klammer hinzuzufügen oder das Anzeigen von CSS Farbwerten, so wie sie im Stylesheet angegeben worden sind. Dies ist nur eine Auswahl neuer Features, welche neben zahlreichen Fehlerbehebungen Teil von Firebug 2.0 sind. Im Detail geht die offizielle Release-Ankündigung von Firebug 2.0 auf die Neuerungen ein.

Download Firebug 2.0

Bei meinem kleinem Projekt GameCenter gibt es wieder etwas zu berichten und auch ein neues Screenshot.
Neben den Neuerungen im Quellcode habe ich auch ein neues Bild für die Kopfzeile mit Gimp designt.
Daneben habe ich den Platzhaltern für die Spielbilder auch ein neues Aussehen verpasst was dass Programm schon recht gut darstellen lässt.

Quelle - Bildschirmfoto von GameCenter
Quelle – Bildschirmfoto von GameCenter

Hinzugekommen sind viele neue Funktionen und Fehlerbehebungen die dass Programm brauchbar machen.
Unter den neuen Funktionen befindet sich auch eine Möglichkeit einen Spielstand zu sichern jedoch möchte ich noch dass speichern mehrerer Spielstände einbauen.
Auch habe ich statt Fenster nun Dialoge für dass bearbeiten von Spielen verwendet und viele weitere kleine Änderungen vorgenommen.

Warnung: F2FS ist recht neu im Kernel und noch nicht stabil. Es ist wahrscheinlich keine gute Idee, es für die Rootpartition zu nutzen. Man braucht ein Backup.

F2FS ist ein für NAND-Speicher entworfenes Dateisystem. Eine detaillierte Erklärung ist auf lwn.net. Auf mich wirkte es verlockend, es ist relativ simpel aufgebaut und doch ist klar, warum es für SSDs gut funktionieren sollte. Bisher ist es aber eher im Gespräch für Smartphones und USB-Sticks, auch wenn die initiale Ankündigung explizit SSDs erwähnt. Wahrscheinlich weil ausgewachsene SSDs mit normalen Dateisystemen gut umgehen können.

Unter Ubuntu 14.04 ist es im Kernel, aber nicht in den Installer integriert und es wird nicht beim Boot geladen. Das macht die Installation etwas schwierig. Die Hauptknackpunkte:

  1. Es braucht eine separate Bootpartition mit einem Dateisystem, mit dem Grub umgehen kann
  2. Die initramfs muss das F2FS-Modul integrieren

Mein Szenario ist so: Ich habe ein bestehendes Ubuntu-System auf einer alten Festplatte, /dev/sda mit ext4, frisch auf Ubuntu 14.04 aktualisiert, ohne separate Boot-Partition. Die neue SSD ist unter /dev/sdc (Vorsicht: Mit dem neuen Kernel sind diese Zuweisungen wirklich nicht mehr zuverlässig, die Platten springen. Man muss Labels und UUIDs nutzen). Mein Mainboard hat ein BIOS, kein UEFI.

Zuerst wird mit gparted die SSD formatiert.

Da ich als Partitionstabelle GPT ausgewählt habe, muss auf meinem BIOS-System eine 2MB-Partition ohne Dateisystem mit dem Flag bios_grub am Anfang stehen (ein UEFI-System bräuchte laut Wiki stattdessen eine 200MB große FAT32-Partition mit boot-flag, die später unter /boot/efi eingebunden werden müsste). Dann die boot-Partition mit einem beliebigen Linux-Dateisystem, hier ext2, Label boot. Und schließlich die Root-Partition mit f2fs und Label linuxssd; wie man auf dem Bild sieht, kann gparted damit später nicht mehr umgehen, man muss sich das merken und kann gparteds Arbeit hier nicht kontrollieren.

Nun das alte System auf die SSD kopieren:

sudo modprobe f2fs
sudo mkdir /media/ssd
sudo mount /dev/sdc3 /media/ssd
sudo cp -a / /media/ssd

Das dauert.

Allerdings wird so auch /boot auf sdc3 kopiert, das wollen wir nicht. Also rückgängig und richtig machen:

sudo rm -R /media/ssd/boot/*
sudo mount /dev/sdc2 /media/ssd/boot
sudo cp -a /boot  /media/ssd

Noch ist weder Grub installiert noch die fstab angepasst. Letzteres zuerst. Meine /media/sdd/etc/fstab sieht so aus:

# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
#                
proc            /proc           proc    nodev,noexec,nosuid 0       0

# Linux Root
LABEL=linuxssd   /   f2fs    noatime,discard	0       1
UUID=36a84be5-21aa-4f23-ba29-da62adbe4216   /boot   ext2    defaults    0   0

# have /tmp in ram
tmpfs        /tmp           tmpfs    defaults,noatime    0    0
# have logs in ram
tmpfs        /var/log           tmpfs    defaults,noatime    0    0

Klar, die UUID für /boot muss angepasst werden, entweder per blkid oder mit gparted auslesen. Edit: Stellt sich raus, dass das nicht funktioniert, weil das label nicht unter /dev/disk/by-label aufgeführt wird. Stattdessen muss man derzeit die id verwenden, also statt der LABEL-Zeile:

/dev/disk/by-id/ata-SanDisk_SDSSDHP128G_140203400869-part3     /    f2fs    noatime,discard	0       1

Nun ist es Zeit, in das neue System zu chrooten um den Bootvorgang einzurichten:

sudo mount --bind /dev /media/ssd/dev
sudo mount --bind /proc /media/ssd/proc
sudo mount --bind /sys /media/ssd/sys
sudo chroot /media/ssd

Auf der SSD kann nun die initramfs gefixt werden:

echo "f2fs" >> /etc/initramfs-tools/modules
update-initramfs -u

Dann fehlt nur noch Grub:

Edit: Da update-grub irrigerweise /dev/disk/by-id/… ignoriert und stattdessen /dev/sdc3 einträgt, muss zuerst in der /etc/default/grub

GRUB_DEVICE="/dev/disk/by-id/…"

eingetragen werden. Dann:

grub-install /dev/sdc
update-grub

Jetzt sollte von der SSD Ubuntu mit F2FS gebootet werden können.