C#: Finde die ungerade oder gerade Zahl in einem Array

Ausgangslage

  • Das Array enthält immer Werte
  • Die Werte können gerade oder ungerade Zahlen sein
  • Möglicher Array Aufbau:
    • x beliebige gerade Zahlen + 1 ungerade Zahl
    • x beliebige ungerade Zahlen + 1 gerade Zahl

Lösungsvorschlag

public static int FindEvenOrOddNumber(int[] numbers)
{
    var oddV = numbers.Where(x => x % 2 != 0).ToList();
    var evenV = numbers.Where(x => x % 2 == 0).ToList();

    return (oddV.Count > 1) ? evenV.First() : oddV.First();
}

Unit-Tests

[Test]
public void FindEvenOrOddNumberTest()
{
    int[] numbers = { 2, -4, 6, 
8, -10, 9, 12, -16 };
    Assert.IsTrue(9 == Snippets.FindEvenOrOddNumber(numbers));
}

[Test]
public void FindEvenOrOddNumberTest2()
{
    int[] numbers = { 222444888, 7, 19, 1979, 89, 1, 25787, 11,1979};
    Assert.IsTrue(222444888 == Snippets.FindEvenOrOddNumber(numbers));
}

Meine Notizen zu SAP ABAP

AAdvanced
BBusiness
AApplication
PProgramming

ABAP Concepts:

  • Transaction
  • Programm
    • Manage Business Process
  • Screen
  • Data Dictionary
    • Database
  • Subroutine
    • Divide long programs to a subroutine
  • GUI Status
    • Custom Menus

ABAP Objects

Naming Conventions

  • Customer objects prefixed with “Y” or “Z” (from A to X used by SAP)
  • Object names denote functionality
  • Variable names denote usage
  • Never use literal values (SELECT * from VBAK WHERE AUART IN (‘ZSP0’, ‘ZSP2’).
  • Interfacenames start with IF_* / ZIF_*
  • Variablename: lv_<name> => local variable

Prefixes

lv_local variable
ls_local structure
ty_type (Datastructure)
lt_local table

A Framework Class

Global Class

Inheriting a global class

Remove final attribute from the class to inheriting

Change the visibility from the instance attribute to protected

To inheriting a class do:

CLASS <name> DEFINITION
  INHERITING FROM <class_to_inheriting_from>.

Abstract Class

Define a base class as abstract

Sonstiges

lv_text = TEXT-t01 && | | && lv_text.
Space character in a text&& | | &&
TEXT-<xxx>Textsymbol
*Comment out a line
CLASS <name> DEFINITION
ENDCLASS.
Interface
CLASS <name> IMPLEMENTATION
ENDCLASS.
Class object
CLASS IMPLEMENTATION
INHERITING FROM <class_name>.
ENDCLASS.
Inheriting
METHODES:
show_details REDEFINITION.
Overwriting an inheriting methode
super->show_details( ).Call the methode in the superclass
TRY.
lcl_start=>run ( ) .
CATCH cx_root INTO lcl_start=>mo_error.
ENDTRY.
Unhandled exceptions cause short dumps
1Paket
2Unterpaket
3Globale Klassen eines Unterpaketes
4Programme (Reports) eines Unterpaketes
5Program (Report) mit Klassen, Felder usw.

Prüfen, aktivieren und ausführen

ABAP Unit / Test Classes

CLASS lcl_test DEFINITION
      FOR TESTING
      DURATION SHORT
      RISK LEVEL harmless.

      PRIVATE SECTION.
      DATA: lo_test TYPE REF TO zcl_main "class under test
      METHODES: setup, teardown          "Fixture methodes
      METHODES: test_method1 FOR TESTING "Test method

ENDCLASS.
FOR TESTINGmark as an unit test class
DURATIONSHORT
MEDIUM
LONG
RISK LEVELHARMLESS (no changes to data or settings)
DANGEROUS (date may changed)
CRITICAL (data or settings may be changed)
CL_ABAP_UNIT_ASSERTEvaluating test results

Elementare Datentypen

Elementare ABAP-Typen

cTextfeldFixe länge
NNummern TextfeldFixe länge
DDatumsfeldFixe länge
TZeitfeldFixe länge
XHexadezimalFixe länge
PGepackte ZahlFixe länge
IIntegerFixe länge
FFloatFixe länge
STRINGTextVariable Länge
XSTRINGByteVariable Länge

Lokale Datenstruktur

TYPES: BEGIN OF ty_matdata,
  matnr TYPE c LENGTH 15,
  mattext TYPE c LENGTH 30,
  matunit TYPE c LENGTH 3,
  END OF ty_matdata.

Zuweisung / Nutzung der lokalen Struktur

data ls_matdata type ty_matdata.

ls_matdata-matnr = '1'.

Lokale Tabelle

data lt_material type TABLE OF ty_matdata.

Tabelle befüllen:

do 5 times.

* sy-index => runtime variable mit aktuellem index
  ls_matdata-matnr = sy-index.
  CONCATENATE 'Mein Material' ls_matdata-matnr into ls_matdata-mattext.
  ls_matdata-matunit = 'ST'.
  append ls_matdata to lt_material.

ENDDO.

Tabelle ausgeben:

loop at lt_material into ls_matdata.
* / => Zeilenumbruch  
  write / ls_matdata.
ENDLOOP.

Tabelle ausgeben mit FIELD-SYMBOLS: (Performence)

*&---------------------------------------------------------------------*
* FIELD-SYMBOLS
*&---------------------------------------------------------------------*
FIELD-SYMBOLS <fs_matdata> type any.

loop at lt_material ASSIGNING <fs_matdata>.
* / => Zeilenumbruch
  write / <fs_matdata>.
ENDLOOP.

Wichtige Befehle

DO x TIME.
<code>
ENDDO.
CONCATENATE
APPEND
LOOP AT <table> INTO <record>.
ENDLOOP.
WRITE
DATA <name> TYPE <Datentyp>
IF <Abfrage>. (=, >, <…)
ELSEIF <Abfrage>
ELSE.
ENDIF.
CASE <Variable>.
WHEN <Bedingung>.
WHEN <Bedingung 2>.
WHEN OTHERS.
END CASE.

Open SQL

SELECT * FROM <table> INTO TABLE <lt_name>Einfache Select-Abfrage
SELECT * FROM <table> INTO CORRESPONDING FIELDS OF TABLE <lt_name> Select-Abfrage, welche nur die namensgleichen Felder berücksichtigt

Nützliches

GitHub: SAP Styleguides

https://github.com/SAP/styleguides/blob/main/clean-abap/cheat-sheet/CleanABAPCheatSheetV1.4.1.pdf

Meine Notizen zu SAP Transaktionen

Transaktioncode => Shortcut to a program and a screen

Ausführen:

eingabe <Transaktioncode>

Ausführen in einem neuen Fenster:

/o<Transaktioncode>

TransaktionsBeschreibung
SE80Object Navigator (Entwicklungsumgebung)
Object Navigator
SE38ABAP Editor
ABAP Editor
SM30Tabellenpflege (Pflegedialog)
Tabellenpflege
ST22ABAP-Dumpanalyse (Fehlersuche / Laufzeitfehler)
ABAP-Dumpanalyse
SE11Data Dictionary (Datenbank)
Data Dictionary
SE16NData Browser (Tabelleninhalt bearbeiten)
Data Browser
STMSSAP Transport Management System (Übersicht)
STMS
SE10Transportauftrag
Transportorganizer
SM50Workprozessübersicht
Workprozessübersicht SAP
SM51Liste der SAP-Systeme
Liste der SAP-Systeme
SE91Nachrichtenpflege
Nachrichtenpflege
SENUMNummernkreispflege
Nummernkreispflege
SE93Transaktionspflege
Transaktionspflege
ST05Performance-Trace
Performance-Trace

Shortcuts

F1SAP Hilfe
F3Zurück
Shift + F3Beenden
F8Ausführen
F12Abbrechen

Meine Notizen zu Scrum – Artefakte

Das Product Backlog

Das Product Backlog ist der Schreibtisch, das Product Owners, welches immer aktuell und sauber geführt werden muss. Es ist eine priorisierte Liste mit Anforderungen / Requirements. Es besteht aus den User Stories, welche eine Anforderung in einem Satz erklären, den Akzeptanzkriterien, Schätzung der Komplexität und den Epics (Grosse Anforderungen, welche noch in User Stories aufgeteilt werden müssen)

DEEP- Kriterien

  • Detailed Appropriately (angemessen detailiert)
  • Estimated (geschätzt)
  • Emergent (mehr als eine Summe der Einzelteile)
  • Prioritized (priorisiert)

User Stories

INVEST-Kriterien:

  • Independent (unabhängig)
  • Negitiable (verhandelbar – veränderbar bis in Sprint Backlog aufgenommen)
  • Valueable (werthaltig)
  • Estimable (schätzbar)
  • Small (klein genug)
  • Testable (testbar)

Akzeptanzkriterien

  • Was muss sonst noch beachtet werden (Filterung, Sortierung…)

Möglicher Aufbau:

Als @Rolle@ @möchte ich@ Ziel, so dass @Nutzen@

Nützliche Links

Meine Notizen zu Scrum – Events

Sprint Zero

  • Projektspezifische Aspekte
    • Gemeinsame Vorstellung / Vision erhalten des Produktes
    • Wann und wo werden die Stakeholder eingebunden
    • Risiken, ungefähre Dauer und Kosten
  • Teamspezifische Aspekte
    • Arbeitszeiten, Werte, was ist die Projektsprache
    • Erstellung der
      • Definition of Done (Wann ist eine Anforderunge Fertig?)
      • Definition of Ready (Wie muss der Product Owner eine Anforderung beschreiben?)
  • Organisationsspezifische Aspekte
    • Schlüsseltermine
    • Informationen rund um das Projekt
    • Zusammenkommen mit Stakeholdern

Sprint Planning

  • Dauer von 1 bis 4 Std.
  • Formulierung des Sprint-Ziels
  • Was wird in diesem Sprint Umgesetzt?
    • Wie viele User Stories können im Sprint umgesetzt werden
    • Übernehmen ins Sprint Backlog

Benötigte Vorarbeiten:

  • Vorbereitetes Product Backlog
  • Vorstellung der Anforderungen (User Stories) durch den Product Owner
  • Erstellung des Sprint Backlogs

Daily Scrum Meeting

Ist ein Event für das Development Team. Product Owner und Scrum Master sind nicht zwingend erforderlich. Die Praxis zeigt aber, dass es doch empfehlends Wert ist.

  • Time Box von 15 min.
  • Jeder beantwortet diese Fragen:
    • Was habe ich gestern erreicht, das dem Entwicklungsteam hilft, das Sprint-Ziel zu erreichen?
    • Was werde ich heute erledigen, um dem Entwicklungsteam bei der Erreichung des Sprint-Ziels zu helfen?
    • Sehe ich irgendwelche Hindernisse (Impediments), die mich oder das Entwicklungsteam vom erreichen des Ziels abhalten?

Sprint Review

Am Ende des Sprints stellt das Entwicklungsteam die umgesetzten Anforderungen vor. Der Product Owner nimmt die User Stories ab. Der Scrum Master organisiert und moderiert (bei Unstimmigkeiten Entwicklungsteam – Product Owner) das Review.

  • Wiederholung des Sprint-Ziels
  • Vorstellung der neu gewonnen Funktionalitäten
  • Vorstellung der umgesetzten User Stories
  • Abnahme durch den Product Owner
    • Bei Abnahme: Anforderung gilt als umgesetzt
    • Bei Ablehnung durch eine der Begründungen:
      • Akzeptanzkriterium nicht erfült
      • Punkt der Definition of Done verletzt

Sprint Retrospektive

Für den Scrum Master ist sie das Herzstück des Frameworks. Im Fokus steht hier die Zusammenarbeit im Team und soll aufzeigen, was noch optimiert oder verbessert werden kann. Es sollen nur Personen aus dem Scrum Team teilnehmen.

  • Wie gut haben wir Scrum als Framework bereits adaptiert?
  • Wie läuft unsere Zusammenarbeit?
  • Was hinder uns, Scrum noch besser zu nutzen?

Folgende Regeln sind Zwingend zu befolgen:

Egal was wir heute erkennen, wir sind fest davon überzeugt, dass alle Beteiligten zu jedem Zeitpunkt nach bestem Wissen, Gewissen und Kenntnisstand gehandelt haben.

Norman Kerth, 2001

Was auch immer in Vegas passiert, bleibt in Vegas.

Vegas-Regel

Sprint

  • Für den Scrum Master ist die Impediment-Liste das zentrale Artefakt für die allgemeine Organisation des Sprints
  • Der Scrum Master ist für einen reibungslosen Verlauf des Sprints verantwortlich
  • Der Product Owner sollte für den Rest des Teams zuallersrt als Ansprechpartner immer zu Verfügung stehen
  • Das Development Team sollte sich zuallererst während des Sprints Komplett aus sich selbst und sein Sprint Backlog konzentrieren

Nüztliche Links

Meine Notizen zu Scrum – Kurzüberblick

Meine Notizen zu Scrum – Rollen

Product Owner

Dem Product Owner gehört das Produkt, an dem gearbeitet wird. Er trägt die komplette Verantwortung hinter dem Wert des Produktes. Er ist die Schnittstelle zwischen dem Scrum Team und allen anderen Stakeholdern.

Wichtige Punkte:

  • Mit welchen Anforderungen kann ich den Wert des Produktes für alle Anwender maximieren?
  • Wann wird das Produkt / Inkrement ausgeliefert?

Scrum Master

Scrum Master ist ein Vorbild beim Scrum Prozess, er ist quasi der Motor des Scrum Prozesses.

  • Scrum Experte – Muss immer auf dem neusten Stand sein
  • Change Agent – Bei Einführung von Scrum trägt er eine wichtig Rolle mit
  • Facilitator – Kümmert sich um alle Probleme im Team und löst diese
  • Prozesswächter – Überwacht den Prozess / Rahmen – Events müssen korrekt durchgeführt werden
  • Coach – Moderiert, führt Gespräche

Development Team

Ist eigenverantwortlich für die Umsetzung des vom Product Owner gesetzten Anforderungen. Es muss für die Umsetzung alle benötigten Kompetenzen besitzen – es muss crossfunktional sein.

Nützliche Links:

Meine Notizen zu Scrum – Kurzüberblick

Meine Notizen zu Scrum – Kurzüberblick

Agiles Framework für die Produktentwicklung. Dabei ist das Framework ein leichtgewichtiges Framework und gibt nur einen groben Rahmen vor, lässt jedoch viel Spielraum offen.

Die 5 Prinzipien von Scrum:

  • Kurze Iterationen
  • Selbstorganisation
    • Team kann sich selbstorganisieren
    • Technischeumsetzung liegt in der freiheit des Teams
  • Inspect and Adapt (Überprüfen und Anpassen)
    • Stetige Überprüfung und massnahmen zur Verbesserung
  • Regelmässige Lieferung
    • Dadurch regelmässiges Feedback des Kunden
    • Entwicklung kann immer wieder bestmöglichst angepasst werden
  • Transparenz
    • Alle Aspekte müssen für alle beteiligten transparent sein

Der Rahmen des Framwork besteht aus:

  • Events (regelmässiges Zusammenkommen)
    • Sprint Planning
    • Daily Scrum (Daily Standups ca. 15 min.)
    • Scrum Review
      • Prüfung ob die Anforderungen / Inkremente wirklich umgesetzt wurden
      • Entsprechen sie dem gemeinsamen Verständnis von fertig (Done)
    • Scrum Retrospektive
      • Schliesst den Sprint ab
  • Rollen
    • Scrum Master
      • Coaching Rolle für den Product Owner, Development Team und Organisation, um Scrum zu verinnerlichen
      • Einen Rahmen zu schaffen, in dem jede Person seine Aufgabe bestmöglich ausüben kann
    • Product Owner
      • Für die fachlichen Anforderungen zuständig
      • Pflege des Product Backlog
    • Developmet Team
      • Zuständig für die Umsetzung der fachlichen Anforderungen
  • Artefakten
    • Product Backlog
      • Sammlung aller möglichen Anforderungen (User Stories, Epics) und Inkrementen
    • Sprint Backlog
      • Enthält alle Anforderungen, welche umgesetzt werden
      • Darf sich nie während einem sprint verändern

Nützliche Links

Meine Notizen zu Scrum – Rollen

Meine Notizen zu Scrum – Events

Meine Notizen zu Scrum – Artefakte

wikipedia: Scrum

C# 9: Verbessertes “Pattern Matching”

Relational Patterns

Ab C# 9 können Werte mit Relational Patterns geprüft werden:

<kleiner als
>grösser als
<=kleiner oder gleich
>=grösser oder gleich

Dazu nun ein Code Beispiel:

using System;

namespace ConsoleApp2
{
    class Program
    {
        public class Animal
        {
            public string Name { get; set; }
            public int Weight { get; set; }
            public int YearOfBirth { get; set; }
        }

        static void Main(string[] args)
        {
            var animal = new Animal()
            {
                Name = "Tiger"
                ,Weight = 300
                ,YearOfBirth = 2016
            };

            if (animal is Animal { Weight: > 200 } animalWeightMoreThen200)
            {
                Console.WriteLine($"Animal is more then 200kg! " +
                    $"Weight: {animalWeightMoreThen200.Weight}kg");
            }
        }
    }
}

Wir haben ein Objekt Animal. Bevor wir mit diesem Objekt arbeiten, prüfen wir, ob es vom Typ Animal ist. Mit einem “Relational Pattern” können wir nun auch sicherstellen, dass unser Tier mehr als 200 kg wiegt, bevor wir damit arbeiten.

Pattern Combinators

Seit C# 9 haben wir nun auch die Möglichkeit mehrere Patterns zu kombinieren. Dazu haben wir folgende Möglichkeiten:

andund
oroder
notnicht

Dazu nun ein Code Beispiel:

using System;

namespace ConsoleApp2
{
    class Program
    {
        public class Animal
        {
            public string Name { get; set; }
            public int Weight { get; set; }
            public int YearOfBirth { get; set; }
        }

        static void Main(string[] args)
        {
            var animal = new Animal()
            {
                Name = "Tiger"
                , Weight = 299
                , YearOfBirth = 2016
            };

            if (animal is Animal { Weight: > 200 and < 300, 
                Name: "Tiger" } tigerWeightBetween200And300)
            {
                Console.WriteLine($"The tiger weight is between 200kg and 300kg! " +
                    $"Weight: {tigerWeightBetween200And300.Weight}kg");
            }
        }
    }
}

Wir haben ein Objekt Animal. Bevor wir mit diesem Objekt arbeiten, prüfen wir, ob es vom Typ Animal ist. Mit den kombinierten “Relational Patterns” können wir nun auch sicherstellen, dass unser Tier mehr als 200 kg und weniger als 300 kg wiegt und der Name Tiger ist, bevor wir damit arbeiten.

Nützliche Links

Microsoft docs: Pattern matching enhancements

C# 9.0: Improved Pattern Matching

Raspberry Pi Imaging Utility: Die magische Tastenkombination ab V. 1.6

Ab der Version 1.6 des Raspberry Pi Imager kann mit der Hilfe der neuen Tastenkombination das Image für den Raspberry Pi zusätzlich konfiguriert werden.

ctrl + shift + x

Diese neue Tastenkombination erlaubt die Vorab-Konfiguration von SSH und WLAN sowie das Setzen der Spracheinstellungen und das festlegen des Hostnamen. Wird der Raspberry Pi an einem Monitor betrieben, hat man nun auch die Möglichkeit, den “Overscan” zu deaktivieren. Dadurch wird der standardmässige schwarze Rahmen um das Bild ausgeschaltet.

Nützliche Links

Raspberry Pi Imaging Utility

Raspberry Pi OS Lite installieren mit dem Raspberry Pi Imager