Bei einem Großteil der Software-Entwicklung geht es heute um eine benutzerfreundliche Oberfläche für eine massive SQL-Datenbank. Dieses Entwicklungsmuster – manchmal auch als CRUD-Anwendungen bezeichnet (Create, Read, Update, Delete) – ist so dominierend geworden und in vielerlei Hinsicht ein derartig gut gelöstes Problem, dass es niemandem einfällt, einmal etwas anderes zu machen. In Wirklichkeit ist ein SQL-Datenbank-Managementsystem mit zahlreichen Funktionen wie zum Beispiel PostgreSQL in vielen Anwendungsszenarien ein immenser Overkill, etwa mit Kanonen auf Spatzen zu schießen. Für einfachere Tools ist eine simplere Herangehensweise an die Datenspeicherung möglicherweise besser geeignet.
Einer der Vorteile der Verwendung einfacherer Methoden zur Datenspeicherung ist, dass sie häufig mit Plain-Text-Speicherung arbeiten, das heißt, es ist relativ einfach, die Daten in einem Texteditor zu lesen, und man muss nicht komplexe Software, etwa pgAdmin verwenden.
CSV
Eins der bekanntesten Plain-Text-Datenformate, die regelmäßig verwendet werden, ist das Comma Separated Value (oder CSV)-Format. Es ist nichts anderes als Plain-Text, wobei jede Zeile ein Datensatz, eine Zeile oder ein Tupel (je nach dem bevorzugten Jargon) ist, und jeder Datensatz wird durch Kommas in Felder, Spalten oder Elemente aufgeteilt. Das ist sehr praktisch zum Speichern von Tabellendaten ohne komplexe Datenbank-Engine – das heißt, um Daten in einem speicherbaren Format darzustellen, das den Merkmalen einer zweidimensionalen Tabelle entspricht. So lange in keinem Feld ein Komma benötigt wird, ist programmiertechnisch das Parsen von CSV-Daten völlig einfach. Wenn in einigen Feldern Kommas vorhanden sind, muss das Datenformat ein anderes Trennzeichen als Kommas verwenden, etwa ein Escape-Zeichen oder ein Anführungszeichen. Je nachdem, wie komplex die Daten werden, ist möglicherweise mehr als eine dieser Lösungen erforderlich.
In seiner einfachsten Form kann CSV Textzeilen wie die folgende enthalten:
Für Werte in Anführungszeichen würde dies in einer Zeile derselben Datei folgendermaßen aussehen:
Das Gleiche kann man aber auch mit einem Escape-Zeichen erzielen:
In Fällen, in denen das Feldtrennzeichen auch in den Daten vorkommen könnte, wäre es das Einfachste, ein anderes Zeichen als Feldtrennzeichen zu wählen – eines, von dem man weiß, dass es in den Daten selbst nicht vorkommt. In manchen Fällen könnte dies ein Semikolon sein, in anderen könnte es ein Carat oder ein Tabulator sein. Die Verwendung von Tabulatoren ist inzwischen so verbreitet, dass sie zur Entstehung ihres eigenen Initialwortes ähnlich wie CSV geführt hat: Das Format heißt Tab Separated Values (oder TSV). Mit Bezug auf die anderen Zeichenarten sind manche dazu übergegangen, CSV ein „Character Separated Value“-Format zu nennen.
Eine clevere Weise, CSV-Dateien zu handhaben, ist in den meisten Fällen, Code zu verwenden, der nach Bedarf Daten in und aus dem Format übersetzt, und die Daten niemals selbst mit der Hand in einem Texteditor zu bearbeiten. Aus diesem Grund und wegen der Vorherrschaft des CSV-Datenformats (häufig als Exportformat für SQL-Datenbanken und Arbeitsblätter verwendet) bietet fast jede moderne Programmiersprache eine ziemlich standardmäßige Implementierung einer CSV-Bibliothek und zumindest einige alternative Implementierungen. Ruby macht hier keine Ausnahme, und seine Standardbibliothek bietet eine CSV-Klasse:
#!/usr/bin/env ruby
require 'csv' articles = [
[
'Perrin',
'Chad',
'Einfache Datenspeicherung mit Ruby',
'Programmieren'
],
[
'Perrin',
'Chad',
'Besprechung: Das beste Linuxbuch überhaupt',
'Open Source'
],
[
'Perrin',
'Chad',
'NetworkManager, der fünfte Reiter der Apocalinux',
'Open Source'
]
]
CSV.open('articles.csv', 'w') do |csv|
articles.each {|record| csv end
Dies ergibt eine Datei, die die folgenden Daten enthält:
Daten wie diese in ein Ruby-Programm einzulesen ist genauso einfach:
#!/usr/bin/env ruby
require 'csv' articles = Array.new
CSV.foreach('articles.csv') do |record|
articles end
Wenn man davon ausgeht, dass die Datei articles.csv in diesem Beispiel die gleiche Datei wie im vorigen Beispiel ist, wird eine Artikelaufstellung erzeugt, die genau die gleichen Daten enthält wie die Artikelaufstellung im vorangehenden Beispiel.
YAML
Ein anderes Plain-Text-Datenformat ist YAML, das etwa wie „camel“ ausgesprochen wird. Ursprünglich hieß es, YAML sei ein Akronym für „Yet another Markup Language“ („Noch eine Markup-Sprache“), aber mit der voranschreitenden YAML-Entwicklung wurde die Sprache komplexer, ihre Verwendung weitete sich über die ursprünglichen Zwecke hinaus aus und Entwickler benannten sie in „YAML Ain’t Markup Language“ um. In seiner einfachsten Form ist YAML ein Plain-Text-Format für die Darstellung von zwei Datentypen: benannte Elemente und unbenannte Listenelemente.
In der Ruby-Gemeinde wurde YAML so etwas wie ein De-facto-Standard für das Datenmarshalling – ein Fantasiename für die Übersetzung von Daten im Arbeitsspeicher in ein Format, das für die Speicherung und den Austausch mit anderen Programmen geeignet ist, wie man das auch mit Daten im CSV-Format macht. YAML ist kein perfektes Format:
YAML bietet einige Vorteile, die dazu beitragen, dass die Sprache beliebt bleibt:
Die Nutzung der YAML-Bibliothek in Ruby ist ungefähr so einfach wie die Verwendung einer CSV-Bibliothek:
#!/usr/bin/env ruby
require 'yaml' articles = [
[
'Perrin',
'Chad',
'Einfache Datenspeicherung mit Ruby',
'Programmieren'
],
[
'Perrin',
'Chad',
'Besprechung: Das beste Linuxbuch überhaupt',
'Open Source'
],
[
'Perrin',
'Chad',
'NetworkManager, der fünfte Reiter der Apocalinux',
'Open Source'
]
]
File.open('articles.yaml', 'w') do |out|
YAML.dump articles, out
end
Dies erzeugt eine Datei namens articles.yaml, die die folgenden Daten enthält:
---
- - Perrin
- Chad
- Einfache Datenspeicherung mit Ruby
- Programmieren
- - Perrin
- Chad
- "Besprechung: Das beste Linuxbuch überhaupt"
- Open Source
- - Perrin
- Chad
- NetworkManager, der fünfte Reiter der Apocalinux
- Open Source
Das Einlesen von Daten aus einer Datei wie articles.yaml in eine articles ist sogar noch leichter:
#!/usr/bin/env ruby
require 'yaml' articles = YAML.load_file('articles.yaml')
Durch die Verkettung von CSV- und YAML-Operationen ist es eine leichte Übung, eine YAML-Datei zu erstellen, die die gleichen Daten darstellt wie eine CSV-Datei, oder umgekehrt. Für Anwendungen, die Permanentdatenspeicher benötigen, die nicht zu groß und nicht zu komplex sind, sind CSV und YAML lesbare Plain-Text-Formate, und Rubys CSV- und YAML-Bibliotheken bieten einen einfachen programmiertechnischen Zugriff auf diese Formate.
Bösartige QR-Codes, die per E-Mail versendet werden, eignen sich sehr gut, um Spam-Filter zu umgehen.
Unsichere Websites und Phishing-Mails in Verbindung mit Black Friday können kauffreudigen Konsumenten zum Verhängnis werden.
Malware SmokeLoader wird weiterhin von Bedrohungsakteuren genutzt, um Payloads über neue C2-Infrastrukturen zu verbreiten.
Bankhaus Metzler und Telekom-Tochter MMS testen, inwieweit Bitcoin-Miner das deutsche Stromnetz stabilisieren könnten.
Mit 1,7 Exaflops ist El Capitan nun der dritte Exascale-Supercomputer weltweit. Deutschland stellt erneut den…
Der deutsche Hyperscaler erweitert sein Server-Portfolio um vier Angebote mit den neuen AMD EPYC 4004…