ライセンス違反を、ビルドで落とす
「出典を書く」「使えないライセンスの写真を載せない」を人の注意力で守るのはやめました。データの検査をビルドの通過条件にした話です。
掲載データの検査は、多くの場合「型が合っているか」で終わります。文字列であるべき欄が文字列か、数値であるべき欄が数値か。しかし実際に事故を起こすのは型ではありません。型としては正しいが、約束を破っているデータです。
守りたかった約束
首里のガイドサイトでは、自前の写真が揃うまでのあいだ、フリーライセンスの写真で穴を埋めています。ここには守らなければならない約束が2つあります。
- 出典を明示する。 著作者名・ライセンス名・元ページのURL・ライセンスを確認した日を、写真ごとに持つ
- 使えないライセンスを採用しない。 非営利限定や改変不可の条件がついたものは、このサイトでは使えない
どちらも「気をつける」で守れる類のものに見えます。しかし写真は増えます。増えたときに、急いでいるときに、1件だけ確認日を空欄のまま入れてしまう。それが公開されます。
スキーマに約束を書く
そこで、データのスキーマに条件つきの検査を入れました。写真の出典がフリーライセンスのサイト由来である場合に限り、著作者・ライセンス・URL・確認日の4つを必須にするという書き方です。自前の写真ならこれらは不要なので、一律の必須にはできません。条件つきである必要がありました。
さらに、ライセンス名の文字列を検査して、非営利限定や改変不可を示す表記が含まれていたらエラーにするようにしました。エラーメッセージには、どのデータのどの欄が問題かを書いてあります。
これらの検査は、ビルド時に走ります。条件を満たさないデータがあると、サイトが生成されません。つまり、ライセンス違反の写真を含んだ状態では公開できません。
同じ考え方を、ほかのサイトでも
- 辞典サイト: 語のデータに出典の欄を必須にした。出典のない語は、書こうとしてもビルドが通らない
- 暦のサイト: 旧暦の計算結果を公的な暦の資料と突き合わせる検証を用意し、これを通らないとビルドが完了しないようにした
- データベース型のサイト: 必須項目が欠けたデータは公開されない。空欄を許す欄と、許さない欄を分けてある
共通しているのは、「守るべき約束」を文章ではなくコードに書いたという点です。ドキュメントに「出典を必ず書くこと」と書いておくのは、守る人の記憶に依存します。スキーマに書けば、守らない状態が存在できなくなります。
この方法の限界
検査が守れるのは、検査が見ている範囲だけです。ライセンス名の文字列に非営利の表記が含まれていないことは確認できますが、その写真が本当にそのライセンスで提供されているかは確認できません。元ページを人が見に行くしかありません。
だから確認日の欄があります。機械は「確認日が入っていること」を強制でき、「確認したこと」は強制できません。入力を強制することで、確認という行為を思い出させているという位置づけです。
それでも効きます。人が忘れるのは「確認しよう」と思う瞬間であって、確認そのものではないからです。空欄のままビルドが落ちれば、そこで必ず思い出します。
検査を増やしすぎると、今度は検査を通すためのその場しのぎの値が入り始めます。強制するのは「無いと公開してはいけないもの」だけに絞っています。
この記事の元
この記事は、「すいむいさんぽ」「ゆんたくことば」「沖縄こよみ」の制作で実際にやったことから書き起こしています。 方針そのものは運営方針にまとめています。