💝PrismDBとかプリッカソンでやってたこと
ばんじゅんです。最近は「原宿駅からすぐ近くの表参道」でお仕事をしています。プリパラで好きな曲は HAPPYぱLUCKY です。 この記事はプリッカソン Advent Calendar 2019の18日目の記事です。昨日はやっちさんの「真中のんさんの魅力について」でした。まだの方は是非こちらも読んでみてください。
プリッカソンはプリティーシリーズにまつわるものづくりコミュニティです。
わたしは今年は4月・7月・10月のプリッカソンに参加しました。今年はPrismDBをネタにした活動が多めにしていたので,PrismDBとその周辺技術の話をざっくりまとめようと思います。特にブログにもしなかったし。私がやった作業の話というよりは,私の作業とその周辺で起きていたことのお話ということで,実際の立案や開発編集はここのコントリビューターの方々やその周辺でアドバイスをする人たちによるものです。
はじめに PrismDBの基本スペック
PrismDBはプリティーシリーズの情報をまとめるプラットフォームで, https://prismdb.takanakahiko.me でホストされている。プリティーシリーズのキャラクター・アニメ・楽曲・筐体があるお店・筐体のアイテムがまとめられるべく,データが追加編集されていっている。
プリッカソンのようなイベントで,キャラクターの名前一覧が欲しいときに使うというようなシンプルな利用から,SoLaMi♡SMILEがアニメ中でライブをした話数とそのときのコーデと曲を一覧を取得するような利用もできるように想定している。(現状ではアニメ中のコーデのデータは足りていないと思われるが原理上は・・・!協力あるとうれしい)
現時点では元データはgithubで管理されている。
データの種類ごとに分かれたCSVにデータを入れてPulll Requestしてマージされると上記サイトにホストされるので,Web UIで見たり,SPARQLのクエリを投げたり,RESTで取り出せる。現時点で35キャラクター・106楽曲・300エピソード・227ライブ・2983アイテム・2289店舗が登録されている。
ところで
今年のライブはマイパマ、マイパマ、マイパマ、マイパマ、オオサカプ、マクパリに行きました。
PrismDBの変遷
ハッカソン系のイベントでなにかサービスを開発しようとしたときに,作品の基本情報が既にまとまっていると便利なことがある。アイマス界隈 では im@sparql というSPARQLエンドポイントがあったので,それを成功事例として,プリパラでも情報をまとめようとした。
はじめはプリパラDB(仮)と呼ばれていて,Firebase Realtime DatabaseにJSON様の構造で書いていた。お手本となるim@sparqlではRDFのXML(例)を編集する必要があったため,データ編集作業をもっと簡単にできないかということで,Googleスプレッドシートを使うとか,編集用のWeb UIをつくるなどが検討されたが,多様なデータ構造を扱うのはそんなに簡単でもなく,「差分で見たい」「データ破壊があっても平気なようにバックアップしたい」を満たすために,githubにCSVでデータを置いてJSON変換して表示するように移行,さらにRESTのユースケースを事前に定めて実装することなくデータに直接ク エリを投げられるよう,また他の作品のエンドポイントと相互接続できるよう,RDF変換してSPARQLエンドポイント提供がされるようになった。
RDFというのは,キャラクターや楽曲などの対象にURIを付け,そのURI間やURIと文字列などの値(キャラクターの名前とか)のあいだに関連を貼るだけの構造で,繋がりの自由度は高い。しかしそのまま書くのは難しい(あるいは敷居が高い)。実際にある対象(例えばプリパラ13話)の編集作業を(たくさんすることを)考えると,表を作る作業とあまり変わらないことも多いので,データを書く人が単に表感覚で編集できるようにCSVで書けるようにしている。
githubにデータを置くことによって得られるメリットは様々だが,github慣れしていない場合に編集に参加しづらくなるのではという懸念がある。githubはGoogleではないのでスプシのように編集できるわけではない。(MSに買収されたので,そのへんの技術で,CSVをいい感じにWeb上で編集してPRできるようになったらいいなぁ)。データ追加事例ではぐんそーさんの PrismDBにアイテムデータを追加してみた|ぐんそー|note がパワーがあってすごい。
ところで
Winterのキラリスト・ジュエリスト良きでしたね。
music.apple.comSwiftSparql — SPARQLをSwiftで使う
いっぽう私は2月にほぼ無職期間があったので,Swift用にSPARQLのクエリジェネレーターと結果パーサーを作った。
これは半分くらいはSPARQLの構文をSwiftの型に落とす肉体労働だったので寝ぼけながらもアイドルはキンリョクということで乗り切った。
少しはSPARQLの文法が分かるようになり,文字列リテラル一致のセマンティクスが分かりづらいので言語文字列リテラルを使わないほうがミスりにくいとか,タイプ(rdf:type
)を付けるとクエリ(とクエリジェネレータ)を書きやすいとか,そのタイプごとに語彙(述語のリスト)を把握したほうがよいとか,の知見を得た。
得られた知見をもとに,これらいくつかの設計をした。TypeScriptを書いたことはなかったが、まぁなかひこくんがレビューしてくれるしな、って書いた。
ところで
ロケットハートもライブで聴きたいですね。
music.apple.comプリッカソンでやってたこと2019
4月は,アニメのライブ部分だけを無限再生するアプリ作ろうかなと思って,もしライブの時刻アノテーションがPrismDBにあったとしたら,で再生部分が作れるかを試した(banjun/PrismTV)。今となっては,再生の仕組みと,アノテーションをPrismDBに追記する仕組みは,分離せずにひとつのワークフローの中で出来るようにしないと手間が減らなくて進まないなと思っている。
7月は,SwiftSparqlをSwift 5対応にしたあと,PrismDBの語彙であるところのプリズム語彙の補完に対応させた。プリズム語彙って言うとかえって難しく見えそうでもあるが,単にPrismDBで使われている述語の一覧のこと(prism-schema.ttl)である。
10月は,Xcode 11のSwiftで使えるFunction Buildersの構文を使って,クエリジェネレータの不要なインデントを落としてすっきり書けるようになるかを試した。結果としては効果は大きくなかったしより適用を増やせばデメリットも増えていきそうだったので保留にしている。未着手の新機能系では,Xcode Previewsに対応させたほうが楽しそうである。
おねがい!
SoLaMi♡SMILEにも新曲をください!
PrismDBデータ化における概念の難しさ
比較的自由な構造でデータを追加できるようになったとはいえ,プリティーシリーズ特有の概念の難しさと向き合わなければいけない局面は出てきて,これはプリティーシリーズに詳しい女児のみなさんがプリッカソンで集まったとしても概念の統合と分離には諸説出てしまうくらい難しいようなネタがあるようだ。一例としてはこんな問題(問い)があるので,わたしのように,果たして真中らぁらとはなんであるのか・・・と考えてみるのも楽しいと思う。複雑性を楽しみつつもデータは充実させていこう。
- 大らぁら(プリパラらぁら)と小らぁらは別のキャラクターなのか?
- 2019年12月発売のプリパラ設定資料集(上)では別エントリー扱いになっているとも読めるが・・・?
- 「らぁら&みれぃ」はチームなのか?
- 任意のキャラクター同士の組み合わせはチームであるのか?楽曲があるか?一緒に歌ったか?結成式をしたか?
- アニメ中の(劇中)ライブとリアルのライブ(プリパラWinterライブ2019とか)の両方に「ライブ」という名前はややこしい
- ライブはショーなのか?
- リアルライブのセットリストの毎回信頼できる情報源は存在するのか
- おともだちのツイート?BD発売されると分かる?メディアのレポート?
- アニメのコーデと筐体のコーデは同じ?異なる?
- デザインは一致しているのか? 筐体はパーツ,アニメはひと揃いで出現・名付けがされる?
- 筐体アイテムのIDはなんなのか?採番が被っている例がある?
- そらみドレッシングはi☆Risなのか?
- キャラクターならそらみドレッシングで中の人ならi☆Ris?OP/EDやCDの名義との一貫性は?「Run Girls, Run! ※アーティスト」パターン?
- 一人二役(1声優:複数キャラクター)はどこまで扱えるのか?
- ライブの出演者リストでは複数役かどうか区別されてそう?曲からどちらかが決まる?衣装?Make it!歌ってたらどうする?
おわりに
そのままでは絵として見えてこないということで、やっぱりなんだかよく分からないものをやってる感はやはり出てしまうのかなぁ、分かりやすい成果物がほしいなぁとは思いつつ。でも直近で欲しいのって,PrismDBから出力されPrismDBに追従して更新されていく漢字変換辞書だったりして。。それもまた地味かもしれないですね。でもほしくないですか?
プリッカソンアドベントカレンダーの明日はダンディ(閣下)さんです。そちらのチャンネルもぜひご覧ください。つながる広がるフォロワーの輪!! ステキな番組 ON AIR!!