#language de #format rst Systemnahe Programmierung in Rust ================================= Einführung in die Programmiersprache Rust mit Anwendungen aus der Systemprogrammierung. Wintersemester 2021/2022, Beginn ab Freitag den 8. Oktober 2021 (8:00 bis 11:20, plus Praktikum) Prof. Dr. Hubert Högl, Moodle Kurs: https://moodle.hs-augsburg.de/course/view.php?id=6223 (nur für Ankündigungen, Gruppeneinteilung und Forumseinträge - nicht zur Abgabe von Aufgaben) Kursmaterial (Vorlesungsnotizen und Übungsblätter) sind in einem eigenen Gitlab Repository: https://r-n-d.informatik.hs-augsburg.de:8080/hubert.hoegl/snp-rust Zoom Meeting-ID: 986 8429 6084 (den Zugangscode bekommen Sie über Moodle). .. contents:: Inhalt Ablauf am Freitag ----------------- Die Veranstaltung findet nach aktuellem Stand **entweder online oder vor Ort** statt. Es kann gut sein, dass wir manche Termine online haben und andere vor Ort. Nicht vorstellen kann ich mir zur Zeit, dass wir gleichzeitig vor Ort und zu Hause verteilt sind (dazu müsste ich aus dem Hörsaal streamen, und dafür fehlen uns die technischen Einrichtungen). Am Freitag den 8.10. werden wir online beginnen und dabei über das weitere Vorgehen reden. Es wird in der Regel einen bis zwei Erzählblöcke (aus Ihrer Sicht Zuhörerblöcke) geben (je 90 Minuten), in denen ich Rust an Hand von Code-Beispielen so gut es geht vorstelle (ich bin selber auch noch am Lernen). Es ist auch möglich, dass ich im zweiten Block über den aktuellen Stand der Praktikumsaufgaben spreche. Die restliche Zeit von 11:40 bis 15:30 Uhr werden wir für das Praktikum in Gruppen verwenden. Die Einteilung der Gruppen folgt noch. Die Veranstaltung hat 5 SWS und bringt 6 CP. Der Gesamtaufwand von 180 Std. teilt sich auf in 75 Std. Präsenzzeit und 105 Std. Selbststudium (inkl. Praktikum und Vorbereitung auf die Prüfung). Praktikum --------- Das Praktikum besteht aus regelmässigen **Übungen** und einem kleinen **Projekt**. Die wöchentlichen Übungsaufgaben bearbeiten sie in Gruppen. Maximal sollten vier Personen in einer Gruppe sein. Insgesamt wird es ca. 16 Gruppen geben, jede Gruppe (1, 2, 3, ...) hat ein Repository zur Abgabe im Gitlab: https://r-n-d.informatik.hs-augsburg.de:8080/snp-ws21 Moodle benötigen wir zur Abgabe der Aufgaben nicht. Die Gruppeneinteilung erfolgt in Kürze über Moodle. Sobald diese erledigt ist, trage ich eine Person aus jeder Gruppe als Maintainer ein, der dann die anderen Gruppenmitglieder eintragen kann. Jede Übungsgruppe arbeitet neben den wöchentlichen Übungsaufgaben auch an einem Projekt. Mögliche Projektthemen werden in der Vorlesung bekannt gegeben. Sie dürfen auch gerne selber Vorschläge machen. Allgemein gilt für das Praktikum: Versuchen Sie die Aufgaben selbst zu lösen. Wenn Sie Codestücke im Internet finden und verwenden, dann **kennzeichnen Sie die Stellen in ihrem Programm** z.B. durch einen Kommentar mit dem Link, an dem Sie den Code gefunden haben. Es muss immer klar sein, welchen Code Sie geschrieben haben und welcher Code nicht von Ihnen stammt. Ausserdem müssen Sie den gefundenen Code **verstehen** und **erklären** können. Für die Veranstaltung gibt es auch einen Tutor, Herrn Philipp Mirbaha, der das Praktikum mitbetreuen wird. Kleine Projekte --------------- Sie sollten im Team kontinuierlich an einem kleinen Projekt arbeiten. Die Schwierigkeit und der Umfang sollten so gewählt werden, dass sie die nächsten Wochen bis ca. Mitte Dezember in einem vernünftigen Zeitrahmen (nicht zu wenig / nicht zu viel) daran arbeiten werden. Einige Anregungen für mögliche Themen sind: * Multithreaded Webserver (von "The Book", Kap. 20). Am Ende des Abschnittes im Buch stehen einige Anregungen für Verbesserungsmöglichkeiten. * Bekannte Unix Utilities in vereinfachter Form nachprogrammieren. Hier sind einige Beispiele, die es vormachen, wie das in etwa gemeint ist: - Minigrep (aus "The Book") - Buch Youens-Clark, Command-line Rust, 2022 https://learning.oreilly.com/library/view/command-line-rust/9781098109424/ Code: https://github.com/kyclark/command-line-rust - Im Buch von Eshwarla wird z.B. in Kap. 8 eine kleine Shell vorgestellt. Es werden auch ein paar Tipps gegeben, wie man die Shell erweitern kann. Prabhu Eshwarla, Practical System Programming for Rust Developers Packt Publishing, 2020. https://learning.oreilly.com/library/view/practical-system-programming/9781800560963/ Sie sollten sich aber neue Programme ausdenken! * Bekannte Protokolle programmieren: - Telnet Client und Server - SMTP Client - HTTP Client - MQTT Client - FTP Client - NTP Client - Chat Client und Server zum Austausch von Textnachrichten - und so weiter ... * Simple alte 2D Spiele im Terminal nachprogrammieren, z.B. "Moon Buggy", oder "Lunar Lander". - https://www.retrogamer.net/retro_games80/moon-buggy/ - https://www.retrogamer.net/retro_games70/lunar-lander/ Auf retrogamer.net finden Sie viele weitere Anregungen. * Etwas aufwendigere 2D Spiele, wie z.B. im Buch von Wolverson, Hands-on Rust, 2021 https://learning.oreilly.com/library/view/hands-on-rust/9781680508796/ * Projekte bei denen Software für kleine Mikrocontroller in Rust entsteht, sind willkommen! Es gibt bereits Rust-Support für viele MCUs, z.B. AVR, ESP8266/ESP32 oder STM32. * Einen Telegram-Bot schreiben, wie z.B. im Buch von N. Modrzyk beschrieben, `Building Telegram Bots `_, Apress 2019. * Auch Projekte mit dem Raspberry Pi und dem Beagle Bone Black sind möglich. Anwendungen im Bereich des Internet-of-Things, Kommunikation über REST-API (Actix Framework), MQTT, InfluxDB, und so weiter. * Projekte aus dem Bereich *Parallelisierung*. * Gerne auch eigene Vorschläge per E-mail an mich einbringen, oder noch besser, in das Moodle Forum stellen: https://moodle.hs-augsburg.de/course/view.php?id=5213 Die aktuelle Auswahl der Teams ist wie folgt (T9 gibt es nicht): T1 ✓ Pacman T2 ✓ TicTacToe T3 ✓ Spiel "Rust Invaders" T4 ✓ Multithreaded Webserver mit Verbesserungen (aus *The Book*) T5 ✓ Spiel "Breakout" T6 ✓ Kommandozeilentool für das Google Directions API T7 ✓ Kommandozeilentool für Gitlab Issues, ausserdem `help_me `_ zur Reservierung eines Tutors von R. Kolesnikov ✓ T8 ✓ Spiel Lunar Lander (http://moonlander.seb.ly) T10 ✓ Spielesammlung Snake / Battleship / Sudoku / TicTacToe .. Microcontroller-Programmierung mit Rust (Sensor an Wemos D1 mini, MQTT) T11 ✓ Chat Server und Client T12 ✓ Telegram Meeting Manager T13 ✓ Gemini Server (https://gemini.circumlunar.space) T14 ✓ "Kantina" - Kommandozeilentool für OpenMensa (https://doc.openmensa.org) `Repo-T14 `_ T15 ✓ Game of life mit Wasm, `Repo-T15 `_ T16 ✓ GameBoy CPU (LR35902) Simulator in Rust (ähnlich Z80) Prüfung ------- Zum Semesterende wird es eine Prüfung geben (Online per Moodle). Das Ergebnis der Prüfung wird mit dem Ergebnis des Praktikums (Übungen und Projekt in Gruppen) verrechnet. Die Gewichtung wird 1/3 Prüfung und 2/3 Praktikum sein. Installation ------------ * Anleitung zur Installation der Rust Werkzeuge: https://www.rust-lang.org/tools/install - Linux: einfach - Windows: kann Schwierigkeiten machen (Microsoft C++ build tools) Deshalb: Wir arbeiten in **Linux**, die Kommandozeile genügt uns. Empfehlung für das eigene Notebook unter Windows: Linux virtuell z.B. über VirtualBox betreiben. Darauf dann Rust installieren. Alternativ kann man den Rechner ``rtlab`` im RT-Labor (G2.16) verwenden, der unter Linux läuft. Aus dem Intranet der Hochschule (oder von aussen per VPN) erreicht man den Server mit ssh: .. code-block:: text ssh @rtlab.informatik.hs-augsburg.de Das Home-Verzeichnis ist das über NFS gemountete RZ-Home. Die Rust Tools sind darauf installiert. Allerdings arbeitet ``cargo`` nicht mit dem NFS Home (``rustc`` schon). Wenn man ``cargo`` verwenden möchte, dann muss man zur Zeit auf ``/tmp`` wechseln. * Editor: ``vim`` oder ein beliebiger anderer Editor, der in einem Shell-Fenster arbeitet. Ich werde Vim verwenden. Erweiterungen für Vim, die ich installiert habe: - https://github.com/rust-lang/rust.vim - https://github.com/dan-t/rusty-tags * IDE: brauchen wir eigentlich nicht, da das Wichtigste beim Programmieren in Rust die Ausgaben (Fehlermeldungen, Warnungen, Tipps) des Rust Compilers sind. Diese kann man sehr gut auf der Kommandozeile lesen. Ich habe auch schon davon gehört, dass IDEs diese Fehlermeldungen nicht mehr so schön zugänglich machen, was natürlich kontraproduktiv wäre. Mit diesem Hinweis können sie aber gerne eine der üblichen Verdächtigen installieren: VSCode, Atom, Sublime, u.s.w. * Beispielprogramm (Modul ``main.rs``) anlegen: .. code-block:: rust fn main() { println!("Hallo, Welt"); } Kompilieren mit rustc ``main.rs``. Ausführen mit ``./main``. Formatieren mit ``rustfmt main.rs``. Literaturangaben ---------------- (Tipp: Um die Bücher auf "learning.oreilly.com" lesen zu können, muss man sich zunächst auf https://go.oreilly.com/fachhochschule-augsburg einloggen.) Für Anfänger geeignet 1. Steve Klabnick, Carol Nichols, **The Rust Book**, 2018 (auch kurz "The Book" genannt). **Dieses freie Buch werden wir als verbindlichen Text in der Veranstaltung verwenden. Man kann das Buch auch sehr gut auf dem Smartphone lesen.** https://doc.rust-lang.org/book/ Es gibt auch eine deutsche Übersetzung unter https://rust-lang-de.github.io/rustbook-de. #. Carlo Milanesi, **Beginning Rust: Get Started with Rust 2021 Edition**, Apress 2021. https://learning.oreilly.com/library/view/beginning-rust-get/9781484272084/ Das Buch kann im PDF Format beim Springer Link (https://link-springer-com.ezproxy.hs-augsburg.de) heruntergeladen werden. #. Dumindu Madunuwan, **Learning Rust**, 2021 (freier Text) https://learning-rust.github.io #. Malte Luttermann, **Programmierung sicherer Systeme mit Rust**, Amazon Media, 2020 (Taschenbuch, 253 Seiten, 13,95 Euro). Das Buch ist eine sehr leicht verständliche Einführung in Rust, enthält aber deutlich weniger Stoff als das freie *The Rust Book*. Es reicht daher nicht für unsere Veranstaltung. https://www.amazon.de/Programmierung-sicherer-Systeme-mit-Rust/dp/B086PQXH3N Für Fortgeschrittene 2. Jim Blandy, Jason Orendorff, Leonora F.S. Tindall, **Programming Rust**, 2nd Edition, 2021 (655 pages). Sehr gründliche Einführung in Rust, die aber den Anfänger überfordert. Das Buch wendet sich auch an Leute, die bereits mit Systemprogrammierung zu tun hatten. https://learning.oreilly.com/library/view/programming-rust-2nd/9781492052586 3. **Rust by Example**, https://doc.rust-lang.org/rust-by-example 4. **Rust Cookbook**, https://rust-lang-nursery.github.io/rust-cookbook Systemprogrammierung 1. Jim Blandy, Jason Orendorff, Leonora F.S. Tindall, **Programming Rust** (siehe oben). 2. Ken Youens-Clark, **Command-line Rust**, Apress 2022 https://learning.oreilly.com/library/view/command-line-rust/9781098109424 Code: https://github.com/kyclark/command-line-rust 3. Prabhu Eshwarla, **Practical System Programming for Rust Developers**, Packt, Dec 2020. https://learning.oreilly.com/library/view/practical-system-programming/9781800560963/ Sammlungen von Projekten 1. Carlo Milanesi, **Creative Projects for Rust Programmers**, Packt 2020. https://learning.oreilly.com/library/view/creative-projects-for/9781789346220/ 2. Shing Lyu, **Practical Rust Projects: Building Game, Physical Computing, and Machine Learning Applications**, Apress 2020. Das Buch kann im PDF Format beim Springer Link (https://link-springer-com.ezproxy.hs-augsburg.de) heruntergeladen werden. https://learning.oreilly.com/library/view/practical-rust-projects/9781484255995/ 3. Rust Language exercises on **Exercism** https://exercism.org/tracks/rust/exercises