Du bist nicht eingeloggt! Möglicherweise kannst du deswegen nicht alles sehen.
  (Noch kein mods.de-Account? / Passwort vergessen?)
Zur Übersichtsseite
Hallo anonymer User.
Bitte logge dich ein
oder registriere dich!
 Moderiert von: Irdorath, statixx, Teh Wizard of Aiz


 Thema: pOT-lnformatik, Mathematik, Physik XXII ( Jetzt nehmen uns Computer schon die Memes weg! )
« vorherige 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 [48] 49 50 51 52 nächste »
erste ungelesene Seite | letzter Beitrag 
derSenner

AUP derSenner 08.04.2020
Btw: Electron hab ich nicht wirklich ernst gemeint. Electron ist Abfall, saulangsam und kommt mit nem elendslangen Rattenschwanz an Software daher.

Aber prinzipiell kannst du auch mit dem Browser Dateien parsen. Kommt halt drauf an, wie groß und was die Clients so für PCs haben.
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von derSenner am 01.02.2020 20:03]
01.02.2020 20:02:37  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Oli

AUP Oli 21.12.2018
So, wegen der Kafka Geschichte. Ich beschreibe mal unser Ziel, und ihr sagt mir, welches Tool ich nutzen soll.

Wir ihr vielleicht wisst arbeite ich mit Hochleistungsrechnern. Da ist es so, dass die Anwender einen Job (Bash script, welches irgendwelche aufwendigen Simulationen aufruft) ans System schicken. Der wird eine Weile in eine Warteschlange (Queue) gesteckt und je nach angeforderten Ressourcen irgendwann gestartet. Dann kann es sein, dass er mal pausiert wird, mal auf anderer Hardware neu gestartet, etc.

Das Queueing System, das dieses ganze Scheduling übernimmt, emittiert für alle Statusänderungen des Jobs ein Event. Das Event hat einen Typen, eine Job ID, eine Zeit, und viele weitere Metainformationen (je nach Event Typ unterschiedlich). Ich habe bereits ein Tool, welches mir diese Events in JSON umwandelt.

Das kann so aussehen:

 
Code:
{"__type": "EVENT_JOB_NEW", "__jobid": 123, "__time": 123213213, ...}
{"__type": "EVENT_JOB_ACCEPT", "__jobid": 123, "__time": 123214322, ...}
{"__type": "EVENT_JOB_START", "__jobid": 123, "__time": 123213346436, ...}
{"__type": "EVENT_JOB_DISPATCH", "__jobid": 123, "__time": 1232125332, ...}
{"__type": "EVENT_JOB_FINISH", "__jobid": 123, "__time": 1232135463, ...}


Zwischendurch soll aus den Job Scripts selbst auch noch Informationen zum Job geschickt werden, also zum Beispiel so:

 
Code:
{"__type": "JOB_INFO_BLEH", "__jobid": 123, "__time": 123213213, ...}
{"__type": "JOB_INFO_BLUB", "__jobid": 123, "__time": 123214322, ...}


Es kommt also ein "Stream" von Events vom Cluster, der eine Menge Informationen zum Job und dessen Lebenszyklus hat. Das ganze verteilt über bis zu mehrere Wochen (manche Jobs rechnen so lange).

Ich will eine Datenbank mit allen Jobs aufbauen (PostgreSQL). Nehmen wir der Einfachheit halber an, jeder Job ist eine Zeile.

Ziele

  • Alle Events sollen persistent gespeichert werden, weil ich ggf. später noch Infos daraus brauche, die im PGSQL Schema nicht bedacht wurden.
  • Es sollen keine Events verloren gehen.
  • Die Events sind JSON; Ich will neue Events erfinden / JSON Schemata ändern können ohne irgendwas an meiner Anwendeung ändern zu müssen. Ich will also erstmal einfach alles auf den Server feuern können was ich will, und mich später um die Auswertung der Daten kümmern.
  • Es soll am Ende mehrere "Apps" geben, die sich aus den Events unterschiedliche Tabellen / Views / Reports / Status pages / ... aufbauen. Diese "Apps" sollen die Möglichkeit haben sich den Soll-Zustand beim Start aus dem historischen Eventlog neu aufzubauen.
  • Der Eventspeicher soll unique sein - Wenn ich aus Backups Events nochmal reinschiebe, sollen die nicht doppelt gespeichert werden.
  • Es sollte irgendeinen Subscribe/Push Mechanismus geben. Wer vorschlägt, die JSON Blobs im Dateisystem zu speichern und darauf zu pollen wird gepaddelt.


Zahlen

  • Im Moment bis zu 10 Events / Sekunde
  • Im Moment bis zu 2MB pro Event (im Schnitt vermutlich < 200kB)
  • Aufbewahrung der Roh-Events über mehrere Jahre (mehrere TB Daten)
  • Ich habe erstmal nur einen Server zur Verfügung (>200GB Ram, 6 Kern)


Ansätze

  • Events in einfache PGSQL Tabelle stopfen, einige sinnvolle Indices (inkl. UNIQUE) aufbauen, mittels NOTIFY/LISTEN die "Apps" drauf lauschen lassen und eigene Tabellen aufbauen. Allerdings habe ich Angst, dass das Index Management bei Milliarden Rows irgendwann nicht mehr skaliert. Ein RDBMS ist eigentlich nicht für eine einfache Liste geeignet.
  • Kafka mit Stream Prozessoren, die zum Beispiel mittels SessionWindow die Events nach JobID gruppieren und als Batch in ein neues Topic schreiben. Die Apps sind einfach Consumer für auf sie zugeschnittene Topics.
  • Hier könnte deine Idee stehen


Einen Stream in eine Tabelle umzuwandeln scheint nach der Dokumentation von kafka genau das zu sein, wofür es erfunden wurde. Unendlich lange Persistenz und eine Art "UNIQUE" für das Rohdaten-Topic kann es auch. Ich muss mir dabei keine Sorgen um Datenverlust bei den Stateful Stream Prozessoren machen, weil Kafka das übernimmt. Skalieren tut es, Redundanz kann man einstellen, etc.

Ich bin aber weiß Gott niemand, der unbedingt eine Hipster Lösung haben will. Im Gegenteil - je einfacher desto besser. Daher auch initial meine PGSQL Idee. Je mehr Code ich aber selbst schreiben muss, desto schlechter wird das System. Ich kenne mich.

Danke
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Oli am 01.02.2020 20:30]
01.02.2020 20:26:41  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Oli

AUP Oli 21.12.2018
 
Zitat von derSenner

Aber prinzipiell kannst du auch mit dem Browser Dateien parsen. Kommt halt drauf an, wie groß und was die Clients so für PCs haben.


Nein. Wie denn? Die FileSystemAPI ist AFAIK gerade erst ein Proposal. Dateien auf einen Server laden ist keine Option. Es ginge nur mit Browser Extensions, aber vermutlich sind die auch total sandboxed.

/e: Wenn das ginge, würde ich einfach eine Website als Server anbieten und die Leute haben gar nix mehr lokal.
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Oli am 01.02.2020 20:28]
01.02.2020 20:28:23  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
derSenner

AUP derSenner 08.04.2020
Das kommt halt drauf an, was du alles supporten musst.
https://developer.mozilla.org/en-US/docs/Web/API/FileSystem

Du kannst aber natürlich auch einfach AJAX/fetch verwenden, um Files an ein Serverseitiges Script weiterzuleiten. Das geht sowieso, unabhängig was für ein Browser das ist. Aber dann biste halt eh wieder bei der kleiner-Server-und-JavaScript Lösung. Was ich aber nicht so unelegant finde. Definitiv besser, als mit Electron und React den Client zuzuscheissen.
[Dieser Beitrag wurde 3 mal editiert; zum letzten Mal von derSenner am 01.02.2020 20:38]
01.02.2020 20:36:00  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Oli

AUP Oli 21.12.2018
Ich finds arg umständlich.

@Rufus, Putze: Danke für eure Vorschläge bzw. den Input. Schaue ich mir an.

/e: Helloworld mit PySide2/Qt5 und Pyinstaller: 383 MB
Helloworld mit WxWidgets und Pyinstaller: 253MB

fml.
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Oli am 01.02.2020 20:47]
01.02.2020 20:42:43  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
csde_rats

AUP csde_rats 04.09.2021
Die imho eleganteste Lösung wäre schlicht eine JSON-Spalte in deiner Tabelle und einen geeigneten Primärschlüssel. Letzterer könnte interessant sein. Haben deine Timestamps garantiert(!) ns-Auflösung? Wenn ja, $timestamp-$job wird wohl reichen. Ein synthetischer Primärschlüssel geht nicht (" Der Eventspeicher soll unique sein - Wenn ich aus Backups Events nochmal reinschiebe, sollen die nicht doppelt gespeichert werden."), also wenn Zeitstempel*Jobid nicht unique genug ist... $timestamp-hash(json) (von hash(json) als PK ist abzuraten).

Du kannst in postgres JSON-Spalten indizieren lassen. Du kannst auch einzelne JSON-Expressions indizieren, z.B. auf json->>'__type' oder json->>'__jobid'. Das funktioniert sehr gut.

 
/e: Helloworld mit PySide2/Qt5 und Pyinstaller: 383 MB



Pyinstaller nimmt Gott und die Welt mit, da kann man mindestens 80 % von wegschmeißen. py2exe war (zumindest früher) eher in der umgekehrten Richtung unterwegs, hat eher nur das nötigste mitgebracht, manchmal zu wenig. Der Kram lässt sich auch ziemlich gut komprimieren. Der Screenshot da oben ist zwar nen 10 MB Installer, aber extrahiert halt 50 MB oder so.
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von csde_rats am 01.02.2020 20:53]
01.02.2020 20:50:20  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Oli

AUP Oli 21.12.2018
Die PGSQL Lösung funktioniert bereits - unique IDs habe ich gelöst, und wie ich JSONB verwende weiß ich auch. Ich habe es bisher nur mit 5GB Daten getestet, da gehen INSERTs noch schnell - aber ob es auf TB auch noch skaliert muss ich testen. INSERT muss schnell bleiben...

/e: Im Moment mache ich bei PGSQL sobald das EVENT_JOB_FINISH Event kommt ein SELECT auf alle Events die zu der Job ID gehören. So muss ich in meiner "Consumer" App keinen Zustand speichern, also mir irgendwelche Events cachen bis EVENT_JOB_FINISH da ist. Also brauche ich mindestens auf die Job ID auch noch einen Index.
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Oli am 01.02.2020 21:03]
01.02.2020 21:00:00  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
B0rG*

Gordon
 
Zitat von Oli

/e: Helloworld mit PySide2/Qt5 und Pyinstaller: 383 MB
Helloworld mit WxWidgets und Pyinstaller: 253MB

fml.



Wow. Da ist man ja wirklich fast bei Electron.
01.02.2020 21:11:14  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
csde_rats

AUP csde_rats 04.09.2021
Bei ein paar TBs würde ich mir da noch keine Gedanken machen, sofern die Indizies sinnvoll gewählt sind (Lokalität), was bei der ja der Fall ist.

e: Vielleicht speziell für diesen Anwendungsfall interessant: https://github.com/postgrespro/zson
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von csde_rats am 01.02.2020 22:13]
01.02.2020 21:57:59  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[smith]

AUP [smith] 29.07.2010
 
Zitat von Oli

Hier könnte deine Idee stehen


Ist ein wenig spät, ich würde da mal in Ruhe drüber nachdenken. Nur zum Abklopfen:
- Sind auch andere Datenbanken außer PostgreSQL möglich? Z. b. MongoDB (würde viel mit JSON vereinfachen) oder etwa HBase?
- Für die Langzeitaufbewahrung ist JSON zwar lesbar, aber eben auch verhältnismäßig groß. Ist sowas wie protobuf, avro oder ein anderes Binärformat möglich?
- Kann man annehmen, dass nur Infos zu aktuell laufenden Jobs interessant sind für schnelle Zugriffe oder muss das gesamte Archiv quasi im RAM verfügbar sein?
- Generell, willst du überhaupt viele Queries/Auswertungen/Random-Zugriffe machen oder eigentlich "nur" die Events haben?
- Gehen wir von idealen Clustern/unendlichen Festplatten/unendliche Prozessorverfügbarkeit aus, oder gibt es Grenzen außer "so billig wie möglich"?
02.02.2020 1:50:15  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
limlug

tf2_soldier.png
 
Zitat von Oli

Muss
- max. LGPL
- muss ohne installer oder Abhängigkeiten einfach laufen

Darf
- scriptsprache lieber als kompiliert
- kleine Paketgröße
- native look & feel
- einfach zu cross compilen / packen




Python mit Qt. Mit Cython in C/C++ Code übersetzen und für die Target Plattform compilieren.

Vorteil:
Relativ entspannte Entwicklung
Kleine Binaries
Nachteil:
Buildchain muss einmal aufgesetzt werden
02.02.2020 2:17:40  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
PutzFrau

Phoenix Female
Apropos Kotlin:

https://github.com/Kotlin/kotlin-numpy/blob/master/README.md

02.02.2020 5:16:22  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Oli

AUP Oli 21.12.2018
 
Zitat von [smith]

 
Zitat von Oli

Hier könnte deine Idee stehen


Ist ein wenig spät, ich würde da mal in Ruhe drüber nachdenken. Nur zum Abklopfen:
- Sind auch andere Datenbanken außer PostgreSQL möglich? Z. b. MongoDB (würde viel mit JSON vereinfachen) oder etwa HBase?


Prinzipiell schon, aber nach intensiver Recherche bin ich zu dem Schluss gekommen dass diese nosql Json stores ggü. Pgsql keinen Vorteil bieten. Letzteres ist einfach so wahnsinnig gut mit Json geworden. Und dann bleibe ich lieber simpel.

 
Zitat von [smith]

- Für die Langzeitaufbewahrung ist JSON zwar lesbar, aber eben auch verhältnismäßig groß. Ist sowas wie protobuf, avro oder ein anderes Binärformat möglich?


Wie gesagt, ich will, dass das schema dynamisch bleibt. Wie es gespeichert wird ist mir egal, Hauptsache ich kann die Keys zusammen mit den values ablegen oder das schema wird automatisch inferred wenn ein unbekanntes schema zum ersten Mal auftaucht. Das wäre eigentlich sogar ganz nice. Ob das mit avro geht, keine Ahnung...
 
Zitat von [smith]

- Kann man annehmen, dass nur Infos zu aktuell laufenden Jobs interessant sind für schnelle Zugriffe oder muss das gesamte Archiv quasi im RAM verfügbar sein?


Im RAM nicht, aber stell dir vor auf einmal wollen wir eine Tabelle mit allen Jobs haben die mindestens einmal pausiert wurden. Beim ersten Start der App muss dann das Archiv einmal durchgegangen werden.

Die meisten Tabellen werden wohl geupdatet während der Job läuft oder sobald er fertig ist. Historische Daten sind nur nötig wenn sich eine App ändert oder neu entsteht, bzw. mal down war und nicht mehr aktuell ist.
 
Zitat von [smith]

- Generell, willst du überhaupt viele Queries/Auswertungen/Random-Zugriffe machen oder eigentlich "nur" die Events haben?


Auf die Tabellen der Apps gibt es viele selects, auf die Rohdaten nur von den Apps selbst.
 
Zitat von [smith]

- Gehen wir von idealen Clustern/unendlichen Festplatten/unendliche Prozessorverfügbarkeit aus, oder gibt es Grenzen außer "so billig wie möglich"?


Eher letzteres. Ram ist eher verfügbar als CPU, und gehen wir erstmal von einem Server aus.

Was spricht denn in diesem konkreten Fall gegen Kafka?
02.02.2020 9:53:14  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Oli

AUP Oli 21.12.2018
 
Zitat von limlug

 
Zitat von Oli

Muss
- max. LGPL
- muss ohne installer oder Abhängigkeiten einfach laufen

Darf
- scriptsprache lieber als kompiliert
- kleine Paketgröße
- native look & feel
- einfach zu cross compilen / packen




Python mit Qt. Mit Cython in C/C++ Code übersetzen und für die Target Plattform compilieren.

Vorteil:
Relativ entspannte Entwicklung
Kleine Binaries
Nachteil:
Buildchain muss einmal aufgesetzt werden


Dann habe ich mir ja eigentlich nur den Python Interpreter gespart, oder? Die gui libs muss ich ja trotzdem mitliefern...
02.02.2020 9:54:14  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[smith]

AUP [smith] 29.07.2010
 
Zitat von Oli

Was spricht denn in diesem konkreten Fall gegen Kafka?


Keine Sorge, ich versuche dir nicht Kafka auszureden

Durch dein Single-Server-Deployment hast du halt einige Vorteile des Clusterings nicht und einen Single-Point-of-Failure. Ansonsten würde ich mir noch Avro angucken, dass sollte auf deine Anforderungen ganz gut passen und du kriegst die Nachrichten kleiner. Das Ende deiner Verarbeitungskette ist mir noch etwas schwammig in den Anforderungen. Evtl. hilft da das Vorgehen, sich von der "allgemeinen Supertabelle" zu verabschieden (die hast du ja schon in Kafka), und lieber kleinere schnelle spezialisierte Views aus den Events zu bauen. Lassen sich vermutlich auch schneller wegwerfen/neubauen als das ganze Monster. Nebenbei, natürlich kann auch Kafka Nachrichten nur bis zur Festplattengröße aufheben, du solltest also auch drüber nachdenken ob du die nicht doch wegwerfen kannst irgendwann. Zu Testzwecken würde ich wohl was leichtgewichtigeres erstmal benutzen (vielleicht RabbitMQ), die Administration von Kafka macht mir persönlich Angst.

Tja, viel Spaß, berichte gerne von Ergebnissen und Learnings
02.02.2020 14:52:04  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Oli

AUP Oli 21.12.2018
Hm, ich finde nichts dazu wie ich automatisch ein avro schema generieren kann wenn ein bisher unbekannter Json blob ankommt. Wie gesagt - meine Lösung muss unterstützen, dass plötzlich neue Daten reinkommen mit einem bisher unbekannten Schema, und zwar als einfaches Json. Mein Server müsste das dann merken, ein avro schema aus den Daten generieren und in der registry ablegen.

Alles was ich im Netz finde erfordert manuelles Eintragen der Schemata.
02.02.2020 15:23:03  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
PutzFrau

Phoenix Female
Einerseits, habe ich Lust, eine Kotlin image processing Library zu schreiben (inspiriert von imglib2), andererseits ist das auch echt verdammt viel Arbeit, wenn man das gescheit machen will. Mal abwarten, ob meine Lust dazu anhält, oder ob das nur ein Sonntagsgedanke ist.

02.02.2020 22:40:10  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
]N-Squad[Crow

AUP ]N-Squad[Crow 03.05.2013
Ich arbeite gerade noch was an meiner Datenbank.
Mittlerweile greife ich über Java auf die mySQL DB zu. Wenn ich da nun Querys mit Umlauten nutzen möchte, zerschießt er mir die Codierung. Ohne Java per cmd passiert das selbe Spiel. Das ändern der Codepage in CMD führt dazu, dass Semikolons nicht mehr angenommen werden, damit kann ich keine Querys abschicken. Genutzt hab ich für CMD die Codepage 65001 für Unicode.

Was mache ich da nun falsch? Und wie gehe ich das Problem in Java an? Falls es relevant ist: Ich nutze gerade NetBeans.
/edit: In NetBeans ist das Encoding auch auf UTF-8 eingestellt.
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von ]N-Squad[Crow am 02.02.2020 22:55]
02.02.2020 22:51:18  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
derSenner

AUP derSenner 08.04.2020
Hä? Ist denn die Datenbank auch in UTF8?
Was ist denn der konkrete Fehler?
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von derSenner am 02.02.2020 22:55]
02.02.2020 22:54:39  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
]N-Squad[Crow

AUP ]N-Squad[Crow 03.05.2013
Wenn ich einen Umlaut in einer Abfrage habe, dann geht dieser kaputt. Das ist der Fehler.
Es passiert sowohl in NetBeans, egal ob per Eingabe oder im Code schon eingebaut, als auch in der CMD von Windows 10. Das sind evtl. auch zwei eigenständige Fehler?

Stelle ich nun die Codepage in CMD auf UTF-8 um, so kann ich keine Befehle mehr mit einem Semikolon abschließen. MariaDB will immer weitere Eingaben und beendet die vorherige einfach nicht. Ich bekomme immer wieder nur eine neue Zeile mit einem "'>". Passiert allerdings nur, wenn Umlaute mit im Query sind...

In NetBeans geht der Umlaut direkt nach der Eingabe kaputt. Ich habe dafür nach der Eingabe eine Ausgabe der Variabel eingebaut, noch bevor sie in die Anfrage eingesetzt wird. Dort ists dann halt auch schon eine Fragezeichen.

/edit: Ich habe MariaDB schon auf UTF-8 umgestellt.
Vorher wars das:
 
Code:
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | cp850   |
| character_set_connection | cp850   |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | cp850   |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8    |


Nachher:
 
Code:
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8    |
| character_set_connection | utf8    |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | utf8    |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8    |
+--------------------------+---------+


/edit: Das NetBeans Problem ist nun gelöst. Die Eingabe in NetBeans nutzt Windows-1252. Kann man nur in der config Datei anpassen, was ich nun gemacht habe.

Das CMD Problem besteht weiterhin. Gewisse Befehle kann ich nicht ausführen, wenn ich die Codepage auf 65001 wechsele. Auch solche ohne Umlaut. Ich habe noch kein Muster erkannt... Dabei habe ich z.B. auch zwei mal CMD offen, einmal mit der default Codepage und eine mit 65001. Ich paste den selben Befehl, in default läuft er sauber durch, in 65001 will er ihn nicht ausführen und wartet auf weitere Eingaben. Was ist da nur los?
[Dieser Beitrag wurde 6 mal editiert; zum letzten Mal von ]N-Squad[Crow am 02.02.2020 23:38]
02.02.2020 23:03:09  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
derSenner

AUP derSenner 08.04.2020
Ehrlich gesagt ist mir noch nie ein Problem mit dem Zeichensatz in der Console und MariaDB aufgefallen. Ich hab hier gar nix am Zeichensatz der Console verändert und alles funktioniert wie es soll. Zum Abgleich: Sowohl Powershell als auch cmd haben hier "850 - OEM Multilingual Lateinisch I" eingestellt. Alles tut wie es soll. IntelliJ läuft alles natürlich auf UTF8.

Was steht denn in deiner my.ini/cnf drinnen?
Tu mal folgendes rein:

 
Code:
init-connect ='SET NAMES utf8'
character-set-server = utf8
collation-server = utf8_general_ci

[client]
default-character-set = utf8

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8
03.02.2020 12:47:39  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
]N-Squad[Crow

AUP ]N-Squad[Crow 03.05.2013
 
Zitat von derSenner

Ehrlich gesagt ist mir noch nie ein Problem mit dem Zeichensatz in der Console und MariaDB aufgefallen. Ich hab hier gar nix am Zeichensatz der Console verändert und alles funktioniert wie es soll. Zum Abgleich: Sowohl Powershell als auch cmd haben hier "850 - OEM Multilingual Lateinisch I" eingestellt. Alles tut wie es soll. IntelliJ läuft alles natürlich auf UTF8.

Was steht denn in deiner my.ini/cnf drinnen?
Tu mal folgendes rein:

 
Code:
init-connect ='SET NAMES utf8'
character-set-server = utf8
collation-server = utf8_general_ci

[client]
default-character-set = utf8

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8



Danke, werde ich gleich testen.
Über NetBeans geht es jetzt aber echt wunderbar, nur per CMD kommen noch die kaputten Umlaute. Dazu findet sich auch viel über Google, nur nicht zu dem Problem was dann kommt, wenn ich die Codepage von CMD ändere.

Kurze Frage zu einem anderen Thema: Welches Buch zum Thema Python sollte man für den Einstieg nutzen? peinlich/erstaunt
03.02.2020 17:36:45  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Oli

AUP Oli 21.12.2018
Python foo:

 
Code:
class Param:
    def bleh(self):
        # How to get f of outermost class?
        pass 

class A:
    p = Param()

class B(A):
    f = 1

class C(A):
    f = 2

b = B()
b.p.bleh()

Wie komme ich in bleh() an den Wert von f?
Metaklassen sind erlaub, inspect Modul lieber nicht.
06.02.2020 15:45:33  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
csde_rats

AUP csde_rats 04.09.2021
[x] besser gar nicht

b = B()
b.p.bleh() ==> 1
c = C()
c.p.bleh() ==> 2

foo = b.p
foo.bleh() ==> ???

bar = Param()
bar.bleh() ==> ???

--

Frage ist: Ist es wirklich ein Klassenattribut? Ist es ein Param() für ALLE Instanzen in der gesamten Klassenhierarchie? Wahrscheinlich nicht, oder? Wahrscheinlich sieht es doch so aus:

class A:
   def __init__(...):
       self.p = Param()


Dann kannst du natürlich


class A:
   def __init__(...):
       self.p = Param(ref=self)


machen. Das könnte man auch automatisieren.

Wenn die Antwort ist: Ja, ich möchte das deklarativ schreiben (class A: p = Param()), dann ist die Lösung: Metaclass, im __new__ der Metaclass untersuchst du dann das Dict der Klasse auf Param Instanzen, kopierst die und setzt eine Referenz in der Kopie.

Oder ist es eher so eine Sache, wo die Klasse etwas deklariert und man später so tut, als ob man Instanzen dieser Klasse hat, aber die Felder dieser Instanzen haben gar nichts (im Sinne von Typen) mit der Klasse zu tun und eigentlich sind die Instanzen auch gar keine Instanzen dieser Klasse?
AKA was Python ORMs in der Regel machen? Wenn ja, die Antwort steht ja quasi in der Frage davor ;D

e: Die Frage "Wie komme ich an die Klasse in einem Dekorator für Methoden?" ist verwandt hiermit. Die Antwort hängt auch dort stark davon ab, was man eigentlich vorhat, ist aber in direkter Form erstmal: Gar nicht.
[Dieser Beitrag wurde 3 mal editiert; zum letzten Mal von csde_rats am 06.02.2020 16:09]
06.02.2020 16:05:43  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Oli

AUP Oli 21.12.2018
Richtig, sowas wie das django orm will ich definieren. Der param wird auf einer Elternklasse gesetzt, aber bestimmte Optionen des parans sollen auf den Kind klassen definiert sein. Der param soll selbst auf die zugreifen können.

Also Instanzen kopieren, okay.

Deklarativ ist wichtig weil es eine Art Framework ist und die Anwender, die dann B und C schreiben möglichst wenig programmieren sollen (und können). Deshalb soll da viel automagisch passieren, und die Logik der metaklassen kann ruhig kompliziert sein. Wie bei django halt.

 
Code:
class Param:
    def __init__(self, *args, **kwargs):
        self._args = args
        self._kwargs = dict(kwargs)

        self.pos = args[0]
        self.arg = kwargs.pop('arg')

class MC(type):
    def __new__(cls, clsname, bases, attrs):
        new_attrs = {}
        new_fields = {}

        for field_name, field in attrs.items():
            if issubclass(type(field), Param):
                new_fields[field_name] = field
            else:
                new_attrs[field_name] = field

        for b in bases:
            for name, field in getattr(b, '_fields', {}).items():
                new_fields[name] = field.__class__(*field._args, **field._kwargs)
            
        newclass = super().__new__(cls, clsname, bases, new_attrs)
        
        setattr(newclass, '_fields', new_fields)

        newclass._init_fields()

        return newclass

class A(metaclass=MC):
    p1 = Param('pos1', arg='123')
    p2 = Param('pos2', arg='345')

    @classmethod
    def _init_fields(Cls):
        pass

    def __getattr__(self, name):
        if name in self._fields:
            return self._fields[name]

class B(A):
    f = 1

    @classmethod
    def _init_fields(Cls):
        Cls._fields['p1'].arg = Cls.f

class C(A):
    f = 2

    @classmethod
    def _init_fields(Cls):
        Cls._fields['p1'].arg = Cls.f

b = B()
c = C()
print(b.p1.arg)
print(c.p1.arg)

Wenn man ein bisschen auf den Code starrt versteht man es irgendwann. =)

Wenn ich doch nur so Arbeitskollegen wie Rats hätte.
[Dieser Beitrag wurde 4 mal editiert; zum letzten Mal von Oli am 06.02.2020 20:14]
06.02.2020 16:36:43  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
B0rG*

Gordon
Lustiges Rätsel. Hier ist eine Methode, die den Call-Stack "live" aufsammelt:

 
Code:
class ContextForwarder:
    # On the way down: Add call context
    def __getattribute__(self, name):
        if name == "_call_context":
            return object.__getattribute__(self, name)

        inner = object.__getattribute__(self, name)
        if isinstance(inner, ContextForwarder):
            inner._call_context = self
        return inner

    # On the way up: Search context if not resolvable locally
    def __getattr__(self, name):
        if name == "_call_context":
            raise AttributeError

        return getattr(self._call_context, name)


class Param(ContextForwarder):
    def bleh(self):
        print(self.y, self.f)
        try:
            print(self.g)
        except AttributeError:
            print("g raises an AttributeError")


class A(ContextForwarder):
    p = Param()
    y = "y"


class B(A):
    f = 1


class C(A):
    f = 2


class D(C):
    f = 3


class E(D):
    g = 4


class F(ContextForwarder):
    g = 5
    b = B()


b = B()
c = C()
d = D()
e = E()
f = F()
b.p.bleh()
c.p.bleh()
d.p.bleh()
e.p.bleh()
f.b.p.bleh()


--- Output:


y 1
g raises an AttributeError
y 2
g raises an AttributeError
y 3
g raises an AttributeError
y 3
4
y 1
5


Kann man bestimmt noch etwas kompakter hinschreiben.
Ich denke der Vorteil dabei ist, dass die Member "live" hinzugefügt werden zu den Kindklassen, je nachdem wie man sie aufruft. Da es sich um "echte" Python-Member handelt sollte das Verhalten auch wohldefiniert sein in den meisten Situationen, wenn ich keinen Fehler gemacht habe. Ausnahmen: Es ist nicht threadsicher und man kann bestimmt Referenz-Kreise bauen die dann nicht richtig aufgelöst werden, weil es nur einen
_call_context
gibt. Letzteres kann man bestimmt reparieren mit etwas Aufwand.

Aber, das ist schon böse magischer Code. Weise jede Verantwortung von mir peinlich/erstaunt.


edit/ Man kann damit lustige Dinge anstellen!
[Dieser Beitrag wurde 3 mal editiert; zum letzten Mal von B0rG* am 08.02.2020 14:40]
08.02.2020 14:28:56  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
csde_rats

AUP csde_rats 04.09.2021
Alter Borg ... Breites Grinsen
08.02.2020 14:51:09  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
B0rG*

Gordon
...
Bonusrunde: Man kann damit dynamische dependency injection machen!

 
Code:
class Context(ContextForwarder):
    def __init__(self, context=None):
        if context is not None:
            self.into = context


class FirstContext(Context):
    database = {
        'a': 'First A',
        'b': 'First B',
    }

    def output(self, string):
        print ('First:', string)


class SecondContext(Context):
    database = {
        'a': 'Second A',
        'b': 'Second B',
    }

    def output(self, string):
        print ('Second:', string)


class ClientCode(Context):
    def output_from_database(self):
        print('This is client code!')
        self.output(self.database['a'])
        self.output(self.database['b'])


client_code = ClientCode()
first_context = FirstContext(client_code)
second_context = SecondContext(client_code)


try:
    client_code.output_from_database()
except AttributeError:
    print('Cannot work, no dependencies injected!')


first_context.into
client_code.output_from_database()

second_context.into
client_code.output_from_database()


--- Output:
This is client code!
Cannot work, no dependencies injected!
This is client code!
First: First A
First: First B
This is client code!
Second: Second A
Second: Second B
08.02.2020 15:57:18  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Xerxes-3.0

AUP Xerxes-3.0 07.09.2008
Pfeil
Ich frag hier nochmal, auch wenn das Problem eher banal ist und ich schon mehr Zeit hiermit verbracht habe, ales es dauert, das Ganze per Hand zu machen (peinlich/erstaunt):

 
Zitat von Xerxes-3.0

Ich hab eine halbjährlich wiederkehrende Aufgabe: Unterrichtsplanung und rauskriegen, wie oft ich überhaupt Unterricht mit dem entsprechenden Kurs habe.

Input: Den Kalender des jeweiligen Halbjahres, Ferientermine, Schultermine/Kursfahrten etc. und an welchem Wochentag ich wie viele Stunden mit dem jeweiligen Kurs habe.

Output: Eine Liste mit Datum für jeden Kurs und der Info, ob 1 oder 2 Stunden da anliegen.

Womit kriege ich das eleganterweise hin? Ich hab das in Excel gebaut, aber, um es mit meinem Vater zu sagen: schön isses nich. Es ist umständlich und ich muss jedes mal neu überlegen, wie man die Matrixformel noch gleich verwendet. Ganz zu schreigen von mehrzeitigen Zelleneigenschaften.

Wenns sein muss, installiere ich mir auch Python dafür und schreibe mir was aber geht das auch mit nem kleineren Kaliber für diesen Spatz?


Die Kurse habe ich z.B. Mo 1 Std, Mi 1 Std und Do 2 Std. Ob ich das als "1 0 1 2 0" oder sonstwie kodiere, ist mir dabei egal.
08.02.2020 18:25:07  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
csde_rats

AUP csde_rats 04.09.2021
Geht das vielleicht mit Recurrence Rules (rrule)? Dann könnte man das einfach per $beliebigerKalenderanwendung und iCal/Caldav erledigen.

Die Dinger können überraschend komplexe Zusammenhänge ausdrücken. Sowas wie "jeden Montag und jeden zweiten Dienstag aber nicht in der xx. Woche, fünfmal ab dem 1.4.21" geht z.B.
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von csde_rats am 08.02.2020 19:24]
08.02.2020 19:23:39  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
 Thema: pOT-lnformatik, Mathematik, Physik XXII ( Jetzt nehmen uns Computer schon die Memes weg! )
« vorherige 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 [48] 49 50 51 52 nächste »

mods.de - Forum » Public Offtopic » 

Hop to:  

Mod-Aktionen:
03.04.2020 11:26:13 Maestro hat diesen Thread geschlossen.
19.06.2018 19:32:04 Sharku hat diesem Thread das ModTag 'pimp' angehängt.

| tech | impressum