Boehrsi.de - IT und Gaming Blog

Git Commits signieren - Extra Sicherheit für die Versionsverwaltung

Erstellt am event 22.07.2020 - 09:00 Uhr von account_circle Boehrsi in label Development
Git Commits signieren - Extra Sicherheit für die Versionsverwaltung Bild

Ich habe vor einiger Zeit angefangen jeden Git Commit zu signieren. Die Anregung dafür kam von einem Kollegen und dafür ein Dankeschön an Frank open_in_new. Für alle die nicht wissen worum es geht, ein Git Commit kann signiert werden, so wie auch Emails und andere Inhalte signiert werden können. Damit wird nachgewiesen dass ein Commit auch wirklich von der angegebenen Person stammt. Dieser Bonus an Vertrauen ist vor allem in Repositories mit vielen aktiven Nutzern hilfreich, aber auch in kleinen Repositories oder privaten Projekten gibt er ein zusätzlich Stück extra Sicherheit.
Um seine Commits zu signieren sind folgende Schritte nötig, außerdem muss man vielleicht noch das eine oder andere kleine plattformspezifische Problem aus der Welt schaffen.

Related Links

IntelliJ IDEA & Gradle - Build-Probleme nach Java Update

Erstellt am event 08.07.2020 - 09:00 Uhr von account_circle Boehrsi in label Development
IntelliJ IDEA & Gradle - Build-Probleme nach Java Update Bild

Vor kurzem aktualisierte ich meine Java Umgebung und damit einher gingen natürlich Probleme mit diversen älteren Java Projekten. Eines der Probleme brachte meine gesamte Gradle Toolchain aus dem Konzept. Die Fehlermeldung Could not initialize class org.codehaus.groovy.classgen.Verifier sorgte umgehend für einen Abbruch jeglicher Gradle Tasks.
Ich konnte das Problem nach einigen Recherchen allerdings beheben. Um euch selbige Suche zu ersparen, gibt es nun eine kleine Zusammenfassung der nötigen Schritte, um IntelliJ IDEA 2020.1.2 + Gradle wieder zum Laufen zu kriegen.

Related Links

Git Passwort ändern - Windows Credential Manager

Erstellt am event 06.07.2020 - 20:30 Uhr von account_circle Boehrsi in label Development
Git Passwort ändern - Windows Credential Manager Bild

Sofern ihr unter Windows unterwegs seid und ein Git Repository nutzt, kennt ihr sicherlich den Credential Manager. Er hilft euch dabei nicht immer und immer wieder eure Daten eingeben zu müssen. Doch leider bemerkt er nicht automatisch wenn sich mal ein Passwort ändert.
Ihr erhaltet im Falle von geänderten Credentials also nur eine Rückmeldung vom nicht erfolgreichen Git Befehl, ohne weitere Möglichkeit das neue Password einzutragen. Vor kurzem hatte ich genau dieses Problem und um dem einen oder anderen die Sucherei zu ersparen, hier nun der Weg zum Ziel.
Öffnet die Systemsteuerung und wählt dort links oben Anmeldeinformationsverwaltung. Im folgenden Fenster findet ihr nach einem Klick auf Windows-Anmeldeinformationen alle nötigen Einträge. Unter Generische Anmeldeinformationen finden sich die gespeicherten Git Zugänge und auch weitere Logins (z.B. für Netzlaufwerke) sind auf dieser Seite zu finden. Ihr könnt einen der Einträge wählen, bearbeiten klicken und die neuen Daten eintragen. Folgend sollte alles wieder Ordnungsgemäß funktionieren.

Related Links

Flutter App Development - Teil 6 - RSS Entries und mehr

Erstellt am event 11.06.2020 - 09:00 Uhr von account_circle Boehrsi in label Development
Flutter App Development - Teil 6 - RSS Entries und mehr Bild

Heute geht es weiter mit den eigentlichen Einträgen eines RSS Feeds. Die dazugehörigen Dateien befinden sich im lib/entry_list/ open_in_new Package und sind verglichen mit der lib/feed_list/ open_in_new Logik etwas einfacher zu handhaben. Dieser Beitrag ist der Abschluss meiner kleinen Tutorialreihe und den gesamten Source-Code findet ihr auf Github. Links zu den gennannten Dingen findet ihr in den Related Links. Mit diesen kurzen Worten der Einleitung möchte ich heute direkt mit dem User Interface starten.

Related Links

IntelliJ IDEA + GUI Builder + Gradle - How to

Erstellt am event 30.05.2020 - 15:00 Uhr von account_circle Boehrsi in label Development
IntelliJ IDEA + GUI Builder + Gradle - How to Bild

Von Zeit zu Zeit baue ich Java Programme mit einem User Interface. Dies tue ich gerne mit dem IDEA GUI Designer, denn auch wenn Java UI generell eher nicht das idealste ist, manchmal ist sie einfach passend für den Einsatzzweck.
Zusätzlich nutze ich aber auch gerne Gradle als Build-Tool meiner Wahl. Die Kombination aus Gradle + IntelliJ IDEA + GUI Designer ist aber leider etwas problematisch und so hatte ich einige Probleme nach diversen Updates meiner Projekte, eine lauffähige JAR zu erzeugen.
Um euch diese Arbeit zu ersparen habe ich aus verschiedenen Stack Overflow Beiträgen (Beitrag #1 open_in_new, Beitrag #2 open_in_new, Beitrag #3 open_in_new) und der offiziellen Dokumentation für Gradle Einstellungen zusammengesucht, welche ich an euch weiterleiten möchte.
Initial benötigt ihr die forms_rt.jar aus dem JetBrains/IntelliJ IDEA Community Edition/IntelliJ IDEA Community Edition/lib Ordner in eurem Projekt. Um dies zu erreichen und auch Updates automatisch mitnehmen zu können, habe ich einfach einen Symlink erstellt. Somit liegt die Datei nun ebenfalls in meinem Projekt im libs Ordner. Ihr könnt die Datei aber natürlich auch einfach manuell in euer Projekt kopieren.

Related Links

Flutter App Development - Teil 5 - RSS Feed Formular

Erstellt am event 23.05.2020 - 11:30 Uhr von account_circle Boehrsi in label Development
Flutter App Development - Teil 5 - RSS Feed Formular Bild

Nachdem es durch die Neuinstallation des Servers und diverse andere Themen mal wieder ein paar Verzögerungen gab, geht es nun weiter mit meiner kleinen Futter Tutorialreihe. Heute gehe ich auf das Formular ein, welches das Hinzufügen und Bearbeiten von RSS Feeds erlaubt.
Ich werde heute lediglich eine Klasse beleuchten, da ich das Gefühl habe in anderen Beiträgen wurde etwas viel auf einmal erläutert. So hoffe ich etwas nachvollziehbarere Erklärungen liefern zu können. Wie gesagt ist auch für mich diese umfangreiche Tutorialreihe etwas Neues und zugleich ist sie sehr aufwendiges. Ich versuche entsprechend direkt während der Erstellung und wenn ich mir meine eigenen Beiträge später noch einmal anschaue, Dinge zu optimieren.
Doch nun zum eigentlichen Thema, dem Verwalten der RSS Feeds über ein Formular in Flutter, inklusive simpler Validierung der Eingaben und Übergabe der Daten an unseren BloC.

Related Links

Flutter App Development - Teil 4.2 - Main und RSS-Feed-Logik

Erstellt am event 04.05.2020 - 20:30 Uhr von account_circle Boehrsi in label Development
Flutter App Development - Teil 4.2 - Main und RSS-Feed-Logik Bild

Aufgrund der Länge des Beitrags habe ich diesen Abschnitt des Tutorials noch einmal aufgeteilt. Die erste Hälfte (Main Logik) findet ihr hier.

Nachdem wir nun die App initial laden können, geht es weiter mit der Liste der RSS Feeds. Dieser Bereich besteht bei mir aus fünf Dateien. Im feed_list Package open_in_new befinden sich die feed_list.dart open_in_new, feed_list_barrel.dart open_in_new, feed_list_bloc.dart open_in_new, feed_list_change.dart open_in_new und feed_list_events_states.dart open_in_new. Der Aufbau ist sehr ähnlich unserem Main Konstrukt, mit einer weiteren Datei, welche das Hinzufügen, Bearbeiten und Löschen über die UI ermöglicht. Die Event / State Datei (lib/feed_list/feed_list_events_states.dart open_in_new) und die Barrel Datei (lib/feed_list/feed_list_barrel.dart open_in_new) wird im Folgenden nicht weiter erläutert, da sie trivial sind.
Beginnen werden wir nun mit dem FeedListBloc. Dieser könnte als Herzstück der App bezeichnet werden, da er sowohl die RSS Feeds verwaltet, wie auch Updates aller Feeds durchführen kann. Die gesamte App arbeitet dabei mit nur einem FeedListBloc, welcher bereits in der lib/main.dart open_in_new erstellt und mittels eines Providers darunterliegenden Strukturen zur Verfügung gestellt wird. Damit kann sichergestellt werden, dass keine unnötigen Objekte erzeugt werden oder aber falsche States aktualisiert werden.

Related Links

Flutter App Development - Teil 4.1 - Main und RSS-Feed-Logik

Erstellt am event 04.05.2020 - 20:00 Uhr von account_circle Boehrsi in label Development
Flutter App Development - Teil 4.1 - Main und RSS-Feed-Logik Bild

Nun geht es in die vollen, denn heute bauen wir unsere erste richtige Logik. Am Ende des vierten Teils dieser Tutorialreihe soll die initiale Logik zum Start der App und die RSS Feed Logik implementiert sein. Zur Umsetzung erstellen wir den MainBloc (lib/main/main_bloc.dart open_in_new), der die Datenbank lädt und später z.B. das Laden der Konfiguration übernehmen kann. Sobald dieser Vorgang abgeschlossen ist, sollen alle RssFeed Objekte mit Hilfe des FeedListBloc (lib/feed_list/feed_list_bloc.dart open_in_new) aus der Datenbank geladen werden.
Damit die Datenbank auch mit Inhalt gefüllt ist, soll es über die UI möglich sein einen neuen Feed anzulegen. Sowohl für das Laden der RssFeeds, wie auch für das Hinzufügen wird der FeedListBloc genutzt. Außerdem erstellen wir geeignete Widgets zur Darstellung der Liste (lib/feed_list/feed_list.dart open_in_new) und des Formulars (lib/feed_list/feed_list_change.dart open_in_new), wobei letzteres im nächsten Teil der Reihe umgesetzt wird.
In diesem Zuge habe ich auch eine kleine Umbenennung vorgenommen, denn unser RssList Widget (nun FeedList Widget) und alle damit verwandten Klassen, befinden sich nun im FeedList Kontext open_in_new (Namen und Pakete). Dieser Name gefiel mir einfach besser und ist gleichzeitig kürzer und deutlicher. Die Bezeichnung für den Typ bleibt allerdings unverändert bei RssFeed.

Damit das Verstehen der folgenden Schritte leichter fällt, beginne ich mit einem schnellen Einblick in das BloC Konzept. Ich empfehle euch allerdings die offizielle Dokumentation open_in_new zum Thema anzuschauen, wenn ihr das Ganze aktiv nutzen wollt. Sie ist übersichtlich, gut gemacht und bietet außerdem diverse gute Beispiele.
BloC oder auch Business Logic Components ist mein aktuell favorisierter Weg, um Logik von UI und wiederum von Daten zu trennen. Dafür wird sehr intensiv auf das Konzept von Streams open_in_new gesetzt. Ein BloC interagiert immer mit zwei Streams, einem für den Input (Events) und einen für den Output (States), dabei sollte jedes Event zu mindestens einem passenden State führen. Im konkreten Library Kontext wird dafür die mapEventToState() open_in_new Methode genutzt. Sofern ihr einen BloC erstellt und Bloc open_in_new erweitert, müsst ihr sowohl die akzeptierten Events dieses BloC, wie auch die dazugehörigen States angeben. Diese definiert man meist in einer gesonderten Datei, wodurch ein übersichtlicher klarer Rahmen von erlaubten Eingaben und Ausgaben definiert wird.
Events können von der UI, z.B. durch einen Tap auf einen Button, kommen oder aber von anderen BloCs, bzw. tieferliegenden Komponenten. States werden vom BloC erzeugt und meist von der UI verarbeitet und führen zu automatischen Anpassungen von selbiger. Allerdings können auch andere BloCs auf State Änderungen hören und entsprechend Aktionen durchführen. Es ist außerdem erlaubt im Laufe der Verarbeitung mehrere States zu liefern. So macht es bei längeren Aktionen zum Beispiel Sinn, am Anfang einen Loading State zu übergeben und nach Abschluss einen State der die finalen Daten zurückgibt.
Entsprechend gibt es verschiedene Quellen für Events und verschiedene Ziele für States, auch mehrere gleichzeitig sind möglich. Streams bieten hier viele Freiheiten und Flexibilität, es ist allerdings extrem wichtig alles ordentlich zu dokumentieren und klare Flows zu etablieren. Denn mit großer Flexibilität kommt sonst großes Chaos.

Related Links

Flutter App Development - Teil 3 - Typen und die Datenbank

Erstellt am event 29.04.2020 - 17:30 Uhr von account_circle Boehrsi in label Development
Flutter App Development - Teil 3 - Typen und die Datenbank Bild

Nach dem der letzte Teil ein sehr langes Intro war, erstellen wir nun die Typen und die Datenbank, inklusive Wrapper-Objekten, welche uns die einfache Nutzung der Datenbankinhalte innerhalb der BloCs erlauben sollen. Neben einer sehr kleinen Basisklasse (lib/types/database_entry.dart open_in_new) für die Typen, gibt es zwei Haupttypen. Einmal den RssFeed (lib/types/rss_feed.dart open_in_new) und den RssEntry (lib/types/rss_entry.dart open_in_new). Diese beiden bilden die initiale Datenbasis, mit welcher ich arbeiten möchte. Im folgenden findet ihr Code-Teile der genannten Klassen und einige Erklärungen dazu.

lib/types/database_entry.dart (Code auf GitHub open_in_new)

abstract class DatabaseEntry {
  Map<String, dynamic> toMap();

  int get id;
}

Diese kleine Basisklasse zwingt unsere Typen dazu, sowohl ein Mapping Funktion zur Verfügung zu stellen, wie auch einen Getter für die Id. Die Mapping Funktion ist relevant, da unsere Datenbank JSON open_in_new als internes Format nutzt und entsprechend gerne mit Key-Value-Maps arbeitet. Ich hätte hier gerne noch Wrapper-Funktionen für die Erstellung der jeweiligen Objekte hinzugefügt, aber dafür wäre Generic-Black-Magic nötig gewesen, welche den Umfang dieses Tutorials sprengen würde.

Related Links

Flutter App Development - Teil 2 - Libraries und Architektur

Erstellt am event 27.04.2020 - 20:00 Uhr von account_circle Boehrsi in label Development
Flutter App Development - Teil 2 - Libraries und Architektur Bild

Womit geht es in Teil zwei weiter habe ich mich gefragt. Sowohl die UI, wie auch die eigentliche Architektur könnten ein Thema sein. Ich persönlich bevorzuge erst die Logik, dann die UI und entsprechend machen wir heute auch weiter. Bevor wir jetzt aber alles selber schreiben, binden wir erst einmal relevante Libraries ein. Denn es gibt ein paar Dinge die man nicht unbedingt selber schreiben möchte.

pubspec.yaml (Code auf GitHub open_in_new)

name: fss
description: Fluttery Site Summaries - RSS the Flutter way

version: 1.0.0+1

environment:
  sdk: ">=2.7.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  bloc: ^4.0.0
  flutter_bloc: ^4.0.0
  flutter_html: ^0.11.1
  http: ^0.12.0+4
  intl: ^0.16.1
  path_provider: ^1.6.7
  sembast: ^2.4.2
  url_launcher: ^5.4.5
  webfeed: ^0.4.2

dev_dependencies:
  flutter_test:
    sdk: flutter
  pedantic: ^1.9.0

flutter:
  uses-material-design: true
Related Links
format_list_numbered  Seite 1 Nächste navigate_next