Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 15 additions & 4 deletions .github/workflows/quality.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
name: Quality
on: [ push ]
on: [push]
jobs:
build:
uses: ./.github/workflows/build-deploy.yml
secrets:
CI_APP_ID: ${{ secrets.CI_APP_ID }}
CI_APP_PRIVATE_KEY: ${{ secrets.CI_APP_PRIVATE_KEY }}
with:
CI_APP_PRIVATE_KEY: ${{ secrets.CI_APP_PRIVATE_KEY }}
with:
upload-artifact: true
artifact-name: quality-check-build
check-links:
Expand Down Expand Up @@ -34,4 +34,15 @@ jobs:
- name: Install
run: npm install
- name: Lint
run: npm run lint
run: npm run lint
check-eszett:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup node
uses: actions/setup-node@v4
- name: Install
run: npm install
- name: Check for German eszett
run: npm run check-eszett
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ Wähle die Sichtbarkeit so restriktiv wie möglich – am besten in dieser Reihe
4. `public`

**Begründung:**
Je offener die Sichtbarkeit, desto größer das Risiko von ungewollten Abhängigkeiten und Nebenwirkungen.
Wenn etwas `public` ist, kann es von beliebigen anderen Packages (auch außerhalb deines Projekts) genutzt werden.
Je offener die Sichtbarkeit, desto grösser das Risiko von ungewollten Abhängigkeiten und Nebenwirkungen.
Wenn etwas `public` ist, kann es von beliebigen anderen Packages (auch ausserhalb deines Projekts) genutzt werden.
Änderungen an einer `public`-Schnittstelle können daher weitreichende Folgen haben, die du nicht immer abschätzen kannst.

Mit `(default)`, `protected` oder `private` bleiben die Auswirkungen auf dein eigenes Package oder sogar nur auf die
Expand Down Expand Up @@ -201,13 +201,13 @@ im Modul [Packages lokal verwenden](../../../99_shared/ide/intellij/07_packages/

## API und JavaDoc

Ein **API** (Application Programming Interface) ist die **Schnittstelle** deines Codes nach außen.
Ein **API** (Application Programming Interface) ist die **Schnittstelle** deines Codes nach aussen.
Zur API gehören alle **`public`-Klassen und `public`-Methoden**, die von anderen Packages oder Projekten aus genutzt
werden können.

**Wichtig:**
Alles, was `public` ist, wird Teil deiner API – egal, ob du es als „offizielle Schnittstelle“ geplant hast oder nicht.
Darum solltest du `public` nur dort verwenden, wo die Nutzung von außen **gewollt und langfristig stabil** sein soll.
Darum solltest du `public` nur dort verwenden, wo die Nutzung von aussen **gewollt und langfristig stabil** sein soll.

Damit andere deinen Code verstehen und richtig verwenden können, solltest du deine API mit **JavaDoc** gut **dokumentieren**:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,14 +109,14 @@ Meine Telefonnummer ist XXX XXX XX XX
Pattern pattern = Pattern.compile(safeInput);
```

### 3. Übermäßige Komplexität
### 3. Übermässige Komplexität

- **Problem:** Java-Entwickler neigen dazu, sehr komplexe RegEx zu schreiben, die kaum wartbar sind.
- **Empfehlung:** Komplexe Muster aufteilen, ggf. mit Kommentaren (`(?x)`-Flag) lesbarer machen.

### 4. Falsche Annahmen bei Validierung

- **Problem:** Nur weil ein String das Muster erfüllt, heißt das nicht, dass er inhaltlich gültig ist.
- **Problem:** Nur weil ein String das Muster erfüllt, heisst das nicht, dass er inhaltlich gültig ist.
- **Beispiel:** `a@b.c` erfüllt viele E-Mail-RegEx, ist aber oft ungültig.

---
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@ Wenn alle möglichen Werte **zur Kompilierzeit** bekannt sind und sich nicht dyn

## Enums definieren

- `enum` kann **top-level** (außerhalb einer Klasse) oder **innerhalb** einer Klasse stehen.
- `enum` kann **top-level** (ausserhalb einer Klasse) oder **innerhalb** einer Klasse stehen.
- Die **erste Zeile** enthält die **Komma-Liste** der Konstanten (Konvention: GROSSBUCHSTABEN).

Jede Enum-Konstante ist implizit **`public static final`**.

### Beispiel: Definition außerhalb einer Klasse
### Beispiel: Definition ausserhalb einer Klasse

```java
enum Weekday {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ int sum = numbers.stream().reduce(0, Integer::sum);
int sum = numbers.parallelStream().reduce(0, Integer::sum);
```

`ParallelStream` kann bei großen Datenmengen schneller sein, muss aber nicht immer der Fall sein.
`ParallelStream` kann bei grossen Datenmengen schneller sein, muss aber nicht immer der Fall sein.

## Methodenausführung auf Streams

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ description: >
#### Ziele

- Ich verstehe den Unterschied zwischen Block- und Inline-Elementen und kann diese in HTML erkennen.
- Ich kann sowohl relative als auch absolute Einheiten in CSS verwenden, um die Größe von Elementen zu bestimmen.
- Ich kann sowohl relative als auch absolute Einheiten in CSS verwenden, um die Grösse von Elementen zu bestimmen.
- Ich kann Abstände zwischen und innerhalb von Elementen mithilfe von Margin und Padding in CSS gezielt einstellen.

## Block- und Inline-Elemente
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ description: >

- Ich weiss, was Floating ist und wie es verwendet wird, um Elemente nebeneinander anzuordnen.
- Ich weiss, was Flexbox ist und wie man display: flex anwendet, um flexible Layouts zu erstellen.
- Ich kann Media-Queries nutzen, um Flexbox-Layouts auf unterschiedliche Bildschirmgrößen anpassen zu können.
- Ich kann Media-Queries nutzen, um Flexbox-Layouts auf unterschiedliche Bildschirmgrössen anpassen zu können.

Du hast dich vielleicht schon gefragt, wie du mehrere Elemente nebeneinander anordnen kannst. Hierfür müssen zuerst ein paar Worte über Layouting verloren werden.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ description: >

Ein Objekt ist eine Sammlung von Eigenschaften, die eine Entität repräsentieren.

Objekte können verschiedene Datentypen enthalten, einschließlich anderen Objekten, Arrays, Strings, Zahlen und booleschen Werten.
Objekte können verschiedene Datentypen enthalten, einschliesslich anderen Objekten, Arrays, Strings, Zahlen und booleschen Werten.

```javascript
const person = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ Das Angular CLI (Command Line Interface) ist ein Befehlszeilenwerkzeug, das von

- ng build: Kompiliert und baut die Angular-Anwendung für die Produktion. Erzeugt optimierten JavaScript-Code, der für die Bereitstellung auf einem Webserver verwendet werden kann.

- ng test: Führt die Unit-Tests des Projekts aus, um sicherzustellen, dass die Anwendung ordnungsgemäß funktioniert.
- ng test: Führt die Unit-Tests des Projekts aus, um sicherzustellen, dass die Anwendung ordnungsgemäss funktioniert.

- ng lint: Überprüft den Code auf Einhaltung der definierten Linting-Regeln.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ Im Gegensatz zum `BehaviorSubject`, welches nur den letzten Wert speichert, spei

Ein `ReplaySubject` kann nützlich sein, wenn man eine feste Anzahl von Werten benötigt, auf die man jederzeit zugreifen kann, auch wenn es keine neuen Ereignisse gibt.

Zu beachten ist, dass die Grösse des `ReplaySubject` bei der Initialisierung angegeben wird und die maximale Anzahl der gespeicherten Werte definiert. Wenn mehr Werte gesendet werden, als die Größe des `ReplaySubject` zulässt, werden ältere Werte entfernt.
Zu beachten ist, dass die Grösse des `ReplaySubject` bei der Initialisierung angegeben wird und die maximale Anzahl der gespeicherten Werte definiert. Wenn mehr Werte gesendet werden, als die Grösse des `ReplaySubject` zulässt, werden ältere Werte entfernt.

```typescript
import { ReplaySubject } from "rxjs";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ Der zweite Teil des Tokens ist der Payload, welcher die erstellten Forderungen e
### Signatur

Um den Signaturteil zu erstellen, muss man den codierten Header, den codierten Payload, ein Secret und den im Header angegebenen Algorithmus verwenden und diesen signieren.
Wenn man beispielsweise den HMAC SHA256-Algorithmus verwenden möchte, wird die Signatur folgendermaßen erstellt:
Wenn man beispielsweise den HMAC SHA256-Algorithmus verwenden möchte, wird die Signatur folgendermassen erstellt:

```json
HMACSHA256(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Ein Repository ist wie ein intelligentes Backup deiner Arbeit, kombiniert mit de

| Anbieter | Beschreibung | Authentifizierung | Cloud / Self-Hosted |
| ------------- | ------------------------------------------------------------------------------------------- | ------------------------- | ------------------- |
| **GitHub** | Größtes öffentliches Repository-Netzwerk. Starke Community, viele Open-Source-Projekte. | Benutzername + Token, SSH | Cloud |
| **GitHub** | Grösstes öffentliches Repository-Netzwerk. Starke Community, viele Open-Source-Projekte. | Benutzername + Token, SSH | Cloud |
| **GitLab** | Fokus auf DevOps. CI/CD und Issue-Management direkt integriert. | Benutzername + Token, SSH | Cloud & Self-Hosted |
| **Bitbucket** | Wird von Atlassian (Hersteller von Jira) betrieben. Gut integriert in Unternehmensprozesse. | Benutzername + Token, SSH | Cloud & Self-Hosted |

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ Vertiefende Informationen zum Feature Branch Flow können auf [dieser Seite](htt
### Gitflow

Der Gitflow unterscheidet sich primär vom Feature Branch Flow indem, dass zwei Hauptbranches verwendet werden: `main` für den stabilen Code und `development` für die laufende Entwicklung. So werden Feature-Branches nicht direkt vom `main`-, sondern vom `development`-Branch (Name kann abweichen) abzweigen. So werden fertiggestellte Änderungen auch nicht gleich in den Main integriert, sondern zurück in den Development-Branch.
Zudem wird ein release-Branch verwendet, auf welchen Änderungen vom Development-Branch gepusht werden, um dort vor einem Release getestet zu werden. Anschließend wird der release-Branch, und nur dieser, in den main gemerged.
Zudem wird ein release-Branch verwendet, auf welchen Änderungen vom Development-Branch gepusht werden, um dort vor einem Release getestet zu werden. Anschliessend wird der release-Branch, und nur dieser, in den main gemerged.
Nebst Feature Branches können auch Branches für Releases und Hotfixes (hier nicht abgebildet) erstellt werden.

Der Flow ermöglicht eine strukturierte Vorgehensweise für die Entwicklung und Veröffentlichung von Software, indem Entwicklungs- und Produktionscode getrennt werden. Änderungen sind einfach und schnell nachvollziehbar und es ist jederzeit möglich, schnell auf eine releaste-Version zurückzugreifen.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ description: >
- Du kannst ein Google-Konto erstellen.
- Du kannst dich im Google Developer Portal anmelden.
- Du kannst einen API Key für die Custom Search API generieren.
- Du weißt, wie du den API Key sicher speicherst.
- Du weisst, wie du den API Key sicher speicherst.

{{< zeit lesen="10" praxis="15">}}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ Die folgenden Schritte **must** du ausführen um Code-Vervollständigung innerha
Kopiere die beiden Dateien `editor.xml` und `full.line.xml` in das **options**-Verzeichnis.

5. **IntelliJ neu starten**
Schließe IntelliJ IDEA vollständig und starte es neu, damit die Änderungen übernommen werden.
Schliesse IntelliJ IDEA vollständig und starte es neu, damit die Änderungen übernommen werden.

{{< ninja info>}}
Falls das `options`-Verzeichnis noch nicht existiert, starte IntelliJ einmal und beende es wieder – danach wird es automatisch angelegt.
Expand All @@ -146,7 +146,6 @@ Nutze diesen Zeitraum und fordere eine Lizenz an:
![Omada](./images/omada.png)
![Omada Zugriff](./images/omada_zugriff.png)
4. Sobald du Zugriff hast, registriere IntelliJ:

- Wähle **Activate (another) License**
- Wähle **License Server**
- Gib die Adresse `https://sbb-license.fls.jetbrains.com` ein
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ int[] numbers = {
Wichtig:

- Deine Methoden müssen auch funktionieren, wenn:

- andere Zahlenarrays genommen werden mit Grösse 1 bis 1'000'000
- ein leeres Zahlenarray genommen wird
- der Methode ein Null-Pointer übergeben wird
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ class NumberHelperTest {
// negatives Intervall (z. B. für erweiterte Version)
"7, -30, 30, 6, 10, 0", // negatives Vielfaches ignoriert (nach Bedarf anpassen)

// sehr großer Bereich
// sehr grosser Bereich
"8, 1, 1000, 8, 12, 20664"
})

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ void givenSumDivisibleBy_whenCalled_thenOutputAsExpected(int lab, int min, int m
// negatives Intervall (z. B. für erweiterte Version)
"7, -30, 30, 6, 10, 0", // negatives Vielfaches ignoriert (nach Bedarf anpassen)

// sehr großer Bereich
// sehr grosser Bereich
"8, 1, 1000, 8, 12, 20664"
})

Expand Down
2 changes: 1 addition & 1 deletion content/2025/labs/02_java/04_java-oop/05_lists/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ Die Berechnungen verlaufen also folgendermassen:

Eine ArrayList eignet sich besonders gut, um Fibonacci-Zahlen zu speichern, da wir im Voraus nicht wissen, wie viele Zahlen berechnet werden müssen, bis eine bestimmte Zahl erreicht ist.
Die ArrayList kann dynamisch wachsen und neue Zahlen aufnehmen.
Durch diese Aufgabe lernst du den Umgang mit ArrayLists und wie sie sich dynamisch vergrössern lassen, ohne dass du dir Gedanken über die feste Größe von Arrays machen musst.
Durch diese Aufgabe lernst du den Umgang mit ArrayLists und wie sie sich dynamisch vergrössern lassen, ohne dass du dir Gedanken über die feste Grösse von Arrays machen musst.

Die Fibonacci-Folge ist relevant, weil sie in der **Natur** häufig vorkommt, wie bei der Anordnung von Blättern oder der Struktur von Tannenzapfen.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public class LinkedList<E> extends AbstractSequentialList<E> implements List<E

```

Das Java-Schlüsselwort `transient` wird verwendet, um ein Feld in einer Klasse von der Serialisierung auszuschließen. **Serialisierung** ist der Prozess, ein Objekt in einen Byte-Stream umzuwandeln, um es zu speichern oder über ein Netzwerk zu übertragen. Transiente Felder werden dabei nicht gespeichert und erhalten nach der Deserialisierung ihre **Standardwerte** (z. B. `null` für Objekte, `0` für Zahlen).
Das Java-Schlüsselwort `transient` wird verwendet, um ein Feld in einer Klasse von der Serialisierung auszuschliessen. **Serialisierung** ist der Prozess, ein Objekt in einen Byte-Stream umzuwandeln, um es zu speichern oder über ein Netzwerk zu übertragen. Transiente Felder werden dabei nicht gespeichert und erhalten nach der Deserialisierung ihre **Standardwerte** (z. B. `null` für Objekte, `0` für Zahlen).

Ein Knoten, also das Objekt des Typs `Node`, enthält

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ int sum = numbers.stream().reduce(0, Integer::sum);
int sum = numbers.parallelStream().reduce(0, Integer::sum);
```

`ParallelStream` kann bei großen Datenmengen schneller sein, muss aber nicht immer der Fall sein.
`ParallelStream` kann bei grossen Datenmengen schneller sein, muss aber nicht immer der Fall sein.

## Methodenausführung auf Streams

Expand Down
2 changes: 1 addition & 1 deletion content/en/docs/03_web/02_html_css/14_css-sizing/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ description: >
#### Ziele

- Ich verstehe den Unterschied zwischen Block- und Inline-Elementen und kann diese in HTML erkennen.
- Ich kann sowohl relative als auch absolute Einheiten in CSS verwenden, um die Größe von Elementen zu bestimmen.
- Ich kann sowohl relative als auch absolute Einheiten in CSS verwenden, um die Grösse von Elementen zu bestimmen.
- Ich kann Abstände zwischen und innerhalb von Elementen mithilfe von Margin und Padding in CSS gezielt einstellen.

## Block- und Inline-Elemente
Expand Down
2 changes: 1 addition & 1 deletion content/en/docs/03_web/02_html_css/15_layouting/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ description: >

- Ich weiss, was Floating ist und wie es verwendet wird, um Elemente nebeneinander anzuordnen.
- Ich weiss, was Flexbox ist und wie man display: flex anwendet, um flexible Layouts zu erstellen.
- Ich kann Media-Queries nutzen, um Flexbox-Layouts auf unterschiedliche Bildschirmgrößen anpassen zu können.
- Ich kann Media-Queries nutzen, um Flexbox-Layouts auf unterschiedliche Bildschirmgrössen anpassen zu können.

Du hast dich vielleicht schon gefragt, wie du mehrere Elemente nebeneinander anordnen kannst. Hierfür müssen zuerst ein paar Worte über Layouting verloren werden.

Expand Down
2 changes: 1 addition & 1 deletion content/en/docs/03_web/03_javascript/10_objects/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ description: >

Ein Objekt ist eine Sammlung von Eigenschaften, die eine Entität repräsentieren.

Objekte können verschiedene Datentypen enthalten, einschließlich anderen Objekten, Arrays, Strings, Zahlen und booleschen Werten.
Objekte können verschiedene Datentypen enthalten, einschliesslich anderen Objekten, Arrays, Strings, Zahlen und booleschen Werten.

```javascript
const person = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ Das Angular CLI (Command Line Interface) ist ein Befehlszeilenwerkzeug, das von

- ng build: Kompiliert und baut die Angular-Anwendung für die Produktion. Erzeugt optimierten JavaScript-Code, der für die Bereitstellung auf einem Webserver verwendet werden kann.

- ng test: Führt die Unit-Tests des Projekts aus, um sicherzustellen, dass die Anwendung ordnungsgemäß funktioniert.
- ng test: Führt die Unit-Tests des Projekts aus, um sicherzustellen, dass die Anwendung ordnungsgemäss funktioniert.

- ng lint: Überprüft den Code auf Einhaltung der definierten Linting-Regeln.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ Im Gegensatz zum `BehaviorSubject`, welches nur den letzten Wert speichert, spei

Ein `ReplaySubject` kann nützlich sein, wenn man eine feste Anzahl von Werten benötigt, auf die man jederzeit zugreifen kann, auch wenn es keine neuen Ereignisse gibt.

Zu beachten ist, dass die Grösse des `ReplaySubject` bei der Initialisierung angegeben wird und die maximale Anzahl der gespeicherten Werte definiert. Wenn mehr Werte gesendet werden, als die Größe des `ReplaySubject` zulässt, werden ältere Werte entfernt.
Zu beachten ist, dass die Grösse des `ReplaySubject` bei der Initialisierung angegeben wird und die maximale Anzahl der gespeicherten Werte definiert. Wenn mehr Werte gesendet werden, als die Grösse des `ReplaySubject` zulässt, werden ältere Werte entfernt.

```typescript
import { ReplaySubject } from "rxjs";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ Der zweite Teil des Tokens ist der Payload, welcher die erstellten Forderungen e
### Signatur

Um den Signaturteil zu erstellen, muss man den codierten Header, den codierten Payload, ein Secret und den im Header angegebenen Algorithmus verwenden und diesen signieren.
Wenn man beispielsweise den HMAC SHA256-Algorithmus verwenden möchte, wird die Signatur folgendermaßen erstellt:
Wenn man beispielsweise den HMAC SHA256-Algorithmus verwenden möchte, wird die Signatur folgendermassen erstellt:

```json
HMACSHA256(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ Vertiefende Informationen zum Feature Branch Flow können auf [dieser Seite](htt
### Gitflow

Der Gitflow unterscheidet sich primär vom Feature Branch Flow indem, dass zwei Hauptbranches verwendet werden: `main` für den stabilen Code und `development` für die laufende Entwicklung. So werden Feature-Branches nicht direkt vom `main`-, sondern vom `development`-Branch (Name kann abweichen) abzweigen. So werden fertiggestellte Änderungen auch nicht gleich in den Main integriert, sondern zurück in den Development-Branch.
Zudem wird ein release-Branch verwendet, auf welchen Änderungen vom Development-Branch gepusht werden, um dort vor einem Release getestet zu werden. Anschließend wird der release-Branch, und nur dieser, in den main gemerged.
Zudem wird ein release-Branch verwendet, auf welchen Änderungen vom Development-Branch gepusht werden, um dort vor einem Release getestet zu werden. Anschliessend wird der release-Branch, und nur dieser, in den main gemerged.
Nebst Feature Branches können auch Branches für Releases und Hotfixes (hier nicht abgebildet) erstellt werden.

Der Flow ermöglicht eine strukturierte Vorgehensweise für die Entwicklung und Veröffentlichung von Software, indem Entwicklungs- und Produktionscode getrennt werden. Änderungen sind einfach und schnell nachvollziehbar und es ist jederzeit möglich, schnell auf eine releaste-Version zurückzugreifen.
Expand Down
Loading
Loading