Quantcast
Channel: Michael Kofler – kofler.info
Viewing all 274 articles
Browse latest View live

try/catch in Swift 2

$
0
0

In der erste Version von Swift fehlte eine try-catch-Konstruktion zum Umgang mit Fehlern vor. Diese Entscheidung ist vielfach auf Unverständnis gestossen. In Version 2 hat Apple nachgebessert: Es gibt nun eine try/catch-Syntax, die ähnlich wie in anderen Programmiersprachen aussieht, auch wenn sie intern vollkommen anders und insbesondere ohne Exceptions implementiert ist.

Das Wichtigste in aller Kürze

Unzählige Methoden aus dem Foundation-Framework sowie aus anderern Bibliotheken wurden ursprünglich für die Verwendung durch Objective C konzipiert. Bei der Verwendung dieser Programmiersprache, aber auch unter Swift 1.n, liefern diese Methoden true oder false zurück, je nachdem, ob sie erfolgreich waren oder nicht. Die Details über einen eventuell aufgetretenen Fehler können einem NSError-Objekt entnommen werden. Unter Swift 1.n sah ein typischer Aufruf einer Methode mit NSError-Rückgabeparameter wie folgt aus:

// alter Code für Swift 1.n
var err: NSError?
var s = "Hello World!"
// Zeichenkette s in eine Textdatei schreiben
let ok = s.writeToFile("/bla/test.txt",
  atomically: false,
  encoding: NSUTF8StringEncoding,
  error: &err)
if !ok {
  print("Fehler: " + err!.localizedDescription)
}

Für Swift 2 hat Apple die Deklarationen aller derartigen Methoden so abgewandelt, dass diese nun kompatibel zum try-catch-Konzept sind. Der Aufruf derselben Methode zum Speichern einer Textdatei sieht in aktuellen Swift-Versionen so aus:

// neuer Code ab Swift 2
var s = "Hello World!"
do {
  try s.writeToFile("/bla/test.txt",
    atomically: false,
    encoding: NSUTF8StringEncoding)
} catch let err as NSError {
  print("Fehler: " + err.localizedDescription)
}

Wenn Sie weder am Fehler an sich noch an dessen Details interessiert sind, können Sie den obigen Code wie folgt verkürzen. (Das stille Ignorieren von Fehlern ist in der Praxis natürlich selten sinnvoll.)

// neuer Code ab Swift 2
var s = "Hello World!"
do {
  try s.writeToFile("/bla/test.txt",
    atomically: false,
    encoding: NSUTF8StringEncoding)
} catch _ { }

Syntax: do, try, catch, throw und throws

Das folgende Listing fasst die wichtigsten Elemente der try/catch-Syntax in Swift 2 zusammen:

enum MyErrors : ErrorType {
  case TooSmall
  case TooBig(maximum:Int)
  case Missing
  case Other(explanation:String)
}

// Definition von Funktionen, die Fehler auslösen können
func f1(n:Int) throws -> Int {
  if n<0   { throw MyErrors.TooSmall }
  if n>100 { MyErrors.TooBig(maximum: 100) }
  return n+1
}
func f2(n:Int?) throws -> Int {
  if n == nil { throw MyErrors.Missing }
  return n! + 1
}

// Test der Funktionen
do {
  let a = try f1(190)
  let b = try f2(a)
  let c = a / (a-6)  // kann nicht abgesichert werden
  try print(12 + f1(1) +  f2(7))
} catch MyErrors.TooSmall {
  print("Fehler: Parameter zu klein")
} catch MyErrors.TooBig(let maximum) {
  print("Fehler: Parameter zu groß")
  print("Maximalwert = \(maximum)")
} catch {
  print("Ein anderer Fehler:")
  print(error)
}
print("Hier geht es weiter, wenn kein Fehler " +
      "oder ein abgesicherter Fehler aufgetreten ist.")

Nun die Kurzfassung der Syntax:

  • Eigene Fehlercodes werden in der Regel als Enumeration formuliert. Grundsätzlich sind auch andere Typen möglich, diese müssen aber auf jeden Fall das leere Protokoll ErrorType implementieren. (ErrorType hat einen formalen Charakter und stellt Swift-intern die Kompatibilität zur NSError-Klasse her. Das Protokoll schreibt aber keine Methoden oder andere Implementierungsdetails vor.)
  • Methoden und (Init-)Funktion, die Fehler auslösen können, müssen mit throws deklariert werden. Anders als z.B. in Java fehlt eine Angabe, welche Arten von Fehlern ausgelöst werden können.

  • Innerhalb solcher Methoden kann throw einen Fehler auslösen. An throw muss ein Element/Objekt übergeben werden, dessen Typ das ErrorType-Protokoll implementiert.

  • Der Aufruf von Methoden, die mit throws deklariert sind, muss mit try abgesichert werden. try gilt immer für eine gesamte Anweisung, nicht nur für einen einzelnen Methodenaufruf. Wenn xxx() und yyy() \linebreak Fehler auslösen können, lautet der korrekte Aufruf zur Berechnung der Summe dieser Funktionen try xxx() + yyy(), nicht try xxx() + try yyy(). Bei Zuweisungen muss try unmittelbar nach dem Zuweisungsoperator angegeben werden, also let c = try xxx() oder var v = try xxx(). Analog lautet die korrekte Syntax return try xxx(), nicht try return xxx().

  • try kann nicht für sich verwendet werden, sondern nur innerhalb eines do-Blocks. In diesem Block ist try beliebig oft erlaubt — aber eben nur für Anweisungen, die throws-Methoden aufrufen.

  • Zur Reaktion auf Fehler muss es zumindest einen catch-all-Block geben, also einfach catch oder catch _ oder catch let error as NSError.

  • Optional sind vorher zusätzliche catch-Blöcke für spezifische Fehler zulässig.

Noch mehr Details können Sie schon jetzt im Swift-eBook von Apple und demnächst in meinem Swift-Buch nachlesen.

Was try/catch in Swift kann — und was nicht …

Es gibt zwei große Missverständnisse rund um try/catch in Swift:

  • Erstens: try/catch basiert nicht auf Exceptions! Das try-catch-Modell von Swift sieht so aus, als würde es wie z.B. in Java Exceptions verarbeiten. Tatsächlich ist das aber nicht der Fall. Vielmehr erzeugt throw ein NSError-Objekt, dessen Klasse schon seit vielen Jahren in der Foundation-Bibliothek existiert. try und catch verpacken lediglich die Verarbeitung von derartigen NSError-Objekten. Dafür ist try/catch in Swift schneller als in anderen Sprachen. Laut dem eBook »The Swift Programming Language« wird throw in Swift ebenso schnell ausgeführt wird wie return.
  • Zweitens: try/catch kann keine Programmierfehler abfangen: Auf Schlampigkeitsfehler im Code reagiert ein Swift-Programm unbarmherzig — und daran hat sich mit Swift 2 nichts geändert. Zugriffe auf nicht vorhandene Array-Elemente, Integer-Divisionen durch 0, Integer-Überläufe, nil-Unwrapping (also x!, wenn x nil enthält) führen auch in Swift 2 zu einem fatal error und somit zum Programmende. Derartige Fehler lassen sich mit try/catch nicht abfangen.

Übersichtlicher Code mit defer und guard

Die Schlüsselwörter defer und guard, beide ebenfalls neu in Swift 2, haben nichts mit try/catch zu tun. Sie können also auch in »gewöhnlichem« Code verwendet werden. Dessen ungeachtet sind defer und guard nützliche Hilfsmittel, um Code übersichtlicher zu strukturieren — und das gilt natürlich auch innerhalb von try/catch-Konstruktionen.

Mit defer können Sie Code formulieren, der auf jeden Fall beim Verlassen einer Funktion oder Methode ausgeführt wird — egal, ob die Funktion/Methode bis zum Ende ausgeführt wird, oder ob sie vorzeitig mit return oder throw verlassen wird. Eine Methode darf mehrere defer-Blöcke aufweisen — dann werde diese zum Schluss in umgekehrter Reihenfolge ausgeführt.

Um defer auszuprobieren, erstellen Sie am einfachsten ein kleines Projekt des Typs Command Line Tool und fügen den folgenden Code ein. Anschließend führen Sie das Programm mehrere Male aus. Ganz egal, welchen Verlauf der Code nimmt — in jedem Fall enthält die Ausgabe zu jeder open– ein dazu passende close-Zeile. (Im Playground lässt sich das nicht gut testen, weil print-Ausgaben dort nicht chronologisch angezeigt werden.)

// Projekt defer-test, Datei main.swift
func test() {
  print("open f1")
  defer { print("close f1") }
  if arc4random_uniform(100) > 50 { return }

  print("open f2")
  defer { print("close f2") }

  print("read from f1")
  if arc4random_uniform(100) > 50 { return }
  print("write to f2")
}

test()

Nur zu guard: if-let-Konstruktionen bergen in sich eine Tendenz zu unübersichtlichem Code: Es passiert recht oft, dass zuerst oft umfangreicher Code für den positiven Fall formuliert wird; zum Ende der Funktion folgen dann kurze Einzeiler, die ausgeführt werden, wenn if-let nicht erfolgreich war. Das führt zu unnötig verschachteltem Code. Im folgenden Beispiel ruft f zweimal die Funktion perhapsANumber auf und verarbeitet die Ergebnisse.

func perhapsANumber() -> Int? {
  let n = Int(arc4random_uniform(100))
  if n <= 50 {
    return n
  } else {
    return nil
  }
}

// Beispielcode ohne guard
func f() {
  if let a = perhapsANumber() {
    let n = 2 * a
    if let b = perhapsANumber() {
      print(n + b)
      // noch mehr Code, Teil 1
    } else {
      return
    }
  } else {
    return
  }
  // noch mehr Code, Teil 2
}

guard stellt die Funktion von if-let gewissermaßen auf den Kopf: Ist die Bedingung erfüllt, wird der Code nach dem else-Block ausgeführt, wo bei alle mit let definierten Variablen weiterhin gültig sind. Ist die Bedingung hingegen nicht erfüllt, wird der else-Block ausgeführt. Mit guard lässt sich die gleiche Aufgabe wie in f wesentlich eleganter erledigen:

// der gleiche Code mit guard
func g() {
  guard let a = perhapsANumber() else { return }
  let n = 2 * a
  guard let b = perhapsANumber() else { return }
  print(n + b)
  // noch mehr Code, Teil 1
  // noch mehr Code, Teil 2
}

Versteckte Maus/Trackpad-Kürzel in Xcode

$
0
0

Manche Blog-Beiträge sind primär eine Gedächtnisstütze für den Autor. Dieser Beitrag fällt unter diese Kategorie — ist aber vielleicht auch für andere Xcode-Anwender nützlich. Er fasst zusammen, welche speziellen Maus- bzw. Trackpad-Kürzel es in Xcode gibt. (Wenn etwas fehlt: Bitte verfassen Sie einen Kommentar oder schreiben Sie an kontakt@kofler.info.)

Baumstrukturen vollständig ausklappen

Verschachtelte Baumstrukturen, z.B. in der Document Outline, können Sie mit alt + Mausklick vollständig ausklappen.

alt + Maustaste bzw. Trackpadtaste klappt einen ganzen Baum auseinander (nicht nur in Xcode ...)
alt + Maustaste bzw. Trackpadtaste klappt einen ganzen Baum auseinander (nicht nur in Xcode …)

Verdecktes Steuerelement auswählen (Storyboard-Editor)

Um im Storyboard-Editor einen Container auszuwählen, der sich hinter (unter) einem anderen Steuerelement befindet, drücken Sie [shift] und klicken die rechte Maus- bzw. Trackpad-Taste. Xcode zeigt dann ein Kontextmenü mit allen unter dem Cursor befindlichen Steuerelementen an.

shift + rechte Maustaste bzw. Trackpadtaste öffnet ein Kontextmenü, das die Verschachtelung von Steuerelementen zeigt und die Auswahl verdeckter Steuerelemente ermöglicht
shift + rechte Maustaste bzw. Trackpadtaste öffnet ein Kontextmenü, das die Verschachtelung von Steuerelementen zeigt und die Auswahl verdeckter Steuerelemente ermöglicht

Verbindungen zwischen Steuerelementen und Code herstellen

Sicherlich kein Geheimtipp sind Drag&Drop-Operationen mit gedrückter ctrl-Taste:

  • Wenn das Storyboard und die dazugehörende Code-Datei nebeneinander dargestellt werden, können Sie so Actions und Outlets in den Code einfügen.
  • ctrl-Drag innerhalb des Storyboards erstellt Segues.

  • ctrl-Drags sind auch in die Icons des View Controllers erlaubt, z.b. zum Exit-Icon für Unwind.

  • ctrl-Drags dürfen auch in der Document Outline beginnen, wo es mitunter einfacher ist, das richtige Element auszuwählen.

Mit ctrl-Drag können Sie Übergänge zwischen Ansichten (also »Segues«) einrichten
Mit ctrl-Drag können Sie Übergänge zwischen Ansichten (also »Segues«) einrichten

Informationen über Schlüsselwörter ergründen

Im Code-Editor zeigt alt+Mausklick bzw. alt+Trackpad-Klick Informationen über das Schlüsselwort unter dem Mauszeiger. cmd+Klick führt an die Stelle im Code, wo das Schlüsselwort definiert ist (eigener Code) bzw. in die Deklaration des Codes (bei Bibliotheken).

alt + Klick zeigt Informationen zum Schlüsselwort unter dem Cursor; cmd+Klick führt zur Definition bzw. Deklaration des Schlüsselworts
alt + Klick zeigt Informationen zum Schlüsselwort unter dem Cursor; cmd+Klick führt zur Definition bzw. Deklaration des Schlüsselworts

openSUSE btrfs-Subvolumes inkompatibel zu Fedora-22-Installationsprogramm

$
0
0

Auf meinem Testrechner tummeln sich normalerweise alle möglichen Distributionen. Gestern wollte ich Fedora 22 neu installieren und bin (anfänglich) gescheitert. Immer wieder stürzte Anaconda mit merkwürdigen Fehlermeldungen ab: DeviceTreeError: could not find parent for subvol. Meine ersten Vermutungen waren: der USB-Stick funktioniert mal wieder nicht, defekte DVD, Fehler im ISO-Image etc. — aber nach dem dritten Versuch wurde mir klar, dass diesmal ein ganz anderes Problem vorlag.

Der folgende Bugzilla-Report, in dem das Problem eigentlich als gelöst betrachtet wird, brachte mich dann auf die richtige Fährte: Dort war von vielen btrfs-Subvolumes die Rede, die das Problem verursachen können.

Eine Menge derartiger Subvolumes hatte ich auch. Aktuelle openSUSE-Installationen verwenden ja btrfs für das root-Dateisystem (siehe auch diesen Kurztest) und legen dort unzählige Subvolumes und Snapshots an. Nachdem ich die betreffende Partition einfach mit mkfs.ext4 neu formatierte (openSUSE kommt später wieder an die Reihe …), klappte die Fedora-Installation wunderbar.

Fedora 22 / Gnome 3.16 im HiDPI-Modus (Retina)

$
0
0

Das Retina-Zeitalter ist nun auch auf meinem Linux-Desktop-Rechner angekommen. Das Setup: ein ca. 4 Jahre alter Desktop-PC mit Intel-i5-CPU und -Grafik, DisplayPort-Ausgang (1.1), Fedora 22 mit Gnome 3.16 sowie ein ASUS-4k-Monitor, der über ein DisplayPort-Kabel verbunden ist. Ein paar Hürden waren aber zu überwinden, bis alles funktionierte.

DisplayPort 1.1 versus 1.2

Der Monitor ist DisplayPort-1.2-kompatibel, d.h. er unterstützt 4k bei 60 Hz. Mein Mainboard ist aber älter als der DisplayPort-1.2-Standard und schafft 4k nur mit 30 Hz.

Das war mir alles bekannt. Was mir unklar war: Der Monitor muss explizit auf DisplayPort 1.1 gestellt werden, sonst wird er von meinem Mainboard gar nicht als Monitor erkannt, und das Bild bleibt schwarz. Bei meinem Monitor (ein ASUS PB287Q) kann diese Einstellung im schwer zu bedienenden On-Screen-Menü durchgeführt werden: System Setup / DisplayPort Stream / DP 1.1. (Das ist im Übrigen die Defaulteinstellung. Ich hatte den Monitor aber zuvor an einen iMac angeschlossen, und dort war DP 1.2 erforderlich.)

30 Hz versus 60 Hz: Kann man mit 30 Hz überhaupt arbeiten? Meiner Ansicht nach verblüffend gut. Zum Spielen mögen 30 Hz zuwenig sein, aber für Office- und Entwickler-Arbeiten sind 30 Hz vollkommen OK. (Dass 60 Hz besser sind, bestreite ich natürlich nicht …)

Kein Bild für EFI

Die Einstellung war insofern nicht ganz einfach zu finden, weil der Monitor in der Boot-Phase sowieso schwarz bleibt. Die EFI-Einstellungen des Mainboards lassen sich über einen VGA-, DVI- oder HDMI-Monitor steuern, aber eben nicht über einen DisplayPort-Monitor. Neuere Mainboards sind da hoffentlich flexibler.

HiDPI für Gnome

Nachdem diese Hürden genommen waren und Gnome in seiner ganzen Pracht in 3840 x 2160 Pixeln erstrahlte, war die nächste Frage: Lässt sich die Anzeige nicht skalieren? Ein 28-Zoll-Monitor ist zwar groß, aber die darauf angezeigten Inhalte erscheinen wegen der winzigen Pixel-Größe (bzw. dem hohen DPI-Wert) doch recht klein.

HiDPI: Die Abkürzung HiDPI steht für High DPI = High Dots Per Inch. In der Marketing-Sprache von Apple: »Retina«.

In den Systemeinstellungen habe ich nichts gefunden, aber Google brachte mich direkt zum ArchWiki, wo die Lösung dokumentiert ist. Im Terminal muss das folgende Kommando ausgeführt werden:

gsettings set org.gnome.desktop.interface scaling-factor 2

Damit vergrößert Gnome alle Ausgaben in jede Richtung um den Faktor 2. Die Fenster sind nun so groß wie Sie auf einem 28-Zoll-Monitor mit 1920 x 1080 Pixel wären, ihre Inhalte sind aber ungleich schärfer. Traumhaft! (Ein Klick auf das folgende Bild öffnet dieses in voller Auflösung.)

Der Gnome-Desktop auf einem 4k-Monitor
Der Gnome-Desktop auf einem 4k-Monitor

Einschränkungen

Erste Tests mit dem Gnome-Terminal, dem Editor Emacs, dem Datei-Manager und Firefox verlaufen problemlos. Auf den zweiten Blick tauchen dann aber doch Probleme auf:

  • Gimp: Die Icons in der Toolbox werden nicht skaliert und sind winzig. Das lässt sich aber beheben. Suchen Sie in der Datei /usr/share/gimp/2.0/themes/Default/gtkrc nach der Zeile GimpToolbox::tool-icon-size = button und ändern Sie button zu dialog (sehr groß) oder dnd (groß). Es verbleiben dann immer noch diverse sehr kleine Icons in anderen Dialogen, aber im Großen und Ganzen kann man so gut arbeiten.
  • Okular: Okular ist ein KDE-Programm und hat als solches offensichtlich keine Ahnung von der Gnome-Skalierung. Menüs und Symbole werden sehr klein dargestellt. Vermutlich gibt es irgendwelche Tricks, um die Skalierung auch von KDE-Programmen einzustellen — da muss ich erst recherchieren. Die PDF-Ansicht selbst funktioniert gut.

  • Eclipse: Gleiches Problem wie bei Gimp, die Schriften sind OK, aber die Icons winzig. Hier scheint es keine einfache Lösung zu geben. Ein Beitrag in Stackoverflow empfiehlt, alle Icon der Eclipse-Installationsdateien durch ein Script zu vergrößern. Ein Eclipse-Bugreport verspricht eine Verbesserung erst in Eclipse 4.6 (also im Sommer 2016).

  • Skalierungsfaktor: Im oben erwähnten gsettings-Kommando sind nur ganze Zahlen erlaubt. Mir wäre ein Skalierungsfaktor von 1,5 oder 1,66 eigentlich lieber. Diese Einschränkung lässt sich teilweise umgehen, indem ergänzend oder anstelle des Interface-Skalierungsfaktors der Text-Skalierungsfaktor verändert wird:

    gsettings set org.gnome.desktop.interface text-scaling-factor 0.8

    Für diesen Parameter sind auch Fließkommazahlen erlaubt.

    Beide Parameter können auch im Programm gnome-tweak-tool verändert werden. Der Interface-Skalierungsfaktor ist im Dialogblatt Fenster zu finden, der für den Text im Dialogblatt Schriften.

Mangelhafte Icon-Darstellung in Eclipse
Mangelhafte Icon-Darstellung in Eclipse

Fazit

Der Gnome-Desktop lässt sich auf einem 4k-Monitor überraschend gut bedienen. Den Gesamteindruck trüben aber diverse Programme und Helferlein, die nicht direkt im Gnome-Projekt verankert sind.

MELPA: unkompliziert Emacs-Erweiterungen installieren

$
0
0

Seit der Emacs-Version 24 enthält Emacs ELAP. Das ist ein Emacs-interner Paketmanager, der auf externe Erweiterungsarchive zugreifen kann. Das vermutlich am besten gewartete derartige Archiv hat den merkwürdigen Namen MELPA »Milkypostman’s Emacs Lisp Package Archive«. Es enthält momentan über 2.500 Pakete. Wie Sie es nutzen, verrät dieser Minibeitrag.

Um das Archiv zu aktivieren, fügen Sie in die Datei .emacs die folgenden Zeilen ein:

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.org/packages/"))
(when (< emacs-major-version 24)
  ;; For important compatibility libraries like cl-lib
  (add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/")))
(package-initialize)

Nach einem Neustart des Emacs können Sie das Erweiterungsarchiv verwenden. Alt+X list-packages führt nun in die schier endlose Liste aller Erweiterungen. Wie üblich können Sie den Text mit Strg+S rasch durchsuchen. Ein Mausklick auf ein Paket zeigt Detailinformationen und einen Install-Button an. Damit ist die Installation von Erweiterungen in Sekunden erledigt.

MELPA stellt unzählige Erweiterungspakete für den Editor Emacs zur Verfügung
MELPA stellt unzählige Erweiterungspakete für den Editor Emacs zur Verfügung

Zu meinen Favoriten zählen die Erweiterungen php-mode und markdown-mode. Sie erleichtern die Bearbeitung von PHP- und Markdown-Dateien erheblich.

von
Emacs-Erweiterungen

MELPA (\url{}) steht für \qt{} und ist .

Automatische Paket-Updates mit DNF unter Fedora

$
0
0

Unter Fedora ist seit Version 22 das neue Paketverwaltungssystem DNF aktiv. Es ersetzt YUM, basiert aber wie dieses auf RPM-Paketen und ist in der Bedienung weitestgehend kompatibel. Unterschiede gibt es aber, wenn Sie automatisch tägliche Updates durchführen möchten.

Dazu installieren Sie zuerst das Paket dnf-automatic:

dnf install dnf-automatic

Die dazugehörende Konfigurationsdatei ist /etc/dnf/automatic.conf. Dort müssen Sie apply_updates auf yes stellen. Wenn Sie möchten, können Sie auch diverse email-Parameter einstellen. Diese steuern, wer nach jedem Update automatisch eine E-Mail erhält.

# Datei /etc/dnf/automatic.conf
...
apply_updates = yes

Ein interessantes Detail von dnf-automatic besteht darin, dass sich nicht Cron um den regelmäßigen Aufruf des Update-Scripts kümmert, sondern Systemd. Zur Aktivierung des Updates sind die folgenden zwei Kommandos erforderlich:

systemctl enable dnf-automatic.timer
systemctl start dnf-automatic.timer

Wenn Sie wissen möchten, wann der nächste Aufruf von dnf-automatic ansteht, führen Sie systemctl list-timers aus:

systemctl list-timers '*dnf*'
  NEXT                       LEFT       LAST                       PASSED
  Die 2015-08-18 10:18 CEST  24h ago    Mit 2015-08-19 11:15 CEST  2min 42s ago
  Mit 2015-08-19 11:35 CEST  17min left Mit 2015-08-19 10:35 CEST  42min ago

Systemd-Timer als Cron-Alternative

$
0
0

Systemd kann sich aber ähnlich wie Cron auch um die regelmäßige Ausführung von Prozessen kümmern. Die meisten Distributionen machen von dieser Funktion noch recht sparsam Gebrauch. Insofern ist Systemd momentan eher als Ergänzung zu Cron zu sehen.

systemctl list-timers

Die zeitgesteuerte Ausführung von Programmen wird in Systemd durch Timer-Unit-Dateien gesteuert, also durch Dateien mit der Endung .timer. Einen Überblick über aktive Timer gibt systemctl, wobei die folgende, unter Fedora 23 Alpha entstandene Ausgabe aus Platzgründe gekürzt dargestellt ist.

systemctl list-timers
  NEXT             LEFT         LAST              UNIT
  2015-08-20 09:33 18min left   2015-08-19 09:33  systemd-tmpfiles.timer
  2015-08-20 09:42 26min left   2015-08-20 08:42  dnf-makecache.timer
  2015-08-20 11:19 2h 3min left 2015-08-19 11:15  dnf-automatic.timer
  2015-08-21 00:00 14h left     2015-08-20 00:00  mlocate-updatedb.timer
  2015-08-21 00:00 14h left     2015-08-20 00:00  unbound-anchor.timer

.timer-Syntax

Die .timer-Dateien liegen in einem leicht verständlichem Textformat vor. Die folgenden Zeilen zeigen die Datei dnf-automatic.timer, die für den täglichen Start des Scripts dnf-automatic verantwortlich ist. Dieses Script aus dem gleichnamigen Paket aktualisiert die Paketdatenbank und installiert bei entsprechender Konfiguration alle verfügbaren Updates (siehe hier).

# Datei /usr/lib/systemd/system/dnf-automatic.timer
[Unit]
Description=dnf-automatic timer

[Timer]
OnBootSec=1h
OnUnitInactiveSec=1d

[Install]
WantedBy=basic.target

OnBootSec=1h bewirkt, dass das Prozess eine Stunde nach einem Neustart des Rechners erstmalig ausgeführt wird. OnUnitInactiveSec=1d bedeutet, dass der Dienst 24 Stunden nach dem Ende des letzten Ablaufs wieder gestartet werden soll. Wenn die Zeitangabe ohne Einheit erfolgt, sind Sekunden gemeint. Die Syntax der Zeitangaben ist in man systemd.time dokumentiert. Zulässig ist z.B. 2h 15min oder 2weeks oder 4months.

Anstelle dieser etwas vagen Vorgaben können Sie die Zeitangaben im [Timer]-Abschnitt auch absolut vornehmen. Die folgenden Einstellungen bewirken, dass die Aufgabe jeden Tag um 8:15 erledigt wird. Persistent=true bewirkt, das versäumte Jobs beim nächsten Rechnerstart
sofort nachgeholt werden.

# in einer .timer-Datei
[Timer]
OnCalendar=8:15
Persistent=true

Für absolute Zeitangaben sieht Systemd eine komplexe Syntax vor, die in man systemd.time im Abschnitt Calendar Events ausführlich dokumentiert ist. So bewirkt OnCalendar=Sun 2016-*-* 17:15 beispielsweise, dass ein Job an jedem Sonntag des Jahrs 2016 um 17:15 ausgeführt wird.

Systemd versucht eingerichtete Timer-Jobs standardmäßig in einem Zeitfenster von einer Minute nach der vorgesehenen Zeit auszuführen. Wenn Sie möchten, dass sich Systemd exakter an Ihre Vorgaben hält, geben Sie im [Timer]-Abschnitt mit AccuracySec eine kleinere Zeitspanne an, z.B. von 1s (eine Sekunde) bis hin zu 1us (theoretisch eine millionstel Sekunde, ganz so exakt wird der Start in der Praxis aber nicht immer gelingen).

.service-Dateien

Jeder name.timer-Datei muss eine entsprechende name.service-Datei gegenüberstehen, die Details zum auszuführenden Prozess enthält. Für das obige dnf-automatic-Beispiel sieht die .service-Datei wie folgt aus:

# Datei /usr/lib/systemd/system/dnf-automatic.service
[Unit]
Description=dnf automatic

[Service]
Type=oneshot
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
Environment="ABRT_IGNORE_PYTHON=1"
ExecStart=/usr/bin/dnf-automatic /etc/dnf/automatic.conf --timer

Start/Stopp

Neu eingerichtete Timer müssen wie üblich durch systemctl start erstmalig gestartet und durch systemctl enable dauerhaft (also über den nächsten Neustart hinweg) aktiviert werden. Analog beenden Sie den Aufruf durch systemctl stop und systemctl disable. Damit Änderungen in bereits aktiven Timern wirksam werden, führen Sie am einfachsten das folgende Kommando aus:

systemctl reenable --now name.timer

Nach dem Einrichten neuer Timer-Jobs sollten Sie sich immer mit systemctl list-timers vergewissern, dass Systemd Ihre .timer-Angaben korrekt interpretiert hat.

Beispiel

Das folgende Beispiel zeigt, wie Sie mit Systemd ein simples Script zur Überprüfung der Netzwerkverbindung alle 10 Minuten ausführen. Das Script ping-kofler testet durch ein dreimaliges ping, ob und wie schnell der Server kofler.info auf Netzwerkanfragen reagiert. Die gerade aktuelle Zeit und die ping-Ausgaben werden in /var/log/ping-kofler.log protokolliert. &>> bewirkt, dass sowohl die Standardausgabe als auch allfällige Fehler an eine vorhandene Datei hinzugefügt werden. Dieser Operator setzt die bash-Version 4 voraus. Vergessen Sie nicht, das Script mit chmod a+x ausführbar zu machen.

#!/bin/bash
# Datei /usr/local/bin/ping-kofler
date &>> /var/log/ping-kofler.log
ping -c 3 kofler.info &>> /var/log/ping-kofler.log

Für den Aufruf des Scripts ist die folgende .service-Datei zuständig:

# Datei /etc/systemd/system/ping-kofler.service
[Unit]
Description=simpler ping-Test

[Service]
ExecStart=/usr/local/bin/ping-kofler

Die Einstellungen für den automatischen Start befinden sich in dieser .timer-Datei. Das Script soll 30 Sekunden nach systemctl start erstmalig ausgeführt werden, in der Folge alle 10 Minuten. Der [Install]-Abschnitt ist erforderlich, damit der Timer mit systemctl enable dauerhaft aktiviert werden kann.

[Unit]
Description=ping-kofler timer

[Timer]
OnActiveSec=30s
OnUnitActiveSec=10m

[Install]
WantedBy=basic.target

Um die Script-Ausführung zu starten und dauerhaft einzurichten, führen Sie systemctl enable mit der Option --now aus — dann ist start gleich inkludiert:

systemctl enable --now ping-kofler.timer

Für und wider

Das Beispiel macht sofort klar, dass das Einrichten eines Systemd-Timers mit wesentlich mehr Aufwand verbunden ist als die eine crontab-Zeile, die für die periodische Cron-Ausführung erforderlich wäre.

Die Vorteile von Systemd bestehen darin, dass Systemd-Jobs exakter gesteuert werden können (eigenes Environment, siehe man systemd.exec, cgroups-Regeln etc.) und ihr Aufruf im Systemd-Journal protokolliert wird.

Es gibt aber auch Nachteile: So wird bei einem Fehler nicht automatisch eine E-Mail versendet. Außerdem gibt es keine zufällige Verzögerung (RANDOM_DELAY in anacrontab), um die gleichzeitige Ausführung vieler Jobs zu vermeiden.

Quellen

https://wiki.archlinux.org/index.php/Systemd/Timers
http://www.freedesktop.org/software/systemd/man/systemd.timer.html
http://www.freedesktop.org/software/systemd/man/systemd.time.html
http://blog.higgsboson.tk/2013/06/09/use-systemd-as-a-cron-replacement

Raspberry-Pi-Buch, 2. Auflage

$
0
0

Nur elf Monate nach der ersten Auflage ist vor einer Woche die zweite Auflage von »Raspberry Pi — Das umfassende Handbuch« erschienen. Christoph Scherbeck, Charly Kühnast und ich haben das Buch im Hinblick auf den Raspberry Pi 2 aktualisiert und erweitert.

pi2-buch

Die Highlights der 2. Auflage

  • Das Buch wurde natürlich vollständig im Hinblick auf den Raspberry Pi 2 aktualisiert.
  • Zwei neue Kapitel beschreiben Installation und Betrieb von Ubuntu bzw. Windows 10 auf dem Raspberry Pi.
  • Neue Grundlagen-Themen:
    • Device Trees
    • HATs und EEPROM-Programmierung
  • Neue Hardware-Themen:
    • Feuchtigkeitssensoren
    • Servomotoren
    • I2C-7-Segmentanzeigen
    • GertDuino
  • Neue Projekte:
    • Servocam
    • Blumenbewässerung
    • Wassermelder
    • Audio-System mit HiFiBerry

Viele weitere Informationen zum Buch inkl. einer Leseprobe finden Sie unter http://pi-buch.info.


Fedora 23 / Gnome 3.18 im HiDPI-Modus (Retina)

$
0
0

Nach ersten Tests mit einem Intel-Onboard-Grafiksystem verfüge ich mittlerweile über ein weiteres 4k-Testsystem, diesmal mit einer passiven AMD-Grafikkarte (Sapphire Radeon R7 250E Ultimate). Diese lautlose Grafikkarte schafft 3840×2160 Pixel auch bei einer Bildwiederholfrequenz von 60 Hz. Software-seitig läuft eine Vorabversion von Fedora 23 mit eine Testversion von Gnome 3.18.

Gnome-Konfiguration

Im Vergleich zu meinem letzten Test hat sich bei der Gnome-Konfiguration nicht viel geändert. In den offiziellen Systemeinstellungen gibt es nach wie vor keine HiDPI-Optionen.

In den Gnome Tweak Tools können Sie entweder entweder im Fenster-Modul die Fensterskalierung verändern (nur ganzzahlige Werte) oder im Modul Schriften den Skalierungsfaktor einstellen (hier sind auch Fließkommazahlen erlaubt). Beide Varianten sind sub-optimal:

  • Fensterskalierung=2: Damit werden viele Schriften richtig dargestellt, aber nicht alle. Zu klein sind unter anderem die Schriften im Panel sowie die der Fenstertitel. Zu klein werden z.B. auch der Mauscursor oder die Menüs von Gimp dargestellt.
  • Schriftskalierung=2: Die Panel-Schriften werden jetzt richtig dargestellt, aber dafür gibt es nun noch mehr Unstimmigkeiten an anderen Stellen. Beispielsweise passt die große Schrift gar nicht zur Größe der Icons in den Systemeinstellungen oder in Nautilus. Die Adressleiste von Firefox ist viel zu klein, die Adresse wird zur Hälfte abgeschnitten. Nach meinen Erfahrungen funktioniert Fensterskalierung=2 deutlich bessere als Schriftskalierung=2. Der Vorteil des Schriftskalierungs-Parameters besteht aber darin, dass hier auch Zwischenwerte möglich sind. Momentan arbeite ich mit Schriftskalierung=1,4 und bin damit recht zufrieden. In Firefox habe ich in about:config den Parameter layout.css.devPixelsPerPx auf 1.4 gestellt, in LibreOffice mit Extras/Optionen/LibreOffice/Ansicht den Skalierungsfaktor auf 115%.

Alles in anderem gilt weiterhin: Prinzipiell kann man mit Gnome auf 4k-Monitoren produktiv arbeiten. An diversen Stellen und Details hakt es aber noch. Von einem perfekten Retina-Feeling wie unter OS X ist Gnome weit entfernt.

An vielen Stellen werden Schriften zu klein dargestellt. (Der Screenshot wurde mit einer Beta von Fedora 23 + Gnome 3.18 erstellt, Fensterskalierung = 2)
An vielen Stellen werden Schriften zu klein dargestellt. (Der Screenshot wurde mit einer Beta von Fedora 23 + Gnome 3.18 erstellt, Fensterskalierung = 2)
Passable Darstellung der meisten GUI-Elemente mit einer Schriftskalierung von 1,4 (Der Screenshot wurde mit einer Beta von Fedora 23 + Gnome 3.18 erstellt, Schriftskalierung = 1,4)
Passable Darstellung der meisten GUI-Elemente mit einer Schriftskalierung von 1,4 (Der Screenshot wurde mit einer Beta von Fedora 23 + Gnome 3.18 erstellt, Schriftskalierung = 1,4)

Jetzt mit Wayland

Nach diesen vorläufigen Erfolgserlebnis konnte ich nicht widerstehen und habe beim Login angegeben, dass ich Gnome mit Wayland nutzen möchte. Hier scheint es im Display Manager noch ein Problem zu geben: Der erste Login nach der Umstellung der gewünschten Desktop-Variante im kleinen Zahnradmenü scheitert; der zweite Login funktioniert dann aber — und das verblüffend gut: Alle von mir getesteten Programme liefen anstandslos. Nur bei der Schriftskalierung traten neue Probleme auf: Trotz Schriftskalierung=1,4 werden die Texte im Panel zu klein dargestellt. In den Fenstern sieht alles so aus wie ohne Wayland.

Auch wenn distrowatch diese Woche ganz andere Erfahrungen gemacht hat — aus meiner Sicht sieht es so aus, als wäre Wayland bald praxistauglich. Vermutlich hängen die Ergebnisse aber noch stark von der eingesetzten Grafikkarte bzw. von deren Treiber ab.

Jetzt unter Wayland, abermals mit Gnome-Schriftskalierung von 1,4 (Der Screenshot wurde mit einer Beta von Fedora 23 + Gnome 3.18 erstellt, Schriftskalierung = 1,4)
Jetzt unter Wayland, abermals mit Gnome-Schriftskalierung von 1,4 (Der Screenshot wurde mit einer Beta von Fedora 23 + Gnome 3.18 erstellt, Schriftskalierung = 1,4)

Treiber

Die nicht ganz neue Grafikkarte Sapphire Radeon R7 250E Ultimate funktioniert unter Fedora 23 mit dem freien radeon-Treiber wunderbar und ohne irgendwelche Konfigurationsarbeiten — sowohl unter X als auch unter Wayland. Deswegen habe ich gar nicht erst versucht, den fglrx-Treiber von AMD zu installieren.

4k unter Ubuntu

$
0
0

Mein 4k-System läuft natürlich nicht nur unter Fedora, sondern auch unter Ubuntu. Dort ist die Einstellung des Skalierungsfaktors besonders einfach. Ganz ohne Probleme ist die Verwendung eines hochauflösenden Monitors aber auch unter Ubuntu nicht. Als Testkandidat für meine Experimente diente die gerade aktuelle Ubuntu-15.10-Daily-Version.

Unter Ubuntu kümmert sich der eigene Desktop Unity in Kombination mit Compiz um die Darstellung des Panels, des Docks, der Fensterrahmen und der Menüs — und das nicht nur bei Gnome-Programmen, sondern auch bei Firefox, LibreOffice, KDE-Programmen etc. Dieser Zusatzaufwand macht sich bei der HiDPI-Konfiguration bezahlt: Mit einem Regler im Modul Anzeigegeräte der Systemeinstellungen kann mühelos ein Skalierungsfaktor für die Schriftgröße eingestellt werden. Die Einstellung wird scheinbar auf Anhieb von allen Programmen unterstützt.

Ubuntu 15.10 Daily auf einem 4k-Monitor mit einem Skalierungsfaktor von 1,38
Ubuntu 15.10 Daily auf einem 4k-Monitor mit einem Skalierungsfaktor von 1,38

Tatsächlich kocht aber natürlich auch Ubuntu nur mit Wasser. Am besten funktioniert die Skalierung bei Gnome-Programmen, wo nicht nur das Menü, sondern auch interne Dialoge korrekt dargestellt werden. Die automatische Skalierung versagt aber z.B. in Firefox (Abhilfe schafft dort die Veränderung von layout.css.devPixelsPerPx!), in Gimp, in LibreOffice, in zusätzlich installierten KDE-Programmen etc. Probleme bereiten auch Icons in Symbolleisten, im Dateimanager und in den Systemeinstellungen.

Kurz und gut: Ubuntu macht es HiDPI-Anwendern leichter als Distributionen auf Gnome-Basis, stösst aber letztlich an dieselben Grenzen.

Maus-Cursor

Eine lästige Eigenheit von Ubuntu besteht darin, dass der Maus-Cursor nach jedem Login winzig klein dargestellt wird. Kurzfristig Abhilfe schafft ein Neustart von Unity mit Alt+F2 unity, aber das hilft eben nur bis zum nächsten Login.

Um das Problem dauerhaft zu lösen, tragen Sie in die Datei /etc/X11/Xresources/x11-common die folgende Zeile ein (Quelle):

Xcursor*size: 48

DisplayPort-Probleme

Mein 4k-Monitor ist via DisplayPort mit dem Computer verbunden. Sobald der Monitor automatisch in den Energiesparmodus versetzt oder manuell ausgeschalten wird, bleibt er beim Versuch der Reaktivierung bzw. beim Wiedereinschalten schwarz und meldet No Signal. Dieses Problem ist DisplayPort-spezifisch und tritt nicht auf, wenn der Monitor mit einem HDMI-Kabel angeschlossen wird. (HDMI ist aber nicht 4k-kompatibel, zumindest nicht bei der HDMI-Version meines Monitors und meiner Grafikkarte.) Das Problem ist hier in Launchpad dokumentiert.

Um das System ohne brutales Ein/Ausschalten wieder zu aktivieren, können Sie mit Strg+Alt+F2 eine Textkonsole aktivieren und dann mit Alt+F7 zurück in den Grafikmodus wechseln. Alternativ kann diese Aktion auch via SSH mit dem Kommandos chvt 2 und chvt 7 durchgeführt werden.

Netatalk-3-Konfiguration für Time-Machine-Backups

$
0
0

Um einen Linux-Server als Datenspeicher für Time-Machine-Backups einzurichten, müssen Sie das Apple File Protocol (AFP) unterstützen. Diese Aufgabe übernimmt das Programm netatalk. Die Konfiguration mit Netatalk 3 ist glücklicherweise ein Kinderspiel.

Netatalk 3 installieren

Die erste Hürde besteht aber darin, Netatalk 3 überhaupt zu installieren. Aktuelle Pakete sind momentan nur in wenigen Distributionen enthalten, z.B. in Fedora 23 oder in openSUSE 42.1. Debian stellt das Paket wegen angeblich unklaren Copyrights nicht mehr zur Verfügung. Unter Ubuntu gibt es nur die veraltete Version 2.2.5, deren Konfiguration vollkommen anders und wesentlich umständlicher verläuft als bei Version 3. Auch bei RHEL/CentOS fehlen Netatalk-Pakete, und das erstaunlicherweise auch in der EPEL-Paketquelle.

Tipps, wie Sie Netatalk auf diversen Distributionen manuell installieren, finden Sie hier:

Ich habe meine Tests mit Fedora 23 Beta durchgeführt, wo dnf install netatalk zum Ziel führt. Die weitere Anleitung bezieht sich also auf diese Distribution.

Konfiguration

Die Konfiguration für Netatalk befindet sich in der Datei /etc/netatalk/afp.conf. Die Syntax ist ähnlich wie bei Samba: Die Datei wird durch [name] in Abschnitte unterteilt, Einstellungen erfolgen in der Form parameter = wert. Es gibt zwei reservierte Abschnittsnamen, [Global] für Grundeinstellungen und [Homes] für Heimatverzeichnisse. Alle weiteren Abschnitte bezeichnen »Volumes«, also Netzwerkverzeichnisse. Die folgenden Zeilen veranschaulichen die Syntax:

# Datei /etc/netatalk/afp.conf

[Global]
# nur relevant, wenn der AFP-Server einen anderen
# Namen als den Linux-Hostnamen haben soll
hostname = f23pc

[Homes]
# alle Linux-Heimatverzeichnisse freigeben
# (optional, für Time Machine nicht erforderlich)
basedir regex = /home

[TimeM]
# Verzeichnis für Time Machine
path           = /data/tm
time machine   = yes
valid users    = kofler
vol size limit = 500000
# maximale Volume-Größe in MB, d.h. 500.000 MB = 500 GB

Netatalk berücksichtigt die Zugriffsrechte unter Linux. Beim TimeMachine-Verbindungsaufbau muss gemäß der obigen Konfiguration also als Loginname kofler und das dazugehörende Linux-Passwort angegeben werden. Das Verzeichnis /data/tm auf dem Linux-Server muss für kofler les- und schreibbar sein:

root# mkdir -p /data/tm
root# chown kofler /data/tm

Firewall

Netatalk kommuniziert über den Port 548. Wenn dieser Port durch eine Firewall blockiert ist, was unter CentOS, Fedora, RHEL und SUSE der Fall ist, müssen Sie hierfür eine Ausnahmeregel definieren. Damit OS~X überhaupt weiß, dass es einen neuen AFP-Server im Netz gibt, muss außerdem der Avahi-Dämon via MDNS kommunizeren dürfen.

In den folgenden Kommandos für Fedora/CentOS/RHEL findet das erste firewall-cmd-Kommando heraus, welche Firewall-Zone für die die LAN-Schnittstelle enp0s3 gilt. Für diese Zone werden dann Ausnahmeregeln definiert und aktiviert:

firewall-cmd --get-zone-of-interface=enp0s3
    FedoraWorkstation
firewall-cmd --permanent --zone=FedoraWorkstation --add-service=mdns
firewall-cmd --permanent --zone=FedoraWorkstation --add-port=548/tcp
firewall-cmd --permanent --zone=FedoraWorkstation --add-port=548/udp
firewall-cmd --reload

Start

Der Start von Netatalk erfolgt durch das Init-System der Distribution. Dabei sollten Sie sicherstellen, dass auch der avahi-daemon läuft, was in der Regel der Fall ist.

systemctl status avahi-daemon
  Active: active (running) ...
systemctl start netatalk
systemctl enable netatalk

Im Einstellungsdialog der Time Machine können Sie das Volume nun unmittelbar auswählen.

Backup-Volume in den OS-X-Systemeinstellungen auswählen
Backup-Volume in den OS-X-Systemeinstellungen auswählen

Sparsebundle

Linux-seitig werden beim Backup unzählige 8-MByte-große Dateien erstellt, die zusammen ein »Sparse Bundle« bilden. Aus Linux-Sicht sind diese Dateien leider eine Black Box. Zugriff auf das Backup haben Sie also nur unter OS X.

ls -lR /data/tm/
/data/tm/:
insgesamt 8
drwx--S---. 3 kofler kofler 4096 27. Sep 21:41 imac.sparsebundle

/data/tm/imac.sparsebundle:
insgesamt 584
drwx--S---. 2 kofler kofler 536576 27. Sep 07:01 bands
-rw-r--r--. 1 kofler kofler    510 27. Sep 21:40 com.apple.TimeMachine.MachineID.bckup
-rw-r--r--. 1 kofler kofler    510 27. Sep 21:40 com.apple.TimeMachine.MachineID.plist
-rw-r--r--. 1 kofler kofler   1283 27. Sep 21:41 com.apple.TimeMachine.Results.plist
-rw-r--r--. 1 kofler kofler   1080 27. Sep 21:41 com.apple.TimeMachine.SnapshotHistory.plist
-rw-r--r--. 1 kofler kofler    499 26. Sep 22:46 Info.bckup
-rw-r--r--. 1 kofler kofler    499 26. Sep 22:46 Info.plist
-rwx------. 1 kofler kofler      0 26. Sep 22:46 token

/data/tm/imac.sparsebundle/bands:
...

Update 28.9.2015: Laut superuser.com gibt es mit der Kombination aus den beiden FUSE-Dateisystemen sparsebundlefs und tmfs doch eine Möglichkeit, auch unter Linux den Inhalt eines TimeMachine-Backups auszulesen. Ich habe es allerdings nicht probiert.

Raspbian Jessie (»Raspbian 2«)

$
0
0

Seit gestern ist eine vollkommen neue Version von Raspbian verfügbar, die auf Debian 8 (Jessie) basiert.

An der Benutzeroberfläche hat sich wenig geändert. Die Änderungen am System sind aber tiefreichend.
An der Benutzeroberfläche hat sich wenig geändert. Die Änderungen am System sind aber tiefreichend.

Download

Die neue Raspbian-Version ist wie üblich auf der Raspberry-Pi-Download-Seite verfügbar, und zwar wahlweise als NOOBS-Dateibündel zum direkten Kopieren auf eine VFAT-formatierte SD-Karte oder als Raspbian-Image-Datei.

Ich habe für meine Tests die Image-Datei verwendet. Die ZIP-Datei ist ca. 1,3 GByte groß. Windows-Anwender haben darüber geklagt, dass das darin enthaltene Image nicht entpacken lässt. Windows behauptet, das Image wäre viele TByte groß. Tatsächlich sind es etwas mehr als 4 GByte. Die Lösung für alle Windows-Freunde ist die Verwendung eines externen ZIP-Tools, z.B. 7-ZIP. Unter Linux funktioniert unzip erwartungsgemäß klaglos.

Das ist natürlich eine gute Gelegenheit, sich wieder mal über Microsoft lustig zu machen: Vier GByte-Dateien sollten die Windows-internen ZIP-Funktionen eigentlich nicht überfordern. Andererseits stellt sich die Frage, ob ein derart großes Image wirklich sinnvoll ist. So ist nun beispielsweise LibreOffice automatisch installiert. Wozu? Ubuntus Ansatz, ein kompaktes System zu liefern, das jeder selbst ergänzen kann, erscheint mir da sinnvoller.

Das Raspbian-Image ist übrigens nach wie vor für alle Raspberry-Pi-Modelle geeignet (anders als etwa openELEC, das getrennte Images für die Pi’s der ersten und er zweiten Generation anbietet). Die Raspbian-Entwickler sagen, eine spezielle Kompilierung für die ARMv7-Architektur des Pi 2 würde keine nennenswerten Geschwindigkeitsverbesserungen mit sich bringen.

Komfortable Konfiguration im Grafikmodus

Nachdem das Image auf eine SD-Karte mit zumindest 8 GByte übertragen ist, kann Raspbian sofort gestartet werden. Raspbian verwendet jetzt standardmäßig den Grafikmodus. Der Desktop sieht auf den ersten Blick ziemlich unverändert aus. Die Benutzeroberfläche verwendet anfänglich englische Menüs und Dialoge, außerdem gilt das US-Tastaturlayout. Von dem aus der ersten Raspbian-Version vertrauten Kommando raspi-config ist nichts zu sehen.

Zur Konfiguration ist das neue Programm Preferences / Raspberry Pi Configuration vorgesehen. Es stellt all die Funktionen zur Verfügung, die bisher raspi-config bot. Die Bedienung ist aber wesentlich einfacher. Mit Expand vergrößern Sie das Dateisystem so, dass es Ihre ganze SD-Karte ausfüllt. (Anfänglich ist das Dateisystem nur ca. 4 GByte groß.) Außerdem sollten Sie ein neues Passwort einstellen und im Dialogblatt Localisation die deutsche Sprache, ein deutsches Tastaturlayout und eine passende Zeitzone einstellen. Danach starten Sie Raspbian neu.

Das neue grafische Konfigurationsprogramm für Raspbian
Das neue grafische Konfigurationsprogramm für Raspbian
Einstellung der Sprache, der Zeitzone und des Tastaturlayouts
Spracheinstellung im neuen Raspbian-Konfigurationsprogramm
Hardware-Funktionen und SSH aktivieren/deaktivieren
Hardware-Funktionen und SSH aktivieren/deaktivieren

Die Konfiguration der Tastatur hat bei meinen Tests nicht funktioniert. Gut, dass es raspi-config noch gibt. Es kann weiterhin in einem Terminal mit sudo ausgeführt werden. Damit hat auch die Tastatureinstellung geklappt.

Raspbian-Update: nicht empfohlen

Mit dem üblichen Update-Kommando apt-get update && apt-get dist-upgrade erhalten Sie nur Updates für die bisherige Raspbian-Version. Es erfolgt kein automatisches Update auf Raspbian 2.

Wie Debian- und Ubuntu-Anwender wissen, ist ein Distributions-Update natürlich technisch möglich. Dazu müssen Sie vor der Ausführung der beiden apt-get-Kommandos die Paketquellen verändern. In der Ankündigung von Rapbian Jessie wird davon aber abgeraten. Wer es doch versuchen möchte, findet im Raspberry-Pi-Forum entsprechende Tipps.

Persönlich bin ich auch eher skeptisch, dass ein Distributions-Update gut gehen wird: Die Gefahr, dass eigene Konfigurationen und Veränderungen an Raspbian dazu führen, dass nach dem Update diverse Dinge nicht mehr funktionieren, ist bei vielen Bastelanwendungen nahezu 100 Prozent. Die dann erforderliche Fehlersuche ist sicherlich noch aufwendiger als eine Neuinstallation samt Backup, Dienste neu einrichten etc.

Versionsnummern

Die folgenden Tabellen fassen die Versionsnummer wichtiger Raspbian-Komponenten zusammen. Teilweise habe ich zum Vergleich auch bisher gültigen Versionsnummern bzw. Komponenten angegeben.

Basis
---------------
glibc        2.19
Kernel       4.1
Systemd      215   (bisher Init-V)
X-Server     1.16


Programmierung
---------------
bash      4.3      (bisher 4.2)
gcc       4.9
Java      8
PHP       5.6
Python    2.7/3.4  (bisher 2.7/3.2)


Server
--------------
Apache    2.4      (bisher 2.2)
CUPS      1.7      (bisher 1.5)
MySQL     5.5
OpenSSH   6.7
Samba     4.1      (bisher 3.6)

Init-System

Zu den größten strukturellen Änderungen in Raspbian 2 zählt das Init-System, das vom traditionellen Init-V-Prozess auf Systemd umgestellt wurde. Desktop-Anwender werden von dieser Umstellung nichts bemerken, aber wer in den Bootprozess eingreifen will, muss sich an einige Neuerungen gewöhnen. Da sich Raspbian wie Debian sehr stark auf die Init-V-Kompatibilität von Systemd verlässt, sind die Änderungen insgesamt weniger dramatisch als bei anderen Distributionen (Fedora, SUSE etc.). So gibt es für die meisten Netzwerkdienste noch traditionelle Init-V-Dateien, die wie bisher durch insserv aktiviert bzw. insserv -r deaktiviert werden können. Das gilt z.B. für den SSH-Server sshd.

Das Kommando service name start/stop/restart/reload kann weiterhin verwendet werden. Alternativ können Sie Dienste nun aber auch mit dem Systemd-eigenen Kommando systemctl starten/stoppen:

systemctl start ssh      (jetzt starten)
systemctl stop ssh       (jetzt stoppen)
systemctl enable ssh     (in Zukunft automatisch starten)
systemctl disable ssh    (in Zukunft nicht mehr autom. starten)

Anstelle von Runlevel gibt es nun Targets. Unter Raspbian ist standardmäßig das Target graphical aktiv:

systemctl get-default
  graphical.target

Die wichtigste Alternative zu diesem Target heißt multi user. Wenn Sie dieses Target aktivieren, wird Raspbian beim nächsten Neustart ohne die Grafikoberfläche gestartet:

systemctl set-default multi-user.target
  Created symlink from /etc/systemd/system/default.target
  to /lib/systemd/system/multi-user.target.

Wenn Sie das Target momentan ändern möchten (nicht dauerhaft), führen Sie systemctl isolate aus. Das folgende Kommando wechselt aus dem Textmodus in den Grafikmodus:

systemctl isolate graphical.target

Kommandos, die am Ende des Bootprozesses ausgeführt werden sollen, können Sie weiterhin im Script /etc/rc.local angeben. Achten Sie darauf, dass Sie Ihre Anweisungen vor der in der Datei bereits vorhandenen exit-Anweisung angeben!

Sonstige Details

  • IPv6: In Raspbian 2 ist IPv6 nun — wie in nahezu allen gängigen Distributionen — standardmäßig aktiv. Endlich, sollte man wohl sagen.

  • GPIO-Zugriff ohne sudo: Python-Scripts, die das RPi.GPIO-Modul verwenden, können nun auch ohne sudo GPIOs auslesen und verändern.

  • WiringPi: Die oft benötigte Bibliothek WiringPi muss nicht länger heruntergeladen und selbst kompiliert werden. Die Bibliothek befindet sich jetzt im Paket wiringpi. Dieses Paket ist standardmäßig installiert.

Endlich erschienen: Das Swift-Buch

$
0
0

Seit Ende September ist mein Swift-Buch nun endlich erhältlich. Das Buch hat bereits eine bewegte Geschichte hinter sich: Ursprünglich war der Erscheinungstermin bereits für Juni vorgesehen. Das damals gut 600-seitige Buch auf der Basis von Swift 1.2 war nahezu druckfertig, als Gerüchte von Swift 2 die Runde machten.

Also habe ich mich mit dem Rheinwerk Verlag darauf verständigt, Swift 2 abzuwarten und das Buch dahingehend nochmals zu überarbeiten. Das Buch hat dadurch in jeder Hinsicht gewonnen: Zum einen kamen nochmals mehr als 100 Seiten Text und das Beispielprogramm Fünf gewinnt!; zum anderen habe ich den ganzen Text nochmals durchgesehen und nicht nur im Hinblick auf Swift 2 überarbeitet. Das gerade erschienene Buch ist offiziell natürlich die erste Auflage; für mich ist es aber (auch vom Arbeitsaufwand!) bereits die zweite Auflage.

swift-buch

Warum Swift?

  • Swift ist momentan eine der modernsten verfügbaren Programmiersprachen. Es macht Spaß, damit zu arbeiten.
  • Mit Xcode gibt es eine phantastische Entwicklungsumgebung — kostenlos! (Es sei nicht verschwiegen, dass Sie vorher natürlich eine Menge Geld für einen Mac ausgeben müssen.)

  • Die Zukunft der App-Entwicklung im Apple-Universum heisst Swift. Objective C wird weiterleben, keine Frage, aber seine Hauptaufgabe wird es sein, vorhandenen Code zu warten. Niemand, der ein paar Wochen mit Swift gearbeitet hat, wird freiwillig noch ein Projekt mit Objective C starten.

Werfen Sie dazu auch einen Blick in das Vorwort:

Vorwort (PDF)

Swift in der Praxis

Zu Swift gibt es im Internet eine Menge Dokumentation, unter anderem das kostenlose Swift-eBook von Apple. Es beschreibt die Syntax von Swift wunderbar, aber recht theoretisch.

Ich habe mich hingegen bemüht, Swift so praxisnah wie möglich darzustellen. Natürlich enthält auch mein Buch eine vollständige Beschreibung der Sprachmerkmale von Swift. Die restlichen 60 Prozent des Buchs zeigen dann aber, wie Sie mit Swift Apps für iOS und OS X entwickeln — und das mit vielen konkreten Beispielen. Machen Sie sich selbst einen ersten Eindruck! Die beiden Leseproben zeigen denselben Inhalt, einmal in der Druck- und einmal in der farbigen eBook-Fassung.

Screenshot-Galerie

Leseprobe SW (PDF)

Leseprobe Farbe (PDF)

Alle Codebeispiele (ZIP)

Drei der Beispielprogramme sind soweit »praxistauglich«, dass ich sie als eigene Apps anbiete (natürlich kostenlos):

Ich richte mich mit meinem Buch an Einsteiger in die App-Programmierung. Es ist nicht erforderlich, dass Sie früher mit Objective C gearbeitet haben; Sie brauchen auch keine Vorkenntnisse in Xcode/Cocoa/Cocoa Touch. Sie sollten aber über Grundkenntnisse in der Programmierung verfügen, d.h. Begriffe wie Klasse oder Variable sollten Ihnen vertraut sein.

Rezensionsexemplare

Wenn Sie für einen Swift-, iOS-, OS-X- oder Apple-Blog schreiben oder Swift im Unterricht einsetzen und an einem Rezensionsexemplar interessiert sind, wenden Sie sich bitte an die Pressstelle des Rheinwerk Verlags.

Ubuntu 15.10

$
0
0

Ubuntu 15.10 fügt sich nahtlos in die Release-Reihe seit Version 14.04 ein: Außer Versions-Updates gibt es für Desktop-Anwender kaum sichtbare Änderungen.

Beginnen wir also gleich mit den Versionsnummern:

Basis           Desktop            Programmierung     Server
--------------  ------------------ --------------    --------------
Kernel     4.2  Gnome        3.16  bash       4.3    Apache    2.4
glibc     2.21  Firefox        41  gcc        5.2    CUPS      2.1
X-Server  1.17  Gimp          2.8  Java       7/8    MySQL     5.6
GRUB      2.02  LibreOffice   5.0  PHP        5.6    OpenSSH   6.9
Systemd    225  Thunderbird    38  Python 2.7/3.4    qemu/KVM  2.3
                Unity         7.3                    Postfix   2.11
                                                     Samba     4.1
Wenig Neues auf dem Ubuntu-Desktop 15.10
Wenig Neues auf dem Ubuntu-Desktop 15.10

Für Desktop-Anwender gibt es sonst nicht allzuviel zu berichten.

  • Wenn das Zentralmenü in den Systemeinstellungen deaktiviert wird, dann werden Fenstermenüs jetzt auch in Fenstern angezeigt, die gerade nicht aktiv sind — freilich nur, wenn die Maus gerade über die Titelleiste bewegt wird.
  • Die Scrollbalken werden nicht mehr durch eine Eigenentwicklung dargestellt, sondern durch normale Gnome-Bibliotheken. Sie sind jetzt nicht mehr ganz so schlank, dafür einfacher zu bedienen. (Das lustige Spiel »Fang den Scroll-Balken« ist zu Ende …)

  • Bemerkenswert ist, dass die VirtualBox-Pakete ganz aktuell in Version 5.0 vorliegen. Sollten Sie Ubuntu in einer VirtualBox-Umgebung ausprobieren, müssen Sie neben virtualbox-guest-x11 explizit auch virtualbox-guest-dkms installieren, sonst funktionieren die Gasttreiber nicht.

Systemd ist zwar in der über-aktuellen Version 225 dabei (offiziell gibt es erst Version 221 Wikipedia bzw. Distrowatch bezeichnen momentan die Versionen 219 bzw. 221 als stable), aber die vielen Scripts im Verzeichnis /etc/init.d beweisen, dass sich Ubuntu weiter stark auf die Init-V-Kompatibilität von Systemd verlässt.

Der stille Tod der Web-Apps

Die große Neuerung von Ubuntu 13.04 waren Web-Apps. Auch in der letzten LTS-Version 14.04 wurde die Möglichkeit, Webseiten wie kleine Programme auszuführen und im Dock zu verankern, noch prominent beworben. Seither ist es still um dieses Konzept geworden, das mich persönlich nie recht überzeugen konnte.

In Ubuntu 15.10 gibt es nur noch eine funktionierende Web-App — die für die Seite amazon. Das entsprechende Icons befindet sich auch unverändert im Dock. Vermutlich hat Canonical mit Amazon einen Werbe-Deal vereinbart, der die Platzierung dieses Icons beinhaltet. Das amazon-Icon zählt aber sicher zu den Icons, die üblicherweise am schnellsten aus dem Dock entfernt werden.

Wie auch immer: alle weiteren Webapp-Pakete werden gar nicht mehr installiert. Abhilfe schafft beispielsweise für die Twitter-App das folgende Kommando:

apt-get install unity-webapp-twitter

Twitter lässt sich nun tatsächlich wie eine App starten. Den automatischen Hinweis in Firefox, dass die Seite auch als Web-App verfügbar ist, gibt es aber dennoch nicht mehr.

Kurz und gut, einiges deutet darauf hin, dass die Zukunft der Web-Apps in Ubuntu nicht rosig ist.

Kubuntu

Kubuntu nutzt nun Plasma 5.4 und die KDE Applications 15.08. Der langjährige Kubuntu-Release-Manager Jonathan Riddell wird diesen Job allerdings nicht weiter ausüben (Details).

Ubuntu Server

Wesentlich mehr Aktivität als bei der Desktop-Version ist bei der Server-Variante festzustellen. Mark Shuttleworth hat sich in seiner Ankündigung des Code-Namens von Ubuntu 15.04 darauf konzentriert und berichtet von LXD, Snappy, MAAS und Juju — lauter Technologien bzw. Begriffe aus der Cloud- bzw. Docker-Welt.

Links

Linux: Eclipse findet Java nach Update nicht mehr

$
0
0

Der Eclipse-Installer von Eclipse 4.5 Mars speichert in eclipse/java-mars/eclipse/eclipse.ini unglücklicherweise den absoluten Pfad zur gerade aktuellen Java-Installation, in meinem Fall (unter Fedora 22) z.B.:

-vm
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc22.x86_64/jre/bin

Wird nun Java im Rahmen eines Updates auf eine neue Version aktualisiert, findet Eclipse Java nicht mehr und zeigt beim Startversuch nur eine Fehlermeldung an.

Abhilfe: Ändern Sie in eclipse/java-mars/eclipse/eclipse.ini die Zeile nach der Option -vm und geben Sie dort anstatt der exakten openjdk-Version einfach java-1.8.0-openjdk an:

-vm
/usr/lib/jvm/java-1.8.0-openjdk/jre/bin

Damit läuft Eclipse wieder, und das auch in Zukunft nach weiteren Java-Updates. Tatsächlich ist /usr/lib/jvm/java-1.8.0-openjdk ein symbolischer Link, der zuerst auf /etc/alternatives/java_sdk_1.8.0_openjdk und von dort auf die gerade installierte OpenJDK-8-Version zeigt.


Fedora 23

$
0
0

Fedora 23 ist fertig, und das mit nur einer Woche Verspätung! Aus beruflichen Gründen ist ist Fedora 23 auf meinen Rechnern und in diversen virtuellen Maschinen aber schon seit Monaten im Einsatz — genaugenommen seit der Freigabe der ersten Alpha-Version. Der Grund: Keine andere Distribution eignet sich so gut wie Fedora, wenn es darum geht, aktuellen Entwicklungen von Linux auszuprobieren. Bemerkenswert war dabei, dass ich eigentlich zu keinem Zeitpunkt irgendwelche Stabilitätsprobleme hatte.

Das liegt vielleicht daran, dass es in Fedora selbst wenig fundamentale Neuerungen gab, die nicht einfach aus den Versions-Updates resultieren. Natürlich wurde wie immer der ganze Software-Stack auf den allerneuesten Stand gebracht, davon abgesehen hat sich aber nicht viel Grundlegendes geändert. Wirklich spannend wird es voraussichtlich bei der nächsten Version, wenn Wayland zum Default-Grafiksystem werden soll. Bei meinen Tests hat sich Wayland aber schon jetzt recht gut geschlagen.

Versionen

Basis           Desktop            Programmierung     Server
--------------  ------------------ --------------    --------------
Kernel     4.2  Gnome        3.18  bash       4.3    Apache     2.4
glibc     2.22  Firefox        41  gcc        5.1    CUPS       2.1
X-Server  1.18  Gimp          2.8  Java         8    MariaDB   10.0
GRUB      2.02  LibreOffice   5.0  PHP        5.6    OpenSSH    7.1
Systemd    222  Thunderbird    38  Python 2.7/3.4    qemu/KVM   2.4
                                                     Postfix    3.0
                                                     Samba      4.3

Die Fedora-Entwickler haben das Kunststück geschafft, alle wichtigen Administrations- und Konfigurations-Werkzeuge und Scripts von Python 2 auf Python 3 zu portieren. Python 2 wird standardmäßig nicht mehr installiert. Python-2.7-Pakete stehen zwar noch zur Verfügung, sie befinden sich aber im maintenance mode. Die Wartung beschränkt sich damit auf kritische Bugfixes.

Details

Passwortkontrolle bei der Installation: Der Fedora-Installer, an sich schon kein Wunderwerk, was die Benutzerfreundlichkeit betrifft, ist jetzt noch ein wenig ekelhafter zu bedienen: Das Programm erzwingt nun nämlich lange und sichere Passwörter — auch wenn Sie Fedora nur in einer virtuellen Maschine installieren. (Aber niemand kann Sie hindern, die Passwörter nach der Installation als root mit passwd wieder zu vereinfachen.) Dieses »Sicherheits-Feature« war nur in der Beta aktiv und ist in der Final Version wieder entfernt worden. Danke für den diesbezüglichen Kommentar!

fedup ade: Das Update-Werkzeug fedup wird nicht mehr unterstützt. Distributions-Updates im laufenden Betrieb können nun mit dnf durchgeführt werden. Die Release Notes geben diese Kommandoabfolge zur Durchführung eines Updates von Fedora 22 auf Version 23 an. Selbst bin ich noch nicht dazugekommen, dies zu testen:

dnf install dnf-plugin-system-upgrade
dnf update
dnf repolist --releasever 23
dnf system-upgrade download --releasever 23
dnf system-upgrade reboot

Update 11.11.2015: Mittlerweile habe ich ein Notebook von Fedora 22 auf Fedora 23 aktualisiert. Im Prinzip hat alles funktioniert, einzig die für mich wichtige MySQL Workbench habe ich verloren. Es gibt dafür in den Fedora-23-Paketquellen kein Paket mehr. Oracle stellt zwar ein RPM-Paket zur Verfügung, dieses lässt sich aber nicht installieren, weil libzip.so.2 fehlt. Unter Fedora 23 gibt es nur libzip.so.4.

Ich habe dann versucht, libzip.so.2* manuell aus einem Fedora-22-Paket zu extrahieren und in /usr/lib64 zu installieren, aber selbst dann scheitert der Start der mit --nodeps installierten MySQL Workbench mit der Fehlermeldung undefined symbol: _ZN4Glibxxxx. Langer Rede kurzer Sinn: Nach einer Stunde Basteln und Googeln immer noch keine MySQL Workbench. (Wenn jemand eine Lösung kennt: bitte melden!)

Firmware-Updates: Firmware-Updates können jetzt direkt aus Gnome heraus initiiert werden — so wie ganz gewöhnliche Paket-Updates. Selber kann ich mich nicht erinnern, wann ich so etwas zuletzt benötigt habe, aber natürlich ist es eine feine Sache, wenn man bei Bedarf Firmware-Updates direkt unter Linux durchführen kann und dazu nicht auf Windows zurückgreifen muss. Die Grundlagen dafür entstammen dem Projekt fwupd und sind auf der Projektwebseite dokumentiert. Es bleibt aber abzuwarten, wie weit die Hardware-Hersteller entsprechende Update-Pakete zur Verfügung stellen werden.

KDE-Spin: Fedora verwendet Gnome als Desktop. Es gibt aber Varianten (»Spins«) mit anderen Desktops, unter anderem für KDE. Allerdings schreibt der dafür verantwortliche Maintainer Kevin Kofler (der übrigens nicht mit mir verwandt ist), dass der KDE-Spin von Fedora 23 is easily the worst KDE Spin we have ever released. Kevin Kofler ist gleichermaßen mit dem Fedora unglücklich (zu starke Gnome-Präferenzen) als auch mit dem KDE-Projekt (zu viele Einzelpakete, die schwer wartbar sind) und hat deswegen nach acht Jahren sein Maintainer-Rolle zurückgelegt. Die ausführliche Begründung kann hier nachgelesen werden.

32/64-Bit: Ab Fedora 24 soll Fedora nur noch als 64-Bit-Variante geben. Mir wird der Abschied von der 32-Bit-Variante nicht schwer fallen. Ich kann mich nicht erinnern, wann ich diese zuletzt verwendet habe.

Links

openSUSE Leap 42.1

$
0
0

Was Microsoft kann, kann openSUSE schon lange. Aber während Microsoft bei Windows nur einen bescheidenen Versionssprung von 8.1 auf 10 wagte, geht openSUSE gleich auf’s Ganze: Die Versionsnummer springt von 13.2 auf 42.1. Um den Neuanfang noch klarer zu machen, stellt man dem Namen auch gleich ‚Leap‘ voran. Ob Leap 42.1 für openSUSE der ersehnte Quantensprung wird, muss sich aber erst herausstellen.

Die Nummer 42 hat keine tiefere Bedeutung, sondern ist eine Anspielung auf das Buch Per Anhalter durch die Galaxis. In Zukunft soll die Versionsnummer aber die Verwandschaft mit der entsprechenden SUSE-Linux-Enterprise-Version (SLE) ausdrücken. Die aktuelle Version 42.1 basiert auf SLE 12.1. In ca. einem Jahr soll es openSUSE Leap 42.2 geben, wobei dann SLE 12.2 als Fundament dient etc.

Der Hybrid-Ansatz

Vom Versionsnummern-Trara abgesehen besteht die fundamentale Neuerung von openSUSE Leap darin, dass die Distribution nicht mehr wie frühere openSUSE-Versionen eigenständig ist, sondern dass Sie auf SLE basiert. Leap übernimmt damit das solide Enterprise-Fundament, was den openSUSE-Entwicklern eine Menge Zeit und Mühe spart. Gleichzeitig hebt sich openSUSE aber in einigen entscheidenden Punkten von SLE ab:

  • aktuelle Kernel-Version
  • aktuelles Grafiksystem
  • Unterstützung mehrerer Desktop-Systeme (KDE, Gnome, Xfce, LXDE)
  • aktueller Desktop-Stack (KDE, Gnome, LibreOffice, Gimp & Co.)

Die openSUSE-Entwickler sprechen deswegen von einem Hybrid-Ansatz, was die Sache eigentlich ganz gut trifft.

Versionsnummern

Der Hybrid-Ansatz wird bei den Versionsnummern deutlich: Während manche Komponenten aktuell oder beinahe aktuell sind (Kernel, xorg, Gnome, KDE), sind andere Versionsnummern deutlich älter als z.B. bei Fedora 23:

  • gcc: 4.8 versus 5.1
  • CUPS: 1.7 versus 2.1
  • Postfix 2.11 versus 3.0
  • etc.

Bei KDE, dem Default-Desktop von Leap, setzt openSUSE auf KDE Plasma 5.4 in Kombination mit dem KDE Framework 5.15 und den KDE Applications 15.08.

Basis           Desktop            Programmierung     Server
--------------  ------------------ --------------    --------------
Kernel     4.1  Gnome        3.16  bash       4.2    Apache     2.4
glibc     2.19  Firefox        41  gcc        4.8    CUPS       1.7
X-Server  1.17  Gimp          2.8  Java         8    MariaDB   10.0
GRUB      2.02  KDE Plasma    5.4  PHP        5.5    OpenSSH    6.6
Systemd    210  LibreOffice   5.0  Python 2.7/3.4    qemu/KVM   2.3
                Thunderbird    38                    Postfix   2.11
                                                     Samba      4.2
Der vom Autor leicht adaptierte KDE-Desktop von openSUSE Leap mit dem YaST-Kontrollzentrum
Der vom Autor leicht adaptierte KDE-Desktop von openSUSE Leap mit dem YaST-Kontrollzentrum

Installationsmedien

openSUSE bot traditionell verschiedene Installationsmedien an: Neben der Komplett-DVD mit dem Installationsprogramm und Paketen für alle Desktop-Systeme gab es auch installationsfähige Live-Systeme für KDE und Gnome — und alles sowohl in 32- als auch in 64-Bit-Versionen.

Leap hat hier radikal aufgeräumt: Zum einen gibt es Leap nur noch als 64-Bit-Distribution. (Fedora will das ab Version 24 ebenfalls machen.) Zum anderen gibt es keine Live-Systeme mehr.

Wer Leap installieren will, hat die Wahl zwischen dem Image der Komplett-DVD (ca. 4 GByte) oder dem vergleichsweise kleinen Network-Installer (ca. 100 MByte), der die zu installierenden Pakete aus dem Internet herunterlädt.

https://software.opensuse.org/421/en

Installation

Bei der Installation gibt es wenig Änderungen im Vergleich zu openSUSE 13.2. Als Default-Desktop ist KDE vorgesehen, Gnome, LXDE und Xfce sind mögliche Alternativen. Standardmäßig schlägt das Installationsprogramm btrfs für die Systempartition und xfs für die getrennte Home-Partition vor. Nur wenn der Platz es nicht zulässt, wird das Home-Verzeichnis in die Systempartition integriert.

Innerhalb des btrfs-Dateisystems werden unzählige Subvolumes angelegt, im Vergleich zu openSUSE 13.2 nun auch für MariaDB und qemu/KVM, lobenswerterweise auch gleich mit deaktivierten Copy-on-Write. Die vielen Subvolumes sind erforderlich, weil YaST bei administrativen Arbeiten automatisch Snapshots erzeugt. Das ermöglicht es später, administrative Schritte rückgängig zu machen, wobei die in den Subvolumes gespeicherten Daten (also z.B. MariaDB-Datenbanken) und das Home-Verzeichnis nicht angetastet werden.

Dieses Setup demonstriert den State-of-the-Art für btrfs, bringt aber eine enorme Komplexität mit sich. Meine Empfehlung für alle, die keine btrfs-Profis sind, lautet daher unverändert: Wählen sie lieber ext4 oder xfs als Dateisystem für die Systempartition. Das spart nicht nur Platz (mit dem btrfs recht verschwenderisch umgeht), sondern vereinfacht auch die Administration. Einzig auf die Undo-Funktion für administrative YaST-Vorgänge müssen Sie verzichten.

Der Vorschlag für die Partitionierung sieht ein btrfs-Dateisystem mit unzähligen Subvolumes vor
Der Vorschlag für die Partitionierung sieht ein btrfs-Dateisystem mit unzähligen Subvolumes vor
Mit wenigen Klicks können System- und Home-Partition als ext4-Dateisysteme eingerichtet werden
Mit wenigen Klicks können System- und Home-Partition als ext4-Dateisysteme eingerichtet werden
Zusammenfassung der Installationseinstellungen
Zusammenfassung der Installationseinstellungen

Nach der Installation

Nach der Installation bleibt die DVD als Paketquelle eingerichtet. Deswegen fragt Leap nun bei jeder Software-Installation nach der DVD bzw. dem USB-Stick mit dem Inhalt des DVD-Images. Sinnvoll ist das nur, wenn Sie weitere Pakete ohne Internet-Zugang installieren möchten — also wohl so gut wie nie. Deshalb sollten Sie im YaST-Modul Software Repositories die Paketquelle mit der URL cd://... deaktivieren oder löschen.

Desktop-Anwender können bei dieser Gelegenheit im gleichen Modul auch die Community-Paketquelle Packman aktivieren. Die brauchen Sie, damit Sie später Codecs zum Abspielen von Multimedia-Dateien installieren können. Am besten führen Sie nach der Aktivierung der Packman-Paketquelle in einem Terminalfenster zypper dup aus, um den ganzen Multimedia-Stack auf die Packman-Pakete umzustellen.

Je nach Grafikkarten können Sie auch Paketquellen zur Installation der proprietären NVIDIA- oder AMD-Grafiktreiber aktivieren. Eine weitere Paketquelle stellt bei Bedarf das Adobe-Flash-Plugin für Firefox zur Verfügung. Darauf können Sie aber oft verzichten, weil Sie dieses Plugin auch aus der Packman-Paketquelle beziehen können.

Auswahl der Community-Paketquellen im YaST-Modul 'Software Repositories'
Auswahl der Community-Paketquellen im YaST-Modul ‚Software Repositories‘

Wenn Sie bei der Installation nicht aufgepasst und die entsprechende Option bei der Zusammenfassung der Installationseinstellungen übersehen haben, wird der standardmäßig installierte SSH-Server nicht gestartet. Damit Sie Ihre Leap-Installation via SSH administrieren können, müssen Sie die folgenden Kommandos ausführen:

systemctl enable sshd
systemctl start sshd

Außerdem müssen Sie im YaST-Modul Firewall sicherstellen, dass der Dienst Secure Shell Server in der Liste der erlaubten Dienste aufgelistet wird. Ist das nicht der Fall, fügen Sie den Dienst hinzu.

Quantensprung oder letztes Aufbegehren?

Ist Leap ein Quantensprung für das openSUSE-Projekt oder ist es ein letztes Aufbegehren des freien SUSE-Zweigs angesichts der erdrückenden Konkurrenz durch Debian, Fedora, Ubuntu & Co.? Für ein endgültiges Urteil ist es sicherlich zu früh, und selbst eine persönliche (subjektive) Einschätzung fällt mir schwer. Der Ansatz von Leap ist pragmatisch, einfach und gut: Man verwendet angesichts kleiner Ressourcen den stabilen Unterbau von SLE und kombiniert diesen mit modernen Kernel-, Grafik- und Desktop-Komponenten. Gleichzeitig macht der verlängerte Update-Zeitraum Leap attraktiver.

Eine Frage bleibt aber (zumindest für mich) offen: Wer ist eigentlich die Zielgruppe von Leap? In Frage kommen:

  • Desktop-Anwender: Für diese ist Leap weniger experimentell und einfacher zu installieren als Fedora, moderner als Debian, näher an üblichen Linux-Konventionen und -Standards als Ubuntu. Wie gut die längerfristige Wartung funktioniert, muss sich aber erst zeigen. Mit der Präferenz für KDE sticht Leap aus der Masse hervor. Für KDE-Fans ist das ein Pluspunkt, aber ob dies auch für andere Linux-Einsteiger und -Umsteiger gilt, bin ich mir nicht sicher. Diese können sich immerhin damit trösten, dass SLE auf Gnome setzt und Leap somit auch das Gnome-Lager solide bedienen sollte. Einzig die btrfs-Default-Konfiguration erscheint mir für das Desktop-Segment denkbar unglücklich.
  • Server-Administratoren: Das herkömmliche openSUSE war für den Server-Einsatz wegen des nur 18-monatigen Wartungszeitraums uninteressant. Auch das Evergreen-Angebot (zuletzt für openSUSE 13.1) mit inoffiziellen Updates über einen längeren Zeitraum hat mich nicht überzeugt. Leap verspricht deutlich längere Einsatzzeiträume von zumindest mehreren Jahren. Ähnlich konkrete Zeitangaben wie bei Ubuntu LTS oder CentOS, meinen Favoriten für kostenlose Server-Distributionen, gibt es aber nicht (siehe https://en.opensuse.org/Lifetime). Überzeugende Argumente, die für Leap und gegen CentOS oder Ubuntu LTS sprechen, fehlen ebenfalls. Insofern wird Leap als Server-Distribution wohl am ehesten erfahrene SLE-Administratoren ansprechen, denen nun gewissermaßen eine kostenlose SLE-Variante zur Verfügung steht — vielleicht nicht so robust wie CentOS im Vergleich zu Red Hat, aber möglicherweise robust genug.

  • Entwickler: Für Entwickler, die Wert auf die gerade neuesten Versionen von Programmiersprachen, Compilern und Bibliotheken legen, war Fedora bisher die erste Wahl. Denkbare Alternativen sind Arch Linux, eventuell aktuelle Ubuntu-Versionen oder auch Tumbleweed aus dem SUSE-Lager. Leap kann dem nicht viel entgegenstellen, weil die für Entwickler relevanten Komponenten von SLE stammen, und somit zwar ausgereift, aber selten aktuell sind.

Wirklich überzeugend spricht Leap meiner Ansicht nach keine der drei Zielgruppen an. Persönlich hoffe ich dennoch, dass es Leap gelingt, sich längerfristig zu etablieren. Linux lebt von Wettstreit der Ideen, und (open)SUSE war da immer ein wichtiger Mitspieler.

Links

sudo ohne Passwort

$
0
0

An sich ist das unter Ubuntu vorkonfigurierte sudo-Konzept vernünftig: Benutzer der sudo-Gruppe dürfen, nach der Eingabe ihres Passworts, Kommandos mit Administrator-Rechten ausführen. Was aber, wenn Sie möchten, dass alle Benutzer — oder auch nur einzelne Benutzer — bestimmte Kommandos auch ohne Passworteingabe ausführen dürfen? Denkbar wäre dies z.B. für apt-get, damit bestimmte Benutzer auch ohne Passwort-Eingabe bzw. ohne andere sudo-Rechte Programme installieren und Updates durchführen dürfen.

Vorsichtsmaßnahmen

Die Veränderung von /etc/sudoers ist gefährlich. Wenn Sie einen Syntaxfehler einbauen, ist ein weiterer sudo-Kommando unmöglich und Sie können den Fehler nicht mehr korrigieren! Um dieses Dilemma zu vermeiden, können Sie drei Vorsichtsmaßnahmen ergreifen:

  • Sie ändern /etc/sudoers nicht mit irgendeinem Editor, sondern mit visudo. Vor dem Speichern führt visudo einen Syntaxtest durch. Sie können die Datei erst speichern, wenn die Syntax korrekt ist. Wenn Sie keine Lust auf den Editor vi haben, stellen Sie vor der Ausführung von visudo den gewünschten Editor mit export EDITOR=$(which nano) ein, wobei Sie nano durch Ihren Lieblingseditor ersetzen.
  • Sie definieren vorübergehend ein Passwort für root. Das gibt Ihnen die Möglichkeit, sich unabhängig von sudo als root anzumelden, z.B. mit su -l oder in einer Textkonsole.

  • Sie lassen parallel zu Ihren Tests ein Terminalfenster offen, in dem Sie root-Rechte haben. Dieses Fenster schließen Sie erst, wenn Sie alle Tests erfolgreich abgeschlossen haben.

Syntax in /etc/sudoers

Die Grundsyntax für die Zeilen in /etc/sudoers lautet:

<wer>   <auf welchem Host>=(<als welcher Benutzer>) <darf was ausführen>

Die Zeile

kofler ALL=(ALL) ALL

bedeutet, dass kofler nach einer Authentifizierung auf jedem Rechner arbeiten kann (wobei /etc/sudoers normalerweise aber nur für den lokalen Host gilt; insofern ist das erste ALL nicht wirklich aussagekräftig), dass er als beliebiger Benutzer arbeiten kann (normalerweise wohl als root, aber prinzipiell auch als lp oder www-data oder unter welchem Account auch immer), und dass er schließlich jedes beliebige Kommando ausführen kann. Weitere Details liefert die sehr unübersichtliche man-Seite zu sudoers sowie dieser viel besser lesbare Beitrag auf unix.stackexchange.com.

sudo ohne Passwort

Zurück zur eigentlichen Fragestellung: Wie lässt sich erreichen, dass bestimmte Kommandos mit sudo auch ohne Passwortangabe ausgeführt werden können? Indem Sie zusätzlich das Schlüsselwort NOPASSWD verwenden. Die folgende Zeile bewirkt, dass huber die Kommandos sudo apt-get und sudo synaptic ausführen darf, ohne ein Passwort anzugeben.

huber ALL=(ALL) NOPASSWD: /usr/bin/apt-get, /usr/sbin/synaptic

Noch liberaler ist die folgende Zeile, die dies jedem Benutzer erlaubt:

ALL ALL=(ALL) NOPASSWD: /usr/bin/apt-get, /usr/sbin/synaptic

Es ist Ihnen sicher klar, dass man mit apt-get jedes System vollständig zerstören kann, z.B. durch die Deinstallation systemrelevanter Pakete. Insofern sind die obigen Einstellungen in /etc/sudoers nur zweckmäßig, wenn Sie den betreffenden Personen vertrauen können …

Raspbian (Raspberry Pi)

Radikal unsicher sind die Defaulteinstellungen unter Raspbian: Dort kann der Benutzer pi jedes administratives Passwort mit sudo ohne Passwort ausführen.

### Defaultkonfiguration in /etc/sudoeres unter Raspbian
...
pi ALL=(ALL) NOPASSWD: ALL

Da das Passwort für pi vordefiniert und öffentlich bekannt ist, heisst das: Jede Raspbian-Installation, bei der SSH aktiviert ist und das pi-Passwort in der Defaulteinstellung belassen wurde, steht offen wie ein Scheunentor.

Das ist definitiv nicht empfehlenswert, selbst wenn das Gerät nur im lokalen Netzwerk eingesetzt wird. Abhilfe: Ändern Sie zumindest das Passwort von pi. Selbst entferne ich auch NOPASSWD: aus /etc/sudoers, obwohl das natürlich unbequem ist.

bash_completion in Ubuntu 15.10

$
0
0

Wenn Sie im Terminal die Tabulator-Taste drücken, vervollständigt die bash normalerweise Ihre begonnene Eingabe. apt-get dist-upg <Tab> wird zu apt-get dist-upgrade. Diese Funktion heißt bash_completion — und obwohl das betreffende Paket in Ubuntu 15.10 installiert ist, funktioniert es nicht. Schuld ist eine fehlerhafte Einstellung in /etc/bash.bashrc. Laden Sie diese Datei also in einen Editor und entfernen Sie vor den folgenden Zeilen jeweils das Kommentarzeichen #, das dort aus unerfindlichen Gründen enthalten ist.

# enable bash completion in interactive shells
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

Update 2.12.2015: Wie in den Kommentaren korrekt angemerkt, funktioniert die bash_completion normalerweise sehr wohl. Beim Einrichten eines neuen Benutzers wird /etc/skel/.bashrc in das Heimatverzeichnis des Benutzers kopiert. Diese Datei enthält die richtigen Einstellungen für die bash_completion. Bei mir hat es deswegen nicht funktioniert, weil ich den Benutzer-Account von einer anderen Linux-Distribution übernommen habe. Dessen Datei .bashrc enthielt aber andere Einstellungen.

Ubuntu MATE 15.10 auf dem Raspberry Pi 2

$
0
0

Nach wie vor bietet die MATE-Variante von Ubuntu die beste Unterstützung für den Raspberry Pi. Vorausgesetzt wird die Version 2 mit einer ARMv7-CPU. Die älteren Modelle, aber auch das neue Zero-Modell enthalten dagegen ein System-on-a-Chip mit ARMv6-Architektur, das nicht kompatibel zu Ubuntu ist.

Die Hardware-Unterstützung für den Raspberry Pi hat sich in der aktuellen Version stark gegenüber Ubuntu MATE 15.04 verbessert. Einzig raspi-config oder ein vergleichbares Konfigurationswerkzeug fehlt noch.

Installation

Zur Installation laden Sie das MATE-Image von https://ubuntu-mate.org herunter, dekomprimieren es mit bunzip2 und übertragen es auf eine leere, zumindest 4 GByte große SD-Karte.

Beim ersten Start erscheint ein Installationsassistent, in dem Sie die gewünschte Sprache, die Zeitzone, das Tastaturlayout und schließlich den Rechnernamen und Ihre Account-Daten einstellen. Die nachfolgenden, automatisch ausgeführten Konfigurationsarbeiten dauern ein paar Minuten.

Danach erscheint direkt die Login-Box, die in den MATE-Desktop führt und bei Linux-Veteranen Erinnerungen an das Gnome-2-Zeitalter weckt. Der Desktop sieht gut aus und lässt sich einfach bedienen. Insgesamt ist die Oberfläche aber schwerfälliger als unter Raspbian, das stärker auf bestmögliche Performance optimiert ist.

Der MATE-Desktop von Ubuntu MATE 15.10 auf einem Raspberry Pi 2
Der MATE-Desktop von Ubuntu MATE 15.10 auf einem Raspberry Pi 2

SD-Karte vollständig nutzen

Egal, wie groß die SD-Karte ist, Ubuntu MATE nutzt anfänglich nur knapp die ersten 4 GByte. Um die ganze Karte zu nutzen, müssen Sie die zweite Partition der SD-Karten löschen und dann neu erstellen, wobei der Startsektor gleich bleiben muss. Das folgende Listing illustriert die Vorgehensweise. Die Eingaben sind mit <---- markiert.

sudo fdisk /dev/mmcblk0
  Welcome to fdisk (util-linux 2.26.2).
Command (m for help): p <----
  Disk /dev/mmcblk0: 7,4 GiB, 7969177600 bytes, 15564800 sectors
  Units: sectors of 1 * 512 = 512 bytes
  Sector size (logical/physical): 512 bytes / 512 bytes
  I/O size (minimum/optimal): 512 bytes / 512 bytes
  Disklabel type: dos
  Disk identifier: 0x6daf3206
  Device         Boot  Start     End Sectors  Size Id Type
  /dev/mmcblk0p1 *      2048  133119  131072   64M  c W95 FAT32 (LBA)
  /dev/mmcblk0p2      133120 7679999 7546880  3,6G 83 Linux

Command (m for help): d  <----
Partition number (1,2, default 2): 2 <----
Partition 2 has been deleted.

Command (m for help): n <----
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p <----
Partition number (2-4, default 2): 2 <----
First sector (133120-15564799, default 133120): <---- (einfach Return drücken)
Last sector, +sectors or +size{K,M,G,T,P} (133120-15564799,
  default 15564799):  <----  (einfach Return drücken)
Created a new partition 2 of type 'Linux' and of size 7,4 GiB.

Command (m for help): p <----
  Disk /dev/mmcblk0: 7,4 GiB, 7969177600 bytes, 15564800 sectors
  ...
  Device         Boot  Start      End  Sectors  Size Id Type
  /dev/mmcblk0p1 *      2048   133119   131072   64M  c W95 FAT32 (LBA)
  /dev/mmcblk0p2      133120 15564799 15431680  7,4G 83 Linux

Command (m for help): w  <----
  The partition table has been altered.
  Calling ioctl() to re-read partition table.
  Re-reading the partition table failed.: Device or resource busy
  The kernel still uses the old table. The new table will be used
  at the next reboot or after you run partprobe(8) or kpartx(8).

Nach einem Neustart müssen Sie auch das Dateisystem an die vergrößerte Partition anpassen:

sudo reboot
sudo resize2fs /dev/mmcblk0p2

Neu in Ubuntu MATE 15.10

Im Vergleich zu MATE 15.04 gibt es natürlich die üblichen Versions-Updates, auf die ich hier nicht eingehe. (Eine Zusammenstellung der wichtigsten Versionsnummern von Ubuntu 15.10 finden Sie hier.) Davon abgesehen gibt es aber einige Raspberry-Pi-spezifische Neuerungen, die durchaus von Interesse sind:

  • Ubuntu MATE verwendet jetzt so wie aktuelle Raspbian-Versionen Kernel Device Trees. Zur Nutzung spezieller Hardware-Komponenten oder -Funktionen muss wie in Raspbian /boot/config.txt geändert werden. Details sind in der Datei /boot/overlays/README ausführlich beschrieben.
  • Das neue Kommando raspi-gpio aus dem gleichnamigen Paket bietet eine unkomplizierte Möglichkeit, GPIOs auszulesen bzw. zu verändern. Es gibt zwar keine man-Seite, dafür liefert raspi-gpio einen recht ausführlichen Hilfetext. Die GPIOs werden in der Broadcom-Nomenklatur adressiert, nicht über Pin-Nummern! Das Kommando muss mit root-Rechten (mit sudo) ausgeführt werden.

  • Das RPi.GPIO-Modul zur Python-Programmierung ist jetzt standardmäßig für die Pyhton-Versionen 2 und 3 installiert. Anders als unter Raspbian erfordert die Nutzung der RPi.GPIO-Funktionen aber weiterhin root-Rechte.

  • Auch die wiringpi-Bibliothek samt dem Kommando gpio ist standardmäßig installiert. Dieses Kommando kann die GPIO-Funktionen auch ohne root-Rechte steuern.

  • Der SSH-Server ist standardmäßig installiert und aktiv.

Unterschiede zu Raspbian

Vom Desktop einmal abgesehen gibt es einige weitere grundlegende Unterschiede zwischen Raspbian und Ubuntu MATE:

  • Die Konfigurationshilfe raspi-config steht nicht zur Verfügung, weder als Kommando noch als grafische Benutzeroberfläche. Zur Konfiguration ist daher mehr Handarbeit und Know-how erforderlich.

  • Die Ausführung von sudo erfordert die Angabe des Login-Passworts. Wenn Sie das stört, können Sie /etc/sudoers entsprechend anpassen. Sicherer ist aber definitiv der Ansatz von Ubuntu!

  • Die Pakete für Mathematica und die Wolfram Language stehen nicht zur Verfügung.

Viewing all 274 articles
Browse latest View live