meine Datenbank wird größer wenn ich Felder lösche

Django, Flask, Bottle, WSGI, CGI…
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Genau das bedeutet "Beibehaltung des Verhaltens" - Es soll auch in Zukunft genau das gleiche machen. Nur eben intern besser aufgebaut.

Mal ein mathematisches Beispiel zum Vergleich:

5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 = ?

Kann man so ausrechnen. Funktioniert auch. Irgendwann in der 2-3ten Klasse lernt man aber ein Refactoring-Verfahren, das hier die Multiplikation benutzt.

Wenn man Multiplikation noch nicht kennt, würde man vielleicht sagen: Wieso? Funktioniert doch! Was soll ich denn da ändern? Nun, es geht eben besser.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

So war das nicht gemeint. Es ist mehr die Frage, wie beobachte ich das Verhalten des Programmes um Verbesserungen zu finden?
Übrigens ist, soweit mir bekannt z.B. die Berechnung von 17*17 schneller als 17², wie ist das mit 17*17*17 und 17³?
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pitwheazle: Da das Verhalten gleich bleiben soll kann man durch beobachten des Verhaltens keine Verbesserungen finden.

Es geht dabei nicht um das Verhalten sondern um die Verständlichkeit, Wartbarkeit, und Erweiterbarkeit des Quelltextes. Also zum Beispiel die schon öfter angesprochenen Namen mit den kryptischen Abkürzungen, oder das beseitigen von magischen Zahlen. Das (re)organisieren des Codes in Funktionen und so weiter.

Beim „5 + … + 5“-Beispiel geht es weniger um die Ausführungsgeschwindigkeit, sondern um weniger Schreibarbeit, und damit auch weniger zu lesen. Man sieht da beispielweise nicht so schnell wie viele 5en da eigentlich addiert werden. Bei „5·9“ sieht man das viel leichter.

Auch bei 17·17 oder 17² und 17·17·17 oder 17³ schneller ist, zählt eigentlich eher was leichter zu lesen und warten ist. Bei mir nimmt sich das alles nicht viel:

Code: Alles auswählen

In [20]: %timeit 17*17
6.35 ns ± 0.067 ns per loop (mean ± std. dev. of 7 runs, 100,000,000 loops each)

In [21]: %timeit 17**2
6.35 ns ± 0.0319 ns per loop (mean ± std. dev. of 7 runs, 100,000,000 loops each)

In [22]: %timeit 17*17*17
6.33 ns ± 0.0156 ns per loop (mean ± std. dev. of 7 runs, 100,000,000 loops each)

In [23]: %timeit 17**3
6.4 ns ± 0.124 ns per loop (mean ± std. dev. of 7 runs, 100,000,000 loops each)
Das kann auf einem anderen System oder Interpreter anders aussehen, ist aber für sich genommen überall so schnell, das anderer Code drum herum mehr Einfluss auf die Gesamtlaufzeit haben düfte.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn du eine Datenbank-getriebene Anwendung (wie deine) im größeren Maßstab skalieren willst oder muss, dann kommst du irgendwann nicht umhin mal zu sehen, was die DB so macht, also ggf. slow queries identifizieren, Relationen optimieren, Round Trips durch die DB vermeiden etc.

Zu letzterem hast du ja diverse Thread wo du auch Hinweise bekommen hast, wie wo was zu verbessern wäre.

Und _extrem_ wichtig bei dem, auf was du abzielst: "funktioniert doch also ist es gut" ist definitiv der falsche Ansatz. Der Ansatz ist durchaus legitim für Hobbyprojekte oder Sachen, wo man weiß, dass das eh' nur drei Leute am Tag mal kurz nutzen oder so. Das ist aber nach deiner eigenen Darstellung nicht dein Ziel. Und dann gibt es sehr wohl einen Unterschied zwischen "funktioniert" und "gut".

Und es ist nun mal (leider) so, dass bei so Projekten wie deinem, die einer breiten Masse zugänglich gemaht werden soll, das Schreiben von Code und das Ausdenken von Aufgaben (lange) nicht alles ist. Da gehört auch im aktuellen Stadium schon Administration zu.

Da niemand deine Anwendung vollumfänglich kennt und du den erwarteten Work Load auf die Server noch nicht mal Ansatzweise abschätzen kann kann dir IMHO hier im Forum (oder auch woanders bei gleichen Wissensstand) niemand sagen, was du vielleicht brauchst (oder was zu viel ist). Selbst für relativ einfache Abschätzungen "separater Datenbank- und Applikationsserver - ja / nein?" nicht. Mehr als allgemeine Tipps sind da fast nicht drin.

Gruß, noisefloor
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Ich habe jetzt die neueste Version in Github hochgeladen, will sich das jemand ansehen? Stelle ich das dazu einfach auf "public"?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Stelle ich das dazu einfach auf "public"?
Dann mach' das mal _schleunigst_ rückgängig - du hast die Nutzer-DB mit hochgeladen. Da stehen Namen und E-Mail Adressen im Klartext drin... Und nein, dass ist keine Vermutung - habe in die DB reingeschaut. Hatten wir das Thema DSGVO nicht eben erst?

Die Lösungen für die Aufgaben sind vermutlich auch einsehbar - aber das ist ziemlich egal im Vergleich zu den Nutzerdaten.

Du musst bei sowas echt bewusster handeln, Enthusiasmus für dein Projekt hin- oder her. Faktisch hast du gerade selber ein massives Datenleck deiner App kreiert und direkt noch öffentlich bekannt gemacht.

Gruß, noisefloor
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

OK, Danke für den Hinweis. In meinem gitignore steht die Datenbank drin, da muss ich mal sehen, warum das nicht funktioniert. Muss ich gitignore in github nochmals extra installieren?
Lösungen in dem Sinne gibt es in meinem Rechentrainer nicht. Das ist keine Datenbank mit Aufgaben und Lösungen wie bei anderen Anbietern, meine Aufgaben und auch deren Lösungen werden immer mit Zufallszahlen erzeugt.
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

der berühmte Spruch "Es gibt viele Wege nach Rom" passt auch bei der Programmierung. Ein Weg führt über Hügel, Steine, Schluchten, vorbei an wilden Tieren und dabei hat man nur einen Stock und kein Schweizer-Taschenmesser. Puuh, das kostet ganz schön Energie bis man am Ziel ist. Dahingegen ist der 1. Klasse-Flug ein gemütlicherer Weg.
Den ersten Weg kann man eigentlich jeder Zeit los gehen, den zweiten im Normalfall erst nach Bemühungen bis man das nötige Kleingeld hat.

Du bis programmtechnisch vermutlich den ersten Weg gegangen und musst jetzt diesen erörtern und diesen Schritt für Schritt umbauen, so das du ans gleiche Ziel kommst, aber gemütlicher. Anstatt Kleingeld musst du dir Programmierwissen und Erfahrung erarbeiten.

Ich hoffe ich konnte etwas nett umschreiben, was noisefloor gemeint hat. (Ich hoffe ich habe ihn richtig verstanden.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Dennis89: ein sehr schönes Sprachbild :-)

@Pitweazle: genau, die DB gehört nicht in die Verwaltung von Git. Die .gitignore auf dem Rechner, vom dem du ins Repo nach Github pushst, ist in erster Instanz relevant. Genau so hast du die __pycache__ Verzeichnisse drin - die gehören da auch nicht rein. Und das ist die Verzeichnisse static und staticfiles drin - eins davon braucht man normalerweise nur auf dem Server (=nicht in Github), wenn man `collectstatic` ausführt.

Da das mit der geleakten DB wichtiger war habe ich den restliche Code nur sehr kurz durchgeschaut. Was ich noch im Kopf habe:

* Ich habe die Struktur nicht verstanden (bzw. habe auch nicht in die urls.py reingeschaut. Wie viele Apps hast du in deinem Projekt? Weil es gibt ja zwei Verzeichnisse, core und eines für die Nutzer, was mich verwirrt hat.
* In der einen views.py waren ziemlich viele Hilfsfunktionen drin, die (wahrscheinlich) nicht an eine Route gebunden sind -> zur besseren Strukturierung in eine eigene Datei auslagern.
* Wie schon oft gesagt: nimm' _vernünftige_ Variablennamen, die _jeder_ versteht, der den Code liest. Das du alle Abkürzungen im Kopf hast ist nicht relevant.
* In den Modellen ist an ein paar Stellen `blank=True`, wo es gar nicht sein kann / darf. AFAIR bei einem Fremdschlüssel. Schlüssel können nie leer sein.
* Warum gibt es eine Tabelle für gelöschte Accounts? Inaktive oder gelöscht Accounts markiert man normalerweise für ein Flag in der Accountstabelle.
* Die hinterlegten Schulformen können nicht das SK1 System in Rheinland-Pfalz abbilden - da fehlt die Realschule+. Ich weiß ja, dass Hessen und Rheinland-Pfälzer in manchen Regionen nicht gut miteinander können - aber ich hoffe, das reflektiert nicht in deine App ;-)

Gruß, noisefloor
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Wenn das tatsächlich der Code ist, wie er deployed wurde, dann vielen Dank für die Zugangsdaten und den Secret-Key, der in der settings.py stehen.

Dann wird auch klar, warum ein austauschen der view.py zu einem Neustart führt: Da gibt es eine rt-dev@.service Datei, die den Development-Server startet. In einer produktiven Umgebung.

Auf dem Niveau bewegt sich auch der Code. Dennis' Ausführungen kann ich so bestätigen. Falls in der Zwischenzeit mehr Verständnis für das Schreiben von Code und das Benennen von Variablen vorhanden ist, würde ich sagen, es wird Zeit für die nächste Iteration. Also einmal alles weg und neu machen. Entweder komplett von Grund auf (würde ich empfehlen) oder Tests schreiben und dann Zeile für Zeile entkernen. Ich glaube letzteres kostet erheblich mehr Zeit als die erste Variante.
Die vielen Kommentare, die versuchen da komische Strukturen und magische Werte und Feldinhalte zu erklären sprechen da eine ziemlich eindeutige Sprache.

Zwar bewundere ich die Hartnäckigkeit mit der das Thema verfolgt wird - allerdings kommen wir immer wieder an den gleichen Problemen vorbei. Das Verständnis für Datensicherheit und -schutz fehlt komplett. Ich denke, ein Problem könnte hier das köcheln im eigenen Saft sein: Wenn man gar keine Impulse von außerhalb seiner eigenen Bubble bekommt, dann entwickelt man sich höchstens durch Anwenden weiter - und dafür muss man "aber es funktioniert doch!" hinter sich lassen.

Wenn du da irgendwer nach irgendwas gefragt wird (KUMI Ist ja auch so eine lustige Abkürzung, die nicht das bei mir auslöst, was wohl gemeint ist), kann ich nur hoffen, dass da in die Tiefenprüfung gegangen wird und man bemerkt, dass das handwerklich fragwürdig ist.

Aber Hartnäckigkeit kann auch beim Bessermachen helfen. Muss man nur wollen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

um das von @sparrow gesagt - mit dem ich komplett übereinstimme - nochmals zu vertiefen / ergänzen:

Wegwerfen + neu schreiben (=refractoring) ist _nichts_ schlimmes und nichts verwerfliches. Das ist eher normal, wenn man größere Applikationen schreibt. Und man sollte das auch nicht raus zögern. Weil: aktuell ist es bei deinem Projekt noch relativ problemlos möglich. Wenn du mal "richtig" produktiv läufst, also wenn z.B. X Schulen in Hessen da einsteigen, dann wird das um Längen schwieriger, weil du dich ggf. auch um Datenmigration der bestehenden Konten kümmern musst. Aktuell wäre das noch relativ easy.

Von mir persönlich (als Hobbyprogrammierer) kann ich sagen, dass meine Django-Skills mit jedem Projekt deutlich besser geworden sind. Was halt schon hilft ist, wenn man verschiedene Projekte macht und dabei lernt und halt alles gelernte beim nächsten Projekt anwendet. Wenn man das nicht hat ist das vielleicht ein bisschen schwieriger - geht aber auch. Muss man halt nur wollen und bereit dafür sein.

Und ja, dein Ansatz für ein "richtiges" produktives Deployment ist in der Tat ein bisschen blauäugig. Zumindest bei dem Ziel, das du hast. Man muss das auch nicht zwingend als Entwickler wissen - aber dann sollte man tunlichst einen Admin kennen, mit dem man zusammen arbeitet, dem man vertraut und der sich dann darum kümmert. Wenn deine App z.Zt. wirklich mit dem Dev-Server von Django läuft (habe die von sparrow genannte Datei auch gesehen, aber nicht rein geschaut), dann ist das zwar ein funktionierendes, aber halt auch falsches Deployment. Besonders dann, wenn die Django App auch noch im Debug-Modus läuft.

Gruß, noisefloor
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Hallo Leute, schön, dass ihr noch da seid. Ich könnte mir vorstellen, dass, wenn ich eure Kenntnisse hätte und immer wieder einem Ignoranten wie mir Hinweise geben würde, die dieser (scheinbar) nicht annehmen will oder nicht versteht – möglicherweise hätte ich dann doch mal aufgegeben und diese Posts nicht mehr beachtet.
Ich habe in verschiedenen Zusammenhängen darauf hingewiesen, dass ich oft mit diesen Hinweisen und Vorschlägen schlichtweg überfordert bin. Es ist für mich blöd, dass ich das immer wieder sagen muss, aber bitte akzeptiert das doch auch mal. Versucht, die Teile, die ich zum Laufen gebracht habe und die man so lassen kann, so zu lassen und mir für die, die man dringend ändern muss, so zu helfen, dass ich nicht überfordert bin.
@Dennis89 Dieses Bild von meinem Weg nach Rom ist sehr schön. Ich fürchte, ich werde nicht fliegen lernen und muss weiter auf Schusters Rappen weiterreisen und hoffen, dass mich hin und wieder jemand mitnimmt wenn ich den Daumen raushalte.
Also zunächst:
noisefloor hat geschrieben: Samstag 3. Februar 2024, 14:06 Wegwerfen + neu schreiben (=refractoring) ist _nichts_ schlimmes und nichts verwerfliches. Das ist eher normal, wenn man größere Applikationen schreibt.
… neu schreiben ist für mich nicht drin. Ich habe ebenfalls schon mal darauf hingewiesen, dass dieser Rechentrainer in anderer Form schon existiert und (für mich) fertig ist. (ich ergänze den Link dazu in meinem Profil). Mit meinem ersten Programm habe ich 2006 angefangen und in beide Projekte bisher schätzungsweise fast 15 000 Stunden Arbeit reingesteckt. Einige der Codeteile, die euch nicht so gefallen, habe ich von dieser ersten Version übernommen. Ich will erreichen, dass die Aufgaben in diesen beiden Versionen etwa deckungsgleich sind.
Auch wenn ich in der Lage wäre, meinen Code komplett neu zu schreiben würde, fürchte ich, nichts besseres rauskommen.
sparrow hat geschrieben: Samstag 3. Februar 2024, 10:18 Falls in der Zwischenzeit mehr Verständnis für das Schreiben von Code und das Benennen von Variablen vorhanden ist …
Ich fürchte: Ersteres nicht wirklich (siehe oben) und beim Zweiten habe ich zumindest nach euren Hinweisen viel geändert, ich wollte aber keine Änderungen, die rückwirkend auch Auswirkungen auf meine Datenbank haben.
noisefloor hat geschrieben: Samstag 3. Februar 2024, 14:06 Von mir persönlich (als Hobbyprogrammierer) kann ich sagen, dass meine Django-Skills mit jedem Projekt deutlich besser geworden sind. Was halt schon hilft ist, wenn man verschiedene Projekte macht und dabei lernt und halt alles gelernte beim nächsten Projekt anwendet.
Ich habe tatsächlich noch ein zweites Projekt im Kopf (und als Grundgerüst als Makro in einer Tabellenkalkulation (wie der „alte“ Rechentrainer) schon vorliegen). Die Konzeption dieses „Physiktrainers“ ist eine vollkommen andere. Aber ob ich vor meinem Ableben oder der verstärkten Demenz da noch hinkomme … Wenn ich das mittels Django realisiere, werde ich vielleicht auch dazugelernt haben.

Tja, und das ist zwischenzeitlich der Kernpunkt dieses Posts:
noisefloor hat geschrieben: Samstag 3. Februar 2024, 14:06 - aber dann sollte man tunlichst einen Admin kennen, mit dem man zusammen arbeitet, dem man vertraut und der sich dann darum kümmert.
… wie finde ich so jemanden – wenn nicht hier?
Ihr habt mir immer geduldig geholfen - gibt es auch jemanden, der bereit ist sich dies anzutun?

Zurück zu meinem verpatzen Auftritt in Github:
In Github ist ja wohl gespiegelt, was im Ordner meines VSCodes liegt. Muss ich in Github händisch die Inhalte wieder rausnehmen, die da nicht reingehören – gitignore macht das ja anscheinend nicht?
Ich zähle mal auf: die Datenbank, --pycache__ (von der ich natürlich auch nicht weiß was sie macht, die aber in meinem gitignore steht) und die doppelten static Ordner.
… lösche ich die ersten beiden jetzt händisch in github oder wie sorge ich dafür, dass die nicht beim nächsten Push wieder auftauchen?
So, noch ein paar Einzelheiten:
noisefloor hat geschrieben: Samstag 3. Februar 2024, 09:30 * In der einen views.py waren ziemlich viele Hilfsfunktionen drin, die (wahrscheinlich) nicht an eine Route gebunden sind -> zur besseren Strukturierung in eine eigene Datei auslagern.
Wie macht man das? Lege ich einfach einen Ordner „hilfsfunktionen.py“ an und importiere die Funktionen von da? (Ich hatte das vor einiger Zeit schon mal angefragt, da bekam ich (soweit ich mich erinnere) den Hinweis, da könne ich mich später drum kümmern, wenn mein Code umfangreicher geworden ist.
noisefloor hat geschrieben: Samstag 3. Februar 2024, 09:30 * Ich habe die Struktur nicht verstanden (bzw. habe auch nicht in die urls.py reingeschaut. Wie viele Apps hast du in deinem Projekt? Weil es gibt ja zwei Verzeichnisse, core und eines für die Nutzer, was mich verwirrt hat.
In diesem Zusammenhang sind auch die zwei Apps entstanden. Irgenwann wurde der Code in meinem views.py und url.py unübersichtlich, da habe ich teile ausgelagert. Die eine „core“ beinhaltet alles zur Erstellung der Aufgaben und die verschiedenen Darstellungen der Arbeit, die zweite „accounts“ beinhaltet die ganze Organisation inklusive der Optionen für Lehrkräfte.
noisefloor hat geschrieben: Samstag 3. Februar 2024, 09:30 * Warum gibt es eine Tabelle für gelöschte Accounts? Inaktive oder gelöscht Accounts markiert man normalerweise für ein Flag in der Accountstabelle.
Einige User vergessen ihre Anmeldenamen, Passworte und auch Emailadressen und haben bis zu 8 Accounts. Ich habe eine Funktion erstellt mittels der die Lehrkräfte diese Accounts zusammenlegen und auch löschen können. Da ich etwas unsicher war, was da passiert, habe ich dort protokolliert was gemacht wurde. Die Tabelle kann ich auch bei Gelegenheit wieder löschen.
noisefloor hat geschrieben: Samstag 3. Februar 2024, 09:30 * Die hinterlegten Schulformen können nicht das SK1 System in Rheinland-Pfalz abbilden - da fehlt die Realschule+.
Da irrst du – die ist drin - also die Realschule - gibt es etwa auch eine Realschule+? Allerdings entsteht in diesem Zusammenhang ein viel größeres Problem. Ich habe hinterlegt, in welchem Schuljahr und welcher Schulwoche welches Thema bearbeitet worden sein müsste. Dabei habe ich mich am Lehrplan meiner Schule, einer IGS (muss ich diese Abkürzung auch ausschreiben?) orientiert. Wenn ich das auf verschiedene Bundesländer, Schulformen oder auch individuell an einzelne Schulen anpassen muss, wird das schwierig.
noisefloor hat geschrieben: Samstag 3. Februar 2024, 09:30 * In den Modellen ist an ein paar Stellen `blank=True`, wo es gar nicht sein kann / darf. AFAIR bei einem Fremdschlüssel. Schlüssel können nie leer sein.
Wenigstens da habe ich tatsächlich mal was dazugelernt. Das ist entstanden, als ich mein Datenmodel immer mal wieder geändert habe und Fehlermeldungen bekommen habe, wenn da Eintragungen gefehlt haben. Das kann ich nochmal überarbeiten.
noisefloor hat geschrieben: Samstag 3. Februar 2024, 14:06 Und ja, dein Ansatz für ein "richtiges" produktives Deployment ist in der Tat ein bisschen blauäugig. ….
Wenn deine App z.Zt. wirklich mit dem Dev-Server von Django läuft, dann ist das zwar ein funktionierendes, aber halt auch falsches Deployment.
Auweh, das müsst ihr mir genauer erklären. Ist das die Datei rt-dev@.service. Die ist da drin seit @whitie mir das Grundgerüst zu diesem Projekt erstellt hat. Was muss ich da wie ändern?

Es wäre wunderbar, wenn ihr mich weiter coachen könntet und dabei meine eingeschränkten Fähigkeiten berücksichtigen würdet (ich hoffe, ihr werdet dabei beim Haareraufen nicht zuviele der selbigen verlieren). Ansonsten bliebe mir ja wohl nichts anderes übrig als mein Projekt aus dem Netz zu nehmen und meine Briefmarkensammlung im Keller zu suchen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Da irrst du – die ist drin - also die Realschule - gibt es etwa auch eine Realschule+?
In RLP gibt es keine Realschule und keine Hauptschule mehr. Keine Ahnung wie lange, aber zumindest seitdem ich schulpflichtige Kinder habe. Es gibt "nur" Realschule+, in der es dann nach der 6. Klasse einen Hauptschulzweig und eine Realschulzweig gibt. Die Schulform heißt aber nichts desto trotz Realschule+. Aber das ist, zugegebener Maßen, dass kleinste Problem vom Rechentrainer.
… wie finde ich so jemanden – wenn nicht hier?
Wieso hier? Hier ist ein Python Programmierforum, kein Admin-Forum. Klar gibt es hier Leute, die mehr oder weniger viel Ahnung haben, wie man ein Projekt grundsätzlich deplopyed. Was aber _nicht_ heißt, dass das ein Deploy ist, der auch für dein Projekt passt und skaliert. Du solltest jedenfalls _dringend_ ein Grundverständnis dafür aufbauen, was wie wo beim Deploy so prinzipiell passiert und wichtig ist. Im Moment ist das ja relativ offensichtlich für dich ein Blindflug - und das ist gefährlich.
… neu schreiben ist für mich nicht drin. Ich habe ebenfalls schon mal darauf hingewiesen, dass dieser Rechentrainer in anderer Form schon existiert und (für mich) fertig ist. ...
Es geht _nicht_ um die Aufgaben, sondern um das "wie". Also wie es in Django umgesetzt ist. Primär geht es um das Datenbankdesign, um die Strukturierung des Codes und wie wo was abgelegt ist. Da musst du ran. Sonst wird das IMHO nichts, was sinnvoll skaliert und Zukunft hat.
Lege ich einfach einen Ordner „hilfsfunktionen.py“ an und importiere die Funktionen von da?
Keinen Ordner, ein (oder mehrere) Dateien. Und die dann importieren.
Auch wenn ich in der Lage wäre, meinen Code komplett neu zu schreiben würde, fürchte ich, nichts besseres rauskommen.
Weil... du hast doch ziemlich sicher schon X Dinge hier aus dem Forum mitgenommen, inkl. Datenbankdesign. Wenn man davon keine Ahnung hat und es zum 1. Mal macht kommt da in der Regel nur was semi-sinnvolles bei raus. Ist halt so, bei vielen / allen. Deswegen kann man es beim nächsten Mal besser machen.
Ich glaube auch aber, dass du dir gedanklich in Teilen selber im Weg stehst, weil die von einer 1. Version (Desktop-App oder was auch immer) des Rechentrainers ausgeht. Webanwendungen folgen aber i.d.R. anderen Entwurfsmustern als Desktop-Apps. Und dabei geht es wie gesagt _nicht_ um den Inhalt der Aufgaben. Der hat damit nichts zu tun.

Zur Struktur:
Schwer zu sagen, ohne das alles zu sehen. Bei deinem Rechentrainer erscheint mir das aber aktuell nicht sinnvoll. Du hast _eine_ App und für die hast du die Benutzerverwaltung abgekoppelt? Warum? Zumal du ja auch (richtiger Weise) auf die Benutzerverwaltung von Django aufsetzt. Das würde sich IMHO eher anbieten, wenn du z.B. eine Chemie, eine Physik und eine Mathe App hast und die sich eine Benutzerverwaltung teilen.
Wie gesagt, dass muss nicht falsch oder schlecht sei, aber ich halte es im gegebenen Fall für ungewöhnlich.

BTW: warum heißt die App eigentlich "core" und nicht "rechentrainer"?

Gruß, noisefloor
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Pitwheazle hat geschrieben: Freitag 2. Februar 2024, 18:12 So war das nicht gemeint. Es ist mehr die Frage, wie beobachte ich das Verhalten des Programmes um Verbesserungen zu finden?
Wie schon gesagt, man beobachtet dazu nicht das Verhalten des Programmes.
Statt dessen beobachtet man den Aufbau des Codes.
Da gibt es so manches "Geschmäckle", das auf Bedarf für Refactoring hinweist.

Beim Beispiel "5 + ... + 5" merkt man so das Geschmäckle: "sehr viele Widerholungen identischer Anweisungen"
Ganz ähnliches gibt es nicht nur in der Mathematik, sondern auch in der Programmierung:

Code: Alles auswählen

print("Hallo")
print("Hallo")
print("Hallo")
print("Hallo")
print("Hallo")
Hier würde man sehen, dass sich (im extremen Beispiel sogar komplett identischer) Code sehr oft wiederholt.
Also könnten man zu einem passenden Refacoring greifen und vielleicht eine Schleife bauen, die nur 1x print benutzen muss.

In einem andern Fall ist Code vielleicht nur ähnlich aber nicht komplett identisch, aber trotzdem wiederholt sich viel.
Für eine Anpassung der Logik des Programms, müsste man an sehr vielen Stellen im Code identische Änderungen durchführen?
Dann würde man als Refactoring vielleicht eine neue Funktion bauen, die diese wiederholte Logik (ggf. parametrisiert) kapselt.
Die Wiederholungen ersetzt man dann jeweils durch einen Aufruf dieser Funktion mit den am jeweiligen Ort passenden Parametern.

Das nur als einfache Beispiele und Antwort auf die Frage, wie man denn vorgehen würde, um passende Stellen zum Refactoring zu finden.
An keiner Stelle wird im Ergebnis das eigentliche Verhalten des Programms verändert, sondern nur der dazu nötige interne Ablauf.

Zum weiteren Lesen fand ich diese Übersicht verschiedener Refactoring-Verfahren sehr übersichtlich: https://refactoring.guru
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Pitwheazle hat geschrieben: Samstag 3. Februar 2024, 19:27 @Dennis89 Dieses Bild von meinem Weg nach Rom ist sehr schön. Ich fürchte, ich werde nicht fliegen lernen und muss weiter auf Schusters Rappen weiterreisen und hoffen, dass mich hin und wieder jemand mitnimmt wenn ich den Daumen raushalte.
Ich habe das Bild nicht so verstanden, dass man auch noch Fliegen lernen soll, sondern das nötige Kleingeld in die Hand nehmen muss, um jemand anderen das Flugzeug fliegen zu lassen.
Wenn man das nicht will / kann, dann geht man eben selbst nach Rom. Das macht in einer Gruppe gleich auch mehr Spaß als allein, und man kann sich vielleicht gegenseitig helfen, usw.
Pitwheazle hat geschrieben: Samstag 3. Februar 2024, 19:27 Zurück zu meinem verpatzen Auftritt in Github:
In Github ist ja wohl gespiegelt, was im Ordner meines VSCodes liegt. Muss ich in Github händisch die Inhalte wieder rausnehmen, die da nicht reingehören – gitignore macht das ja anscheinend nicht?
Ich zähle mal auf: die Datenbank, --pycache__ (von der ich natürlich auch nicht weiß was sie macht, die aber in meinem gitignore steht) und die doppelten static Ordner.
… lösche ich die ersten beiden jetzt händisch in github oder wie sorge ich dafür, dass die nicht beim nächsten Push wieder auftauchen?
In Github ist gespiegelt, was in deinem Ordner liegt, in dem du auch den .git Unterordner hast.
.gitignore sorgt dafür, dass beim nächsten Push keine ignorierten Inhalte gespiegelt werden.
Falls schon kritische Inhalte gespiegelt worden sind, wird .gitignore sie aber nicht entfernen.
Das musst du erstmal selbst veranlassen, allerdings wird das allein auch nicht ausreichen.
Git hat nämlich auch eine History, und darüber könnte man immer noch die Inhalte sehen.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Kebap hat geschrieben: Montag 5. Februar 2024, 12:33 In einem andern Fall ist Code vielleicht nur ähnlich aber nicht komplett identisch, aber trotzdem wiederholt sich viel.
Für eine Anpassung der Logik des Programms, müsste man an sehr vielen Stellen im Code identische Änderungen durchführen?
Dann würde man als Refactoring vielleicht eine neue Funktion bauen, die diese wiederholte Logik (ggf. parametrisiert) kapselt.
Die Wiederholungen ersetzt man dann jeweils durch einen Aufruf dieser Funktion mit den am jeweiligen Ort passenden Parametern.
... das habe ich, glaube ich, schon beachtet.
Ich habe jetzt (hoffentlich) auch mein Github aufgeräumt und wieder veröffentlicht.
Als nächstes müsste ich mich dann wohl mal um meine Distribution kümmern. Habt ihr da einen Tipp für ein HowTo? Die Dokumentation von Django finde ich da wieder zu umfangreich - mehr wieder was für Dummies. In dem Tutorial, an dem ich mich orientiert habe, wurde das Projekt auf AWS veröffentlicht, da habe ich mich auch zunächst dran versucht, habe dann aber das "Kleingedruckte" und was passiert, wenn es nicht mehr kostenlos ist, nicht verstanden und mich dort wieder abgemeldet.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Nein, du hast bei Git nichts aufgeräumt.
Wie hier bereits erwähnt wurde, hat git eine History (es ist ja nicht umsonst eine _Versions_verwaltung).
Die Daten sind also nch wie vor in commit 2df671b enthalten.

Ich würde sagen: git lernen - danach ggf. darüber nachzudenken, irgendetwas zu veröffentlichen.

Und das meine ich keineswegs böse - aber durchaus ehrlich.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Danke! Aber jetzt sollte es klappen!
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Die Dokumentation von Django finde ich da wieder zu umfangreich - mehr wieder was für Dummies.
Ich kann dir detailliert zeigen, wie man in einem venv installiertes Django mittels gunicorn als WSGI-Applikationsserver und nginx als Reverse-Proxy unter Ubuntu zum Laufen bekommt. Das sollte dann auch quasi 1:1 auf Debian und alle an Debian / Ubuntu-basierte Systeme bzw. vermutlich auch alle andere Linux-Systeme, auf die man vollen Zugriff hat, funktionieren.

Nur: es gibt nicht "den" Deploy. Das ist am Ende eine Frage, wie viel das System leisten können muss etc.

Abgeshen davon halt ich Copy&Paste Howtos für öffentlich zugängliche Systeme für gefährlich - da sollte man schon einen leisen Plan davon haben, was passiert und warum es so passiert.
wurde das Projekt auf AWS veröffentlicht, da habe ich mich auch zunächst dran versucht, habe dann aber das "Kleingedruckte" und was passiert, wenn es nicht mehr kostenlos ist, nicht verstanden und mich dort wieder abgemeldet.
Ist vielleicht besser. AWS ist sehr mächtig, aber da ist es wohl schwierig, die Kosten vorher abzuschätzen, wenn man skalierende Instanzen nimmt. Bzw. generell Instanzen nimmt, die nach Rechen- / CPU-Zeit abgerechnet werden.

Gruß, noisefloor
Antworten