# Lassen Sie uns über Gladys V4 sprechen

**URL:** <https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578>\
**Category:** Développement\
**Created:** [20. Oktober 2018 um 21:24 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578 "2018-10-20T21:24:26Z")\
**Posts on this page:** 20\
**Page:** 6

<div class="post-metadata">

**Author:** ![MathieuA](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/mathieua/32/22211_2.png) [@MathieuA](https://community.gladysassistant.com/u/MathieuA)\
**Post date:** [6. Februar 2019 um 08:43 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/127 "2019-02-06T08:43:50Z")

</div>

Ok, also los geht’s! Ich lösche mein Repo und klone es neu, sobald es auf deiner Seite fertig ist!

Aber wenn jede Person, die für Gladys entwickeln will, daran denken muss, ihr Git neu zu konfigurieren, wird es sicherlich Probleme geben 😛  
Hoffentlich müssen wir nicht so weit kommen…

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [6. Februar 2019 um 08:45 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/128 "2019-02-06T08:45:37Z")

</div>

Erledigt! Du kannst es neu klonen 🙂

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [6. Februar 2019 um 08:47 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/129 "2019-02-06T08:47:12Z")

</div>

> [@MathieuA](#):
>
> Trotzdem, wenn jede Person, die Gladys entwickeln will, daran denken muss, ihr Git neu zu konfigurieren, wird es garantiert Probleme geben 😛  
> Hoffentlich müssen wir nicht so weit kommen…

Ja, aber das ist etwas extrem Grundlegendes in der Entwicklung, 100% aller Softwareprojekte haben dieses Problem, und alle ernsthaften Projekte überprüfen das.

Ich würde mich wundern, wenn es keine Lösung gäbe.

---

<div class="post-metadata">

**Author:** ![MathieuA](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/mathieua/32/22211_2.png) [@MathieuA](https://community.gladysassistant.com/u/MathieuA)\
**Post date:** [6. Februar 2019 um 08:47 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/130 "2019-02-06T08:47:16Z")

</div>

Okay, dann los geht’s!

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [6. Februar 2019 um 09:50 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/131 "2019-02-06T09:50:31Z")

</div>

Das Problem ist dank der berühmten Datei `.gitattributes` behoben! Danke @MathieuA, dass du das gefunden hast, zumindest wird es jetzt für Windows-Entwickler funktionieren 🙂

@MathieuA ich würde gerne deine Meinung zur neuen Architektur/Art und Weise, Gladys und die Controller zu laden, hören.

Ansonsten habe ich die Typprüfung mit JSDoc + Typescript CLI aktiviert (ohne Typescript zu schreiben, nur durch die Verwendung von Kommentaren).

---

<div class="post-metadata">

**Author:** ![MathieuA](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/mathieua/32/22211_2.png) [@MathieuA](https://community.gladysassistant.com/u/MathieuA)\
**Post date:** [6. Februar 2019 um 09:53 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/132 "2019-02-06T09:53:08Z")

</div>

Ach ja, wegen dieser Geschichte hatte ich keine Zeit, um mal reinzuschauen!

---

<div class="post-metadata">

**Author:** ![MathieuA](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/mathieua/32/22211_2.png) [@MathieuA](https://community.gladysassistant.com/u/MathieuA)\
**Post date:** [6. Februar 2019 um 10:03 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/133 "2019-02-06T10:03:43Z")

</div>

Nicht schlecht die Sache mit den Klassen! Effektiv ist das schöner als `require` in jeder Datei ^^

Allerdings verwirrt mich ein bisschen, dass es ein `lib`- und ein `api`-Verzeichnis gibt. Vor allem, weil ich es persönlich genau andersrum gemacht hätte 😛  
Im `api`-Verzeichnis hätte ich den Kern von Gladys untergebracht, denn das erscheint mir ein bisschen logischer (wenn man das so sagen kann). Aber das ist eine persönliche Präferenz 🙂

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [6. Februar 2019 um 10:07 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/134 "2019-02-06T10:07:52Z")

</div>

> [@MathieuA](#):
>
> Es stört mich ein bisschen, ein `lib`- und ein `api`-Verzeichnis zu haben.

Ich bin derselben Meinung.

Alternativ können wir `lib` in `core` umbenennen…

Oder wir legen das Verzeichnis `core` direkt in `api`

```auto
api
----- controllers
----- core
----- middlewares
----- routes.js
----- index.js

```

Und dann `api` in `lib` umbenennen 😛

```auto
lib
----- controllers
----- core
----- middlewares
----- routes.js
----- index.js

```

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [6. Februar 2019 um 10:15 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/135 "2019-02-06T10:15:42Z")

</div>

Ehrlich gesagt, bin ich gerade zu anderen Repositories gegangen, ich habe `api` und `lib` gesehen, das schockiert mich eigentlich nicht so sehr.

Für mich ist `lib` wirklich der Gladys-Kerncode, und `api` ist die REST-API.

---

<div class="post-metadata">

**Author:** ![MathieuA](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/mathieua/32/22211_2.png) [@MathieuA](https://community.gladysassistant.com/u/MathieuA)\
**Post date:** [6. Februar 2019 um 10:27 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/136 "2019-02-06T10:27:58Z")

</div>

Ja, ich denke, das ist eher Geschmackssache. Es gibt keine echte Best Practice!  
Es ist dein Projekt, also entscheidest du. Wenn du damit zufrieden bist, dann ist es okay ^^

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [6. Februar 2019 um 10:39 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/137 "2019-02-06T10:39:47Z")

</div>

Ich mag es, externe Meinungen zu hören, das ist wichtig 🙂 Wir fangen so an und sehen uns dann die anderen Rückmeldungen an.

Raah die Indizes + Foreign Keys mit Sequelize sind der Hammer

 ![30](https://gladys-assistant-community.b-cdn.net/uploads/default/original/2X/3/3356c39f25daa9d327ea7c920eb513bc7435cba9.jpeg)

---

<div class="post-metadata">

**Author:** ![MathieuA](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/mathieua/32/22211_2.png) [@MathieuA](https://community.gladysassistant.com/u/MathieuA)\
**Post date:** [6. Februar 2019 um 10:50 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/138 "2019-02-06T10:50:15Z")

</div>

Das ist mega schwer 😮

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [6. Februar 2019 um 13:02 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/139 "2019-02-06T13:02:13Z")

</div>

Ich habe das README des Gladys 4 Playground Repos mit allen Installationsanweisungen zum Testen aktualisiert 🙂

Zögert nicht, es bei euch zu testen!

[https://github.com/GladysAssistant/gladys-4-playground](https://github.com/GladysAssistant/gladys-4-playground)

Falls ihr ein gutes Tool zum Erkunden von SQLite-Datenbanken sucht, empfehle ich TablePlus:

> **[TablePlus | Modern, Native Tool for Database Management.](https://tableplus.com/)**
>
> Modern, native client with intuitive GUI tools to create, access, query & edit multiple relational databases: MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Amazon Redshift, MariaDB, CockroachDB, Vertica, Cassandra, and Redis.

---

<div class="post-metadata">

**Author:** ![MathieuA](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/mathieua/32/22211_2.png) [@MathieuA](https://community.gladysassistant.com/u/MathieuA)\
**Post date:** [6. Februar 2019 um 16:36 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/140 "2019-02-06T16:36:01Z")

</div>

> [@pierre-gilles](#):
>
> Wenn ihr ein gutes Tool zum Erkunden von SQLite-Datenbanken sucht, kann ich euch TablePlus empfehlen:
> 
> [https://tableplus.io/](https://tableplus.io/)

Oder [sqliteonline.com](http://sqliteonline.com) für diejenigen, die keine Lust haben, etwas zu installieren 😛

---

<div class="post-metadata">

**Author:** ![damalgos](https://gladys-assistant-community.b-cdn.net/letter_avatar_proxy/v4/letter/d/e274bd/32.png) [@damalgos](https://community.gladysassistant.com/u/damalgos)\
**Post date:** [6. Februar 2019 um 16:40 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/141 "2019-02-06T16:40:04Z")

</div>

Ehrlich gesagt, nicht schlecht die Struktur, sehr klar! Kleine Frage, ich sehe, dass du «&nbsp;joi&nbsp;» verwendest, warum nicht direkt nur die Constraints von Sequelize verwenden?

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [7. Februar 2019 um 01:43 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/142 "2019-02-07T01:43:27Z")

</div>

> [@damalgos](#):
>
> Kleine Frage, ich sehe, dass du „joi“ verwendest, warum nicht direkt die Constraints von Sequelize nutzen?

Ich denke, die Constraints von Sequelize werden nicht für alles ausreichen, ich denke insbesondere an die Validierung von Objekten in Szenen oder Triggern, die verschachtelte JSON-Objekte sein werden.

Danach hast du recht, es könnte sich lohnen, diese zusätzliche Validierung in einer Funktion im Modell zu testen 🙂 Guter Hinweis, ich werde es mir ansehen.

---

<div class="post-metadata">

**Author:** ![damalgos](https://gladys-assistant-community.b-cdn.net/letter_avatar_proxy/v4/letter/d/e274bd/32.png) [@damalgos](https://community.gladysassistant.com/u/damalgos)\
**Post date:** [8. Februar 2019 um 09:55 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/143 "2019-02-08T09:55:25Z")

</div>

Frage zur Sicherheit: In deinem Manifest habe ich gesehen, dass du gesagt hast, dass man die Bibliotheken gut auswählen sollte, die nicht kaputt sind. Aber ich habe den Eindruck, dass du kein System implementiert hast, um zu überprüfen, ob diese Bibliotheken eines Tages tatsächlich kaputt sind!

Vielleicht wäre es interessant:

- ein automatisches Skript zu implementieren, das npm audit überprüft und die Informationen per E-Mail sendet
- ein System zu implementieren, das dies automatisch erledigt (pm2 macht das in seiner kostenpflichtigen Version, glaube ich)

Aber es ist kompliziert, es bei jedem einzurichten? Oder nur bei einigen Entwicklern? Es ermöglicht möglicherweise, Sicherheits-Patches durchzuführen, falls erforderlich.

Außerdem sollte man, denke ich, jeden Modulentwickler zwingen, «&nbsp;Best Practices&nbsp;» zu befolgen, z. B. jedes Mal zu überprüfen, ob ein bestimmtes Modell zuvor validiert wurde, dass man z. B. nur eine E-Mail-Adresse im E-Mail-Adressenfeld einfügen kann und keinen Code / XSS usw. injizieren kann.

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [8. Februar 2019 um 11:16 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/144 "2019-02-08T11:16:33Z")

</div>

> [@damalgos](#):
>
> Aber ich habe nicht den Eindruck, dass du ein System implementierst, das überprüft, ob diese Bibliotheken irgendwann tatsächlich kaputt sind!

Dafür ist es super einfach:

1/ GitHub macht bereits automatische Checks!  
2/ Es gibt Greenkeeper ([https://greenkeeper.io/](https://greenkeeper.io/)), der das automatisch erledigt. Ich habe es im aktuellen Gladys-Repo verwendet, aber ich hatte so viele Benachrichtigungen wegen Sails, das ein Nest von veralteten Abhängigkeiten ist, dass ich es deaktiviert habe. Ich werde es in Gladys 4 wieder aktivieren! 🙂 Greenkeeper erstellt tatsächlich die PRs selbst, sobald eine Bibliothek aktualisiert werden muss!

> [@damalgos](#):
>
> Außerdem sollte man, glaube ich, jeden Modulentwickler zwingen, „Best Practices“ zu befolgen, z. B. jedes Mal zu überprüfen, ob ein bestimmtes Modell zuvor validiert wurde, dass man z. B. nur eine E-Mail-Adresse im E-Mail-Adressenfeld einfügen kann und keinen Code / XSS etc.

Vollkommen einverstanden!

Die Schutzmaßnahmen werden durch zwei Dinge festgelegt

1/ Die Technologien, die wir verwenden. Beispiel: Auf der Frontend-Ebene erlaubt Preact keine XSS-Lücken, es verwaltet die Anzeige der Variablen und alles wird von der Bibliothek gereinigt, damit es richtig gemacht wird.

2/ Die statische Code-Analyse. Das ist die Aufgabe der sehr strengen Regeln, die ich in ESLint festgelegt habe, die einen konsistenten und „aseptischen“ Codierungsstil erzwingen und eine Reihe von Checks durchführen, um die Codequalität zu garantieren. (Das fängt eine unberechenbare Anzahl von Fehlern/Sicherheitslücken ab)

3/ Selbstverständlich die Unit- und Integrationstests. Es liegt an uns, sehr feine Tests zu schreiben und eine hohe Code-Abdeckung zu erreichen, um sicherzustellen, dass nichts Unbeabsichtigtes möglich ist. Großer Vorteil, wir schreiben die Tests ab dem ersten Tag, daher können wir leicht eine Code-Abdeckung von \> 90% erreichen und robust sein. Ein weiterer großer Vorteil ist, dass das Einbinden interner Module in den Kern das Schreiben von Tests für Module sehr einfach macht und somit die gleichen Garantien für Module wie für den Kern bietet.

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [11. Februar 2019 um 05:55 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/145 "2019-02-11T05:55:18Z")

</div>

Hallo zusammen!

Ich bin mit der Modellierung gut vorangekommen, fast alle Modelle sind definiert:

[https://github.com/GladysAssistant/gladys-4-playground/tree/master/server/models](https://github.com/GladysAssistant/gladys-4-playground/tree/master/server/models)

Bei der Datenbank sind die Migrationen gut vorangekommen, mir fehlen nur noch die Indizes und dann bin ich fertig! 🙂

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [11. Februar 2019 um 06:46 UTC](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578/147 "2019-02-11T06:46:28Z")

</div>

Ich habe tatsächlich teilweise deine Überlegungen verwendet, ich habe mich von deinem GitHub-Repo inspirieren lassen (ich hatte es im Blick!), als ich daran gearbeitet habe 🙂 Ich hatte nur den Link zur Tabelle verloren, danke!

1/ Ich verstehe immer noch nicht, warum man Kategorien + Unterkategorien braucht! Wenn der Sinn von Kategorien/Unterkategorien nur darin besteht, in der UI ein Dropdown-Menü mit Kategorien und Unterkategorien zu haben, dann ja, das ist das, was ich vorhabe 🙂 Aber das ist nur die UI. Die Datenbank ist eine Darstellung einer Modellierung, zwei Felder vom Typ «&nbsp;Kategorie&nbsp;» «&nbsp;Unterkategorie&nbsp;» hier einzufügen, würde das etwas bringen? In Bezug auf strenge Modellierung, wenn man ein Attribut in zwei Attribute aufteilt, dann möchte man, dass eine Unterkategorie zu mehreren Kategorien gehören kann. Nicht unbedingt das, was wir wollen, oder? (offene Frage, sag mir Bescheid, wenn du ein Gegenbeispiel hast, ich bin offen dafür! 🙂 ).

2/ Eine der Werte, die ich in das Manifest gesetzt habe, ist, dass für Gladys 4 «&nbsp;wir nicht alles machen, aber was wir machen, machen wir gut&nbsp;».

In Gladys 3 bin ich zu oft in alle Richtungen gegangen (um «&nbsp;sicherzustellen&nbsp;», dass der Fall behandelt wird), es gibt Kategorien, die zu nichts nützen, die Typen waren offen, wir hatten «&nbsp;Sätze&nbsp;», die mit nichts verkabelt waren. Kurz gesagt: Ich habe mir zu viel vorgenommen, und hinter vielen statischen Daten war kein Code verkabelt. Und das war dumm, weil der Benutzer den Satz sieht und denkt «&nbsp;cool, ich kann XX behandeln&nbsp;», und in Wirklichkeit: nein!

Hier habe ich die «&nbsp;Mindestbasis&nbsp;» der Kategorien aufgelistet, die ich sehe. Schritt für Schritt, wenn Module (die ich erinnere, im Core sein werden) hinzugefügt werden, werden wir nach und nach Kategorien hinzufügen. Aber solange wir nichts haben, warum Kategorien einfügen, wenn wir sie nicht verwalten können? 🙂

3/ Was wir beim Entwicklertreffen besprochen haben, war:

**DeviceFeature**

- **type** : Bestimmt in der UI, welcher Button verwendet wird. «&nbsp;binary&nbsp;» wird zu einem Ein/Aus-Button, «&nbsp;multilevel&nbsp;» zu einem Slider, «&nbsp;color&nbsp;» zu einem Farbauswahlfeld.
- **category** : Hilft Gladys zu verstehen, «&nbsp;was das Objekt ist&nbsp;», und eine angemessene Darstellung in der UI auf Ebene des Icons zu setzen. Hilft auch dem Brain, alle Geräte einer Kategorie zu finden. «&nbsp;Schalte die Wohnzimmerlichter ein&nbsp;», «&nbsp;Wie warm ist es im Badezimmer?&nbsp;», «&nbsp;Ist die Garagentür offen?&nbsp;», «&nbsp;Senke die Temperatur in der Küche&nbsp;», usw…

Wenn du dir Anwendungen von Unterkategorien vorstellen kannst (außer, dass es für den Entwickler organisiert ist, hier ist es eine Modellierung, das ist pragmatisch, was wir tun! 😛 ), sag mir Bescheid, es ist tatsächlich ein Thema, das man besser jetzt klären sollte!

PS: Aber ja, man kann den Drucksensor hinzufügen, er muss ohnehin hinzugefügt werden, sobald man in Gladys 4 ein Modul hinzufügt, das ihn erstellen muss 🙂

[Vorherige Seite](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578.md?page=5)

[Nächste Seite](https://community.gladysassistant.com/t/parlons-de-gladys-v4/3578.md?page=7)
