窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

ASP.NET Core と Realm Object Serverを使ってクライアントとマスターデータの共通化を試してみたい

雑記とメモです.

現在作っている東北大学大学祭アプリのデータベースにRealmを使用しています.

昨年はサーバーはPythonDjangoで作成して,データベースはMySQLを使用していました. しかしクライアント側はRealmを使用していて,同期の難しさが問題となっていました.

そこで今回はサーバーサイドもRealmにしてしまいました. いいタイミングで.NET Core対応も来ていたところでもあるので.

blog.realm.io

そこで詰まったことと気づきをちょこっと書いていきます.

気づきとかつまったところ

  • 他のユーザーとデータベースを共有する設定のやり方がわからない

realm://{Realm Object Serverのアドレス}:{ポート}/__admin を開いて Permission のところで権限を与えたいユーザを追加する. 自分はこの方法でやったけれども,絶対に別の正しいやり方があるはず…

  • mayRead を与えた DB に書き込めない

ローカルのコピーになら書き込めるんでしょとか適当に考えていたらダメだった. 今回はマスターデータに追加のフィールドとしてお気に入りとかの boolean を追加したいと思っていたのだけれども,ダメそうなのでローカルに新たにそれ専用のフィールドを持った DB を作ってそちらに書き込む.

  • masterデータを管理するユーザに関して

今回は運営の人にデータを入れてもらうので,Admin以外で運営専用のアカウントを作成.間違って他のテーブルを破壊されても困りますしね.

  • Dockerで EXIT 99 になって動かない

未解決,どうしよう.とりあえずログ見てみよう.

  • Credentials.UsernamePassword(ユーザー名, パスワード, false)にしてるのに,create が常に True になる

こればっかりは本当に原因がわからなかった.dotnet clean とか rebuild とか試してたらいつの間にか出来るようになってた.

  • (追記)プロジェクトのある型だけをSchemeとして使用したい

JavaとかSwiftのやつでは見覚えがあって,dotnet ではどうするんだろうと悩んでいたけれども,頑張ってAPIドキュメントを探すと見つかる.

Class RealmConfigurationBase | Realm

と思ったらちゃんと書いてある…

https://realm.io/docs/xamarin/latest/#class-subsets

  • (追記 8/30) dotnet コマンドでビルドが出来ない

公式ドキュメントに

The dotnet command line tool is not supported when building for .NET Core. Please use Visual Studio or the msbuild command line tool to build your project.

こうあるように,Visual Studio を使うか,MSBuild コマンドでビルドすればいい. で,不親切なことに近くに MSBuild での注意点が書いてない…

ビルド方法は CI でビルドする時,みたいな Q&A を参考にすれば良い

VSCode とかでビルドタスクを書いてもいいし,コマンドラインから以下の様にすれば Fody のタスクが走って,いい感じに Realm が使える.

msbuild /p:SolutionDir=$(pwd)

(追記 9/5)

実際毎回 SolutionDir のパラメータを付けるのは面倒なので,ちょっとした対策をしてみた.

ソリューションファイル(.sln) があるのであれば,そのディレクトリとの相対パス

<PropertyGroup>
    <SolutionDir>..\</SolutionDir>
  </PropertyGroup>

こんな感じで csproj に追加してあげる.これで msbuild 一発で通るようになる.


また何か辛くなったら追記しよう.

また学祭アプリはサーバーサイドもクライアントサイドもいい勉強材料だったり,イベントに使用できるテンプレートでもあるので,公開準備ができ次第公開します.

(追記 8/30) ちょっとした雛形は github.com で公開しています.

使用している技術としては

  • ASP.NET Core MVC + Razor Pages
    • 独自のトークン認証機構のMiddlewareとかその辺も盛り込んでます
  • Realm
  • Xamarin.Forms
  • Docker
  • MySQL(Realmで管理しないユーザーの登録とかアンケートの集計関係)
  • Redis(発行したセッショントークンの管理)

デプロイ先はAzure VMを予定.

十分話せる内容ですね,勉強会で登壇する内容が増えて嬉しい(?