Laden...

Forenbeiträge von BerndFfm Ingesamt 3.825 Beiträge

07.10.2022 - 09:31 Uhr

Bei 60 Mio. Bildern mit ca. 2-3 MB pro Bild, mal schlecht geschätzt, reden wir von 100+ GB.
Aber selbst das sollte keine Wochen dauern, eher Stunden bis ggf. mal 1 Tag wäre vorstellbar.

Auf eine SSD im gleichen Rechner hat es 2 Wochen gedauert, auf die SSD eines anderen Rechners 4 Wochen. Bei 500 GB Daten.
Platten und Netzwerk sind in Ordnung.

Bei vielen kleinen Dateien ist es eben sehr uneffektiv.

Ich habe auch andere Dateisysteme ausprobiert, die haben bei 20 Millionen Dateien aufgehört. Es ging nur mit NTFS.

Grüße Bernd

06.10.2022 - 16:40 Uhr

Das Kopieren von Dateien ist immer langsam.

Ich habe Offline Landkarten erstellt und wenn ich die einzelnen Kacheln auf eine neue Platte kopieren muss dauert das Wochen (60 Millionen Dateien).

Kommandozeilentools waren nicht schneller.

Grüße Bernd

23.09.2022 - 16:31 Uhr

Bei meinen Kunden die Totalausfall des Servers oder des Netzwerks hatten lief nach wenigen Stunden ein neuer Rechner mit Backup Datenbank, die Tages- oder Stundenaktuell war.

Grund war Ausfall des Servers, Brand im Serverraum oder Ransomware-Angriff.

Durch Stromausfall ist noch nie ein System kaputtgegangen. Muss wohl sehr alte Hardware gewesen sein.

Grüße Bernd

16.09.2022 - 15:59 Uhr

Meine Routine um in einer Textbox nur Zahlen zuzulassen und "+" und "-" :


private void TextBoxMaxLED_KeyPress(object sender, KeyPressEventArgs e)
{
	str = "1234567890";
	if (TextBoxMaxLED.SelectionStart == 0) && !TextBoxMaxLED.Text.Contains("+") && !TextBoxMaxLED.Text.Contains("-")) str += "+-";
	bool controlkey = (e.KeyChar == 1 || e.KeyChar == 3 || e.KeyChar == 8 || e.KeyChar == 22 || e.KeyChar == 24 || e.KeyChar == 27);    // Back, Escape, Strg+A, Strg+C ...
	if ((!str.Contains(e.KeyChar.ToString())) && !controlkey) e.Handled = true;
}

Grüße Bernd

26.08.2022 - 12:45 Uhr

Das ganze soll via USB erfolgen, somit wie du bereits schon geschrieben hast mit einem externen Mikrokontroller mit serieller Schnittstelle.

Es gibt Umsetzer USB Seriell. Die kann man ganz normal mit den Befehlen für serielle Ports in C# ansteuern.

Hab ich schon gemacht.

Grüße Bernd

15.08.2022 - 18:14 Uhr

Es reicht das gesamte Window auf "Enabled = false" zu setzen : this.Enabled = false.

Ich setze noch einige Parameter mehr und das muss dann teilweise pro Typ gemacht werden. Bei GroupBox und Panels wird dann rekursiv aufgerufen.

Grüße Bernd

15.08.2022 - 16:56 Uhr

Wenn Du den modalen Dialog nachprogrammieren willst kannst Du auch das aufrufende Form auf "Enabled = false" setzen.


this.Enabled = false;

Grüße Bernd

PS.: Vielleicht sollte ich meine wenigen modalen Dialoge die ich noch benutze in nicht modal programmieren und die Modalität selber programmieren. Dann entfällt das lästige Einfrieren aller offenen Dialoge.

PPS.: Hab's gerade probiert, klappt echt gut ! Werde jetzt meine modalen Dialoge umprogrammieren und selber bauen.

15.08.2022 - 09:23 Uhr

Es gibt modale und nicht modale Dialoge.

Letztere ist das was Du willst. Sie werden mit .Show() aufgerufen.

Ist allerdings wie Du schon gemerkt hast mehr Arbeit.

Fehler in WinForms (oder Feature?) : Wenn man mehrere nicht modale Dialoge öffnet kann man ja in allen Dialogen arbeiten. Wenn man nun aus einem dieser Dialoge einen modalen Dialog öffnet sind alle geöffneten Dialoge eingefroren, nicht nur der der den modalen Dialog geöffnet hat. Sehr nervig !

Grüße Bernd

17.07.2022 - 17:19 Uhr

Für den Anfang ist es einfacher ein Winforms oder WPF Projekt anzulegen, da hat man die gewünschten Funktionen sofort zur Verfügung.

Grüße Bernd

15.07.2022 - 11:49 Uhr

Hallo Hans,

ich habe auch mit BASIC angefangen, mein erster Rechner steht noch hier, ein Challenger 1P von Ohio Scientific.

C# hat eine große Zukunft !

Ein großer Vorteil ist dass man für alle Plattformen Programme schreiben kann, ich nutze C# für Web, PC, Android, iOS und mac.

Das Visual Studio benutze ich auch für Arduino Programmierung.

Grüße Bernd

06.07.2022 - 14:20 Uhr

Wenn man das .Dispose() weglässt bleiben Fragmente vom WinForms im Speicher und irgendwann ist der Speicher dann voll.

Ist bei meinen Kunden mehrfach passiert nach mehreren Tausend Fenstern öffnen und schließen. ich weiß aber nicht was die Kunden gemacht haben.

Grüße Bernd

06.06.2022 - 11:51 Uhr

Directory.EnumerateFiles() um eine Hash Tabelle zu füllen ist wohl die beste Lösung !

Sehr Speicherplatz sparend und schnell.

Zwischenstand :

Topographische Karte : 2.080.881 Dateien

Zweisprachige Open Street Map Karte : 17.032.875 Dateien

Open Street Map Karte : 32.806.336 Dateien

Insgesamt 450 GB.

T-Virus : Das ist jetzt so schnell dass ich es nicht auf mehrere Kerne verteilen muss. Ich habe ja noch mehr Aufgaben wie ich anderen Kerne beschäftigen kann : Karten Download, Karten Statistik aus dem Hash erstellen, Karten Datei berechnen.

Grüße Bernd

02.06.2022 - 11:48 Uhr

Test mit string[] :

Zeit : 42 Sekunden
Hauptspeicher : 228 MB

Test mit HashSet<> :

Zeit : 9 Sekunden
Hauptspeicher : 208 MB

Wenn ich ganz Deutschland rechne :

File.Exists() : Zeit 9 Stunden 23 Minuten 19 Sekunden

HashSet<> : Zeit 35 Sekunden

Genial !!!

Grüße Bernd

02.06.2022 - 10:25 Uhr

Gute Idee !

.Contains in einer List<> hatte ich schon probiert, das war 6 Mal langsamer als File.Exists(). HashSet() werde ich testen.

Dazu kommt dass ich das Übertragen von files[] nach Hash<> ja in mehrere Schritte aufteilen kann da es mehrere Verzeichnisse sind, um einen Speicherüberlauf zu verhindern.

Grüße Bernd

02.06.2022 - 09:12 Uhr

Wenn das fortlaufend und eindeutig nummeriert ist und es "nur" darum geht festzustellen, was fehlt, hilft es dann nicht eventuell, erst mal zu schauen, ob etwas fehlt und wenn ja in welchem Bereich? Dann könnte man sich Contains() sparen und die Anzahl der Abfragen möglichweise deutlich reduzieren.

Eine einfache Umstellung hat viel gebracht : Anstatt Contains() schaue ich jetzt nach den Lücken. Beide Reihen, die ich vergleiche, sind ja sortiert :


for (int tx = point1.X - 1; tx < point2.X + 2; tx++)
	for (int ty = point2.Y - 1; ty < point1.Y + 2; ty++)
	{
		string file = verz + zoom.ToString() + "\\" + tx.ToString() + "\\" + ty.ToString() + ".png";
		while (files[index].ToLower().IsLess(file)) index++;
		if (files[index].ToLower() == file) tiles++;
	}

Die Geschwindigkeit nur für Hessen hat sich von 1:30 Stunden auf 26 Sekunden verbessert !!!

Ohne das Laden von files[]. Das reicht ja einmal am Anfang um dann mehrere Karten zu rechnen. Jetzt kommt ich an die Speichergrenzen. Wie kann ich den nutzbaren Speicher für string[] vergrößern ? Oder Pfadnamen verkürzen ?

Manchmal muss man beim Programmieren halt den Kopf einschalten.

Grüße Bernd

31.05.2022 - 14:36 Uhr

Eine Erklärung : Eine Offline Karte im mbtiles-Fomat, wie es von den meisten Kartenprogrammen benutzt wird, ist nur eine SQLite-Datenbank.

Sie enthält eine Tabelle mit Zoomlevel, x- und y-Koordinate jeweils mit einer Graphik als BLOB gespeichert.

Eine mbtiles Datei kann man sogar mit dem DB-Browser öffnen und die Graphiken anzeigen lassen.

Egal ob Online oder Offline, das Kartenprogramm sagt welche Kachel es braucht mit Angabe von Zoomlevel, X- und Y-Koordinate. Die angezeigte Karte wird dann aus mehreren Kacheln dargestellt.

So einfach ist das.

Noch eine Frage zum Kopieren der Dateien : Da es über das Netz zu langsam ist möchte ich gerne von lokaler Platte auf andere lokale Platte kopieren.

Welches Format soll ich für die Festplatte im Raspberry Pi nehmen ? Ext4, exFAT oder NTFS ? Oder ist das egal ?
Die Festplatte enthält nur die Kartendaten und kann auch readonly gemounted werden.

Grüße Bernd

30.05.2022 - 20:36 Uhr

T-Virus : Ein Mapnik Server ist natürlich eine tolle Sache. Er kann die Bilder auch nach Bedarf rendern, also erst erzeugen wenn sie abgefragt werden.

Die Ursprungsdaten von Open Street Map liegen als Vektordaten vor, ca. 2 TB für die ganze Erde. Wenn man daraus Bilder erzeugt ist das schnell Mal 100 oder 1000 Mal soviel Speicherplatz je nach Zoomfaktor, also wie genau man reinzoomen kann.

Für einen Server der auch schnell Rendern kann sind extrem hohe Anforderungen an die Hardware vorhanden. Ob ich das in einen kleinen mobilen Server packen kann der in einem Auto läuft weiß ich nicht. Dazu kommt dass ein Einsatz an vielen Stellen gleichzeitig sein kann, es geht nicht nur um einen Standort.
Die Bilder vorher zu berechnen ist auf jeden Fall einfacher, Speicherplatz ist ja kein Problem mehr (1 - 4 TB für die Deutschlandkarte).

Für Offline Karten die man aufs Handy oder aufs Tablet laden kann muss ich eh rendern. Die Bibliothek die ich benutze (Mapsui für Xamarin.Forms und WPF) kann aus Geschwindigkeitsgründen nur Raster-Karten anzeigen.

Gimmick : Ich frage die Dateien ab um zu sehen welche fehlen. Da die Dateien in der Regel in der nummerischen Reihenfolge berechnet bzw. geladen werden frage ich jetzt nur die erste und letzte Datei in einem Verzeichnis ab, so wird es sehr schnell.

Kopieren habe ich gerade nochmal getestet : xcopy ist schneller als robocopy. Kopieren über das Netzwerk aufs NAS ist ca. 3 Mal langsamer als von lokaler Platte auf eine andere lokale Platte. Damit kann ich leben.

Unten die Hardware für den Kartenserver.

Grüße Bernd

29.05.2022 - 23:00 Uhr

Ich möchte die Karten ja in Gebieten nutzen in denen es kein Internet gibt. Da muss ich die Daten Offline speichern.

Für kleinere Gebiete oder für kleine Auflösungen geht das, aber für Europa bis Zoomlevel 20 sieht das anders aus.

Grüße Bernd

29.05.2022 - 21:02 Uhr

Habe gerade ein paar Test gemacht : File.Exist() und QuickIO.FileExist sind ähnlich schnell. Einlesen in string[] oder List<string> und dann Contains() ist 6 Mal langsamer.
Einlesen in ein Dictionary und dann ContainsKey() ist genauso schnell wie File.Exists.
Bei über 20 Millionen Einträgen reicht der Hauptspeicher aber nicht mehr.

teebeast: Die Dateien sind schon in Verzeichnissen organsiert. Eine Kachel (Bilddatei) für eine Karte hat 3 Werte : x, y und z, wobei z der Zoomlevel ist. Zoomlevel 0 ist die ganze Erde, Zoomlevel 21 ein Haus.
Die Datei findet man so : e:\osm{z}{x}{y}.png

Im Internet werden die Dateien genauso aufgerufen : https://finderwille.xddns.de:8086/osm/16/34207/22076.png

Im Explorer ist das alles schnell.

Das Kopieren der Dateien auf eine neue Platte im NAS dauert geschätzt 4 - 8 Wochen. Da muss ich mir noch was einfallen lassen.

Abt : Ich würde ja optimierte Systeme verwenden, aber ich weiß noch nicht woher ich die Dateien schneller bekommen kann, der Download oder das Rendern aus Vectordaten dauert Wochen oder Monate mit einem Rechner. Dazu weiß ich auch nicht wer mir performant Offline Karten erzeugen kann, das sind einfache SQLite Datenbanken.

Grüße Bernd

28.05.2022 - 01:40 Uhr

QuickIO pflege ich aber nicht mehr (zumindest derzeit).

Ich benutze es aber noch !

Ich werde das mal testen.

Hintergrund : Für meine Android und iOS App möchte ich Offline Karten erstellen. Die bestehen aus sehr viele kleinen Kacheln (Bildern). Die muss man errechnen oder fertig gerechnete runterladen. Beides dauert mehrere Tage bis Wochen oder Monate.

Zusätzlich möchte ich einen Webserver bauen, der alle Kartendaten allen Einsatzkräften in einem Einsatz zur Verfügung stellt. Wenn es kein Internet gibt. Im Ahrtal gab es 10 Tage kein Mobilfunk und kein Internet. Da musste man auf gedruckte Karten zurückgreifen. Der geplante Webserver ist praktisch ein lokaler Open Street Map Server. Bisher habe ich schon die Länder Deutschland, Österreich, Schweiz, Italien, Frankreich. Dazu topographische Karten von Deutschland. Dazu zweisprachige Karten von Tschechien, Slowakei, Polen, Ungarn, Rumänien, Ukraine und Belarus. Die Hardware gibt ein Rapsberry Pi 4B mit mehreren SSD. Nginx als Webserver mit Lastausgleich. Ich bin gespannt ob das alles klappt.

Diese Karten habe ich schon, die liegen auf einer SSD : https://finderwille.xddns.de:8086/

Grüße Bernd

26.05.2022 - 23:21 Uhr

Das gleiche problem habe ich auch gerade :

22 Millionen Dateien auf einer SSD. dateiname ist forlaufend nummeriert. Einige Dateien fehlen.

Alle durchgehen und mit File.Exists() abfragen dauert mehr als 20 Stunden.

Als Array einlesen mit GetFiles() dauert nur 10 Minuten und passt gut in den Hauptspeicher.

Ich werde mal ein dictionary anlegen und testen.

Grüße Bernd

03.05.2022 - 22:13 Uhr

NewtonSoft.Json braucht "

Was passiert wenn Du vorher


json = json.Replace("'", "\"");

ausführst ?

Irgendwo wurde " nach ' konvertiert, da können sich Fehler einschleichen wenn ' in einem Namen vorkommt.

Grüße Bernd

02.05.2022 - 20:46 Uhr

Im VS 2019 läuft der iOS Emulator nicht wenn man einen M1 Mac hat. Es kommt nur ein schwarzes Fenster.

Ich hatte gehofft dass es im VS 2022 besser ist.

Grüße Bernd

02.05.2022 - 11:22 Uhr

Mit adb.exe (Android Debug Bridge) kann man auch Dateien vom Android Handy auf den PC kopieren.

Grüße Bernd

12.04.2022 - 09:39 Uhr
  
string mission = "";  
if (radioButton1.Checked)  mission = "Einsatz";  
if (radioButton2.Checked)  mission = "Pause";  
  

Mein Beispielcode kann in einem gemeinsamen Eventhandler stehen oder in einer Routine die die Auswahl verarbeitet, z.B. eine Save-Routine.

Es ist auf jeden Fall sinnvoll den Code robust zu gestalten wie schon oben geschrieben wurde.

So wie ich bei einem alten Röhrenradio alle Tasten gleichzeitig runterdrücken kann (wer hat das als Kind nicht probiert wer in meinem Alter ist) kann man auch nicht ausschließen dass kein Radiobutton aktiv ist oder mehrere (Falsche Groupbox etc.)

Grüße Bernd

31.03.2022 - 10:55 Uhr

Wenn die Radiobuttons einen Namen haben kannst Du sie direkt abfragen :


string mission = "";
if (radioButton1.Checked)  mission = "Einsatz";
if (radioButton2.Checked)  mission = "Pause";

oder


string mission = "";
if (radioButton1.IsChecked)  mission = "Einsatz";
if (radioButton2.IsChecked)  mission = "Pause";

Grüße Bernd

18.03.2022 - 20:09 Uhr

Der GPS Server selber kann kein SSL, deshalb muss man einen Reverse Proxy einsetzen.

Die Anleitung für Nutzung des IIS hat leider nicht funktioniert.

Für einen Reverse Proxy mit Dot.NET Core gibt es gute Vorlagen, die liefen auch sofort, auch mit SSL. Leider haben die keine Sockets dorchgelassen.

Hab nginx installiert und SSL lief sofort.

Xamarin Forms erkennt das letsencrypt Zertifikat nicht, ein bekannter Fehler. Es gibt aber einen Workaround dazu.

Grüße Bernd

16.03.2022 - 23:58 Uhr

Wen es interessiert :

Ich habe mir das Zertifikat kostenlos bei zerossl.com geholt. Die greifen auf Letsencrypt zurück. Dort kann man angeblich keinen eigenen Server anmelden, hat aber doch funktioniert.
Sogar mit DynDNS (AceDNS) Adresse, also ohne feste IP.

Das Zertifikat gilt allerdings nur 3 Monate, dann muss es erneuert werden.

Als Verifizierung habe ich das File-Verfahren ausgewählt, man muss eine Datei auf dem Server anlegen.

Meine Seite : Finderwille Einsatz Server - Einsatzkraft anlegen

Grüße Bernd

16.03.2022 - 11:34 Uhr

Danke ! Klappt jetzt !

Eintrag in der appsettings.json :


{
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://212.223.10.24:5000"
      },
      "Https": {
        "Url": "https://212.223.10.24:5001",
        "Certificate": {
          "Path": "...\\finderwille.xddns.de\\certificate.pfx",
          "Password": "rumpelstilzchen"
        }
      }
    }
  }
}

Grüße Bernd

15.03.2022 - 23:52 Uhr

Hallo,

für meine ASP.NET Core Anwendung (5.0) habe ich mir ein Zertifikat erstellt.

Kann ich das in VS 2019 benutzen ? Auch für Debug ?

Ich kompiliere in eine Exe, ohne IIS.

Muss man dazu IIS verwenden ?

Grüße Bernd

10.03.2022 - 12:10 Uhr

Es gibt weitere Fortschritte :

Viele Einsatzkräfte (Rettungshundestaffeln, Quad-Staffel, Polizei) haben die App testweise im Einsatz und nutzen sie im Training und im Einsatz.

Die Zuverlässigkeit ist sehr gut geworden. 100% für den Betrieb im Hintergrund wird es wohl nie geben. Nicht mehr bei den ganzen Energiesparoptionen.

Die App läuft auch sehr gut in Gebieten mit schlechter Mobilfunkabdeckung über 2G und wird von einigen Einsatzkräften und Helfern in Polen und in der Ukraine benutzt.

Das Deployment dauert nur noch wenige Minuten. Wenn ich die Versionsnummer nicht ändere sondern nur die Buildnummer ist die App sogar immer sofort im App Store verfügbar.

Für die Erfassung der Einsatzkräfte habe ich eine Erfassungsmaske in ASP.NET Core mit Razor erstellt.

Das gefällt mir gut : Zahlreiche Möglichkeiten der Veröffentlichung, man kann Design und Funktionen gut trennen. Ich erstelle eine Exe-Datei die als Dienst auf dem gleichen Rechner läuft wie die GPS Server Software (Windows 10 Rechner).

Hier kann man es sehen (noch ohne SSL) : http://finderwille.xddns.de:5000/

Grüße Bernd

02.03.2022 - 13:21 Uhr

Mit Sockets kann man auch Echtdaten über http übertragen.

Grüße Bernd

18.02.2022 - 17:56 Uhr

Ich denke es ist ein Fehler in der Dateien Generierung. Denn einen Sinn sehe ich da nicht.

Ich muss jetzt basteln. Wenn der Fehler behoben wird wäre das aber kein Problem für den Workaround.

Aber so klappt das !


json = json.Replace("[[[", "[[[[").Replace("[[[[[", "[[[[").Replace("]]]", "]]]]").Replace("]]]]]", "]]]]").Replace("]]]],[[[[", "]]],[[[");
GeoJsonAreas areas = JsonConvert.DeserializeObject<GeoJsonAreas>(json);
foreach (GeoJsonFeature area in areas.features) ...

Danke für die Antworten,

Grüße Bernd

18.02.2022 - 16:44 Uhr

Hallo Abt,

das habe ich befürchtet. Trotzdem danke für die Info.

Herausgeber der Datei ist IF-Core IT Services GmbH (OpenDataLab), eine kleine Softwarefirma in 74254 Offenau. Warum die das so machen erschließt sich mir nicht, denn es wäre an dieser Stelle überhaupt nicht nötig. Man könnte die Liste immer vierfach verschachteln. Wenn die Gemeinde nur einen Polygon enthält reicht es ja in der einen Liste nur ein Element anzulegen.

Vielleicht ist das keine Absicht sondern ein Fehler im Programm ?

Dann ändere ich lieber direkt in der Json-Datei. Ich muss ja nur "coordinates":[[[ in "coordinates":[[[[ ändern. Und "]]]" in "]]]]".

Grüße Bernd

PS.: Ich zeichne die Landkreise in eine Landkarte ein, das klappt echt gut ! Und man lernt noch was in Geografie ! Die nächste Aufgabe ist es festzustellen ob ich mich im Landkreis befinde oder nicht (Point in Polygon).

18.02.2022 - 16:03 Uhr

Hallo,

ich habe eine Json-Datei die je nach Element verschiedene Typen enthält. Wie kann ich eine Json-Datei mal in eine Klasse mal in eine andere Klasse mappen ?

Ich arbeite mit Newtonsoft.

Quelle der Json-Datei : http://download.seven-c.de/files/finderwille-frankfurt/einsatz-app/geojson/Hessen_Landkreise.geojson

Die Datei kommt hierher : http://opendatalab.de/projects/geojson-utilities/

Wenn ich mit Json-Util eine Klasse erzeuge kommt mal das eine mal das andere raus.

Der Unterschied liegt in der Klasse GeoJsonGeometry1/2, da sind die Koordinaten einmal eine dreifach verschachtelte Liste, einmal vierfach.
Liegt wohl daran dass es Landkreisgrenzen gibt die aus einem Polygon bestehen und die Bergstraße besteht z.B. aus 3 Plygonen.

Ich würde gerne in Klassen mappen ohne in den Json-Dateien rumzufuddeln.

Grüße Bernd


// Landkreise außer Bergstraße

	public class GeoJsonProperties1
	{
		public string name { get; set; }
	}

	public class GeoJsonCrs1
	{
		public string type { get; set; }
		public GeoJsonProperties1 properties { get; set; }
	}

	public class GeoJsonGeometry1
	{
		public string type { get; set; }
		public IList<IList<IList<double>>> coordinates { get; set; }
	}

	public class GeoJsonFeature1
	{
		public string type { get; set; }
		public GeoJsonProperties1 properties { get; set; }
		public GeoJsonGeometry1 geometry { get; set; }
	}

	public class GeoJson1
	{
		public string type { get; set; }
		public GeoJsonCrs1 crs { get; set; }
		public string source { get; set; }
		public IList<GeoJsonFeature1> features { get; set; }
	}

	// Bergstraße

	public class GeoJsonProperties2
	{
		public string name { get; set; }
	}

	public class GeoJsonCrs2
	{
		public string type { get; set; }
		public GeoJsonProperties2 properties { get; set; }
	}

	public class GeoJsonGeometry2
	{
		public string type { get; set; }
		public IList<IList<IList<IList<double>>>> coordinates { get; set; }
	}

	public class GeoJsonFeature2
	{
		public string type { get; set; }
		public GeoJsonProperties2 properties { get; set; }
		public GeoJsonGeometry2 geometry { get; set; }
	}

	public class GeoJson2
	{
		public string type { get; set; }
		public GeoJsonCrs2 crs { get; set; }
		public string source { get; set; }
		public IList<GeoJsonFeature2> features { get; set; }
	}

08.02.2022 - 21:46 Uhr

Ich habe im Jahr 2003 bei einer neuen Firma angefangen die Microsoft Produkte eingesetzt hat. Vorher hatte ich mit dem Datenbanksystem CONZEPT 16 gearbeitet, das eine Pascal ähnliche Programmiersprache hatte.

Damals habe ich mit Visual Studio 2003 angefangen und das hat mit gleich gut gefallen. Viele Sachen gab es damals nicht und die mussten wir nachprogrammieren :

Formulargenerator
Virtuelles Listview
ORM
Update System

Einige Sachen von damals nutze ich heute noch.

Grüße Bernd

02.02.2022 - 22:57 Uhr

Hat sich jemand auch das schon mal angeschaut:

>

Das sieht ja interessant aus ! Muss ich mir mal anschauen !

Grüße Bernd

26.01.2022 - 22:41 Uhr

Zwischen VB und C# gibt es da keinen Unterschied.

Es reicht die Exe und die DLL's die Du benutzt weiter zu geben.

Wie Abt schon gesagt hat ist es besser eine Release-Version zu erstellen und diese weiterzugeben.

Grüße Bernd

26.01.2022 - 09:59 Uhr

Spaltennamen automatisch nach Parametern anzulegen finde ich gefährlich.

Es gibt zum einen Sonderzeichen die einem das Leben schwer machen können und auch reservierte Wörter.

Ich würde auch ein Mapping durchführen dass die Parameter Namen auf gültige Spaltennamen mappt.

Grüße Bernd

10.01.2022 - 13:28 Uhr

Hallo gfoidl,

Du überprüfst den Gewinner mit Pattern.

Ich habe das immer in Schleifen gemacht :


for (int x = 0; x < 3; x++)                  // Spalten
    for (int y = 0; y < 3; y++)              // Zeile
        for (int dir = 0; dir < 3; dir++)    // Richtung
        {
            bool gewinn = true;
            for (int anz = 0; anz < 3; anz++)     // Anzahl Steine
                if (Field(x + anz * Step(dir), y + anz * Step(dir) != "X")
                    gewinn = false;
        }

Ohne Gewähr !

Ich habe immer mit eindimensionalen Arrays gearbeitet : int[] board = new int[9];

Oder int[] board = new int[25]; wenn man das Spielfeld größer macht und einen Rahmen außen rum mit -1 für nicht betretbar belegt.
So vermeidet einen Überlauf wenn das Feld so aussieht :


- - X
X X O
O O -

Wenn man dann das Spielfeld auf 19 x 19 erweitert und die Anzahl Steine für Gewinn auf 5 hätte man schon Gobang programmiert.

Mit Minimax-Strategie hab ich auch immer gearbeitet, geht bei Gobang auch gut !

Grüße Bernd

09.01.2022 - 21:00 Uhr

Das reicht nicht. Es könnte auch in der oberen Zeile ein Dreier sein.

Grüße Bernd

09.01.2022 - 20:13 Uhr

Zwei-Personen-Nullsummenspiele hab ich früher viele programmiert : Gobang, Go, Mühle. Noch in BASIC und 8 KB RAM.

Um einen Gewinn festzustellen gehe alle Zeilen und Spalten durch und schau ob sie gleiche Steine haben.
Dann noch die zwei Diagonalen.


for (int i = 0; i < 3; i++)

Grüße Bernd

27.12.2021 - 12:50 Uhr

Bei Datumsfeldern auch in datetime casten und dann vergleichen.

Ich würde kein TryParse benutzen. sondern in einer eigenen Tabelle oder in der Tag-Eigenschaft der Spalte den Datentyp hinterlegen.
Es können ja auch Zahlen in string Spalten stehen : Artikelnummer, Hausnummer, Postleitzahl etc.
auch funktioniert deine Routine nicht wenn in einer Zelle eine Zahl steht und in der zweiten nicht.

Obwohl listview schon sehr veraltet ist nutze ich das fleißig und klappt immer gut.

Man kann sogar ein listview so bauen dass es virtuell lädt, also bei 1 Mio. Datensätzen schon nach 1 Sekunde ein Ergebnis anzeigt (Lazy Load).

Grüße Bernd

22.12.2021 - 09:10 Uhr

So ist es ein Musterbeispiel für
>

Hab ich mir gedacht dass das gleich auffällt.

Das habe ich ungefähr im Jahr 2004 geschrieben, da gab es den guten Artikel noch nicht.

In der Extension 'ToSqlString()' habe ich zwar versucht alles rauszufiltern was zu Fehlern oder Missbrauch führen kann, hat aber nicht immer funktioniert.

Das eigene ORM arbeitet natürlich mit Parametern.

Grüße Bernd

21.12.2021 - 11:58 Uhr

Das wollte ich auch schreiben.

Ich schreibe keinen SQL Code mehr, sondern lasse das vom ORM machen. So ist alles aufgeräumt, typsicher und selbstdokumentierend.

Weiterentwicklung und Fehlersuche ist auch viel einfacher.



Alt : if (such_ar_bez1 != "") sqlstr += "ar_bez1 LIKE '" + such_ar_bez1.ToSqlString() + "' AND ";

Neu : if (such_ar_bez1 != "") qry = qry.ar_bez1().IsLike(such_ar_bez1).And();


Das ist jetzt ein eigenes ORM, jetzt würde ich aber Dapper oder EF benutzen.

Grüße Bernd

02.12.2021 - 10:29 Uhr

Das ist der Nachteil wenn man externe Bibliotheken verwendet.

Da macht man folgendes :

  • Den Autor der Bibliothek informieren
  • Schauen ob es ein Update der Bibliothek gibt
  • Schauen ob jemand anders den Fehler auch hat
  • Einen Workaround suchen
  • Versuchen den Fehler einzugrenzen
  • Letzte Möglichkeit : Andere Bibliothek suchen oder selber programmieren

Grüße Bernd

02.12.2021 - 10:14 Uhr

Stackoverflow (und auch MemoryOverflow) kann man nicht abfangen.

Da der Stack recht groß ist kommt der Stackoverflow meistens durch unendliche Rekursion zustande.

Prüf das mal.

Man kann aber Stackgröße und Speicherverbrauch prüfen und eine Meldung bringen "Programm bitte neu starten" wenn die Werte zu groß sind. So stürzt die Anwendung nicht ab und dem Anwender gehen keine Daten verloren.

Ich habe das mal so gemacht bis ich ein Memory Leak in der Winforms Anwendung entdeckt habe.

Grüße Bernd

01.12.2021 - 11:27 Uhr

Bei Windows 10 kommt eine Meldung wenn man eine .NET Applikation mit .NET Framework 2.0 oder 3.5 installieren will.

Man kann dann das Framework Online installieren, es werden ca. 400 MB geladen.

Offline Installation geht auch wenn man kein Internet hat.

Bei früheren Windows Versionen kommt nur eine Meldung dass das Framework erforderlich ist und nicht installiert ist.

Grüße Bernd

01.12.2021 - 10:15 Uhr

Es kommt eine Meldung dass das Framework nicht installiert ist und eine Abfrage ob es installiert werden soll.

Schlecht ist nur wenn man kein Internet hat.

Grüße Bernd

30.11.2021 - 08:58 Uhr

Ich erstelle die Mailvorlagen mit einem HTML Editor.

Da gibt es viele Fertige.

Grüße Bernd