TinyGIS

TinyGIS - WebAPI that provides Tiny Geographic Information System.

簡単なリバースジオコーディングAPI。半分趣味で半分勉強という感じ。

モチベーション

なんかAPIサービスを運用してみたいなーとはずっと思っていて、思い付きは仕事中。まあ勉強もかねて作ってみるかという程度。サービスを運用するモチベーションはなんというか運用的なことを体験したいというか、仕事だとまあ全部はやらないことが多いので全部やってみたいという感じ。あとはなんとなく自分のサービスを持っておきたいというか、運用的なこともそうだし、プロダクトを成長させていく体験がちょっとでも出来たら良いなと思っている。使われなければ中々難しいかもしれないけど。

コンセプト

気軽に使えるちょっとしたGISという感じ。痒い所に手が届くとまでは行かないと思うけど、ちょっとこれだけ欲しいみたいなものを提供できれば良いかなという感じ。実は最初はLittleGISで開発していて、ドメインとかも取ってたんだけど、なんかちょっと字面がかっこ悪い感じがしてTinyGISに変えた。名前はイカしてると思う。

技術スタック

スタックはしてないんだけどね。

Java/Spring Boot/Gradle

これは仕事で使っているので勉強もかねてという感じ。Spring Frameworkはフルスタックなフレームワークで割となんでも出来てしまう。なんでも出来てしまうから底が見えないしまるで把握できていないことが多い。基本的なAPIを作る感じはまあなんとなくできるけど、セキュリティの部分が難しい。Batch機能もちょっと癖がある気はする。あとは公式ドキュメントがまったく馴染まない。Springはそのフルスタックさをカバーするように割とというか結構ドキュメントは網羅されている感じがある。ただしどこかに書いてはあるんだけどどこに書いてあるかが見つからない。まあ膨大過ぎるし仕方のない部分はある。Spring FrameworkはDIとAOPとか言う機能をメインにしている感じで、フレームワークそれ自体にもそれらが散りばめられている感じ。そしてこれでもかというぐらいOOP的なコードになっている感じがする。なので学習的にもSpring Frameworkのコードを読みたいとは思えど、その膨大さにとっつけずにいる。

実際のアプリコード自体はまあ仕事でも使ってるし、そこまで難しいことはやってないのでそんなに苦労してない。Spring Securityの部分とJavaでジオメトリー情報を扱うところ以外は。

Gradleも仕事で使ってるので。ほとんど分からんけどね。

Linode

IaaSとしてLinodeを使ってみています。Rebuld.fmで宣伝されててクーポンも配布していたので。まあなんか勢いのありそうなIaaSだと思っている。コンピュートインスタンスぐらいしか使ってないので使用感もくそもないけど特に不満はないかな。値段も高くも安くもないと思う。今は$20の請求が3000円になってて渋い顔になってるぐらい。良い点はドキュメントが良い。ただの手順的なものでなく、なんかちゃんと解説してくれてる (Linodeの仕様だけじゃなくてLinuxとかそのサービスのベースとなる知識まで) 感じで勉強になってとても良いと思った。

Ubuntu

LinodeインスタンスとしてUbuntuを使ってる。まあ普段も使ってるし馴染みあるので。というか今CentOS系が選ばれることってあるのかな?アプリケーションはそのまんまjarをsystemdで動かしている。コンテナベースも考えたけどそれならマネージドのオーケストレーションツールが使いたいとは思うし、たぶん予算的に微妙な感じになるので見送った。あとはJavaエンジニアをずっとやってはいるのですが、普通にそのまんまjarで運用したことが実はなかったのでそれをやってみたかったのもある。

PostgreSQL/PostGIS

MySQLでもGeometryは扱えるんだけど、ちょっと試した感じPostGISの方が早い気がしたのでそっちにしてる。DBはアプリと同じインスタンスに建てている。マネージドDBを使ってみたいところだけど、PostGISというちょっと特殊な感じだし、そもそもマネージドDBって値段が張ることが多くて手が出ない感じ。その点でAWSとかGCPは候補から外れた感じになってる。今回でいろいろ調べたけど大手IaaSは個人の趣味開発レベルだと上手く使えないと予算的に合わないことも多い気がする。

Prometheus/Grafana

普段は置き去りにしやすいけど監視という分野にチャレンジしてみている。いまだに激浅なのだけれどもなんかいろいろ試したりみたいなのが思い浮かばないので学習もしづらく悩みのタネではある。実際にサービスが使われ始めたらちょっとはモチベーションが出るのだろうか。仕事でもちょっと触れたのでこの構成にしているだけ。インスタンスはアプリと分けている。

Next.js/Vercel

Webサイト。まあこのブログとかもそれでやってるので。というかTinyGISのWebサイトが実はNext.js/Vercelでの開発として初めてだった。

CircleCI

CI/CD (実際はCDだけなんですが) は実は最初はJenkinsを使っていたんだけど、ビルドサーバーを分けたかったのでJenkins用のインスタンスを建てていた。まあ個人開発レベルならビルド数は多くないし、節約したかったのでCircleCIに移行した。GitHub Pushでビルドからデプロイまでやってる。

Windows/WSL2 (Ubuntu)

開発環境。もうずっとこれ。VSCodeもそうだしGitHubもそうだけど、Microsoftは開発者向けに良くやってるイメージがここ数年である。俺もスタバでMacを使いたいとは思うけど、特に移行する理由も見つからない。まあ開発だけならもうUbuntuとかで良い気はしてるけど、ゲーム機としてWindowsPCは維持し続けるだろうし2PCは予算が下りない。

VSCode/devcontainer

一時期からWebとかPythonとかはこれでやってる。コンテナに開発環境を切り離せるのでホスト側を綺麗にしておけるのが良いのと、構成はコードベースで管理できるので使いまわしがとても楽。Docker周りで躓くことも多いけどまあ何とかなっている。

IntelliJ

Javaのものはこれで。これを機にサブスク加入してみた。完全に手に余る感じ。まあでもモチベーションにもなったし良いとは思ってる。仕事ではEclipseを使っていてまあ良いのだけれどもうちょっとモダンな感じが良いなーとは思っていた。VSCodeでのJava開発も何度かチャレンジしているけど、ちょっともっさりしてしまう感じがある。IntelliJ、半分ぐらいでも使えるようになったらカッコよいんだろうなぁ。半分が膨大そうだけど。

アプリケーション

RestAPIとGeometryデータ登録のBatchの2つに分かれています。Spring BootでのRestAPIとSpring Batch。

API

Geometry情報の検索をしてるだけなので中身はほとんどない。APIの定義はOpenAPIで定義して、Javaのモデルだけ自動で生成するようにしている。

Batch

Geometryの元データのURLを管理していて、ダウンロードからDBへの登録まで一括でやるようにしている。JavaでGISを扱うのはGeoToolsを使っている。

運用とか

ログの監視はちょっと工夫した感じで、PythonスクリプトでDiscordに通知するようにしている。中身的にはログファイルをtailっぽいことをしてエラーログがあればDiscordのWebhookを呼ぶ感じ。

構成

こんな tinygis

感想

中身的には大した事はしてないのでアレなんだけど、サービス開発の一通りが出来たと思うのでそれは良かった。ちなみに利用者はまだいない。まあそれは想定済みなので良い。リリースして以降はあまり触れていない。ブログとか他プロダクトを触っていたので。あと一つ他プロダクトの作業が残っているので手が入るのは来年ぐらいになりそうな気がしている。とりあえず対応国が日本と米国だけなのでそれを増やしたい (Geometryのリソースを見つけるのが面倒) のと、APIキー発行が今は手作業なのでそこを改善したいと思っている。まあ気長にやっていこうと思っている。予算的には3000円/月までぐらいを目安にしたかった。今は円安の影響もあってちょうどそのぐらいになっている。使われるまではモニタリングのインスタンスは落としておけるので節約のために検討したい。マネタイズは特に考えてないし勉強と趣味代なのでそれほど気にしてないけど、なるべくお金のかからないようにはしたい。

開発はまあその時のモチベーションによるんだけど、全体的にはまあ楽しくある。満足しています。