UP | HOME

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:

  1. Automatisches übergeben von Flags und Optionen (wenn ich gdb schreibe wird automatisch der -q Flag übergeben, mit dem der Copyright-Banner unterdrückt wird) das vg mit valgrind 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)

astral-ssh.jpg

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

Für viele am einfachsten und intuitiv zu bedienen. Fast jede Desktop-Umgebung hat ihren eigenen. Populäre Beispiele sind Gedit (für GNOME), KWrite (für KDE/Plasma) oder Mousepad (für XFCE). Von dieses würde ich Gedit empfehlen. Man kann Gedit auch von der Konsole aus starten mit dem Befehl gedit.

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

Autor: Philip Kaludercic

Email: philip.kaludercic@fau.de

Created: 2023-11-01 Wed 12:52

Emacs 30.0.50 (Org mode 9.6.10)

Validate