
Ich möchte über ein Projekt sprechen, das sich in den letzten Jahren entwickelt hat. Es heißt
GeoPuzzle und ist ein Puzzlespiel auf der politischen Weltkarte. Ziel ist es, Teile des Landes an seine Stelle zu setzen. Die Idee wurde in dem Artikel
"Mercator Puzzle for Geography Professionals" entdeckt , der in der Kindheit auch Tetris aus Ländern (noch unter DOS) spielte, aber ich erinnere mich nicht an den Namen des Programms. Die Idee hat mich so inspiriert, dass ich ein komplettes Produkt herstellen wollte, das nicht nur für Schulkinder, sondern auch für Geografieexperten interessant ist. Die Entwicklung des Projekts kann auf
GitHub beobachtet werden.
Prototyp
Der Artikel "Puzzle Mercator für Geographie-Experten" wurde am 8. Februar 2013 veröffentlicht, aber nach 4 Monaten hatte ich einen Prototyp fertig, in dem die Polygone aller Länder der Welt zusammengesetzt waren. Wenig später fügte ich die Regionen Russlands und der US-Bundesstaaten hinzu und wählte die Ausgangsposition auf der Karte für Polygone zufällig aus. Ich habe den Entwicklungsprozess
in meinem Blog beschrieben und den Quellcode auf
GitHub gepostet. Und das war's - stecken. Ich hatte viel weniger Freizeit, meine Motivation war weg (es wurde keine Entscheidung getroffen) und die Komplexität nahm exponentiell zu. Es war ein Haustierprojekt, und die Hauptaufgabe bestand darin, etwas Neues zu lernen, also war ich ein wenig pervers mit Technologie. Auf dem Client war natürlich Javascript (mit dem ich damals nicht viel gearbeitet habe), das Ruby-Skript (wieder eine neue Sprache für mich) für die Aufbereitung der Daten verantwortlich, aber auf dem Server gab es Erlang (ich wollte etwas rein Funktionales ausprobieren). Vollständiger Ausstieg aus der Komfortzone: Es war schwierig, direkt mit PostGIS-Objekten zu arbeiten. Der Aufwand, Zeichenfolgen in erlang zu konvertieren und YAWS zu konfigurieren, war ein separates Problem. In der nächsten Phase wurde mir klar, dass ich mit diesem ganzen Zoo einfach nicht fertig werden konnte, um ein vollwertiges Produkt herzustellen, und ging denke ein paar Jahre nach.
GeoPuzzle

Die Seite hat die ganze Zeit funktioniert, die Leute waren sogar dort, aber ich wollte wirklich noch ein kleines Detail hinzufügen: um zumindest einige Informationen über das neu entdeckte Polygon anzuzeigen. Daher hatte ich vor, die Neujahrsferien 2017 mit Nutzen zu verbringen. Aufgrund von Problemen im Prototyp habe ich beschlossen, alles neu zu schreiben und das Produkt auf etwas Bekanntem zu machen - Django. Es gibt Dinge, die mein Leben stark vereinfacht haben, zum Beispiel das Admin-Panel und die Arbeit mit PostGIS über ORM. Für den Anfang war es jedoch notwendig, die bereits funktionierende Funktionalität neu zu erstellen. Es dauerte nur ein paar Abende, und die meiste Zeit wurde mit dem Laden von Daten aus KML-Dateien verbracht. Nicht so sehr der Importprozess selbst als vielmehr die Vorbereitung und Wiederherstellung meines Wissens darüber, wie man mit ihnen arbeitet. Übrigens habe ich damals
Polygone von
gadm.org genommen . Dies funktionierte gut für Länder, aber es gab bestimmte Probleme mit der Genauigkeit der Regionen, so dass ich mir eine Auszeit für dieses Problem nahm.
Ein paar Worte zu Verwaltungsebenen in Geodaten (Ebenen).Alle Länder sind in viele Regionen unterteilt, die in noch kleinere Teile unterteilt sind. Insgesamt gibt es 12 Ebenen in einer solchen Hierarchie.
Zum Beispiel für Russland:
- Russland (2) -> Südlicher Bundesbezirk (3) -> Krasnodar-Gebiet (4) -> Vyselkovsky-Bezirk (6) -> Art. Dörfer (8)
- Russland (2) -> Südlicher Bundesbezirk (3) -> Krasnodar-Gebiet (4) -> Krasnodar (6) -> Prikubansky-Bezirk (9) -> Kopanskaya (10)
- Frankreich (2) -> Metropole Frankreich (3) -> Normandie (4) -> Departement Orne (6) -> Kanton Donfron (7) -> Gemeinde Donfron-en-Poiret (8) -> Donfron (9)
Territoriale Einheiten in verschiedenen Ländern werden auf ihre eigene Weise genannt, aber für mich habe ich diese Unterteilung abgeleitet: Land (2) -> Region (4) -> Distrikt (6). Weitere administrative Aufteilung für später verlassen.
Projektentwicklung
Zu dieser Zeit war die Anwendung nur eine Sammlung von HTML-Seiten mit einem Minimum an CSS. Ich wollte die Idee schnell überprüfen und mich nicht um das Design kümmern. Die Idee erwies sich als realisierbar und es ist Zeit, eine schöne Hülle dafür zu machen. Weil Ich habe keinen Sinn für Schönheit in der Benutzeroberfläche, dann Bootstrap, um mir zu helfen. Es gibt keine Schnittstelle, aber es erschien und wurde sogar für mobile Geräte angepasst. Dies war jedoch nur der erste Schritt, um das Frontend in Ordnung zu bringen.
Wie fühlt es sich an, 2016 JavaScript zu lernen ?! Wenn der Code in einen anderen Dialekt kompiliert wird, wird er als Vorlage verwendet und zusammengeklebt, damit er später in Stücke geschnitten werden kann. Als Backend hatte ich Angst, aber die Komplexität des Client-Teils war groß genug geplant, was die Verwendung eines Frameworks oder einer Bibliothek erforderlich machte. Ich habe mich aus zwei Gründen für React entschieden: Ich brauchte kein SPA, sondern eine Reihe von Komponenten für verschiedene Seiten, und ich wollte das Ergebnis schnell sehen. Bevor Sie mit dem Programmieren begannen, mussten Sie die Umgebung einrichten. Jetzt verstehe ich das vertraute Frontend, das sagte, dass er Webpack für 2 Tage eingerichtet hat. Es stellt sich heraus, dass es kein Witz war.
Zu dieser Zeit erlag ich der Überzeugung und implementierte die Logik der Anwendung mit Redux. Vielleicht war das kein Fehler, weil darf das Thema schnell eingeben. Durch formale Regeln konnte ich Code schreiben und sicherstellen, dass er funktionierte, ohne unter die Haube zu schauen. Redux, das seine Middleware verwendet, hat mich von der Netzwerkinteraktion abstrahiert, wodurch ich die Antworten auf den Server überprüfen konnte. Ja, bis zu diesem Punkt arbeitete der Client selbstständig - Ajax Request holte alle erforderlichen Daten heraus und überprüfte die Antworten selbstständig. Der Benutzer könnte betrügen, indem er sich die Daten ansieht, die vom Server stammen. Außerdem flogen die Daten beim Laden ein, was erst nach der richtigen Antwort erforderlich war. Nach der Implementierung der Überprüfung über Web-Sockets ist der Prozess ideologisch korrekter geworden - die Antwort überprüft Code, der dem Client nicht zur Verfügung steht. Für den Benutzer sah dies immer noch sofort so aus: Senden der Extrempunkte des Polygons an den Server, Überprüfen, ob sie das Quadrat mit einem Fehler eingegeben haben, Packen der Daten für das Infobox und des detaillierten Polygons in json und Übertragen an den Client - Anpassung in ~ 200 ms.

Nachdem Sie die ganze Kraft von Javascript gelernt haben, ist es schwer aufzuhören. Sofort gab es Ideen, wo man Animationen, Faltblöcke, Blinken und neue Versionen von Spielen hinzufügen konnte. Eines davon ist das „Quiz“, bei dem Sie das Land anhand von Name, Flagge, Wappen oder Hauptstadt erraten müssen. Während des Testprozesses stellte sich heraus, dass einige Regionen keine Flaggen hatten, während andere kein Kapital hatten, so dass einige Länder von der Liste der verfügbaren Länder ausgeschlossen werden mussten. Gleichzeitig erschien auf der physischen Weltkarte ein Spielmodus - für echte Profis ohne Ländergrenzen.
Öffnen Sie Datenquellen
Derzeit befinden sich ca. 50.000 Polygone im Spiel, und ich möchte mich ganz herzlich bei so großartigen Projekten wie Wikipedia und Open Street Map bedanken, ohne die das Ausfüllen der Basis nicht möglich gewesen wäre. Grundvoraussetzung war das Empfangen und Aktualisieren von Daten aus Open Source, also ohne manuelle Bearbeitung, weil Ich möchte keine komplexe Synchronisationslogik machen. Als Ergebnis habe ich 2 Skripte, die Infoboxen und Polygone aktualisieren können.
Wikipedia und SPARQL

Was ist die größte Datenbank von Ländern und Regionen? Wikipedia! Anfangs wollte ich den Benutzern die gesamte Infobox zeigen, gab diese Idee aber bald auf. Ja, es gab wichtige Dinge wie Namen, Flaggen, Hauptstädte und andere Dinge, aber es gab auch viel Müll (Telefoncode, Regierungsform, BIP ...). Ich habe versucht, bereits gesammelte zu analysieren, aber festgestellt, dass sie eine andere Struktur haben. Dies stellte sich als Katastrophe heraus: Die Arbeitskosten für die Implementierung stiegen um ein Vielfaches. Es war Zeit anzuhalten und nachzudenken. Gleich am nächsten Tag erfuhr ich von der Existenz einer speziellen Abfragesprache - SPARQL. Im Aussehen ähnelt es SQL - auch deklarativ, mit den Schlüsselwörtern
SELECT
,
WHERE
,
ORDER BY
, aber es funktioniert auf eine ganz andere Art und Weise. Ein kleines Beispiel, das eine Liste von Staaten mit ihren Hauptstädten in Englisch und Russisch zurückgibt:
SELECT DISTINCT ?country ?capital ?row WHERE { ?country wdt:P31 wd:Q3624078 . FILTER NOT EXISTS {?country wdt:P31 wd:Q3024240} OPTIONAL { ?country wdt:P36/rdfs:label ?capital } . BIND(lang(?capital) as ?row) filter (?row = 'ru' || ?row = 'en') } ORDER BY ?capital
Sieht wild aus, nicht wahr ?! Überprüfen Sie
hier . Ich habe sogar eine kleine
Notiz in meinem Blog geschrieben, um meine Erfahrungen irgendwie zu strukturieren und dabei zu helfen, in das Thema einzusteigen, weil Es gibt nur wenige detaillierte Materialien im Internet. Sie können lernen, solche Anfragen ziemlich schnell zu lesen, aber ich habe ein ganzes Wochenende gebraucht, um etwas Sinnvolles zu schreiben. Viel "Magie" von
wd:Q3624078
und anderen Attributen. Sie müssen wissen, dass
wdt:P31
eine „Einheit“ und
wd:Q3624078
ein „souveräner Staat“ ist. Unbekannte Personen beginnen mit einem Fragezeichen, und die Erfüllung der Anfrage besteht in der Suche nach solchen dreifachen Tatsachen, die die Bedingungen erfüllen würden. Beispiel
?country wdt:P31 wd:Q3024240
- "Alle Objekte finden, die historische Zustände sind"; und dann nimmt das gleiche Objekt an anderen Dreifach-
?country wdt:P36/rdfs:label ?capital
- woher kommt das Kapital
?country wdt:P36/rdfs:label ?capital
Ungefähr eine Woche später hatte ich die erste Version des Skripts fertig, mit der regionale Informationen von Wikipedia heruntergeladen wurden. Und dann wurde ein anderes Problem klar - diesmal mit Daten. Einige SVG-Dateien haben nicht mit
<?xml version="1.0" encoding="UTF-8"?>
und wurden vom Browser nicht als gültige Bilder erkannt. Glücklicherweise kann die Quelldatei bearbeitet werden. Die Registrierung auf wikipedia.org ist nicht kompliziert, aber Sie befinden sich sofort für einen Tag in einem Badehaus. Hier ist ihr Schutz gegen Roboter. Gleich am nächsten Abend regierte ich XML und war froh, wie einfach es sich herausstellte, und Flaggen und Embleme erschienen auf der Karte.
Polygone

Wenn wir für Fakten zu Wikipedia gehen, dann für Geodaten - in der Open Street Map. Es wäre cool, eine lokale Kopie abzuholen und die Sprache der
Überführungsanfragen zu lernen, aber ich kann mir nicht einmal vorstellen, wie lange es dauern würde. Und Sie müssen auch die Hierarchie von irgendwoher übernehmen ... Glücklicherweise hat eine freundliche Person
dieses Problem bereits für mich gelöst . Der Dienst bietet sogar eine API zum Abrufen von Informationen. Ich habe es geschafft, von dort alle Polygone bis einschließlich Level 6 (Distrikt) herunterzuladen und alles in Postgres zu füllen, etwas mehr als 2 GB kamen heraus. Es war nicht ohne Abenteuer - einige Polygone waren so groß (zum Beispiel wiegt Kanada in einem GeoJSON mit Reißverschluss mehr als 100 MB), dass der Server entweder abstürzte oder nicht reagierte. Ich musste solche Momente manuell umgehen. Ich habe alle Kinder heruntergeladen und in QGIS zusammengeführt. Dies ist übrigens ein weiteres Beispiel für ein Open Source-Projekt, das mir sehr geholfen hat.
Big Data-Probleme
Also, ich habe eine Datenbank mit Daten, ich starte das Spiel und ... und warte ... wieder warte ich ... erschien! Ich habe versucht, das Polygon zu ziehen - Er ist tot, Jim! Chrome konnte mit einem solchen Punktevolumen nicht umgehen und fiel ab. Die Stirnstrategie funktioniert nicht mehr, es ist Zeit zum Nachdenken. Am naheliegendsten ist es, die Details von Polygonen zu reduzieren. Empirisch abgeleitet eine Formel, die von der Fläche der Figur abhängt - es wurde besser. Auf einem funktionierenden Computer arbeitete der Algorithmus im laufenden Betrieb, während die Ressourcen des Servers stark eingeschränkt sind. Verbundene Redis, es wurde schon auf dem Server besser. Aber abgeschnittene Polygone sind gut für Drag'n'Drop, und wenn sie an der richtigen Stelle eingestellt sind, stimmen die Ränder nicht mit denen überein, die Google Maps zeichnen. Nun, dies kann umgangen werden, indem eine nicht so aggressive Formel angewendet wird, um Details zu reduzieren. Da es bereits 2 Caches gibt, warum nicht versuchen, alles zwischenzuspeichern, was überhaupt möglich ist ?! Infoboxen (in zwei Sprachen) flogen nach Redis, den Grenzen, anhand derer die Antwort berechnet wird, der Mitte des Polygons sowie den statischen Seiten der Site. Infolgedessen begann das Spiel viel schneller zu arbeiten, und Postgres wurde viel Arbeit abgenommen, was theoretisch der Engpass sein könnte. Minus - die Anwendung funktioniert ohne Redis überhaupt nicht.
Erste Bereitstellung
Es ist also Zeit, das Projekt Freunden zur Rückmeldung zu zeigen. Es blieb nur wenig übrig: sitemap.xml generieren, robots.txt hinzufügen, Metriken verbinden, soziale Schaltflächen hinzufügen. Netzwerke und ... bereitstellen! Ich habe AWS als Hosting gewählt hoffte, in die freien Ressourcen zu passen. Und dies ist ein sehr guter Stapel für ein Anfängerprojekt:
- Anwendungsserver (t2.micro: 1xCPU, 1 GB RAM, 20 GB SSD)
- Datenbank (db.t2.micro: 1xCPU, 1 Gb RAM, 20 Gb SSD)
- Dateispeicherung mit CDN (5 GB S3, 50 GB Datenverkehr)
- Caching-Server (cache.t2.micro: 1xCPU, 0,5 GB RAM)
- Elasticsearch + Kibana (t2.small.elasticsearch: 1xCPU, 2 GB RAM)
Dies ist nur eine Liste dessen, was ich verwendet habe. Unterwegs beschloss ich, meinen Rechen
in Form von Artikeln zu erstellen, starb aber schnell. Die Zeit vergeht anständig, aber es ist nicht klar, ob jemand sie braucht.
Infolgedessen zahlte ich für das Dienstjahr etwas in der Größenordnung von 10 Dollar, und sogar das aus Dummheit. Aber hier ging die Probezeit zu Ende und ich musste umziehen, weil Die Kosten für den Besitz dieser gesamten Wirtschaft näherten sich mehreren hundert Dollar. Tarife verglichen und auf DigitalOcean festgelegt. Im Moment habe ich genug Computer mit 2 GB RAM für alles (Anwendungsserver, Datenbank und Cache), aber ich habe die Statik und das CDN auf AWS belassen. Jetzt fand ich heraus, dass DO auch ein CDN und einen Speicher für 5 US-Dollar pro Monat hat. Daher ist es sinnvoll, auch über das Verschieben dieses Teils nachzudenken.
Übertragung auf Open Source
An diesem Januarabend erhielt ich einen Brief von einer dänischen Schule. Das Wesentliche war, dass sie 100 Dollar haben und sie mir geben wollen. Es gibt jedoch eine Bedingung: Der Quellcode des Projekts muss geöffnet sein. Bis zu diesem Moment hatte ich noch nicht einmal an Open Source gedacht. Ein paar Abende lang wurde über eine Lizenz nachgedacht und sie ausgewählt. Infolgedessen habe ich
die Quellen unter der GPLv3-Lizenz
auf Github hochgeladen und die versprochenen 100 US-Dollar erhalten. Dies hat die Motivation stark erhöht - mein Projekt war wirklich nützlich! Und ich eilte zum nächsten Ziel - dem Spieleditor. Damit jeder seine eigenen Rätsel erstellen kann. Zum Beispiel "Länder, die am Zweiten Weltkrieg teilnehmen", "Bezirke des Krasnodar-Territoriums", "Binnenländer" ... Dafür waren jedoch eine Registrierung und ein primitiver persönlicher Account erforderlich. Infolgedessen zog sich die Entwicklung über lange 3 Monate hin. Während dieser Zeit schrieb ich einen Baum von Regionen, die Daten durch Ajax ziehen, die Lokalisierung verbinden, lernen, wie man eine Google-Karte als Bild speichert, um Vorschauen zu generieren und Redux zu schneiden. Ja, er hat mir am Anfang geholfen, mit den Daten umzugehen, aber jetzt ist es wahrscheinlicher, dass sie stören. Ich müsste Reduzierungen ziehen, um Polygone auf der Karte zu zeichnen, zusammen mit Code, der ihre Bewegung handhaben würde. Glücklicherweise dauerte das Entfernen der Bindung an den globalen Status nur ein paar Tage, und das Verschieben des Codes in den lokalen Status vereinfachte die Anwendung sogar. Und natürlich ist das eine gute Erfahrung :)
Serviceverbindung
Es stellt sich heraus, dass viele kostenpflichtige Dienste ihre Dienste für Open Source-Projekte kostenlos anbieten. Ich werde nur diejenigen auflisten, die ich mit meinen eigenen verbunden habe.
-
Wachposten . Ich denke, dieser Service zum Abfangen von Fehlern ist jedem bekannt. Als ich das Projekt gerade bereitgestellt habe, bestand die Protokollierung darin, einen Stack-Trace an die E-Mail zu senden. Dies funktionierte nur für das Backend, aber ich wollte auch Fehler im Frontend verfolgen. Und nicht umsonst - ich habe das Limit für kostenlose Nachrichten in nur 2 Wochen ausgeschöpft. Die meisten Fehler befanden sich im Darm der Google-Kartenbibliothek, was auf den ersten Blick sehr seltsam ist. Während der Untersuchung stellte sich heraus, dass alles meine Schuld war. Korrekturen dauerten mehr als einen Monat, aber es war eine sehr nützliche Methode zur Behandlung von Javascript-Fehlern.
-
Crowdin.com - Lokalisierung. Ich plane, das Projekt für alle zugänglich zu machen. Einschließlich dieser Infoboxen wurden in seiner Muttersprache angezeigt. Das Ausfüllen aus Wikipedia ist kein Problem, aber aus Gründen der Konsistenz möchte ich auch eine Benutzeroberfläche in derselben Sprache haben, die bisher nur ins Russische und Englische übersetzt wurde.

-
CircleCI . Kein modernes Projekt kann ohne CI / CD, Tests und automatische Bereitstellung auskommen. Ich habe mich ausschließlich für CircleCI entschieden, weil ich bereits mit TravisCI zusammengearbeitet habe, als ich die
Bibliothek für die Arbeit mit Yandex.Disk geschrieben habe . Ich hatte den Eindruck, dass es besser zum Testen von Bibliotheken geeignet ist, als Es ist einfach, die Matrix der Umgebungen festzulegen, in denen der Code getestet werden soll. Aber mit den Tests selbst habe ich ein Problem - es gibt nicht so viele, wie wir möchten, obwohl die Infrastruktur bereits bereit ist.

-
Overalls . Visualisierungsdienst für die Codeabdeckung. Kann auch ein Etikett zum Einfügen in das README.md-Projekt angeben.
-
SonarQube . Harvester zur Kontrolle der Codequalität. Es überprüft den Code nach einer Vielzahl von Regeln, berücksichtigt die zyklomatische Komplexität, überwacht die Abdeckung durch Tests und erkennt sogar Codeduplikationen! Ein sehr interessanter Service, für den ich noch keine Zeit hatte, ihn vollständig zu verstehen.

- Github Bots. Bisher ist nur
Dependabot verbunden, wodurch Abhängigkeiten aktualisiert werden.

Ich schlage in den Kommentaren vor, die Liste der Dienste und Bots zu ihren Projekten zu teilen.
Bugs
Die Analyse von Fehlern und Problemen verdient einen separaten Artikel. Es war lustig und komplex und schwer zu reparieren (daher steht Chukotka immer an seiner Stelle). Derzeit gibt es eine, die Benutzer wirklich stört. Nach Erhalt der Antwort werden die Polygone gelöscht und neu erstellt (in der React-Google-Maps-Bibliothek). Wenn der Benutzer zu diesem Zeitpunkt eine gezogen hat, geht die Google Map weiterhin davon aus, dass der Vorgang noch nicht abgeschlossen ist. Es sieht so aus, als ob beim Ziehen und Tropfen das Polygon verschwindet und Sie kein anderes mehr greifen können. Sie können die Antwortverarbeitung natürlich im Drag'n'Drop-Prozess sperren, aber dies wird garantiert das Multiplayer-Spiel beenden, an dessen Implementierung ich gerade arbeite. Ich habe versucht, einen Weg zu finden, um das Ziehen und Ablegen programmgesteuert abzubrechen, aber am Ende habe ich
eine Frage zu StackOverflow und einen
Fehler in Google Maps gestellt, in der Hoffnung, dass sie darauf achten würden. Bis dahin fügte er eine Schaltfläche "Das Spiel ist kaputt!" Hinzu, die die gesamte Karte neu initialisiert, das Ergebnis jedoch nicht zurücksetzt.
Was kommt als nächstes?
- Design. Ich gebe zu, dass damit alles völlig schlecht ist. Es ist notwendig, einen Designer und Layoutdesigner einzustellen, da ich selbst nicht mit Layout und Layouts befreundet bin.
- Monetarisierung. Anfangs hatte ich nichts geplant. Das Projekt ist der Grundbildung gewidmet, die meiner Meinung nach für jedermann zugänglich sein sollte. Ich war sehr inspiriert von einem Brief einer dänischen Schule, aber fast ein Jahr verging, und während dieser Zeit gab es nur eine Überweisung von 5 Dollar. Ich habe nicht geglaubt, dass es sich überhaupt für den Server auszahlt. Trotzdem startete er eine Kampagne auf Patreon . Gleichzeitig können Sie wahrscheinlich darüber nachdenken, bezahlte Möglichkeiten für Lehrer oder Organisationen einzuführen. Ich habe beispielsweise Erfahrung mit der Integration in Learning Management Systems - eine Reihe von Plattformen, mit denen Sie Kurse erstellen können und die in Europa und den USA sehr beliebt sind. Soweit ich weiß, hindert mich dies als Autor nicht daran, eine parallele kommerzielle Version zu entwickeln, obwohl sich der Quellcode auch unter der GPL von Github befindet.
- Handys. Ich möchte eine Anwendung für iOS / Android veröffentlichen. Gemessen an der Yandex-Metrik versucht ein Viertel der Benutzer, von einem Telefon oder Tablet aus zu spielen, aber es stellt sich heraus, dass sie Schwierigkeiten haben.
- Entwicklung. Alle Arbeiten werden an GitHub durchgeführt . Ich möchte das Projekt weiterentwickeln, aber es ist schwierig, es alleine zu machen. Die Pläne beinhalten das Hinzufügen von Multiplayer, das Erstellen von Tags, Bewertungen und Filtern im Workshop sowie das Hinzufügen von Polygonen für eine physische Karte (Berge, Meere, Halbinseln). Es gibt immer noch viele interessante Dinge, daher ist es eines der Ziele des Artikels, Gleichgesinnte zu finden. Eine andere Möglichkeit besteht darin, zur Stiftung zu gehen, beispielsweise zur Python Software Foundation, und einen Zuschuss zu erhalten.
Hier ist was im Moment ist. Vielen Dank für das Lesen bis zum Ende! Sie können hier spielen -
geopuzzle.org , und den Quellcode auf
GitHub ansehen.

UFO Pflege Minute
Dieses Material kann zu widersprüchlichen Gefühlen führen. Aktualisieren Sie daher vor dem Schreiben eines Kommentars etwas Wichtiges in Ihrem Gedächtnis: