4 Dec 2019 |
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 |
21 Jan 2020 |
gelight | Hi all ... wer hätte Lust mal wieder auf ein kleines Treffen? | 13:40:04 |
27 Jan 2020 |
tarvos90 | Ich gerne, kann ja auch im kleineren stattfinden :+1: | 00:11:55 |
tarvos90 | Ich hab außerdem zur späten Stunde noch mal ein rxjs Anliegen :D, ich hab einen Stream von Daten einer Webcam und erkenne dort Gesichter mit einer API. Ich möchte jetzt alle erfassten Gesichter emitten (eine Liste/Array), wenn eine gewisse Zeitlang nichts erkannt wurde. Der Stream soll aber nicht enden, es soll dann eine neue Liste angefangen werden.
Mein erster Ansatz sieht so aus:
const detector = interval(intervalValue).pipe(
exhaustMap(() => {
return this.detectFaces();
}),
filter(x => x !== undefined),
map(detections => {
return detections.map(this.faceApiService.transformDetection);
}),
timeout(5000),
);
detectFaces gibt mir entweder eine Liste von Detections oder eben undefined, deswegen fand ich das mit filter und timeout eigentlich ganz gut so. Aber ist ja nun nicht ganz das was ich brauche. Irgendwie denke ich, müsste ich bufferTime mit timeout kombinieren aber ich nicht wirklich Ahnung von rxja und hab mir das nur mit diesem decision tree zusammengebaut
| 00:17:09 |
tarvos90 | irgendwie sowas: https://i.imgur.com/isONFBr.jpg | 00:18:01 |