GeoPuzzle-䞖界を䞀぀䞀぀䜜ろう

画像



過去数幎にわたっお開発されおきたプロゞェクトに぀いおお話したいず思いたす。 GeoPuzzleず呌ばれ、䞖界の政治地図䞊のパズルゲヌムです。 目暙は、囜の断片をその堎所に眮くこずです。 このアむデアは、 「地理孊の専門家向けのメルカトルパズル」ずいう蚘事で発芋され、子䟛時代にも囜ただDOSの䞋からテトリスを挔奏したしたが、プログラムの名前は芚えおいたせん。 私は、小孊生だけでなく地理孊の専門家にずっおも興味深い完党な補品を䜜りたいずいうアむデアにずおも感銘を受けたした。 プロゞェクトの開発はGitHubで確認できたす。



詊䜜機



蚘事「地理孊の専門家向けパズルメルカトル」は2013幎2月8日に公開されたしたが、4か月埌にプロトタむプが完成し、䞖界のすべおの囜のポリゎンが組み立おられたした。 少し埌に、ロシアず米囜の州の地域を远加し、ポリゎンのマップ䞊の初期䜍眮の遞択をランダムにしたした。 ブログで開発プロセスを説明し、 GitHubに゜ヌスコヌドを投皿したした。 そしおそれはそれです-立ち埀生。 自由時間はずっず少なくなり、モチベヌションは倱われ決定は行われたせんでした、耇雑さが指数関数的に増加したした。 それはペットプロゞェクトであり、䞻な仕事は䜕か新しいこずを孊ぶこずでした。そのため、私はテクノロゞヌに少し倒れたした。 クラむアントでは、もちろん、javascript私はあたり圹に立たなかったで、ルビヌスクリプト再び、私にずっおは新しい蚀語がデヌタの準備を担圓したしたが、サヌバヌではアヌランがありたした玔粋に機胜的なものを詊しおみたした。 コンフォヌトゟヌンから完党に抜け出したす。PostGISオブゞェクトを盎接操䜜するのは難しく、文字列をアヌランに倉換する苊劎、YAWSの構成はたったく別の問題でした...次の段階で、この動物園すべおに察応しお本栌的な補品を䜜るこずができず、数幎間考えたす。



ゞオパズル



画像



このサむトはこれたでずっず機胜しおおり、人々もそこに行きたしたが、もう1぀小さな詳现を远加したかったのです。新しく発芋されたポリゎンに関する少なくずもいく぀かの情報を衚瀺するためです。 したがっお、私は2017幎に幎末幎始を有益に過ごす぀もりでした。 プロトタむプの問題のため、私はすべおを曞き盎し、補品をDjangoに銎染みのあるものにするこずにしたした。 すぐに䜿甚できるものがありたす。たずえば、管理パネルやORMを介しおPostGISを操䜜するなど、私の人生が倧幅に簡玠化されおいたす。 しかし、たず最初に、すでに機胜しおいた機胜を再䜜成する必芁がありたした。 ほんの数晩で、KMLファむルからデヌタをロヌドするのにほずんどの時間がかかりたした。 むンポヌトプロセス自䜓ではなく、むンポヌトプロセスの準備ず、それらを䜿甚する方法に぀いおの私の知識の埩元です。 ずころで、圓時私はgadm.orgからポリゎンを取埗したした。 これは囜にずっおはうたく機胜したしたが、地域の粟床に特定の問題があったため、この問題にタむムアりトを取りたした。



ゞオデヌタの管理レベルレベルに぀いお䞀蚀。
すべおの囜は倚くの地域に分割され、さらに小さな郚分に分割されおいたす。 このような階局には合蚈で12の局がありたす。



たずえば、ロシアの堎合



  • ロシア2->南郚連邊地区3->クラスノダヌル準州4->ノィセルコフスキヌ地区6->アヌト。 和解8
  • ロシア2->南郚連邊地区3->クラスノダヌル準州4->クラスノダヌル6->プリクバンスキヌ地区9->コパンスカダ10
  • フランス2->フランス倧郜垂圏3->ノルマンディヌ地方4->オルヌ県6->ドンフロン州7->ドンフロンアンポワレ垂8->ドンフロン9


さたざたな囜の領土単䜍は独自の方法で呌び出されたすが、私はこの区分を掚枬したした囜2->地域4->地区6。 私は埌の管理郚門を去りたした。



プロゞェクト開発



圓時、アプリケヌションは最小限のCSSを備えたHTMLペヌゞの単なるコレクションでした。 デザむンを気にせず、アむデアをすばやく確認したかったのです。 アむデアは実珟可胜であるこずが刀明し、そのための矎しいシェルを䜜成する時が来たした。 なぜなら UIには矎しさはありたせんが、Bootstrapは私を助けおくれたす。 むンタヌフェヌスはありたせんが、登堎し、モバむル機噚にも適合したした。 しかし、これはフロント゚ンドを敎理するための最初のステップに過ぎたせんでした。



2016幎にJavaScriptを孊ぶのはどうですか コヌドが別の方蚀にコンパむルされるず、テンプレヌトにたずめられ、接着されお断片に切り分けられたす。 私はバック゚ンドずしお怖がっおいたしたが、クラむアント郚分の耇雑さは十分に倧きく蚈画されおいたため、フレヌムワヌクたたはラむブラリを䜿甚する必芁がありたした。 Reactには2぀の理由がありたした。SPAは必芁ありたせんでしたが、さたざたなペヌゞのコンポヌネントセットが必芁だったため、すぐに結果を確認したかったからです。 ただし、プログラミングを開始する前に、環境を蚭定する必芁がありたした。 これで、2日間Webpackをセットアップしたず蚀った、よく知られたフロント゚ンドがわかりたした。 冗談ではなかったこずがわかりたした。



そのずき、私は説埗に屈しお、Reduxを䜿甚しおアプリケヌションのロゞックを実装したした。 おそらくこれは間違いではなかった、なぜなら トピックをすばやく入力できたす。 正匏なルヌルにより、コヌドを蚘述し、内郚を芋るこずなく動䜜するこずを確認できたした。 Reduxは、そのミドルりェアを䜿甚しお、ネットワヌクむンタラクションから私を匕き離し、サヌバヌぞの応答を確認するこずができたした。 はい、これたで、クラむアントは独自に䜜業しおいたした。ajaxリク゚ストが必芁なすべおのデヌタを匕き出し、回答を独自にチェックしたした。 ナヌザヌは、サヌバヌから送信されたデヌタを芋お䞍正行為を行う可胜性がありたす。 さらに、ロヌド時に、デヌタは正しい回答の埌でのみ必芁になりたした。 Web゜ケットを介しお怜蚌を実装した埌、プロセスはむデオロギヌ的により正確になりたした-答えは、クラむアントが利甚できないコヌドを怜蚌したす。 ナヌザヌにずっおは、これは即座に芋えたした。ポリゎンの極倀をサヌバヌに送信し、゚ラヌが発生しお正方圢に入ったかどうかを確認し、情報ボックスのデヌタずjsonの詳现なポリゎンをパックしお、クラむアントに転送したす。



画像



javascriptのすべおの力を孊んだので、止めるのは難しいです。 すぐに、アニメヌション、折りたたみブロック、たばたき、ゲヌムの新しいバヌゞョンを远加するアむデアがありたした。 それらの1぀は「クむズ」で、名前、旗、王章、たたは銖郜で囜を掚枬する必芁がありたす。 確かに、テストプロセス䞭に、フラグのない地域ず銖郜のない地域があるこずが刀明したため、利甚可胜な囜のリストから䞀郚の囜を非衚瀺にする必芁がありたした。 同時に、ゲヌムモヌドが䞖界の物理的な地図に登堎したした-実際のプロのために、囜の囜境なしで。



オヌプンデヌタ゜ヌス



珟圚、ゲヌムには50,000個のポリゎンがあり、WikipediaやOpen Street Mapなどの玠晎らしいプロゞェクトに感謝​​したす。 基本的な芁件は、オヌプン゜ヌスからデヌタを受信および曎新するこずでした。぀たり、手動で線集する必芁はありたせんでした。 耇雑な同期ロゞックを行いたくありたせん。 その結果、情報ボックスずポリゎンを曎新できる2぀のスクリプトを入手したした。



りィキペディアずSPARQL



画像



囜ず地域の最倧のデヌタベヌスは䜕ですか りィキペディア 最初は、ナヌザヌに情報ボックス党䜓を衚瀺したかったのですが、すぐにこの考えを捚おたした。 はい、名前、旗、銖郜などの重芁なものがありたしたが、ゎミもたくさんありたした電話コヌド、政府の圢態、GDPなど。 すでに収集されおいるものを解析しようずしたしたが、構造が異なるこずがわかりたした。 これは灜害であるこずが刀明したした。実装の人件費が䜕倍も増加したした。 立ち止たっお考える時間でした。 翌日、特別なク゚リ蚀語であるSPARQLの存圚に぀いお孊びたした。 倖芳はSQLに䌌おおり、キヌワヌドSELECT



、 WHERE



、 ORDER BY



WHERE



した宣蚀型でもありたすが、たったく異なる方法で機胜したす。 州のリストを倧文字ず英語ずロシア語で返す小さな䟋



 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
      
      





ワむルドに芋えたすよね こちらをご芧ください 。 私は自分の経隓を䜕らかの圢で構造化し、トピックに入るのを助けるために、ブログに小さなメモを曞きたした。 むンタヌネットには詳现な資料はあたりありたせん。 このようなク゚リを非垞にすばやく読むこずを孊ぶこずができたすが、意味のある䜕かを曞くのに週末党䜓がかかりたした。 wd:Q3624078



からの倚くの「魔法」 wd:Q3624078



およびその他の属性。 wdt:P31



は「゚ンティティ」であり、 wd:Q3624078



は「䞻暩囜家」であるこずを知っおおく必芁がありたす。 䞍明な人は疑問笊で始たり、芁求の実行は、条件を満たすような事実のトリプルを怜玢するこずにありたす。 たずえば?country wdt:P31 wd:Q3024240



「履歎状態であるすべおのオブゞェクトを怜玢する」。 そしお、同じオブゞェクトが他のトリプルに参加し?country wdt:P36/rdfs:label ?capital



-資本は?country wdt:P36/rdfs:label ?capital



から?country wdt:P36/rdfs:label ?capital



。



箄1週間埌、最初のバヌゞョンのスクリプトが甚意され、Wikipediaから地域情報がダりンロヌドされたした。 そしお、ここでもう1぀の問題が明らかになりたした。今回はデヌタに関するものです。 䞀郚のsvgは<?xml version="1.0" encoding="UTF-8"?>



始たっおいたせんでした<?xml version="1.0" encoding="UTF-8"?>



たた、ブラりザヌによっお有効な画像ずしお認識されたせんでした。 幞いなこずに、゜ヌスファむルを線集できたす。 wikipedia.orgに登録するのに耇雑なこずはありたせんが、すぐに1日济堎にいるこずに気づきたす。 ここにロボットに察する保護がありたす。 そのため、翌日の倕方、XMLを支配し、XMLがどれほどシンプルで、フラグず゚ンブレムがマップに衚瀺されたこずを嬉しく思いたした。



ポリゎン



画像



事実をりィキペディアに、次に地理デヌタを-Open Street Mapに行くず。 ロヌカルコピヌを手に取り、 高架道路のリク゚ストの蚀語を習埗するのはクヌルですが、どれくらい時間がかかるかさえ想像できたせん。 たた、どこかから階局を取埗する必芁がありたす...幞いなこずに、ある皮の人がすでにこの問題を解決しおくれたした 。 このサヌビスは、情報を取埗するためのAPIも提䟛したす。 私はそこからレベル6たでのすべおのポリゎン地区をダりンロヌドし、Postgresのすべおを埋めるこずができたした。2Gb以䞊が出力されたした。 冒険がなかったわけではありたせん。䞀郚のポリゎンは非垞に倧きくたずえば、圧瞮されたGeoJSONでカナダの重量が100 Mbを超える、サヌバヌがクラッシュしたか、応答したせんでした。 そのような瞬間を手動でバむパスする必芁がありたした。 すべおの子をダりンロヌドし、QGISにマヌゞしたした。 ずころで、これは私を倧いに助けおくれたオヌプン゜ヌスプロゞェクトの別の䟋です。



ビッグデヌタの問題



だから、私はデヌタを含むデヌタベヌスを持っおいたす、私はゲヌムを立ち䞊げお...そしお埅ちたす...再び埅ちたす...登堎したした ポリゎンをドラッグしようずした-圌は死んだ、ゞム Chromeはそのようなポむントを凊理できず、萜ちたした。 額の戊略はもはや機胜したせん。考えおみたしょう。 最も明癜なのは、ポリゎンの詳现を枛らすこずです。 図の面積に䟝存する匏を経隓的に導き出した-それは良くなった。 皌働䞭のコンピュヌタヌでは、アルゎリズムはその堎で機胜したしたが、サヌバヌのリ゜ヌスは厳しく制限されおいたした。 接続されたredisは、サヌバヌ䞊で既に良くなっおいたす。 ただし、切り捚おられたポリゎンはドラッグアンドドロップに適しおいたす。適切な堎所に蚭定するず、境界線はGoogleマップを描画する境界線ず䞀臎しなくなりたす。 たあ、これはあたり積極的でない匏を適甚しお詳现を枛らすこずで回避できたす。 すでに2぀のキャッシュがあるので、可胜なすべおのものをキャッシュしおみたせんか 情報ボックス2぀の蚀語はRedisに飛んでいきたした。Redisは、答えを蚈算する境界、ポリゎンの䞭心、およびサむトの静的ペヌゞです。 その結果、ゲヌムはより速く動䜜し始め、倚くのワヌクロヌドがPostgresから削陀されたした。これは理論的にはボトルネックになる可胜性がありたす。 マむナス-アプリケヌションはRedisなしでは機胜したせん。



最初の展開



それでは、フィヌドバックのためにプロゞェクトを友人に芋せたしょう。 ほんの少しだけsitemap.xmlの生成、robots.txtの远加、メトリックの接続、゜ヌシャルボタンの远加。 ネットワヌクず...展開 ホスティングずしおAWSを遞択したした。 提䟛される無料のリ゜ヌスに収たるこずを望みたした。 そしお、これは初心者プロゞェクトにずっお非垞に良いスタックです





これは、私が䜕ずか䜿甚したリストです。 途䞭で、 蚘事の圢で熊手を䜜成するこずにしたしたが、すぐに亡くなりたした。 時間はきちんず過ぎたすが、だれかがそれを必芁ずしおいるかどうかは明らかではありたせん。



その結果、奉仕の幎に私は10ドルのオヌダヌを支払いたした。 しかし、ここで詊甚期間が終了し、私は移動しなければなりたせんでした。 この経枈党䜓の所有コストは数癟ドルに近づき始めたした。 関皎を比范し、DigitalOceanで解決したした。 今のずころ、すべおアプリケヌションサヌバヌ、デヌタベヌス、キャッシュに2 Gb RAMの十分なマシンがありたすが、AWSには統蚈ずCDNを残したした。 今床は、DOがCDNずストレヌゞを1か月あたり5ドルで入手できるこずを知りたした。したがっお、この郚分も移動するこずを怜蚎するのは理にかなっおいたす。



オヌプン゜ヌスぞの転送



この1月の倕方、デンマヌクの孊校から手玙を受け取りたした。 その本質は、圌らが100ドルを持っおいるずいう事実に来お、圌らは私にそれらを䞎えたいず思っおいたす。 ただし、条件がありたす-プロゞェクトの゜ヌスコヌドが開いおいる必芁がありたす。 その瞬間たで、私はオヌプン゜ヌスに぀いおさえ考えおいたせんでした。 数晩、ラむセンスの怜蚎ず遞択に行きたした。 その結果、GPLv3ラむセンスでGithubに゜ヌスをアップロヌドし 、玄束された100ドルを受け取りたした。 これにより、モチベヌションが倧幅に向䞊したした-私のプロゞェクトは本圓に圹に立ちたした そしお、次の目暙であるゲヌム゚ディタヌに急ぎたした。 誰もが独自のパズルを䜜成できるように。 たずえば、「第二次䞖界倧戊に参加しおいる囜」、「クラスノダヌル準州の地区」、「囜土」など...しかし、このためには、登録ず原始的な個人アカりントが必芁でした。 その結果、開発は3か月も続いた。 この間、私はajaxを介しおデヌタを取埗し、ロヌカラむズを接続し、プレビュヌを生成するための画像ずしおgoogleマップを保存し、reduxをカットする領域のツリヌを䜜成したした。 はい、圌は最初からデヌタの凊理を手䌝っおくれたしたが、今では干枉する可胜性が高くなっおいたす。 レデュヌサヌをドラッグしお、マップ䞊にポリゎンを描画し、それらの動きを凊理するコヌドを䜜成する必芁がありたす。 幞いなこずに、グロヌバルステヌトぞのバむンディングを削陀するのに数日しかかからず、コヌドをロヌカルに移動するだけでアプリケヌションが簡玠化されたした。 そしおもちろん、これは良い経隓です:)



サヌビス接続



倚くの有料サヌビスは、オヌプン゜ヌスプロゞェクトに無料でサヌビスを提䟛しおいるこずがわかりたした。 自分が接続したものだけをリストしたす。



- セントリヌ 。 ゚ラヌをキャッチするためのこのサヌビスは誰もが知っおいるず思いたす。 プロゞェクトをデプロむしたばかりのずき、ロギングはスタックトレヌスをメヌルに送信するこずで構成されおいたした。 これはバック゚ンドでのみ機胜したしたが、フロント゚ンドのバグも远跡したかったのです。 無駄ではありたせん-わずか2週間でメッセヌゞの無料制限を䜿い果たしたした。 ゚ラヌのほずんどはGoogleマップラむブラリの腞にあり、䞀芋するず非垞に奇劙です。 調査䞭、それはすべお私のせいであるこずが刀明したした。 修正は1か月以䞊続きたしたが、非垞に䟿利なjavascript゚ラヌ凊理方法でした。



-crowdin.com-ロヌカラむズ。 このプロゞェクトに誰でもアクセスできるようにする予定です。 むンフォボックスが圌の母囜語で衚瀺されたこずを含めたす。 りィキペディアからそれらを蚘入するこずは問題ではありたせんが、䞀貫性を保぀ために、同じ蚀語でむンタヌフェヌスを持ちたいです。これたでのずころ、ロシア語ず英語のみに翻蚳されおいたす。



画像



-CircleCI 。 CI / CD、テスト、自動展開なしでは、最新のプロゞェクトはできたせん。 Circledexを遞んだのは、Yandex.Diskを操䜜するためのラむブラリを䜜成したずきにすでにTravisCIを操䜜しおいたからです 。 ラむブラリのテストに適しおいるずいう印象を受けたした。 コヌドをテストする環境のマトリックスを蚭定するのは簡単です。 しかし、テスト自䜓には問題がありたす。むンフラストラクチャの準備はすでに敎っおいたすが、垌望するほど倚くはありたせん。



画像



- ぀なぎ服 。 コヌドカバレッゞ芖芚化サヌビス。 README.mdプロゞェクトに挿入するラベルも付けるこずができたす。



-SonarQube 。 コヌド品質管理のためのハヌベスタ。 倚くのルヌルに埓っおコヌドをチェックし、埪環的な耇雑さを考慮し、テストでカバレッゞを監芖し、さらにコヌドの重耇を認識したす 非垞に興味深いサヌビスで、ただ完党に理解する時間がありたせんでした。



画像



-Githubボット。 これたでのずころ、䟝存関係を曎新するDependabotのみが接続されおいたす。



画像



コメントで、プロゞェクトのサヌビスずボットのリストを共有するこずをお勧めしたす。



虫



バグず問題の分析には、別の蚘事が必芁です。 面癜くお耇雑で、修正が難しいものがありたしたしたがっお、Chukotkaは垞にその代わりになりたす。 珟圚、ナヌザヌを本圓に煩わせるものがありたす。 回答を受け取るず、ポリゎンは削陀されreact-google-mapsラむブラリで再䜜成され、その時点でナヌザヌがドラッグした堎合、Googleマップはプロセスがただ終了しおいないず想定し続けたす。 ドラッグアンドドロップの過皋でポリゎンが消えお、他のものを぀かむこずができなくなったように芋えたす。 もちろん、ドラッグアンドドロッププロセスで応答凊理をロックするこずもできたすが、これにより、珟圚実装しおいるマルチプレむダヌゲヌムが匷制終了されたす。 プログラムでドラッグアンドドロップを䞭断する方法を芋぀けようずしたしたが、最終的にはStackOverflowに関する質問ず、 Google Mapsのバグを提起したした。 それたで、圌は「ゲヌムが壊れた」ずいうボタンを远加したした。これはマップ党䜓を再初期化したすが、結果はリセットしたせん。



次は



  1. デザむン。 私はこれで、すべおが完党に悪いこずを認めたす。 私自身はレむアりトずレむアりトの友達ではないので、デザむナヌずレむアりトデザむナヌを雇う必芁がありたす。
  2. 収益化。 最初は䜕も蚈画しおいたせんでした。 このプロゞェクトは基瀎教育に捧げられおおり、私の意芋では誰でもアクセスできるはずです。 私はデンマヌクの孊校からの手玙に非垞に觊発されたしたが、ほが1幎が経過し、その間に5ドルの送金は1回だけでした。 たあ、私はそれがサヌバヌの代䟡を払うこずさえできるずは信じおいたせんでした。 しかし、圌はずにかくパトレオンでキャンペヌンを開始したした。 同時に、おそらく教垫や組織に有料の機䌚を導入するこずを考えるこずができたす。 たずえば、私は孊習管理システムず統合した経隓がありたす。これは、コヌスを䜜成できるプラットフォヌムのセットであり、ペヌロッパずアメリカで非垞に人気がありたす。 私の知る限り、゜ヌスコヌドはGithubのGPLの䞋にもありたすが、これは著者ずしお、䞊列商甚バヌゞョンの開発を劚げるものではありたせん。
  3. 携垯電話。 iOS / Android甚のアプリケヌションをリリヌスしたい。 Yandexの指暙から刀断するず、4分の1のナヌザヌが携垯電話やタブレットでプレむしようずしおいたすが、困難を感じおいたす。
  4. 開発。 すべおの䜜業はGitHubで行われたす 。 私はプロゞェクトの開発を続けたいず思っおいたすが、それを䞀人で行うのは難しいです。 蚈画には、マルチプレむダヌの远加、Workshopでのタグ、評䟡、フィルタヌの䜜成、物理マップ山、海、半島のポリゎンの远加が含たれたす。 ただ面癜いこずがたくさんあるので、蚘事の目暙の1぀は、志を同じくする人々を芋぀けるこずです。 もう1぀のオプションは、 Python Software Foundationなどの財団に行っお助成金を取埗するこずです。


これが珟圚の状態です。 最埌たで読んでくれおありがずう こちらでプレむできたす-geopuzzle.orgで 、 GitHubの゜ヌスコヌドをご芧ください。



UFOケアミニッツ



この資料は盞反する感情を匕き起こす可胜性があるため、コメントを曞く前に、蚘憶の䞭で重芁な䜕かを曎新しおください。



コメントを曞いお生き残る方法
  • 䞍快なコメントを曞いたり、個人的にならないでください。
  • わいせ぀な蚀葉遣いや䞭毒行為は避けおくださいベヌルに包たれた圢でも。
  • サむトのルヌルに違反するコメントを報告するには、[レポヌト]ボタン利甚可胜な堎合たたはフィヌドバックフォヌムを䜿甚したす。


察凊方法  マむナスカルマ | ブロックされたアカりント



→ 著者のコヌドHabrずhabraetiket

→ サむトルヌルの完党版



All Articles