簡単なIIIFビューワを作ってみよう(1): IIIF Presentation APIの理解に向けて

IIIF Presentation APIについて、当ブログではこれまであまり言及してきませんでした。その理由は大きく二つあって、一つは、JSONを読める人なら必要があったときに見ればすぐにわかるのではないか、ということと、一方で、コンテンツの専門家のレベルでは、IIIF Presentation APIはほとんど何も決めていないに等しいので特に語るべきことはなく、さらに、ユーザレベルでは触る必要がないもので、むしろ機械か専門家にまかせていただいた方がいいところだろうかと思ってしまい、結局のところ簡単に触れるのみとしてきました。

 しかしながら、解説がほしいという各方面からのご要望や、先日開催されたIIIF Presentation APIを読む会などに参加させていただいたこともあり、何かそろそろやってみた方がいいのではないかと思いまして、色々考えていたところ、ようやく一つひらめきました。

 ・・・というのが、「簡単なIIIFビューワを作ってみよう」という企画です。これならば、IIIF Presentation APIの解説の難しさを乗り越えられるのではないかと思ったのでした。とにかく、この件は、JSONの便利さ(と限界)を知っていないとよくわからないのですが、これを理解してもらう上で、「IIIFビューワを作ってみる」、つまり、IIIF ManifestのJSONデータを適当に取り出して処理してみるというのがとてもよいのではないかと思うのです。

 ただし、こういうことを始めると、「もっとよい方法があるのに」と思われる人がきっとおられると思います。(私はプログラマとしてはかなりヘボい方ですので。)そこで、どちらかといいますと、そういう方は、それはそれでよりよいチュートリアルを作って無料公開していただければ、こちらからはリンクを張るだけで済むようになりますので、ぜひともお願いしたいところです。

 

 というわけで、さっそく・・・といきたいところですが、ここでいきなり解説です。IIIFビューワ、画像が拡大縮小できたりして、しかも大きな画像は自動的にタイル化して一部だけサーバからとってくるとか、すごい機能なのに、それを自分で作れるの!?と思う人もおられると思います。そうではありません。そこは、IIIF Image APIの領分です。Image APIについては今回は扱いませんので、それを処理してくれる画像表示ソフトをベースに話を進めていきます。画像表示ソフトには、LeafletやOpenSeadragonなど、元々IIIF対応ではなかったものを IIIF Image API向けに改造したものがいくつか流通しています。特に後者はIIIFに標準対応するようになりました。Leafletの方が良いというプログラマの方々も結構おられるのですが、私のようなヘボプログラマにはOpenSeadragonの方がやりやすい面がありまして、ここではとりあえずOpenSeadragonを使ってみます。

 さて、画像表示をまかせてしまうということは、あとは何をする必要があるのでしょうか?そう、それがIIIF Presentation APIの素晴らしさであり、また、IIIFの本領を発揮するところでもあるのです。

 一つの資料には、画像がいくつか含まれていることがしばしばあります。また、資料に関する情報はどこかにうまくくっつけておかないと、その資料が何だったかわからなくなってしまうことがあります。画像にアノテーションをつけておきたいと思うこともありますが、それも画像との関係づけが切れてしまうと、何がなんだかわからなくなってしまいます。(ほぼ、ゴミデータになります)。これをなんとかしなければデジタルデータの未来はない、そのためには皆で共通のルールを・・・というのが IIIFであり、それを実現しているのがIIIF Presentation APIなのです。つまり、そういった情報をすべてまとめて一つのファイルに書き込んでしまおうという話であり、書き込んだものを皆でうまく共有できるように、ごくシンプルなルールを IIIF Presentation APIとして設定して皆で共有することになったのでした。

 

 ここまでくると、今回のIIIFビューワでどういう範囲を作ろうとしているのか、大体おわかりいただけたかと思います。つまり、IIIF Presentation APIが仕切っている「資料に含まれる画像や資料に関する諸々の情報等」を基に一つの資料を閲覧できる仕組みを作ってみよう、ということなのです。ただし、ごく簡単なものを。

 

 ということで、まずは画像処理をおまかせするためのOpenSeadragonです。これは元々マイクロソフトが作っていたものがオープンソース化されたもので、安定度はかなり高いと言わざるを得ません。公式ページの右上のアイコンからダウンロードできますので、とりあえずダウンロードして展開してみましょう。(展開しないでダブルクリックしないように!)

f:id:digitalnagasaki:20190502234752p:plain  

それから、同じフォルダ(ディレクトリ)に、jqueryもダウンロードしておきましょう。これも、バリバリのプログラマの方々からは「今時そんなもの使ってどうするの」とよく言われるもので、私のようなヘボプログラマ御用達のものなのですが、とりあえずお試しということでご容赦ください。もっと良いモノを使える人は適当に読み替えてください。 以下の"Download jQuery"というボタンをクリックしてから、

f:id:digitalnagasaki:20190502235456p:plain

表示されたページの Download the compressed, production jQuery 3.4.1 というリンクをクリックすればダウンロードできます。

f:id:digitalnagasaki:20190502235649p:plain  

さて、そうすると、おそらく、フォルダ(ディレクトリ)は以下のようになっているはずです。

(Windows10の場合)

f:id:digitalnagasaki:20190502235911p:plain

 

(Ubuntu on WSL でのコマンドライン表示)

$ ls -l 合計 836 -rwxrwxrwx 1 nagasaki nagasaki 88145 5月 2 06:14 jquery-3.4.1.min.js drwxrwxrwx 1 nagasaki nagasaki 512 5月 2 23:57 openseadragon-bin-2.4.0 -rwxrwxrwx 1 nagasaki nagasaki 797571 7月 21 2018 openseadragon-bin-2.4.0.zip

 

このように、ファイル jquery-3.4.1.min.js と、openseadragon-bin-2.4.0.zipを展開した

フォルダ(ディレクトリ)openseadragon-bin-2.4.0 が同じ階層に来るようにしてください。フォルダ(ディレクトリ)をあわせておくのはこの種の仕事ではとても大事ですのでよく注意してください。(うまくいかない場合はまずこのあたりから疑って確認してみることです)

はじめの一歩:タイトルと帰属の取り出し

さて、そうしましたら、このフォルダに、test.htmlというファイルを作ってみましょう。その内容は、とりあえず以下のようにしてみましょう。ファイルは、Windowsの「メモ帳」でも作成できますが、その場合、保存する際の「文字コード」を必ず「UTF-8」にしてください。

そこで、まずは、jqueryを使って、IIIF Manifestファイルを読み出して、そこからタイトルと帰属の情報を取り出して表示するという、ごく簡単なものを書いてみましょう。

<!DOCTYPE html>
<html>
  <head>
    <meta charset='utf-8'>
    <title>私の簡易IIIFビューワ</title>
    <script src="jquery-3.4.1.min.js"></script>  
  </head>
  <body>
    ManifestURI: <input type="text" size="40" id="linkManiURI" value="">&nbsp;<button id="maniLoad">Load</button><br/>
    タイトル: <div id="linkLabel"></div>
    帰属: <div id="linkAttr"></div>
    
    <script>
  $(function(){
   $("#maniLoad").click(function(){
     var pUrl = $("#linkManiURI").val();
     $.ajax({
       url:pUrl,
       dataType:'json'}).done(function(maniJson){
         $("#linkAttr").text(maniJson["attribution"]);
         $("#linkLabel").text(maniJson["label"]); 
     });
   });
  });
    </script>
  </body>
</html>

この状態で、たとえば以下のManifest URIを読み込ませてみると、

https://gallica.bnf.fr/iiif/ark:/12148/btv1b10526547d/manifest.json

タイトル:

BnF, département Estampes et photographie, BOITE FOL-DE-10

帰属:

Bibliothèque nationale de France

という風に表示されるはずです。他にもManifest URIを色々読み込ませてみると、それぞれのタイトルと帰属を表示してくれるはずです。 (このプログラムでは、プログラム自体をわかりやすくするために、新たに読み込んだManifest URIにタイトルか帰属がなかった場合、前回のものがそのまま残りますのでご注意ください。)

 なお、動作するものをこちらに置いておきますのでご参考にしてみてください。

 ところで、ここで特に注目していただきたいのは以下の箇所です。

   $("#maniLoad").click(function(){
      // (1)  id: maniLoadのエレメントがクリックされたら以下の処理をする
      const pUrl = $("#linkManiURI").val();
         // (2) id: linkManiURI に記入された文字列(値, この場合はManifest URI)を変数 PUrlに代入する
      $.ajax({
        url:pUrl,
        dataType:'json'}).done(function(maniJson){
           // (3) pUrl (=Manifest URI)にアクセスしてjsonデータとして取得し変数maniJsonに代入してから以下の処理をする
          $("#linkAttr").text(maniJson["attribution"]);
           // (4) 取得したjsonデータ中のトップレベルでattributionというキーの値(テキスト)をid: linkAttr に表示
          $("#linkLabel").text(maniJson["label"]); 
          // (5) 取得したjsonデータ中のトップレベルでlabelというキーの値(テキスト)をid: linkLabel に表示
      });
    });

(3)以降に特に注目です。たとえばこちらのIIIF Manifestファイルに直接アクセスしてみると、トップレベルのlabelとattributionはそれぞれ以下のようになっています。

  "label" : "BnF, département Estampes et photographie, BOITE FOL-DE-10",
  "attribution" : "Bibliothèque nationale de France",

このように、キーと値が対になっているのがJSONデータの特徴なのですが、ここで、labelとattributionが、それぞれ資料のタイトルと、資料の帰属を表すものとして、JSONデータの階層構造のトップレベルに書いておくようにと決めているのがIIIF Presentation API、ということになります。

ようやくタイトルと帰属を取り出すことができました。次に画像を取り出したくなりますが、IIIF Presentation APIが定めるJSONデータの形式にて、資料に属する個々の画像がどの階層にどのように属しているか、もう少しみてみましょう。

枚数が少ないと比較的わかりやすいので、引き続き、こちらのIIIF Manifestファイルを見ていきましょう。

"sequences" : [ {
    "canvases" : [ {
      "@id" : "https://gallica.bnf.fr/iiif/ark:/12148/btv1b10526547d/canvas/f1",

このように、トップレベルに「sequences」というキーがあります。これが複数であることにも注目してください。これは資料に含まれる個々のコンテンツの順番を定義していますが、複数形になっていることからもわかるように、複数の順番を記述できることになっています。「"sequences" : 」に続いて「 [ { 」という風になっていることにも着目してください。JSON形式では、値のところに「 [ 」が来た場合、この中にキー/値の対のセットを複数含むことができるようになります。いわば、一つ下の階層を作ることができるようになると言えます。そこで、次に来ているキーは再び複数形です。「canvases」というのは、IIIF Presentation APIの考え方の根幹を成す「canvas」を指しており、それをここで複数含むことができることを示唆しています。  IIIFにおける canvasは、たとえば本における抽象的なページの概念と考えることができます。あるページに関するデジタルデータとしては、デジタル撮影した画像や、テキストデータ、誰かが後からつけたコメントなど、様々なデータがあり得ます。それらのすべては、一つのページとして取りまとめられ、そして、そのようにしてまとめられたページを一つもしくは複数の順番で並べることによって一つの資料が構成される、というのが、IIIFの基本的な考え方です。そして、そのページのことを、本以外のものも扱うことができる抽象概念として「canvas」と呼んでいます。(少なくともversion 2まではそうです)。

 そうすると、canvasが複数含まれることがIIIFにおいて自然であることはおわかりいただけたかと思います。では、このcanvasに画像が載っているはずだ、ということになります。もう少し見ていきましょう。

 今回はviewerを作ることが目的ですので、少し端折ります。以下の箇所に注目してみましょう。

      "images" : [ {
        "motivation" : "sc:painting",
        "on" : "https://gallica.bnf.fr/iiif/ark:/12148/btv1b10526547d/canvas/f1",
        "resource" : {
          "format" : "image/jpeg",
          "service" : {
            "profile" : "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level2",
            "@context" : "http://iiif.io/api/image/1/context.json",
            "@id" : "https://gallica.bnf.fr/iiif/ark:/12148/btv1b10526547d/f1"
          },
          "height" : 4246,
          "width" : 6197,
          "@id" : "https://gallica.bnf.fr/iiif/ark:/12148/btv1b10526547d/f1/full/full/0/native.jpg",
          "@type" : "dctypes:Image"
        },
        "@type" : "oa:Annotation"
      } ]

さらにちょっと階層ができていますが、やはり「images」も複数になっています。これは一つのcanvasに複数の画像が載ることを許容しているためです。色々な使い方がありますが、たとえば、部分的に切り取られた画像同士をviewer上で組み合わせるといったことにも使われます。

さらに少し飛ばしてみていくと、「resource」の下に「service」というのがあります。ここに、IIIF Image APIが提供する画像情報を記述してあるようです。もう一度その箇所だけを見てみると以下のようになっています。

          "service" : {
            "profile" : "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level2",
            "@context" : "http://iiif.io/api/image/1/context.json",
            "@id" : "https://gallica.bnf.fr/iiif/ark:/12148/btv1b10526547d/f1"
          },

ここで、簡単なIIIF viewerを作るために特に重要になるのは、「@id」 のところです。これはIIIF Image APIでの画像のベースになるURIを示しており、この後に続けて「/info.json」をつけると、その画像にIIIF Image APIでアクセスするために必要な情報が返戻されるようになっています。たとえば以下のような感じです。

{
    "profile": "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level2",
    "width": 6197,
    "height": 4246,
    "@context": "http://library.stanford.edu/iiif/image-api/1.1/context.json",
    "@id": "https://gallica.bnf.fr/iiif/ark:/12148/btv1b10526547d/f1"
}

OpenSeadragonのような、Image API対応の画像表示ソフトに対しては、この info.jsonのURIを渡す必要があります。そこで、これを取り出してOpenSeadragonに読み込ませると、画像が表示できる、ということになります。が、そろそろ寝ないとまずいので、続きは次回ということでよろしくお願いいたします。

 

 

お手元の画像をIIIF画像と透過で重ねて比較してみる

 IIIFを日本で紹介し始めた当初から、「公開はできないけど手元に持っている画像を公開画像と比較できないのか」と、主に仏教文献学的な研究をやっている方々から言われてきました。理論的にはもちろん可能なのですが、比較的簡単に、しかしサーバにアップロードせずにできるようにするには、少し作業に集中する時間が必要で、なかなかできず後回しになっておりました。

 

 今回は、それをできるようにしたという話です。まだベータ版という感じで、もっと使いやすくすることができると思うのですが、とりあえずの必要な要件である

・IIIF画像を対象として

・諸般の事情により手元にあるが公開することができない画像を

・重ね合わせて透過しながら拡大縮小しつつ比較する

ということをできるようにしました。

SAT大蔵経データベースの方からアクセスするとIIIF対応仏典画像を簡単に読み込みできますが、その場合は、任意の仏典画像をIIIF Linkingタブで表示してから、以下のボタンをクリックしてください。

f:id:digitalnagasaki:20190428233219p:plain



 

ツールに直接アクセスする場合は以下のURLからアクセスできます。デフォルトでは富嶽三十六景のうちの一つが表示されます。

http://21dzk.l.u-tokyo.ac.jp/SAT2018/iiiflink/overlayimgs.php

操作に関しては、あまり上手でなくて恐縮ですが、動画を作成してみましたのでご笑覧ください。

 


SAT IIIF Overlay Imaging / お手元の画像をIIIF画像と重ね合わせて透過で対比

 

主要機能は全部 Javascirptで書いてますので、余すところなく公開されています。WebページとしてはPHPで生成している部分がありますが、それはURL中にManifest URIやCanvas URIを含むアクセスが来た場合に読み込んで表示するためのものです。たとえば以下のように、Canvasまで指定できるようになっています。URLパラメータをつけなくても上記のようにアクセスできます。

http://21dzk.l.u-tokyo.ac.jp/SAT2018/iiiflink/overlayimgs.php?manifest=https://dzkimgs.l.u-tokyo.ac.jp/kakouzou/049_1/manifest3.json&canvas=https://dzkimgs.l.u-tokyo.ac.jp/kakouzou/049_1/canvas/0028.json

 

とにかく、画像アップロードをしなくて済みますので、権利関係の問題を回避しやすいことはもとより、そもそも作業が速くできます。ただ、画像のサイズ調整と位置合わせは、やや面倒です。CODHの方で似たような本の差異の抽出を自動化する研究もありますので、あちらの成果とうまく連携ができるとよいのですが、とりあえず気になっていて自分で確認したかったものを比較的簡単に比較できるようにするところから始められるといいだろうかと思って作成したところです。上記のもの以外にも、かぶせ彫りをしたと言われる嘉興蔵と鉄眼版(とおぼしきもの)を対比してみたりしております。字形に微妙な違いがあるのが興味深いところです。

f:id:digitalnagasaki:20190428230935p:plain



 

 また、宮川真弥さんによる「覆刻版における版面拡縮現象の具体相 : 匡郭間距離比較による版種弁別法確立のため」という論文が最近刊行されましたが、このご研究の成果ともつながってくるところがあろうかと思います。

 

 なお、画像のサイズ調整・位置合わせなど、「自分ならもっとうまく作れる」と思われる技術系の方々もたくさんおられると思います。とりあえず、永崎がこのようにして作ってみる程度にはニーズのある話ですので、よかったらぜひ、改良版を作って公開して皆で共有できるようにしていただけますと大変ありがたく存じます。

Goobi3.0 続編:画像チェック・メタデータ付与・IIIF閲覧編

さて、前回前々々回の記事に続き、デジタルアーカイブにおけるメタデータ作成と画像チェックを飛躍的に便利にするコラボソフトウェア、Goobiの使い方です。前回までの手順を経て、ようやく具体的に画像をチェックできるところまできました。画像チェック画面には、先ほどの「Process details」の「List of tasks」の中で、「Quality Control」のところで「Execute plugin」アイコンをクリックすることで入れます。そうすると、前回記事の最後にアップロードした画像が以下のように表示されます。画面右側に拡大縮小回転可能な大きめの画像を表示し、左側はサムネイルです。これで画像に問題がないかどうかチェックすることになるようですが、

f:id:digitalnagasaki:20190424044415p:plain

 

サムネイルにカーソルをあわせると以下のように部分拡大されるという便利機能もあります。

f:id:digitalnagasaki:20190424044422p:plain

 

さて、これも終わったら、Process detailsに戻り、List of tasksの次の項目として「Image processing」の「Execute plugin」アイコンをクリックしておきましょう。(でもこの操作は不要かもしれません。要確認)

 

なお、各taskには「Status」という項目がありますが、これは自動的にどうにかなるものではなく、作業者がメモしたり申告したりするために手動で切り替えるようです。作業中・完了・などといった状況を選べるようになっています。

f:id:digitalnagasaki:20190424044951p:plain

 

あとは、「Metadata enrichment」というタスクがありますが、これは一度Processの一覧に戻ると、一覧の右側に「Edit metadata」というアイコンがありますのでこれをクリックしてメタデータ編集画面に入ります。

f:id:digitalnagasaki:20190424045458p:plain

メタデータ編集画面では、やはり画像を閲覧しながらかなり詳細なメタデータをつけられるようになっています。

f:id:digitalnagasaki:20190424045335p:plain

さて、これも終了したら、いよいよ「Export」です。これもやはり、Processの一覧の右の方にある「Export」アイコンをクリックすると・・・

f:id:digitalnagasaki:20190424045526p:plain

うまくできた場合、画面の左上の方に以下のようなメッセージが表示されます。

f:id:digitalnagasaki:20190424045641p:plain

 

これで、IIIFで閲覧できるようになります。閲覧は、ビューワモードでの閲覧になります。以下のURLにアクセスしてみてください。

 

http://localhost:8888/viewer/

 

そうすると、右側の「New objects」等に、今回作成した資料のタイトル等が表示されるはずです。このタイトルをクリックすると・・・

f:id:digitalnagasaki:20190424045931p:plain

 

以下のような感じで、エクスポートした資料がGoobiのIIIF対応ビューワで閲覧できるようになります。ただし、ローカルのパソコン上で作業している場合、外部からアクセスさせるのはちょっと大変です。(不可能ではないですが、かなり面倒です)。IIIF対応ローカル表示、と割り切るか、あるいは、IIIF対応で一般公開までしてしまいたければ、Webサーバを兼ねたコンピュータ上でGoobiを動かすという手もあるでしょう。

 

f:id:digitalnagasaki:20190424050046p:plain

 

さて、ここまでで、Goobiを使った作業については大体把握できたかと思います。無料で使えるソフトウェアを、ダウンロードしてダブルクリックしただけで、ここまで高度な作業ができるようになっているというのは、インターネット老人会会員としては、もはや驚く以外のことをあまり思いつかないですが、先進国で流通するこのような利便性の高い高度なソフトウェアと整備されたワークフローの恩恵を、日本でも少しでもたくさん受容できるようにして、日本人のワークライフバランスの向上に貢献できればと思っているところです。

 ただし、Goobiの最大の魅力は実は今回ご紹介した点ではなくて、こういう作業を、管理者・作業者に権限を分けつつ進捗管理できるようにする機能です。これが出来ると協働作業の進捗管理が非常に効率化できるのですが、その仕方まではまだ十分に確認できてないので、また機会がありましたら確認&お知らせできればと思っております。

 また、特に細かいTips的なことも多少蓄積されてまして、それも(できれば)進捗管理の仕方とともにお知らせしたいと思います。

 

なお、再掲になりますが、この一連の作業手順は、3月のデジタルアーカイブ学会公式懇親会後の非公式な集まりにて、以下のメンバーにて確認したものです。(敬称略)

 大西亘(神奈川県立生命の星・地球博物館)、岡田一祐(国文学研究資料館)、亀田尭宙(京都大学)、中西智範(早稲田大学)、中村覚(東京大学)、宮本隆史(東京大学)+永崎

 

 こういうものの動作手順の確認は、普段は一人で取り組んで煮詰まってしまいがちなところ、このときには皆でわいわい楽しく進めることができましたので、個人的にも貴重な経験でした。

Goobi3.0 続編:基本的な使い方:準備編

ずいぶん時間が経ってしまって大変申し訳ありません。前々回の記事の続きです。みんなで動作確認できたはずだったのですが、改めてやってみたらまたうまくいかなくなってしまってしばらくハマってました。が、そのおかげでさらなるTipsも得ることができましたので、変な穴にはまらないようなインストラクションを作ることができそうです。

 

ということで、いよいよ、Goobiの基本的な使い方です。全体的な作業の流れは前々回記事を参照してください。

 

まず、前回記事を引用しますので、インストール⇒ログインまでいってみましょう。

 

一応日本語でも書いておきますと、Goobiのダウンロードは以下のURLからです。

http://files.intranda.com/g2g5

g2g5.zipというようなファイルがダウンロードできますので、このzipを元に戻します。(ダブルクリックするだけだと、うまく起動しません。きちんとファイル圧縮解凍ソフトを使って解凍してください。)

そこでできたフォルダを開くと、 GoobiToGo.jarというファイルがあるはずですので、それをダブルクリックします。それで起動します。なんと、たったこれだけです。

Java8を使っているようですので、Java8環境がなかったり、Java環境のパスがおかしかったりすると動かないこともありますので、お気を付けください。

 

次に、このGoobiにWebブラウザでアクセスしてみます。以下のURLに、以下のLogin/ Passwordでアクセスしてみましょう。こちらは、画像に関する作業をしたり、作業を管理したりする画面です。

 

以下のようなログイン画面に、上記のID passwordでとりあえずログインしてみます。

f:id:digitalnagasaki:20190424034417p:plain

 

ログインに成功すると、以下のような画面が表示されるはずです。

 

f:id:digitalnagasaki:20190424034458p:plain


次に「プロジェクトを作る」ので、上部メニューバーから「Administration」⇒「Projects」を選びます。f:id:digitalnagasaki:20190424034728p:plain

すが、ここで注意しておきたいのは、いきなり「新規作成」しないことです。(ここで私はハマりました。)この「project」は設定項目が結構多く、それらをきちんと設定しないとエクスポート後の表示がうまくいかなかったり、色々制約があります。そこで、既存のProjectを複製してから名称や内容を変更する、という風にしてみます。Projectリストの右の方に、 Duplicate projectというアイコンがありますのでそれをクリックしてみてください。そうするとそのプロジェクトのコピーが作成され、リストに追加されます。

f:id:digitalnagasaki:20190424034929p:plain

 

そうしましたら、わかりやすくするために、Project名を変更しておきましょう。追加されたコピープロジェクトの右側の方にある「Edit Project」アイコンをクリックすると編集モードに入ります。

f:id:digitalnagasaki:20190424035123p:plain

 

 

以下のような編集モードに入ったら、Titleやページ数、冊数、開始・終了日付など、適宜修正してください。終わったら右下の「Save」ボタンをクリックして保存しましょう。そうすると、自分が名付けたProjectがリストされているはずです。

f:id:digitalnagasaki:20190424035329p:plain

 

次に、Process templateを作成します。これも、既存のものを複製するのが吉です。上部メニューバーの「Workflow」⇒「Process templates」を選んでください。

f:id:digitalnagasaki:20190424035746p:plain

 

そうすると、以下のようにProcess templatesがリストされます。以下の例は、すでにたくさんのtemplatesを作ってしまっていますが、デフォルトではManuscript_WorkflowとSample_workflowが表示されているはずです。

 

f:id:digitalnagasaki:20190424035827p:plain

ここでも、先ほどと同様に、いずれかをduplicate(複製)してから名前を変える、という方向でいきましょう。(一から作成すると、タスクを自分で設定しなければならないので最初は結構大変です。)

f:id:digitalnagasaki:20190424040300p:plain

 

Process templateの編集は以下のようなダイアログで行いますので、まずはタイトルをつけてください。それから、今回の場合、プロジェクトと紐付ける必要もありますので、「Project」の項目も記載します。と言っても、この入力欄は、クリックすると登録済みの Projectが一覧表示されますので、その中から今回利用するものを選ぶだけです。

f:id:digitalnagasaki:20190424040331p:plain

Process templateの編集が終わって、一覧画面に戻ってきたら、次はいよいよProcessの作成です。以下のボタンをクリックするとProcessの作成が始まります。このProcess一つが、一つの資料のメタデータ作成・画像チェックに対応するということになるようです。ですので、一つのProcess templateは、一つのコレクションの一つのタイプの資料に対応する(もしくは資料タイプ別の処理をしない場合は一つのコレクションに対応する)ということになるようです。

f:id:digitalnagasaki:20190424040842p:plain

 

さて、Processを作成すると、まずメタデータの入力を要求されます。以下のような画面です。ここで、ちょっと「おおっ」となるのは、米国議会図書館等のいくつかの機関/組織の資料識別子を入力すると、自動的にメタデータを入力してくれるようであるという点です。

f:id:digitalnagasaki:20190424041653p:plain

 

たとえば、米国議会図書館のLCCN(NDLにおける永続的識別子のようなもの)を入力すると以下のような感じです。ここら辺でWeb APIの意義のようなものも大きく実感されますね。

f:id:digitalnagasaki:20190424042113p:plain

LCCNは、たとえば、以下の画面は米国議会図書館での「妙法蓮華経」のページですが、左下を見ていただくと記載されているのがわかります。

f:id:digitalnagasaki:20190424042327p:plain

 

 

これで、processが作成されました。以下のような画面になりますので、さっそく「Open created Process」をクリックして先に進んでみたいところですが、

f:id:digitalnagasaki:20190424042523p:plain

上部メニューバーの「Workflow」⇒「Processes」で、一覧表示させることもできます。

f:id:digitalnagasaki:20190424041324p:plain

 

一覧表示させた場合、右側の「Edit process」アイコンを押してください。いずれにしても、以下のようなProcess details画面が表示されます。

 

f:id:digitalnagasaki:20190424042940p:plain

ここで、画面下半分の「List of tasks」に注目してください。ここでは、メタデータ入力や画像のチェックに関して、ステータスを記載しつつ、一つ一つ作業を進めていけるようになっています。(ようやくここまできました。)

 タスクのリストはデータインポート等色々ありますが、まずは「Scanning」からやってしまいましょう。Scanningの右の方にある「Execute plugin」というアイコンをクリックすると、画像アップロードが可能な画面に遷移します。

f:id:digitalnagasaki:20190424043247p:plain

 

以下の画面では、右上の「Files」という領域に注目です。ここで「Upload images」というボタンがハイライト(白抜き?)になっている状態で、画像ファイルアップロードができます。この領域の真ん中に「Select files」というボタンがありますのでこれをクリックするとファイル選択モードになりますが、Google Chrome等、一部のWebブラウザではここにファイルを1つでも複数でもドラッグするとアップロードが始まります。それができないブラウザの場合はファイル選択モードで画像を選択してアップロードしてください。

f:id:digitalnagasaki:20190424043342p:plain

 

アップロードしたファイルを確認したい時は、右上の「Upload images」ボタンの隣にある「Overview」ボタンをクリックします。そうすると、以下のようにアップロードされたファイル名がリストされ、削除することもできるようになっています。アップロードが終了したら、右下の「Exit plugin」ボタンをクリックしてScanningタスクを終了します。

 

f:id:digitalnagasaki:20190424043825p:plain

 

さて、ここまででようやく画像チェックの準備が整いました。長くなってしまいましたので、続きは次のブログ記事にて。

TEI P5ガイドラインの最新版(v3.5.0)でルビを。

 Goobiの記事の続きを書こうと四苦八苦していましたが、その間にまた色々別な仕事も入ってきておりまして、その関係で一つ便利なものを作りましたのでお知らせです。

 

 TEI P5ガイドラインは着々とアップデートを続けておりまして、現在はv3.5.0となっております。日本語訳も、エレメント・アトリビュートの説明に関しては、かつて鶴見大学の大矢一志先生がやってくださったものに、TEI協会東アジア/日本語分科会を中心とした翻訳会のボランティアによる追加作業が加わり、日本語でもずいぶん使えるようになってきています。

 ところで、TEI P5ガイドラインには、まだ「ルビ」がありません。既存のタグを流用することでなんとかしのいでいるところではありますが、「ルビ」という融通無碍なルールにぴたっとハマるエレメントは、やはり既存のものではちょっと難しいところがあります。ルビは、発音を示すものであることもあれば、意味を示すこともあり、もう一つの本文として扱うこともできます。それぞれの文章中での位置づけを既存のエレメントに対応づけるという方向性も考えられなくはないですが、それをしてしまうと「ルビ」の多義性を損なってしまうこともあると思います。作業効率から考えても「ルビ」は「ルビ」として扱った方が日本の文化的コンテクストには適切なのではないかと思うのです。

 

 そのようなことで、「ルビ」タグを使えるようにTEI P5ガイドラインをカスタマイズしたいのですが、もちろん、TEI協会ではカスタマイズのためのツール Roma を提供しています。このツールの使い方は、簡単なものですが、こちらの記事に日本語のものが用意してあります。で、ごにょごにょとカスタマイズした結果、以下のように記述できるようになりました。

<eaj:ruby>
 <eaj:rb>第一巻</eaj:rb>
 <eaj:rt>だいいっかん</eaj:rt>
</eaj:ruby>

これを使えるようにして、かつ、大半のスキーマの説明等も日本語で表示されるようにしたRNC形式のスキーマファイルはこちらにご用意しておきます。ダウンロードしてOxygen XML EditorなどでTEIファイルにスキーマ割り当てをすればルビタグを使えるようになります。

 ただ、ここで、一つ注意しておいていただきたいのは、カスタマイズしたスキーマを割り当てた際に、ルートエレメントを以下のように書き換える必要があるということです。

<TEI xmlns="http://www.tei-c.org/ns/1.0" xmlns:eaj="http://www.example.org/ns/eaj">

カスタマイズの際に追加した名前空間をルートエレメントに追記するということです。このままコピペしていただいても大丈夫かと思います。

 これで、「<eaj:ruby>はどこでも使えて、<eaj:rb>と<eaj:rt>はその中でのみ使えて、同時に後者2つがなければ<eaj:ruby>はエラーになる」という風に検証されるはずです。

 

 ついでに、Romaで作成したODDファイルもこちらに置いておきますので、このスキーマをよりよく改良したくなった人はぜひご利用ください。

 

 なお、TEIによる日本語資料の作成のための環境整備につきましては、TEI協会東アジア/日本語分科会のサイトで着々と進められています。日本語によるガイドラインや、青空文庫テクストのTEI化・ツールの作成など、徐々にではありますが、日本でもとっつきやすいものにしていく予定ですので、今後ともよろしくお願いいたします。

 

デジタルアーカイブでの画像の取り扱いにお悩みの方へ:Goobiその1

 2日間、京都大学で開催されたデジタルアーカイブ学会が終了し、みなさまそれぞれに課題を持ち帰られたことと思います。かくいう私も、色々な方の発表をおうかがいし、様々な示唆をいただいたところでした。具体的な実践の発表から得られる情報と教訓も、いつもながら貴重なものがありました。

 ところで、初日の懇親会の後、一部有志で集まり、Goobiというソフトウェアの使い方の検討会を行いました。参加メンバーは、敬称を略させていただきますが、大西亘(神奈川県立生命の星・地球博物館)、岡田一祐(国文学研究資料館)、亀田尭宙(京都大学)、中西智範(早稲田大学)、中村覚(東京大学)、宮本隆史(東京大学)+永崎という感じで、この便利なソフトを日本でデジタルアーカイブ関連の仕事をしている方々がみんなで使って仕事を効率化できるようにするには(=みんなで幸せになるためには)どうしたらいいのか、和気藹々と喫茶店で皆で深夜までノートPCを広げて知恵を出し合ったのでした。

 

 Goobiの説明は、以下のようになっています。

デジタル化プロジェクトのためのオープンソースソフトウェアです。Goobiを通じて、自由に定義できる生成プロセスを、モデル化し、運用し、管理できます。そして、多くの機関による日常業務で、デジタル図書館を構築するためのすべてのステップを扱うことに役立ちます。そこには、図書館の目録やスキャン、コンテンツベースの索引からのデータの取り込みや、デジタル保存、書物からオンライン展示に移行した際の一般的な標準フォーマットでの成果の配信が含まれています。

もう少し分かりやすく言うと、書物をデジタル撮影した場合に、その画像を一つずつ拡大縮小しながらチェックして、メタデータをつけて、IIIFで公開できるようにエクスポートするという一連の作業を行う際に、それらの工程をWebブラウザ上でできてしまうだけでなく、個々の工程がどれくらい進んだか、どういう状況か、といったことの管理までもWebブラウザでできてしまうシステムです。あんまり大きな規模の仕事だと、別途データベースサーバも用意しなければならないようで、ちょっと大変ですが、小・中規模であれば、Javaで書かれたプログラムをダブルクリックするだけで使えるようになりますので、おそろしく手軽です。これを知った時、欧州のデジタルライブラリアン・デジタルキュレイター・デジタル○○の人達(つまり日本で言うところのデジタルアーキビスト)のワークライフバランスはこういうソフトウェアによって支えられているのか!と感心した次第です。もちろん、公開用システムにはIIIFがばっちり組み込まれており、やはりIIIFもそこに貢献し得るものかと改めて思ったところでした。

 

 さて、昨晩、上記のメンバーで検討したのは、このGoobiの使い方の確認でした。皆で検討した結果、まだ「これで何もかもばっちり」というところまでは行っておりませんが、まあ大体こうすると動いた、というところまではいきました。ただし、Windows10環境のみです。MacLinuxではまだ以下の動作をすべて確認するところまでは行っておりませんのでご注意ください。

というわけで、以下、ちょっと説明を試みます。

 

まず、Goobiを使った画像管理の全体の流れとしては、以下のような感じです。

全体的な作業の流れ

1. Projectを作る

2. Process templateを作る

 2.1必要に応じてtaskを作成・追加する

3. Processを作る

 3.1元資料のメタデータ、プロセスの情報を入力

 3.2デジタル化に関する情報を入力

4. Process中の個々のtaskを進めていく

 4.1 taskの例:

  ・画像を(まとめて)アップロード

  ・画像をチェック

  ・画像を処理

5. Processesリストで「Edit Metadata」をクリックしてメタデータを整備(METSの

メタデータエディタが起動する模様)

6. Processesリストでエクスポートボタンをクリック

⇒IIIFで公開できる

 

という感じです。普通(?)に考えると、こういうことができるソフトは、かなり設定がややこしかったりしそうなのですが、なんとこれが、JAVAのソフトをダウンロードして起動する(Windowsの場合、ダブルクリックする)だけでできます。セットアップの仕方は以下のURLに書いてありますので英語を読める方はそのまま進めてみてください。

https://www.intranda.com/en/digiverso/goobi/goobi-to-go/

 

一応日本語でも書いておきますと、Goobiのダウンロードは以下のURLからです。

http://files.intranda.com/g2g5

g2g5.zipというようなファイルがダウンロードできますので、このzipを元に戻します。(ダブルクリックするだけだと、うまく起動しません。きちんとファイル圧縮解凍ソフトを使って解凍してください。)

そこでできたフォルダを開くと、 GoobiToGo.jarというファイルがあるはずですので、それをダブルクリックします。それで起動します。なんと、たったこれだけです。

Java8を使っているようですので、Java8環境がなかったり、Java環境のパスがおかしかったりすると動かないこともありますので、お気を付けください。

 

次に、このGoobiにWebブラウザでアクセスしてみます。以下のURLに、以下のLogin/ Passwordでアクセスしてみましょう。こちらは、画像に関する作業をしたり、作業を管理したりする画面です。

作業が終わったものは、以下の ViewerでIIIFコンテンツとして閲覧することができます。(IIIF Viewerも組み込まれているようです)。

あとは、タスク・タスク管理画面(http://localhost:8888/goobi/)の方から、上記のような流れで作業をすることになるのですが、続きはまた次回に!(上記の説明だけで画像公開までできた人は、ぜひお知らせください。)

 

IIIFでフルサイズ画像ダウンロードをさせないためのお手軽設定

 IIIFの導入にあたって、「画像ダウンロードさせたくない」という理由で反対されるケースが未だにそこここで聞かれるという話をうかがいましたので、簡単ソリューションを考えてみました。

 この件は、そもそも画面キャプチャをすれば画像入手はできてしまうというという前提を共有できるはずなので、分割画像をダウンロードして自分で組み合わせるという人は画面キャプチャと同様であると考えることにして(それでいいのかという話もありますが…)先日このブログでご紹介したような、あるいは、otani0083 さんがGUIで作ってくださったようなダウンローダーなどで簡単に大きなサイズの画像ダウンロードをできないようにする、ということを目指してみます。

 今回の条件は、.htaccessを許容するapache2.4系のサーバで動いているIIP Image Serverです。.htaccessを許容しなくても直接httpd.confに書き込むことができるならそれでもよいかと思います。

 さて、フルサイズ画像や大きなサイズの画像ダウンロードをさせないということをIIIF Image APIとして考えてみると、画像サイズをURIで指定する箇所がありますので、そこで、禁止したいサイズの画像アクセスURIが来た場合には書き換えてしまえばいいということになります。普通にビューワ上で大きな画像を表示したいときは分割画像で送出することになりますので、その分割サイズよりも大きなサイズであれば禁止してもあまり問題はありません。分割画像のサイズとしては、256x256や512x512が多いように思われます。(時々一辺1000ピクセル以上の分割画像を見ることもありますが。)そこで、とりあえず一辺600ピクセル以上の画像を要求された時は256x256の画像を返戻してしまうようにすることを考えてみます。

 これは、Apacheだとごく基本的な機能の一つですね。mod_rewriteの機能を使います。.htaccessを使えるのであれば、iipsrv.fcgiの置いてあるディレクトリに以下のような.htaccessファイルを置いたらできました。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} iipsrv.fcgi
RewriteCond %{QUERY_STRING} ^IIIF=(.*)/!?(([6-9][0-9]{2}|[0-9]{4,}|),([6-9][0-9]{2}|[0-9]{4,}|)|full)/([0-9]+/default\.jpg)$
RewriteRule ^.*$ iipsrv.fcgi?IIIF=%1/!256,256/%5
</IfModule>

これは、以下のようなパターンのURIを前提としています。

https://candra.dhii.jp/iipsrv/iipsrv.fcgi?IIIF=/kakouzou_pub/021_1/0002s.tif/full/1000,/0/default.jpg

https://candra.dhii.jp/iipsrv/iipsrv.fcgi?IIIF=/kakouzou_pub/021_1/0002s.tif/full/full/0/default.jpg

 

上の.htaccessでの設定を介すると、上記のImage API URIが以下のようになります。

https://candra.dhii.jp/iipsrv/iipsrv.fcgi?IIIF=/kakouzou_pub/021_1/0002s.tif/full/!256,256/0/default.jpg

 

ちょっとベタな書き方になっていますが、とりあえずこれでなんとかなりました。ディレクティブや記号の意味はググっていただけば色々出てきますので詳しくはそちらを参照していただくとして、基本的な流れとしては、まず、RewriteCond %{REQUEST_URI} iipsrv.fcgi のところでIIP Image Serverへのアクセスのみを対象にします。次に、ここのサーバはIIP Image Serverのデフォルト設定のままで、Image URIのパラメータ指定がクエリ文字列(URI中の?より後ろ)になってしまっていますので、mod_rewriteでは普通に変換することはできません。そこで、次のRewriteCond では%{QUERY_STRING}という変数を用いてクエリ文字列を正規表現マッチさせます。(文字列一致で600以上を表現しようとしているのですごくベタになってしまっていますがご容赦ください。もっと良い書き方もあると思いますのでぜひご検討ください。)その次に、置換したい文字列を後方参照(ここでは%1 や%5)も含めてRewriteRuleのところで記述します。

 すごく拍子抜けしてしまう人もいるかもしれませんが、これだけで「大きなサイズの画像は分割画像の組み合わせで見せつつ、1辺600ピクセル以上の画像を丸ごとダウンロードさせない」ことができてしまいます。何か穴があるかもしれませんので、お気づきの方はぜひお知らせ&改良していただければと思います。

 IIP Image Serverでは、もしかしたらこれを自身の設定でできるかもしれませんが、設定パラメータをざっと見た限りではうまくみつけることができなかったので、Apacheの設定ファイルで対応してみました。Apacheに限らず、WebサーバのレベルでURLの置換はできる場合がありますし、URLでImage API URIを書き換えるという話ですので、IIP Image Serverだけでなく、IIIFのImage serverをWebサーバ経由で利用しているところでは、同様に対応可能だと思いますのでぜひトライしてみてください。

 あるいは、Image Server側を色々いじってこういうことができるようにするという手もあり得ますが、サーバソフトがセキュリティアップデートをした時等にとても大変なことになってしまう上に引き継ぎも難しいので、比較的安定していて引き継ぎしやすい.htaccessファイルでできるのであればそれにこしたことはないでしょう。

 このことからわかるのは、認証に関することも同様にhttpdのレベルでラッパーをかませれば割と簡単に実現できるだろう、ということです。それについても、ニーズはかなりありますので、いずれちょっとやってみる予定です。(が、どなたかやってみて手法を公表していただけると大変ありがたく・・・)

 もちろん、オープンサイエンス・オープンデータといった観点、あるいは単に文化を広くひらいていくという観点からも、このようなことはまったく好ましいことではありません。画像を丸ごとダウンロードできるようにしておくことは、利便性向上だけでなく、データ保全の観点からも極めて重要です。また、結局、画面キャプチャすればつなげることができてしまいますので本当に意味があることなのかどうかは気になるところです。ただ、所蔵者・公開者の方々の中には、とにかく画像丸ごとダウンロードはさせたくない、という人がおられるようですので、そういう方々にIIIFへの対応を前向きにご検討していただく上で多少お役に立つことがあるソリューションかもしれないと思います。何事もステップというものがあり、一つずつ、少しずつ、心理的障壁を取り除き、それによって利便性が高まったり有用性がより広く認知されたりするという体験から理解を深めていただけることも少なくありませんので、そういうステップの一つとして捉えることはできるだろうと思います。