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

»Natural Scrolling« mit dem Mausrad

$
0
0

Apple hat den Begriff »Natural Scrolling« geprägt und meint damit, dass bei Scroll-Bewegungen auf dem Touchpad der Fensterinhalt in die gleiche Richtung bewegt wird — so wie auf einem Smartphone. Unter Windows und Linux ist es aber normalerweise anders — mit dem Touchpad wird eigentlich der Scrollbalken gesteuert, der Fensterinhalt bewegt sich deswegen in umgekehrter Richtung.

Unter Linux bieten Gnome und Unity/Ubuntu in den Systemeinstellungen längst eine entsprechenden Option Natural Scrolling. Diese gilt aber nur für Touchpads und ignoriert Mäuse mit einem Mausrad. Dafür gab es in der Vergangenheit die Xmodmap-Lösung, also die Datei .Xmodmap mit dem Eintrag pointer = 1 2 3 5 4 7 6. Allerdings ignoieren alle aktuellen Gnome- bzw. GTK-Programme den veralteten Xmodmap-Mechanismus zur Verarbeitung von Maus-Klick-Ereignissen.

Heute bin ich endlich — eher zufällig — auf einen neuen, aktuelleren Konfigurationsweg gestoßen.

Sie richten einfach in /usr/share/X11/xorg.conf.d eine neue Konfigurationsdatei an, die für alle Pointer-Devices die Optionen VertScrollDelta, HorizScrollDelta und DialDelta auf den Wert -1 stellt.

# Datei /usr/share/X11/xorg.conf.d/20-natural-scrolling.conf
Section "InputClass"
        Identifier "Natural Scrolling"
        MatchIsPointer "on"
        MatchDevicePath "/dev/input/event*"
        Option "VertScrollDelta" "-1"
        Option "HorizScrollDelta" "-1"
        Option "DialDelta" "-1"
EndSection

Damit die Konfiguration wirksam wird, müssen Sie das Grafiksystem neu starten (am einfachsten durch einen Reboot).

Quelle

http://forums.fedoraforum.org/showthread.php?t=298702


Ubuntu unter Windows ausprobiert

$
0
0

Bis vor ein paar Tagen hätte jeder diese Überschrift für einen Aprilscherz gehalten, aber die Zeiten ändern sich manchmal schnell …

Microsoft auf auf der Entwicklerkonferenz Build 2016 einigermaßen überraschend verraten, dass in zukünftigen Windows-Versionen die bash sowie eine ganze Sammlung von Linux-Tools auf der Basis von Ubuntu 14.04 integriert werden soll. Später soll dieses Angebot auf Ubuntu 16.04 aktualisiert werden. Hier die Links zu den quasi »offiziellen« Ankündigungen:

Es schadet vielleicht nicht, nochmals zu wiederholen, wofür das Linux-Subsystem gedacht ist (und wofür nicht): Microsoft will offensichtlich Entwicklern helfen, die in beiden Welten arbeiten — die also unter Windows Programme entwickeln, aber gleichzeitig Linux-Server-Dienste ausführen möchten oder auch nur einen vernünftigen Werkzeugkasten mit ssh/scp/less/grep/find/sed etc. brauchen.

Das führte bisher meist dazu, dass parallel zu Windows eine virtuelle Linux-Maschine lief. Aber noch eleganter ist es natürlich, wenn diese Werkzeuge direkt unter Windows laufen. Selbst innerhalb von Microsoft kann man eventuell argumentieren, dass ein in Windows integriertes Linux-System im Vergleich zu einer vollwertigen Linux-Installation in einer VM immer noch das kleinere Übel ist.

Das Linux-Subsystem hat keine grafische Benutzeroberfläche, diese ist auch nicht geplant. Insofern richtet sich das Angebot definitiv nicht an Einsteiger. Momentan gibt es offensichtlich keine Absichten, X (oder Wayland oder gar Mir?) ebenfalls in Windows zu integrieren. Aber, so beweglich, wie Microsoft zur Zeit agiert, gilt wohl: Sag niemals nie.

Voraussetzungen

Die Linux-Umgebung ist zwar (bei weitem) noch nicht fertiggestellt, lässt sich aber mittlerweile testen. Eine ausführliche Installationsanleitung gibt es hier:

http://blog.dustinkirkland.com/2016/04/howto-ubuntu-on-windows.html

Die Kurzfassung:

  • Sie brauchen Windows 10 (64 Bit!), wobei es ausreicht wenn das Ding in einer virtuellen Maschine läuft :-)
  • Sie müssen Mitglied im Insider Preview Programm sein und in Windows den Insider-Modus aktivieren.
  • Sie müssen den Windows-Entwickler-Modus aktivieren (Systemeinstellungen, Modul Update und Sicherheit, Dialogblatt Für Entwickler).
  • Sie müssen für die Insider Previews die »Fast Lane« aktivieren (Systemeinstellungen, Modul Update und Sicherheit, Dialogblatt Windows Update, dann Erweiterte Optionen, schließlich den Regler für die Insider-Stufe ganz nach rechts ziehen).
  • Sie müssen den aktuellen Insider-Build 14316 herunterladen (oder in Zukunft eine neuere Version).
  • Sie müssen das Feature Windows Subsystem for Linux (Beta) aktivieren. Den entsprechenden Dialog finden Sie, wenn Sie im Startmenü nach Windows-Features aktivieren oder deaktivieren suchen.
  • Sie müssen, nochmals im Startmenü, das Programm bash starten. Die bash wird in cmd.exe ausgeführt (igitt!) und fragt beim ersten Start, ob es Ubuntu on Windows aus dem Windows Store herunterladen soll. Ja bitte!

Wie unter Windows üblich, sind im Verlauf dieser Arbeiten zumindest ein halbes Dutzend Neustarts erforderlich.

Aktivierung des »Windows Subsystem für Linux«
Aktivierung des »Windows Subsystem für Linux«
Download von »Ubuntu on Windows, distributed by Canonical«
Download von »Ubuntu on Windows, distributed by Canonical«

Erste Tests

Der Start von bash im Windows-Menü öffnet ein neues, cmd.exe-ähnliches Fenster mit Ubuntu-Logo. Der Prompt ist anders (root@localhost), und auch sonst hat das Fenster mehr Ähnlichkeiten mit einem Linux-Terminal als mit cmd.exe. Sogar die Farbdarstellung funktioniert, z.B. bei grep oder ls.

Erste Erkundungen in der bash
Erste Erkundungen in der bash

dpkg -l zeigt, das standardmäßig beachtliche 437 Ubuntu-Pakete installiert sind, unter anderem:

  • apt
  • bash
  • cron
  • dpkg
  • nano
  • openssh-client und -server
  • openssl
  • perl
  • python (Version 2.7 und 3.4)
  • rsync
  • sed
  • sudo
  • tar
  • upstart
  • vim

Die Paketverwaltung funktioniert wie in Debian/Ubuntu gewohnt, Sie können also problemlos weitere Pakete mit apt-get install installieren. sources.list enthält übrigens die ganz gewöhnlichen Ubuntu-Paketquellen, keine speziellen, für Windows optimierte/kompilierte Pakete!

cat /etc/apt/sources.list
  deb http://archive.ubuntu.com/ubuntu trusty main restricted universe multiverse
  deb http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe multiverse
  deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse

Netzwerkfunktionen

Hier gibt es noch große Problem. ping google.at liefert die Fehlermeldung Socket type not supported. ssh meinserver funktioniert problemlos. Die Kommandos ip addr und ifconfig liefern aber wieder Fehler (cannot open netlink socket bzw. cannot open /proc/net/dev).

Zeit

date zeigt die GMT-Zeit an. Es ist aber möglich, die Zeitzone zu ändern:

ln -s -f /usr/share/zoneinfo/Europe/Berlin /etc/localtime

Init-System

Da Ubuntu 14.04 als Basis dient, ist Upstart als Init-System installiert. Es scheint aber momentan nur wenige Funktionen (keine?) zu bieten. ps ax zeigt, dass standardmäßig überhaupt keine Hintergrundprozesse laufen. Die Prozessliste besteht nur aus /init, /bin/bash und ps.

Der Versuch, den installierten ssh-Server zu starten, scheitert:

service ssh start
 initctl: Unable to connect to Upstart: Failed to
 connect to socket /com/ubuntu/upstart: No such file
 or directory

Auch das direkte Ausführen des Init-Scripts führt zu einem Fehler:

/etc/init.d/ssh start
 * /dev/null is not a character device!

Nun habe ich versucht, sshd manuell zu starten — leider weiterhin ohne Erfolg:

dpkg-reconfigure openssh-server
  Creating SSH2 RSA key; this may take some time ...
  Creating SSH2 DSA key; this may take some time ...
  Creating SSH2 ECDSA key; this may take some time ...
  Creating SSH2 ED25519 key; this may take some time ...
  initctl: Unable to connect to Upstart:
  ...
  /dev/null is not a character device!

/usr/sbin/sshd -D &

sshd läuft jetzt im Hintergrund, lässt sich aber nicht verwenden. (ssh localhost führt zum Fehler Connection closed by 127.0.0.1.) An dieser Stelle habe ich aufgegeben — und auch gleich auf alle Versuche verzichtet, als nächstes Apache einzurichten.

Losgelöst von diesen Detailproblemen ist mir unklar, wie das Linux-Subsystem mit Hintergrunddiensten umgehen wird: Sollen alle Linux-Prozesse mit dem Schließen des bash-Fensters enden? Werden die laufenden Prozesse dann wenigstens ordentlich hinuntergefahren? (Man denke etwa an Datenbank-Server …)

Benutzerverwaltung

Jegliche Arbeit in der bash erfolgt momentan als root. Man hat sich hier an Windows 95 orientiert ;-)

Nein, Scherz beiseite, Microsoft weiß, dass hier noch Optimierungsbedarf besteht. Ich habe sogar den Eindruck gewonnen, dass das Fundament schon weitestgehend funktioniert. Es ist kein Problem, mit adduser einen neuen Benutzer einzurichten, mit su -l einen Benutzerwechsel durchzuführen etc.

Nett wäre halt‘, wenn man beim Start der bash Ubuntu-typisch als normaler Benutzer eingeloggt würde und erst später, bei Bedarf, mit sudo root-Rechte erlangen könnte.

Die Linux-Benutzerverwaltung erfolgt vollkommen losgelöst von Windows. Die Daten werden wie üblich in /etc/passwd, /etc/shadow usw. gespeichert. Allerdings ist es anscheinend so, dass der Windows-Account, von dem aus Sie die bash starten, gewissermaßen das Maximum der Rechte limitiert, mit der Sie von Linux aus auf das restliche Windows-System zugreifen können.

Tastatur-, Maus- und Darstellungsprobleme

  • Die bash hat anscheinend manche Einschränkungen von cmd.exe geerbt. Die Navigation des Cursors an den Beginn bzw. das Ende der Zeile mit Strg+A/Strg+E funktioniert nicht. Löschen mit Strg+D funktioniert aber. Auch das Stoppen oder Unterbrechen eines Kommandos mit Strg+C bzw. Strg+Z funktioniert. Strg+L für Clear Screen funktioniert ebenfalls.
  • Die Eingabe von äöüß, des Pipe-Zeichens | sowie der Zeichen [ und } hat in meinen Tests nicht funktioniert. (Testumgebung: Ein Mac mit OS X, Mac-Tastatur, Windows 10 in einer Virtual-Box-Maschine.) Nun ist es natürlich naheliegend, meine Testumgebung für das Eingabeproblem verantwortlich zu machen — in Notepad.exe kann ich all diese Zeichen aber problemlos eingeben. Von dort habe ich mir die Zeichen dann bei Bedarf per Zwischenablage kopiert. Das gelingt wiederum nur per Maus, weil die in Linux-Terminal üblichen Kürzel Shift+Strg+C / Shift+Strg+V offensichtlich nicht unterstützt werden.

  • Markieren und Einfügen mit der mittleren Maustaste geht (natürlich) auch nicht.

  • Das Scrollen nach oben mit less führt zu Darstellungsfehlern. Auch bei einer Veränderung der Fenstergröße geht der Inhalt des Fensters verloren.

Ich habe versucht, die Tastaturkonfiguration selbst zu verändern, aber dpkg-reconfigure keyboard-configuration führte zu einem Fehler. Die manuelle Veränderung von /etc/default/keyboard blieb wirkungslos, möglicherweise wegen des fehlenden Init-Prozesses.

Dateisystem

Wo befindet sich das Linux-Dateisystem aus Windows-Sicht? Wenn Sie im Windows Explorer die Option Geschützte Systemdateien ausblenden deaktivieren (doppelte Verneinungen sind immer schön), dann finden Sie das Linux-Root-Dateisystem sowie weitere Verzeichnisse für /home, /root hier:

C:\Users\<ihr-user-name>\AppData\Local\lxss
Das Linux-Dateisystem befindet sich im AppData-Verzeichnis des Windows-Nutzers
Das Linux-Dateisystem befindet sich im AppData-Verzeichnis des Windows-Nutzers

Um umgekehrt vom Linux-Subsystem auf das Windows-Dateisystem zuzugreifen, verwenden Sie das Verzeichnis /mnt/c. Wie die Verbindung hinter den Kulissen funktioniert, hat sich mir nicht erschlossen. Es gibt für das Verzeichnis keinen mount-Eintrag, auch nicht in /etc/fstab. Es ist auf jeden Fall möglich, von Linux aus auf das Windows-Dateisystem zuzugreifen (auch wenn es vielleicht Einschränkungen gibt, dir mir nicht bewusst sind).

Es ist möglich, in der bash eine Datei zu erzeugen, die auf dem Windows-Desktop sichtbar ist
Es ist möglich, in der bash eine Datei zu erzeugen, die auf dem Windows-Desktop sichtbar ist

bash-completion

Die Vervollständigung von Verzeichnis- und Dateinamen mit Tab funktioniert, die Vervollständigung anderer Begriffe aber nicht (also z.B. man abc<tab>, um alle man-Seiten aufzulisten, die mit abc beginnen).

bash-completion ist standardmäßig installiert, aber offensichtlich nicht richtig konfiguriert. Abhilfe: Laden Sie die Datei /etc/bash.bashrc in einen Editor und entfernen Sie die Kommentarzeichen vor den folgenden, bereits vorhandenen Zeilen:

# 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

Interna

Eines gleich vorweg: Dem Linux-Subsystem fehlt gewissermaßen der wichtigste Bestandteil — der Linux-Kernel. Dennoch verwendet das Linux-Subsystem die ganz gewöhnlichen, für Linux kompilierten Pakete, keine speziell für Windows hergestellten Kompilate! Wie kann das funktionieren?

Microsoft hat (in den Worten von Dustin Kirkland von Canonical) eine Art inverses Wine geschaffen, in dem Linux-Systemfunktionen durch entsprechende Windows-Funktionen ersetzt bzw. emuliert werden. Dieser Code ist ein Kernstück des Linux Subsystems für Windows. Er ist momentan nicht als Open Source verfügbar, und es gibt auch keine konkreten Informationen dazu, ob dies in Zukunft geplant ist.

Ein Mysterium ist (für mich) die Speicher- und Prozessverwaltung. Laut free steht Linux ein GByte RAM zur Verfügung. (Meine virtuelle Maschine hat drei GByte).

free -h
             total       used       free     shared    buffers     cached
Mem:          1.0G       342M       664M         0B         0B         0B
-/+ buffers/cache:       342M       664M
Swap:           0B         0B         0B

Im Windows Task-Manager habe ich aber keine Prozesse gefunden, die auch nur annähernd so viel Speicherplatz beanspruchen.

Generell ist mir unklar, wo zu sehen ist, wieviel Speicher und CPU-Leistung Linux oder auch unter Linux ausgeführte Prozesse beanspruchen. Ich habe probeweise unter Linux sysbench ausgeführt und die (virtuelle) CPU eine Weile voll ausgelastet. Der Task-Manager hat zwar auf der Seite Leistung die volle CPU-Auslastung registriert, aber weder unter Prozesse noch unter Details war ein entsprechender Prozess zu sehen. Innerhalb von Linux funktioniert top übrigens nicht.

Fazit/Kommentar

Im aktuellen Zustand ist das in Windows integrierte Linux-System ein (sehr) interessantes Experiment, aber noch kein brauchbares Produkt. Andererseits ist verblüffend, wie viel schon funktioniert — noch ein paar Monate Arbeit, dann ist ein Linux-Subsystem innerhalb von Windows eine (für ganz bestimmte Szenarien) praxistaugliche Realität.

Die Zielgruppe sind ganz eindeutig nicht Linux-Freaks und -Administratoren — die werden sicher bei ihrem »richtigen« Linux bleiben. Aber für Microsoft-affine Entwickler kann das Linux-Subsystem eine interessante Alternative zu einer virtuellen Linux-Maschine sein.

Interessant ist, dass sich Microsoft gerade für Ubuntu entschieden hat, nicht für Debian oder SUSE oder, was eigentlich am naheliegendsten wäre, für Red Hat. Vielleicht hat das mit Firmenpolitik zu tun. Red Hat ist für Microsoft kommerziell gesehen ein ernst zu nehmender Konkurrent, den man durch eine derartige Kooperation nicht weiter aufwerten möchte. (Oder interpretiere ich hier zu viel?)

Was ist Linux? Kann man »Ubuntu on Windows« überhaupt als »Linux« bezeichnen? Microsoft verwendet unterschiedliche Begriffe, »Ubuntu on Windows«, »Windows Subsystem for Linux«, »bash on Ubuntu on Windows« etc. Besonders häufig war in der Ankündigung bzw. in den Vorträgen interessanterweise von der bash die Rede — ganz so, als wäre die bash der wichtigste Baustein dieses Konglomerat. Persönlich fällt es mir schwer, eine Tool-Box (oder eine »Distribution«?) ohne Linux-Kernel als »Linux« oder auch als »Ubuntu« zu bezeichnen. Mangels besserer Alternativen habe ich hier »Linux-Subsystem für Windows« verwendet.

Windows-Handbuch für Linux-/OS-X-Anwender

$
0
0

Es heißt ja immer, unter Linux sei alles so kompliziert — nur weil die Bedienung anders ist als unter Windows. Ich habe genau das umgekehrte Problem: Ich kann mit Linux gut umgehen, mit OS X auch recht passabel, nur Windows macht immer Schwierigkeiten. Und auch wenn ich mich bemühe, Windows so gut wie möglich aus dem Weg zu gehen — ganz gelingt es mir nicht. Für den FH-Unterricht muss ich testen, wie man Eclipse unter Windows installiert, meinen Kindern muss ich erklären, wie sie den USB-Stick sicher lösen (»auswerfen«), und seit Neuestem darf ich mich auch noch damit auseinandersetzen, wie weit die Möglichkeiten des Linux-Subsystems unter Windows reichen …

Nach Möglichkeit führe ich meine Tests in virtuellen Maschinen aus. Und ständig suche ich nach Lösungen für immer gleiche Probleme. Als Notizbuch für mich selbst — und für alle, die es sonst interessiert — habe ich nun entschieden, mein persönliches Windows-Handbuch zu verfassen und dieses immer wieder zu erweitern. (»Handbuch« ist zugegebenermaßen stark übertrieben, man könnte auch sagen, es ist nur eine Sammlung trivialer Tipps und Tricks.)

Generell beziehe ich mich hier auf Windows 10 (Insider Preview).

Hostnamen einstellen

Startmenü, nach Erweiterte Systemeinstellung anzeigen suchen und ausführen, Dialogblatt Computername, Button Ändern. Erfordert einen Neustart.

Hostnamen einstellen/ändern
Hostnamen einstellen/ändern

IP-Adresse herausfinden

cmd.exe starten, Kommando ipconfig.

Im Explorer alle Dateien anzeigen

Der Windows Explorer versucht, niemanden zu überfordern, und zeigt deswegen nur die halben Dateien an. Ich will möglichst alles sehen. Also: Ansicht / Optionen / Ordner- und Such-Optionen ändern, Dialogblatt Ansicht, dann

  • Option Erweiterungen bei bekannten Dateitypen ausblenden deaktivieren
  • Option Geschützte Systemdateien ausblenden deaktivieren
  • Option Versteckte Dateien und Ordner: Ausgeblendete Dateien .. anzeigen
  • Option Vollständigen Pfad in der Titelzeile anzeigen aktivieren
Im Explorer verborgene Dateien anzeigen
Im Explorer verborgene Dateien anzeigen

Weißen Bildschirmhintergrund einstellen

Ist so unmöglich/schwierig wie unter Gnome, weil in den Systemeinstellungen alle möglichen Volltonfarben zur Auswahl stehen, nur nicht Weiß. :-(

Lösung: Mit Gimp oder einem anderen Programm eine Bitmap erzeugen, die ausschließlich aus weißen Pixeln besteht (1×1 Pixel reicht). Die Bilddatei im Explorer mit der rechten Maustaste anklicken und Als Desktophintergrund festlegen.

Lokales Passwort verwenden (nicht die Windows-ID)

Windows 10 sieht vor, dass Sie sich mit dem E-Mail-Adresse und dem Passwort Ihrer Windows-ID (Ihres Windows-Konto) anmelden. Ich verwende aber lieber ein lokales Passwort, das ich losgelöst von der Windows-ID festlegen kann.

Vorgehensweise: Einstellungen starten, Modul Konten, Dialogblatt Your info, Link Stattdessen mit einem lokalen Konto anmelden. Anschließend müssen Sie nochmals Ihr Microsoft-Konto-Passwort angeben und können dann ein davon unabhängiges Passwort festlegen.

Lokales Passwort verwenden (anstelle das des Microsoft-Kontos)
Lokales Passwort verwenden (anstelle das des Microsoft-Kontos)

PATH verändern

Damit der Java-Compiler oder die MySQL-Client-Werkzeuge (mysql, mysqldump etc.) im cmd.exe unkompliziert gestartet werden können, muss die PATH-Umgebungsvariable erweitert werden.

Vorgehensweise: Im Startmenü nach path oder Systemumgebungsvariablen bearbeiten suchen und ausführen, Dialogblatt Erweitert, Button Umgebungsvariablen.

PATH-Variable bearbeiten
PATH-Variable bearbeiten

OneDrive deaktivieren

Windows fragt mich bei jedem Start nach meinen OneDrive-Account-Daten. Ich habe zwar eine Microsoft-Konto, aber ich will OneDrive nicht verwenden. Überhaupt nicht. Gar nicht. Null. (Ein Cloud-Speicher, den ich nur unter Windows nutzen kann, ist für mich wertlos — egal wie kostenlos. Gilt mit der gleichen Logik auch für die iCloud. Meine Lösung lautet DropBox.) Ich schweife wieder mal vom Thema ab …

Zurück zu One Drive: Startmenü, suchen nach Gruppenrichtlinie bearbeiten, starten. Im Baum suchen nach

  • Richtlinien für Lokaler Computer
  • Computerkonfiguration
  • Administrative Vorlagen
  • Windows-Komponenten
  • OneDrive

Doppelklick auf Prevent the Usage of OneDrive, diese Option aktivieren.

OneDrive deaktivieren
OneDrive deaktivieren

Damit wird OneDrive nicht mehr als Option zum Speichern meiner Dateien angeboten. Trotzdem fragt OneDrive weiterhin bei jedem Rechnerstart nach den Login-Daten. Um auch dieses Ärgernis zu beseitigen, suchen Sie in der Taskleiste nach dem OneDrive-Benachrichtigungs-Icon. Dieses klicken Sie mit der rechten Maustaste an und führen Einstellungen aus.

OneDrive deaktivieren
OneDrive deaktivieren

Screenshots erstellen

[Strg]+[Druck] erstellt einen Screenshot und speichert diesen in der Zwischenablage. Für die meisten Zwecke wäre das ausreichend — wenn es die [Druck]-Taste gäbe. Auf meinen Notebooks bzw. Tastaturen fehlt diese Taste durchgängig.

Schon mehr Funktionen bietet das standardmäßig installierte Snipping Tool.

Eine noch bessere Alternative ist das ebenfalls kostenlose Programm Snip. Es glänzt unter anderem durch einen einstellbaren Hotkey:

https://mix.office.com/en-us/snip

eBook Ubuntu 16.04 LTS

$
0
0

Mein neues eBook Ubuntu 16.04 LTS ist fertig! Das eBook gibt eine Einführung in den Umgang mit Ubuntu 16.04 und behandelt auf über 300 Seiten die folgenden Themen:

  • Installation
  • Ubuntu-Desktop (Unity, Nautilus, Programme installieren und aktualisieren)

  • Konfiguration (Desktop, Hardware, Netzwerk, Bluetooth, Benutzerverwaltung)

  • Anwendungsprogramme (Firefox, Google Chrome, Thunderbird, Skype, Dropbox, Shotwell, Gimp, Rhythmbox, Spotify, Totem und VLC, LibreOffice, VirtualBox)

  • Tipps und Tricks (Backups, Arbeiten im Terminal, Paketverwaltung, Systemd und Journal)

  • Programmierung (bash, Python, Java, Cron-Jobs)

  • Ubuntu Server (Installation; SSH; Web-Server mit Apache, HTTPS mit Let’s-Encrypt-Zertifikaten, PHP und MySQL; CMS/Wordpress; ownCloud; Mail-Server mit Postfix, Dovecot und SpamAssassin)

  • Ubuntu MATE auf dem Raspberry Pi (Installation, MATE-Desktop, GPIO-Zugriff, Interna)

eBook kaufen

Das eBook ist hier als PDF/EPUB-Datei erhältlich (natürlich DRM-frei), auf amazon.de auch im MOBI-Format. Ich empfehle Ihnen die PDF-Variante, weil dort Listings und Tabellen am besten zu lesen sind.

u1604

Werfen Sie einen Blick in die folgende, 60-seitige Leseprobe!

Leseprobe Ubuntu 16.04 (PDF)

Zur Geschichte dieses eBooks

Dieses eBook liegt bereits in der vierten Auflage vor, nachdem es zuvor Ausgaben für Ubuntu 12.04, Ubuntu 12.10 und Ubuntu 14.04 gab.

Die Ubuntu-14.04-Ausgabe war mein bisher erfolgreichster Titel innerhalb ebooks.kofler: Das eBook wurde fast 1000 Mal verkauft und in diversen Trainings als Schulungsunterlage verwendet. Auf der Grundlage des eBooks hat die Trainerin Lydia Schimpf für Video2Brain/LinkedIn ein ca. dreistündiges Video-Training gestaltet.

Neu in dieser Auflage: Das eBook wurde in dieser Auflage vollständig aktualisiert und in den folgenden Punkten erweitert:

  • Ubuntu auf 4k-Monitoren (Retina-Displays)
  • Einführung in Systemd und Journal
  • Let’s-Encrypt-Zertifikate für Apache, Postfix und Dovecot einrichten
  • Ubuntu MATE auf dem Raspberry Pi

Begleitwebseite

Weitere Informationen zum eBook sowie aktuelle Updates in Form eines Ubuntu-Blogs finden Sie auf der Seite https://ubuntu-buch.info. Diese Webseite ist gleichzeitig ein Beispiel zum Buch: Die Anleitung, wie Sie einen kompletten Root-Server auf der Basis von Ubuntu 16.04 einrichten, ist Thema des Kapitels »Ubuntu Server«. Alles, was dort beschrieben ist, wurde auf https://ubuntu-buch.info realisiert.

Ubuntu 16.04

$
0
0

Ubuntu 16.04 LTS (Long Term Support) ist fertig! Dieser Beitrag fasst die wichtigsten Neuerungen zusammen. Der Beitrag ist eine aktualisierte und ergänzte Version meiner früheren Veröffentlichung Erste Vorschau auf Ubuntu 16.04.

Dock am unteren Bildschirmrand

Das Dock war bisher auf den linken Bildschirmrand fixiert. In Ubuntu 16.04 kann es nun auch an den unteren Bildschirmrand verschoben werden. (Persönlich war ich immer der Meinung, dass die Anordnung links vernünftig ist. Aber mehr Wahlmöglichkeit kann nicht schaden.)

Unbegreiflicherweise gibt es für diese Neuerung keine entsprechende Option in den Systemeinstellungen. Die Konfiguration muss daher per Kommando oder mit dem Unity Tweak Tool erfolgen:

gsettings set com.canonical.Unity.Launcher launcher-position Bottom

Rückgängig mit:

gsettings set com.canonical.Unity.Launcher launcher-position Left

Eine Anordnung am rechten Rand ist momentan nicht vorgesehen.

Das Dock am unteren Bildschirmrand
Das Dock am unteren Bildschirmrand

Keine Werbung mehr im Startmenü

Erfreulich ist die Entscheidung der Ubuntu-Entwickler, auf die unsägliche Einblendung von Werbung im Startmenü (»Online-Suchergebnisse«) standardmäßig zu verzichten.

Web-Apps ade

Wie ich in meiner Vorstellung von Ubuntu 15.10 schon geschrieben haben, werden Web-Apps offensichtlich nicht mehr gepflegt. Standardmäßig ist nur noch die Amazon-App installiert und im Dock präsent (wahrscheinlich aufgrund eines Werbevertrags). Die Release Notes schweigen sich zu diesem Thema aus, das »offizielle« Ende der Web-Apps steht also noch aus. Vielleicht braucht man die Web-Apps ja auch für das Ubuntu Phone und die Web-Apps werden dort weitergeführt?

Wie auch immer: Auf dem Ubuntu-Desktop haben mich Web-Apps nie überzeugt, Ihr Verschwinden bereitet mir keine Trauer …

Die Gnome-App »Software« ersetzt das Ubuntu Software Center

Eine weitere Eigenentwicklung von Ubuntu ist definitiv verschwunden: Anstelle des Ubuntu Software Center ist nun »Gnome Software« installiert, das Ubuntu — ein wenig frech — »Ubuntu Software« nennt. Nun war das Ubuntu Software Center schon keine Offenbarung, das Programm Software ist aber ein weiterer Rückschritt:

  • Das Programm kann ausschließlich zur Installation von Desktop-Programmen verwendet werden. Die Suche nach anderen Paketen führt zu keinem Ergebnis. Gerade für Einsteiger ist das unerfreulich: Diese müssen sich bereits zur Installation von ubuntu-restricted-extras mit dem Terminal und apt anfreunden.
  • Bisher war es möglich, im Startmenü in der Application-Ansicht nach noch nicht installierten Programmen zu suchen und die Installation direkt dort zu initiieren. Das funktioniert jetzt nicht mehr.

  • Die Release Notes zählen eine beachtliche Liste von bekannten Bugs und Problemen auf.

Desktop-Programme können nun mit dem Gnome-Programm »Software« installiert werden
Desktop-Programme können nun mit dem Gnome-Programm »Software« installiert werden

Snap — Die Ergänzung zur Paketverwaltung

Die meisten Linux-Distributionen leiden unter dem Problem, dass die Paketverwaltung und das Update-System zwar wunderbar funktionieren, es aber gleichzeitig so gut wie unmöglich ist, neue Versionen von wichtigen Desktop-Programmen (Gimp, LibreOffice) zu installieren. Die meisten Distributionen führen solche Versionssprünge nur ungern durch, weil diese selten nur das Programm an sich betreffen, sondern auch unzählige abhängige Pakete. (Eine Ausnahme sind Webbrowser wie Firefox oder Chromium, die mittlerweile bei fast allen Distributionen regelmäßig komplett erneuert werden.)

Das von Ubuntu entwickelte Snap-Format soll dieses Problem lösen: Benutzer bekommen damit die Möglichkeit, Software in Form von Snap-Dateien in das Verzeichnis /var/lib/snapd/snaps zu installieren, und zwar vollkommen losgelöst von der sonst üblichen und natürlich weiterhin vorhandenen Paketverwaltung (*.deb-Dateien, apt etc.).

Snap mit dem Snap-Dämon snapd und dem dazugehörenden Kommando snap ist unter Ubuntu standardmäßig installiert:

dpkg -l | grep snap
  ii  libsnappy1v5:amd64     1.1.3-2   amd64   fast compression/decompression library
  ii  snapd                  2.0.2     amd64   Tool to interact with Ubuntu Core Snappy.
  ii  ubuntu-core-launcher   1.0.27    amd64   Launcher for ubuntu-core (snappy) apps

snap find ermittelt eine Liste aller verfügbaren Snap-Pakete. snap install installiert das gewünschte Snap-Paket. snap list listet alle installierten Pakete auf. man snap verrät weitere Details.

snap find
  Name                   Version                  Summary
  canonical-dragon       0.7.1                    The gadget snap ...
  canonical-i386         3.1                      The gadget snap ...
  canonical-pc           3.1                      AMD64 generic package
  canonical-pc-linux     4.4.0-18+20160419.13-26  The ubuntu-core kernel snap
  canonical-pi2          3.2                      Raspberry Pi 2 support package
  go-example-webserver   16.04-4                  Minimal Golang webserver ...
  hello-world            6.0                      Hello world example
  http                   4.6692016                HTTPie in a snap
  links                  2.12-1                   Web browser running in ...
  moon-buggy             1.0.51.9                 Drive a car across the moon
  nmap                   7.12SVN-0.4              Nmap ("Network Mapper") is a ...
  tor-middle-relay       0.2.7.6-4                Essential infrastructure node .. .
  ubuntu-calculator-app  2.1+snap3                Ubuntu Calculator application .. .
  ubuntu-clock-app       3.6+snap3                Ubuntu Clock application for ...
  ubuntu-core            16.04+20160419.20-55     The ubuntu-core OS snap
  webdm                  0.16.2                   # Snappyd
  xkcd-webserver         16.04-5                  Show random XKCD compic via ...

sudo snap install ubuntu-calculator-app

snap list
  Name                   Version               Developer
  ubuntu-calculator-app  2.1+snap3             ubuntucoredev
  ubuntu-core            16.04+20160419.20-55  canonical

ubuntu-calculator-app.calculator &

Zu einem späteren Zeitpunkt soll es auch mit dem Programm Software möglich sein, Snap-Pakete zu installieren. Momentan funktioniert dies aber noch nicht.

Dieser Taschenrechner ist ein Beispiel für ein Snap-App
Dieser Taschenrechner ist ein Beispiel für ein Snap-App

Da jede Snap-App auch alle Bibliotheken enthält, müssen für den vergleichsweise simplen Taschenrechner stattliche 120 MByte heruntergeladen werden. Die resultierende Datei landet in /var/lib/snapd/snaps.

ls -lh /var/lib/snapd/snaps/
  insgesamt 185M
  -rw------- 1 root root 121M Apr 21 09:41 ubuntu-calculator-app_5.snap
  -rw------- 1 root root  65M Apr 21 09:38 ubuntu-core_109.snap

*.snap-Dateien enthalten ein squashfs-Dateisystem und werden von Snap-Dämon mit mount in den Verzeichnisbaum eingebunden.

mount | grep snap
  /var/lib/snapd/snaps/ubuntu-core_109.snap on
     /snap/ubuntu-core/109 type squashfs (ro,relatime)
  /var/lib/snapd/snaps/ubuntu-calculator-app_5.snap on
    /snap/ubuntu-calculator-app/5 type squashfs (ro,relatime)

Unkomprimiert enthält das Snap-Mount-Verzeichnis des Taschenrechners sogar 375 MByte:

du -h  /snap/ubuntu-calculator-app/5 --max 1
  2,0K  /snap/ubuntu-calculator-app/5/bin
  1,2M  /snap/ubuntu-calculator-app/5/build
  149K  /snap/ubuntu-calculator-app/5/etc
  4,8M  /snap/ubuntu-calculator-app/5/lib
  3,0K  /snap/ubuntu-calculator-app/5/meta
  369M  /snap/ubuntu-calculator-app/5/usr
  37K   /snap/ubuntu-calculator-app/5/var
  375M  /snap/ubuntu-calculator-app/5

375 MByte für einen Taschenrechner?! Man muss sich vor Augen halten, wie absurd das ist!

Snaps werden in einer Sandbox ausgeführt, sollen also besonders sicher sein. Matthew Garrett äußert in seinem Blog aber massive Bedenken am Sicherheitskonzept.

Auch wenn Canonical das neue Snap-Format als eine der wesentlichen Neuerungen in Ubuntu 16.04 bewirbt, ist schwer abzuschätzen, ob dieses Feature längerfristig für Desktop-Anwender wirklich relevant sein wird. Momentan wirkt Snap unausgegoren. Das Paketangebot ist klein und vermittelt eher einen Demo-Charakter. Insgesamt scheint Snap in der aktuellen Form eher für IoT (Internet of Things, Snappy Ubuntu Core) bzw. für das Ubuntu Phone optimiert als für den Desktop.

Sollte sich das Snap-System tatsächlich durchsetzen, wird es zu großen Redundanzen in Ubuntu-Systemen führen, weil jedes Snap-Paket eigene Kopien aller Bibliotheken mitbringt. Unklar ist auch, ob bzw. wie zentrale Updates für alle installierten Snap-Pakete zu installieren sind, und wie das System mit Doppelgleisigkeiten zwischen herkömmlichen Paketen und Snap-Paketen umgeht.

Unity Tweak Tool

Der Unity Tweak Tool (apt install unity-tweak-tool) steht in den Paketquellen zur Verfügung. Das Programm hilft bei der Einstellung diverser Optionen, die in den Systemeinstellungen fehlen. Unter anderem können Sie damit die Dock-Position einstellen.

Mit dem Unity Tweak Tool können Sie die Dock-Position per Mausklick einstellen
Mit dem Unity Tweak Tool können Sie die Dock-Position per Mausklick einstellen

Technische Neuerungen

  • Integration des Dateisystems zfs: Ubuntu 16.04 hat das Dateisystem zfs in dern Kernel integriert. Dieses Dateisystem wurde ursprünglich von Sun für das Betriebssystem Solaris entwickelt. Es untersteht zwar wie der Linux-Kernel einer Open-Source-Lizenz. Die Lizenzen von Linux und zfs sind aber nicht kompatibel zueinander. Die Integration von zfs in den Linux-Kernel ist deswegen rechtlich umstritten. Für Desktop-Anwender ist zfs nicht relevant, aber für den Server-, Virtualisierungs- und Docker-Einsatz genießt zfs den Ruf als das beste verfügbare Unix-Dateisystem. btrfs bietet ähnliche Funktionen, ist aber nicht im gleichen Maß ausgereift.
  • Systemd: Ubuntu verwendet als Init-System nun Systemd. Das Steuerungskommando lautet systemctl, in den meisten Fällen kann aber wie bisher service verwendet werden. Für Desktop-Anwender ergeben sich aus der Systemd-Umstellung keine Änderungen, wohl aber für Administratoren.

  • Logging: Das Logging-System fährt momentan zweigleisig. rsyslogd kümmert sich wie bisher um die Logging-Dateien in /var/log, das Journal protokolliert parallel dazu in /run/log/journal. Die dort gespeicherten Daten befinden sich allerdings auf einer RAM-Disk und gehen bei jedem Reboot verloren.

  • Kein Python 2 per Default: Die Desktop-Version von Ubuntu 16.04 enthält nur noch Python-3-Pakete. Python-2-Pakete stehen bei Bedarf weiterhin zur Verfügung, und zwar in der main-Paketquelle (LTS!).

  • apt statt apt-get: Um Pakete per Kommando zu installieren, stehen weiterhin die vertrauten Kommandos apt-get und aptitude zur Verfügung. Empfohlen wird nun aber das neuere Kommando apt (siehe auch das Debian-Handbuch sowie diesen Blog-Beitrag).

  • Darstellung von Scrollbalken: Bereits seit Ubuntu 15.10 werden Scrollbalken nicht länger 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 …)

Einschränkungen und Probleme

  • Totem: Totem ist trotz der Installation von ubuntu-restricted-extras nicht in der Lage, H264-Videos abzuspielen. Das Problem ist bekannt und wird wohl rasch durch ein Update gelöst werden. (Hier ist der Launchpad-Bugbericht.)

  • Schlechtere Samba-Integration: Das außerordentlich praktische Paket libpam-smbpass steht nicht mehr zur Verfügung. Es hat sich in der Vergangenheit darum gekümmert, Linux- und Samba-Passwörter zu synchronisieren und hat beim unkomplizierten Einrichten eigener Samba-Shares (»Freigaben«) geholfen. Das zugrundeliegende PAM-Modul wird vom Samba-Projekt aber nicht mehr unterstützt. (Details können Sie in der Samba-Mailing-Liste nachlesen.)

  • AMD-Grafiktreiber: Für AMD-Grafikkarten gibt es in Ubuntu 16.04 nur noch die Open-Source-Treiber radeon/amdgpu. In der Vergangenheit war es problemlos möglich, alternativ dazu den proprietären Treiber von AMD zu installieren. Diese Möglichkeit besteht nun nicht mehr, weil es von AMD keinen Treiber gibt, der zur aktuellen X-Server-Version in Ubuntu kompatibel ist. (Hintergrundinformationen können Sie in Timo Aaltonen’s Weblog sowie auf heise.de nachlesen. Den proprietären NVIDIA-Treiber wird Ubuntu übrigens weiterhin zur unkomplizierten Installation zur Verfügung stellen.)

Software-Versionen

Die folgenden Tabelle fasst zusammen, welche Software-Versionen unter Ubuntu 16.04 anfänglich zum Einsatz kommen. Die Firefox- und Thunderbird-Pakete werden während der Lebensdauer von Ubuntu 16.04 regelmäßig aktualisiert.

Basis           Desktop            Programmierung     Server
--------------  ------------------ --------------    --------------
Kernel     4.4  Gnome        3.18  bash       4.3    Apache    2.4
glibc     2.23  Firefox        45  gcc        5.3    CUPS      2.1
X-Server  1.18  Gimp          2.8  Java       7/8    MySQL     5.7
GRUB      2.02  LibreOffice   5.1  PHP          7    OpenSSH   7.2
Snapd      2.0  Thunderbird    38  Python     3.5    qemu/KVM  2.5
Systemd    229  Unity         7.4                    Postfix   3.1
                                                     Samba     4.3

Einzelne Gnome-Programme werden in älteren, manche in neueren Versionen ausgeliefert, z.B.:

  • gnome-calendar: 3.20
  • gnome-font-viewer: 3.16
  • gnome-software: 3.20
  • nautilus: 3.14 (!!!)

Super-aktuell ist der LAMP-Stack mit PHP 7 und MySQL 5.7. Wem MySQL nicht behagt, findet MariaDB-Pakete in der Version 10.0 — allerdings nur in der universe-Paketquelle (also ohne LTS-Wartungsgarantien).

Das beste Desktop-Linux aller Zeiten?

Die Neuerungen in Ubuntu lassen keine grenzenlose Begeisterung aufkommen. Echte Innovationen für den Linux-Desktop sehen anders aus. Snap ist ein interessantes Konzept, aber vorerst ohne praktische Relevanz für Desktop-Anwender.

Dennoch wird Ubuntu wohl auch in Version 16.04 die populärste Desktop-Linux-Distribution bleiben. Die Vorzüge von Ubuntu 16.04 sind dieselben wie die von Version 14.04: Ubuntu läuft stabil und ist einfach zu bedienen — was will man also mehr?

Die Alleinstellung von Ubuntu als »die« Desktop-Linux-Distribution hat freilich auch mit einem immer eklatanteren Mangel an Alternativen zu tun: openSUSE und Fedora sind zu instabil/experimentell, Debian ist nach wie vor nur bedingt einsteigertauglich.

Mein Tipp für Ubuntu-Verweigerer bleibt CentOS, auch wenn man dort Abstriche bei der Aktualität der Software-Pakete machen muss. Plan B wäre Linux Mint, aber riesige Vorteile im Vergleich zu Ubuntu habe ich da (in Gegensatz zu anderen Linux-Fans) nie wirklich erkennen können. Den größten Nachteil von Mint sehe ich in der Abhängigkeit von einem winzigen Entwickler-Team.

Links

Quellen

Quellen speziell zu Snap

Andere Tests

Die LTS-Frage

$
0
0

LTS steht für Long Time Support, bezeichnet also eine mehrjährige Update-Garantie für die wichtigsten Pakete von Ubuntu. Ubuntu 16.04 ist eine LTS-Distribution. Aber für welche Distributionen gelten welche Wartungszeiträume? Und für welche Pakete?

Unterschiedliche LTS-Wartungszeiträume je nach Distribution

Die Grundregel lautet: Der LTS-Zeitraum von fünf Jahren gilt nur für Ubuntu, Ubuntu Server, Ubuntu Core und Ubuntu Kylin (also den chinesischen Ubuntu-Ableger). Für alle anderen Ubuntu-Variante gilt ein LTS-Zeitraum von drei Jahren. Die Mythbuntu-Webseite weist allerdings darauf hin, das Mythbuntu 16.04 nur bis kurz nach dem Release von Mythbuntu 18.04 unterstützt wird.

Distribution      Support-Zeitraum
----------------  -----------------
Ubuntu            5 Jahre
Ubuntu Server     5 Jahre
Ubuntu Kylin      5 Jahre
Ubuntu Gnome      3 Jahre
Ubuntu MATE       3 Jahre
Ubuntu Studio     3 Jahre
Kubuntu           3 Jahre
Lubuntu           3 Jahre
Xubuntu           3 Jahre
Mythbuntu         2 Jahre

Was ist mit Edubuntu? Auf der Edubuntu-Webseite ist die Version 16.04 ein Non-Topic. Das liegt daran, dass die bisherigen Maintainer zurückgetreten sind und nur noch die Version 14.04 betreuen. In welcher Form bzw. durch welchen Maintainer Edubuntu weitergeführt wird, muss sich erst zeigen. Das ist auch der Grund, weswegen Edubuntu nicht mehr in der Liste der offiziellen Ubuntu-Varianten aufgeführt wird.

Welche Pakete sind LTS-Pakete?

Eigentlich lässt sich diese Frage leicht beantworten: Alle Pakete aus der Ubuntu-main-Paketquelle.

Wenn Sie aber Ubuntu-Installationen (speziell bei Servern) administrieren, fällt die konkrete Antwort viel schwerer: Oft sind nämlich auch Ubuntu-universe- oder Ubuntu-multiverse-Pakete installiert, für die es keine LTS-Garantien gibt. Oft sind außerdem zusätzliche Paketquellen eingerichtet (Chrome, Spotify, MariaDB, PPAs etc.). Für welche der installierten Pakete gilt nun die LTS-Update-Garantie, für welche nicht?

Meines Wissens bieten weder dpkg noch apt-cache noch aptitude geeignete Filtermöglichkeiten, um diese Frage unkompliziert zu beantworten. Ich habe daher das bash-Script packagelist verfasst, das eine Schleife über alle installierten Pakete ausführt und dann für jedes Paket mit apt-cache madison herausfindet, woher dieses Paket stammt. (apt-cache madison kann mehrere Ergebnisse liefern. Das Script wertet nur die erste entsprechende Zeile aus, was für meine Zwecke ausreichend ist.)

#!/bin/bash
# Script packagelist

# Schleife über alle installierten Pakete
for pkg in $(dpkg --get-selections | grep -v deinstall | cut -f1); do
  # erste Zeile von apt-cache madison, die nicht Sources beschreibt
  data=$(apt-cache madison $pkg | grep -v Sources | head -1)

  # pkgsrc (enthält package URL plus z.B. xenial/main)
  pkgsrc=$(echo $data | cut -d'|' -f3)
  url=$(echo $pkgsrc  | cut -d' ' -f1)
  repo=$(echo $pkgsrc | cut -d' ' -f2)

  # Daten für Ausgabe sammeln
  pkgs="$pkgs\n$pkg $repo $url"
  repos="$repos\n$repo $url"
done

# Liste aller Pakete samt Quelle in Spalten ausgeben
echo -e $pkgs | column -t
echo
# Liste aller Repos mit Paketanzahl
echo -e $repos | tail -n +2 | sort | uniq -c | sort -n

Das vielfache Ausführen von apt-cache madison kostet recht viel Zeit, bei einer Desktop-Installation je nach Hardware ca. eine Minute. Deswegen ist es sinnvoll, die Ausgabe gleich in eine Textdatei umzuleiten, damit diese dann bei Bedarf weiter analysiert werden kann, z.B. mit grep.

Wenn Sie das Script auf einer frischen Ubuntu-Desktop-Installation ausführen, sieht das Ergebnis z.B. so aus:

./packagelist > pkg.txt
cat pkg.txt

a11y-profile-manager-indicator  xenial/main  http://at.archive.ubuntu.com/ubuntu
account-plugin-facebook         xenial/main  http://at.archive.ubuntu.com/ubuntu
account-plugin-flickr           xenial/main  http://at.archive.ubuntu.com/ubuntu
...
zenity-common                   xenial/main  http://at.archive.ubuntu.com/ubuntu
zip                             xenial/main  http://at.archive.ubuntu.com/ubuntu
zlib1g:amd64                    xenial/main  http://at.archive.ubuntu.com/ubuntu

      3 xenial/multiverse http://at.archive.ubuntu.com/ubuntu
   1727 xenial/main http://at.archive.ubuntu.com/ubuntu

Es gibt also nur drei multiverse-Pakete:

grep multiverse pkg.txt

virtualbox-guest-dkms      xenial/multiverse  http://at.archive.ubuntu.com/ubuntu
virtualbox-guest-utils     xenial/multiverse  http://at.archive.ubuntu.com/ubuntu
virtualbox-guest-x11       xenial/multiverse  http://at.archive.ubuntu.com/ubuntu

Hier ist das Ergebnis einer weiteren Desktop-Installation, diesmal mit zusätzlichen Paketquellen:

cat pkg.txt

...
      1 stable/non-free http://repository.spotify.com
      5 xenial/multiverse http://at.archive.ubuntu.com/ubuntu
      1 xenial/main http://ppa.launchpad.net/webupd8team/java/ubuntu
    134 xenial/universe http://at.archive.ubuntu.com/ubuntu
   1820 xenial/main http://at.archive.ubuntu.com/ubuntu

Hier ist das Ergebnis einer Server-Installation:

cat pkg.txt

...
     46 xenial/universe http://de.archive.ubuntu.com/ubuntu
    641 xenial/main http://de.archive.ubuntu.com/ubuntu

Die eingangs gestellte Frage, welche Pakete (nicht) LTS-Status haben, beantwortet auch mein Script nicht direkt. Die mit packagelist erstellte Liste bietet aber eine gute Möglichkeit, gezielt nach den Paketen zu suchen, die nicht aus der Ubuntu-main-Quelle stammen. Dabei müssen Sie aber unbedingt auch die Package-URL mitberücksichtigen. Es gibt Paketquellen, die xenial/main verwenden, obwohl sie nicht von Ubuntu/Canonical stammen.

Das folgende Listing ist auf einem simplen LAMP-Server entstanden. Es zeigt sich, dass durchaus wichtige Pakete wie fail2ban keinen LTS-Status haben.

grep universe pkg.txt

dialog             xenial/universe  http://de.archive.ubuntu.com/ubuntu
fail2ban           xenial/universe  http://de.archive.ubuntu.com/ubuntu
joe                xenial/universe  http://de.archive.ubuntu.com/ubuntu
letsencrypt        xenial/universe  http://de.archive.ubuntu.com/ubuntu
mailutils          xenial/universe  http://de.archive.ubuntu.com/ubuntu
mailutils-common   xenial/universe  http://de.archive.ubuntu.com/ubuntu
php7.0-zip         xenial/universe  http://de.archive.ubuntu.com/ubuntu
...

Zuletzt noch die Ergebnisse eines anderen Servers, der noch unter Ubuntu 14.04 läuft:

cat pkg.txt
      1 trusty-backports/main   http://mirror.hetzner.de/ubuntu/packages/
      8 trusty-updates/universe http://mirror.hetzner.de/ubuntu/packages/
      9 trusty/main             http://mirror.netcologne.de/mariadb/repo/5.5/ubuntu/
     16 trusty/universe         http://mirror.hetzner.de/ubuntu/packages/
    270 trusty-updates/main     http://mirror.hetzner.de/ubuntu/packages/
    276 trusty/main             http://mirror.hetzner.de/ubuntu/packages/

Die Liste aller Nicht-LTS-Pakete kann in diesem Fall so ermittelt werden:

egrep "universe|backports|mariadb/repo/5.5" pkg.txt

cpufrequtils              trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
fail2ban                  trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
htop                      trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
joe                       trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
libcgmanager0:amd64       trusty-backports/main    http://mirror.hetzner.de/ubuntu/packages/
libcpufreq0               trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
libgsasl7                 trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
libkyotocabinet16:amd64   trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
libmailutils4             trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
libmariadbclient18        trusty/main              http://mirror.netcologne.de/mariadb/repo/5.5/ubuntu/
libmysqlclient18          trusty/main              http://mirror.netcologne.de/mariadb/repo/5.5/ubuntu/
libntlm0:amd64            trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
libphp-phpmailer          trusty-updates/universe  http://mirror.hetzner.de/ubuntu/packages/
libphp-snoopy             trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
libzend-framework-php     trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
mailutils                 trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
mailutils-common          trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
makepasswd                trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
mariadb-client-5.5        trusty/main              http://mirror.netcologne.de/mariadb/repo/5.5/ubuntu/
mariadb-client-core-5.5   trusty/main              http://mirror.netcologne.de/mariadb/repo/5.5/ubuntu/
mariadb-common            trusty/main              http://mirror.netcologne.de/mariadb/repo/5.5/ubuntu/
mariadb-server            trusty/main              http://mirror.netcologne.de/mariadb/repo/5.5/ubuntu/
mariadb-server-5.5        trusty/main              http://mirror.netcologne.de/mariadb/repo/5.5/ubuntu/
mariadb-server-core-5.5   trusty/main              http://mirror.netcologne.de/mariadb/repo/5.5/ubuntu/
mysql-common              trusty/main              http://mirror.netcologne.de/mariadb/repo/5.5/ubuntu/
php5-imagick              trusty/universe          http://mirror.hetzner.de/ubuntu/packages/
python-chardet-whl        trusty-updates/universe  http://mirror.hetzner.de/ubuntu/packages/
python-colorama           trusty-updates/universe  http://mirror.hetzner.de/ubuntu/packages/
python-colorama-whl       trusty-updates/universe  http://mirror.hetzner.de/ubuntu/packages/
python-distlib            trusty-updates/universe  http://mirror.hetzner.de/ubuntu/packages/
python-distlib-whl        trusty-updates/universe  http://mirror.hetzner.de/ubuntu/packages/
python-pip                trusty-updates/universe  http://mirror.hetzner.de/ubuntu/packages/
python-pip-whl            trusty-updates/universe  http://mirror.hetzner.de/ubuntu/packages/
smem                      trusty/universe          http://mirror.hetzner.de/ubuntu/packages/

Wie viele Pakete befinden sich in welcher Paketquelle?

In diesem Zusammenhang ist manchmal auch interessant, wie viele Pakete eine bestimmte Paketquelle zur Verfügung stellt. Diese Informationen liefert das folgende Kommando (Quelle: askubuntu). Im folgenden Listing mit den Ergebnissen einer Ubuntu-16.04-Testinstallation mit einigen zusätzlichen Paketquellen habe ich alle 0-Ergebnisse entfernt.

for f in /var/lib/apt/lists/*Packages; do
  printf '%5d %s\n' $(grep '^Package: ' "$f" | wc -l) ${f##*/}
done | sort -n

      3 dl.google.com_linux_chrome_deb_dists_stable_main_binary-amd64_Packages
      3 repository.spotify.com_dists_stable_non-free_binary-i386_Packages
      4 repository.spotify.com_dists_stable_non-free_binary-amd64_Packages
      9 archive.canonical.com_ubuntu_dists_xenial_partner_binary-amd64_Packages
     10 archive.canonical.com_ubuntu_dists_xenial_partner_binary-i386_Packages
     12 ppa.launchpad.net_webupd8team_java_ubuntu_dists_xenial_main_binary-amd64_Packages
     12 ppa.launchpad.net_webupd8team_java_ubuntu_dists_xenial_main_binary-i386_Packages
     23 ppa.launchpad.net_atareao_atareao_ubuntu_dists_xenial_main_binary-amd64_Packages
     23 ppa.launchpad.net_atareao_atareao_ubuntu_dists_xenial_main_binary-i386_Packages
     45 at.archive.ubuntu.com_ubuntu_dists_xenial_restricted_binary-amd64_Packages
     46 at.archive.ubuntu.com_ubuntu_dists_xenial_restricted_binary-i386_Packages
    758 at.archive.ubuntu.com_ubuntu_dists_xenial_multiverse_binary-i386_Packages
    782 at.archive.ubuntu.com_ubuntu_dists_xenial_multiverse_binary-amd64_Packages
   7284 at.archive.ubuntu.com_ubuntu_dists_xenial_main_binary-i386_Packages
   7322 at.archive.ubuntu.com_ubuntu_dists_xenial_main_binary-amd64_Packages
  45574 at.archive.ubuntu.com_ubuntu_dists_xenial_universe_binary-i386_Packages
  45688 at.archive.ubuntu.com_ubuntu_dists_xenial_universe_binary-amd64_Packages

Tipps zur Desktop-Konfiguration für Ubuntu 16.04

$
0
0

Die Ubuntu-Systemeinstellungen bieten nur recht wenig Einstellmöglichkeiten. Aber Ubuntu wäre nicht Linux, gäbe es nicht unzählige Möglichkeiten, den Desktop nach eigenen Vorstellungen zu gestalten.

Konfigurationswerkzeuge installieren

Die zur Ubuntu-Konfiguration vorgesehenen Systemeinstellungen reichen leider nicht aus, um weitergehende Konfigurationswünsche zu erfüllen. Mit dem folgenden Kommando richten Sie gewissermaßen Ihren persönlichen Werkzeugkasten ein:

sudo apt install compizconfig-settings-manager unity-tweak-tool gnome-tweak-tool ldconf-tools

Dock-Position ändern

In Ubuntu 16.04 können Sie das Dock auch am unteren Bildschirmrand darstellen. Am schnellsten gelingt die Positionsänderung mit den folgenden Kommandos, die im Terminal auszuführen sind:

gsettings set com.canonical.Unity.Launcher launcher-position Bottom
gsettings set com.canonical.Unity.Launcher launcher-position Left

Alternativ können Sie auch das Unity-Tweak-Tool starten, das Dialogblatt Unity/Starter öffnen und dort die Option Erscheinungsbild/Position entsprechend einstellen.

Fenster durch einen Klick im Dock minimieren und wieder einblenden

Ein Klick auf ein Icon im Dock startet das betreffende Programm bzw. zeigt das laufende Programm an. Schön wäre es, wenn ein weiterer Klick das Programm wieder minimieren würde, wie dies unter OS X und Windows der Fall ist. Unity kann das, die Option wird aber offiziell nicht unterstützt. Starten Sie den Compiz Settings Manager, öffnen Sie dort das Modul Unity Plugin und aktivieren Sie die Option Launcher / Minimize Single Window Applications minimiert das offene Fenster eines Programms durch einen Klick auf das Icon im Dock. Merkwürdig, dass diese praktische Einstellung nicht standardmäßig gilt.

Ein Klick auf das Programm-Icon im Dock minimiert das entsprechende Fenster
Ein Klick auf das Programm-Icon im Dock minimiert das entsprechende Fenster

Weniger Effekte, mehr Geschwindigkeit

Wenn Sie Ubuntu auf einem alten Rechner oder in einer virtuellen Maschine ausführen, dann bremsen grafische Effekte die Darstellung des Menüs bzw. das Ein- und Ausblenden von Fenstern spürbar ein. Abhilfe schaffen zwei Optionen, die Sie am schnellsten im Dialogblatt Fensterverwaltung/Allgemein des Unity Tweak Tools verändern können. Dort stellen Sie die Option Texturenqualität auf Schnell und deaktivieren die Option Window Animations.

Zwei Optionen im Unity Tweak Tool vergrößern die  Darstellungsgeschwindigkeit  auf dem Desktop merklich.
Zwei Optionen im Unity Tweak Tool vergrößern die Darstellungsgeschwindigkeit auf dem Desktop merklich.

Ergänzend dazu können Sie im Compiz Config Settings Manager im Modul Unity Plugin die Option General/Enable Low Graphics Mode aktivieren. Sie bewirkt unter anderem, dass das Startmenü ohne Transparenz dargestellt wird. Das ist optisch weniger elegant, dafür wird das Menü nicht nur schneller eingeblendet, sondern ist auch besser lesbar.

Unity für langsame Grafikkarten optimieren
Unity für langsame Grafikkarten optimieren

Dezentere Fensterschatten

Standardmäßig stattet Unity alle Fenster mit einem riesigen, halbtransparenter Schatten aus. Solange Sie ein Bild als Hintergrund verwenden, stört das nicht. Wenn Sie aber Screenshots auf weißem Hintergrund erstellen wollen, sind dezentere Schatten erforderlich. Die entsprechenden Einstellungen finden Sie im Compiz Config Settings Manager im Dialogblatt Decorations. Dort müssen Sie die Option Override Theme Settings aktivieren und können dann die Schattengröße in den Feldern Active und Inactive window shadow radius einstellen.

Im Compiz Config Settings Manager können Sie die Fensterschatten minimieren
Im Compiz Config Settings Manager können Sie die Fensterschatten minimieren

Leider gilt die so vorgenommene Schattenreduzierung nur bis zum nächsten Unity/Compiz-Update. Um den Schatten neuerlich zu minimieren, müssen Sie die Option Override Theme Settings deaktivieren und dann neuerlich aktivieren.

Systemzustand anzeigen

Wenn Sie wissen möchten, wie stark die CPU Ihres Rechners gerade beansprucht wird, wie viel RAM in Verwendung ist, ob die Festplatte oder SSD gerade beansprucht wird etc., installieren Sie das Paket indicator-multiload. Anschließend starten Sie das Indikator-Programm mit [Alt]+[F2] indicator-multiload. Das Programm zeigt nun im Panel in einer
kleinen Grafik die aktuelle CPU-Auslastung an. Mit einem Mausklick auf den Menüeintrag Einstellungen können Sie weitere Informationselemente einblenden.

Konfiguration der Systemlastanzeige im Panel
Konfiguration der Systemlastanzeige im Panel

Wetterbericht im Panel

Das Programm My Weather Indikator zeigt die aktuelle Außentemperatur und eine Wettervorschau an. Das Programm steht nicht als offizielles Ubuntu-Paket zur Verfügung. Sie müssen deswegen eine zusätzliche Paketquelle einrichten:

sudo add-apt-repository ppa:atareao/atareao
sudo apt update
sudo apt install my-weather-indicator

Danach starten Sie das Programm im Startmenü und führen die Konfiguration durch. Wenn Sie möchten, dass das Programm in Zukunft automatisch im Panel erscheint, müssen Sie die Optionen Automatisch Starten im Dialogblatt Allgemeine Einstellungen aktivieren.

Ausführlicher Wetterbericht durch den My-Weather-Indicator
Ausführlicher Wetterbericht durch den My-Weather-Indicator

Sondertasten der Tastatur konfigurieren

Wenn Sie die Caps-Lock-Taste deaktivieren oder die Windows-Taste wie die Strg-Taste behandeln möchten, starten Sie das Programm gnome-tweak-tool (bzw. das Optimierungswerkzeug im Startmenü). Dieses Programm fügt sich optisch nicht gut in den Ubuntu-Desktop ein und bietet unzählige Einstellungsmöglichkeiten, die für Ubuntu nicht relevant sind. Deswegen sollten Sie ausschließlich dessen Dialogblatt Eingabe verwenden. Dieses Dialogblatt ist trotz aller anderen Einschränkungen des Programms ausgesprochen nützlich!

Das Gnome Tweak Tool erfüllt Tastatursonderwünsche
Das Gnome Tweak Tool erfüllt Tastatursonderwünsche

Natural Scrolling mit dem Mausrad

»Natural Scrolling« bedeutet, dass bei Scroll-Bewegungen auf dem Touchpad der Fensterinhalt in die gleiche Richtung bewegt wird — so wie auf einem Smartphone. Wenn Sie ein Touchpad verwenden, finden Sie eine entsprechende Option im Modul Maus und Touchpad der Systemeinstellungen. Leider bleibt diese Option für die Maus wirkungslos. Damit auch traditionelle Mausanwender natürlich scrollen können, müssen Sie eine neue Konfigurationsdatei einrichten, z.B. mit dem Editor gedit:

sudo gedit /usr/share/X11/xorg.conf.d/20-natural-scrolling.conf

Diese Datei muss den folgenden Inhalt haben:

Section "InputClass"
        Identifier "Natural Scrolling"
        MatchIsPointer "on"
        MatchDevicePath "/dev/input/event*"
        Option "VertScrollDelta" "-1"
        Option "HorizScrollDelta" "-1"
        Option "DialDelta" "-1"
EndSection

Damit die Konfiguration wirksam wird, starten Sie Ihren Rechner neu oder führen nach dem Speichern aller offenen Dateien sudo service lightdm restart aus.

Mehr Touchpad-Optionen

Die Systemeinstellungen bieten zwar Möglichkeit, das Touchpad ganz zu deaktivieren; noch praktischer wäre aber ein Automatismus, der das Touchpad eines Notebooks immer dann deaktiviert, wenn gerade eine Maus angeschlossen
ist.

Abhilfe schafft das Paket touchpad-indicator. Es wird in einem Private Package Archive (PPA) zur Verfügung gestellt und kann nach der Installation unter dem Namen Touchpad-Anzeige im Unity-Menü gestartet werden.

sudo add-apt-repository ppa:atareao/atareao
sudo apt update
sudo apt install touchpad-indicator
Der Touchpad Indicator deaktiviert das Touchpad automatisch, sobald eine Maus angeschlossen ist
Der Touchpad Indicator deaktiviert das Touchpad automatisch, sobald eine Maus angeschlossen ist

Noch mehr Tipps

Ubuntu MATE 16.04 für den Raspberry Pi

$
0
0

Ubuntu MATE war schon in der Vergangenheit die interessanteste Alternative zu Raspbian, vor allem für alle jene Raspberry-Pi-Fans, die ihren Minicomputer auch als Desktop-Rechner verwenden möchten. Die Benutzeroberfläche von MATE ist entschieden eleganter als jene von Raspbian. Auch die Standard-Software-Ausstattung mit Firefox, Thunderbird und LibreOffice ist mehr für den Desktop-Einsatz optimiert.

Seit gestern steht das Image von Ubuntu MATE 16.04 für den Raspberry Pi zum Download zur Verfügung — Zeit also, um einen kurzen Blick auf diese spezielle Ubuntu-Variante zu werfen.

Beachten Sie, dass Ubuntu MATE nur auf dem Raspberry Pi 2 und 3 läuft, nicht aber auf den 1er-Modellen sowie auf dem Raspberry Pi Zero!

Der Desktop von Ubuntu MATE 16.04
Der Desktop von Ubuntu MATE 16.04

Image-Größe

Die Image-Datei der finalen Version von Ubuntu MATE 16.04 ist unglücklich gewählt: Sie beträgt ca. 8 GByte, ist aber gerade um ein paar MByte größer als viele handelsüblichen 8-GByte-Karten. Daher brauchen Sie eine 16-GByte-SD-Karte, um das Image vollständig übertragen zu können. Möglicherweise wird die Image-Datei beim nächsten Update nochmals ein wenig verkleinert — dann sollte auch eine 8-GByte-Karte für erste Tests ausreichen.

Welcome-Programm

Neu im Vergleich zu Ubuntu MATE 15.10 ist in der aktuellen Version vor allem das Welcome-Programm, das beim ersten Login automatisch gestartet wird. Das Programm kann auch mit System / Willkommen gestartet werden. Es soll über Ubuntu MATE informieren und bei den ersten Schritten in Ubuntu MATE helfen.

Begeistert hat mich das Konzept nicht: Das Programm ist unübersichtlich zu bedienen, manche Dialoge sind zudem für die Raspberry-Pi-Variante irrelevant (NVIDIA-Treiberinstallation etc.).

Dennoch gibt es einen Aspekt, der das Welcome-Programm auch für Raspberry-Pi-Anwender interessant macht: Sie können damit das Dateisystem an die Größe der SD-Karte anpassen. Anfänglich verwendet Ubuntu MATE nur die ersten 8 GByte der SD-Karte — egal, wie groß die Karte tatsächlich ist. Das liegt daran, dass die Partitionsgröße auf der Image-Datei festgelegt ist.

Um die gesamte SD-Karte nutzen zu können, müssen Sie die Root-Partition und das dort enthaltene Dateisystem vergrößern. Dazu klicken Sie im Startdialog des Welcome-Programms klicken Sie auf den Button Raspberry Pi Information und im nächsten Dialog auf Größe jetzt ändern. Danach müssen Sie Ubuntu MATE neu starten.

Das Welcome-Programm hilft dabei, das Dateisystem an die Größe der SD-Karte anzupassen.
Das Welcome-Programm hilft dabei, das Dateisystem an die Größe der SD-Karte anzupassen.

raspi-config und rc-gui

Das von Raspbian vertraute Konfigurationsprogramm raspi-config sowie dessen grafische Variante rc-gui kann mit apt installiert werden. raspi-config kann für manche Konfigurationsarbeiten tatsächlich verwendet werden. Einige Funktionen dieses Programms sind aber Raspbian-spezifisch implementiert und werden daher unter Ubuntu MATE nicht funktionieren.

rc_gui führt beim Start einen entsprechenden Test durch und stellt fest, dass MATE nicht der Raspbian-Standardkonfiguration entspricht (kein Benutzer pi, kein lightdm-Display-Manager). Das Programm kann deswegen unter MATE nicht benutzt werden.

GPIO-Zugriff

Sowohl das Kommando gpio als auch Python-Scripts, die das RPi.GPIO-Modul verwenden, können GPIOs nun ohne root-Rechte (ohne sudo) steuern.

Versionsnummern

Die folgenden Tabelle fasst zusammen, welche Software-Versionen unter Ubuntu 16.04 MATE anfänglich zum Einsatz kommen. Die Firefox- und Thunderbird-Pakete werden während der Lebensdauer von Ubuntu 16.04 regelmäßig aktualisiert.

Basis           Desktop            Programmierung     Server
--------------  ------------------ --------------    --------------
Kernel     4.4  Firefox        45  bash       4.3    Apache    2.4
glibc     2.23  Gimp          2.8  gcc        5.3    CUPS      2.1
X-Server  1.18  LibreOffice   5.1  Java       7/8    MySQL     5.7
Systemd    229  MATE         1.12  PHP          7    OpenSSH   7.2
                Thunderbird    38  Python     3.5    Postfix   3.1
                                                     Samba     4.3

Fazit

Zu den größten Ärgernissen in Ubuntu MATE zählt ein uraltes Gnome-2-Problem: Die Maus muss pixelgenau auf den Fensterrand positioniert werden um die Größe eines Fensters zu ändern. Ansonsten funktioniert Ubuntu MATE wunderbar, sowohl im Vergleich zu Raspbian als auch im Vergleich zum richtigen Ubuntu.

Allerdings fühlt sich MATE deutlich schleppender an als Raspbian — auch auf dem relativ rechenstarken Raspberry Pi 3. Die größte Bremse ist offenbar nicht die CPU, sondern die SD-Karte: Die unter MATE laufenden Programme sind durchwegs größer als die von Raspbian, entsprechend länger dauert der Bootprozess bzw. der erste Start eines Programms.

Bastler und Maker werden sicherlich weiterhin Raspbian den Vorzug geben. Für Desktop-Anwender ist MATE aber eine interessante Alternative. Spannend ist MATE auch für alle, die den Raspberry Pi zum Webserver machen wollen: Mit PHP 7 und MySQL 5.7 bietet MATE hier wesentlich aktuellere Versionen an als Raspbian.

Links


»Hello World« am Apple TV 4

$
0
0

Mit der vierten Generation des Apple TVs hat Apple das Gerät (endlich) auch für Entwickler interessant gemacht. In Xcode können Sie nun tvOS-Apps programmieren und in der Apple-TV-Sparte des App Stores zum Download bzw. Verkauf anbieten. Dabei gibt es grundsätzlich zwei Arten von Apps: Native Apps, die in Objective C oder Swift entwickelt werden, sowie JavaScript-Apps, die auf einen externen Server zugreifen (Konzept in der Apple-Dokumentation). Ich gehe hier nur auf die Native-Swift-Variante ein.

Gerät registrieren

Eine neue tvOS-App starten Sie in Xcode wie üblich mit File / New / Project. Dabei wählen Sie als Vorlage tvOS Application / Single View Application aus. Das aus der Vorlage produzierte Projekt ist sofort ausführbar (auch wenn es natürlich nichts tut und lediglich einen grau melierten Hintergrund zeigt). Allerdings beklagt sich Xcode nun darüber, dass es die App nicht signieren können, weil die erforderlichen Provisioning Profiles fehlen würden. Das Problem lässt sich mit Fix Issue unkompliziert lösen — vorausgesetzt, Sie haben Ihr Apple-TV-Gerät mit einem USB-C-Kabel mit Ihrem Mac verbunden.

Der erste Versuch, ein tvOS-App zu starten, führt zu einer Fehlermeldung
Der erste Versuch, ein tvOS-App zu starten, führt zu einer Fehlermeldung

Kabel-Chaos: Apple-TV-Geräten liegt eine Fernbedienung und ein Lightning-Kabel bei. Dessen einziger Zweck besteht darin, dass Sie damit den eingebauten Akku der Fernbedienung aufladen können. Ich hätte gedacht, dass ich mit diesem Kabel auch das Apple-TV-Gerät mit meinem Mac verbinden könnte — aber falsch gedacht. Dazu brauchen Sie ein USB-C-Kabel! Warum in alles in der Welt baut Apple in die Fernbedienung eine Lightning-Buchse ein, in das Gerät aber einen USB-C-Buchse? Dass Apple seinen selbst entwickelten Lightning-Adapter zugunsten USB-C aufgibt, diese Hoffnung habe ich schon längst begraben. Aber wenn schon Lightning, dann doch zumindest konsequent …

Ein USB-Verbindung zwischen Ihrem Mac und dem Apple-TV-Gerät vorausgesetzt, bewirkt Fix Issue, dass das tvOS-Gerät zur Liste der Geräte Ihres Apple-Developer-Account hinzugefügt wird. (Davon können Sie sich mit einem Blich auf https://developer.apple.com/account/ios/device/tvOS vergewissern.) Gleichzeitig lädt Xcode die erforderlichen Signing Identities und Provisioning Profiles herunter (siehe Xcode / Einstellungen / Accounts / Details).

App-Entwicklung in Xcode

Die Entwicklung einer tvOS-App in Xcode folgt nach den gleichen Konzepten wie bei iOS- oder OS-X-Apps: Sie gestalten im Storyboard-Editor die Benutzeroberfläche und verbinden diese dann mit eigenem Code. Als extrem irritierend hat sich dabei die riesige Darstellung des Storyboards herausgestellt: Selbst auf einem 27-Zoll-Monitor kann eine Ansicht des Storyboard nur dann vollständig angezeigt werden, wenn nahezu alle anderen Xcode-Elemente ausgeblendet werden. Eine verkleinerte Darstellung ist zwar möglich (Editor / Canvas / Zoom), dann ist aber keine Interaktion mehr möglich. Absurd! Auf einem Notebook ist es nahezu unmöglich, eine tvOS-Oberfläche zu gestalten. (Das Problem wurde auch in den Apple-Entwickler-Foren diskutiert, Lösung gibt es aktuell aber keine.)

Selbst auf einem 27-Zoll-iMac füllt das Storyboard nahezu den gesamten Bildschirm. Auf kleineren Displays wird die Arbeit zur Qual.
Selbst auf einem 27-Zoll-iMac füllt das Storyboard nahezu den gesamten Bildschirm. Auf kleineren Displays wird die Arbeit zur Qual.

Test im Simulator

tvOS-Programme können in einem Simulator getestet werden. Dieser zeigt die App anfänglich genau so riesig an wie im Storyboard-Editor von Xcode. Im Simulator lässt sich das glücklicherweise mit Window / Scale ändern. Auch in der verkleinerten Darstellung bleibt die App bedienbar.

Die Steuerung der App im Simlulator ist allerdings mühsam: Die App reagiert nicht auf Maus- oder Touchpad-Bewegungen bzw. -Clicks. Stattdessen müssen Sie die Fernbedienung einblenden und bei deren Steuerung dann gleichzeitig die Alt-Taste drücken. Alles in allem ist selbst in einfachen Fällen ein Test an einem echten Apple-TV-Gerät unumgänglich.

tvOS-App im Simulator ausprobieren
tvOS-App im Simulator ausprobieren

Screenshots

Um Screenshots der App im Live-Test (also ohne Simulator) zu erstellen, öffnen Sie in Xcode Window/Devices und wählen dort das Apple-TV-Gerät aus. Im Hauptfenster erscheint dann der Button Take Screenshot. Die Screenshots werden auf dem OS-X-Schreibtisch (Desktop) gespeichert.

tv-screenshot

Hello World!

Als Hello-World-App habe ich eine minimalistische Oberfläche mit vier Buttons gestaltet. Wenn der Benutzer einen Button auswählt und anklickt, werden im Textfeld darunter diverse Informationen angezeigt.

Screenshot der Hello-World-App
Screenshot der Hello-World-App

Der dazugehörende Code in der ViewController-Klasse sieht so aus:

import UIKit

class ViewController: UIViewController {

  @IBOutlet weak var outputText: UITextView!

  override func viewDidLoad() {
    super.viewDidLoad()
  }


  @IBAction func showDateTime(sender: UIButton) {
    let now = NSDate()
    outputText.text = now.descriptionWithLocale(NSLocale.currentLocale())
  }

  @IBAction func showMemory(sender: UIButton) {
    let gbyte = Double(1024*1024*1024)
    let ram = NSProcessInfo.processInfo().physicalMemory
    let flashtotal = deviceTotalInBytes()
    let flashfree = deviceRemainingFreeSpaceInBytes()

    // formatieren
    let fmt = NSNumberFormatter()
    fmt.minimumFractionDigits = 2
    fmt.maximumFractionDigits = 2
    let ramfmt   =
      fmt.stringFromNumber(Double(ram) / gbyte)!
    let flashfreefmt =
      fmt.stringFromNumber(Double(flashfree) / gbyte)!
    let flashtotalfmt =
      fmt.stringFromNumber(Double(flashtotal) / gbyte)!

    // ausgeben
    outputText.text =
      "Arbeitsspeicher (RAM, insgesamt):  \(ram) Byte = \(ramfmt) GByte\n" +
      "Gerätespeicher (Flash, insgesamt): \(flashtotalfmt) GByte\n" +
      "Gerätespeicher (Flash, noch frei): \(flashfreefmt) GByte"
  }

  @IBAction func showVersion(sender: UIButton) {
    let v = UIDevice.currentDevice().systemVersion
    outputText.text = "tvOS-Version \(v)"
  }

  @IBAction func showIpAddress(sender: UIButton) {
    var out = ""
    for s in getIPAddresses() {
      out += s + "\n"
    }
    outputText.text = "IP-Adresse(n): " + out
  }
}

Nicht im Listing enthalten sind die Funktionen deviceRemainingFreeSpaceInBytes, deviceTotalInBytes und getIPAddresses. Sie sind auf den unter Quellen angegebenen Stackoverflow-Seiten im Detail dokumentiert. Bemerkenswert ist, dass getIPAddresses selbst dann nur eine IP-Adresse liefert, wenn das Apple-TV-Gerät über WLAN-Zugang und eine Ethernet-Verbindung verfügt. In diesem Fall hat Ethernet Vorrang, die WLAN-Verbindung bleibt ungenutzt.

Quellen

Download

Hier können Sie den Quellcode des Hello-World-App herunterladen (erfordert Xcode 7.3, getestet mit Swift 2.2 unter tvOS 9.2):

tv-first-test.zip

Pläne für Swift 3.0

$
0
0

Mit der Geheimniskrämerei ist es vorbei: Da Swift ein Open-Source-Projekt ist, verläuft die Entwicklung nun deutlich transparenter. Dieser Beitrag fasst zusammen, wie Swift 3 voraussichtlich aussehen wird. Diese Pläne ändern sich momentan laufend. Dieser Beitrag wird deswegen regelmäßig aktualisiert. (Erste Version 11.12.2015, letztes Update: 3.5.2016.)

PS: Die Liste der Änderungen hat inzwischen schon fast epische Ausmaße angenommen. Dieser Blogbeitrag ist eine Zusammenfassung der Neuerung, die mir am wichtigsten erscheinen, aber keine vollständige Referenz. Werfen Sie gegebenenfalls einen Blick auf die Seite https://github.com/apple/swift-evolution!

Die Basis: Swift 2.2

Seit Ende März 2016 ist Swift 2.2 verfügbar. Für dieses Blog habe ich einen ausführlichen Überblick über alle Neuerungen in Swift 2.2 verfasst. Der Vollständigkeit halber fasse ich die wichtigsten Punkte hier nochmals in Kurzform zusammen:

  • keine klassische-for-Schleife mehr (deprecated in Swift 2.2, nicht mehr verfügbar in Swift 3)
  • kein x++/x-- mehr (ebenso)
  • neue Selektor-Syntax
  • associatedtype-Schlüsselwort für generische Parameter von Protokollen (anstelle von typealias)
  • keine var-Parameter mehr
  • Swift-Schlüsselwörter dürfen als Parameternamen verwendet werden
  • Tupel-Vergleiche

Die Fertigstellung von Swift 3 ist für den Herbst 2016 geplant. Diese Seite konzentriert sich im Weiteren auf die geplanten Neuerungen in Swift 3.0 relativ zu Swift 2.2.

Binärkompatibilität

Auch Apple ist sich bewusst, dass die ständigen Änderungen in Swift für all jene, die schon produktiv mit Swift arbeiten, mühsam sind. Mit Version 3.0 sollen aber möglichst viele Interna und Strukturen so weit fixiert werden, dass nicht mehr bei jedem Update alles neu kompiliert werden soll.

Verbesserte Schnittstellen zu den Bibliotheken

Die Nutzung der für Objective C konzipierten Bibliotheken und XxxKits unter Swift ist sperrig, unübersichtlich und un-swift — das bemerkt jeder, der auch nur wenige Tage mit Swift programmiert. Auch in meinem Buch habe ich das mehrfach kritisch angemerkt.

Nicht einmal Apple kann deswegen alle Bibliotheken neu implementieren. Stattdessen wurde beschlossen, einfach die Schnittstellen zu den Bibliotheken speziell für Swift zu optimieren. Das ist ein relativ pragmatischer Ansatz, der zwar keine perfekte Lösung verspricht, aber zumindest eine große Verbesserung.

Details können Sie in Proposal 0005, Proposal 0006, Proposal 0023 sowie in der Big-three-Zusammenfassung von Erica Sadun nachlesen. Die ursprünglich in diesem Zusammenhang geplante Abschaffung des NS-Präfix in diversen Klassennamen wurde vorläufig zurückgestellt. Ob es dazu kommen wird, ist offen.

In diesem Zusammenhang ebenfalls erwähnenswert ist der bereits akzeptierte Proposal 0033: Demzufolgen sollen in Objective-C-Code deklarierte Konstanten in Swift als Enums oder Structs verfügbar gemacht werden. Das erhöht nicht nur die Lesbarkeit des Codes, sondern auch die Typensicherheit.

Umgang mit Aufzählungen (Collection-Klassen)

Die Swift-Klassenbibliothek enthält diverse Aufzählungsklassen. Deren Methoden index.successor(), index.predecessor(), index.advanced(by:) und index.distance(to:) werden in Zukunft nicht mehr auf das Index-Element angewendet, sondern direkt auf ein Objekt der Basisklasse, also beispielsweise in der Form mycollection.index(after: myindex). Der folgende Code stammt aus dem Proposal 0065:

// Swift 2.2
var i = c.index { $0 % 2 == 0 }
let j = i.successor()
print(c[j])

// Swift 3
var i = c.index { $0 % 2 == 0 }   // No change in algorithm API.
let j = c.index(after: i)         // Advancing an index requires a collection instance.
print(c[j])                       // No change in subscripting.

Core Libraries

Die Foundation-Bibliothek und die Bibliotheken libdispatch und XCTest sollen in Swift neu implementiert werden. Das primäre Ziel ist hier weniger die Optimierung der Schnittstelle zu Swift. Vielmehr sollen für Linux, Windows etc. zumindest Grundfunktionen zur Verfügung gestellt werden. Momentan ähnelt Swift unter Linux ja einer Insel in der Mitte des Pazifik: Sie können damit Algorithmen testen, aber nicht viel mehr. Jeder Zugriff auf Funktionen/Bibliotheken des Betriebssystem ist mit hohem (Code-)Aufwand verbunden. Indem dem Swift eine Open-Source-Version der Foundation-Bibliothek zur Seite gestellt wird, soll dieses Problem ein wenig gemindert werden. Weitere Informationen können Sie hier nachlesen. Wie weit die Arbeiten vorangeschritten sind, geht aus dieser Status-Seite hervor.

Generics

Der Umgang mit generische Typen soll in Swift 3 perfektioniert werden. In der Swift-3-Entwicklerversion bereits implementiert ist die generische Erweiterung von typealias (Ankündigung in der swift.dev-Mailing-Liste, Proposal 0047):

typealias StringDictionary<T> = Dictionary<String, T>
typealias IntFunction<T> = (T) -> Int
typealias MatchingTriple<T> = (T, T, T)
typealias BackwardTriple<T1,T2,T3> = (T3, T2, T1)

Zu den weiteren geplanten Neuerungen zählen rekursive Contraints. Eine recht detaillierte Zusammenstellung dessen, was hier für Swift 3.0 geplant ist, geben die beiden folgenden Beiträge/Diskussionen auf der der swift.evolution-Mailingliste:

In diesem Zusammenhang ist auch dieser Grundlagentext lesenswert. Er fasst die Konzepte der Generics-Implementierung auf der Basis von Swift 2 zusammen.

Sonstiges (geordnet nach Proposal-Nummer)

  • Keine Curried-Funktionen mehr: Swift bietet momentan die Möglichkeit, Curried Functions zu bilden, also Funktionen, bei denen vorerst nur ein Teil der Parameter festgelegt wird und der Rest weiter als Funktion genutzt werden kann. Diese relativ komplexe Syntax, auf die ich in meinem Buch gar nicht eingegangen bin, soll in Swift 3 eliminiert werden. Links: Proposal 0002, Wikipedia, Introduction to Function Currying in Swift, Instance Methods are Curried Functions in Swift, Beschreibung im Swift-Buch von Apple
  • Neue inout-Syntax: inout-Parameter werden in Zukunft so gekennzeichnet: f(paraname: inout Typename). Die bisherige Syntax lautete „f(inout paraname: Typename)`. Details: Proposal 0031

  • Playground-Literale: Im Playground können Literale für Farben, Bilder und Dateien aktuell z.B. in der Form [#Color(colorLiteralRed: red, green: green, blue: blue, alpha: alpha)#] dargestellt werden, also zwischen [# und #]. Die neue Syntax lautet #colorLiteral(...), #imageLiteral(...) und #fileLiteral(...). Details: Proposal 0039

  • Attributparameter: Parameter von Funktionen/Methoden werden in der Form f(name:wert) übergeben, also z.B. f(a:1, b:2). Diese Syntax soll in Zukunft auch für Attribute gelten, also z.B. @availability(iOS, introduced: 2.0) anstelle von @availability(iOS, introduced=2.0). Details: Proposal 0040

  • Mehr Flexibilität in switch/case let: Schon bisher ist es möglich, switch-Varianten mit Variablenzuweisungen zu kombinieren (case let). Swift 3 wird hier in meiner Ansicht nach recht exotischen Anwendungsfällen noch mehr Flexibilität bieten. Details: Proposal 0043

  • Alle Parameter sind gleich: Momentan ist der erste Parameter einer Methode unbenannt, alle weiteren sind benannt. Die Funktion func f(a:Int, b:Int) wird also mit f(1, b:2) aufgerufen. In Swift 3.0 werden dagegen alle Parameter einheitlich behandelt. Die erwähnte Funktion f muss dann mit f(a:1, b:2) aufgerufen werden, was wesentlich logischer ist.
    Details: Proposal 0046

  • Warnung, wenn das Ergebnis einer Funktion/Methode ignoriert wird: In Swift 3 wird der Aufruf von non-void Funktionen/Methoden ohne Berücksichtigung des Ergebnisses zu einer Warnung führen. Dieses Verhalten kann schon jetzt mit dem Attribut @warn_unused_result erreicht werden. In Swift 3 können Sie die Warnung mit dem Attribut @discardableResult unterdrücken. Details: Proposal 0047

  • Keine let-Parameter in Funktionen/Methoden: Aktuell können Parameter von Funktionen oder Methoden mit let gekennzeichnet werden, um darauf hinzuweisen, dass diese Parameter in der Funktion/Methode nicht geändert werden können (func f(let x:int)). Das gilt ohnedies per Default, weswegen das Schlüsselwort let in diesem Kontext eliminiert wird. Details: Proposal 0053

  • Erweitertes Protokoll für Fließkommazahlen: Das Protokoll FloatingPoint war bisher sehr minimalistisch. In Swift 3 wird es deutlich erweitert und enthält nun wesentlich mehr Funktionen. Details: Proposal 0067

  • Self in Werttypen: Das Schlüsselwort Self (groß geschrieben) konnte schon bisher in Klassen verwendet werden, um auf den Typ der Klasse zu verweisen. Das funktioniert jetzt auch in Strukturen bzw. ganz allgemein in Werttypen (value types). Ursprünglich schlug das Proposal 0068 auch vor, x.dynamicType durch x.Self zu ersetzen. Dieser Teil des Proposals wurde aber (vorerst) nicht akzeptiert — möglicherweise gibt es hierfür später ein neues Proposal.

  • Fast alle Swift-Schlüsselwörter sind als Attributnamen zulässig: Swift-Schlüsselwörter durften bisher nicht zur Benennung von Enum-Elementen, sowie für Methoden und Eigenschaften von Strukturen/Klassen/etc. verwendet werden. In Zukunft ist dies erlaubt. Details: Proposal 0071

Das kommt vielleicht

  • Besserer Umgang mit self in Closures: Simplified notation for avoiding the [weak self]/strongSelf dance with closures

  • Wunschliste von Erica Sadun: Die in der swift.evolution-Liste sehr aktive Swift-Buchautorin Erica Sadun hat eine Art private Wunschliste weiterer Änderungen zusammengestellt.

  • Mehrzeilige Zeichenketten: Auf der swift.evolution-Liste wurde Ende April intensiv darüber diskutiert, ob es in Swift eine syntaktisch einfache Möglichkeit zur Formulierung mehrzeiliger Zeichenketten geben soll. Bisher gibt es dazu weder einen Konsensus noch ein konkretes Proposal.

  • Neue Syntax zur Formulierung der Operator-Priorität: Momentan bestimmen numerische Konstanten, in welcher Reihenfolge Operatoren verarbeitet werden. Das System ist simpel, aber inflexibel. Proposal 0077 schlägt deswegen vor, die Rangfolge relativ zu anderen Operatoren anzugeben.

Das ist nicht bzw. frühestens in Swift 4 geplant

  • Multithreading/Asynchrone Programmierung: Swift 3 wird keine inhärenten Funktionen zur nebenläufigen Programmierung erhalten. Swift greift hierfür auf Foundation-Klassen, pthreads, libdispatch etc. zurück. Eine Swift-interne Implementierung asynchroner Funktionen ist aber für Swift 4 angedacht.

  • Bibliotheken: Apple kann und will nicht alle iOS-, OS-X-Bibliotheken etc. neu implementieren. Die Foundation-Bibliothek ist eine Ausnahme, alle anderen Bibliotheken sollen im Wesentlichen bleiben wie sie sind. Allerdings wird es massive Änderungen geben, wie die Methoden der iOS- und OS-X-Bibliotheken von Swift aus genutzt werden können (siehe die Überschrift »Verbesserte Schnittstellen zu den Bibliotheken« weiter oben).

  • Sprachänderungen, die Apple ablehnt: Auf der Seite Commonly Rejected Changes finden Sie eine Zusammenstellung häufig vorgeschlagener Änderungswünsche, die wenig bzw. keine Aussicht auf Erfolg haben, weil sie von Apple festgelegten Sprachdesign-Richtlinien widersprechen. Dazu zählen die Veränderung des Ternary Operators, die Abschaffung geschwungener Klammen zugunsten einer syntaktisch vorgeschriebenen Einrückung (wie in Python), eine andere Definition der Closure-Syntax oder die Verwendung einfacher Apostrophe für Character-Literale (wie in Java).

Swift-Version feststellen

Um die aktuelle Swift-Version Ihrer Xcode-Installation festzustellen, führen Sie in einem Terminal-Fensters swift -version aus. Xcode 7.2 enthält die Swift-Version 2.1.1, Xcode 7.3 Beta die Swift-Version 2.2 (zuletzt getestet Mitte März 2016):

swift -version
  Apple Swift version 2.1.1 (swiftlang-700.1.101.15 clang-700.1.81)
  Target: x86_64-apple-darwin15.2.0

cd /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
./swift -version
  Apple Swift version 2.2 (swiftlang-703.0.17.4 clang-703.0.28)
  Target: x86_64-apple-macosx10.9

Quellen

Parallax-Icons für tvOS-Apps

$
0
0

Die Steuerung von tvOS erfolgt durch eine Art Cursor, der mit der Fernbedienung über Objekte am Bildschirm bewegt wird. Wenn es beispielsweise drei nebeneinanderliegende Buttons am Bildschirm gibt, dann gibt es horizontal nur drei mögliche Cursorpositionen. Ohne weitere Maßnahmen wäre die Cursorbewegung sehr ruckartig.

Um den Übergang von einen zum nächsten Objekt feiner darzustellen und damit die Cursorposition exakter aufzulösen, kippt tvOS die Buttons während sich der (an sich unsichtbare) Cursor darüber bewegt. Diese Kippbewegung wird durch 3D-Effekte und Schatten visualisiert. Das war Apple aber nicht genug: Auch die Icons an sich sollen sich beim Kippen verändern.

Während sich der unsichtbare Cursor über das Icon bewegt, ändert sich nicht nur der Schatten, sondern auch die Position der Zahnräder zueinander. (GIF-Animation)
Während sich der unsichtbare Cursor über das Icon bewegt, ändert sich nicht nur der Schatten, sondern auch die Position der Zahnräder zueinander. (GIF-Animation)

Parallax-Minimalismus bei Apple: Der Parallax-Effekt beim Systemeinstellungs-Icon ist zugegebenermaßen eindrucksvoll. Bei den meisten anderen Icons der mitgelieferten tvOS-Apps hat sich Apple deutlich weniger Mühe gegeben. Oft gibt es nur zwei Ebenen, den Hintergrund und einen Schriftzug oder ein Icon — fertig.

Wie funktioniert der Effekt?

Die Veränderung des Icon-Inhalts ist möglich, weil das Icon nicht eine simple Bitmap ist, sondern ein aus mehreren Ebenen zusammengesetztes Bild. Beim Kippen werden die Ebenen zueinander verschoben. Apple nennt das den Parallax-Effekt. Wie diese Ebenen beim Systemeinstellungs-Icon aussehen, hat Apple netterweise auch gleich auf dieser Seite dokumentiert.

Die fünf Ebenen des Icons der Einstellungs-App von tvOS. (Quelle:  https://developer.apple.com/tvos/human-interface-guidelines/icons-and-images)
Die fünf Ebenen des Icons der Einstellungs-App von tvOS. (Quelle: https://developer.apple.com/tvos/human-interface-guidelines/icons-and-images)

Wenn Sie eine tvOS-App im App Store einreichen möchten, müssen Sie alle Icons des Programms — und insbesondere das App-Icon, das im App-Store sichtbar ist, als Parallax- Icons gestalten. Festgeschrieben ist das in den Human Interface Guidelines (kurz HID) für tvOS.

Apple hat dazu gleich ein eigenes Datenformat geschaffen, das Layered Image File Format (*.lsr). Selbstredend müssen Sie das App-Icon auch in zwei Auflösungen zur Verfügung stellen, momentan 400×240 und 1280×768. Es ist aber natürlich zu erwarten, dass es irgendwann ein 4k-fähiges Apple-TV-Gerät geben wird — dann werden Sie voraussichtlich auch Icons in einer Auflösung von 400×240@2x und 1280×768@2x zur Verfügung stellen müssen, also netto 800×480 und 2560×1536. Insofern ist 2560×1536 vermutlich die beste Auflösung, wenn Sie heute ein Icon für eine neue tvOS-App entwickeln. Hinunter skalieren können Sie die Icons dann immer.

Mit dem LSR-Format müssen Sie sich aber normalerweise gar nicht auseinandersetzen: Xcode ist in der Lage, aus mehreren PNGs selbst eine geeignete LSR-Datei zu kompilieren. Alternativ können Sie auch den Parallax Previewer dazu verwenden.

LSR- versus LCR-Format: Apple hat nicht nur ein neues Format definiert, sondern sogar zwei: Neben dem LSR-Format gibt es auch ein LCR-Format (Details). Es ist für Icons gedacht, die nicht direkt in Xcode in die App eingebettet werden, sondern die die App aus dem Internet bei Bedarf nachlädt — z.B. Icons für Zusatzfunktionen Ihrer App, die extra erworben werden müssen.

Parallax-Icons in Gimp erstellen

Jetzt stellt sich natürlich die Frage, wie Sie selbst ein Parallax-Icon erstellen. Eigentlich ist es ganz einfach: Sie erstellen in Gimp, Photoshop oder einem anderen Zeichenprogramm mehrere Bitmaps: eines für den Hintergrund und eines oder mehrere für den Vordergrund. Bei den Vordergrund-Bitmaps müssen Sie darauf achten, dass die gesamte Bitmap mit Ausnahme des eigentlichen Vordergrunds transparent ist. Diese Bitmaps speichern Sie in der richtigen Auflösung und fügen Sie dann per Drag&Drop an den richtigen Stelle in Ihr Xcode-Projekt ein.

Ich verfüge über kein Photoshop, deswegen zeige ich Ihnen, wie Sie die Schritte im kostenlosen Programm Gimp erledigen.

  • Mit Datei / Neu erzeugen Sie ein neues Bild, wobei Sie als Größe vorausschauend gleich 2560×1536 Pixel wählen.
  • Das Bild hat vorerst nur eine Ebene, die als Hintergrund Ihres Icons dient. Mit den Werkzeugen Füllen oder Farbverlauf können Sie den Hintergrund unkompliziert homogen einfärbig oder in Form eines fließenden Übergangs zwischen zwei Farben gestalten.

  • Mit Ebene / Neue Ebene können Sie nun Vordergrundebenen über den Hintergrund legen. Achten Sie darauf, dass die neuen Ebenen anfänglich vollständig transparent sind.

  • In die Vordergrundebenen zeichnen Sie nun das Symbol Ihrer App.

  • Die HID raten zwar davon ab, aber anstelle eines Logo kann das Icon natürlich auch einen kurzen Text enthalten — z.B. den Firmennamen eines TV-Senders (arte, ZDF etc.). Textebenen brauchen Sie nicht extra erstellen. Stattdessen verwenden Sie das Werkzeug Text. Es erzeugt automatisch für jeden Text eine eigene Ebene.

Standardmäßig sind alle Ebenen gleichzeitig sichtbar. Beim Arbeiten im Gimp können Sie aber immer nur die gerade aktuelle Ebene verändern. Welche das ist, geht aus der Ebenen-Toolbox hervor (Fenster / Andockbare Dialoge / Ebenen). Die dort hervorgehobene Ebene ist die gerade aktive Ebene. In der Ebenen-Toolbox können Sie auch die Sichtbarkeit einzelner Ebenen umschalten. Das ist praktisch, wenn Sie gerade nur eine Vordergrundebene sehen wollen.

Das gesamte Projekt speichern Sie im Gimp-eigenen Format als *.xcf-Datei. Dabei bleiben alle Ebenen erhalten. Nun müssen Sie aber außerdem noch jede Ebene extra in der gewünschten Auflösung speichern:

  • Nachdem Sie eine Sicherheitskopie Ihres Icons erstellt haben, führen Sie Bild / Bild skalieren durch und skalieren Ihr Icon (also alle Ebenen) auf die gewünschte Auflösung — z.B. auf 400×240 Pixel. Danach machen Sie im Ebenendialog alle Ebenen mit Ausnahme der Hintergrundebene unsichtbar. Mit Datei / Exportieren speichern Sie nun nur die Hintergrundebene als PNG-Datei. Analog gehen Sie auch für die Vordergrundebenen vor; Sie machen also immer alle Ebenen unsichtbar mit Ausnahme der Ebene, die Sie speichern (exportieren) möchten. Verwenden Sie Dateinamen, aus denen sowohl die Auflösung als auch die Ebene hervorgeht — z.B. meinicon-400-hintergrund.png oder meinicon-1920-vordergrund2.png!

Als Beispiel habe ich ein Icon für meine tvOS-Hello-World-App gestaltet. Sie besteht aus drei Ebenen: einem grauschattierten Hintergrund sowie zwei Vordergrundebenen mit den Texten Hello und World! in weißer bzw. schwarzer Courier-Schrift.

Gimp eignet sich wunderbar dazu, ein Icon aus mehreren Ebenen zusammenzusetzen.
Gimp eignet sich wunderbar dazu, ein Icon aus mehreren Ebenen zusammenzusetzen.

Parallax-Icons in Xcode

Xcode sieht bei tvOS-Apps in Assets.xcassets standardmäßig für das kleine und das große App Icon je drei Ebenen vor: Back (für den Hintergrund) sowie Middle und Front. Sie können nach Bedarf Ebenen umbenennen, hinzufügen und löschen, es müssen aber auf zumindest zwei Ebenen verbleiben: Eine Hintergrundebene und eine teilweise transparente Vordergrundebene.

Für die Beispiel-App habe ich in Gimp die drei Ebenen meines Icons in jeweils zwei Auflösungen gespeichert und die Dateien dann per Drag&Drop in die vorgesehen Platzhalter eingefügt.

Assets.xcassets sieht bei tvOS-Programmen Platzhalter für das App Icon sowie für das Top Shelf Image und das Launch Image vor.
Assets.xcassets sieht bei tvOS-Programmen Platzhalter für das App Icon sowie für das Top Shelf Image und das Launch Image vor.

Sobald Sie mehrere Bitmaps für die Ebenen des Icons eingefügt haben, zeigt Xcode oben das zusammengesetzte Icon an. Wenn Sie den Mauszeiger über dieses Icon bewegen, erscheint dieselbe Animation wie unter tvOS — d.h. Sie erhalten eine Vorschau des Parallax-Effektes.

Das Hello-World-Icon in verschiedenen Darstellungen (GIF-Animation)
Das Hello-World-Icon in verschiedenen Darstellungen (GIF-Animation)

Der Parallax Previewer

Wenn Sie sich zum Zusammensetzen eines Parallax-Icons nicht auf Xcode zurückgreifen möchten, können Sie dazu auch den Parallax Previewer zurückgreifen, den Apple als kostenloses Programm für OS X anbietet. Mit File / Open laden Sie die erste PNG-Datei Ihres Icons, anschließend fügen Sie die weiteren Ebenen mit dem Plus-Button hinzu. Das Icon wird aus den Ebenen zusammengesetzt. Wie in Xcode wird das Icon in unterschiedliche Richtungen gekippt, sobald Sie die Maus darüber bewegen. Besonders praktisch an dem Programm ist die Möglichkeit, die einzelnen Ebenen zueinander zu verschieben.

Im Parallax Previewer können Sie mehrere Bitmaps zu einem Icon zusammensetzen und als LSR- oder LCR-Datei speichern.
Im Parallax Previewer können Sie mehrere Bitmaps zu einem Icon zusammensetzen und als LSR- oder LCR-Datei speichern.

Die im Parallax Previewer exportieren LSR-Dateien können Sie dann in Xcode einfügen. Merkwürdigerweise habe ich aber keine Möglichkeit gefunden, ein LSR-Datei als App-Icon zu verwenden. (Mit anderen Worten: Wenn Sie außer den App-Icons zusätzliche Parallax-Icons benötigen, ist der Parallax Previewer eine wertvolle Hilfe — aber eben nicht für das App-Icon. Aber vielleicht habe ich auch einfach eine Funktion des xcassed-Editors in Xcode übersehen.)

Launch Image

Wenn Sie eine tvOS-App im App Store einreichen, müssen Sie diese auch mit einem »Launch Image« ausstatten. Das ist eine Bitmap in der Auflösung 1920×1080, die Ihre App so zeigen soll, wie diese beim Start erscheint. Eine geeignete Bitmap erhalten Sie am einfachsten, wenn Sie Ihre App starten und dann einen Screenshot machen.

Der Sinn des Launch Image ist es, dem Benutzer den Eindruck zu vermitteln, dass die App besonders schnell startet. Dazu wird zu erst das Launch Image geladen und angezeigt. Sobald die App läuft, ersetzt dessen Oberfläche das statische Bild.

Damit sollte auch klar sein, dass Sie beim Launch Image auf alle Spielereien (Parallax-Effekte etc.) verzichten können. Hier geht es wirklich nur um einen Screenshot!

Top Shelf Image

Damit aber noch nicht genug. Jede App-Store-taugliche App muss außerdem ein »Top Shelf Image« haben. Wenn der Apple-TV-Benutzer Ihre App in die oberste Zeile verschiebt (also zu den App-Favoriten) und dort auswählt, dann wird das Top Shelf Bitmap ganz oben auf dem Bildschirm angezeigt. Die Bitmap muss 1920×720 Pixel groß sein.

Die Top Shelf ist eigentlich dazu gedacht, dass Apps dort eine Auswahl von Objekten anzeigen — das App Store die gerade beliebtesten Apps, iTunes die neuesten Filme etc. Normalerweise werden diese Objekte dynamisch vom Programm generiert. Das Top Shelf Image ist nur für den Fall gedacht, dass der entsprechende Code in der App fehlt.

Die zuletzt in der Favoriten-Leiste ausgewählte App bestimmt, was in der Top Shelf angezeigt wird -- standardmäßig das Top Shelf Image.
Die zuletzt in der Favoriten-Leiste ausgewählte App bestimmt, was in der Top Shelf angezeigt wird — standardmäßig das Top Shelf Image.

Quellen

Download

Hier können Sie den Quellcode des Hello-World-App samt aller Icons herunterladen (erfordert Xcode 7.3, getestet mit Swift 2.2 unter tvOS 9.2):

Und hier ist die Gimp-Datei mit den drei Ebenen der Icons:

Java-Schleifen: int versus double

$
0
0

Gerade habe ich eine Anfrage zu meiner Übungsaufgabe aus meinem Java-Grundkurs erhalten. Ich habe in der Lösung eine for-Schleife mit einer int-Variable vorgeschlagen. Warum nicht eine double-Variable als Schleifenvariable verwenden?

Problematisch bei double-Schleifen sind die Rundungsfehler. Betrachten Sie z.B.:

class Test {
  public static void main(String[] args) {
    for(double x=0; x<=2; x+=0.1)
      System.out.println(x);
  }
}

Man würde hier annehmen, dass die Schleife 21 mal durchlaufen wird und dabei die Werte 0, 0.1, 0.2, …, 2.0 ausgegeben werden. Tatsächlich lautet die Ausgabe:

0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999
1.2
1.3
1.4000000000000001
1.5000000000000002
1.6000000000000003
1.7000000000000004
1.8000000000000005
1.9000000000000006

Das Problem ist dabei nicht, dass einzelne Zahlen ungenau erscheinen — das ist ein Darstellungsproblem, alle Werte sind gleich ‚ungenau‘ bzw. so genau, wie es eben geht. Schlimm ist aber, dass die Schleife nur 20 Mal durchlaufen wird. Wenn Sie damit ein Vieleck zeichnen wollen, dann fehlt im Vieleck der letzte Strich.

Dieses Problem ist systemimmanent und nicht zu vermeiden. Fließkommazahlen in der üblichen IEEE-64- oder IEEE-80-Bit-Darstellung sind mit Rundungsfehlern behaftet, das ist nicht zu ändern, auch nicht durch die Wahl einer anderen Programmiersprache.

Das Problem lässt sich umgehen, in dem beim Vergleich mit dem Endwert (hier 2.0) diesen mit einem kleinen Delta vergrößert, also die Schleife so formuliert:

for(double x=0; x<=2.000001; x+=0.1)

Dann werden bei diesem Beispiel auch bei Rundungsfehlern garantiert immer alle beabsichtigten Werte durchlaufen.

Nur: man vergisst dieses Delta oft oder berechnet es falsch. Viele double-Schleifen funktionieren ja ohnedies wie beabsichtigt, oft arbeitet der Rundungsfehler ja zum eigenen Gunsten. Nur verlassen kann man sich eben nicht darauf.

Und aus diesem Grund ziehe ich, wenn es irgendwie möglich ist, Integer-Variablen für Schleifen vor und führe danach gegebenenfalls eine Umrechnung in eine Fließkommazahl durch. Also:

class Test {
  public static void main(String[] args) {
    for(int i=0; i<=20; i++) {
      double x =  (double)i / 10.0;
      System.out.println(x);
    }
  }
} 

Excel 2016 programmieren

$
0
0

Wenige meiner Bücher haben zehn Auflagen erreicht — das Excel-VBA-Buch (1. Auflage 1994) mit dem aktuellen Titel Excel 2016 programmieren gehört jetzt dazu. Schon zum dritten Mal hat Ralf Nebelo eine Menge Zeit, Mühe und Praxiswissen investiert und das Buch vollständig überarbeitet, erweitert und verbessert. Darüber bin ich ausgesprochen glücklich!

excel2016

Unter den vielen Neuerungen stechen drei Punkte heraus:

  • die Programmierung neuer Diagrammtypen (Wasserfall-, Pareto- und Treemap-Diagramme)
  • der Datenbankzugriff mit der jetzt in Excel und in das VBA-Objektmodell integrierten Power-Query-Technologie
  • die Programmierung von Office-Add-ins (ehemals Office-Apps)

Ubuntu 16.04 nach einem Monat

$
0
0

Vor ca. einem Monat wurde Ubuntu 16.04 freigegeben. In den Release Notes und in diversen Tests wurde damals auf etliche Probleme und Kinderkrankheiten hingewiesen. Heute habe ich nochmals eine Neuinstallation von Ubuntu 16.04 vom offiziellen ISO-Image durchgeführt, wobei ich die Installationsoption Herunterladen der Aktualisierungen aktiviert habe, damit ich von Anfang an ein möglichst aktuelles und fehlerfreies Ubuntu erhalte. Das Ergebnis ist leider ernüchternd.

Die Probleme beginnen damit, dass während der Installation keineswegs alle verfügbaren Updates installiert werden. Nun gut, das lässt sich beheben. In einem Terminalfenster habe ich das Update manuell durchgeführt. (GUI-Freunde können das natürlich auch mit der Aktualisierungsverwaltung erledigen, aber mir sind Kommandos nun mal lieber.)

sudo apt update
sudo apt full-upgrade

Anschließend habe ich gleich noch diverse Multimedia-Codecs installiert:

sudo apt install ubuntu-restricted-extras

Menüs werden nicht angezeigt

Einige Leser haben mich in den letzten Tagen darauf aufmerksam gemacht, dass bei diversen Programmen (z.B. LibreOffice) keine Menüs angezeigt werden. Zuerst wollte ich es nicht glauben — ich hatte damit bisher auf keinem meiner eigenen Installationen ein Problem — aber dann bin ich auf den folgenden Launchpad-Bug-Report gestoßen:

https://bugs.launchpad.net/ubuntu/+source/unity/+bug/1532226

Demnach betrifft das Problem zahlreiche Personen (fast 180 haben sich die Mühe gemacht, Yes, this bug affects me anzuklicken). Der Bug-Bericht hat unzählige Duplikate. Der Fehler wird mittlerweile auch in den Release Notes erwähnt:

https://wiki.ubuntu.com/XenialXerus/ReleaseNotes#Unity_7

Das Nicht-Anzeigen von Menüs macht die Bedienung von Programmen wie LibreOffice eigentlich unmöglich. Da ist es schwer begreiflich, dass dieser Fehler noch immer ungelöst ist, zumal der Bug-Bericht bereits im Jänner (!) verfasst wurde. Das Problem scheint aber die schwierige Reproduzierbarkeit zu sein — selbst auf betroffenen Rechnern fehlen die Menüs anscheinend nur bei ca. jedem dritten Start.

Immerhin gibt es eine Notlösung, um das Problem zumindest bis zum nächsten Reboot zu umgehen: Dazu drücken Sie [Alt]+[F2], geben unity ein und drücken [Return]. Damit wird das Desktop-System Unity neu gestartet — und offensichtlich zeigt es nun verlässlich alle Menüs an. (Alle laufenden Programmen laufen weiter.)

Standby-Modus funktioniert nicht

Meine Leser haben von einem weiteren Problem berichtet. Das Aufwachen aus dem Standby-Modus funktioniert nicht immer. Auch diese Angelegenheit wurde natürlich schon im Internet thematisiert:

http://askubuntu.com/questions/761758/ubuntu-16-04-lts-cannot-suspend-fails-on-suspending

Der dazugehörige Bug-Bericht weist ca. 50 Kommentare auf, 140 Ubuntu-Anwender, die bis in die Tiefen des Launchpads vorgedrungen sind, bezeichnen sich als von dem Bug betroffen:

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1566302

Selbst hat mich zum Glück auch dieser Bug verschont — vermutlich, weil meine Notebooks allesamt nicht mehr ganz neu sind.

Kommentar 22 schlögt zur Behebung des Problems die Installation eines neueren Kernels vor. Für manche Ubuntu-Anwender scheint dies das Problem zu lösen, für andere nicht.

Offizielle Lösung gibt es auch in diesem Fall fünf Wochen nach der Freigabe von Ubuntu 16.04 keine. Zuständig fühlt sich offenbar auch niemand (assigned = unassigned). Somit gilt wohl auch in diesem Fall: Die Hoffnung der betroffenen Ubuntu-Anwender auf einen baldigen Bugfix ist gering.

VirtualBox-Treiber

Sollten Sie angesichts dieser Probleme auf die Idee kommen, Ubuntu vorerst eben nur in einer virtuellen Maschine auszuführen, werden Sie vermutlich auch nicht ganz glücklich werden. Nach der Installation der Virtualbox-Treiber (Systemeinstellungen, Modul Anwendungen & Aktualisierungen, Dialogblatt Zusätzliche Treiber) erscheint beim nächsten Login die Fehlermeldung VBoxCliend Failed to connect to the VirtualBox kernel service rc=VERR_ACCESS_DENIED. Die Fehlermeldung wird offenbar durch fehlerhafte VirtualBox-Kernelmodule verursacht.

VirtualBox-Treiberprobleme
VirtualBox-Treiberprobleme

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1571156
https://bugs.launchpad.net/ubuntu/+source/virtualbox/+bug/1572001

Der Status des Bugbericht lautet zwar fix released, aber das kann ich nicht nachvollziehen. Zur Lösung des Problems müssen die mitgelieferten VirtualBox-Kernelmodule gelöscht und anschließend (über das virtualbox-guest-dkms-Paket) neu kompiliert werden:

cd /lib/modules
rm $(find -name 'vbox*.ko')
apt install virtualbox-guest-dkms

Wartungsfragen (ubuntu-support-status)

Vor einem Monat hat heise.de kritisiert, dass die LTS-Update-Garantie nur für vergleichsweise wenige Pakete gilt.

Parallel dazu hat sich herausgestellt, dass das Kommando ubuntu-support-status nicht wirklich zuverlässig funktioniert. Es soll Auskunft darüber geben, wie lange es für die installierten Pakete noch Updates gibt. Im dazugehörigen Bug-Report wurde Besserung versprochen — aber seither ist es in dieser Angelegenheit still geworden:

https://bugs.launchpad.net/ubuntu/+source/update-manager/+bug/1574670

Eine Hilfestellung bei der Analyse, woher die installierten Pakete einer Ubuntu-Installation eigentlich kommen, kann mein Script packagelist geben (siehe Die LTS-Frage).

Behobene Probleme

Damit hier nicht der Eindruck entsteht, dass ich nur lamentiere, zuletzt noch ein paar positive Aspekte. Einige Probleme, die mir während der ersten Wochen mit Ubuntu 16.04 aufgefallen sind, sind erfreulicherweise behoben:

  • Das Programm Ubuntu Software installiert nun auch Debian-Paketen von Drittanbietern (Skype, Teamviewer & Co.).
  • Darüberhinaus kann Ubuntu Software sogar Snap-Pakete installieren — vorausgesetzt, Sie verfügen über ein Ubuntu-One-Konto (»Ubuntu Single Sign-On«).
  • Auch die Integration des ownCloud-Clients in das Panel funktioniert mittlerweile.

Fazit

Ich verwende Ubuntu 16.04 nun schon seit der Beta-Phase auf diversen Rechnern und Servern und habe damit fast ausschließlich gute Erfahrungen gemacht. Aber: ich bin beim Hardware-Kauf sehr konservativ, und ich kann mir bei Problemen im Regelfall selbst helfen.

Gleichzeitig fällt es mir immer schwerer, Ubuntu 16.04 im gegenwärtigen Zustand Linux-Einsteigern für den Desktop-Betrieb zu empfehlen. It just works — das war einmal. Dass es bei einer neuen Distribution oft Kinderkrankheiten gibt, ist ja (leider) klar. Aber wenn einen Monat nach einem LTS-Release nicht erkennbar ist, dass Ubuntu/Canonical aktiv an der Lösung dieser Probleme arbeitet, dann ist dies deprimierend.

Wie sind Ihre Erfahrungen?

Wenn Sie positive oder negative Erfahrungen mit Ubuntu 16.04 gemacht haben, dürfen Sie hier gerne einen Kommentar verfassen oder mir persönlich eine Mail schreiben (kontakt – at – kofler – dot – info).

Swift 3 Preview 1 in Xcode 7.3.1 ausprobieren

$
0
0

Apple stellt seit Ende Mai auf https://swift.org/download/#snapshots einen Snapshot der ersten Preview-Version von Swift 3 zur Verfügung. Dieser Snapshot — die offizielle Bezeichnung lautet »Swift 3.0 Preview 1 Snapshot 2016-05-31« — kann nun mit gewissen Einschränkungen unter Xcode 7.3.1 getestet werden.

Update 2.6.2016: Der Preview-Snapshot ist wieder von der Download-Seite verschwunden. Angeblich war es gar kein Preview. Oder kann es sein, dass das Preview-Spektakel erst mit der WWDC über die Bühne gehen soll?

Installation

Nach dem Download der *.pkg-Datei installieren Sie die darin enthalten Dateien und Bibliotheken. Nach einem Neustart von Xcode stellt dieses im Menü Xcode / Toolchains die installierten Swift-Versionen zur Auswahl.

Die gewünschte Swift-Version im Toolchains-Menü auswählen
Die gewünschte Swift-Version im Toolchains-Menü auswählen

Mit der Änderung der aktiven Swift-Version wird Xcode neu gestartet. Fertig!

Einschränkungen

  • Der aktuell verfügbare Snapshot ist noch nicht die endgültige Preview-1-Version, sondern eine Testversion auf dem Weg dorthin (eben ein Snapshot).
  • Es ist nicht möglich, mit diesem Snapshot Playgrounds zu erstellen. Das wäre gerade zum Testen natürlich ausgesprochen praktisch. Für kleinere Experimente erstellen Sie am besten ein neues Projekt vom Typ OS X / Application / Command Line.
  • Der Code-Konverter steht noch nicht zur Verfügung (Edit / Convert / To Latest Swift Syntax).
  • Naturgemäß läuft der Preview-Snapshot nicht stabil, viele für Swift 3 geplanten Features sind noch nicht implementiert (siehe auch https://github.com/apple/swift-evolution).
  • Die Templates für neue Projekte/Dateien sind noch nicht an die geänderten Signaturen von Methoden angepasst.
Die Templates für neue Projekte sind noch nicht Swift-3-kompatibel. Für neue Projekte gilt: »defective by default«
Die Templates für neue Projekte sind noch nicht Swift-3-kompatibel. Für neue Projekte gilt: »defective by default«

Man muss kein Hellseher sein, wenn man zur WWDC 2016 eine verbesserte Ausgabe dessen erwartet, was momentan verfügbar ist. Denkbar wäre z.B. eine erste Beta von Xcode 7.4 mit einer bereits integriertem Swift-3-Preview-1-Toolchain, womöglich mit funktionierenden Playgrounds.

Praxis

Bereits implementierte Neuerungen in Swift 3 können problemlos ausprobiert werden (Download-Link zum Beispielprojekt):

Erste Tests in Swift 3
Erste Tests in Swift 3

Als nächstes habe ich versucht, ein vorhandenes iOS-Projekt, mein Spiel Fünf gewinnt, auf Swift 3 zu portieren. Das hat sich als ausgesprochen mühsam erwiesen. Anfänglich war fast jede zehnte Zeile als fehlerhaft markiert. Zwar gibt es für die meisten Umstellungen Fix-its, dennoch war ich mehr als eine Stunde beschäftigt, bis sich das Programm wieder kompilieren ließ (insgesamt ca. 1000 Zeilen Code inkl. Kommentare).

Die Korrektur der vielen Inkompatibilitäten zwischen Swift 2 und Swift 3 erfordert Geduld und Handarbeit
Die Korrektur der vielen Inkompatibilitäten zwischen Swift 2 und Swift 3 erfordert Geduld und Handarbeit

Die häufigsten Fehlerquellen waren:

  • Umbenennung von Methoden und Parametern in Standardbibliotheken
  • das veränderte Verhalten des ersten Parameters von Methoden/Funktionen (bisher unnamed, jetzt named)

Das von Syntaxfehlern bereinigte Programm ließ sich starten und teilweise ausführen. Als größtes Problem stellte sich nun heraus, dass jeder durch Actions hergestellte Verbindung zwischen iOS-Steuerelementen (z.B. Buttons) und den dazugehörenden Methoden zum Fehler unrecognized selector führt. Ich habe keine Möglichkeit gefunden, diesen Fehler zu beheben, auch nicht in einem neuen iOS-Projekt (Single View Application mit einem Button).

Fazit

Im aktuellen Zustand eignet sich der Preview-1-Snapshot, um die neue Syntax auszuprobieren. Zur Entwicklung von Apps, die tatsächlich laufen, reicht es leider noch nicht.


Swift: Komfortabler mit CGFloat, CGPoint und CGRect arbeiten

$
0
0

In den letzten Wochen habe ich recht intensiv unter Swift 2.n mit dem SpriteKit gearbeitet. Ein großes Ärgernis ist dabei das umständliche Hantieren mit CGPoint, CGSize, CGRect– und CGVector-Strukturen. Lästig sind auch die ständig erforderlichen Typumwandlungen zwischen den im SpriteKit üblichen CGFloat-Zahlenformat und »gewöhnlichen« Integer- und Fließkommazahlen. Das ist umso absurder, als CGFloat auf 64-Bit-Plattformen ohnedies eine Double-Zahl ist. Einzig auf 32-Bit-Architekturen ist CGFloat tatsächlich ein Float.

Wie auch immer: Swift wäre nicht Swift, könnten wir uns das Leben nicht mit ein paar neuen Operatoren, nachträglichen Erweiterungen vorhandener Strukturen sowie mit globalen Funktionen leichter machen.

Eigene Operatoren

In Swift können Sie mühelos eigene Operatoren definieren. Der Code solte auf Anhieb verständlich sein:

// Operatoren für CGPoint-Daten
// CGPoints addieren/subtrahieren
public func + (left: CGPoint, right: CGPoint) -> CGPoint {
  return CGPoint(x: left.x + right.x, y: left.y + right.y)
}
public func += (inout left: CGPoint, right: CGPoint) {
  left = left + right
}
public func - (left: CGPoint, right: CGPoint) -> CGPoint {
  return CGPoint(x: left.x - right.x, y: left.y - right.y)
}
public func -= (inout left: CGPoint, right: CGPoint) {
  left = left - right
}

// CGPoint skalieren
public func * (point: CGPoint, scalar: CGFloat) -> CGPoint {
  return CGPoint(x: point.x * scalar, y: point.y * scalar)
}
public func *= (inout point: CGPoint, scalar: CGFloat) {
  point = point * scalar
}

Analoge Operatoren können Sie natürlich auch für CGSize, CGRect und CGVector definieren.

CGRect-Struktur um eigene Methoden erweitern

Mit extension können Sie vorhandene Strukturen um eigene Methoden erweitern. Die folgenden drei Methoden liefern den linken unteren und den rechten oberen Eckpunkt sowie den Mittelpunkt eines Rechtecks:

public extension CGRect {
  // Mittelpunkt
  func middlePoint() -> CGPoint {
    return CGPoint(x: CGRectGetMidX(self), y: CGRectGetMidY(self))
  }
  // links unten im iOS-Koordinatensystem
  func minPoint() -> CGPoint {
    return CGPoint(x: CGRectGetMinX(self), y: CGRectGetMinY(self))
  }
  // rechts oben im iOS-Koordinatensystem
  func maxPoint() -> CGPoint {
    return CGPoint(x: CGRectGetMaxX(self), y: CGRectGetMaxY(self))
  }
}

Die folgenden Zeilen erweitern CGPoint um nützliche Methoden:

public extension CGPoint {
  // passt die Koordinaten des Punkts so an, dass dieser sich
  // innerhalb des Rechtecks befindet
  func withinRect(rect: CGRect) -> CGPoint {
    return CGPoint(x: min(CGRectGetMaxX(rect), max(CGRectGetMinX(rect), self.x)),
                   y: min(CGRectGetMaxY(rect), max(CGRectGetMinY(rect), self.y)))
  }

  // Länge
  func length() -> CGFloat {
    return pythagoras(self.x,  self.y)
  }

  // Abstand
  func distanceTo(other: CGPoint) -> CGFloat {
    return pythagoras(self.x-other.x, self.y-other.y)
  }
}

Pythagoras

Auch die gerade verwendete Funktion pythargoras ist selbst definiert. Sie berechnet die Hypotenuse eines rechtwinkligen Dreiecks. Die Funktion erwartet CGFloat-Parameter und liefert natürlich auch ein CGFloat-Ergebnis.

// Pythagoras: a^2 + b^2 = c^2
// c = pythagoras(a, b)
public func pythagoras(a:CGFloat, _ b:CGFloat) -> CGFloat {
  return sqrt(a*a + b*b)
}

Dies und das

Beim Berechnen von Winkeln werden Sie häufig Pi al CGFloat-Zahl brauchen. Die Konstante pi minimiert die Tipparbeit. (Wenn Sie möchten, können Sie auch das Symbol π anstelle von pi verwenden.)

cgrand() liefert eine Zufallszahl zwischen 0 und 1 als CGFloat. Achten Sie darauf, dass Sie in der Initialisierung Ihres Programms (z.B. in viewDidLoad) den Zufallszahlengenerator initialisieren, beispielsweise so: srand48(Int(arc4random_uniform(100000000))). Vergessen Sie darauf, erhalten Sie bei jedem Programmablauf (bei jedem Spiel) immer wieder dieselben Zufallszahlen.

Die generische Funktion minMax stellt sicher, dass ein Zahlenwert innerhalb der Schranken lower und upper bleibt.

// Pi
let pi = CGFloat(M_PI)

// CGFloat-Zufallszahlen
public func cgrand() -> CGFloat {
  return CGFloat(drand48())
}

// ergebnis = minMax(x, lower, upper) 
// stellt sicher, dass lower <= ergebnis <= upper gilt 
public func minMax<T : Comparable>(value: T, minimum: T, maximum: T) -> T {
  return max(min(value, maximum), minimum)
}

Links

Hier ist der komplette Code (es sind nur rund 100 Zeilen): CGOperators.swift.zip

Natürlich bin ich nicht der Erste, der auf die Idee gekommen ist, den Umgang mit CG-Strukturen eleganter zu gestalten. Sie finden im Internet diverse Bibliotheken, die allesamt deutlich umfangreicher sind als der oben präsentierte Code. Besonders empfehlenswert sind Vector- und ScalarArithmetic:

Egal, ob eigener Code oder fertige Bibliotheken aus dem Internet: spätestens mit dem Update auf Swift 3 wird wieder alles durcheinander geraten, sind Updates an eigenem oder fremden CG-Code erforderlich. Schön wäre es, wenn sich Apple die Mühe machen würde, diesen Code selbst zu schreiben und standardmäßig zur Verfügung zu stellen und so nicht alle SpriteKit-Programmierer zu zwingen, sich entweder in Abhängigkeit von fremdem Code zu begeben oder Code wie hier beschrieben selbst zu verfassen, was ja eigentlich auch schade um die Zeit ist.

Xcode-Projekte umbenennen

$
0
0

Immer wieder passiert mir das: Ich probiere etwas Neues aus, geben dem Projekt einen Namen wie hello-spritekit und zwei Wochen später ist eine richtige App daraus geworden. Der ursprüngliche Name ist dann unpassend. Wie kann man also einem Xcode-Projekt einen neuen Namen geben.

Nur den App-Namen ändern

Soviel gleich vorweg: In der Regel ist es gar nicht notwendig, einen neuen Namen einzustellen. Oft reicht es aus, nur den nach außen hin sichtbaren Name korrekt einzustellen. Dazu fügen Sie in die Projektdatei Info.plist den neuen Eintrag Bundle display name ein und geben dort den gewünschten App-Namen an. Fertig!

Den für Anwender sichtbaren App-Namen einstellen
Den für Anwender sichtbaren App-Namen einstellen

Projektnamen ändern

Auch das Ändern des Projektnamens gelingt unkompliziert: Sie klicken in Xcode im Projekt-Navigator einfach den Projektnamen an und geben einen neuen Namen an. Xcode schlägt dann diverse weitere Änderungen vor, die Sie nur bestätigen müssen.

Wenn Sie den Projektnamen ändern, passt Xcode einige weitere Referenzen automatisch an.
Wenn Sie den Projektnamen ändern, passt Xcode einige weitere Referenzen automatisch an.

Sollten Sie gerade so richtig pedantisch aufgelegt sein, dann wird Sie jetzt vermutlich stören, dass es nun einen Widerspruch zwischen dem Projektnamen und dem Verzeichnis gibt, in dem sich die Projektdateien befinden.

Der Verzeichnisname der Projektdateien wurde nicht verändert.
Der Verzeichnisname der Projektdateien wurde nicht verändert.

Sie können auch den Namen dieses Verzeichnisses unkompliziert in Xcode ändern — im Dateisystem bleibt aber der alte Name bestehen. Wollen Sie auch das ändern, bedarf es etwas mehr Hartnäckigkeit: Sie beenden Xcode und benennen das Verzeichnis im Finder um. Wenig überraschend findet Xcode beim nächsten Öffnen des Projekts seine Dateien nicht mehr.

Auf die Veränderungen von Verzeichnissen im Finder reagiert Xcode allergisch.
Auf die Veränderungen von Verzeichnissen im Finder reagiert Xcode allergisch. Das Programm findet die im Verzeichnis enthaltenen Dateien nicht mehr und markiert sie rot.

Dieses Problem lässt sich zum Glück rasch beheben: Zuerst klicken Sie im Projektnavigator das Verzeichnis an, dann im Eigenschaftsfenster das Icons zur Verzeichnisauswahl. Auf diese Weise können den richtigen Verzeichnisort wieder einstellen.

Dieses Icon führt in einen Verzeichnisauswahldialog. Dort korrigieren Sie den Verzeichnisnamen.
Dieses Icon führt in einen Verzeichnisauswahldialog. Dort korrigieren Sie den Verzeichnisnamen.

Damit lassen sich wieder alle Dateien bearbeiten und kompilieren — mit einer Ausnahme: Xcode findet die Info.plist-Datei nicht mehr. Abhilfe schafft der Button Choose Info.plist File in den Projekteinstellungen.

Xcode findet die Info.plist-Datei nicht mehr.
Xcode findet die Info.plist-Datei nicht mehr.

Die letzten Spuren des alten Projektnamens können Sie jetzt in den Code-Dateien tilgen: Jede Datei wird mit ein paar Copyright-Zeilen eingeleitet, die auch den ursprünglichen Projektnamen enthalten.

Quellen

Erste Tests mit Xcode 8 und Swift 3

$
0
0

Mitglieder des Apple Developer Programs können seit gestern die erste Xcode-8-Beta herunterladen. Sie enthält erwartungsgemäß die erste offizielle Prerelease-Version von Swift 3. Aufgrund des Confidentiality-Regeln, die für Teilnehmer am Apple Developer Program gelten, kann ich hier keine Screenshots zeigen und nur über Dinge schreiben, die ohnedies schon öffentlich bekannt sind (z.B., weil Apple auf der WDDC darüber berichtet hat oder entsprechende Dokumente veröffentlicht hat). Aber auch mit diesen Einschränkungen gibt es ein wenig zu berichten.

Code-Konvertierung

Xcode 8 enthält einen bereits ziemlich gut funktionierenden Konverter von Swift 2 zu Swift 3. Es ist mir damit gelungen, innerhalb weniger Stunden mehrerer Projekte mit einem Gesamtumfang von ca. 3000 Zeilen Code von Swift 2.2 auf Swift 3 umzustellen.

Der Konverter ist nicht nur bei den vielen bereits implementierten Swift-Syntaxänderungen hilfreich, sondern passt auch die Namen von Methoden und Parameter diverser Bibliotheken an. Diverse Standardbibliotheken (Foundation, UIKit, SpriteKit) sind nun wesentlich Swift-freundlicher gestaltet, der resultierende Code ist eleganter und vielfach auch deutlich kürzer. Details können Sie in Proposal 0005, Proposal 0006, Proposal 0023 sowie in der Big-three-Zusammenfassung von Erica Sadun nachlesen.

Meine resultierenden Apps laufen unter aktuellen OS-X-, iOS- und tvOS-Versionen stabil. (Auf die Installation der Betas von iOS, macOS und tvOS habe ich vorerst verzichtet.)

Sowohl bei der Swift-3-Integration als auch beim Konverter gibt es natürlich noch diverse Einschränkungen, die detailliert im Swift Migration Guide dokumentiert sind.

Skalierbare Storyboards

Von der Swift-3-Integration abgesehen erscheint mir die wichtigste Neuerung in Xcode darin zu bestehen, dass Storyboards nun beliebig skaliert werden können und dabei voll editierbar bleiben. (In Xcode 7 sind Storyboards nur bei einer Skalierung von 100% bearbeitbar.)

Ebenfalls extrem praktisch: Eine neue Button-Leiste ermöglicht eine sofortige Layout-Vorschau für diverse iOS-Geräte direkt im Storyboard-Editor (siehe den Screenshot bei 9to5mac).

Editor-Erweiterungen

Xcode 8 sieht eine Schnittstelle zur Verankerung externer Editor-Erweiterungen vor (sprich »Plugins« oder »Add-ins«). Wie weit die Möglichkeiten solcher Add-ins gehen werden, muss sich erst zeigen. Vielleicht bieten sie einen Weg für Drittanbieter, Refactoring-Werkzeuge für Swift zu implementieren. Apple war in dieser Hinsicht bisher ja recht nachlässig: Es ist ein wenig inkonsequent, Swift als Sprache der Zukunft anzupreisen, die Refactoring-Tools nur für Objective C anzubieten …

Fazit

Aus aktueller Sicht lassen sich nach einem Tag mit der Xcode-8-Beta zwei Schlussfolgerungen ziehen:

  • Xcode 8 und Swift 3 sind bereits stabil genug, um damit zu arbeiten. (Das soll nicht heißen, dass alles frei von Fehler funktioniert.)
  • Trotz der riesigen Unterschiede zwischen Swift 2 und 3 hält sich der Portierungsaufwand in Grenzen — dem Code-Konverter sei dank! Sie machen also auch nichts verkehrt, wenn Sie noch zwei Monate mit Swift 2.2 arbeiten und dann auf eine sicherlich schon stabilere Xcode-Beta umsteigen.

Quellen

Swift für Kinder, Teil I

$
0
0

Meine beiden Kinder, aktuell 9 und 11 Jahre alt, sind wie die meisten ihrer Altersgenossen vernarrt in Smartphone-Spiele. Sie haben gesehen, dass ihr Vater Spiele programmiert, und wollen das nun auch können. Nicht irgendwelche Spiele, die auf einem Computer laufen, nein — es müssen Smartphone-Apps sein.

(Als ich vor mehr als 30 Jahren zu programmieren begann, habe ich eine Art PacMan im Textmodus programmiert. In der Programmiersprache Basic auf einem Oric-1, einem Computer mit Ähnlichkeiten zum bekannteren Commodore 64. Da war die Welt noch einfacher, nicht nur, was das Programmieren betrifft …)

Also habe ich mich dazu entschlossen, meinen Kindern, so spielerisch wie möglich, ein bisschen das Programmieren beizubringen. Diese Versuche werde ich hier in diesem Blog dokumentieren.

Intro (die können Sie überspringen …)

Allen, die schon einmal Apps programmiert haben, ist klar: Zwischen der Erwartungshaltung meiner Kinder (»Ist ja ganz einfach!«) und der Wirklichkeit klaffen Welten, ja Galaxien!

  • Die Probleme beginnen damit, dass meine beiden Söhne mit der Tastatur kaum vertraut sind. Näherungsweise dauert die Eingabe einer Code-Zeile mit den vielen Sonderzeichen eine Minute.
  • Die nächste Hürde ist die englische Sprache. Egal, welche Programmiersprache — alle Schlüsselwörter sind englisch. Die Englisch-Kenntnisse meiner Kinder sind aber noch sehr bescheiden.
  • Kommen wir zum Programmieren an sich: Wo anfangen? Das Vorwissen ist 0, und 0 heisst in diesem Fall wirklich 0. Mein älterer Sohn hat in der Schule immerhin schon einfache Gleichungen gesehen (2 x + 12 = 30) und hat insofern vielleicht den Ansatz einer Idee, was eine Variable sein könnte. In Basic konnte man damit loslegen, aber in Java oder C# oder Swift kann man ja keine Zeile schreiben, ohne sich die Konzepte objektorientierter Programmierung zu verinnerlichen.
  • Schließlich kann man heutzutage ohne Entwicklungsumgebung fast nicht mehr arbeiten. Eclipse, Visual Studio, Xcode — für Kinder als Zielpublikum ist das die Wahl zwischen Pest und Cholera. (Meine Python-, bash- und PHP-Scripts, mitunter auch Java-Code, schreibe ich bis heute am liebsten im Emacs. Aber auch dieses Ungetüm ist hier wohl kaum perfekte Wahl …)

Die naheliegende Lösung wäre, eben gerade nicht den klassischen Weg zu beschreiten, sondern mit Logo zu beginnen, oder eventuell mit Python. Diese Sprachen wären in ihren Grundelementen Kids-tauglich, nur können wir dann eben keine Apps programmieren. Scheidet daher vollkommen aus, sorry.

Plan B wäre eine Entwicklungsumgebung speziell zur Spiel-Programmierung, idealerweise für den Unterricht optimiert. Bekannt aus der Raspberry-Pi-Ecke war mir Scratch; der aus meiner Sicht übertrieben kindliche Ansatz hat mich aber gar nicht überzeugt.

Dann bin ich auf GameMaker gestoßen: Das ist eine relativ professionelle IDE zur Spieleentwicklung. Die Basisversion ist kostenlos verfügbar, die Handhabung ist überschaubar. Ich habe mir zwei, drei Stunden lang Videos angesehen: Die Mischung aus interaktivem Zusammenklicken von Funktionen kombiniert da und dort mit wenigen Zeilen sehr einfachem Code — das macht eigentlich einen perfekten Eindruck!

Letztlich haben mich aber zwei Dinge von GameMaker abgehalten:

  • Zum einen ist die IDE an sich zwar kostenlos verfügbar, für die Entwicklung von Apps ist aber das kostenpflichtige »Studio Professional« plus zumindest ein »Export Module« (sprich Plugin) erforderlich.
  • Zum anderen kann man nur unterrichten, was man selbst beherrscht. Ich hätte mir die Mühe machen müssen, GameMaker ein, zwei Wochen lang zu erlernen. Sicher interessant, aber ich habe diese ein, zwei Wochen einfach nicht.

Und so kam es, wie es kommen musste: Meine Unterrichtsbasis besteht aus Xcode 8 mit Swift 3 (erste Beta) in Kombination mit SpriteKit! Ich arbeite momentan intensiv an der Neuauflage meines Swift-Buchs, die hoffentlich noch heuer erscheinen wird. Was liegt also näher, Swift 3 und Xcode 8 zu verwenden?

Es ist nicht notwendig, dass Sie Ihre naheliegenden Einwände hier als Kommentar posten, ich weiß selbst, dass es Wahnsinn ist. Wie auch immer: Wir legen los!

Wie starten?

Die Grundidee für mein Unterrichts-Experiment sieht so aus: Ich gebe ein bereits funktionsfähiges Projekt vor. Gemeinsam mit meinen Kindern führe ich dann kleine Änderungen durch und erkläre dabei einzelne Details. Ein ganzheitlicher Ansatz also, Verzicht auf ein solides Fundament, stattdessen »Learning by Doing«.

Der Ausgangspunkt für die ersten gemeinsamen Übungen ist ein minimales SpriteKit-Programm, das das aus Apples SpriteKit-Templates bekannte Raumschiff im Weltall platziert.

Der Ausgangspunkt: Ein Raumschiff, unbeweglich im Weltall
Der Ausgangspunkt: Ein Raumschiff, unbeweglich im Weltall

Mit meinen Kindern habe ich nun ausschließlich die didMove-Methode bearbeitet, die anfänglich so aussah:

override func didMove(to view: SKView) {
  // nicht ändern
  setup(view)

  // hier geht's los
  let spaceship = SKSpriteNode(imageNamed: "Spaceship")
  spaceship.position = CGPoint(x:1000, y: 700)
  spaceship.zRotation = winkel(0)
  spaceship.zPosition = 1
  self.addChild(spaceship)
}

Diese Menge Code ist auch für Kinder verdaulich:

  • setup kümmert sich um das Weltall, die Details interessieren uns nicht.
  • let spaceship = SKSpriteNode(imageNamed: "Spaceship") erzeugt ein Raumschiff(-Objekt) und speichert es in einer Variablen.
  • Die nächsten drei Anweisungen verändern Eigenschaften des Raumschiffs.
  • Die letzte Zeile macht das Raumschiff sichtbar, fügt es zum Weltall hinzu.

Erste Einheit

Und jetzt die Aufgaben für die ersten Stunde:

  • Versucht, das Raumschiff in einer Ecke zu platzieren!
  • Versucht, das Raumschiff zu drehen!
  • Versucht, ein zweites Raumschiff zu erzeugen!

Für die erste Fragestellung habe ich das Koordinatensystem erläutern müssen, siehe die folgende Skizze. Außerdem habe ich dazu gesagt, dass Bilder (Sprites) immer über ihren Mittelpunkt positioniert werden.

Koordinatensystem für das Beispielprogramm
Koordinatensystem für das Beispielprogramm

Das Platzieren der Raumschiffs, zuerst links unten, dann rechts oben, gelang nach der Methode »Versuch und Irrtum« recht schnell.

Die zweite Fragestellung konnten meine Kinder ohne Hilfe bewältigen, Winkel in Grad sind ihnen vertraut.

Bei der dritten Fragestellung habe ich mitgeholfen: Code kopieren und einfügen, im neuen Code Variablennamen von spaceship auf spaceship2 ändern, und ein bisschen über den Sinn von Variablen erklären.

Meinem älteren Sohn gelang es dann selbstständig, ein drittes Raumschiff auf den Bildschirm zu zaubern. Bravo!

Natürlich musste ich beiden immer wieder helfen, nach Tippfehlern die unverständlichen Xcode-Fehler zu beseitigen.

Zweite Einheit

Ausgangspunkt war das Programm vom Vorabend, mit zwei Raumschiffen. Ich habe die folgenden neuen Eigenschaften erläutert und dazu ein paar Zeilen Code eingetippt.

  • color: Farbe einstellen
  • colorBlendFactor: wie weit ist die Farbe aktiv
  • xScale: Breite verändern
  • yScale: Höhe verändern

Meine Kinder haben dann eine halbe Stunde damit verbracht, das Aussehen der Raumschiffe zu verändern. Ergebnis:

Bunte, verdrehte Raumschiffe
Bunte, verdrehte Raumschiffe

Ich glaube, dass sie die Idee von Objekten und Eigenschaften schon ein wenig verstehen (ohne, dass ich viel dazu sagen musste).

Auch wenn es anfänglich cool ist, Code zu ändern und dann ein optischen Feedback am Bildschirm zu sehen, auf die Dauer reicht das nicht. Es muss sich etwas bewegen. An dieser Stelle habe ich den Code ein wenig umgebaut, anfänglich so:

class GameScene: SKScene {
  ...
  let spaceship = SKSpriteNode(imageNamed: "Spaceship")
  var meinWinkel = 0

  override func didMove(to view: SKView) {
    // nicht ändern
    setup(view)

    // wie bisher: spaceship-Eigenschaften einstellen
    // ...
  }

  // neu: bei jedem Frame Winkel ändern
  override func update(_ currentTime: TimeInterval) {
    meinWinkel = meinWinkel + 5
    spaceship.zRotation = winkel(meinWinkel)
  }

  ...
}

Wird das Programm jetzt ausgeführt, dreht sich das Raumschiff! Den Unterschied zwischen didMove und update habe ich so erklärt: didMove wird nur einmal beim Start ausgeführt. update wird immer wieder ausgeführt, wenn ich hier etwas ändere, ändert sich das Raumschiff im laufenden Programm.

An dieser Stelle sind erstmals Verständnisproblem aufgetaucht. Warum muss die spaceship-Variable jetzt außerhalb von didMove platziert werden? (Hätte ich wahrscheinlich von vorne herein machen sollen.) Was soll das mit let und var?

Meine nächste Aufgabe war: Versucht, das Raumschiff nicht nur zu drehen, sondern auch zu verschieben!

Bei der Lösung habe ich kräftig mithelfen müssen, aber als der Code einmal dastand, haben die Kinder schon wieder begonnen, eigene Änderungen einzubauen (z.B. das Raumschiff nicht diagonal zu verschieben, das Raumschiff so zu drehen, dass es in Bewegungsrichtung zeigt etc.).

var meinX = 0
var meinY = 0

...

override func update(_ currentTime: TimeInterval) {
  meinWinkel = meinWinkel + 5
  spaceship.zRotation = winkel(meinWinkel)

  meinX = meinX + 10
  meinY = meinY + 10
  spaceship.position = CGPoint(x: meinX, y: meinY)
}

Hintergründe

setup richtet nicht nur den Weltall-Hintergrund ein, sondern auch die Größe des SKView-Objekts. Dessen Breite wird unveränderlich mit 2000 festgelegt. Die Höhe ergibt sich je nach iOS-Gerät. Auf einem iPad-Simulator ergibt sich 1500, auf iPhones etwas weniger.

winkel rechnet von Grad in Bogenmaß um. (Sonst muss ich erklären, was Pi ist, und warum Pi/2 soviel wie 90 Grad ist.)

Wie ist es gelaufen?

Wir haben nun zwei Abende jeweils eine Stunde herumgespielt. Bis jetzt ist die Begeisterung meiner Kinder groß, außerdem haben sie das Gefühl, dass sie schon programmieren können. Stimmt ja auch!

PS: Warum keine Playgrounds?

Zusammen mit Swift hat Apple die Idee von Playgrounds realisiert. Das sind spezielle Xcode-Projekte, die ein interaktives Ausprobieren von kleinen Code-Schnipseln ermöglichen — eigentlich perfekt für meine Zwecke!

So gut das Konzept von Playgrounds ist — die aktuelle Implementierung ist aus meiner Sicht unbrauchbar. Ich habe ein wenig experimentiert, um zumindest einfache SpriteKit-Spielereien damit zu realisieren, aber ich bin gescheitert — sowohl unter Xcode 7.3 als auch unter Xcode 8. Auch die neue Playground-App für iPads hat mich nicht vom Gegenteil überzeugen können.

Ich sehe das riesige Potential der Playgrounds für Unterricht und Lehre, Apple arbeitet ganz offensichtlich in diese Richtung, aber der aktuelle Zustand ist selbst für meine Begriffe ein bisschen zu »beta«.

Wenn Sie Playgrounds doch eine Chance geben wollen, verweise ich Sie auf die ultimative Playground-Expertin Erica Sadun: Auf ihrem Blog finden Sie eine Menge Playground-Beiträge (auch zur neuen Playground-App), im iTunes Bookstore gibt es das von ihr verfasste eBook Playground Secrets and Power Tips. Empfehlenswert!

Download

Die ZIP-Datei enthält die Raumschiff-App in vier verschiedenen Stadien. Achtung, getestet nur unter Xcode 8 Beta 1.

ZIP-Datei

Kostet Ubuntu in der Cloud etwas?

$
0
0

Ubuntu ist frei (Open Source) und samt Updates gratis, das stellt Canonical auf seinen Webseiten mehrfach klar. Nun hat golem.de heute die Story des Hosting-Unternehmens OVH präsentiert. OVH wurde offensichtlich von Canonical aufgefordert, Lizenzgebühren in der Höhe von 1 bis 2 Euro pro Ubuntu-Instanz zu zahlen.

Was steckt dahinter?

Stein des Anstoßes ist offensichtlich die Intellectual property rights policy. Auch sie beginnt mit der Feststellung, dass Ubuntu kostenlos verwendet werden darf. Ich zitiere aus Punkt 1, Summary:

You can download, install and receive updates to Ubuntu for free.
You can modify Ubuntu for personal or internal commercial use.
You can redistribute Ubuntu, but only where there has been no modification to it.
etc.

Aber: Viele Cloud-Anbieter verwenden offensichtlich für das jeweilige Cloud-System optimierte Ubuntu-Vesionen. (Modifiziert wird primär der Kernel, aber sei’s drum: Ubuntu in seiner Gesamtheit ist damit verändert.) Und für diesen Fall sieht die Intellectual property rights policy vor (wieder wörtlich zitiert aus Punkt 3, Your use of Ubuntu):

Any redistribution of modified versions of Ubuntu must be approved, certified or provided by Canonical if you are going to associate it with the Trademarks. Otherwise you must remove and replace the Trademarks and will need to recompile the source code to create your own binaries.

Kurzum: Canonical erwartet von Hosting-Unternehmen, die Ubuntu verändert an Ihre Kunden weitergeben, dass die Veränderungen von Ubuntu abgesegnet werden. Und für diese Dienstleistung will Canonical Geld sehen.

Wie konkret das von OVH angebotene Ubuntu aussieht, entzieht sich meines Wissens. Insofern kann ich zum konkreten Fall nichts sagen.

Die Frage ist eher ganz prinzipiell: Verhält sich Canonical hier korrekt? Oder missbraucht es Open-Source-Freiheiten?

Auch darauf ist eine Antwort nicht ganz einfach: Laut golem.de argumentiert Canonical, dass durch Hoster/Cloud-Anbieter durchgeführte Änderungen von Ubuntu in der Vergangenheit zu Sicherheitsproblemen geführt haben. Da ist es verständlich, dass Ubuntu nicht möchte, dass das resultierende System noch »Ubuntu« genannt wird. (Manchen wird diese Logik bekannt vorkommen: Auch Mozilla hat sich lange Zeit dagegen gewehrt, dass Distributionen Firefox nach ihren Vorstellungen anpassen. Das führte dazu, dass Firefox in Debian nicht Firefox heißt, sondern »Iceweasel«. Dieser Streit ist aber mittlerweile beigelegt, in aktuellen bzw. zukünftigen Debian-Versionen darf Firefox wieder »Firefox« heißen.)

Der andere Aspekt ist natürlich, dass Canonical mit Ubuntu gerne Geld verdienen möchte — und sich hier eine Möglichkeit bietet. Auch das ist nicht verboten — Red Hat machte mit seinem Linux-Geschäft 2015 mehr als 1,5 Mrd. US $ Umsatz und etliche Millionen Gewinn.

Bei allem Verständnis für Canonical bleibt bei dieser Geschichte aber ein bitterer Nachgeschmack. Vielleicht lässt dieser in den nächsten Tagen nach, wenn mehr Details bekannt werden.

Viewing all 274 articles
Browse latest View live