Colorful CiNage

はじめに

とりあえずですが「Colorful CiNage (カラフル サイネージ)」を公開しました。

Colorful CiNage
http://haseharu.org/labs/cinage/

CiNiiとSignageを合わせて「CiNage」です。Colorfulをつけたのは、ゴロがいいのと、色んな図書館あるよ、って意味とインターフェースを少しカラフルにしたかったから。

流れとしては、

全国でX館が所蔵している図書を自館は何冊持っているか?―CiNii Booksでウィルキン・グラフを描く
http://cheb.hatenablog.com/entry/2013/08/24/173533

とか、

Code4Lib JAPAN Conference 2013に参加してきました。
http://otani0083.hatenablog.com/entry/2013/09/01/172422

の流れです。元は別の理由で手を動かして分析していたのですが、イベントで id:otani0083 がなんか発表してくる、というので、なんか見えるもの作っておこうか、といってとりあえず作っておいたのがRed Data Booksで「coming soon」のまま1年経過してしまいました。

Red Data Books
http://haseharu.hatenablog.com/entry/2013/08/28/202429

というわけで「Red Data Books」の続きです。CiNii APIを利用してごにょごにょして所蔵館数とか分析用データを取得して各図書館を可視化しよう、というものです。取得したデータはRed Data Booksのときとあまり変わりません。

何が分かるか

まだ機能があんまりないので分かることが少ないので続々追加できたらと思ってます、が続々追加されるかどうかは気分次第なので正直わかりません。

大学図書館の所蔵タイトル件数

単純ですが、CiNii Booksに登録されている分を所蔵タイトル件数と見なした場合の所蔵タイトル件数(述べNCID件数)が分かります。

全国で○館が所蔵している図書を○図書館では何冊持っているかのグラフを表示

たとえば、全国で2館しか所蔵していない図書(=NCID)を自分の図書館では何冊(=NCIDの件数)持っているかのグラフを表示。ささくれ、で紹介されているウィルキングラフ、というグラフです。たぶん、大抵ぐーっと横長のグラフになるので、ブラウザの横バーをうごかしてみてください。

“ウィルキン・グラフ”―他のX館が所蔵している資料をうちは何冊所蔵しているか?
http://current.ndl.go.jp/node/22526

○○図書館における出版年ごとの冊数のグラフを表示

出版年ごと(1年スパン)に何冊の図書(=NCID)を持っているかをグラフに表示。

使っているもの

CiNii API

CiNiiが提供するAPI

インターフェース

List.js

検索機能はこれで
http://listjs.com/

Chart.js

グラフはこれで
http://www.chartjs.org/

今後の予定

前回から、1年あいてしまったので正直なんともいえないのですが、機能追加していけたらと考えています。館としての可視化もあれば、一冊の図書を各館のフィルターを通して可視化してみる、というのも。もしリクエスト等あればお寄せいただけると嬉しいです。しかし、List.js使ったの2度目ですが使いやすいですね、これ。

List.js

去年、仕事で少し使ってたList.jsを別件で使っています。
http://listjs.com/

これ、かなり使えます。サーチ、ソート、フィルター、組み合わせも。とにかくシンプル。
今回、1200件のリストを読み込ませると「表示されない」、のでちょっとソースをいじる必要あり。そのメモ。

start: function()の、
 self.page = 200;

を好きな数字に変えてやればその数字が表示限度になります。

CiNii Booksの所蔵館情報からメールアドレスリストをつくってみる

はじめに

某MLでこんな感じの話題が少し前にあったのでCiNiiの所蔵館情報から正規表現を使ってメールアドレスを抜き出すスクリプトシェルスクリプトで書いてみました。

用意するもの

  • NIIの提供する所蔵館情報、FANOのリスト

https://illoffset.nii.ac.jp/icos/MainFrame.do

仕組み

FANOをつかってCiNiiにアクセスし所蔵館情報のページからメールアドレスを抜き出します。CiNiiでは幸いなことにRDFで提供しているのでそちらでもいいのですが、今回はなんとなくスクレイピングでやりました。

FANOが「FA007739」の場合、ベースURLは「http://ci.nii.ac.jp/library/」になりますので、

http://ci.nii.ac.jp/library/FA007739

が所蔵館情報のページになります。.rdfをつければ、RDFで取得できます*1。FANOのリストは千件以上あるので、何度かアクセスしたあと少し時間をおくように設定しています。

cat sosiki.txt | awk -F'\t' 'BEGIN{OFS=","} {print $1,$2}' > data.list
	EMAIL=""
	COUNTER=0

	while read file
	do
		FANO=$(echo ${file} | awk -F',' '{print $1}')
		KIKAN_NAME=$(echo ${file} | awk -F',' '{print $2}')
		echo ${KIKAN_NAME} , ${FANO}
		CINII_DATA=$(curl -s "http://ci.nii.ac.jp/library/${FANO}" | grep -e 'writeAtMark()' -e '@')

		SOURCE_DATA=$(echo ${CINII_DATA} | grep -e 'writeAtMark()' -e '@' -e '[at]' | sed -e 's/<script>writeAtMark()<\/script><noscript>&#64;<\/noscript>/\@/g'| uniq)
		EMAIL=$(echo ${CINII_DATA} | grep -e 'writeAtMark()' -e '@' | sed -e 's/<script>writeAtMark()<\/script><noscript>&#64;<\/noscript>/\@/g'| perl -ne '/([-0-9a-zA-Z._+]*@[-0-9a-zA-Z._+]*)/ and print "$1\n"' | uniq | tr -d '\r\n')
		
		#抽出データを出力する
		echo ${FANO},${KIKAN_NAME},${EMAIL} >> email.data
		echo ${FANO},${KIKAN_NAME},${SOURCE_DATA} >> source.data

		if [ ${COUNTER} -eq 30 ]; then
			COUNTER=0
			echo 'sleep'
			sleep 5
		fi
		
		COUNTER=`expr $COUNTER + 1`
	done < data.list

結果と感想

1222館*2から353件のメールアドレスが取得できました。Twitterアカウントのようなものも混ざっているので、全部ではないようですが。もう少し取得できるかなあ、と思っていたのですが。とり逃していることもあるかもしれません。メールアドレスの正規表現の部分は少しはまってしまったので結局Perlで書いてます。

*1:今回はやっていません

*2:FANOリストの行数

今夜は4人で

1ヶ月後には旅立つ id:nacomint の壮行会をしました。
id:kitone id:otani0083 と自分の4人で。

ビザ発行の話とかいろいろ話を聞きながら。
とある人の報告もあり乾杯をやりなおしつつ。
どうか体調には気をつけて。いってらっしゃい。

立ったり歩ったり座ったり

2013年の振り返りエントリ。 id:kitone から指令がとんできたのもあり書き出しました。

昨年の振り返りエントリはこんな感じでした。
http://haseharu.hatenablog.com/entry/2012/12/28/231950

  • 相変わらずVim使ってた。少しcoda2を試用期間だけ使ってみる。
  • kindle paperwhite購入し、電子版で買える本は優先的にkindleで。
  • ゲームはDSのゼルダ大地の汽笛)やって、クリア後FFタクティクス買って放置中。
  • 職場では2回も引っ越し。
  • イベントは2回くらい行きました。あとは行ってないかも。
  • 書評1本書かせてもらったのと、国家資格的なのを2個取得。
  • 半年に渡る職場外研修と10月から兼職で。
  • 来年の手帳はほぼ日手帳のweeksで続行。

資格試験をけっこう受けていた一年でした。その他にあった事件的なのは、

  • ライブ行けなかった事件
  • Li:d tech合宿的なのにひとりぼっち事件*1
  • 職場外研修一人で参加することに事件

とかでしょうか。

今年はけっこう仕事も生活も変化があった一年でした。
来年、再来年と変わる一年になります。

タイトルは、以前好きだったブログからお借りしました。
「そうは見えないかもだけど、目の前に座ってる人にはそれなりの理由とか気持ちとか背負ってるものがあるんだよ」みたいな意味の文が書いてあったのをふっと思い出したのでそれをなんとなくタイトルに*2。座ったり、立ったり、歩ったり、息を吸って、仕事をして、生活をして1年間。

気づけば、一年を通して、ほとんどどこにも出かけなくなりました。

来年、もしどこかでお会いしたらよろしくお願いします。

*1: id:kitone id:otani0083 が一緒にいるのに自分がいないなんて

*2:歩ったり->あるったりとは言わないですよね。雰囲気で読んでください

CiNii JSONとはてなブログでできること

はじめに



旧CiNiiがCiNii Articlesというサービスとなり、JSONの返戻データの形式も変わってしまったため、このエントリーのコードは動かなくなっていることに気がつきましたので、コード部分だけでも動くように修正をしました。2017/11/6

CiNii APIJSONに対応しました。
http://ci.nii.ac.jp/info/ja/index_2013.html#20131011-3

id:otani0083 が書いてますので詳細はこちらを。
http://otani0083.hatenablog.com/entry/2013/10/19/162832

さて、おーたにさんの記事はPythonで処理してます。サーバサイドでの処理もいいのですが、せっかくのJSONXMLHttpRequest対応なんだからJavascriptでしょうここは、と偉そうにコメントしてしまっていたので年内にやっつけでもいいので記事書いてすっきりしたいと思います*1。あとは「JavaScript使える!」と超盛り上がって*2わいわいとLi:d techで先着何名の招待をもらったはてなブログを使いはじめたのが2011/11/24であれから2年経ったということなので、初心に戻ってはてなブログJavascriptで遊んでみました。

はてなブログからCiNii検索

はてなブログからCiNiiの検索結果を取得する感じの一番オーソドックスな活用方法みたいなのを作ってみました。下の検索窓に入力するとajaxでCiNiiへ検索しにいき検索結果がサジェストされます。サジェストされたタイトルの中から、選択すると、その下の枠に「やっつけCSV形式」で他の書誌事項とともに表示されます。







Powered by CiNii

Result:

つかっているもの

あと

ソース

はてなブログやホームページなどに貼付けてもらえれば動くと思います。

<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css">
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<script>
  $(function() {
    function log( message ) {
      $( "<div>" ).text( message ).prependTo( "#log" );
      $( "#log" ).scrollTop( 0 );
    }
	
    $( "#cinii" ).autocomplete({
      source: function( request, response ) {
        $.ajax({
			url:"http://ci.nii.ac.jp/opensearch/search?",
			scriptCharset:"UTF-8",
			data:{
				format : "json",
				title: request.term
			},
			jsonp:"jsoncallback",
			success: function( data ) {
				response( $.map( data['@graph'][0]['items'] , function( item ) {
				  return {
					label: item['title'],
					value: item['title'],
					search_result: '"' + item['title'] + '","' + item['link']['@id'] + '","' + item['dc:publisher'] + '","' + item['prism:publicationName'] + '","' + item['prism:publicationDate'] + '"'
				  }
				}));
			  }
        });
      },
      minLength: 2,
	  select: function( event, ui ) {
        log( ui.item ?
          ui.item.search_result :
		  "Nothing selected, input was " + this.value);
      },
      open: function() {
        $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" );
      },
      close: function() {
        $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" );
      }
    });
  });
</script>

<div class="ui-widget">
  <label for="cinii">Search CiNii:</label>
  <input id="cinii" size="60">
</div>
   Powered by <a href="http://ci.nii.ac.jp/">CiNii</a>
<div class="ui-widget" style="margin-top:2em; font-family:Arial">
  Result:
  <div id="log" style="height: 500px; width: 600px; overflow: auto;" class="ui-widget-content"></div>
</div>

なんでJavascriptなのか

サーバサイド処理が必要ないので、HPに埋め込んだりとかそういうところで活用できるのはメリットだと思います。

おわりに

2013年もあと少しですね*3

*1:日本の図書館関係のサービスでXHRに対応したサービスは初ではないでしょうか。

*2:自分だけ?

*3:振り返り書けるかなあ