Connect with us

Entwicklung & Code

Cross-Plattform-Applikationen mit Rust 3: Fachlichkeiten und Shell-Integration


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

Nach einer Einführung in das Framework Crux geht es im dritten und letzten Teil der Artikelreihe nun um fortgeschrittene Konzepte und die praktische Integration in realen Anwendungen. Die folgenden Punkte zu fachlichen Typen, Aufteilung in mehrere Apps und dem Einsatz in konkreten Shell-Technologien zeigen einen detaillierten Blick aus der Praxis.

Weiterlesen nach der Anzeige


Portrait Marcel Koch

Portrait Marcel Koch

Marcel Koch berät mit seinem siebenköpfigen Team kleine und mittelständische Unternehmen und entwickelt branchenübergreifend Cross-Platform-Apps für Desktop und Mobile sowie Webapplikationen – bevorzugt mit TypeScript, Rust, Flutter oder Java, gestützt auf CI/CD und IaC. Dabei setzt er auf pragmatische, passgenaue Lösungen, denn Software ist kein Selbstzweck. Neben soliden technischen Kenntnissen schult er in Gewaltfreier Kommunikation, Transaktionsanalyse sowie Agilität und fördert einen kritischen Blick auf Cloud Hypes. Marcel ist Speaker, Autor von Fachartikeln und Büchern und regelmäßig in Podcasts zu hören.

In langlebigen Softwareprojekten ist es ratsam, fachliche Typen unabhängig vom eingesetzten Framework zu definieren. Im Rahmen der in den vorherigen Teilen gezeigten E-Mail-App bietet sich zum Beispiel der Typ EmailAddress an: Dieser Typ kapselt die Validierung und Repräsentation einer E-Mail-Adresse und stellt sicher, dass nur gültige Werte im System verwendet werden. Die Logik zur Prüfung – etwa auf das Vorhandensein des Zeichens @ – ist direkt im Typ verankert und nicht Teil der Crux-App.

Dadurch bleibt die fachliche Logik klar von technischen Details getrennt. Sie kann unabhängig von Crux, anderen Frameworks oder der konkreten Plattform getestet, wiederverwendet und weiterentwickelt werden. Sollte sich die technische Umgebung ändern, bleibt die Kernlogik erhalten und muss nicht neu geschrieben werden.

Fachliche Typen wie EmailAddress erhöhen die Wartbarkeit und Verständlichkeit des Codes und schützen vor Fehlern, indem sie ungültige Zustände bereits beim Erstellen verhindern.

Weiterlesen nach der Anzeige

Listing 1: Fachlicher Typ EmailAddress


#[derive(Clone, PartialEq, Eq, Hash, Debug, serde::Serialize, serde::Deserialize)]
pub struct EmailAddress(String);

#[derive(thiserror::Error, Debug)]
pub enum EmailError {
    #[error("missing @")]
    MissingAt,
}

impl EmailAddress {
    /// Der Smart-Constructor garantiert eine gültige Adresse
    pub fn parse(s: impl Into) -> Result {
        let s = s.into();
        if s.contains('@') { Ok(Self(s)) } else { Err(EmailError::MissingAt) }
    }

    pub fn as_str(&self) -> &str { &self.0 }
}


Fachliche Typen wie EmailAddress lassen sich unabhängig vom Framework testen.

Listing 2: Tests für EmailAddress


#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn valid_email_is_accepted() {
        let email = EmailAddress::parse("marcel.koch@example.org");
        assert!(email.is_ok());
        assert_eq!(email.unwrap().as_str(), "marcel.koch@example.org");
    }

    #[test]
    fn invalid_email_is_rejected() {
        let email = EmailAddress::parse("marcel.kochexample.org");
        assert!(email.is_err());
        assert_eq!(email.unwrap_err(), EmailError::MissingAt);
    }
}


Der erste Test prüft, dass eine gültige E-Mail-Adresse akzeptiert und korrekt gespeichert wird. Der zweite Test stellt sicher, dass eine ungültige E-Mail-Adresse (ohne @) abgelehnt und der passende Fehler (MissingAt) zurückgegeben wird.

Wächst das Entwicklungsteam der App, kann es sinnvoll sein, das Team und auch die Anwendung in mehrere eigenständige Apps und Crates aufzuteilen. Ein Kontaktmanagement könnte die bisherige E-Mail-App erweitern und alle eingehenden Kontaktdaten speichern, aktualisieren oder löschen. Dabei bekommt das Kontaktmanagement eine eigene Crux-App, verwaltet in einem separaten Crate. Dieses separate Crate beinhaltet ein abgegrenztes Feature und wird auch als Feature-Crate bezeichnet. Jedes Feature-Crate definiert dabei seine eigenen Events, Models, ViewModels und Effekte – das Model ist also explizit Teil des jeweiligen Features. Die Haupt-App integriert die einzelnen Feature-Crates und koordiniert deren Zusammenspiel.

Listing 3: contacts (Feature-Crate)


// contacts/src/lib.rs
#[derive(Clone, Debug)]
pub struct Contact {
    pub name: String,
    pub email: EmailAddress,
}

pub enum ContactsEvent {
    AddContact(Contact),
    RemoveContact(EmailAddress),
    EditContact(EmailAddress, Contact),
}

#[derive(Default)]
pub struct ContactsModel {
    pub contacts: Vec,
}

pub struct ContactsViewModel {
    pub contacts: Vec,
}

pub enum ContactsEffect {
    ShowContactAdded(EmailAddress),
    ShowContactRemoved(EmailAddress),
}

pub fn update(event: ContactsEvent, model: &mut ContactsModel) -> Vec {
    match event {
        ContactsEvent::AddContact(contact) => {
            model.contacts.push(contact.clone());
            vec![ContactsEffect::ShowContactAdded(contact.email)]
        }
        ContactsEvent::RemoveContact(email) => {
            model.contacts.retain(|c| c.email != email);
            vec![ContactsEffect::ShowContactRemoved(email)]
        }
        ContactsEvent::EditContact(email, new_contact) => {
            if let Some(c) = model.contacts.iter_mut().find(|c| c.email == email) {
                *c = new_contact.clone();
            }
            vec![]
        }
    }
}

pub fn view(model: &ContactsModel) -> ContactsViewModel {
    ContactsViewModel {
        contacts: model.contacts.clone(),
    }
}


Das E-Mail-Feature übernimmt die Funktion der bisherigen E-Mail-App:

Listing 4: email (Feature-Crate)


// email/src/lib.rs
pub enum EmailEvent {
    SendEmail(EmailAddress),
    EmailSent(bool),
}

#[derive(Default)]
pub struct EmailModel {
    pub last_sent: Option,
}

pub struct EmailViewModel {
    pub last_sent: Option,
}

pub enum EmailEffect {
    SendEmailRequest(String),
}


Die Haupt-App aggregiert die Feature-Modelle und koordiniert die Kommunikation:

Listing 5: Haupt-App-Integration (App-Crate)


// app/src/lib.rs
use contacts::{ContactsEvent, ContactsModel, ContactsViewModel, ContactsEffect};
use email::{EmailEvent, EmailModel, EmailViewModel, EmailEffect};

pub enum AppEvent {
    Email(EmailEvent),
    Contacts(ContactsEvent),
}

pub struct AppModel {
    pub email: EmailModel,
    pub contacts: ContactsModel,
}

pub struct AppViewModel {
    pub email: EmailViewModel,
    pub contacts: ContactsViewModel,
}

pub enum AppEffect {
    Email(EmailEffect),
    Contacts(ContactsEffect),
}

pub fn update(event: AppEvent, model: &mut AppModel) -> Vec {
    match event {
        AppEvent::Email(email_event) => {
            email::update(email_event, &mut model.email)
                .into_iter().map(AppEffect::Email).collect()
        }
        AppEvent::Contacts(contacts_event) => {
            contacts::update(contacts_event, &mut model.contacts)
                .into_iter().map(AppEffect::Contacts).collect()
        }
    }
}

pub fn view(model: &AppModel) -> AppViewModel {
    AppViewModel {
        email: email::view(&model.email),
        contacts: contacts::view(&model.contacts),
    }
}


Durch diese Aufteilung bleibt die Anwendung modular, testbar und erweiterbar. Jedes Feature verwaltet seinen eigenen Zustand und lässt sich unabhängig entwickeln, testen und warten. Die Haupt-App sorgt für die Orchestrierung und das Zusammenführen der einzelnen ViewModels zu einer konsistenten Oberfläche. So entsteht eine skalierbare Architektur.



Source link

Entwicklung & Code

GitHub CLI führt standardmäßige Telemetrie-Erfassung ein


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

GitHub CLI erhebt mit Version 2.91.0 Telemetriedaten. Die Datensammelei des offiziellen Kommandozeilentools von GitHub erfolgt clientseitig in pseudonymisierter Form und ist standardmäßig aktiv. Anwenderinnen und Anwender, die das nicht wollen, können per Opt-out aussteigen.

Weiterlesen nach der Anzeige

Die Datenerhebung dient laut GitHub dazu, die agentische Nutzung von GitHub CLI besser zu verstehen. Dazu benötigt das Entwicklungsteam einen Einblick in die praktische Nutzung der Funktionen. Die gesammelten Daten würden in der internen Analyseinfrastruktur von GitHub landen. Nachdem das Telemetriefeature anfänglich lediglich in den Release Notes zu Version 2.91.0 erwähnt und in die Dokumentation aufgenommen wurde, hat es GitHub inzwischen auch offiziell in seinem Blog kommuniziert.

Die Dokumentation für GitHub CLI nennt mehr als 20 Felder wie agent, architecture, is_tty und skill_names, die telemetrisch im Fokus stehen. Über die Umgebungsvariable export GH_TELEMETRY=log oder die Konfigurationsoption gh config set telemetry log lässt sich ein Protokollierungsmodus aktivieren. Wenn das Logging aktiv ist, gibt das Tool einen Einblick in die erhobenen Telemetriedaten, ohne diese jedoch tatsächlich zu übermitteln.

Anwenderinnen und Anwender können GitHub CLI prinzipiell das Datensammeln auf dreierlei Arten untersagen: Über das Setzen der Umgebungsvariable export GH_TELEMETRY=false, wobei ein false-äquivalenter Wert wie 0 oder disabled ebenfalls funktioniert; des Weiteren über export DO_NOT_TRACK=true und zum Dritten per CLI-Konfiguration mit gh config set telemetry disabled.

Mit der Analyse von Nutzerdaten begann GitHub bereits im April dieses Jahres. Eine Änderung der Nutzungsbedingungen erlaubt es der zu Microsoft gehörenden Softwareentwicklungsplattform seitdem, Interaktionen der Anwenderinnen und Anwender mit Copilot Free, Pro und Pro+ für das Modelltraining der eigenen KI zu verwenden. Business- und Enterprise-Konten sind davon ausgenommen. Auch hier gibt es die Möglichkeit, dem per Opt-out zu widersprechen. Erwähnenswert: Das Arch-Linux-Paket deaktiviert die GitHub-Telemetrie ab Version 2.91.0-3 standardmäßig. Bei anderen Distributionen müssen Nutzerinnen und Nutzer selbst aktiv werden.


(mro)



Source link

Weiterlesen

Entwicklung & Code

Software Testing: Warum KI kein Ursache-Wirkung-Denken kann – und wie QFD hilft


Richard Seidl spricht in dieser Folge mit Thomas Fehlmann über Quality Function Deployment (QFD) und die Rolle von Ursache-Wirkung-Denken im Zeitalter großer Sprachmodelle. Sie diskutieren, wie Unternehmen mit QFD Kundennutzen greifbar machen und diesen Nutzen systematisch in Softwaretests übersetzen können.

Weiterlesen nach der Anzeige

Thomas Fehlmann ist seit 2016 offiziell im Ruhestand – theoretisch. Praktisch jedoch bleibt er ein aktiver und leidenschaftlicher Forscher. Seine Arbeit präsentiert er regelmäßig auf internationalen Konferenzen, wo er Erkenntnisse mit Fachkollegen diskutiert und seine neuesten Ergebnisse veröffentlicht. Ursprünglich prägten Themen wie Six Sigma und Prozesssteuerung seine wissenschaftliche Laufbahn. Doch seine Neugier für Künstliche Intelligenz (KI) reicht viel weiter zurück: Bereits im Studium beschäftigte er sich intensiv damit – und blieb der Disziplin treu, selbst durch mehrere KI-Winter hindurch. Heute widmet sich Thomas Fehlmann der Frage, wie Graphmodelle der kombinatorischen Logik helfen können, das Innenleben moderner KI-Modelle nachvollziehbarer zu machen. Sein Fokus liegt darauf, besser zu verstehen, wie KI funktioniert und welchen realen Mehrwert sie für ihre Nutzer schafft.

Bei diesem Format dreht sich alles um Softwarequalität: Ob Testautomatisierung, Qualität in agilen Projekten, Testdaten oder Testteams – Richard Seidl und seine Gäste schauen sich Dinge an, die mehr Qualität in die Softwareentwicklung bringen.

Die aktuelle Ausgabe ist auch auf Richard Seidls Blog verfügbar: „Warum KI keine Ursache-Wirkung kann – und QFD hilft – Thomas Fehlmann“.


(mdo)



Source link

Weiterlesen

Entwicklung & Code

Meta kauft zig Millionen AWS Graviton Cores für Agentic AI


Amazon Web Services und Meta haben eine Vereinbarung bekannt gegeben, nach der Meta mehrere zehn Millionen Graviton5-Cores von AWS verwenden wird. Mit dem Deal wird Meta zu einem der größten Graviton-Kunden, und die Vereinbarung sieht eine Erweiterung um weitere Graviton-Kerne vor, wenn Metas Bedarf wächst.

Weiterlesen nach der Anzeige

Meta will die zusätzliche Rechenleistung vor allem für den Bereich Agentic AI nutzen. Für das Training von KI-Modellen sind GPUs besser geeignet als CPUs. Im Bereich Agentic AI müssen autonome Agenten jedoch komplexe Aufgaben planen und ausführen, wofür sich CPUs besser eignen.

Amazon hatte die Graviton5-Chips im Dezember 2025 auf der re:Invent 2025 vorgestellt.



Meta wird zahlreiche Graviton-Chips nutzen.

(Bild: Amazon)

Amazon bezeichnet die Graviton-CPU als Cloudprozessor, der speziell für energieeffiziente Cloudanwendungen konzipiert ist. Graviton setzt wie die Axion-Chips von Google und die Cobalt-Chips von Microsoft auf eine ARM-Architektur. Im März 2026 hat ARM erstmals einen eigenen Prozessor vorgestellt: Die AGI CPU, deren Name an die Artificial General Intelligence angelehnt ist, hat ARM zusammen mit Meta und TSMC entwickelt.

Die Graviton5-Chips haben 192 Kerne und einen deutlich größeren L3-Cache als das Vorgängermodell. Weitere Details lassen sich den offiziellen Ankündigungen von Meta und von Amazon entnehmen.

Weiterlesen nach der Anzeige


(rme)



Source link

Weiterlesen

Beliebt