Pop!_OS

Die Linux-Distribution Pop!_OS ist von Ubuntu abgeleitet und wird von der amerikanischen Firma system76 entwickelt. Diese Firma verkauft Notebooks, auf denen standardmäßig Pop!_OS installiert ist. Im Vergleich zu anderen Distributionen ist Pop!_OS besonders gut für Notebooks mit NVIDIA-Grafik optimiert.

Ursprünglich dachte ich, Pop!_OS sei nur ein weiterer Ubuntu-Klon mit modifiziertem Gnome-Desktop und integrierten NVIDIA-Treibern. Seit ich die Distribution auf mein neues Lenovo-P1-Notebook installiert habe, weiß ich, dass Pop!_OS weit mehr Eigenheiten hat.

Nach dem Gusto des Autors modifizierter Gnome-Desktop von Pop!_OS

Pop!_OS weiterlesen

Auf der Suche nach einem Linux-Notebook

Mein aktuelles Notebook ist ein Lenovo E320 (2012, i3-CPU, notebookcheck). Erstaunlicherweise funktioniert das Gerät noch immer passabel, aber naturgemäß geht es dem Ende seiner Tage entgegen. In den letzten Tagen habe ich mich näher dem Notebook-Markt auseinandergesetzt. Das Ziel ist ein leistungsstarkes Notebook, das nicht nur unterwegs eingesetzt werden soll, sondern täglich als Desktop-Ersatz. Bei meiner Suche bin direkt in die NVIDIA-Falle gestolpert …

PS: Dieser Blog-Beitrag hat zugegebenermaßen den Charakter eines persönlichen Notizzettels. Klar ist auch, dass die folgende Übersicht nur eine Momentaufnahme (Februar 2019) sein kann; ich habe nicht vor, den Text in Zukunft zu aktualisieren. Aber vielleicht helfen die gesammelten Informationen und die vielen Links anderen Leuten, die gerade auf der Suche nach einem Traum-Linux-Notebook sind :-)

Update 10.3.2019: Ich habe mich für ein Lenovo P1 entschieden. Gründe: Tastatur, Verarbeitungsqualität, zwei NVMe-Slots. Hier ist ein Erfahrungsbericht.

Update 2.5.2019: Dell bietet ab sofort das Notebook Precision 3540 mit AMD-Grafik und Ubuntu an. Ein interessantes Angebot.

Auf der Suche nach einem Linux-Notebook weiterlesen

Neu in Swift 5

Am 26. März wurde Swift 5 fertiggestellt. Dieser Beitrag fasst die wichtigsten Neuerungen zusammen. Swift 5 gilt insofern als »Meilenstein«, als Apple erstmalig die binäre Kompatibilität der Schnittstellen garantiert. Die größte Auswirkung in der Praxis besteht darin, dass Standardbibliotheken nun auf Apple-Geräten installiert werden und nicht mehr mit jeder App mitgeliefert werden müssen. Xcode erzeugt daher kleinere Binärdateien.

Update 30.3.2019: Swift 5 ist offiziell im Docker-Hub angekommen.

Neu in Swift 5 weiterlesen

Unter Ubuntu alte Snap-Pakete löschen

Über den exorbitaten Speicherbedarf von Ubuntus Paketverwaltungsprogramm Snap habe ich ja schon öfters gelästert. Aber erst jetzt ist mir eine weitere unangenehme Eigenheit aufgefallen: Snap speichert standardmäßig von jedem installierten Paket zwei Backups älterer Versionen. Nach Updates bleiben also ältere Versionen erhalten. Das verdreifacht den von Snap beanspruchten Speicherplatz!

Unter Ubuntu alte Snap-Pakete löschen weiterlesen

NULL-Test mit PyMySQL

Die SQL-Syntax unterscheidet syntaktisch bei Vergleichen mit realen Werten und NULL:

SELECT * FROM tabelle WHERE spalte=0
SELECT * FROM tabelle WHERE spalte IS NULL

Wenn Sie in einem Python-Script mit PyMySQL auf eine MySQL- oder MariaDB-Datenbank zugreifen und dabei Datensätzen selektieren möchten, deren Inhalt je nach Parameter auch NULL sein darf, führt das zu Problemen:

import pymysql.cursors
conn = pymysql.connect(...)
with conn.cursor() as cur:
    sql = 'SELECT * FROM tabelle WHERE spalte = %s'
    cur.execute(sql, (0))      # OK
    cur.execute(sql, (None))   # liefert einen SQL-Syntaxfehler
    ...

Lösung

Die naheliegende Lösung besteht darin, das SQL-Statement eben in Abhängigkeit vom betreffenden Parameter zu variieren, also:

if value == None:
    sql = 'SELECT * FROM tabelle WHERE spalte IS %s'
else:    
    sql = 'SELECT * FROM tabelle WHERE spalte = %s'

In einem Projekt musste ich zuletzt aber eine Menge derartiger SELECT-Abfragen zusammenstellen, bei denen es jeweils viele Parameter gab, die alle NULL sein konnten. Der obige Ansatz wird dann unübersichtlich. Ich habe mir deswegen eine kleine Funktion programmiert, an die ich ein Dictionary mit Spaltennamen und Werten übergeben kann. Die Funktion erzeugt daraus eine Zeichenkette mit dem WHERE-Teil des SQL-Statements.

dict = { 'spalte1': 123, 'spalte2': 'abc', 'spalte3': None }
sql = 'SELECT FROM tabelle ' + buildWhere(conn, dict)

# erzeugt eine Zeichenkette der Form
# WHERE col1 = 'val1' AND col2 = 'val2' etc.
# mit   col1 IS NULL für Werte, die None sind
def buildWhere(conn, dict):
    result = "WHERE "
    for colname, value in dict.items():
        if value == None:
            result += colname + ' IS NULL AND '
        else:
            result += colname + ' = ' + conn.escape(value) + ' AND '

    return result[:-4]  # letztes 'AND ' eliminieren

Die Methode escape stellt sicher, dass das auch dann funktioniert, wenn die Werte im Dictionary Anführungszeichen oder andere problematische Zeichen enthalten.

Ergänzung 21.12.2018

Wenn die zu vergleichenden Daten (betrifft nur Zeichenketten) das Zeichen % enthalten, glaubt PyMySQL bei der Verarbeitung des SQL-Kommandos, an dieser Stelle seien Parameter einzusetzen. Abhilfe: Ersetzen Sie das Prozentzeichen durch zwei derartige Zeichen, also:

def buildWhere(conn, dict):
    ...
    result = result.replace('%', '%%')
    return result[:-4]  # letztes 'AND ' eliminieren

Quellen: https://stackoverflow.com/questions/3037581, http://mysql-python.sourceforge.net/MySQLdb.html#functions-and-attributes

»Linux Kommandoreferenz« erschienen (4. Aufl.)

Diese Woche ist die vierte Auflage der Linux-Kommandoreferenz erschienen:

linux-kommandoreferenz2

528 Seiten, Hard-Cover (4. Auflage)
Preis: Euro 19,90 (in D inkl. MWSt.)

Dieses Buch enthält den Linux-Grundwortschatz für das Arbeiten im Terminal – über 500 Kommandos samt Optionen, Erläuterungen und Beispielen. Außerdem umfasst das Buch eine Referenz der wichtigsten Konfigurationsdateien sowie eine Zusammenstellung wichtiger Tastenkürzel.

Für die Neuauflage wurde das Buch vollständig aktualisiert. Außerdem wurden einige weitere Kommandos und Konfigurationsdateien hinzugefügt, unter anderem:

ack/ag, apk, apt, arp-scan, bluetoothctl, cadaver, canonical-livepatch, status, certbot, chkrootkit, chpasswd, column, dconf, dig, docker, docker-compose, egrep, exiftool, fail2ban-client, flatpak, glances, gpasswd, history, hwclock, hydra, kexec, ll, lsb_release, loginctl, mysqlbinlog, nc, ncdu, needs-restarting, netplan, ngrep, nproc, parallel, pdfimages, pip, pkcon, postconf, postqueue, rkhunter, screen, snap, tcpdump, ubuntu-support-status, uptime, vipw, vigr, visudo, whois, wpa_passphrase, xinput

Java 11, JavaFX, IntelliJ IDEA und Linux

Die Überschrift sagt schon alles: In diesem Beitrag geht es darum, Programme mit Java 11 und JavaFX in der IntelliJ IDEA unter Linux zu entwickeln. Als Testumgebung dienten Ubuntu 18.10 und Fedora 29. (Unter Ubuntu 18.04 stehen noch immer keine offiziellen Java-11-Pakete zur Verfügung.)

Die IntelliJ IDEA mit einem Java-11-Projekt samt JavaFX unter Ubuntu 18.10

Java 11, JavaFX, IntelliJ IDEA und Linux weiterlesen

Fedora 29

Fedora 29 bietet im Vergleich zur Vorgängerversion die üblichen Software-Updates, aber nur wenige tiefgreifende Neuerungen:

  • Der Bootprozess sollte nun auf manchen Rechnern vollkommen ohne Bildschirmflackern verlaufen. Das setzt aktuell allerdings voraus, dass UEFI sowie ein Intel-Grafiksystem genutzt wird, siehe auch Announcing flickerfree boot for Fedora 29.

  • Das in Version 28 für Fedora Server eingeführte Modularity-Prinzip steht nun standardmäßig auch in der Desktop-Variante zur Verfügung. (Wie ich in meinem Blog-Beitrag zu Fedora 28 berichtet habe, konnten modularisierte Pakete mit dnf install fedora-repos-modular auch schon in der Desktop-Version 28 genutzt werden. Dass dieses Paket nun standardmäßig installiert ist, ändert nichts daran, dass das Angebot an modularisierten Paketen weiterhin sehr klein ist. Der praktische Nutzen dieses Konzepts ist für Fedora ohnedies gering, weil die Distribution eine kurze Lebensdauer hat. Wirklich spannend werden modularisierte Pakete wohl erst in RHEL 8 bzw. CentOS 8.)

Fedora 29 weiterlesen

»Python Grundkurs« erschienen

Selten ist mir ein Buch derart gut von der Hand gegangen wie der soeben erschienene Python Grundkurs:

Die Idee für das Buch hatte ich eigentlich schon vor drei Jahren. Dass das Buch gerade jetzt zustande kam, haben Sie — zugegebenermaßen etwas überraschend — Apple zu verdanken: Eigentlich wollte ich über den Sommer an der Neuauflage meines Swift-Buchs arbeiten. Aber dann hat Apple verkündet, dass Swift 5 erst 2019 fertig würde. Die so entstandene Lücke in meinem Kalender habe ich mit vielen Radtouren gefüllt. Außerdem habe ich auf 460 kompakten Seiten die Grundelemente der Programmiersprache Python zusammengefasst.

Ein Loblied auf Python

Python ist eine ungemein elegante Programmiersprache. Mit Python verfasster Code ist in der Regel kompakter und leichter zu lesen als bei vielen anderen Sprachen. Weil zudem der Overhead einer kompilierten Sprache entfällt, kommt Python Einsteigern besonders entgegen. (Persönlich bin ich der Meinung, das Python als First Programming Language viel besser geeignet wäre als Java oder C#. Diese beide Sprachen dominieren zumindest im deutschen Sprachraum den Unterricht in den ersten Semestern.)

Die Einfachheit von Python schränkt aber keinesfalls seine Anwendung ein:

  • Dass Python universell für alle erdenklichen Aufgaben geeignet ist, liegt an seinem Modulkonzept: Im Internet finden Sie Tausende kostenlose Erweiterungen. Die Installation solcher Module und ihre Integration in eigenen Code sind ausgesprochen einfach.

  • Python ist auch im (natur)wissenschaftlichen Sektor sehr beliebt — aktuell ganz besonders im Bereich der künstlichen Intelligenz. Mit keiner anderen Sprache kommen Sie mit derart wenig Code ans Ziel. Python ist ideal zum Experimentieren geeignet, wenn konkrete Ergebnisse und nicht der perfekte Code im Vordergrund stehen.

  • Zur Popularität von Python hat natürlich auch der Raspberry Pi beigetragen. Trotz vieler Alternativen ist Python die bevorzugte Programmiersprache der Maker-Gemeinde.

Lassen Sie sich von meiner Begeisterung für Python anstecken! Wenn Sie Python kennenlernen möchten, bietet mein Grundkurs mit vielen Übungsaufgaben (natürlich samt Lösungen) einen idealen Startpunkt.