Selber einen Parser bauen, dazu brauchst Du Split(), SubString() und Double.Parse().
Oder Regex benutzen.
Grüße Bernd
Danke !!!
Das wars, jetzt läuft die App bei mir wieder stabil. Bei einigen wenigen Leuten kommt es aber immer wieder zu Abstürzen.
Ich werde jetzt mal das Update mit dieser Fehlermeldung verteilen und schauen ob ich was finde.
Danke nochmal Grüße Bernd
Toll !
Jetzt hab ich einen Fehler der absolut unregelmäßig auftritt. Und ich hab keinen Plan wo.
Wie findet man den jetzt ?
Grüße Bernd
Leider funktioniert das nicht.
Merkwürdig ist dass das Debuggen funktioniert mit Anzeige des Source Code.
Die App läuft auf einem externen Device über USB oder WLAN angebunden. Ein Samsung Galaxy S6 Tablet.
Den Methodennamen in der der Fehler aufgetreten ist kennt das StackTrace, nur die Zeilennummer nicht.
Grüße Bernd
Hallo,
meine Xamarin Forms App läuft inzwischen auf vielen Handys und Tablets. Auch sehr stabil und zuverlässig. immer noch VS 2019.
Leider ist es bei Auftreten eines Fehlers so dass die App einfach abstürzt, und natürlich weiß man nicht wieso.
Ich habe jetzt ein sehr einfaches Error Handling eingebaut dass alle Fehler abfängt, in eine Datei schreibt und beim nächsten Start anzeigt.
Jetzt sehe ich zwar den Fehler und den Stack, aber leider nicht die Zeilennummer wo der Fehler aufgetreten ist. Auch wenn ich die PDB-Datei mitliefere oder einbette ist das so.
protected override void OnCreate(Bundle savedInstanceState)
{
...
System.AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
System.Threading.Tasks.TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;
...
}
private void CurrentDomainOnUnhandledException(object sender, System.UnhandledExceptionEventArgs e)
{
UnhandledException(sender, (System.Exception)e.ExceptionObject);
}
private void TaskSchedulerOnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
UnhandledException(sender, e.Exception);
}
private void UnhandledException(object sender, System.Exception ex)
{
string error = ex.Message;
if (ex.InnerException != null) error += "\r\n" + ex.InnerException.Message;
error += "\r\n\r\nStack :" + ex.StackTrace;
if (error.Length > 500) error = error.Substring(0, 500) + " ...";
File.WriteAllText(Path.Combine(FileSystem.AppDataDirectory, "Errorlog.txt"), error);
}
Wie kann ich die genaue Stelle herausbekommen wo der Fehler aufgetreten ist ?
Grüße Bernd
Den Signal Offline Messenger gibt es nicht mehr im Play Store. Nur als APK zum Download.
Kann man die gefahrlos installieren ?
Die anderen Messenger habe ich getestet, klappt leider nicht mit denen.
Grüße Bernd
Das Handy muss im Entwicklermode sein und über USB angeschlossen sein. USB Debugging sollte eingeschaltet sein.
Dann kann man es in VS als Ziel angeben, mit F5 wird die App dann direkt auf dem Handy geöffnet.
Mit ADB kann man es auch über WLAN ansprechen ohne USB.
"C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" connect 212.223.10.34:5555
Grüße Bernd
Hallo,
ich suche einen Offline Messenger der über WLAN funktioniert und der Dateien übertragen kann. Ohne Verbindung zum Internet.
Getestet habe ich : Bridgefy, Bridgefy Alert, Briar, OfflineChat.
Leider hat keiner funktioniert.
Erstmal Android, besser wäre Android und iOS.
Grüße Bernd
PS.: Oder muss ich sowas selber programmieren ?
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Mit adb.exe (Android Debug Bridge) kann man auch Dateien vom Android Handy auf den PC kopieren.
Grüße Bernd
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
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
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
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
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
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
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
Mit Sockets kann man auch Echtdaten über http übertragen.
Grüße Bernd
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
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).
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; }
}
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
Hat sich jemand auch das schon mal angeschaut:
>
Das sieht ja interessant aus ! Muss ich mir mal anschauen !
Grüße Bernd
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
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
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
Das reicht nicht. Es könnte auch in der oberen Zeile ein Dreier sein.
Grüße Bernd
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