Programmierpraktikum Vorlesung 01 M.Sc. Laslo Hunhold 27. April 2020

Die Seite wird erstellt Haimo-Haio Peters
 
WEITER LESEN
Programmierpraktikum
                                         Vorlesung 01

                                   M.Sc. Laslo Hunhold

                      Department Mathematik/Informatik, Abteilung Informatik
                                      Universität zu Köln

                                        27. April 2020

M.Sc. Laslo Hunhold                Programmierpraktikum – Vorlesung 01         1
Benötigte Software
           I OpenJDK 11 (Java Development Kit)
           I UN*X-Kommandozeile
                      I Linux/BSD: Terminal und Paketverwaltung (apt, emerge, pkg_add,
                        . . . ), je nach Distribution
                      I macOS: Terminal.app unter „Dienstprogramme“, Paketverwaltung
                        mit Homebrew
                      I Windows: Cygwin (Terminal und Paketverwaltung)
                      I Einarbeitung in Grundbefehle (man, cd, ls, mkdir, rm, . . . )
           I Werkzeuge
                      I git - Versionsverwaltung (Installation via Paketverwaltung)
                      I openssh - Secure Shell (Installation via Paketverwaltung)
           I Editor/IDE (nach Wahl)
                      I   Eclipse Java IDE (Installation von Webseite, empfohlen für Windows)
                      I   vim (Installation via Paketverwaltung)
                      I   Emacs (Installation via Paketverwaltung)
                      I   ...

M.Sc. Laslo Hunhold                        Programmierpraktikum – Vorlesung 01                  2
Dateivergleich (diff)

        Matrikelnummer: 684932                       Matrikelnummer: 684923
        Name: Max Mustermann                         Name: Max Mustermann

        Notiz: Matrikelnummer falsch                                    neu.txt
                      alt.txt

        --- alt.txt      2020-04-27 12:00:00.000000000 +0200
        +++ neu.txt      2020-04-27 12:01:00.000000000 +0200
        @@ -1,4 +1,2 @@
        -Matrikelnummer: 684932
        +Matrikelnummer: 684923
          Name: Max Mustermann
        -
        -Notiz: Matrikelnummer falsch

                                   diff -u alt.txt neu.txt

M.Sc. Laslo Hunhold               Programmierpraktikum – Vorlesung 01             3
Hashfunktion
           I Bildet (beliebig große) Zeichenkette auf festen Integerwert (z.B. 20
             Byte bei SHA-1) ab
           I Gewünscht: (Minimale) Änderung der Zeichenkette → Starke
             Änderung des Hashwerts („Lawineneffekt“)
           I Prüfung von Datenintegrität möglich
           I Beispiel
                      I Angriff am 29.04. im Morgengrauen

                        SHA-1-Prüfsumme: 26646bdffe07d7c53547d8d26cef9453e750e3a3
                      I Angriff am 28.04. im Morgengrauen

                        SHA-1-Prüfsumme: ed23b63a6f7aad33fe225e01338e6fd5c5761a19
                      I bob_ross-the_joy_of_painting-s01e01-a_walk_in_the_woods.mkv
                        SHA-1-Prüfsumme: 86bd99c2edb9f94c14597bd33b6fd41ee4f93eea

M.Sc. Laslo Hunhold                      Programmierpraktikum – Vorlesung 01          4
Git-Einführung

M.Sc. Laslo Hunhold   Programmierpraktikum – Vorlesung 01   5
Motivation
           I Gemeinsames (kollaboratives) Arbeiten an einem Projekt, auch
             offline
           I Projekt ist eine Reihe von Änderungen („Commits“)
           I Manipulationssicherheit

        Motivation dieser Einführung
         I Idee hinter Git ist einfach, aber genial
         I Große Zahl von Funktionen (Zeitersparnisse) versteckt leider die
            einfachen Prinzipien
         I Verständnis der Grundlagen

M.Sc. Laslo Hunhold               Programmierpraktikum – Vorlesung 01         6
Commits als Merkle Tree
        Parents: 9cda0028db2dce035e3dab84b4376c25b21302fb
        Author: Laslo Hunhold , 2020-04-27 12:03:00
        Committer: Laslo Hunhold , 2020-04-27 12:05:00
        Aktualisiere Eintrag von Max Mustermann

        Nach Abstimmung mit dem Studenten ergab sich seine korrekte
        Matrikelnummer.
        --- a/mustermann
        +++ b/mustermann
        @@ -1,4 +1,2 @@
        -Matrikelnummer: 684932
        +Matrikelnummer: 684923
         Name: Max Mustermann
        -
        -Notiz: Matrikelnummer falsch

         Commit-Struktur (vereinfacht) mit Header, Beschreibung („message“) und Diff
            I Commit enthält ID seiner Vorgänger („Parents“) (außer der erste Commit, bei dem das
              Parents-Feld leer ist)
            I Gesamter Commit wird SHA-1-gehasht („Commit-ID“), inklusive Parents-Feld
            I Commits sind mit ihren Parents verkettet (Manipulationssicher), Struktur heißt „Merkle
              Tree“ (siehe auch Bitcoin)
            I Jeder Projektzustand entspricht einem eindeutigen Hash, da man im Baum über Parents bis
              zum ersten Commit zurückgehen kann; Baum kann abzweigen („Branches“, nächste Folie)
            I Zusammenführung von Abzweigungen („Merge“) führt zu Commit mit mehreren Parents
            I Git speichert keine Listen, sondern einfach Commits (mit IDs) und diverse Zeiger auf
              Commit-IDs (z.B. HEAD, master, etc.)
M.Sc. Laslo Hunhold                       Programmierpraktikum – Vorlesung 01                           7
Baumstruktur
                                                                       cc02...   ab21...   728a...

                                                                                            idee

                                    ee21...          745a...           214c...

                                                                       hotfix

                22cd...   873c...   fe99...          ac28...           39df...   9cda...

                                                                                 master

                                                                                 HEAD

           I Dieses Repository hat Branches „master“ (Default-Branch), „hotfix“
             und „idee“
           I Branches sind nur jeweils Zeiger auf letzten Commit im Branch
           I HEAD-Zeiger weist auf aktuell „betrachteten“ Stand des Repos
             (meistens einfach auf Branch, wie master, aber kann auch ein
             bestimmer Commit sein („Detached-HEAD“))
           I Commit 39df... ist Merge-Commit mit zwei Parents
M.Sc. Laslo Hunhold                    Programmierpraktikum – Vorlesung 01                           8
I git log [-p] [DATEI]
                                                                                       Liste Commits ab HEAD [mit Diffs] [nur
Struktur und Kommandos                                                                 DATEI betreffend]
                                                                                     I git diff [–-cached]
                                                                                       Diff von Arbeitsverzeichnis/[Index] und
                                      Remote                                           lokalem Repository ab HEAD
                                     Repository                                      I git add DATEI
                                                                                       Füge Datei(änderungen) dem Index hinzu
                         pull                      fetch/clone                       I git commit [–-amend]
                                                                                       Erzeuge/[Ergänze letzten] Commit aus
                                                                                       Diff von Index (neu) und lokalem
                                                                                       Repository (alt) auf aktuellem Branch
            Arbeits-        add        Index         commit       Lokales            I git merge BRANCH/COMMIT
                                                                 Repository,
           verzeichnis                (Cache)
                                                                   HEAD                Versucht Änderungen seit Abspaltung
                                                                                       vom aktuellen Branch anzuwenden
                                  merge/checkout
                                                                                     I git checkout [DATEI] [BRANCH/COMMIT]
                                                                                       [Setze HEAD auf BRANCH/COMMIT],
                                                                                       Bringe Arbeitsverzeichnis (oder DATEI)
            I Arbeitsverzeichnis: Eigentliche Dateien                                  auf Stand von HEAD (oder BRANCH/COMMIT)
                                                                                     I git reset [–-hard] [BRANCH/COMMIT]
              im Ordner
                                                                                       [Setze HEAD-Referenz (!) (z.B. master)
            I Lokales Repository: Enthält Commits                                      auf BRANCH/COMMIT], Bringe Index
              und Zeiger (HEAD, Branches, . . . ),                                     [und Arbeitsverzeichnis] auf Stand von
              Daten befinden sich im .git-Ordner im                                    HEAD [oder BRANCH/COMMIT]
              Arbeitsverzeichnis                                                     I git branch [-d] S [BRANCH/COMMIT]
            I Index: Bearbeitbarer Zustand des                                         Erzeuge/[Entferne] Branch S bei HEAD
                                                                                       [oder BRANCH/COMMIT]
              Repositories; dient u.a. der Vorbereitung                              I git fetch
              von Commits; befindet sich im
                                                                                       Lade neue Objekte vom Remote
              .git-Verzeichnis
                                                                                       Repository herunter
            I Remote Repository: Analog zum lokalen                                  I git clone
              Repository, kann aber auf einem neueren                                  Wie fetch, bei Neuerstellung
              Stand sein                                                             I git pull
                                                                                       Abkürzung für fetch und merge
M.Sc. Laslo Hunhold                                           Programmierpraktikum – Vorlesung 01                            9
Bemerkungen
           I Einige Kommandos haben auch andere Funktionen, je nach
             Benutzung (siehe Handbuch)
           I COMMIT-IDs lassen sich relativ ausdrücken (z.B. HEAD~3 heißt 3
             Commits hinter HEAD)
           I Anfänger sollten erstmal nicht mit Branches arbeiten
           I Es sind mehrere Remote Repositories möglich
           I Signierte Commits (Enterprise)

        Hilfswerkzeuge
         I git status
         I git rm (-r) ((Rekursives) Entfernen von Dateien und Ordnern,
             das automatisch auf den Index gesetzt wird)
         I git stash (um schnell lokale Änderungen zu „verstauen“)
         I git revert (erzeugt Commit, der bestimmte einzelne Commits
             rückgängig macht)
         I git cherry-pick (Anwenden bestimmter einzelner Commits)
         I git format-patch (Exportiert Commits als versendbaren Patch)
M.Sc. Laslo Hunhold               Programmierpraktikum – Vorlesung 01         10
Beispiel-Arbeitsabläufe
            I Committe Änderungen an                               I Bringe Datei test.java auf den
              Datei/neue Datei test.java                             Stand von HEAD
                 $ git add test.java                                    $ git checkout test.java
                 $ git commit
                                                                   I Mache letzten Commit komplett
            I Ergänze letzten (lokalen)                              rückgängig
              Commit mit Änderungen an
              test.java und test2.java                                  $ git reset --hard HEAD~1

                 $ git add test.java test2.java
                                                                   I Gehe 100 Commits zurück und
                 $ git commit --amend
                                                                     kehre wieder
            I Entferne test.java und                                    $ git checkout HEAD~100
              committe gleichzeitig                                     $ ...
              Änderungen an test2.java und                              $ git checkout master
              test3.java
                                                                   I Lade Änderungen in das Remote
                 $    git   rm test.java
                 $    git   add test2.java                           Repository hoch (Wichtig!)
                 $    git   add test3.java                              $ git push
                 $    git   commit
M.Sc. Laslo Hunhold                          Programmierpraktikum – Vorlesung 01                      11
Arbeitseinstieg

M.Sc. Laslo Hunhold   Programmierpraktikum – Vorlesung 01   12
Allgemein
           I Genug Zeit während Meilenstein 0, um sich in die Git- und
             Terminal-Umgebung einzuarbeiten
           I Git- und Terminalkenntnisse sind essentiell für ein Informatikstudium
           I Empfehlung, Git nicht via Eclipse oder GUIs zu verwenden
           I Mögliche Arbeitsweise: Editierung in Eclipse (GUI) oder im Terminal
             (vim, Emacs,. . . ) und parallel Versionsverwaltung im Terminal
             (insgesamt 2 Fenster)

M.Sc. Laslo Hunhold                Programmierpraktikum – Vorlesung 01               13
Dateistruktur
           I In Java arbeitet man mit Packages, Klassen, etc
           I Eclipse versteckt zugrundeliegende Dateistruktur
           I Packages sind Ordner (Package ms0 ist der Ordner /ms0, Package
             ms0.a0 ist der Ordner /ms0/a0/, etc.) relativ zum
             Arbeitsverzeichnis /. Die Klassen (.java-Dateien) befinden sich in
             diesen Ordnern mit der entsprechenden package-Anweisung
           I Git Repository ist das Arbeitsverzeichnis und soll diese Struktur
             einhalten
           I Eclipse läßt sich auf diese Struktur umstellen (später)

M.Sc. Laslo Hunhold                Programmierpraktikum – Vorlesung 01            14
Progserver-Account-Passwort setzen
           I Im Loginbereich bereitgestelltes Passwort ist als abgelaufen gesetzt
           I Login mit SSH (Server progserver.informatik.uni-koeln.de, Port
             4711) erforderlich um Passwort zu ändern
           I Passworteingabe ist blind
           I Ohne dieses Setzen kein Zugriff auf Git möglich

        $ ssh -p 4711 mmustermann@progserver.informatik.uni-koeln.de
        mmustermann@progserver.informatik.uni-koeln.de’s password:
        You are required to change your password immediately (administrator enforced)
        WARNING: Your password has expired.
        You must change your password now and login again!
        Changing password for mmustermann.
        Current password:
        New password:
        Retype new password:
        passwd: password updated successfully
        Connection to progserver.informatik.uni-koeln.de closed.
        $

M.Sc. Laslo Hunhold                  Programmierpraktikum – Vorlesung 01                15
Git - Klonen des Remote Repository
           I Setzen von Name und E-Mail-Adresse (für Commits)
                 $ git config --global user.name "Max Mustermann"
                 $ git config --global user.email mmustermann@smail.uni-koeln.de

           I Zugriff auf Remote Repository erfolgt über SSH mit dem
             Progserver-Account
           I Progserver-Accounts haben nur Zugriff auf die Git-Shell (können
             also nur Git-Repositories bearbeiten)
           I Eigenes Remote Repository befindet sich (z.B. für Max Mustermann
             mit Nutzername mmustermann) unter /srv/pp/2020/mmustermann
           I Man hat nur Zugriff auf sein eigenes Remote Repository
        $ git clone ssh://mmustermann@progserver.informatik.uni-koeln.de:4711/srv/pp/2020/mmustermann
        Cloning into ’mmustermann’...
        mmustermann@progserver.informatik.uni-koeln.de’s password:
        Could not chdir to home directory /nonexistent: No such file or directory
        warning: You appear to have cloned an empty repository.
        $ cd mmustermann/
        $ git status
        On branch master

        No commits yet

        nothing to commit (create/copy files and use "git add" to track)
        $

M.Sc. Laslo Hunhold                              Programmierpraktikum – Vorlesung 01                    16
Git - Beispiel
        $ ls -a
        . .. .git
        $ mkdir ms0 ms1
        $ vim ms0/HalloWelt.java
        $ javac ms0/HalloWelt.java
        $ java ms0.HalloWelt
        Hallo Welt!
        $ git add ms0/HalloWelt.java
        $ git commit
        [master (root-commit) 777a227] Hallo-Welt-Beispiel
         1 file changed, 7 insertions(+)
         create mode 100644 ms0/HalloWelt.java
        $ git log
        $ git push
        mmustermann@progserver.informatik.uni-koeln.de’s password:
        Could not chdir to home directory /nonexistent: No such file or directory
        Enumerating objects: 4, done.
        Counting objects: 100% (4/4), done.
        Delta compression using up to 8 threads
        Compressing objects: 100% (2/2), done.
        Writing objects: 100% (4/4), 1.03 KiB | 1.03 MiB/s, done.
        Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
        To ssh://progserver.informatik.uni-koeln.de:4711/srv/pp/2020/mmustermann
         * [new branch]      master -> master
        $ git rm ms0/HalloWelt.java # oder git revert HEAD
        rm ’ms0/HalloWelt.java’
        $ git commit
        [master e1180c1] Entferne Hallo-Welt-Beispiel
         1 file changed, 7 deletions(-)
         delete mode 100644 ms0/HalloWelt.java
        $ git push
        ...

M.Sc. Laslo Hunhold                              Programmierpraktikum – Vorlesung 01   17
Anbindung Eclipse
           I Eclipse kann zur Bearbeitung im lokalen Repository genutzt werden
           I Eclipse legt aber bei Java-Projekten die Quelldateien im
             Projektordner in den Unterordner „src“ und die Kompilate in „bin“
           I Wir wollen aber die Quelldateien direkt im Projektordner (also auch
             die Packages)
           I Einstellungsänderung in Eclipse unter „Window“ → „Preferences“
             und dann im Auswahlbaum unter „Java“ die Einstellung „Build
             Path“. Wählen Sie dort die Option „Project“ statt „Folders“.
           I Auswahl hat nur Einfluß auf neu erstellte Projekte und kann nach
             Projekterstellung wieder zurückgestellt werden
           I Erstellen Sie nun ein neues Java-Project („File“ → „New“ → „Java
             Project“). Entfernen Sie den Haken bei „Use default location“ und
             geben Sie bei „Location“ den Pfad zu Ihrem lokalen Repository an,
             welches Sie zuvor gecloned haben. Drücken Sie „Next“ und dann
             „Finish“.
           I Arbeit in Eclipse ist wie gewohnt, git-Verwaltung im Terminal

M.Sc. Laslo Hunhold               Programmierpraktikum – Vorlesung 01              18
Bemerkungen
           I UTF-8 als Dateienkodierung verwenden
           I git push nicht vergessen
           I Coding Style als Orientierungshilfe (Java Code Conventions)

M.Sc. Laslo Hunhold               Programmierpraktikum – Vorlesung 01      19
Organisatorisches

M.Sc. Laslo Hunhold     Programmierpraktikum – Vorlesung 01   20
Allgemein
           I E-Mail-Adresse des Übungsleiters im Loginbereich; Ansprechpartner
             bei inhaltlichen Rückfragen
           I Organisatorische und technische Fragen an mich
           I Rückmeldungen zu Meilenstein 0 (11.05.-15.05.2020) erfolgen per
             E-Mail (Punktzahl, Bemerkungen)

M.Sc. Laslo Hunhold               Programmierpraktikum – Vorlesung 01            21
Prüfungen
        Anmeldungszeiträume
         I Portfolio-Prüfungen: 01.06.-22.06.2020
         I Klausur: 30.06.-21.07.2020
           I Nachklausur: 26.08.-16.09.2020

        Klausurinhalte
         I Allgemeine Java-Fragen
         I Meilenstein 0 (Stapelspeicher, Tokenizer, BigDecimal)

M.Sc. Laslo Hunhold              Programmierpraktikum – Vorlesung 01   22
Sie können auch lesen