Repository navigation
Rust-Kurs: Ein-/Ausgabe, Performance messen und mehr Praxis in Async, CLI, Tests und API-Design (LRN-9) - #29
hernstev97 wants to merge 1 commit into
Conversation
… CLI, Tests und API-Design (LRN-9) Neue Module: ein-ausgabe (Dateien, atomares Ersetzen, Command ohne Shell, TCP-Zeilenprotokoll; nur std, unterwegs), performance-messen (criterion, divan, hyperfine, Flamegraphs, Allokationen, Diagnose in vier Schritten; unterwegs) und profiling-werkstatt (am PC ein langsames Programm messen, profilieren und schneller machen). Neuer Track "Performance". Ausgebaut: async-rust (select!, Cancellation Safety, Semaphore, CancellationToken, Kanäle, tokio::net/fs, Streams, "future cannot be sent", #[tokio::test]), rust-praxis (clap, stdin, Env, BufWriter, Broken Pipe, Strg+C, TOML), testen-qualitaet (CARGO_BIN_EXE, assert_cmd, tempfile, proptest, insta), traits-generics (API-Design). Bestehende Übungen sind in ID und geprüften Teilen unverändert. Dazu Level-3-Projekt healthchecker, 12 Interview-Karten, 12 Glossarbegriffe, Spickzettel-Abschnitte. Rust: 14 → 17 Module, 161 → 215 Übungen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars.
|
|
CI-Stand: 🤖 Generated with Claude Code |
Dem Rust-Kurs fehlte, was man für echte Systemarbeit braucht: Dateien, Prozesse und Netzwerk mit der Standardbibliothek kamen nicht vor, Performance messen auch nicht. Async, CLI, Tests und API-Design blieben bei den Grundlagen stehen (LRN-9, Abgleich vom 30.09. am 24.10. gegen
mainwiederholt, die Lücken bestanden unverändert).Der PR füllt genau diese Lücken. Zwei neue Module gehen auf dem Handy, Werkstatt und Ausbauten sind fürs Arbeiten am PC. Rust wächst von 14 auf 17 Module und von 161 auf 215 Übungen.
ein-ausgabe(neu)OpenOptions,BufWriter(Drop schluckt Fehler),read_dir, atomar ersetzen per temp +sync_all+rename,Commandohne Shell, Exit-Status und Signale, Pipe-Deadlock, TCP als Bytestrom mit Zeilenprotokoll und Timeouts. Nur std, alles läuft durchpnpm verify.performance-messen(neu)Instant,black_box, criterion-Ausgabe lesen (Konfidenzintervall, p-Wert, Rauschschwelle), divan, hyperfine 2.0, Flamegraphs lesen, Allokationen zählen. Dazu eine Diagnose in vier Schritten mit vorbereiteten Ausgaben.profiling-werkstatt(neu)profiling, hyperfine-Baseline, criterion mit--save-baseline, samply, genau eine Änderung je Runde, Messprotokoll.async-rustselect!(Drop der Verlierer,biased;, gepinnter Timer), Cancellation Safety,Semaphore,CancellationToken/TaskTracker, oneshot/mpsc/broadcast/watch,tokio::net/tokio::fs, Streams, echte Meldung „future cannot be sent between threads safely“,#[tokio::test(start_paused = true)].rust-praxisenv, stdin über-,var/var_os,BufWriter+stdout().lock()(gemessen 15× schneller), Broken Pipe, Strg+C mitctrlc, TOML mit serde und Vorrang CLI > Env > Datei.testen-qualitaetenv!("CARGO_BIN_EXE_…"), assert_cmd + predicates, tempfile, proptest mit echtem Shrinking, insta mit Filtern.traits-genericsTryFrom/FromStr, Builder, Typestate mitPhantomData, sealed und extension traits,#[non_exhaustive],#[must_use], Rust API Guidelines.* Wie
content:checkzählt, also mit Code.Dazu kommen das Level-3-Projekt Healthchecker (TCP, HTTP über
tokio::net, Prozessaufruf, Semaphore, Strg+C, atomarer Bericht, Benchmark und Messprotokoll;abschluss-logwerkbleibt synchron), 12 Interview-Karten (jetzt 60), 12 Glossarbegriffe (jetzt 60), Spickzettel-Abschnitte zu I/O, Async-Werkzeugen, CLI/Tests, Messen und API-Design sowie ein neuer Track „Performance“ inarea.yaml.Offene Entscheidung für dich: Beispiele mit fremden Crates prüfen?
pnpm verifyüberspringt Rust-Code mit fremden Crates. Aufmainbetrifft das 17 Stellen (async-rust 12, module-cargo 3, fehlerbehandlung 2), mit diesem PR 42.verifyhabe ich wie verlangt nicht geändert. Stattdessen sind alle 37 Stellen in den Modulen dieses PRs einmalig in einem Scratch-Cargo-Workspace im Worktree kompiliert und, wo es eine Ausgabe gibt, ausgeführt worden. Die Versionen waren fest: tokio 1.54.1, tokio-util 0.7.20, tokio-stream 0.1.19, clap 4.6.7, serde 1.0.229, toml 1.1.8, ctrlc 3.5.2, criterion 0.8.2, divan 0.1.21, proptest 1.12.0, insta 1.49.0, assert_cmd 2.2.2, predicates 3.1.4, tempfile 3.27.0. Der Workspace ist nicht Teil des PRs.Die 37 so geprüften Stellen
join!,spawn,select!, CancellationToken/TaskTracker, Semaphore,tokio::net, Streams,#[tokio::test]); Übungenjoin-ergebnis,select-biased,await-future,spawn-besitz,bounded-channel,semaphore-permit,guard-block(Fehlermeldung echt erzeugt),timeout-handle,channel-worker,heartbeat-abbrechenclap-subcommand,konfig-schichtenproperty-tautologie,cli-test-tempdiriter_batched, divan; Übungzu-schnell-fuer-echtwachstum-messenNicht von mir geprüft: die 5 Stellen in den unveränderten Modulen
module-cargoundfehlerbehandlung.Variante A:
verifyum ein Cargo-Projekt mit festen Versionen erweitern. Ein Workspace untertooling/mit eingechecktemCargo.lock.verifylegt jede Stelle mit fremder Crate als Beispiel oder Test hinein, baut alles in einem Lauf und vergleichtoutput-Übungen wie bei std-Code. Kosten: Die CI lädt und baut die Crates. Lokal brauchte der Bau aller Abhängigkeiten 19 s auf 24 Kernen, auf einem CI-Runner mit Cache sollte es deutlich unter einer Minute liegen (geschätzt, nicht gemessen). Fragmente ohnemainbrauchen ein Gerüst oder bleiben weiter ungeprüft. Versionen hebst du dann bewusst an, Inhalte und Lockfile gemeinsam. PR #28 ändert ebenfallstooling/verify-code.ts.Variante B: ungeprüft lassen. Die Inhalte nennen ihre Versionen, und der Playground-Link bleibt. Ändert sich eine Crate-API, merkt das erst der Lernende. Beispiele dafür gibt es schon in diesem PR: toml 1.x, die Deprecations in assert_cmd und
into_path→keepin tempfile.Empfehlung: A in schlanker Form. Nur kompilieren und
outputvergleichen, Fragmente ohnemainweiter überspringen, die Versionen im Lockfile gleich denen in den Lektionen. Der Bestand hat sich mit diesem PR mehr als verdoppelt, und die einmalige Prüfung hier hat sich gelohnt (siehe unten). Grenze: Auch A prüft nicht dieCargo.toml-Schnipsel einer Lektion. Der Fehler mit dem fehlenden Featureio-util(unten) wäre nur aufgefallen, wennverifymit genau den gezeigten Features baut.Entscheidungen, die ich getroffen habe
bughöchstens 32,orderals Prosa, keine Aufgabe braucht Cargo. Die vier ausgebauten Module sind „Am PC“. Sie enthalten Cargo-Praxisaufgaben mit fremden Crates und bestehenden Code über 34 Zeichen, den ich wegen der Fingerprints nicht umbrechen wollte. Neues zum Lesen von Compilerfehlern steht deshalb teils in PC-Modulen. Wenn du es lieber auf dem Handy hättest, wäre der nächste Schritt je ein eigenes Lesemodul.perf_event_paranoid= 2, kein root). Die Flamegraph-Daten kommen deshalb aus pprof-rs, und die Lektion sagt das offen. Was dort zur samply-Oberfläche steht, beruht auf README und Firefox-Profiler-Doku, nicht auf eigener Ansicht. hyperfine 2.0 hat ein neues Ausgabeformat; gelehrt wird 2.0, mit einem Hinweis auf 1.x.mainbestätigt. Bei einigen alten Übungen sind nurresourcesgenauer verlinkt.traits-genericsliegt jetzt bei 4 225 Wörtern mit Code, über dem Richtwert von 3 000. Das Issue wollte API-Design ausdrücklich dort. Die Alternative wäre ein eigenes Modul „API-Design“ hintermodule-cargo, weil SemVer undpubdort erst vertieft werden; jetzt steht ein Vorwärtsverweis da. Die neuen Module liegen mit Code knapp über 3 000. Die Spur hat 17 Module, eins mehr als der Richtwert für neue Bereiche.ownership,structs-enumsundfehlerbehandlunghaben auch nur rund 1 300 Wörter. Das Issue erklärt sie für abgedeckt, ich habe sie nicht angefasst.Geprüft
pnpm content:check rust: OK, 17 Module, 215 Übungen, 60 Karten, 5 Projekte, 60 Begriffe.pnpm verify rust: 228 Prüfungen, 0 fehlgeschlagen. Neu sind alle std-Beispiele ausein-ausgabeundperformance-messenund dieoutput-Übungen mit echten Dateien, Kindprozessen, Loopback-TCP und einem Allokationszähler.mainkompilieren auch in ihrer fehlerhaften Fassung; der Fehler zeigt sich erst zur Laufzeit, wie im Prompt beschrieben.verifykompiliert jeweils die Korrektur.guard-blockist absichtlich ein Compilerfehler, die Meldung im Prompt ist echt.pnpm testmit 329 Tests,pnpm lintundpnpm build: grün.pnpm links rust: 541 URLs, 0 Probleme.pnpm test:e2elokal: 59 von 59 grün. Ein erster Lauf parallel zu zwei Review-Agenten scheiterte bei 6 Tests an Zeitüberschreitungen (Testing, PostgreSQL, VM, Viewport). Ohne Last waren alle grün. Auf CI kann der Viewport-Test unabhängig davon scheitern, wie aufmain(LRN-31).output-Übungen (324/322 px). Das ist bei bestehenden Modulen wieownership/3genauso und liegt an der Plattform. Zwei akzeptierte Alternativantworten einerbug-Übung sind länger als 32 Zeichen; sie werden nur eingetippt, nie angezeigt.tokio-streamohne das Featureio-util, und das Beispiel kompilierte damit nicht.api-erweiterbarstellte SemVer falsch dar:#[non_exhaustive]nachzurüsten ist selbst ein Major-Change.black_boxwar falsch.Überschneidungen mit offenen PRs
Dieser PR ändert nur
content/rust/. Kein offener PR (#21–#28) berührt diese Dateien,HANDBUCH.mdundREADME.mdhabe ich nicht geändert. Inhaltlich berühren sich zwei Stellen:tooling/verify-code.ts, relevant falls du Variante A wählst.tooling/markdown.ts,public/media). Damit könnten später echte Flamegraph-SVGs die Textdarstellung ergänzen.🤖 Generated with Claude Code