「牛の舌って薄いんですね」

(出典:蒼樹うめ『ひだまりスケッチ』6巻11ページ「一頭から一枚」3コマ目)

『☆ピコピコプラネット☆』を使ってみる

この記事は、アイドルマスター Advent Calendar 2019 の 3 日目の記事です。

3 日目が空席でしたので、昨日の記事に引き続き、『☆ピコピコプラネット☆』について書かせていただきたいと思います。

アルバム情報の取得

『☆ピコピコプラネット☆』で現状最も情報が多いのがアルバム情報です。ランティスのミリオンライブのページに掲載されているものから、ソロコレクション、コミックの特典まで網羅しています。

そのアルバム情報の SPARQL での引き方について見ていきましょう。

アルバムと曲の関係

まず『THE IDOLM@STER LIVE THE@TER PERFORMANCE 01』(LTP01)のリソースの記述を見てみましょう。

<LTP_01> a :MusicAlbum ;
    :name "THE IDOLM@STER LIVE THE@TER PERFORMANCE 01" ;
    :numTracks 4 ;
    :track [
        a :MusicRecording ;
        :recordingOf <Thank_You> ;
        :byArtist <765_MILLIONSTARS> ;
        :position 1
    ] , [
        a :MusicRecording ;
        :recordingOf <Thank_You> ;
        :byArtist <765PRO_ALLSTARS> ;
        :position 2
    ] , [
        a :MusicRecording ;
        :recordingOf <Thank_You> ;
        :byArtist <765THEATER_ALLSTARS> ;
        :position 3
    ] ;
    :albumRelease [
        a :MusicRelease ;
        :url <https://www.lantis.jp/imas/release_LACM-14080.html> ;
        :image <https://www.lantis.jp/imas/img/release_imgs__0011s_0012_LTP01_H1.png> ;
        :catalogNumber "LACM-14080" ;
        :datePublished "2013-04-24"^^xsd:date
    ] ;
    :isPartOf <LTP_Series> .

『☆ピコピコプラネット☆』では、schema.org をベースとして記述しているため、http://schema.org/プレフィックス: をあてています(普通は schema: が使われることが多いです)。こうすることで記述量を減らせるというメリットがあります。

:track は複数の :MusicRecording を持ちます。その :MusicRecording:recordingOf:MusicComposition(曲)を、:byArtist:MusicGroup(ユニット)を持ちます。

:track に直接曲名やユニット名を記述しないのは、アルバムと曲は多対多の関係にあるからです。アルバムは複数の曲を収録していますし、曲は複数のアルバムに収録される可能性があります(アーティストが違う場合もある)。

LTP01 に収録されている曲とアーティストを取得するクエリは以下のようになるでしょう。

BASE <https://mltd.pikopikopla.net/resource/>
PREFIX : <http://schema.org/>

SELECT ?song ?artist
WHERE {
  <LTP_01> :track [
    :recordingOf/:name ?song ;
    :byArtist/:name ?artist
  ] .
}

:recordingOf/:name ?song:recordingOf [ :name ?song ] と記述するのと同等です。

ユニット名のないユニット

:byArtist が取りうる値には現状 3 パターンあります。

  • ユニット名ありの :MusicGroup
  • ユニット名なしの :MusicGroup(空白ノード)
  • アイドル mltd:Idol

例えば、LTP02 は以下のようになっています。

<LTP_02> a :MusicAlbum ;
    :name "THE IDOLM@STER LIVE THE@TER PERFORMANCE 02" ;
    :numTracks 13 ;
    :track [
        a :MusicRecording ;
        :recordingOf <キラメキ進行形> ;
        :byArtist <天海春香> ;
        :position 2
    ] , [
        a :MusicRecording ;
        :recordingOf <透明なプロローグ> ;
        :byArtist <七尾百合子> ;
        :position 4
    ] , [
        a :MusicRecording ;
        :recordingOf <トキメキの音符になって> ;
        :byArtist <箱崎星梨花> ;
        :position 6
    ] , [
        a :MusicRecording ;
        :recordingOf <Maria_Trap> ;
        :byArtist <天空橋朋花> ;
        :position 8
    ] , [
        a :MusicRecording ;
        :recordingOf <Precious_Grain> ;
        :byArtist <最上静香> ;
        :position 10
    ] , [
        a :MusicRecording ;
        :recordingOf <Legend_Girls> ;
        :byArtist [
            a :MusicGroup ;
            :member
                <天海春香> ,
                <天空橋朋花> ,
                <七尾百合子> ,
                <箱崎星梨花> ,
                <最上静香>
        ] ;
        :position 12
    ] ;
    :albumRelease [
        a :MusicRelease ;
        :url <https://www.lantis.jp/imas/release_LACA-15300.html> ;
        :image <https://www.lantis.jp/imas/img/release_imgs__0011s_0011_LTP02_H1.png> ;
        :catalogNumber "LACA-15300" ;
        :datePublished "2013-05-29"^^xsd:date
    ] ;
    :isPartOf <LTP_Series> .

『Legend Girls』を歌唱しているユニットにはユニット名がつけられていないため、:name を持たない :MusicGroup の空白ノードを記述しています。

したがって、LTP02 に収録されている曲名と歌っているアイドルを取得するクエリはこのようになります。

BASE <https://mltd.pikopikopla.net/resource/>
PREFIX : <http://schema.org/>

SELECT ?song (GROUP_CONCAT(?artist) AS ?members)
WHERE {
  <LTP_02> :track [
    :recordingOf/:name ?song ;
    :byArtist/:member?/:name ?artist
  ] .
}
GROUP BY ?song

ちょっと複雑になりましたね・・・ちなみにこれを <LTP_01> でやるとうまくいかないです(あかんやん)。

OPTIONALIF を組み合わせれば、いい感じに取得することは可能だと思います。多分・・・ちょっと思いつかなかったです。

可能性は無限大?

締まりのない終わり方でしたが、使い方次第でいろいろなことができると思います。SPARQL クエリの書き方が難しいですが・・・

みなさんもぜひ触ってみてください。

mltd.pikopikopla.net

宣伝です!

今週末の 12 月 7 日(土)、アイマスハッカソン 2019 が関東と関西で同時開催されます。参加者はまだ受付中ですので、ご興味ありましたら是非ご参加ください!

『☆ピコピコプラネット☆』が誕生しました

この記事は、アイドルマスター Advent Calendar 2019 の 2 日目の記事です。

この記事では、先日公開した『☆ピコピコプラネット☆』の紹介をさせていただきたいと思います。

『☆ピコピコプラネット☆』とは?

『☆ピコピコプラネット☆』は、『アイドルマスター ミリオンライブ!』の情報を Linked Open Data(LOD)によって提供する非公式のオープンデータプラットフォームです。

例えば、ランティスのミリオンライブのページを見に行けばアルバム情報が手に入りますが、人間が読むために書かれた内容であり、機械が読むためにはひと手間が必要です。

『☆ピコピコプラネット☆』では、こういった情報を RDF というメタデータを記述するための統一された枠組みに従って提供しています。正規化されたメタデータで記述されているため、機械で使用するのに都合がいいのです。

この RDF を読んだり、後述する SPARQL を用いて検索したりすることで、ミリオンライブの情報を使用したアプリを作ることも可能になります。

RDF の詳しい説明については、わかりやすい解説サイトや W3C 勧告がありますので、そちらに説明を譲ります。

このようなメタデータを共有するための技術の総称を Linked Open Data(LOD)といいます。

『im@sparql』との違い

みなさんのなかには、類似する LOD の『im@sparql』をご存知の方もいらっしゃるかもしれません。『im@sparql』は、広がるアイマスワールドをオープンデータ化する LOD プラットフォームです。アイマスの各シリーズを横断的にアイドルの情報などを提供されています。

『☆ピコピコプラネット☆』は、『im@sparql』が提供していないアルバムや楽曲、声優さんの情報など、ミリオンライブに関することという切り口から、なんでもオープンデータ化することをコンセプトにしています。今後は、ライブや書籍、ミリシタのゲーム情報などを追加していきたいと考えています。

ちなみに、筆者は『im@sparql』のコントリビュータでもあります。『☆ピコピコプラネット☆』では、アイドルの情報などで『im@sparql』へリンクさせることにより連携しやすくなる工夫をしています。

情報を検索する

データを正規化すると容易になるのが検索です。RDF クエリ言語の SPARQL を用いることで、RDF で記述されたリソース(情報)を SQL のように検索できます。

SPARQL は HTTP を介して発行できるため、Web API のように使用できます。

SPARQL の詳細についても、他の解説サイトや W3C 勧告に説明を譲ります。

この記事では、『☆ピコピコプラネット☆』の実際のクエリ例をいくつか紹介します。以下で紹介するクエリは、『☆ピコピコプラネット☆』のトップページにあるフォームにコピペすることで、実際に試すことができます。

詳しい解説ができなくて申し訳ないですが、アイデア次第でいろんなクエリを書いて検索できるので、みなさんも試してみてください。提供している RDFGitHub で公開していますので、SPARQL を書くときの参考にしてください。

https://github.com/foooomio/pikopikoplanet/tree/master/dataset

アイドルの名前とタイプを取得する

PREFIX mltd: <https://mltd.pikopikopla.net/mltd-schema#>
PREFIX : <http://schema.org/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?name ?type
WHERE {
  ?s a mltd:Idol ;
    :name ?name ;
    mltd:typePrFaAn/rdfs:label ?type ;
    :position ?position .
}
ORDER BY ?position

七尾百合子が参加している楽曲

PREFIX mltd: <https://mltd.pikopikopla.net/mltd-schema#>
PREFIX : <http://schema.org/>

SELECT ?album ?position ?song
WHERE {
  ?s a :MusicAlbum ; 
    :name ?album ;
    :track [
      :recordingOf/:name ?song ;
      :byArtist/:member?/:name "七尾百合子" ;
      :position ?position
    ] .
}

収録された回数の多い楽曲

PREFIX : <http://schema.org/>

SELECT ?song (COUNT(?song) AS ?count)
WHERE {
  ?s a :MusicAlbum ;
    :name ?album ;
    :track/:recordingOf/:name ?song .
}
GROUP BY ?song
HAVING (?count >= 2)
ORDER BY DESC(?count)

ミリオン声優のTwitterアカウント

PREFIX mltd: <https://mltd.pikopikopla.net/mltd-schema#>
PREFIX : <http://schema.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?name ?account ?url
WHERE {
  ?s a mltd:VoiceActor ;
    :name ?name ;
    foaf:account [
      foaf:name "Twitter" ;
      foaf:accountName ?account ;
      foaf:page ?url
    ] .
}

im@sparql からアイドルのイメージカラーを引いてくる

PREFIX mltd: <https://mltd.pikopikopla.net/mltd-schema#> 
PREFIX : <http://schema.org/> 
PREFIX imas: <https://sparql.crssnky.xyz/imasrdf/URIs/imas-schema.ttl#>

SELECT ?name ?color
WHERE {
  ?s a mltd:Idol ;
    :name ?name ;
    :position ?position ;
    :sameAs ?uri .
  SERVICE <https://sparql.crssnky.xyz/spql/imas/query> {
    ?uri imas:Color ?color
  }
}
ORDER BY ?position

フィードバック受付中!

『☆ピコピコプラネット☆』は、まだ生まれたばかりのサービスです。よりよいサービス提供のために、ご意見・ご感想を募集しています。また疑問点などありましたら、どんどん質問をお寄せください。

IM@Study Slack の #pikopikoplanet で受け付けております。みなさまのコントリビュートをお待ちしております!

宣伝です!

今週末の 12 月 7 日(土)、アイマスハッカソン 2019 が関東と関西で同時開催されます。参加者はまだ受付中ですので、ご興味ありましたら是非ご参加ください!

(『☆ピコピコプラネット☆』が使ってもらえたら嬉しいな〜)

mltd.pikopikopla.net

ニコニコ動画のニコレポをミュート・ハイライトするGoogle Chrome拡張機能「ニコレポ・フィルター」

 ニコニコ動画のニコレポタイムラインにミュート・ハイライト機能を追加するGoogle Chrome拡張機能「ニコレポ・フィルター」を公開しました。

特徴

f:id:foooomio:20170721002640p:plain

  • ニコニコ動画のニコレポを投稿の種類によって、ミュート・ハイライトの設定ができます。以下、例。
    • 「ユーザーの再生数キリ番達成をミュート」すると、「○○ さんの動画が ○○○○ 再生を達成しました。」というニコレポが表示されなくなります。
    • 「ユーザーの動画の投稿をハイライト」すると、「○○ さんが 動画を投稿しました。」というニコレポがハイライト表示されるようになります。
  • ハイライト色は5種類から設定することができます。
  • 設定されたルールは、Google Syncで自動的にお使いのGoogle Chromeに共有されます。

追加予定の機能

  • 条件を削除せずに、編集できるようにします。
  • ユーザ名で絞り込むなど複雑な条件を設定できるようにします。
  • ニコレポの通知機能を搭載します。

使い方

  1. ニコニコ動画のマイページで、ブラウザの右上に追加される拡張機能のアイコンをクリックします。
  2. 「投稿者」「行動」「アクション」の条件を選択し、「+」ボタンをクリックします。
  3. ルールを削除する場合は、削除したいルールの右にある「×」ボタンをクリックします。

インストール

chrome.google.com

ソースコード

github.com

バグ報告・機能提案

 拡張機能のサポートタブ、または、GitHubのIssueにてお願いします。

余談

 似たような機能を提供する「ニコニコ除ニコレポ」という有名な拡張機能がありますが、こちらだとハイライト機能がなかったため、自分で作り直すことにしました。

 ミュートの条件をより多くの投稿に対応したり、UIにこだわったり、単純なコピーにならないよう頑張ったつもりです・・・!

三菱東京UFJ銀行のATMマップを作った

皆さんの銀行口座はどちらにお作りでしょうか。自分は三菱東京UFJ銀行をメインバンクにしているのですが、一定以上の利用で自行ATM手数料が終日無料になるといった利点があります。

そのため三菱東京UFJ銀行のATMを使うことが多いのですが、Googleマップで検索すると出てこないATMがあったり、三菱UFJ信託銀行が引っかかったり、ちょっと面倒でした。

そこで

三菱東京UFJ銀行の公式サイトからゴニョゴニョしてきて、Googleマイマップにしてみました。

drive.google.com

スマホでリンクを開くとGoogleマップが立ち上がる(iPhoneでアプリ内ブラウザが立ち上がる場合は、Safariで開き直す)ので、今後ハンバーガーメニューから表示/非表示を切り替えることができます。消えてしまった場合でも、マイプレイスを探せば見つかるはず。

更新頻度について

GoogleマイマップにAPIがなく、Google Apps Scriptからもいじれないので、公式サイトからゴニョゴニョしてくるところ以外は手作業です。運用でカバー、っていうやつです。

1日1回更新通知を入れてますが、その後はすべて手作業なので、若干のタイムラグはご容赦ください。

免責

このマップは三菱東京UFJ銀行の公式サイトから独自にデータを収集したものであり、株式会社三菱東京UFJ銀行とは一切関係ありません。また正確性を保証するものではなく、利用者に生じる不都合や損害には一切責任を負いません。

さいごに

三菱東京UFJ銀行の公式アプリでATM・店舗検索できるらしいorz

823年ぶりらしいので調べた

4行で収まる条件は、

  • 2月が日曜日から始まる
  • うるう年でない

の2つなので、ちゃちゃっと計算させてみましょう。

require 'date'

2015.downto(0) do |year|
  date = Date.new(year, 2, 1)
  puts year if date.wday == 0 && !date.leap?
end

結果は、

$ ruby date.rb 
2015
2009
1998
1987
1981
1970
1959
1953
1942
1931
1925
1914
1903
1891
1885
1874
1863
1857
1846
1835
1829
1818
1807
1801
1795
1789
1778
1767
1761
1750
1739
1733
1722
1711
1705
1699
1693
1682
1671
1665
1654
1643
1637
1626
1615
1609
1598
1587
1579
1573
1562
1551
1545
1534
1523
1517
1506
1495
1489
1478
1467
1461
1450
1439
1433
1422
1411
1405
1394
1383
1377
1366
1355
1349
1338
1327
1321
1310
1299
1293
1282
1271
1265
1254
1243
1237
1226
1215
1209
1198
1187
1181
1170
1159
1153
1142
1131
1125
1114
1103
1097
1086
1075
1069
1058
1047
1041
1030
1019
1013
1002
991
985
974
963
957
946
935
929
918
907
901
890
879
873
862
851
845
834
823
817
806
795
789
778
767
761
750
739
733
722
711
705
694
683
677
666
655
649
638
627
621
610
599
593
582
571
565
554
543
537
526
515
509
498
487
481
470
459
453
442
431
425
414
403
397
386
375
369
358
347
341
330
319
313
302
291
285
274
263
257
246
235
229
218
207
201
190
179
173
162
151
145
134
123
117
106
95
89
78
67
61
50
39
33
22
11
5

よくも騙してくれたな、のび太

ちなみに、グレゴリオ暦が制定されたのは1582年で、日本で採用されたのは1872年のことです。