Tipps zur Einrichten einer Arbeitsumgebung
Inhaltsverzeichnis
SP ist eine hervorragende Gelegenheit mit verschiedenen Arbeitsweisen und Werkzeugen zu experimentieren, welche kritisch für Informatik und Informatik-nahe Fächer sind. Das Beherrschen seiner Arbeitsumgebung ist eine Investition welche sich immer Lohnt.
1. Hillfreiche .bashrc
Die .bashrc
Datei befindet sich im „Home“ Verzeichniss jedes
Nutzers, und enthält Befehle welche ausgeführt werden, bevor die
standard Shell (namens Bash) gestartet wird.
Da die Shell ein zentraler Bestandteil von SP ist (und vielen anderen Veranstaltungen an der Uni), ist es zum Vorteil jedes Studenten in der Lage zu sein, diese seinen/ihren Bedürfnissen anzupassen.
# Kopiere den Inhalt in .bashrc im Home Verzeichnis. # # Exitiert diese Datei bereits kann man den Inhalt an das Ende der # Datei anfügen. export EDITOR=nano # oder besser export PATH=$HOME/.local/bin:$PATH alias gdb="gdb -q" alias ls='ls -Fh' goto() { if [ -z "$1" ] then echo "Usage: goto [directory]" 2>&1 return fi case "$1" in sp) cd /proj/i4sp1 ;; tmp) cd /var/tmp/ ;; *) echo "No match" >&2 ;; esac } stty -ixon >/dev/null 2>&1 || true
Was dieses bewirkt, wird im Folgenden erklärt:
1.1. Umgebungsvariablen
export EDITOR=nano # oder besser
Mit der export
Anweisung, können Umgebungsvariablen deklariert
werden. Diese können entweder in der Shell benutzt werden (per
Dollar-Zeichen) oder an Unterprozesse übergeben werden.
Die Variable EDITOR
wird bspw. von git commit
benutzt, wenn es
den Nutzer eine Commit Nachricht bearbeiten lassen will. Bevorzugt ihr
einen anderen Texteditor, schreibt ihr hier einfach dessen Namen nach
dem =
hin.
Hier wird der Editor GNU Nano wird als standard Editor ausgewählt.
1.2. Der Programm-Pfad
export PATH=$HOME/.local/bin:$PATH
Hier wird eine weitere Umgebungsvariable gesetzt. Die Variable PATH
ist aber signifikant, da die Shell diese benutzt um nach Befehlen
zu suchen.
Um ein beliebiges Programm zu starten, muss gewöhnlich der gesamte
Pfad zur ausführbaren Datei angegeben werden: Kompiliert ihr eine C
Datei in a.out
, muss der Shell explizit gesagt werden, dass diese
Datei ausgeführt werden soll
$ ./a.out
Die Skripte zum verwalten von Aufgaben, müssen meistens mit einem absoluten Pfad:
$ /proj/i4sp1/bin/get-deadline
Jedoch ist diese nicht notwendig für Programme wie ls
, gcc
,
etc. welche auch mit „ganzen Namen“ angesprochen werden könnten:
$ /usr/bin/ls
Der Grund dafür ist, dass das Verzeichnis /usr/bin
im „Pfad“ liegt:
Die Shell schaut ob es in allen Dateien im Pfad eine Datei ls
gibt. Dieser Pfad wird in der zuvor erwähnten Umgebungsvariable PATH
gespeichert, und kann wie folgt aussehen:
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Dabei ist jedes Verzeichnis, in dem gesucht werden soll, durch einen
:
getrennt.
Allgemein, können wird den „Pfad“ durch die rekursive Zuweisung
export PATH=(Füge hier ein Verzichnis ein):$PATH
erweitern.
1.3. Shell-Aliase
alias gdb="gdb -q" alias ls='ls -Fh' alias vg=valgrind
Die einfachste Möglichkeit für einen Benutzer neue Befehle zu deklarieren, ist mittels Aliase.
Im wesentlichen sind diese kurze Anweisungen welche komplexe Befehle über einfachere Befehle definieren. Die Hauptverwendungszwecke sind:
- Automatisches übergeben von Flags und Optionen (wenn ich
gdb
schreibe wird automatisch der-q
Flag übergeben, mit dem der Copyright-Banner unterdrückt wird) dasvg
mitvalgrind
ersetzt)
Sollte man jedoch einen alias „ignorieren“ wollen, kann man ein \
am
Anfang der Zeile hinzufügen, womit das Programm ohne
Alias-Substitution aufgerufen wird.
Aliase greifen nur auf den Befehlsnahmen, und können keine Argumente ersetzen.
1.4. Shell-Funktionen
goto() { if [ -z "$1" ] then echo "Usage: goto [directory]" 2>&1 return fi case "$1" in sp) cd /proj/i4sp1 ;; tmp) cd /var/tmp/ ;; *) echo "No match" >&2 ;; esac }
Die nächste Variante die Shell zu erweitern, ist mit eigenen Funktionen. Diese unterscheiden sich zu eigenen Programmen, da die Befehle in der Shell selbst ausgeführt werden, statt in Unterprozessen. Daher können sie die Shell beeinflussen.
In diesem Fall wird dieses dafür ausgenutzt, um den Befehl cd
aufzurufen, mit dem die Working Directory der Shell verändert wird:
Im wesentlichen führt dieser Befehl ein Switch-Case auf dem ersten
Argument von goto
aus, und führt die Befehle eines passenden Zweigs
aus.
Gibt daher der Benutzer
$ goto sp
ein, schaut die Funktion welcher Fall wie sp
aussieht, und führt in
diesem Fall
cd /proj/i4sp1
1.5. Terminal-Optionen
stty -ixon >/dev/null 2>&1 || true
Die genaue Funktionsweise dieses Befehls ist weniger wichtig, das wesentliche ist, dass damit der Nutzer verhindert, dass dein Terminal(-Emulator) ausersehenen gesperrt wird, und nichts anzeigt.
Dieses Verhalten ist eine historische Eigenartigkeit, was aktiviert
wird durch das drücken der Tastenkombination „Ctrl-S“, und entsperrt
mittels „Ctrl-Q“. Mit dem stty
Befehl wird dieses ganz deaktiviert.
2. Shell-Scripting
Neben Shell-Aliasen und Shell-Funktionen ist eines der besten Möglichkeiten seine Arbeitsumgebung zu erweitern, eigene Programme zu schreiben.
Da in SP bereits beigebracht wird, wie dieses mit C gemacht werden kann, möchte ich hier eine andere Methode vorstellen: Shell-Scripting.
Ein Shell-Script ist eine Datei mit einer Folge von meist nicht-interaktiven Anweisungen. Hier ein Beispiel (verkürztes Beispiel):
#!/bin/sh valgrind --leak-check=yes --track-origins=yes "$@"
Speichere ich diesen Inhalt in eine Datei, sagen wir memcheck
und
markieren diese Datei als ausführbar:
$ chmod +x memcheck
kann ich genau wie mit einem binären Programm
$ ./memcheck ./lilo
ausführen.
Hier ein anderes Beispiel, das etwas komplizierter Shell-Konstrukte benutzt um ein einfaches „Pastebin“ Programm zu implementieren via Curl.
Ich empfehle ein eigenes „Binary Verzeichnis“ zu erstellen
mkdir ~/.local/bin
und dieses in seinen Pfad hinzuzufügen
export PATH=~/.local/bin:$PATH
Hier kann man eigene Skripte und Programme aufbewahren, oder sogar mit seinen Freunden und Kommilitonen teilen – insofern ihr ihnen Vertrauen könnt.
Der Grund weshalb ich diese Beispiele hier nenne, ist um eine Mentalität zu demonstrieren, indem man als Nutzer sich nicht seiner Umgebung ausgesetzt fühlt, die willkürlichen Nachteile und Probleme widerwillig hinnimmt, sondern selbst eine aktive Rolle einnimmt.
Die Unix-Shell ist eines der am weitesten verbreiteten „Programmierbare Programmierumgebungen“. Es gibt keine wirkliche Grenze zwischen dem gewöhnlichen Nutzer und Programmierer, wie dieses mit klassischen, graphischen Oberflächen populärer Betriebssysteme vorgetäuscht wird.
Mit diesen Grundlagen kann man die ersten Schritte zu einem besseren, direkterem und angenehmeren Verhältnis zu dem Rechner vor einem – oder dem Chaos das *nix-Systeme manchmal darstellen könne.
3. SSH (Secure Shell)
SSH ist ein Protokoll um verschlüsselt auf andere Rechner zuzugreifen. Mit einem SSH Client verbindet man sich zu einem anderen Rechner auf dem ein SSH Server läuft. Dieser andere Rechner kann ein Server, ein beliebiger Rechner im CIP-Pool oder eine andere Maschine in eurem Heim-Netzwerk sein.
Hauptsächlich wird SSH dazu benutzt, um eine Shell-Session zu übertragen, aber man kann auch Dateien oder Graphische Anwendungen benutzen.
3.1. SSH Clients
Je nach Platform muss man anders mit SSH arbeiten. Hier ein paar Möglichkeiten:
- Auf Windows kann Putty benutzt werden, wofür keine weitere
Software notwendig ist. Ihr bekommt hiermit zunächst nur eine
Konsole, daher empfiehlt sich das, falls ihr euch entweder auf
diese Arbeitsweise einschränken wollt oder könnt. Es ist möglich
„X11-Forwarding“ einzurichten, um graphische Programme lokal zu
benutzen. Mit
pscp
können Dateien zwischen eurem und dem CIP System kopiert werden. - Mittels des Windows Subsystem for Linux, können Windows Nutzer eine Linux-Artige Umgebung benutzen, ohne gesonderte virtuelle Maschine. Meines Wissens nach, sollte dieses alles Enthalten was man für SP bracht, daher gilt der nächste Punkt:
- Unixoide Systeme (Linux, macOS, *BSD) sollten entweder bereits ein SSH
Client installiert haben. Falls nicht, kann eines einfach installiert
werden (Pakete für Debian/Ubuntu:
openssh-client
, Fedora/RedHat:openssh-clients
) - Mittels X-Forwarding können graphische Anwendungen über das Netzwerk benutzt werden, was aber öfters langsam sein kann. Als alternative kann Xpra benutzt werden. Eine Anleitung im FSI-Forum erklärt wie. Vergesst nicht die „ab12cdef“ durch euren Namen zu ersetzen.
- Bei nicht-stabilen Verbindungen könnte der Mosh (Mobile Shell) client hilfreich sein, da dieser in der Lage ist mit schlechten Verbinungen klar zukommen.
3.2. SSH Config (OpenSSH Client)
Wer sich einfach und schnell an das CIP system binden will, kann dieses mit SSH machen. Zwei Tricks helfen einem dabei dieses einfacher und schneller zu machen.
3.2.1. Public Keys
Anstatt jedes mal ein Passwort eingeben zu müssen, kann man mit SSH-Schlüssel sich automatisch authentifizieren.
Benutzt man OpenSSH, was auf den meisten Linux Distributionen der Fall ist, kann man so einen eigenen Schlüssel generieren und hochladen:
$ ssh-keygen -t ed25519 $ ssh-copy-id be15spil@cip2a7.cip.cs.fau.de
Wo be15spil
durch eure jeweilige CIP Kennung ersetzt wird.
Der Befehl ssh-keygen
erstellt eine Schüssel-Paar. Man wird als
erstes gefragt, wo die Schlüssel gespeichert werden sollen (die
Defaultwerte passen, also kann man einfach RETURN drücken).
Danach wird man nach einem „Passphrase“ gefragt. Dieses sollte nicht euer CIP-Passwort sein, sondern ist ein eigenes Passwort, um eure Schlüssel benutzen zu können, welche nie übertragen werden sollten.
Ist dieser Erfolgt, kopiert ssh-copy-id
eine Kopie des öffentlichen
Schlüssels in euren CIP Account. Der SSH Server sollte nun in euch
mittels eures Schlüsselpaares ausweisen zu können.
Sollte dieses nicht Funktionieren, da ssh-copy-id
nicht verfügbar
ist, kann man selber den Schlüssel Kopieren. Angenommen eure „Public
Key“ liegt in ~/.ssh/id_ed25519.pub
, dann sollten diese Befehle
ssh-copy-id
ersetzten:
$ scp ~/.ssh/id_ed25519.pub be15spil@cip2a7.cip.cs.fau.de $ ssh be15spil@cip2a7.cip.cs.fau.de Password: ********** cip2a7 $ mkdir -p ~/.ssh cip2a7 $ cat id_ed25519.pub >> ~/.ssh/authorized_keys cip2a7 $ chmod 600 ~/.ssh/* cip2a7 $ chmod 700 ~/.ssh/ cip2a7 $ rm id_ed25519.pub cip2a7 $ exit
Es ist darauf hinzuweisen, dass mit anderen SSH Clients diese Anweisungen nicht unbedingt direkt kopiert werden können. Man sollte in den jeweiligen Benutzeranleitungen nachschauen wie dieses geht.
SSH Keys können auch auf den GitLab server hochgeladen werden, und
dann dazu benutzt werden über SSH zu kommunizieren. Dieses hat den
Vorteil, dass man dann nicht mehr Benutzername und Passwort setzen
muss. Die GitLab Dokumentation hat eine Anleitung dazu, wie man ein
SSH Key zu seinem Account hinzufügen kann. Achtet in den Fall darauf,
immer eine URL der Form git@gitlab.cs.fau.de:...
an git clone
zu
übergeben, anstatt https://gitlab.cs.fau.de/...
.
3.2.2. SSH Host
Will man sich nicht die langen Namen der CIP Rechner merken, kann man sich lokal Spitznamen für SSH Server konfigurieren.
Hierzu bearbeitet man die Datei ~/.ssh/config
, und fügt etwas dieser
Art ein:
Host uni # main remote server HostName cipterm0.cip.cs.fau.de User [benutzername]
Jetzt braucht ihr nur noch ssh uni
eingeben, wenn ihr euch an
den Rechner verbinden wollt.
Für weitere Optionen, kann man die ssh_config
man-page durchlesen.
4. Texteditoren
Jedem Studenten steht die Freiheit zu, den Text-Editor seiner Wahl zu benutzen. Keine Aufgabe nimmt an, dass spezifische Software benutzt wird (mit der Ausnahme von Git).
Dieses heißt nicht, dass der Texteditor irrelevant ist — im Gegenteil: Seinen Editor zu beherrschen und verstehen macht den Unterschied zwischen der Selbstqual und Spaß aus.
Ich zähle daher hier eine liste von verschiedenen Arten von Text-Editoren auf, wie auch Konkrete Beispiele. Je nach Arbeitsweise und Affinität, kann man mit diesen Spielen und diese Ausprobieren, um da zu finden, was einem am besten passt:
4.1. Graphische Editor
4.2. Konsolen Editor
Es ist möglich innerhalb eine Konsole eine nicht-Zeilenorientierte Benutzeroberfläche zu benutzen (genannt TUI). Dieses wird gerne für Texteditoren benutzt, und ist zunächst weder besser noch schlechter als ihre graphischen Analoge. Über SSH, sind diese meist die einzige praktikabel Option.
Abgesehen von den nächsten beiden Familien, welche strenge genommen auch zu dieser Familie zählen, wäre GNU nano oder Micro. Dieses, wie fast alle Texteditoren dieser Art werden in der Shell gestartet wie folgt:
$ nano meine-datei
Andere Beispiele im CIP wären JOE, e3 oder JED, wobei ich diese für Anfänger nicht all zu empfehlenswert empfinde.
Für Esoteriker gibt es immer ed, den standard editor.
4.3. vi-Familie
Auf Unix-Systemen ist seit über 40 Jahren Familie der vi
(ausgesprochen „Wie-Ei“) bekannt und populär. Die kennzeichnende
Eigenschaft ist die des Modalen Arbeitens: Verschiedene Modi
interpretieren Tastendrücke anders, und ermöglichen somit effizientes
bearbeiten von Textdokumenten. Die zwei Hauptmodi sind der „Insert
Mode“, wo man wie gewöhnt schreibt, und der „Normal Mode“ in dem
Tastenkombination als Bearbeitungsbefehle interpretiert werden
(eg. wenn man dd
eingibt, wird eine Zeile gelöscht, ct$
löscht bis
zur Ende der Zeile und erwartet eine neue Eingabe, 2T(hmq%x`qx
die
zweite Klammer-stufe löscht.) Eine Übersicht der Befehle ist hier zu
finden.
Die populärste Implementierung ist Vim, sowie dessen Fork Neovim (nicht zu verwechseln mit dem klassischem nvi). Im CIP ist auch Vis installiert, welches verwandt mit dieser Familie von Texteditoren ist. Allgemein empfiehlt es sich eine Grund-Kompetenz mit vi anzueignen, da diese fast auf jedem System zu finden ist, oder wenn man eine schlechte Netzwerkverbindung hat.
4.4. Emacsen
Mit einer ebenso langen Tradition wie vi, sind verschiedene „Emacsen“, primär GNU Emacs auch auf allen Plattformen zu finden. Dieser Editor kennzeichnet sich durch immense Erweiterbarkeit aus. Im Gegensatz zu vi haben diese jedoch meist mehr eingebaute Funktionalitäten, und in nicht-Ersatz Emacs Varianten extrem erweiterbar. Da dieses mein bevorzugter Editor ist, stehe ich bei Fragen oder allgemeinem Interesse bereit!
4.5. IDEs und Lite-IDEs
Wer aus der Welt von Java gewöhnt ist an Automatische Vervollständigung von Symbolen, schnelle Diagnostikern und Quelltextnagivation könnte enttäuscht werden von der bisherigen Aufzählung (obwohl dieses nicht sein muss: Viele der bisher aufgezählten Programme können all dieses auch!). Dieses muss jedoch nicht sein — auch für C (bzw. meist C++) Entwickelung gibt es eine große Auswahl. Wer KDE/Plasma schon nutzt, könnte Kate interessant finden. Sowohl IntelliJ hat eine C Variante (diese ist jedoch Kostenpflichtig und nicht-Freie Software), und Eclipse kann um C-Funktionalitäten erweitert werden. Über das Module System (Abschnitt „Wie kann bekomme ich eine Liste der installierten Softwarepakete?“) kann auch [[https://vscodium.com/][VSCodiu