AugustQ
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Hi, ein schönes neues Jahr! Und gleich habe ich auch eine Frage. Vorbemerkung: ich kann kein Javascript. Allerdings kann ich ein bissel programmieren. Ich habe hier ein Programm in Javascript, das an einer Stelle Daten von einem Server holt. Das ist vermutlich diese Zeile:
| ms.getData(Us + "/data/v2/data.dust.min.json", 1).then((function(t) {
|
Dabei werden aber immer die aktuellen Daten geholt, aber ich will mit älteren Daten arbeiten. Diese Daten habe ich, sie liegen auf der Platte. Nun passe ich einfach obige Zeile an, dachte ich mir. So dachte ich mir das:
| fetch("/home/august/Silvester/2020/luftdaten_00721/Map\ Sensor.Community-Daten/data.dust.min.json", 1).then((function(t) {
|
Aber das Programm zeigt mir die Daten nicht an. Wie macht man das richtig? AugustQ PS: das ist die Funktion:
1
2
3
4
5
6
7
8
9
10
11
12 | function e() {
ms.getData(Us + "/data/v2/data.dust.min.json", 1).then((function(t) {
Ts = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(1), ms.getData(Us + "/data/v2/data.24h.json", 2).then((function(t) {
ks = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(2)
})), ms.getData(Us + "/data/v2/data.temp.min.json", 3).then((function(t) {
Ss = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(3)
})), ms.getData(Us + "/data/v1/data.noise.json", 4).then((function(t) {
As = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(4)
}))
}))
}
.......
|
und das hier ist meine Variante:
| function e() {
fetch("~/Silvester/2020/3/Map\ Sensor.Community-Daten/data.dust.min.json", 1).then((function(t) {
Ts = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(1)
}))
}
|
Bearbeitet von rklm: JavaScript Syntaxhighlighting
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
soweit habe ich den Code reduziert:
function e() {
ms.getData(Us + "/data/v2/data.dust.min.json", 1).then((function(t) {
Ts = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(1)
/* , ms.getData(Us + "/data/v2/data.24h.json", 2).then((function(t) {
ks = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(2)
})), ms.getData(Us + "/data/v2/data.temp.min.json", 3).then((function(t) {
Ss = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(3)
})), ms.getData(Us + "/data/v1/data.noise.json", 4).then((function(t) {
As = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(4)
}))
*/
}))
} nur: wie ändere ich den markierten Teil so ab, daß nicht auf den Server sondern auf die lokale Platte zugegriffen wird?
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
mittlerweile habe ich eine Fehlermeldung:
Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf file:///home/august/Silvester/2020/original/modified/~/Silvester/2020/original/modified/Map-Sensor.Community-Dateien/data.dust.min.json. (Grund: CORS-Anfrage war nicht http). Was muß ich da tun, damit das klappt? Wie schon geschrieben: ich komme nicht aus dieser Ecke, habe in dieser Umgebung noch nie gearbeitet. Und ich will doch nur diese eine Zeile .....
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Bevor jmd. kommt, der sich wirklich auskennt, eine Portion gesundes Halbwissen: 😉 Der Browser - das läuft doch im Browser? - wehrt sich aus Sicherheitsgründen dagegen, einfach so lokale Daten zu lesen. Bedenke, das jede Webseite mit dem Code "~/.bashrc" Deine Bashrc auslesen könnte um Dir vielleicht Sachen unterzuschieben, oder eine Passwortdatei in ~/.mozilla/firefox/*.default usw. . Hast Du den HTML-Code samt Javascript auch lokal gespeichert? Ich glaube es ist so, dass die Daten auf dem Server liegen müssen, auf dem auch das Programm liegt. Javascript ist m.W. an vielen Stellen derart vernagelt. Es gibt Javascriptengines für den lokalen Gebrauch (apt search javascript) - ob Dir das weiterhilft und die Ansicht im Browser erlaubt, ob das nötig ist, Workarounds möglich, müsstest Du selbst wissen. Selbst einen Server aufsetzen, der dann Daten und Programm ausliefert, riecht mir nach Kanonen auf Spatzen. Wenn das Programm Messwerte grafisch aufbereitet ist vielleicht eine Einführung in Gnuplot der Königsweg.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
Als jemand, der bei der beim Thema Webentwicklung schon etwas weiter ist, aber weit davon entfernt ist, das professionell zu machen: Aus Sicherheitsgründen will man ja normalerweise das Gegenteil von ungebremstem Zugriff von JS auf das lokale Dateisystem. Daher setzen die gängigen Browser recht restriktive Regeln für CORS (Cross-Origin Resource Sharing) - diesen verlinkten Artikel würde ich mal genau lesen. Standardmäßig darf man Daten nur von dem Server (und dem Port) nachladen, über den die Webseite bzw. der JS-Code ausgeliefert wurde. Wenn man sich des Risikos bewusst ist, kann man die CORS-Einstellungen serverseitig über die ausgelieferten HTTP Header modifizieren. Ich würde mir überlegen, ob man das nicht so umgestaltet kann, dass man einen Dateiauswahl-Button einbaut, damit der Nutzer über den dafür vorgesehenen Mechanismus eine Datei auswählen kann, die verarbeitet werden soll: https://50linesofco.de/post/2019-07-05-reading-local-files-with-javascript
|
phanthomasX
Anmeldungsdatum: 26. Dezember 2008
Beiträge: 99
|
... und wenn man wirklich lokale Dateien einlesen möchte kann man seinen Lieblingsbrowser auch anpassen.
Es gelten aber die bereits erwähnten Sicherheitsrisiken beim erlaubten Zugriff auf lokale Dateien.
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Hi, folgendes habe ich schon gemacht: setze security.fileuri.strict_origin_policy auf false. Danach war die Fehlermeldung weg. Aber das Problem noch nicht gelöst. Nach meinem (bescheidenen) Verständnis liest getData() die Daten vom Server und speichert sie unter ms ab. Wie kann ich die Daten von Platte lesen und weiterverarbeiten? Lesen kann ich sie mittlerweile, denke ich zumindest mal. Aber mit der weiteren Verarbeitung..... Also:
kann ich getData() so umstellen, daß die Daten von Platte gelesen werden? gibt es einen nalternativen Weg, der zum gleichen Ergebnis führt?
Schönen Gruß
AugustQ PS: es geht um diese Seite: https://deutschland.maps.sensor.community/#6/51.165/10.455 ich habe die Daten, sind so ca. 30GB. Ich will daraus einen Film machen über den jahreswechsel, d.h. die Böllerei an Silvester. So etwas habe ich vor einem und vor 2 Jahren schon mal gemacht, aber irgendwie ging das damals einfacher.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
AugustQ schrieb: Nach meinem (bescheidenen) Verständnis liest getData() die Daten vom Server und speichert sie unter ms ab.
Nicht ganz - ms ist ein Objekt, das die Methode ms.getData() besitzt und das ist eine Asynchrone Funktion (müsste wegen Zeile 17126 in der Zeile 17017 ff. der main.js definiert sein), die ein Promise zurück gibt (das Konstrukt liefert also einen Rückgabewert, sobald die asynchrone Funktion durchgelaufen ist, ohne die Ausführung des restlichen Programms aufzuhalten), das vom nachfolgenden .then() im Erfolgsfall weiterverarbeitet wird. Der Rückgabewert wird dann einfach weiter gereicht, ohne einer Variable zugewiesen zu werden, ms verändert sich dabei nicht. Wie kann ich die Daten von Platte lesen und weiterverarbeiten? Lesen kann ich sie mittlerweile, denke ich zumindest mal. Aber mit der weiteren Verarbeitung.....
Das sollte wie in https://stackoverflow.com/a/43576543 gezeigt gehen - also z.B.:
| fetch("file:///path/to/file")
.then(response => response.json())
.then(json_data => {
// do stuff with `json_data` representation of file
// see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#response_objects
})
.catch(err => console.log(err));
|
ich habe die Daten, sind so ca. 30GB.
Aber hoffentlich über viele Dateien verteilt, oder? 30 GB an JSON im Browser auf einmal zu laden würde ja eine sehr großzügig mit RAM ausgestattete Maschine erfordern...
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Danke für die Hinweise. Muß ich mir noch mal in Ruhe ansehen. Die Sache geht über 24 Stunden, der Film nachher über ca. 1 Minute. Das macht 1.440 Dateien, entsprechend ist jede Datei ca. 10MB groß. Das geht schon. Nur an diesem blöden getData() hängt es, alle anderen Skripte habe ich (auch Dank der Unterstützung hier im Forum vor ca. 2 Jahren). AugustQ
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
so sieht meine Funktion jetzt aus: function e() {
fetch( 'file:///home/august/Silvester/2020/luftdaten_00721/Map%20Sensor.Community-Dateien/data.dust.min.json')
.then( console.log("geladen") )
.then(response => response.json())
.then(json_data => { ((function(t) {
Ts = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(1)
} ))
} )
.catch(err => console.log(err));
} aber es geht nicht (siehe Anhang) Nach meinem Verständnis muß da noch eine Zuweisung an das Objekt ms erfolgen. Richtige Überlegung? Und falls ja: wie? Wie schon geschrieben: von Javascript versteh ich nix.
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
- Bilder
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
ich hoffe, ich habe es. So sieht das jetzt aus:
function e() {
// ms.getData(Us + "/data/v2/data.dust.min.json", 1).then((function(t) {
ms.getData("file:///home/august/Silvester/2020/luftdaten_00721/Map%20Sensor.Community-Dateien/data.dust.min.json", 1).then((function(t) {
Ts = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(1), ms.getData(Us + "/data/v2/data.24h.json", 2).then((function(t) {
ks = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(2)
}))
// ,
// ms.getData(Us + "/data/v2/data.temp.min.json", 3).then((function(t) {
// Ss = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(3)
// })),
// ms.getData(Us + "/data/v1/data.noise.json", 4).then((function(t) {
// As = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(4)
// }))
}))
} oder in Kurzform:
function e() {
ms.getData("file:///home/august/Silvester/2020/luftdaten_00721/Map%20Sensor.Community-Dateien/data.dust.min.json", 1).then((function(t) {
Ts = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(1), ms.getData(Us + "/data/v2/data.24h.json", 2).then((function(t) {
ks = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(2)
}))
}))
}
Das scheint zu funktionieren. Ich spiel weiter damit rum. PS: das hatte ich doch schon mal ausprobiert.....
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Hi, die Sache funktioniert jetzt. Folgende Schritte bin ich gegangen: Schritt 1: im Firefox die Seite about:config öffnen. Dort habe ich folgenden Eintrag umgesetzt:
security.fileuri.strict_origin_policy auf false Schritt 2: im Javascriptprogramm muß es nun heißen
ms.getData("file:///home/august/Silvester/2020/luftdaten_00721/Map%20Sensor.Community-Dateien/data.dust.min.json", 1).then((function(t) { Das läuft jetzt bei mir durch. Danke für alle Hinweise. Schönen Gruß
AugustQ
|
AugustQ
(Themenstarter)
Anmeldungsdatum: 24. Oktober 2007
Beiträge: 731
|
Hi, die Sache ist soweit fertig, der Text auf meinem Blog, inkl. des Videos. Hier findet man das: https://linux-fuer-wi.blogspot.com/2021/01/silvester-und-bollerverbot.html Danke für die Hinweise und Unterstützung. Schönen Gruß
AugustQ
|