読者です 読者をやめる 読者になる 読者になる

Persistence

続けることに意味がある。

メディア芸術データベースのラッパーGemを作ってみました

Ruby

はじまり

数日前、こんな記事を目にしました。

nlab.itmedia.co.jp

なんともすごいデータベースが公開されました。しかも利用規約によると、データベースの情報は自由に使うことができて商用利用もOKとのこと。このデータベースを使って何かのサービスを作ろうと考える人も多いのではないでしょうか。しかし、今のところ情報を取得する手段がサイトから検索するしかないので、データベースの情報をスクレイピングするRubyGemを作ってみることにしました。

メディア芸術データベース

メディア芸術データベース

簡単にサイトの説明と、今回作成したgemでアクセスできる範囲を説明します。

サイトには大きく分類して次のデータがあります。

  • マンガ
  • アニメ
  • ゲーム
  • アート

この中で、今回対応したのは「マンガ」のみ(資料、原画を除く)です。また、蔵書情報など我々が使う上では必要性が低そうな情報は対応していません。

マンガ情報の内容として、次のデータがあります。

  • マンガ単行本作品情報・・・あるマンガの単行本や掲載雑誌などの全体的な情報
  • マンガ単行本全巻情報・・・あるマンガの単行本全巻の情報
  • マンガ単行本情報・・・あるマンガの単行本1巻の情報
  • マンガ雑誌掲載作品情報・・・あるマンガの掲載雑誌全巻の情報
  • マンガ雑誌全巻情報・・・ある雑誌の全巻の情報
  • マンガ雑誌情報・・・ある雑誌の1巻ごとの情報
  • 著者情報・・・ある著者の作品などの情報
  • 資料情報・・・あるマンガの資料の情報
  • 原画情報・・・あるマンガの原画の情報
  • その他情報・・・その他の資料(同人誌など)の情報

また検索方法としては大きく分けて次の方法があります。

  • マンガタイトル検索
  • 雑誌タイトル検索
  • 著者名検索
  • 詳細検索

はじめてのRubyGem

RubyGemを作るのは初めてですが、スクレイピングは得意技なので簡単にできるだろうと軽い気持ちで作り始めました。しかし、このデータベース、サイトもデータも意外と複雑な構造になっていて、gemのインターフェイス設計にかなり悩みました。

例えば、1つの検索方法から得られる結果が1種類だけではなく複数種類が混在している場合があることや、検索の詳細条件がたくさんありインターフェイスとしてどう表現するか、返された値をどのように表現するか、など。

ぱっと思いついたのは、ActiveRecordのようにそれぞれの情報をそれぞれのClassにして、あるデータの小データをメソッドで取得したり、その逆であったり横方向であったり・・といった機能までできればと思いましたが、まずは単純に検索してハッシュデータを取得だけの機能をサイトやデータの構造にそって作ることにしました。(こういう時に、他の人のコードを読むって大事だなと思います。)

Rubyが分かってない

作り始めてすぐに、Rubyの基本的なことが分かっていない(または忘れている)ことに痛感しました。やっぱりRailsだけやっててもRubyを書けるようにはならないですね。ふだんRailsで使ってるあの機能はどうやって作られているんだろうとか色々と関心が湧いてきました。ソースを見てもらえるとRuby力が低いのがすぐわかると思うので、色々とご指摘を貰えたらと思います。

あと、Rspecを書くのも久しぶりだしRailsでしか書いたことがなかったのでどうしたものかと思いましたが、公開するならさすがに書かないとダメだろうと思い、他のgemのspecなどを眺めながらなんとか書いていきました。これは本当に書いて良かったです。というのも、最初から最後まで色々とインターフェイス設計を試行錯誤していたのでspecがあることで修正漏れが見つけられたのは非常に安心感がありました。テスト大事、テスト大事。

RubyGemsへリリース!

ということでリリースしました。使い方はGithubの方に書いてありますが、詳細なDocument(YARD)は書きませんでした。やっぱりインターフェイスを見なおしてActiveRecordのようにしたいので、書くならその時に書きます。あとは、Travis CIで自動テストさせるようにしました。他にもGithubと連携してくれるツールがたくさんあるので調べてみたら面白そうです。