Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von BerndFfm
Thema: Insolvenz wegen Stromausfall
Am im Forum: Smalltalk


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

Thema: Textbox nur für Zahlen
Am im Forum: Grundlagen von C#

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

Thema: LED Matrix erstellen
Am im Forum: Rund um die Programmierung

Zitat von sambuca
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

Thema: ShowDialog soll nur letzte Form einfrieren
Am im Forum: GUI: Windows-Forms


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

Thema: ShowDialog soll nur letzte Form einfrieren
Am im Forum: GUI: Windows-Forms

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.

Thema: ShowDialog soll nur letzte Form einfrieren
Am im Forum: GUI: Windows-Forms


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

Thema: Mit C# Ausmaße des aktuellen Bildschirms ermitteln
Am im Forum: Grundlagen von C#


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

Thema: Ein Neuer - bei C#?!
Am im Forum: Smalltalk

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

Thema: Es blitzt/flackert bei this.Dispose()
Am im Forum: GUI: Windows-Forms


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

Thema: Schnelles Durchlaufen von Dateipfaden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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

Thema: Schnelles Durchlaufen von Dateipfaden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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

Thema: Schnelles Durchlaufen von Dateipfaden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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

Thema: Schnelles Durchlaufen von Dateipfaden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von Gimmick
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

Thema: Schnelles Durchlaufen von Dateipfaden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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

Thema: Schnelles Durchlaufen von Dateipfaden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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

Thema: Schnelles Durchlaufen von Dateipfaden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen


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

Thema: Schnelles Durchlaufen von Dateipfaden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen


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

Thema: Schnelles Durchlaufen von Dateipfaden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von Abt
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

Thema: Schnelles Durchlaufen von Dateipfaden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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

Thema: Wie Json mit Double Quotes statt Single Quotes serialisieren?
Am im Forum: Grundlagen von C#

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

Thema: VS2022 Preview .NET MAUI iOS Simulator
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)


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

Thema: Android Phone - Bilder kopieren
Am im Forum: Cross Platform Entwicklung - Mobile und IoT


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

Grüße Bernd

Thema: Radio Button als Gruppe abfragen
Am im Forum: Grundlagen von C#

Zitat von BerndFfm


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

Thema: Radio Button als Gruppe abfragen
Am im Forum: Grundlagen von C#


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

Thema: Eigenes Zertifikat für ASP.NET Core Anwendung
Am im Forum: Web-Technologien


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

Thema: Eigenes Zertifikat für ASP.NET Core Anwendung
Am im Forum: Web-Technologien

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

Thema: Eigenes Zertifikat für ASP.NET Core Anwendung
Am im Forum: Web-Technologien

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

Thema: Eigenes Zertifikat für ASP.NET Core Anwendung
Am im Forum: Web-Technologien


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

Thema: Vorstellung Projekt 'Finderwille Einsatz App'
Am im Forum: Smalltalk

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

Thema: Kontinuierliche Mysql Abfrage
Am im Forum: Datentechnologien


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

Grüße Bernd