Programmierpraktikum Vorlesung 01 M.Sc. Laslo Hunhold 27. April 2020
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
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