Plattenspieler

Der Umgang mit Massenspeichern wie Festplatten (HDD), Solid State Drive (SSD), USB, Speicherkarten oder Network Attached Storages (NAS) ist unter Linux gar nicht so schwer, wie viele glauben. Man muss es lediglich schaffen, alte Gewohnheiten, die man sich unter Windows angeeignet hat, wieder loszulassen. In diesem Kompaktkurs erfahren Sie alles Notwendige, um auf Linux Desktops und -Servern mögliche aufkommende Probleme zu meistern.

Bevor wir auch gleich in aller Tiefe in das Thema eintauchen, noch ein paar wichtige Fakten über die Hardware selbst. Hier gilt vor allem der Grundsatz: Wer billig kauft, kauft doppelt. Wobei das Problem nicht einmal das Gerät selbst ist, was man austauschen muss, sondern die möglicherweise verlorenen Daten und der Aufwand, alles wieder neu einzurichten. Diese Erfahrung habe ich vor allem bei SSDs und Speicherkarten gemacht, wo es durchaus einmal vorkommen kann, dass man einem Fake Produkt aufgesessen ist und der versprochene Speicherplatz nicht vorhanden ist, obwohl das Betriebssystem die volle Kapazität anzeigt. Wie man mit solchen Situationen umgeht, besprechen wir allerdings ein wenig später.

Ein weiterer wichtiger Punkt ist die Verwendung im Dauerbetrieb. Die meisten Speichermedien sind nicht dafür geeignet, 24 Stunden jeden Tag, 7 Tage die Woche eingeschaltet zu sein und verwendet zu werden. Festplatten und SSDs, die für Laptops gemacht worden sind, gehen bei einer Dauerbelastung zügig kaputt. Deswegen sollte man sich bei Dauerbetrieb, wie es bei NAS‑Systemen der Fall ist, explizit nach solchen speziellen Geräten umschauen. Die Firma Western Digital hat zum Beispiel verschiedene Produktlinien. Die Linie Red ist für Dauerbetrieb ausgelegt, wie es bei Servern und NAS der Fall ist. Wichtig ist, dass in der Regel die Datentransfergeschwindigkeit bei Speichermedien etwas geringer ist, wenn dafür die Lebensdauer erhöht wird. Aber keine Sorge, wir verlieren uns jetzt nicht in den ganzen Details, die man noch zum Thema Hardware sagen könnte, und wollen es dabei belassen, um zum nächsten Punkt zu gelangen.

Ein signifikanter Unterschied zwischen Linux und Windows ist das Dateisystem. Also der Mechanismus, wie das Betriebssystem den Zugriff auf die Informationen organisiert. Windows Nutzt als Dateisystem NTFS und USB Sticks oder Speicherkarten sind oft auch unter FAT formatiert. Der Unterschied ist, dass mit NTFS Dateien, die über 4 GB groß sind, gespeichert werden können. FAT wird der Stabilität eher von Geräteherstellern in Navigationssystemen oder Autoradios bevorzugt. Unter Linux sind vornehmlich die Dateisysteme ext3 oder ext4 anzutreffen. Natürlich gibt es noch viele Spezialformate, die wir aber an dieser Stelle nicht weiter besprechen wollen. Der große Unterschied zwischen Linux- und Windows Dateisystemen ist das Sicherheitskonzept. Während NTFS keinen Mechanismus hat, um das Erstellen, Öffnen oder Ausführen von Dateien und Verzeichnissen zu kontrollieren, ist dies für ext3 und ext4 ein grundlegendes Konzept.

Speicher, die in NTFS oder FAT formatiert sind, können problemlos an Linux Rechner angeschlossen werden und die Inhalte können gelesen werden. Um beim Schreiben von Daten auf Netzwerkspeicher, die wegen der Kompatibilität oft auf NTFS formatiert sind, keine Verluste zu riskieren, nutzt man das SAMBA Protokoll. Samba ist meist bereits Bestandteil vieler Linux Distributionen und kann in wenigen Augenblicken auch installiert werden. Es ist keine spezielle Konfiguration des Dienstes notwendig.

Nachdem wir nun gelernt haben, was ein Dateisystem ist und wozu diese notwendig sind, stellt sich nun die Frage, wie man einen externen Speicher unter Linux formatieren kann. Die beiden grafischen Programme Disks und Gparted sind hierzu ein gutes Gespann. Disks ist ein wenig universeller nutzbar und es lassen sich mit diesem Programm bootfähige USB Sticks erstellen, mit denen man anschließend Computer installieren kann. Gparted ist eher geeignet, bei Festplatten oder SSDs bestehende Partitionen zu erweitern oder kaputte Partitionen zu reparieren.

Bevor sie nun weiterlesen und sich gegebenenfalls daran machen, den ein oder anderen Tipp nachzustellen, ist es wichtig, dass ich an dieser Stelle einen Warnhinweis gebe. Bevor Sie irgendetwas mit Ihren Speichermedien ausprobieren, fertigen Sie zuallererst eine Datensicherung an, auf die Sie bei Unglücken zurückgreifen können. Zudem weise ich ausdrücklich darauf hin, sich nur an den Szenarien zu versuchen, die Sie verstehen und bei denen Sie wissen, was Sie tun. Für mögliche Datenverluste übernehme ich keine Haftung.

Bootfähige USB & Speicherkarten mit DISKS

Ein Szenario, das wir gelegentlich benötigen, ist die Erstellung von bootfähigen Datenträgern. Ganz gleich, ob es ein USB‑Stick für die Installation eines Windows‑ oder Linux‑Betriebssystems oder das Installieren des Betriebssystems auf einer SD‑Karte für die Verwendung auf einem RaspberryPI ist: Das Vorgehen ist identisch. Bevor wir starten, benötigen wir ein Installationsmedium, das wir als ISO in der Regel von der Homepage des Betriebssystemherstellers herunterladen können, und einen zugehörigen USB‑Stick.

Als Nächstes öffnen wir das Programm Disks und wählen den USB Stick aus, auf den wir die ISO Datei installieren wollen. Danach klicken wir auf die drei Punkte im oberen Rahmen des Fensters und wählen aus dem erscheinenden Menü den Eintrag Restore Disk Image. In dem nun sich öffnenden Dialog wählen wir für das Eingabefeld Image to Restore unsere ISO Datei aus und klicken auf Start Restoring. Mehr ist nicht zu tun.

Partitionen und MTF mit Gparted reparieren

Ein anderes Szenario, mit dem man konfrontiert sein kann, ist das Daten auf einem Stick z. B. nicht lesbar sind. Wenn die Daten selbst nicht beschädigt sind, kann man Glück haben und mit GParted das Problem lösen. In einigen Fällen kann es sein, (A) dass die Partitionstabelle beschädigt ist und das Betriebssystem einfach nicht weiß, wo der Startpunkt ist. Eine andere Möglichkeit ist, (B) dass die sogenannte Master File Table (MFT) beschädigt ist. In der MTF ist der Vermerk, in welcher Speicherzelle eine Datei gefunden wird. Beide Probleme lassen sich mit GParted schnell wieder in Ordnung bringen.

Natürlich ist es nicht möglich, in einem allgemeinen Artikel auf die vielen komplexen Aspekte der Datenrettung einzugehen.

Nachdem wir nun wissen, dass eine Festplatte aus Partitionen besteht und diese Partitionen ein Dateisystem enthalten. Können wir jetzt sagen, dass alle Informationen zu einer Partition mit dem darauf formatierten Dateisystem in der Partitionstabelle gespeichert sind. Um alle Dateien und Verzeichnisse innerhalb einer Partition zu finden, bedient sich das Betriebssystem eines Index, in dem es nachschauen kann, die sogenannten Master File Table (MFT). Dieser Zusammenhang führt uns bereits zum nächsten Punkt, dem sicheren Löschen von Speichermedien.

Datenschredder – sicheres Löschen

Wenn wir Daten auf einem Speichermedium löschen, wird lediglich der Eintrag, wo die Datei zu finden ist aus der MFT entfernt. Die Datei ist also weiterhin vorhanden und kann von speziellen Programmen immer noch gefunden und ausgelesen werden. Das sichere Löschen von Dateien gelingt nur, wenn wir den freien Speicherplatz mehrfach überschreiben. Da wir nie wissen können, wo eine Datei physisch auf einem Speichermedium geschrieben wurde, müssen wir nach dem löschen den gesamten freien Speicherplatz mehrfach überschreiben. Spezialisten raten zu drei Schreibvorgängen, bei denen jeweils unterschiedliche Muster geschrieben werden, um selbst Speziallaboren eine Wiederherstellung unmöglich zu machen. Ein Programm unter Linux, mit dem man zusätzlich noch ‚Datenmüll‘ zusammenkehrt und löscht, ist BleachBit.

Das sichere Überschreiben von gelöschten Dateien ist je nach Größe des Speichermediums eine etwas länger andauernde Aktion, weswegen man dies nur sporadisch macht. Ganz sicher sollte man alte Speichermedien aber rückstandsfrei löschen, wenn diese ‚aussortiert‘ werden und dann entweder entsorgt oder an andere weitergegeben werden.

Ganze Festplatten 1:1 spiegeln – CloneZilla

Ein weiteres Szenario, mit dem wir konfrontiert werden können, ist die Notwendigkeit, eine Kopie der Festplatte anzufertigen. Das ist dann relevant, wenn für den aktuellen Computer die bestehende Festplatte bzw. SSD gegen eine neue mit höherer Speicherkapazität ausgetauscht werden soll. Windowsnutzer nutzen hier oft die Gelegenheit, ihr System neu zu installieren, um in Übung zu bleiben. Wer bereits länger mit Linux arbeitet, weiß es zu schätzen, dass Linux-Systeme sehr stabil laufen und die Notwendigkeit einer Neuinstallation nur sporadisch besteht. Daher bietet es sich an die Daten der aktuellen Festplatte bitweise auf die neue Platte zu kopieren. Das gilt natürlich auch für SSDs beziehungsweise von HDD zu SSD und umgekehrt. Dieses Vorhaben gelingt uns mit dem freien Werkzeug CloneZilla. Dazu erstellen wir einen bootfähigen USB mit CloneZilla und starten den Rechner im Livesystem von CloneZilla. Danach schließen wir die neue Platte mit einem SATA / USB Adapter an den Rechner an und starten die Datenübertragung. Bevor wir nach Fertigstellung unseren Computer aufschrauben und die Platten tauschen, ändern wir im BIOS die boot Reihenfolge und schauen, ob unser Vorhaben überhaupt geglückt ist. Nur wenn sich der Rechner über die neue Platte problemlos starten lässt, machen wir uns an den physischen Austausch. Diese kleine Anleitung beschreibt das prinzipielle Vorgehen und ich habe bewusst auf eine detaillierte Beschreibung verzichtet, da sich die Oberfläche und Bedienung von neueren Clonezilla-Versionen unterscheiden kann.

SWAP – die Auslagerungsdatei unter Linux

An dieser Stelle verlassen wir auch nun die grafische Benutzeroberfläche und wenden uns der Kommandozeile zu. Wir kümmern uns um eine sehr spezielle Partition, die manchmal erweitert werden muss. Es geht um die SWAP File. Die SWAP File ist das, was bei Windows Auslagerungsdatei heißt. Das heißt, hier schreibt das Betriebssystem Daten hin, die nicht mehr in den RAM passen, und kann bei Bedarf diese Daten schneller wieder in den RAM einlesen. Indessen kann es vorkommen, dass diese Auslagerungsdatei zu klein ist und erweitert werden muss. Aber auch das ist kein Hexenwerk, wie wir gleich sehen werden.

Abonnement / Subscription

[English] This content is only available to subscribers.

[Deutsch] Diese Inhalte sind nur für Abonnenten verfügbar.

Wir haben an dieser Stelle bereits einiges über den Umgang mit Speichermedien unter Linux besprochen. Im zweiten Teil dieser Artikelserie vertiefen wir die Möglichkeiten von Kommandozeilenprogrammen und schauen zum Beispiel, wie NAS-Speicher permanent in das System gemountet werden können. Aber auch Strategien, um defekte Speicher zu identifizieren, werden Thema des nächsten Teils werden. Insofern hoffe ich, euer Interesse geweckt zu haben, und würde mich über ein reichliches Teilen der Artikel von diesem Block freuen.

Plattenspieler

Plattenspieler

Elmar DottOkt. 20, 202510 min read

Egal ob einfacher Anwender mit einem Linux Desktop auf dem Laptop, oder erfahrener Administrator, der auf Cloud Linux Servern sein…

Pfadfinder

Damit wir Konsolenprogramme systemweit direkt aufrufen können, ohne dass wir dazu den vollständigen Pfad angeben müssen, bedienen wir uns der sogenannten Pfadvariable. Wir speichern also in dieser Pfadvariable den gesamten Pfad inklusive des ausführbaren Programmes, der sogenannten Executable, um auf der Kommandozeile den Pfad inklusive der Executable nicht mehr mit angeben zu müssen. Übrigens leitet sich aus dem Wort executable die in Windows übliche Dateierweiterung exe ab. Hier haben wir auch einen signifikanten Unterschied zwischen den beiden Betriebssystemen Windows und Linux. Während Windows über die Dateiendung wie beispielsweise exe oder txt weiß, ob es sich um eine reine ASCII Textdatei oder um eine ausführbare Datei handelt, nutzt Linux die Metainformationen der Datei, um diese Unterscheidung zu machen. Deswegen ist es unter Linux eher unüblich, diese Dateiendungen txt und exe zu verwenden.

Typische Anwendungsfälle für das Setzen der Pfadvariable sind Programmiersprachen wie Java oder Werkzeuge wie das Buildwerkzeug Maven. Wenn wir zum Beispiel Maven von der offiziellen Homepage heruntergeladen haben, können wir das Programm an einer beliebigen Stelle auf unserem System entpacken. Unter Linux könnte der Ort /opt/maven und unter Microsoft Windows C:/Programme/Maven lauten. In diesem Installationsverzeichnis gibt es wiederum ein Unterverzeichnis /bin in dem die ausführbaren Programme liegen. Die Executable für Maven heißt mvn und um etwa die Version auszugeben, wäre unter Linux ohne den Eintrag in der Pfadvariablen das Kommando wie folgt: /opt/maven/bin/mvn -v. Also ein wenig lang, wie wir durchaus zugeben können. Der Eintrag des Installationsverzeichnisses von Maven in den Pfad verkürzt den gesamten Befehl auf mvn -v. Dieser Mechanismus gilt übrigens für alle Programme, die wir als Befehl in der Konsole verwenden.

Bevor ich dazu komme, wie die Pfadvariable unter Linux, als auch unter Windows angepasst werden kann, möchte ich noch ein weiteres Konzept, die Systemvariable, vorstellen. Systemvariablen sind globale Variablen, die uns in der Bash zur Verfügung stehen. Die Pfadvariable zählt auch als Systemvariable. Eine andere Systemvariable ist HOME, welche auf das Stammverzeichnis des angemeldeten Benutzers zeigt. Systemvariablen werden großgeschrieben und die Wörter mit einem Unterstrich getrennt. Für unser Beispiel mit dem Eintragen der Maven Executable in den Pfad, können wir auch eine eigene Systemvariable setzen. Hier gibt es für Maven die Konvention M2_HOME und für Java gilt JAVA_HOME. Als best practice bindet man das Installationsverzeichnis an eine Systemvariable und nutzt dann die selbst definierte Systemvariable, um den Pfad zu erweitern. Dieses Vorgehen ist recht typisch für Systemadministratoren, die ihre Serverinstallation mithilfe von Systemvariablen vereinfachen. Denn diese Systemvariablen sind global und können von Automatisierungsskripten auch ausgelesen werden.

Die Kommandozeile, oder auch Shell, Bash, Konsole und Terminal genannt, bietet mit echo eine einfache Möglichkeit, den Wert der Systemvariablen auszugeben. Am Beispiel der Pfadvariable sehen wir auch gleich den Unterschied zu Linux und Windows. Linux: echo $PATH Windows: echo %PATH%

ed@local:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/snap/bin:/home/ed/Programs/maven/bin:/home/ed/.local/share/gem//bin:/home/ed/.local/bin:/usr/share/openjfx/lib

Beginnen wir auch nun gleich mit der einfachsten Möglichkeit, die Pfadvariable zu setzen. Unter Linux müssen wir lediglich die versteckte Datei .bashrc editieren. Am Ende der Datei fügen wir folgende Zeilen hinzu und speichern den Inhalt.

export M2_HOME="/opt/maven"
export PATH=$PATH:$M2_HOME/bin

Wir binden an die Variable M2_HOME das Installationsverzeichnis. Anschließend erweitern wir die Pfadvariable um um die M2_HOME Systemvariable mit dem Zusatz zum Unterverzeichnis der ausführbaren Dateien. Dieses Vorgehen ist auch bei Windows Systemen üblich, da sich so der Installationspfad einer Anwendung schneller finden und auch anpassen lässt. Nach dem Ändern der Datei .bashrc muss das Terminal neu gestartet werden, damit die Änderungen wirksam werden. Dieses Vorgehen stellt sicher, dass auch nach einem Neustart des Rechners die Einträge nicht verloren gehen.

Unter Windows besteht die Herausforderung darin, lediglich die Eingabemaske zu finden, wo die Systemvariablen gesetzt werden können. In diesem Artikel beschränke ich mich auf die Variante für Windows 11. Es kann natürlich sein, dass sich bei einem künftigen Update der Weg, die Systemvariablen zu editieren, geändert hat. Zwischen den einzelnen Windows Versionen gibt es leichte Variationen. Die Einstellung gilt dann sowohl für die CMD als auch für die PowerShell. Der nachfolgende Screenshot zeigt, wie man in Windows 11 zu den Systemeinstellungen gelangt.

Dazu klicken wir auf einen leeren Bereich auf dem Desktop die rechte Maustaste und wählen den Eintrag System aus. Im Untermenü System – Über finden sich die Systemeinstellungen, die das Popup Systemproperties öffnen. In den Systemeinstellungen drücken wir den Knopf Umgebungsvariablen, um die finale Eingabemaske zu erhalten. Nach den entsprechenden Anpassungen muss ebenfalls die Konsole neu gestartet werden, um die Änderungen wirksam werden zu lassen.

In dieser kleinen Hilfe haben wir den Zweck von Systemvariablen kennengelernt und wie man diese dauerhaft unter Linux und Windows speichert. Den Erfolg unserer Anstrengungen können wir in der Shell anschließend zügig über echo mit der Ausgabe des Inhalts der Variablen kontrollieren. Und schon sind wir dem IT-Profi wieder einen Schritt nähergekommen.


PHP Elegant Testing in Laravel

Die Programmiersprache PHP ist seit Jahrzehnten im Bereich der Webanwendungen für viele Entwickler die erste Wahl. Seit der Einführung objektorientierter Sprachfeatures mit der Version 5 wurde PHP erwachsen. Große Projekte lassen sich nun in eine saubere und vor allem wartbare Architektur bringen. Ein markanter Unterschied zwischen kommerzieller Softwareentwicklung und einem Hobby-Programmierer, der die Vereinshomepage zusammengebaut hat und betreut, ist der automatisierte Nachweis, dass die Anwendung festgelegte Vorgaben einhält. Hiermit betreten wir also das Terrain der automatisierten Softwaretests.

Ein wichtiger Grundsatz von automatisierten Softwaretests ist, dass diese ohne zusätzliche Interaktion nachweisen, dass die Anwendung ein zuvor festgesetztes Verhalten an den Tag legt. Softwaretests können nicht sicherstellen, dass eine Anwendung fehlerfrei ist, dennoch erhöhen sie die Qualität und reduzieren die Menge der möglichen noch enthaltenen Fehler. Der wichtigste Aspekt in automatisierten Softwaretests ist, dass ein bereits in Tests formuliertes Verhalten jederzeit in kurzer Zeit überprüft werden kann. Das stellt sicher, dass, wenn Entwickler eine bestehende Funktion erweitern oder in ihrer Ausführungsgeschwindigkeit optimieren, die vorhandene Funktionalität nicht beeinflusst wird. Kurz gesagt, haben wir ein leistungsfähiges Mittel, um sicherzustellen, dass wir bei unserer Arbeit nichts kaputtprogrammiert haben, ohne mühselig alle Möglichkeiten von Hand aus jedes Mal aufs Neue durchzuklicken.

Fairerweise muss man auch erwähnen, dass die automatisierten Tests entwickelt werden müssen, was wiederum im ersten Moment Zeit kostet. Dieser ‚vermeintliche‘ Mehraufwand kompensiert sich aber zügig, sobald die Testfälle mehrfach ausgeführt werden, um sicherzustellen, dass der Status Quo sich nicht verändert hat. Natürlich gehört es auch dazu, dass die erstellten Testfälle ebenfalls gepflegt werden müssen.

Wird etwa ein Fehler erkannt, schreibt man zuerst für diesen Fehler einen Testfall, der diesen Fehler nachstellt. Die Reparatur ist dann erfolgreich abgeschlossen, wenn der beziehungsweise die Testfälle erfolgreich sind. Aber auch Änderungen im Verhalten vorhandener Funktionalität erfordern immer ein entsprechendes Anpassen der zugehörigen Tests. Dieses Konzept, zur Implementierung der Funktion parallel Tests zu schreiben, ist in vielen Programmiersprachen umsetzbar und wird testgetriebene Entwicklung genannt. Aus eigener Erfahrung empfehle ich, auch bei vergleichsweise kleinen Projekten bereits testgetrieben vorzugehen. Kleine Projekte haben oft nicht die Komplexität großer Anwendungen, für die auch im Bereich des Testens einige Tricks benötigt werden. In kleinen Projekten hat man hingegen die Möglichkeit, im überschaubaren Rahmen seine Fertigkeiten auszubauen.

Testgetriebene Softwareentwicklung ist auch in PHP keine neue Sache. Das Unit-Test Framework PHPUnit von Sebastian Bergmann gibt es bereits seit 2001. Das um 2021 erschiene Test-Framework PEST setzt auf PHPUnit auf und erweitert dies um eine Vielzahl an neuen Möglichkeiten. PEST steht für PHP elegant Testing und definiert sich selbst als ein Werkzeug der neuen Generation. Da viele, vor allem kleinere Agenturen, die in PHP ihre Software entwickeln, in aller Regel auf manuelles Testen beschränken, möchte ich mit diesem kleinen Artikel eine Lanze brechen und aufzeigen, wie leicht es ist, PEST zu nutzen. Natürlich gibt es zu dem Thema testgetriebene Softwareentwicklung ein Füllhorn an Literatur, die auf die Art und Weise, wie man Tests in einem Projekt möglichst optimal organisiert. Dieses Wissen ist ideal für Entwickler, die bereits erste Gehversuche mit Test-Frameworks gemacht haben. Denn in diesen Büchern kann man lernen, wie man mit möglichst wenig Aufwand unabhängige, wartungsarme und performante Tests entwickelt. Um aber an diesen Punkt zu gelangen, muss man zuerst einmal die Einstiegshürde, die Installation der gesamten Umgebung, bewerkstelligen.

Eine typische Umgebung für eigene entwickelte Web-Projekte ist das Laravel-Framework. Beim Anlegen eines neuen Laravel-Webprojektes besteht die Möglichkeit, sich zwischen PHPUnit und PEST zu entscheiden. Laravel kümmert sich um alle notwendigen Details. Als notwendige Voraussetzung wird eine funktionierende PHP Umgebung benötigt. Dies kann zum einen ein Docker Container sein, eine native Installation oder die Serverumgebung XAMPP von Apache Friends. Für unser kurzes Beispiel verwende ich die PHP CLI in einem Debian Linux.

sudo apt-get install php-cli php-mbstring php-xml php-pcov

Nach Ausführen des Kommandos in der Konsole kann über den Befehl php -v der Erfolg der Installation getestet werden. Im nächsten Schritt benötigen wir einen Paketmanager, mit dem wir andere PHP Bibliotheken für unsere Anwendung bereitstellen können. Composer ist ein solcher Paketmanager. Dieser ist mit wenigen Anweisungen ebenfalls schnell auf dem System bereitgestellt.

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'ed0feb545ba87161262f2d45a633e34f591ebb3381f2e0063c345ebea4d228dd0043083717770234ec00c5a9f9593792') { echo 'Installer verified'.PHP_EOL; } else { echo 'Installer corrupt'.PHP_EOL; unlink('composer-setup.php'); exit(1); }"
php composer-setup.php
php -r "unlink('composer-setup.php');"

Damit wird die aktuelle Version der Datei composer.phar in das aktuelle Verzeichnis heruntergeladen, in dem der Befehl ausgeführt wird. Zudem wird auch automatisch der korrekte Hash überprüft. Damit Composer auch global über die Kommandozeile verfügbar ist, kann entweder der Pfad in die Pfadvariable aufgenommen werden oder man setzt eine Link der composer.phar in ein Verzeichnis, dessen Pfad bereits in der Bash integriert ist. Ich bevorzuge letztere Variante und erreiche dies über:

ln -d composer.phar $HOME/.local/bin/composer

Wenn alles korrekt ausgeführt wurde sollte nun mit composer list die Version inklusive der verfügbaren Kommandos ausgegeben werden. Ist dies der Fall, können wir global in das Composer Repository den Lavarel Installer installieren.

php composer global require laravel/installer

Damit wir nun auch über die Bash Lavarel installieren können, muss die Path-Variable COMPOSER_HOME gesetzt werden. Um herauszufinden, wo Composer das Repository angelegt hat, genügt der Befehl composer config -g home. Den hierüber ermittelten Pfad, der in meinem Fall /home/ed/.config/composer lautet, bindet man dann in die Variable COMPOSER_HOME. Nun können wir in einem leeren Verzeichnis

php $COMPOSER_HOME/vendor/bin/laravel new MyApp

ausführen, um ein neues Laravel-Projekt anzulegen. Die zugehörige Ausgabe auf der Konsole schaut wie folgt aus:

ed@P14s:~/Downloads/test$ php $COMPOSER_HOME/vendor/bin/laravel new MyApp

   _                               _
  | |                             | |
  | |     __ _ _ __ __ ___   _____| |
  | |    / _` |  __/ _` \ \ / / _ \ |
  | |___| (_| | | | (_| |\ V /  __/ |
  |______\__,_|_|  \__,_| \_/ \___|_|


  Which starter kit would you like to install? ────────────────┐
  None                                                         
 └──────────────────────────────────────────────────────────────┘

  Which testing framework do you prefer? ──────────────────────┐
  Pest                                                         
 └──────────────────────────────────────────────────────────────┘

Creating a "laravel/laravel" project at "./MyApp"
Installing laravel/laravel (v12.4.0)
  - Installing laravel/laravel (v12.4.0): Extracting archive
Created project in /home/ed/Downloads/test/MyApp
Loading composer repositories with package information

Die so erzeugte Verzeichnisstruktur enthält den Ordner tests, in dem die Testfälle abgelegt sind, sowie die Datei phpunit.xml, welche die Konfiguration der Tests vorhält. Laravel definiert zwei Test Suiten: Unit und Feature, die bereits jeweils einen Demo Test enthalten. Um die beiden Demotestfälle auszuführen, nutzen wir das von Laravel mitgelieferte Kommandozeilenwerkzeug artisan [1]. Um die Tests auszuführen, genügt im Root-Verzeichnis einzig der Befehl php artisan test.

Damit wir die Qualität der Testfälle beurteilen können, müssen wir die zugehörige Testabdeckung ermitteln. Die Coverage erhalten wir ebenfalls durch artisan mit der Anweisung test, die durch den Parameter –coverage ergänzt wird.

php artisan test --coverage

Für die von Lavarel mitgelieferten Demo Testfälle ist die Ausgabe wie folgt:

Leider sind die Möglichkeiten von artisan zum Ausführen der Testfälle sehr eingeschränkt. Um den vollen Funktionsumfang von PEST nutzen zu können, sollte von Beginn an gleich der PEST Exekutor verwendet werden.

php ./vendor/bin/pest -h

Den PEST Exekutor findet man im Verzeichnis vendor/bin/pest und mit dem Parameter -h wird die Hilfe ausgegeben. Neben diesem Detail beschäftigt uns der Ordner tests, den wir bereits erwähnt haben. Im initialen Schritt sind über die Datei phpunit.xml zwei Testsuiten vorkonfiguriert. Die Testdateien selbst sollten mit dem Suffix Test enden, wie im Beispiel ExampleTest.php.

Im Vergleich zu anderen Test Suiten, versucht PEST möglichst viele Konzepte der automatisierten Testausführung zu unterstützen. Um dabei den Durchblick nicht zu verlieren, sollte jede Teststufe in einer eigenen Test Suite abgelegt werden. Neben den klassischen UnitTests werden Browsertests, Stresstests, Architekturtests und sogar das neu aufgekommene Mutation Testing ermöglicht. Natürlich kann dieser Artikel nicht alle Aspekte von PEST behandeln, zudem sind mittlerweile auch viele hochwertige Tutorials für das Schreiben klassischer Komponententests in PEST verfügbar. Deswegen beschränke ich mich auf einen Überblick und ein paar weniger verbreitete Konzepte.

Architektur-Test

Der Sinn von Architekturtests ist es auf einfache Weise zu überprüfen, ob die Vorgaben durch die Entwickler auch eingehalten werden. Dazu zählt, dass unter anderem Klassen, die Datenmodelle repräsentieren, in einem festgelegten Verzeichnis liegen und nur über spezialisierte Klassen aufgerufen werden dürfen.

test('models')
->expect('App\Models')
->toOnlyBeUsedOn('App\Repositories')
->toOnlyUse('Illuminate\Database');

Mutation-Test

Diese Form des Testens ist etwas Neues. Zweck der Übung ist es durch Veränderungen, z. B. in Bedingungen der originalen Implementierungen, sogenannte Mutanten zu erzeugen. Wenn die zu den Mutanten zugeordneten Tests weiterhin korrekt durchlaufen werden, anstatt fehl zuschlagen, kann das ein starker Hinweis darauf sein, dass die Testfälle möglicherweise fehlerhaft sind und keine Aussagekraft haben.

Original: if(TRUE) → Mutant: if(FALSE)

Stress-Test

Eine andere Bezeichnung für Stresstests sind Penetrationstests, die besonders auf die Performance einer Anwendung abgesehen haben. Damit kann man also sicherstellen, dass die Web-App beispielsweise mit einer definierten Anzahl an Zugriffen zurechtkommt.

Natürlich sind noch viele andere hilfreiche Funktionen vorhanden. So kann man Tests beispielsweise gruppieren und die Gruppen können dann einzeln aufgerufen werden.

// definition
pest()->extend(TestCase::class)
->group('feature')
->in('Feature');

// calling
php ./vendor/bin/pest --group=feature

Für alle diejenigen, die nicht mit dem Lavarel Framework arbeiten und dennoch nicht auf das Testen in PHP mit PEST verzichten möchten, können das PEST Framework auch so in ihre Anwendung einbauen. Dazu muss lediglich in der Composer Projektkonfiguration PEST als entsprechende Entwicklungsabhängigkeit definiert werden. Anschließend kann im Wurzelverzeichnis des Projektes das Initial Test Setup angestoßen werden.

php ./vendor/bin/pest --init

Wie wir sehen konnten, sind allein die hier kurz vorgestellten Optionen sehr mächtig. Die offizielle Dokumentation von PEST ist auch sehr ausführlich und sollte grundsätzlich die erste Anlaufstelle sein. In diesem Artikel ging es mir vor allem darum, die Einstiegshürden für testgetriebene Entwicklung in PHP zu minimieren. Denn auch PHP bietet mittlerweile ein gutes Füllhorn an Möglichkeiten, sehr effizient und zuverlässig kommerzielle Softwareprojekte umzusetzen.

Ressourcen

Professionelle Screenshots anfertigen

So ziemlich jeder Computernutzer kommt im Laufe der vielen Stunden, die er vor diesem tollen Gerät verbringen darf, in die Notwendigkeit, den Bildschirminhalt als Grafik abzuspeichern. Den Vorgang, vom Inhalt des Monitors ein Bild zu erzeugen, nennen eingeweihte Profis einen Screenshot erstellen.

Wie bei so vielen Dingen führen auch beim Erstellen von Screenshots viele Wege nach Rom, beziehungsweise zum Ziel. Ganz findige Zeitgenossen lösen das Problem, indem sie einfach mit dem Smartphone auf den Monitor halten und ein Foto machen. Warum auch nicht, solange man anschließend auch noch etwas erkennen kann, ist ja alles gut. Aber hier soll die kleine Anleitung nicht zu Ende sein, sondern wir schauen uns die vielen Möglichkeiten zum Erstellen von Screenshots etwas genauer an. Denn auch Profis, die zum Beispiel gelegentlich mal eine Anleitung schreiben dürfen, müssen die ein oder andere Tücke überwinden.

Bevor wir auch gleich zum Eingemachten kommen, ist es wichtig zu erwähnen, dass es einen Unterschied macht, ob man den ganzen Bildschirm, das Browserfenster oder sogar den nicht sichtbaren Bereich einer Webseite als Screenshot abspeichern möchte. Die vorgestellte Lösung für den Webbrowser funktioniert so ziemlich bei allen Webbrowsern auf allen Betriebssystemen gleich. Screenshots, die den Monitorbereich abdecken sollen und keine Webseite, nutzen Techniken des vorhandenen Betriebssystems. Aus diesem Grund unterscheiden wir auch zwischen Linux und Windows. Beginnen wir mit dem häufigsten Szenario: Browser-Screenshots.

Browser

Gerade bei Onlinebestellungen hat so mancher ein angenehmeres Gefühl, wenn er den Kauf zusätzlich durch einen Screenshot dokumentieren kann. Aber auch gelegentlich das Sichern einer Anleitung von einer Homepage, für später zu speichern, ist nicht unüblich. Oft steht man beim Erstellen von Screenshots von Webseiten vor dem Problem, dass die einzelne Seite länger ist als der auf dem Monitor angezeigte Bereich. Natürlich ist der Wunsch, nun den gesamten Inhalt zu sichern und nicht nur den angezeigten Bereich. Genau für diesen Fall haben wir lediglich die Möglichkeit, auf ein Browserplugin zurückzugreifen.

Mit Fireshot, steht uns für alle gängigen Browser wie Brave, Firefox und Microsoft Edge ein Plug-in zur Verfügung, mit dem wir Screenshots inklusive verdeckter Inhalte von Webseiten erstellen. Fireshot ist eine Browsererweiterung, die schon seit sehr langer Zeit auf dem Markt ist. Fireshot kommt mit einer kostenlosen Version, die bereits für das beschriebene Szenario ausreichend ist. Wer zusätzlich bereits bei der Erstellung des Screenshots noch einen Bildeditor benötigt, um unter anderem Bereiche hervorzuheben und Beschriftungen vorzunehmen, kann die kostenpflichtige Pro Version nutzen. Der integrierte Editor hat den Vorteil, im professionellen Bereich, wie beim Erstellen von Anleitungen und Dokumentationen, den Arbeitsfluss erheblich zu beschleunigen. Natürlich erreicht man gleiche Ergebnisse mit einem externen Fotoeditor wie Gimp. Gimp ist ein freies Bildbearbeitungsprogramm, ähnlich leistungsfähig und professionell wie das kostenpflichtige Photoshop, das für Windows und Linux verfügbar ist.

Linux

Wollen wir wiederum Screenshots außerhalb des Webbrowsers erstellen, so können wir problemlos auf die Bordmittel des Betriebssystems zurückgreifen. In Linux benötigt man kein weiteres Programm zu installieren, alles Notwendige ist bereits vorhanden. Mit dem Drücken der Print Taste auf der Tastatur öffnet sich bereits das Werkzeug. Man muss lediglich mit der Maus den Rahmen um den zu fotografierenden Bereich ziehen und im erscheinenden Control Feld auf Capture drücken. Es ist kein Problem, wenn der Controlbereich im sichtbaren Bereich des Screenshots liegt, es wird nicht im Screenshot angezeigt, Auf deutschen Tastaturen findet man oft anstatt Print die Taste Druck. Der fertige Screenshot landet dann mit einem Zeitstempel im Dateinamen im Ordner Screenshots, der ein Unterordner in Pictures innerhalb des Benutzerverzeichnisses ist.

Windows

Der einfachste Weg, unter Windows Screenshots anzufertigen, ist die Verwendung des Snipping Tools, das in der Regel ebenfalls bereits Bestandteil der Windows-Installation ist. Auch hier ist die Bedienung intuitiv.

Ein anderer sehr alter Weg in Windows, ohne ein spezielles Programm zum Erstellen von Screenshots, ist das gleichzeitige Drücken der Tasten Strg und Druck. Anschließend öffnen wir ein Grafikprogramm, wie das in jeder Windows-Installation vorhandene Paint. Im Zeichenbereich drücken wir dann die Tasten Strg + V gleichzeitig und der Screenshot erscheint und kann sofort bearbeitet werden.

Meistens werden diese Screenshots im Grafikformat JPG erstellt. JPG ist eine verlustbehaftete Komprimierung, sodass man nach Erstellung des Screenshots die Lesbarkeit überprüfen sollte. Gerade bei aktuellen Monitoren mit Auflösungen um die 2000 Pixel erfordert die Verwendung der Grafik in einer Homepage noch manuelle Nachbearbeitung. Ein Punkt ist das Reduzieren der Auflösung von den knapp 2000 Pixeln zu den auf der Homepage üblichen knapp 1000 Pixel. Ideal ist es, die fertig skalierte und bearbeitete Grafik im neuen WEBP Format zu speichern. WEBP ist eine verlustfreie Grafikkomprimierung, die die Datei gegenüber JPG noch einmal reduziert, was sehr positiv für die Ladezeiten der Internetseite ist.

Damit haben wir auch schon eine gute Bandbreite zum Erstellen von Screenshots besprochen. Natürlich könnte man noch mehr dazu sagen, das fällt dann allerdings in den Bereich des Grafikdesigns und der effizienten Verwendung von Bildbearbeitungssoftware.


Passwörter, aber sicher?

Muss jetzt schon wieder einer was zu Passwörtern scheiben? – Natürlich nicht, aber ich mach’s trotzdem. Das Thema sichere Passwörter ist nicht umsonst ein Evergreen. In diesem stetigen Katz und Maus Spiel zwischen Hackern und Anwendern gibt es nur eine funktionierende Lösung: stets am Ball bleiben. Schnellere Computer und Verfügbarkeiten von KI‑Systemen mischen die Karten immer wieder neu. In der Kryptografie gibt es ein ungeschriebenes Gesetz, das besagt, dass reines Geheimhalten von Informationen kein ausreichender Schutz ist. Vielmehr sollte der Algorithmus zur Geheimhaltung offengelegt sein und anhand eines mathematischen Nachweises sollte dessen Sicherheit bewiesen werden.

Gegenwärtig beobachten Sicherheitsforscher einen Trend, wie mittels künstlicher Intelligenz vermeintlich sichere Passwörter erraten werden können. Bisher hat sich im Umgang mit Passwörtern eine Regel etabliert: Je länger ein Passwort ist, umso schwieriger ist es, zu erraten. Diese Tatsache können wir an einem einfachen Zahlenschloss ausprobieren. Ein Zahlenschloss mit drei Stellen hat genau 1000 mögliche Kombinationen. Nun ist der Aufwand, alle Nummern von 000 bis 999 manuell durchzuprobieren, recht überschaubar und kann mit etwas Geschick in weniger als 30 Minuten gelöst werden. Ändert man jetzt das Zahlenschloss von drei Stellen auf fünf, vervielfacht sich diese Arbeit und die Lösung unter 30 Minuten zu finden, basiert dann mehr auf Glück, wenn etwa die Kombination im unteren Zahlenbereich liegt. Die Sicherheit wird weiter erhöht, wenn pro Stelle nicht nur Zahlen von 0 bis 9 möglich sind, sondern Buchstaben mit Groß- und Kleinschreibung hinzukommen.

An diesem kleinen und einfachen Beispiel sehen wir, wie der ‚Teufelskreis‘ funktioniert. Schnellere Computer erlauben es, mögliche Kombinationen in kürzerer Zeit durchzuprobieren, also muss die Menge der möglichen Kombinationen mit möglichst überschaubarem Aufwand ins Unermessliche getrieben werden. Während Anfang der 2000er noch 8 Stellen mit Ziffern und Buchstaben ausgereicht haben, sollten es heute möglichst 22 Stellen mit Ziffern, Groß- und Kleinschreibung inklusive Sonderzeichen sein. Die KI von Proton lumo gibt folgende Empfehlung:

  • Länge mindestens 22 Zeichen
  • Mischung: Groß- /Kleinbuchstaben, Ziffern, Sonderzeichen, Unterstrich

Ein praktisches Beispiel für ein sicheres Passwort wäre beispielsweise: R3gen!Berg_2025$Flug.

Hier sehen wir schon die erste Schwachstelle. Solche Passwörter kann sich kein Mensch merken. Beruflich gibt Dir eventuell jemand eine Passwortrichtlinie vor, die Du erfüllen musst – isso, dumm gelaufen, leb damit! Aber keine Sorge, es gibt für alles einen Lifehack.

Daher kommt auch immer noch der Fall vor, dass Mitarbeiter ihr Passwort in unmittelbarer Nähe zu ihrem PC aufbewahren. Ja, immer noch auf den kleinen Zetteln unter der Tastatur oder als Post-it am Bildschirmrand. Wenn ich mich als EDV-ler in einen Mitarbeiter PC einloggen möchte, der nicht am Platz ist geht nach wie vor mein Blick über den Bildschirmrand und als Nächstes schaue ich unter der Tastatur nach.

Woran erkenne ich dann, dass es sich um das Passwort handelt? Klar! Ich achte auf eine Folge von Groß- Kleinbuchstaben, Zahlen und Sonderzeichen. Würde am Bildschirmrand ein Post-it kleben mit z. B. der Aufschrift: »Mi Fußpflege 10:45« würde ich das erst mal als Passwort überhaupt nicht wahrnehmen.

Also als Passwort »MiFußpflege10:45« 16stellig, Groß- und Kleinbuchstaben, Zahlen, Sonderzeichen. Also perfekt! Und zunächst, nicht einmal als Passwort erkennbar. Übrigens: Der Zettel sollte möglichst wenig Staub bzw. Patina haben.

Im beruflichen Alltag kommen dann noch so nette Eigenheiten hinzu, dass man sein Passwort monatlich ändern muss, und das neue Passwort darf dann nicht in den letzten Monaten verwendet worden sein. Auch hier haben sich Mitarbeiter Lösungen einfallen lassen, wie etwa Passwort01, Passwort 02 und so weiter, bis alle 12 Monate durch waren. Also gab es ein erweitertes Prüfverfahren und es musste nun eine bestimmte Menge unterschiedlicher Zeichen enthalten sein.

Aber auch im Privaten sollten wir das Thema sichere Passwörter nicht auf die leichte Schulter nehmen. Die Dienste, zu denen wir uns regelmäßig anmelden, sind für viele ein wichtiger Bestandteil ihres Lebens geworden. Onlinebanking und auch Social Media sind hier wichtige Punkte. Die Menge der Online Accounts wächst stetig. Es ist natürlich klar, dass man seine Passwörter nicht recyceln sollte. Also sollte man mehrere Passwörter verwenden. Wie man das am besten angeht, also wie viele und wie man die aufbaut, muss jeder natürlich eigenverantwortlich umsetzen, so wie es für Dich persönlich passt. Aber wir sind auch keine Memory Meister und je seltener wir ein bestimmtes Passwort benötigen, desto schlechter können wir es uns merken. Abhilfe können Passwort Manager schaffen.

Passwort Manager

Der gute alte Karteikasten. Übrigens, Akkulaufzeit: unendlich. Auch, wenn das jetzt eines Computernerds unwürdig erscheint, ist es dennoch für zu Hause die möglicherweise effektivste Aufbewahrungsvariante für Passwörter.

Klar ist bei der heutigen Anzahl der Passwörter eine Software zur Verwaltung attraktiv, allerdings besteht die Gefahr, dass, wenn jemand die Software unter seine Kontrolle bringt, hat er Dich unter Umständen – wie unsere amerikanischen Freunde umgangssprachlich gerne sagen „By the balls“ – frei übersetzt auf Deutsch: im Schwitzkasten. Diese Regel gilt besonders für die im ersten Moment bequem erscheinenden Cloud Lösungen.

Für Linux und Windows gibt es aber eine Lösung, die man sich auf den eigenen Computer installieren kann, um die vielen Passwörter der Online Accounts z verwalten. Diese Software heißt KeePass, ist Open Source und auch legal kostenfrei im kommerziellen Umfeld einsetzbar. Dieser sogenannte Passwort Store speichert die Passwörter verschlüsselt auf der eigenen Festplatte ab. Natürlich ist es recht lästig, auf jeder Webseite die Log-ins aus dem Passwort-Manager herauszukopieren und dann einzufügen. Hier hilft ein kleines Browser Plug-in namens TUSK KeePass, das für alle gängigen Browser wie _Brave, Firefox und Opera vorhanden ist. Auch wenn einem andere Leute über die Schulter schauen, wird das Passwort niemals im Klartext angezeigt. Bei Copy und Paste wird es nach wenigen Minuten auch wieder aus der Zwischenablage gelöscht.

Ganz anders ist es natürlich, wenn man unterwegs ist und an fremden Computern arbeiten muss. Im privaten Bereich bietet es sich an, Passwörter auch entsprechend den Umständen anzupassen, je nachdem, wo man sie einsetzt. Angenommen, Du möchtest Dich an einem PC in Dein E-Mail-Konto einloggen, kannst aber eventuell nicht jederzeit sicherstellen, dass Du unbeobachtet bist.

An der Stelle wäre es sicherlich kontraproduktiv, einen Spickzettel herauszukramen, auf dem ein Passwort aufgeschrieben ist, das die empfohlenen Richtlinien aufweist. Groß- Kleinbuchstaben, Zahlen, Sonderzeichen, darunter möglichst auch japanische und kyrillische etc., die man dann mittels des Adler-such-System Zeichen für Zeichen mit dem Zeigefinger eintippt.

(bei fortschrittlichem Tastatur Layout auch anstelle von ‚Alt‘ mit ‚Kölsch‘ beschriftet)

Wenn man nicht zu unbegabt, also mitunter auch schon etwas schneller, auf der Tastatur tippen kann, solle man eher ein Passwort verwenden, das man in 1–1,5 Sekunden eintippen kann. Einen normalen Beobachter überfordert man damit. Insbesondere dann, wenn man bei der Eingabe mit der Schift-Taste unauffällig agiert. Man lenkt die Aufmerksamkeit auf die tippende rechte Hand und verwendet unauffällig mit der linken Hand gelegentlich Schift- oder Alt-Taste.

Möglicherweise, bei vorsichtiger Einschätzung, kommt das Leaken der persönlichen Tetris Highscoreliste keinem sicherheitsrelevanten Verlust gleich. Der Zugang zum Onlinebanking ist da schon ein ganz anderes Thema. Sinnig ist sicherlich deshalb, ein eigenes Passwort für Geldgeschäfte – ein anderes für weniger kritische Log-In’s – und ein einfach gehaltenes für „0-8-15“ Registrierungen zu verwenden.

Falls man die Möglichkeit hat, Alias E-Mail Adressen anlegen zu können, ist das auch sehr sinnvoll, da der Log-In normalerweise ja nicht nur ein Passwort, sondern auch eine E-Mail-Adresse braucht. Wenn Du dort, nach Möglichkeit, eine eindeutige, nur für die entsprechende Seite angelegte E-Mail hast, kann das nicht nur die Sicherheit erhöhen, sondern Dir auch die Möglichkeit geben, unerreichbar zu werden, wenn Du es möchtest. Hin und wieder passiert es mir z. B. dass ich Werbung bekomme, obwohl ich explizit auf Werbung verzichtet habe. Komischerweise sind das für gewöhnlich die gleichen ‚Vögel‘, die sich bei z. B. ihren Zahlungsbedingungen nicht an das halten, was sie vor der Registrierung versprochen hatten. Da gehe ich einfach den effektivsten Weg und lösche die Alias E-Mail-Adresse bei mir raus → und gut!

Merkfähigkeit

Ein paar Worte über die Merkfähigkeit von Passwörtern möchte ich auch noch loswerden. Wie wir in dem Artikel nun gesehen haben, ist es sinnvoll, möglichst für jeden Onlineaccount ein eigenes Passwort zu verwenden. So vermeiden wir, wenn mal wieder bei Sony der Play Station Store gehackt wird und alle Daten der Kunden gestohlen werden, dass unser Login zu Facebook und Co. ebenfalls betroffen ist. Natürlich gibt es mittlerweile Mehrfaktoren, Authentifizierungen und viele andere Sicherheitslösungen, aber nicht überall kümmern sich die Betreiber darum. Zudem gilt in Hackerkreisen die Devise: Jedes Problem hat eine Lösung.

Um nun ein marktfähiges Passwort mit allen Sicherheitskriterien zu erstellen, bedienen wir uns eines einfachen Ansatzes. Unser Passwort besteht aus einem sehr komplexen statischen Teil, der möglichst ohne persönlichen Bezug auskommt. Als Eselsbrücke hilft uns dabei die Vorstellung von einem Bild, wie im anfänglichen Beispiel. Kombination aus einem Bild („Regener Berg“) und einer Jahreszahl, ergänzt durch ein weiteres Wort („Flug“). Sehr beliebt ist es auch, zufällig Buchstaben durch ähnlich aussehende Zahlen zu ersetzen, also das E durch eine 3 oder das I durch eine 1 auszutauschen. Damit man die Menge der Möglichkeiten nicht einschränkt und sozusagen alle E nun eine 3 sind, machen wir das nicht bei allen E. So kommen wir zu einem statischen Passwortteil, der wie folgt aussehen könnte: R3gen!Berg_2025$Flug. Diesen statischen Teil können wir uns leicht merken. Brauchen wir nun ein Passwort für unser X Log-In ergänzen wir den statischen Teil mit einem dynamischen Segment, das nur für unseren X Account gilt. Der statische Teil lässt sich gut über ein Sonderzeichen wie # einleiten und dann über den Bezug zum Log-in ergänzen. Das könnte dann wie folgt aussehen: sOCIAL.med1a-X. Wie bereits mehrfach erwähnt, ist das eine Idee, die jeder nach seinen eigenen Bedürfnissen anpassen kann.

Abschließend

Am Arbeitsplatz solltest Du Dir immer darüber im Klaren sein, dass der, der sich in Deinen Account einloggt, auch in Deinem Namen agiert. Also unter Deiner Identität.

Es ist schon logisch, dass die Abläufe bisweilen wesentlich ‚runder‘ laufen, wenn ein befreundeter Kollege mal eben bei Dir ‚nachschauen‘ kann. Die Wahrscheinlichkeit, dass Dir das auf die Füße fällt, ist sicher gering, solange er mit Deinem Passwort sorgfältig umgeht.

Sicherlich sollte man generell das Thema Passwörter nicht unterschätzen, aber selbst wenn man ein Passwort verliert: Das Leben auf dem Planeten, so wie wir es kennen, wird sich nicht signifikant ändern. Zumindest nicht deshalb. Versprochen!


Dokumente mit AnythingLLM und Ollama verarbeiten

Wir haben bereits mit GPT4all eine Anleitung, wie man ein eigenes lokales LLM betreiben kann. Leider gibt es bei der vorangegangenen Lösung eine kleine Einschränkung. Es können keine Dokumente wie PDF verarbeitet werden. In diesem neuen Workshop installieren wir AnythingLLM mit Ollama um Dokumente analysieren zu können.

Auch für diesen Workshop gilt als Mindestvoraussetzung ein Computer mit 16 GB RAM auf dem optimalerweise ein Linux (Mint, Ubuntu oder Debian) installiert ist. Mit einigen Anpassungen kann diese Anleitung auf Windows und Apple Computer ebenfalls durchgeführt werden. Je geringer die Hardwareressourcen sind, um so länger dauern die Antwortzeiten.

Beginnen wir auch gleich mit dem ersten Schritt und installieren Ollama. Dazu öffnen wir die Bash und benötigen folgendes Kommando: sudo curl -fsSL https://ollama.com/install.sh | sh. Der Befehl bewirkt, das Ollama heruntergeladen wird und das Installationsscript ausgeführt wird. Damit die Installation auch beginnt, muss noch das Administratorkennwort eingegeben werden. Ollama ist ein Kommandozeilenprogramm, das über die Konsole gesteuert wird. Nach erfolgreicher Installation muss noch ein Sprachmodell geladen werden. Auf der Internetseite https://ollama.com/search sind entsprechende Modelle zu finden.

Bewährte Sprachmodelle sind:

  • lama 3.1 8B: Leistungsstark für anspruchsvollere Anwendungen.
  • Phi-3-5 3B: Gut geeignet für logisches Denken und Mehrsprachigkeit.
  • Llama 3.3 2B: Effizient für Anwendungen mit begrenzten Ressourcen.
  • Phi 4 14B: State-of-the-art Modell mit erhöhter Hardware-Anforderung aber Leistung vergleichbar mit deutlich größeren Modellen.

Nachdem man sich für ein Sprachmodell entschieden hat, kann man den entsprechenden Befehl aus der Übersicht kopieren und in das Terminal eingeben. Für unser Beispiel soll das zu Demonstrationszwecken DeepSeek R1 sein.


Wie im Screenshot zu sehen ist lautet der entsprechende Befehl, den wir benötigen, um das Modell lokal in Ollama zu installieren: ollama run deepseek-r1. Die Installation des Sprachmodells kann ein wenig Zeit in Anspruch nehmen, Das hängt von der Internetverbindung und der Geschwindigkeit des Rechners ab. Nachdem das Modell lokal in Ollama installiert wurde, können wir das Terminal wieder schließen und zum nächsten Schritt übergehen, der Installation von AnythingLLM

Die Installation von AnythingLLm erfolgt ganz analog zu der Installation von Ollama. Dazu öffen wir das Terminal und geben folgenden Befehl ein: curl -fsSL https://cdn.anythingllm.com/latest/installer.sh | sh. Wenn die Installation abgeschlossen ist, können wir in das Installationsverzeichnis wechseln, welches in der Regel /home/<user>/AnythingLLMDesktop ist. Dort navigieren wir zum Link start und machen diese ausführbar (rechtsklick und Eigenschaften auswählen) und erstellen noch zusätzlich eine Verknüpfung auf dem Desktop. Nun können wir AnythingLLM bequem vom Desktop aus starten, was wir auch gleich tun.

Nachdem wir den Workspace festgelegt haben, können wir Anything nun mit Ollama verknüpfen. Dazu gehen wir auf das kleine Schraubenschlüssel Icon (Einstellungen) im linken unteren Bereich. Dort wählen wir den Eintrag LLM und wählen Ollama aus. Nun können wir das für Ollama hinterlegte Sprachmodell auswählen. Jetzt speichern wir unsere Einstellung ab. Nun kann man in den Chatmodus wechseln. Es besteht natürlich jederzeit die Möglichkeit, das Sprachmodell zu wechseln. Im Gegensatz zu vorhergehenden Workshop können wir jetzt PDF Dokumente hochladen und zum Inhalt Fragen stellen. Viel Spaß damit.


Künstliche Intelligenz GPD4all unter Linux installieren

Künstliche Intelligenz ist ein sehr breites Feld, in dem man schnell den Überblick verlieren kann. Large Language Models (LLM), wie ChatGPD verarbeiten natürliche Sprache und können je nach Datenbasis verschiedene Probleme lösen. Neben netten Unterhaltungen, die durchaus therapeutischen Charakter haben können, kann man mit LLM durchaus komplexe Aufgaben bewältigen. Ein solches Szenario wäre das Verfassen von behördlichen Schreiben. In diesem Artikel gehen wir nicht darauf ein, wie Sie die KI nutzen können, sondern erklären Ihnen, wie Sie Ihre eigene KI auf Ihrem Computer lokal installieren können.

Bevor wir ans Eingemachte gehen, beantworten wir die Frage, wozu das Ganze überhaupt nütze ist. Man kann ja problemlos auf die zum Teil kostenlos online verfügbaren KI Systeme zurückgreifen.

Was vielen Menschen nicht bewusst ist, ist die Tatsache, dass alle Anfragen, die man an ChatGPT, DeepSeek und Co. sendet, protokolliert und dauerhaft gespeichert werden. Wie diese Protokollierung im Detail aussieht, können wir nicht beantworten, aber IP Adresse und Nutzeraccount mit der Prompt Anfrage dürften sicherlich zu den minimal erhobenen Daten gehören. Hat man indessen seine eigene KI auf dem lokalen Computer installiert, werden diese Informationen nicht ins Internet übertragen. Zudem kann man so oft man möchte mit der KI interagieren, ohne dass Gebühren erhoben werden.

Für unser Projekt, eine eigene künstliche Intelligenz auf dem eigenen Linux Rechner zu installieren, benötigen wir keine ausgefallene Hardware. Ein handelsüblicher Rechner reicht durchaus. Wie zuvor erwähnt: Als Betriebssystem verwenden wir Linux, da dies viel ressourcenschonender als Windows 10 oder Windows 11 ist. Für den Workshop kann jedes beliebige von Debian abgeleitetes Linux verwendet werden. Debian Derivate sind zum Beispiel Ubuntu und Linux Mint.

Als Arbeitsspeicher sollten mindestens 16 GB (RAM) vorhanden sein. Wer mehr RAM hat, umso besser. Dann läuft die KI viel flüssiger. Als Prozessor (CPU) sollte mindestens ein aktueller i5 / i7 oder AMD Ryzen 5+ verbaut sein. Wenn dann noch eine SSD mit 1 TB Speicher vorhanden ist haben wir das notwendige Setup komplett. Computer / Laptops mit dieser Spezifikation bekommt man schon für kleines Geld gebraucht. Ohne zu viel Werbung machen zu wollen, kann man sich ein wenig bei den gebrauchten Lenovo ThinkPad Laptops umschauen. Aber auch andere Hersteller mit den Mindestanforderungen zur Hardware leisten gute Dienste.

Nachdem die notwendigen Voraussetzungen geklärt sind, machen wir uns zuerst daran, GPT4all auf unserem Rechner zu installieren. Keine Sorge, das ist auch für Anfänger recht leicht zu bewerkstelligen. Es ist kein besonderes Vorwissen notwendig. Beginnen wir damit, die Datei gpd4all.run von der Homepage (https://gpt4all.io/index.html?ref=top-ai-list) herunterzuladen. Ist dies erledigt, machen wir uns daran, die Datei ausführbar (exikutierbar) zu machen.

Wie im Screenshot zu sehen ist, selektieren wir die heruntergeladene Datei mit einem rechts Klick und wählen in dem Menü den Eintrag Eigenschaften aus. Unter dem Reiter Zugriffsrechte setzen wir dann das Häkchen bei Ausführen. Nun kann man die Datei mit dem gewohnten Doppelklick starten, was wir auch sofort tun.

Nun beginnt der Installationsprozess, wo wir unter anderem auswählen können, an welchem Ort GPT4all installiert wird. Bei Linux kommen selbst installierte Programme in der Regel in das Verzeichnis /opt.

Im nächsten Schritt können wir noch eine Desktop-Verknüpfung anlegen. Dazu klicken wir mit der rechten Maustaste in den leeren Desktop und wählen Verknüpfung erstellen. In der aufpoppenden Maske tragen wir nun einen Namen für die Verknüpfung ein z. B. GPT 4 all und setzen den Pfad zur ausführbaren Datei bin/chat und bestätigen mit OK. Nun können wir GPT4all bequem von unserem Desktop aus starten.

Damit GPT4all auch funktioniert, muss ein Modell geladen werden. Wie in den Screenshots zu sehen ist, stehen verschiedene Modelle zur Verfügung. Das Modell muss bei jedem Start des Programms erneut ausgewählt werden. Nun kann die KI lokal auf dem eigenen Rechner genutzt werden.

Bildstrecke:

Andere KI Systeme sind unter anderem:

Abonnement / Subscription

[English] This content is only available to subscribers.

[Deutsch] Diese Inhalte sind nur für Abonnenten verfügbar.

Privatsphäre mit Kodachi Linux im Internet zurückgewinnen

Windows 11 integriert eine ominöse History-Funktion, bei der sämtliche Interaktionen mit dem Computer aufgezeichnet und aller Wahrscheinlichkeit per Telemetrie an Microsoft übertragen werden. Aber auch die unzähligen durch die EU beschlossenen und von Deutschland umgesetzten Gesetze zur Überwachung der Bürger geben vielen Anlass, über das Thema Datenschutz und Privatsphäre neu nachzudenken. Unsere Welt ist stetig im Wandel und die digitale Welt verändert sich um einiges schneller. Es liegt an jedem Einzelnen, wie er oder sie mit diesen Veränderungen umgehen möchte. Dieser Artikel soll dazu anregen, sich ein wenig mehr mit Linux und Sicherheit zu beschäftigen. Vielleicht bekommen Sie ja auch gleich Lust, das hier vorgestellte Kodachi Linux einmal selbst auszuprobieren. Es gibt mehrere Wege, wie Sie Kodachi Linux ausprobieren können.

  1. Virtuelle Maschine: Erstellen Sie einfach mit der ISO‑Datei und dem Programm VirtualBox oder VMWare eine Virtuelle Maschine mit Kodachi Linux. Diese virtuellen Maschinen können Sie auch von einem Windows-Rechner aus erstellen und verwenden.
  2. Booten vom USB-Stick: Tools wie Disks (Linux) oder Rufus (Windows) erlauben es, bootfähige USB‑Sticks zu erstellen. Auf diese Art und Weise können Sie Ihren PC direkt von USB mit Kodachi starten, ohne dass das auf der Festplatte installierte Betriebssystem davon beeinflusst wird.
  3. Native Installation: Sie können den bootfähigen USB-Stick auch dazu verwenden, Kodachi Linux dauerhaft auf Ihrem Computer zu installieren. Diese Methode ist dann zu empfehlen, wenn Sie bereits Erfahrungen mit Kodachi gesammelt haben.

Kodachi OS ist, wie der Name schon vermuten lässt, eine japanische Linux-Distribution mit einem angepassten XFCE Desktop. Kodachi sind eigentlich klassische japanische Samurai-Schwerter, was bereits einen Bezug auf das Thema Sicherheit hinleitet. Kodachi OS selbst ist ein Xubuntu Derivat und somit ein Enkel von Ubuntu und ein Urenkel von Debian Linux. Kodachi Linux bietet eine hoch-sichere, anti-forensische und anonyme Computerumgebung. Es wurde mit Blick auf eine sichere Privatsphäre konzipiert. Alle notwendigen Funktionen, um Vertraulichkeit und Sicherheit der Benutzer zu gewährleisten, sind enthalten. Kodachi ist benutzerfreundlich und eignet sich auch für Linux-Neulinge und Windows-Umsteiger. Zu Testzwecken können Sie das System von einem USB-Stick starten und Sie haben ein voll funktionsfähiges Betriebssystem mit:

  • automatisch etablierte VPN Verbindung
  • vorkonfigurierte TOR Verbindung
  • laufendem DNSCrypt Dienst

Die aktuelle Version von Kodachi kann kostenfrei auf der Homepage [1] heruntergeladen werden. Mit der heruntergeladenen ISO können sie nun entweder eine bootfähigen USB Stick erstellen oder Kodachi in eine Virtuelle Maschine installieren. Wir haben uns für die Variante mit VMWare eine virtuelle Maschine zu erstellen entschieden.

Die Installation ist dank dem VM Ware Ubuntu Template in wenigen Minuten erledigt. Für unseren Test haben wir der VM 20 GB Festplattenspeicher spendiert. Damit das ganze füssig läuft haben wir den RAM auf 8 GB angehoben. Wer nicht so viel RAM zu Verfügung hat kann auch mit 4 GB arbeiten. Nach dem Start der VM sehen Sie das Kodachi OS Desktop wie im untenstehende Screenshot in der Version 8.27. Für alle Linux Nerds sei noch erwähnt das diese Version den Kernel 6.2 verwendet. Laut der Homepage wird bereits fleißig an der neuen Version 9 gearbeitet.

Da die Installation auch für Anfänger möglichst einfach gehalten ist, wurden bereits Benutzerkonten eingerichtet. Der Benutzer lautet kodachi und hat das Passwort r@@t00 (00 sind Nullen). Der Administrator-Account heißt wie unter Linux üblich root und hat ebenfalls das Passwort r@@t00. Wer sich dafür entscheidet, Kodachi fest auf seiner Maschine zu installieren, sollte mindestens die Passwörter ändern.



Eine möglichst hohe Anonymität erreicht man leider nur auf Kosten der Surfgeschwindigkeit. Kodachi Linux bietet daher für unterschiedliche Anforderungen mehrere Profile, zwischen denen gewählt werden kann.

  1. Maximale Anonymität (langsamer)
    • ISP → Router VPN → Kodachi VPN (VM NAT) → Torified System → Tor DNS → Kodachi geladener Browser
  2. Hoch anonym (langsam)
    • ISP → Kodachi VPN → TOR-Endpunkt → Tor DNS → Kodachi geladener Browser
  3. Anonym & Schnell
    • ISP → Kodachi VPN → TOR-Endpunkt → Tor DNS → Kodachi lite Browser
  4. Mäßige Anonymität
    • ISP → Kodachi VPN mit erzwungenem VPN-Verkehr → Tor DNS → Kodachi geladener Browser
  5. Standard Anonymität
    • ISP → Kodachi VPN → Torified System → Tor DNS → Kodachi geladener Browser
  6. Verbesserte Anonymität mit Double TOR
    • ISP → Kodachi VPN mit erzwungenem VPN-Verkehr → Tor-Browser → Tor-Browser
  7. Double TOR Alternative
    • ISP → Kodachi VPN → Tor-Browser → Tor-Browser → Tor DNS
  8. Hochsicheres Setup
    • ISP → Host-Maschine (XMR VPN) → Kodachi VPN (VM) mit erzwungenem VPN-Verkehr → Kodachi-Browser → Dnscrypt
  9. Sicher und schnell
    • ISP → Kodachi VPN mit erzwungenem VPN-Verkehr → Kodachi geladener Browser → Dnscrypt
  10. Erhöhte Sicherheit
    • ISP → Kodachi VPN mit erzwungenem VPN-Verkehr → Kodachi geladener Browser → Tor DNS
  11. Hochgeschwindigkeit und Sicherheit
    • ISP → Kodachi VPN mit erzwungenem VPN-Verkehr → Kodachi lite Browser → Tor DNS
  12. Doppelsicherung mit Dnscrypt
    • ISP → Kodachi VPN mit erzwungenem VPN-Verkehr → Tor-Browser → Dnscrypt
  13. Doppelsicherung mit Tor DNS
    • ISP → Kodachi VPN mit erzwungenem VPN-Verkehr → Tor-Browser → Tor DNS

Kommen wir nun zur Bedienung von Kodachi. Dazu rufen wir das Dashboard auf, das wir auf dem Desktop als Verknüpfung finden. Nach dem Start sehen wir verschiedene Reiter wie VPN, TOR und Settings. Unter Settings haben wir die Möglichkeit, mehrere Profile zu aktivieren, die für Sicherheit und Datenschutz im Internet relevant sind. Wie im unten stehenden Screenshot zu sehen ist, wählen wir Level 1 aus und aktivieren das Profil.

Im unteren Panel finden sich im Abschnitt Security Services verschiedene Dienste wie beispielsweise GnuNet, die sich zuschalten lassen. Hier gibt es mehrere Optionen, die problemlos ausprobiert werden können. GnuNet leitet etwa den gesamten Traffic ins TOR-Netzwerk um. Das hat natürlich zur Folge, dass die Seiten länger brauchen, bis sie vollständig geladen werden.

Mit den Bordmitteln von Kodachi Linux können Sie Ihre Sicherheit und Anonymität beim Surfen im Internet erheblich verbessern. Auch wenn die Benutzung am Anfang etwas ungewöhnlich ist, findet man sich schnell hinein. Wenn Sie sich für die Verwendung als Live-System oder virtuelle Maschine entscheiden, können Sie sich problemlos mit den verschiedenen Programmen und Einstellungen vertraut machen, ohne das Gastbetriebssystem zu beschädigen. Gerade als Anfänger nimmt die Benutzung einer VM die Angst, beim Ausprobieren der verschiedenen Konfigurationen etwas kaputtzumachen.

Wer sich ein wenig zu Kodachi Linux im Internet umschaut, findet auch schnell einen Artikel [2] aus 2021, der sich durchaus kritisch zu Kodachi äußert. Die Hauptkritik bezieht sich darauf, dass Kodachi eher als Ubuntu Distro mit einem angepassten Look and Feel zu betrachten ist, das mit ein paar Shell Scripten aufgepeppt ist, als ein eigenständiges Linux. So ganz von der Hand zu weisen ist diese Kritik nicht. Wer sich etwas genauer mit der Kritik beschäftigt, stellt fest, dass Kadochi durchaus einige praktische Anonymisierungs-Features aufweist. Dennoch ist es wohl weit davon entfernt, eine sogenannte Hackers Toolbox zu sein. Der Autor der Kritik hat sich 2025 [3] Kadochi noch einmal vorgenommen und hat auch für die aktuelle Version kein anderes Fazit als bereits 2021. Ob die anstehende Version 9 des Kadochi Linux sich die angemerkten Punkte zu Herzen nimmt, bleibt abzuwarten.

Resources

Abonnement / Subscription

[English] This content is only available to subscribers.

[Deutsch] Diese Inhalte sind nur für Abonnenten verfügbar.

Nativen Git Server unter Linux aufsetzen

Wer sein Git-Repository zur gemeinsamen Bearbeitung für Quelltexte benutzen möchte, benötigt einen Git-Server. Der Git Server ermöglicht die Kollaboration mehrere Entwickler auf der gleichen Codebasis. Die Installation des Git-Clients auf einem Linux Server ist zwar ein erster Schritt zur eigenen Serverlösung, aber bei Weitem nicht ausreichend. Um den Zugriff mehrere Personen auf ein Code Repository zu ermöglichen, benötigen wir eine Zugriffsberechtigung. Schließlich soll das Repository öffentlich über das Internet erreichbar sein. Wir möchten über die Benutzerverwaltung verhindern, dass unberechtigte Personen den Inhalt der Repositories lesen und verändern können.

Für den Betrieb eines Git-Servers gibt es viele hervorragende und komfortable Lösungen, die man einer nativen Serverlösung vorziehen sollte. Die Administration eines nativen Git Servers erfordert Linux Kenntnisse und wird ausschließlich über die Kommandozeile bewerkstelligt. Lösungen wie beispielsweise der SCM-Manager haben eine grafische Benutzeroberfläche und bringen viele nützliche Werkzeuge zur Administration des Servers mit. Diese Werkzeuge stehen bei einer nativen Installation nicht zur Verfügung.

Wieso sollte man nun Git als nativen Server installieren? Diese Frage lässt sich recht leicht beantworten. Der Grund ist wenn der Server, auf dem das Code Repository bereitgestellt werden soll, nur wenige Hardware-Ressourcen besitzt. Besonders der Arbeitsspeicher ist in diesem Zusammenhang immer ein wenig problematisch. Gerade bei angemieteten Virtuellen Private Servern (VPS) oder einem kleinen RaspberryPI ist das oft der Fall. Wir sehen also, es kann durchaus Sinn ergeben, einen nativen Git Server betreiben zu wollen.

Als Voraussetzung benötigen wir einen Linux-Server, auf dem wir den Git-Server installieren können. Das kann ein Debian oder Ubuntu Server sein. Wer CentOS oder andere Linux Distributionen verwendet, muss anstatt APT zur Softwareinstallation den Paketmanager seiner Distribution nutzen.

Wir beginnen im ersten Schritt mit der Aktualisierung der Pakete und der Installation des Git-Clients.

sudo apt-get update
sudo apt-get upgrade 
sudo apt-get install git


Als zweiten Schritt erstellen wir einen neuen Benutzer mit dem Namen git und legen für diesen ein eigenes home Verzeichnis an und aktivieren dort den SSH-Zugriff.

sudo useradd --create-home --shell /bin/bash git
sudo su - git
cd /home/git/
mkdir .ssh/ && chmod 700 .ssh/ 
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys


Nun können wir im dritten Schritt in dem neu angelegten home Verzeichnis des git Users unsere Git-Repositories erstellen. Diese unterscheiden sich gegenüber dem lokalen Arbeitsbereich darin, dass diese den Source Code nicht ausgecheckt haben.

mkdir /home/git/repos/project.git 
cd /home/git/repos/project.git
git init --bare


Leider sind wir noch nicht ganz fertig mit unserem Vorhaben. Im vierten Schritt müssen wir die Benutzerberechtigung für das erstellte Repository setzen. Dies geschieht durch das Ablegen des öffentlichen Schlüssels auf dem Git Server für den SSH-Zugriff. Dazu kopieren wir den Inhalt aus der Datei unseres privaten Schlüssels in die Datei /home/git/.ssh/authorized_keys in eine eigene Zeile. Möchte man nun vorhandenen Nutzern den Zugriff verwehren, kommentiert man lediglich mit einem # die zeie des privaten Schlüssels wieder aus.

Wenn alles korrekt durchgeführt wurde, erhält man den Zugriff auf das Repository über folgenden Kommandozeilenbefehl: git clone ssh://git@<IP>/~/<repo>

Dabei ist <IP> durch die tatsächliche Server-IP zu ersetzen. Für unser Beispiel lautet der korrekte Pfad für <repo> project.git es ist also das von uns erstellte Verzeichnis für das Git-Repository.

Auf dem nativen Git Server können mehrere Repositories angelegt werden. Dabei gilt zu beachten, dass alle berechtigenden Nutzer auf alle so angelegenen Reposiories lesenden und schreibenden Zugriff haben. Das lässt sich nur dadurch einschränken, dass auf dem Linux-Server der unsere Git-Repositories bereitstellt, mehrere Benutzer auf dem Betriebssystem angelegt werden, denen dann die Repositories zugewiesen werden.

Wir sehen, dass eine native Git Server Installation zwar schnell umgesetzt werden kann, diese aber für die kommerzielle Softwareentwicklung nicht ausreichend ist. Wer gerne experimentiert, kann sich eine virtuelle Maschine erstellen und diesen Workshop darin ausprobieren.