Unterschied zwischen der Zeichencodierung utf8_general_ci und utf8_unicode_ci

Diese beiden Sortierreihenfolgen sind beide für die UTF-8 Zeichenkodierung. Die Unterschiede bestehen darin, wie Text sortiert und verglichen wird.

Hinweis: Seit MySQL 5.5.3 sollten Sie utf8mb4 anstelle von utf8 verwenden. Beide beziehen sich auf die UTF-8-Kodierung, aber das ältere utf8 hatte eine MySQL-spezifische Beschränkung, die die Verwendung von Zeichen oberhalb 0xFFFD verhinderte.

Genauigkeit

utf8mb4_unicode_ci basiert auf dem Unicode-Standard für Sortierung und Vergleich, der eine genaue Sortierung in sehr vielen Sprachen ermöglicht.

utf8mb4_general_ci kann nicht alle Unicode Sortierregeln implementieren, was in manchen Situationen zu unerwünschter Sortierung führt, z. B. bei der Verwendung bestimmter Sprachen oder Zeichen.

Leistung

utf8mb4_general_ci ist beim Vergleichen und Sortieren schneller, weil es eine Menge performance-bezogener Shortcuts benötigt.

Auf modernen Servern wird dieser Leistungsschub kaum spürbar sein. Es wurde in einer Zeit entwickelt, in der die Server einen winzigen Bruchteil der CPU-Leistung heutiger Computer hatten.

utf8mb4_unicode_ci, das die Unicode-Regeln für Sortierung und Vergleich verwendet, verwendet einen ziemlich komplexen Algorithmus für die korrekte Sortierung in vielen Sprachen und bei der Verwendung einer Vielzahl von Sonderzeichen. Diese Regeln müssen sprachspezifische Konventionen berücksichtigen; nicht jeder sortiert seine Zeichen in einer so genannten alphabetischen Reihenfolge.

Was die lateinischen (d. h.“europäischen“) Sprachen betrifft, gibt es keinen großen Unterschied zwischen der Unicode-Sortierung und der vereinfachten utf8mb4_general_ci-Sortierung in MySQL, aber es gibt immer noch einige Unterschiede:

Beispielsweise sortiert die Unicode-Collation „ß“ wie „ss“und „Œ“ wie „OE“, wohingegen utf8mb4_general_ci sie als einzelne Zeichen sortiert.

Einige Unicode-Zeichen sind als ignorierbar definiert, d. h. sie sollten nicht für die Sortierreihenfolge gezählt werden und der Vergleich sollte stattdessen auf das nächste Zeichen verschoben werden. utf8mb4_unicode_ci behandelt diese richtig.

In nicht-lateinischen Sprachen, wie z. B. asiatischen Sprachen oder Sprachen mit unterschiedlichen Alphabeten, kann es noch viel mehr Unterschiede zwischen der Unicode-Sortierung und der vereinfachten Sortierung utf8mb4_general_ci geben. Die Eignung von utf8mb4_general_ci hängt stark von der verwendeten Sprache ab. Für manche Sprachen wird es völlig unzureichend sein.

Welche Zeichencodierung sollte verwendet werden?

Es gibt fast sicher keinen Grund mehr, utf8mb4_general_ci zu verwenden, da wir den Punkt hinter uns gelassen haben, wo die CPU-Geschwindigkeit niedrig genug ist, dass der Performanceunterschied wichtig wäre. Die Datenbank wird mit Sicherheit durch andere Engpässe eingeschränkt.

Der Unterschied in der Leistung wird nur in ganz speziellen Situationen messbar sein. Wenn eine langsame Sortierung vorliegt, wird in fast allen Fällen ein Problem mit den Indizes/Abfrageplänen vorliegen. Die Änderung der Sortierfunktion sollte nicht ganz oben auf der Liste der Dinge stehen.

In der Vergangenheit empfahlen einige Leute, utf8mb4_general_ci zu verwenden, außer wenn eine genaue Sortierung wichtig genug war, um die Leistungskosten zu rechtfertigen. Heute sind diese Leistungskosten praktisch verschwunden, und die Entwickler gehen mit der Internationalisierung ernsthafter um. Unter diesen Aspekten ist utf8mb4_unicode_ci die bessere Wahl.

Standardschriftart in LibreOffice Calc einstellen

Standardmäßig ist in LibreOffice Calc die Schriftart auf Liberation Sans eingestellt. Die folgende Anleitung zeigt, wie die Schriftart beim Erstellen eines neuen Tabellendokuments in LibreOffice dauerhaft festgelegt werden kann. Dies erfolgt über die Dokumentenvorlagen.

Öffnen sie zunächst ein neues Tabellendokument und klicken oben links neben der Spalte A und Zeile 1 auf die freie Fläche, um alle Tabellenzellen zu markieren. Geben sie nun für alle Zellen die gewünschte Schriftart und ggf. Schriftgröße an, welche bei jedem neuen Dokument genutzt werden soll.

Um die Einstellungen zu übernehmen, klicken sie im Hauptmenü auf Datei -> Dokumentvorlage -> Als Vorlage speichern oder drücken die Tastenkombination Umschalt + F11. Im Fenster Vorlagenverwaltung klicken sie auf die Auswahl Meine Vorlagen und im Anschluss auf Speichern. Geben sie für die Vorlage einen beliebigen Namen ein und bestätigen mit OK.

Gehen sie nun erneut über das Hauptmenü auf Datei -> Dokumentvorlage -> Verwalten oder über die Tastenkombination STRG + Umschalt + N. Oberhalb des Fensters den Reiter Tabellen anklicken und auf den Eintrag Meine Vorlagen doppelklicken. Die zuvor erstellte Tabellenvorlage erscheint jetzt in der Liste. Klicken sie einmal auf den Eintrag, sodass oberhalb ein Optionsmenü mit weiteren Schaltflächen erscheint. Klicken sie auf Als Standard setzen und schließen das Fenster.

Beim nächsten Öffnen eines neuen Tabellendokuments in LibreOffice werden die Einstellungen aus der Dokumentenvorlage übernommen.

Über die Vorlagenverwaltung lässt sich auch die Standard-Dokumentenvorlage zurücksetzen, indem sie auf das Zahnradsymbol oben rechts klicken und danach für das ausgewählte Dokument die Standardvorlage zurücksetzen.

LibreOffice Dokumentenvorlage

Standard Schriftart in LibreOffice Calc ganz leicht über Dokumentenvorlagen einstellen können.

Raspberry Pi Temperatur, CPU Takt und Spannung auslesen

Gerade bei einem dauerhaften Einsatz des Raspberry Pi ist es unter anderem wichtig zu wissen, wie hoch die Betriebstemperatur des kleinen Pi´s ist. Insbesondere bei dem aktuellen warmen Wetter sollte bei dem Raspberry Pi auf eine ausreichende Kühlung geachtet werden. Über das Terminal lassen sich diese Werte ganz leicht abfragen.

Um die aktuelle Temperatur zu erfahren, wird die folgende Zeile im Terminal ausgeführt:

vcgencmd measure_temp

Dies sorgt für die nachfolgende Ausgabe:

temp=56.2'C

Mit vcgencmd lassen sich auch noch weitere Angaben wie z.b. den CPU-Takt und die Spannung auslesen.

Um den CPU-Takt auszulesen, muss nur die folgende Zeile in das Terminal eingefügt werden. Die Ausgabe zeigt die Taktung in Hertz:

vcgencmd measure_clock arm

Die Kernspannung in Volt wird über den unten stehenden Terminaleintrag ausgegeben:

vcgencmd measure_volts

 

Mehrere Dateien in FTP-Verzeichnis auslesen und in PHP-Variable schreiben

Im Folgenden zeige ich euch, wie man mehrere Textdateien gleichzeitig aus einem Ordner auf einem FTP-Server durch PHP ausliest und in eine Variable speichert. Dabei sollen nur Textdateien berücksichtigt werden. Zusätzlich dürfen ebenfalls nur Dateien ausgelesen werden, welche ein bestimmtes Änderungsdatum aufweist. Eine praktische Anwendung kann unter anderem das Zusammenführen mehrerer einzelner Logfiles sein.

Als erstes bauen wir eine Verbindung zum FTP-Server auf:

$data       = "";

$ftp_server = "ftpserverxyz.de";
$ftp_user   = "anonymous";
$ftp_pass   = "anonymous";

//Mit FTP verbinden
$conn_id = ftp_connect($ftp_server);

// Login mit Username und Passwort
if(!($login_result = ftp_login($conn_id, $ftp_user, $ftp_pass))) {
    ftp_close($conn_id);
    return;
}

// Schalte passiven Modus ein
ftp_pasv($conn_id, true);

Als nächstes wechseln wir das Verzeichnis auf dem FTP-Server, wo sich unsere Dateien befinden:

// Nach Verzeichnis .... wechseln
ftp_chdir($conn_id, "verzeichnis/auf/dem/server/");

Über die PHP-Funktion ftp_nlist werden alle Dateien im gewählten Verzeichnis aufgelistet. Über das zweite Argument können die Dateien gefiltert werden. In unserem Fall sollen nur Textdateien mit einer Endung .txt herangezogen werden.

$ftp_nlist_root = ftp_nlist($conn_id, "*.txt");

Für das spätere Selektieren der Dateien nach einem bestimmten Alter der Datei geben wir einen Zeitraum von einer Stunde an:

$timerange = time() - (60*60);

Zum Schluss der wichtigste Teil des Quelltextes: Die Foreach-Schleife durchläuft jedes Arrayelement (gleichbedeutend mit jedem Dateieintrag) aus der Variable $ftp_nlist_root und prüft das Änderungsdatum der Datei. Wenn es innerhalb der angegebenen letzten Stunde ist, dann wird es für die Ausgabe berücksichtigt und per ftp_get als Stream in die Variable $data hinzugefügt.

foreach ($ftp_nlist_root as $file) {
    $mod = ftp_mdtm($conn_id, $file);

    if ($mod >= $timerange) {
        ob_start();
        $result  = ftp_get($conn_id, "php://output", $file, FTP_ASCII);
        $data   .= ob_get_contents();
        ob_end_clean();
    }
}

ftp_close($conn_id);

Zusammenfassend nachfolgend noch einmal der komplette Quelltext für diese Anforderung:

<?php
$data       = "";

$ftp_server = "ftpserverxyz.de";
$ftp_user   = "anonymous";
$ftp_pass   = "anonymous";

//Mit FTP verbinden
$conn_id = ftp_connect($ftp_server);

// Login mit Username und Passwort
if(!($login_result = ftp_login($conn_id, $ftp_user, $ftp_pass))) {
    ftp_close($conn_id);
    return;
}

// Schalte passiven Modus ein
ftp_pasv($conn_id, true);

// Nach Verzeichnis .... wechseln
ftp_chdir($conn_id, "verzeichnis/auf/dem/server/");

//Liste alle Dateien auf, welche eine Dateiendung .txt besitzen
$ftp_nlist_root = ftp_nlist($conn_id, "*.txt");

//Sortiere Array
$timerange = time() - (60*60);

foreach ($ftp_nlist_root as $file) {
    $mod = ftp_mdtm($conn_id, $file);

    if ($mod >= $timerange) {
        ob_start();
        $result  = ftp_get($conn_id, "php://output", $file, FTP_ASCII);
        $data   .= ob_get_contents();
        ob_end_clean();
    }
}

ftp_close($conn_id);
?>

 

Deutsche Sprache in Ubuntu Linux einstellen

In Ubuntu kann die Systemsprache in den Systemeinstellungen mit dem Unterpunkt Language Support geändert werden. Sollten bereits die deutschen Sprachdateien vorhanden sein, dann wird dies in der Tabelle angezeigt. Die grau markierten Sprachen sind dabei inaktiv. Zum Aktivieren der jeweiligen Sprache wird der Listenpunkt mit der Maus per Drag & Drop nach oben an den Anfang der Liste gezogen. Sollte die deutsche Sprache nicht in der Liste vorhanden sein, muss sie nachinstalliert werden.

Spracheinstellung

Spracheinstellungen unter Ubuntu

 

Klicke in dem Fall auf Install/Remove Languages. In der nun folgenden Liste werden alle verfügbaren Sprachen aufgelistet, welche für Ubuntu genutzt werden können.

Verfügbare Systemsprachen

Verfügbare Systemsprachen

Wähle durch anhaken des Checkfeldes rechts neben der Auswahl für German. Schließe das Fenster über die Schaltfläche Apply Changes. Im Anschluss werden die nötigen Sprachpakete nachinstalliert, sodass die deutsche Sprache in der vorherigen Liste sichtbar und auswählbar ist.

Deutsche Sprache aktivieren

Deutsche Sprache aktivieren

Sollte die Option untergraut dargestellt sein, dann ziehe wie oben beschrieben den Listenpunkt per Drag & Drop mit der Maus an die oberste Stelle der Liste. Soll diese Einstellung systemweit genutzt werden, klicke auf den Button Apply System-Wide.

 

Regionaleinstellungen aktivieren

Regionaleinstellungen aktivieren

 

Nicht betroffen von diesen Änderungen sind die Darstellungen von Zeit- und Währungsformaten.Unter dem Reiter Regional Formats kann eingestellt werden, ob ein amerikanisches oder deutsches Währungs-, Datums- oder Zahlenformat genutzt werden soll. Hier trifft die Einstellung Deutsch (Deutschland) auf unser Vorhaben zu.

Wir sind soweit durch. Die Änderungen werden jedoch erst nach einer Neuanmeldung des Nutzers am System wirksam. Ein Logout und eine Neuanmeldung reicht dabei aus. Ubuntu weist uns beim Anmelden noch daruaf hin, ob wir die Systemordner wie die Arbeitsfläche und unsere persönlichen Benutzerordner ebenfalls umbenannt haben möchten. Wir können dies bestätigen mit Namen aktualisieren.

 

Persönliche Ordner umbenennen

Persönliche Ordner umbenennen

 

Deutsche Tastaturbelegung in Ubuntu Linux einstellen

Um das Tastaturenlayout in Ubuntu Linux auf deutsch umzustellen, sind nur einige wenige Handgriffe über das Terminal nötig. Zunächst rufen wir das Terminal auf und geben den folgenden Befehl ein:

sudo dpkg-reconfigure console-setup

Die nun folgenden Auswahlmöglichkeiten können bequem mit den Pfeiltasten ausgewählt und bestätigt werden mit der Entertaste. Zunächst einmal wählen wir die Option Generic 105-key (intl) PC als Tastaturmodell aus und drücken die Entertaste.

Tastaturmodell

Im zweiten Schritt wählen wir als Herkunftsland der Tastatur die Option German aus. Im Falle der Tastaturbelegung nutzen wir ebenfalls die oberste Option German aus der Liste.

Zusatznutzung der Tastatur

In den darauf folgenden Auswählfenstern werden zusätzliche Optionen zur Nutzung von Funktionstasten geboten. Wer dies nicht wünscht, nimmt einfach die Standardeinstellung seiner Tastatur. In dem Fall für die Frage nach der AltGr-Taste wähle die oberste Option Der Standard für die Tastenbelegung aus. Als Compose-Taste in nächsten Fenster wähle hierzu Keine Compose-Taste aus. Die nächste Fragestellung zur Nutzung der STRG+Alt+Zurück Tastenkombination bestätigen wir mit Nein und kehren somit automatisch zur normalen Terminalansicht zurück.

Warte so lange das Terminal ab, bis wieder der Eingabeprompt erscheint. Das Fenster kann jetzt geschlossen werden. Starte jetzt Ubuntu neu, damit die Änderungen wirksam werden.

Suchen und finden von Dateien mit find in der Linux Shell

Häufiger braucht man die Möglichkeit, schnell über die Shell nach bestimmten Dateien zu suchen. Nachfolgend möchte ich meine häufig genutzten Snippets vorstellen, welche im Alltagsgebrauch schon vielfach in Anspruch genommen wurden.

Find:
Suche nach bestimmten Dateinamen oder Eigenschaften von Dateien:

find [Suchort] Kriterium [Optionen]

Snippets:

Alle Dateien und Ordner im gesuchten Verzeichnis rekursiv auflisten:

find /verzeichnis/

Zusätzliche Dateiinformationen (Rechte, Dateigröße und Änderungszeit) zu den Suchergebnissen ausgeben:

find /verzeichnis/ -ls

Nach einem bestimmten Dateinamen im gesamten System suchen, wenn die Art der Datei nicht bekannt ist:

find / -name dateiname.*

Suche nach allen PDFs im Ordner ebooks:

find /ebooks -name *.pdf

Nach einer bestimmten Textdatei mit dem namen foo im gesamten System suchen :

find / -name foo.txt

Suche nach der Datei foo.txt in mehreren bestimmten Ordnern:

find /verzeichnis1 /verzeichnis2/unterverzeichnis -name foo.txt

Sollte der ausführende Benutzer nicht die Rechte haben, einzelne Ordner zu sehen, können während des Suchvorgangs Fehler auftauchen. Diese Meldungen können ganz einfach durch Anfügen von dem folgenden Befehl ausgeblendet werden (funktioniert bei jedem find-Aufruf):

find / -name foo.txt 2>/dev/null

Auflisten aller Ordner, welche den Namen ordner im Namen tragen:

find / -type d -name "*ordner*"

Das Gleiche auch nur für Dateien:

find / -type f -name "*datei*"

Dateien finden, dessen Dateigröße mehr als 15 MB beträgt:

find /pictures -size +15M

Finde Dateien, welche innerhalb der letzten sieben Tage geändert wurden.  Gleiches gilt auch für ctime (Änderung des Dateistatus von Namen oder Rechten), bzw. atime für den Zeitpunkt des letzten Dateizugriffs:

find /pictures -mtime -7

Es kann -amin, -cmin oder -mmin genutzt werden, um nach Änderungen in genaueren Minutenabfragen zu unterscheiden, z.B. das Auflisten aller Dateien mit einer Änderung innerhalb der letzten 60 Minuten :

find /pictures -mmin -60

Finde alle Dateien des Benutzers foo:

find /pictures -user foo

 

 

Doppelte Einträge in mySQL Tabelle finden

Mit einer SQL-Abfrage können doppelte Einträge, auch Dubletten genannt, sehr schnell und einfach innerhalb einer Tabelle identifiziert werden. Dazu dient die folgende Tabelle mit dem Namen „Liste“ als Vorlage:

id vorname name
1 Max Mustermann
2 Maria Müller
3 Olaf Heinz
4 Peter Schuster
5 Karl Richter
6 Wilhelm Bach
7 Maxi Mustermann
8 Max Mustermann

Zu erkennen ist ein doppelter Eintrag mit der ID 1 und 8. Der Datensatz mit der Nr. 7 hat zwar den gleichen Nachnamen, jedoch einen unterschiedlichen Vornamen. Daher darf dieser Eintrag nicht als Duplikat erkannt werden.

Mit der folgenden Abfrage werden alle vorkommenden Duplikate aufgelistet und ihre Anzahl an Vorkommen gezählt:

SELECT vorname, name, COUNT(id) AS cnt
FROM liste
GROUP BY vorname,name
HAVING cnt > 1

Es fehlt hierbei jedoch noch eine genauere Ausgabe, welche Datensätze genau als Duplikate erkannt wurden. Es soll möglich sein, alle doppelten Datensätze einzeln aufzulisten. Dies erfolgt über ein Inner Join auf die gleiche Datenbanktabelle:

SELECT liste.vorname, liste.name
FROM liste
INNER JOIN (
SELECT vorname,name
FROM liste
GROUP BY vorname,name
HAVING COUNT(id) > 1) dup ON liste.name = dup.name && liste.vorname = dup.vorname

 

Duplikate mit Notepad++ entfernen

Mit dem Texteditor Notepad++ und dem mächtigen Plugin TextFX können Duplikate sehr effizient erkannt und aus einer Liste entfernt werden. In jeder neuen Zeile des betreffenden Textdokuments befindet sich ein Datensatz.

Das Plugin TextFX kann über den Plugin Manager installiert werden, welcher unter Erweiterungen -> Plugin Manager -> Show Plugin Manager aufgerufen werden kann. Suche unter Available die Option TextFX Characters und hake das nebenstehende Feld an. Durch Klick auf den Button Install werden die Installationsdateien aus dem Internet heruntergeladen und installiert. Nach einem Neustart von Notepad++ steht TextFX zur Verfügung.

Wähle als nächstes im Menü unter TextFX die Auswahlmöglichkeit TextFX Tools -> +Sort output only UNIQUE (at Column) lines aus.

Markiere den betreffenden Text im Editor und wähle im Hauptmenü unter TextFX die Option TextFX Tools -> Sort lines case sensitive (at column). Als Ergebnis werden die markierten Textzeilen alphabetisch sortiert und mehrfach vorkommende Zeilen entfernt.

TextFX Notepad++

TextFX mit Notepad++

Zebra-Tabelle erstellen

Auf verschiedene Weise können Tabellen in abwechselnd gestreiften Farben eingerichtet werden. Ich zeige nachfolgend zwei Beispiele auf.

Variante 1: PHP

<style type="text/css">
.row0 {background-color: #f2f2f2;}    
.row1 {background-color: #ffffff;}
</style>

<?php $c = 0; ?>

<table>
    <tr>
        <th>Spalte 1</th>
        <th>Spalte 2</th>
    </tr>    
    <!-- Schleife Beginn -->
    <tr class="row<?php echo($c++ & 1 );?>">
        <td>Inhalt 1</td>
        <td>Inhalt 2</td>
    </tr>    
    <!-- Schleife Ende -->
</table>

Vorteil Die Zuordnung erfolgt über eine eindeutige Klasse: PHP wird serverseitig ausgeführt und die Darstellung der Tabelle funktioniert auch mit älteren Browsern. Nachteil Es wird PHP benötigt.

Variante 2: CSS

<style type="text/css">
tr:nth-child(even) {background-color: #f2f2f2;}
tr:nth-child(odd)  {background-color: #ffffff;}
</style>

<table>
    <tr>
        <th>Spalte 1</th>
        <th>Spalte 2</th>
    </tr>    
    <!-- Schleife Beginn -->
    <tr>
        <td>Inhalt 1</td>
        <td>Inhalt 2</td>
    </tr>    
    <!-- Schleife Ende -->
</table>

Vorteil
Es ist kein PHP nötig.

Nachteil
Die Ansprache von nth-child in CSS wird nicht von älteren Browsern unterstützt und wird ignoriert. Generell werden diese Pseudo-Klassen jedoch von den neueren Browsern völlig unterstützt (Firefox ab Version 3.5; IE ab Version 9; Opera ab Version 9.5 und Chrome ab Version 4).