4 Dec 2019 |
gelight | :
Nachträglich noch mal einen schönen ersten Advent und bald 2ten Advent schon mal vorweg 🙂
Hätte mal eine Frage: Hat von euch schon mal jemand einen Living Style Guide aus technischer Sicht selber gebaut?
Ich weiß, dass es Style-Guide generatoren gibt aber die sind alle zu sehr an eine bestimmte Technologie geknüpft. Ich erkläre einfach mal grob, wie es bei uns im Unternehmen so läuft. Vielleicht wird dann meine Frage etwas verständlicher. Ich sag auch mein aktuelles Problem dazu:
| 13:36:46 |
gelight | Also bei uns wird neben auf MicroServices aufgebaut. Heißt .... die Teams können sich bei Bedarf selbst für eine eigene Technologie entscheiden. Okay .... jetzt mal zum Thema UI und alles, was da so dazu gehört. | 13:38:06 |
gelight | Wir haben eine allgemeine Technologie im Unternehmen, über die wir unsere jeweiligen "Seiten" aus vielen einzelnen Calls ( Micro-Frontends / HTML Snippets ) zusammen bauen. Jeder Service liefert am Ende kleine HTML Snippets + all ihre benötigten Assets. | 13:40:27 |
gelight | Soweit so gut ... jetzt baut unser Team also an einer Backend-Applikation, die auf die gleiche Weise erstellt wird. Aktuell baut jedes Team sozusagen jeden Bestandteil ihrer Oberfläche selbst.
Da es eine "Backend-Applikation" ist, wollen wir das in Zukunft gern mit Hilfe von WebComponents "etwas" einheitlicher gestalten. So dass die Teams halt auf eine Styleguide Seite gehen können, sich anschauen können, welche Komponenten es gibt, die sie in ihren UI Snippets verwenden können. | 13:44:42 |
gelight | Fakt ist bei uns auch, dass praktisch jedes Team solche Web-Components schreiben darf. Nun kommen natürlich immer wieder Fragen von anderen Teams wie: "Welche UI Komponenten gibt es, wo finden wir die, wie benutzen wir die, was können die alles und wie sehen sie aus?" | 13:48:09 |
gelight | Dazu hatte ich nun die grundlegende Idee, ein Package einer WC einfach so aufzubauen, dass man förmlich einen Ordner hat, worin man die reine Component entwickelt und einen weiteren, wo man Docu-Snippets und auch Live-Demos oder sowas drin ablegen kann. Allgemein war meine Idee zu den Doku's so, dass man , um einen visuellen einheitlichen Stil zu gewährleisten, alle Informationen als *.md ( MarkDown ) Files schreibt.
Frage 1 wäre nun: Wie würdet ihr die "einzelnen" Live-Demo-Beispiele bauen und zur Verfügung stellen?
Frage 1 wäre nun:
| 13:52:44 |
gelight | * Dazu hatte ich nun die grundlegende Idee, ein Package einer WC einfach so aufzubauen, dass man förmlich einen Ordner hat, worin man die reine Component entwickelt und einen weiteren, wo man Docu-Snippets und auch Live-Demos oder sowas drin ablegen kann. Allgemein war meine Idee zu den Doku's so, dass man , um einen visuellen einheitlichen Stil zu gewährleisten, alle Informationen als *.md ( MarkDown ) Files schreibt.
Frage 1 wäre nun: Wie würdet ihr die "einzelnen" Live-Demo-Beispiele bauen und zur Verfügung stellen?
Frage 2: Wie könnte das Package des Living-Style-Guide aussehen bzw. wie könnte man die ganzen Informationen "möglichst" automatisiert so zusammen mergen, dass am Ende eine HTML bei raus kommt, die halt Infos zur Komponente gibt, wie auch Live-Demos zeigt etc......
| 13:54:09 |
gelight | Beispiel: https://material.io/components/buttons/ | 13:54:40 |
gelight | Wie gesagt... andere Teams sollen auf basis eigener Techniken ihre Komponenten bauen können.
Das Einzige, was man vorgeben könnte, wäre eine Struktur, die für eine automatische Anzeige der Informationen im Styleguide, denke ich .... | 13:56:27 |
6 Dec 2019 |
Tobi | kann jemand von starmaker.com downloaden? Ist JS, aber die haben die files so versteckt das youtube-dl nicht mehr geht | 21:06:59 |
Tobi | * kann jemand von starmakerstudios.com downloaden? Ist JS, aber die haben die files so versteckt das youtube-dl nicht mehr geht | 21:07:29 |
7 Jan 2020 |
Tobi | kein Java aber vielleicht kann jemand schnell helfen: Excel-VBA. Ich wähle einige Spalten mit
Range("a1,b1,e1").Entire.Column.ExportAsFixedFormat _ um sie als PDF zu exportieren. Natürlich sind die jetzt jeweils auf einer Seite und nicht nebeneinander. Muss ich die vorher erst selektieren mit .select und dann wie weiter... ? | 12:56:28 |
Tobi | hmm mit select ist es das gleich, eigentlich klar
wsA.Range("a1,b1").EntireColumn.Select
Selection.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=myFile, _
Auch so wird jede Spalte auf einem extra Blatt ausgegeben
| 13:04:28 |
Tobi | wsA ist eine variable | 13:04:35 |
20 Jan 2020 |
tarvos90 | uh VBA ist leider zu lange her, aber konntest du es lösen? | 11:46:58 |
tarvos90 | Ich hab auch eine Frage, vielleicht weiß ja jemand wie man das bequem löst. Ich muss Elemente miteinander vergleichen und wenn ein Element mit allen bisherigen Elementen der Liste mir ein 'unknown' liefert, dann ist das ein neues Element.
Wenn das NICHT so ist, hätte ich gern das label des bereits bekannten Elements.
Mir wurde geraten dafür ein Maybe Pattern (in TypeScript) zu verwenden aber so richtig werde ich daraus nicht schlau. Naja hier erst mal mein Code:
function knownState(
referenceList: UpgradedDecetionInterface[],
currentElement: UpgradedDecetionInterface
): boolean {
const newPerson = referenceList.every(referenceFace => {
const bestMatch = referenceFace.faceMatcher.findBestMatch(
currentElement.descriptor[0]
);
return bestMatch.label === 'unknown';
});
return newPerson;
}```
`newPerson` ist nur dann true, wenn das `every` bei jedem bisherigen Element 'unknown' ist, wie schon erwähnt.
Das Ding ist, wie komm ich jetzt am besten an das Label rann, ohne noch mal `findBestMatch` auszuführen?
Benutzen tue ich das bisher so:
```Javascript
const copyListOfDetections = listOfDetections;
let resultList: UpgradedDecetionInterface[] = [];
copyListOfDetections.map((detection, index) => {
if (index >= 1) {
const stateOfDetection = knownState(resultList, detection);
if (stateOfDetection.known) {
console.log('Kenn ich');
} else {
console.log('Kenn ich nicht');
resultList.push(detection);
}
}
}```
| 11:53:24 |
tarvos90 | * Ich hab auch eine Frage, vielleicht weiß ja jemand wie man das bequem löst. Ich muss Elemente miteinander vergleichen und wenn ein Element mit allen bisherigen Elementen der Liste mir ein 'unknown' liefert, dann ist das ein neues Element.
Wenn das NICHT so ist, hätte ich gern das label des bereits bekannten Elements.
Mir wurde geraten dafür ein Maybe Pattern (in TypeScript) zu verwenden aber so richtig werde ich daraus nicht schlau. Naja hier erst mal mein Code:
function knownState(
referenceList: UpgradedDecetionInterface[],
currentElement: UpgradedDecetionInterface
): boolean {
const newPerson = referenceList.every(referenceFace => {
const bestMatch = referenceFace.faceMatcher.findBestMatch(
currentElement.descriptor[0]
);
return bestMatch.label === 'unknown';
});
return newPerson;
}
newPerson ist nur dann true, wenn das every bei jedem bisherigen Element 'unknown' ist, wie schon erwähnt. Das Ding ist, wie komm ich jetzt am besten an das Label rann, ohne noch mal findBestMatch auszuführen?
Benutzen tue ich das bisher so:
const copyListOfDetections = listOfDetections;
let resultList: UpgradedDecetionInterface[] = [];
copyListOfDetections.map((detection, index) => {
if (index >= 1) {
const stateOfDetection = knownState(resultList, detection);
if (stateOfDetection.known) {
console.log('Kenn ich');
} else {
console.log('Kenn ich nicht');
resultList.push(detection);
}
}
}```
| 11:53:47 |
tarvos90 | * Ich hab auch eine Frage, vielleicht weiß ja jemand wie man das bequem löst. Ich muss Elemente miteinander vergleichen und wenn ein Element mit allen bisherigen Elementen der Liste mir ein 'unknown' liefert, dann ist das ein neues Element.
Wenn das NICHT so ist, hätte ich gern das label des bereits bekannten Elements.
Mir wurde geraten dafür ein Maybe Pattern (in TypeScript) zu verwenden aber so richtig werde ich daraus nicht schlau. Naja hier erst mal mein Code:
function knownState(
referenceList: UpgradedDecetionInterface[],
currentElement: UpgradedDecetionInterface
): boolean {
const newPerson = referenceList.every(referenceFace => {
const bestMatch = referenceFace.faceMatcher.findBestMatch(
currentElement.descriptor[0]
);
return bestMatch.label === 'unknown';
});
return newPerson;
}
newPerson ist nur dann true, wenn das every bei jedem bisherigen Element 'unknown' ist, wie schon erwähnt. Das Ding ist, wie komm ich jetzt am besten an das Label rann, ohne noch mal findBestMatch auszuführen?
Benutzen tue ich das bisher so:
const copyListOfDetections = listOfDetections;
let resultList: UpgradedDecetionInterface[] = [];
copyListOfDetections.map((detection, index) => {
if (index >= 1) {
const stateOfDetection = knownState(resultList, detection);
if (stateOfDetection.known) {
console.log('Kenn ich');
} else {
console.log('Kenn ich nicht');
resultList.push(detection);
}
}
}
| 11:54:06 |
tarvos90 | Jedenfalls hab ich dann mal etwas zu diesem Maybe Pattern gelesen, und versucht anzuwenden: | 11:54:35 |
tarvos90 | export class UnknownDetection {
known: boolean = false;
}
export class KnownDetection {
known: boolean = true;
label: string;
distance: number;
}
export type knownDetection = UnknownDetection | KnownDetection;
| 11:54:52 |
tarvos90 | sah dann so aus:
function knownState(
referenceFaces: UpgradedDecetionInterface[],
currentDetection: UpgradedDecetionInterface,
): knownDetection {
let knownPersonLabel: knownDetection = { known: false };
const newPerson = referenceFaces.every(referenceFace => {
const bestMatch = referenceFace.faceMatcher.findBestMatch(
currentDetection.descriptor[0],
);
if (bestMatch.label !== 'unknown') {
knownPersonLabel = {
distance: bestMatch.distance,
known: true,
label: bestMatch.label,
};
}
return bestMatch.label === 'unknown';
});
if (newPerson) {
const unknownState = {
known: false,
};
console.log(unknownState);
return unknownState
} else {
console.log(knownPersonLabel);
knownPersonLabel;
}
}
| 11:55:36 |
tarvos90 | aber das ist irgendwie alles nicht so geil :D | 11:55:43 |
0xAFFE | tarvos90: Könnte man dafür nicht auch Array.prototype.reduce benutzen? | 11:57:46 |
tarvos90 | statt dem every? hm | 11:58:22 |
0xAFFE | tarvos90: sowas in der Richtung:
let result: { label: knownDetection, newPerson: boolean } = {
label: { known: false },
newPerson: false,
}
const result = referenceFaces.reduce((prev, current) => {
})
| 12:17:05 |
tarvos90 | Probier ich gleich, muss erstmal essen^^ | 12:27:22 |
tarvos90 | mag reduce immer nicht all zu sehr wenn es nicht wirklich etwas arithmetisches ist :D
TS meckert auch gerade irgendwie | 13:18:42 |
tarvos90 | so geht's lol :D
function getKnownState(
referenceFaces: UpgradedDecetionInterface[],
currentDetection: UpgradedDecetionInterface,
): knownStateInterface {
// Returns true if every referenceFace in referenceFaces
// compared to one Detection is labeled as 'unknown'.
const isNew = referenceFaces.every(referenceFace => {
const bestMatch = referenceFace.faceMatcher.findBestMatch(
currentDetection.descriptor[0],
);
return bestMatch.label === 'unknown';
});
if (isNew) {
const newDetection = {
known: false,
};
return newDetection;
}
const bestMatchLabels = referenceFaces.map(referenceFace => {
const bestMatch = referenceFace.faceMatcher.findBestMatch(
currentDetection.descriptor[0],
);
return bestMatch.toString(false);
});
const bestMatchLabel = bestMatchLabels.filter(label => {
return label !== 'unknown';
})[0];
const knownDetection = {
known: true,
label: bestMatchLabel,
};
return knownDetection;
}
| 16:20:28 |
0xAFFE | tarvos90: Würde das eher so machen:
const bestMatchLabel = bestMatchLabels.filter(label => {
return label !== 'unknown';
}).shift();
Finde so Array-Access über index nicht so optimal, weil es ja nicht umbedingt gegeben sein muss das es das Element gibt.
| 16:23:25 |
tarvos90 | ah danke, ja das ist besser :D | 16:24:00 |