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のときとあまり変わりません。
何が分かるか
まだ機能があんまりないので分かることが少ないので続々追加できたらと思ってます、が続々追加されるかどうかは気分次第なので正直わかりません。
全国で○館が所蔵している図書を○図書館では何冊持っているかのグラフを表示
たとえば、全国で2館しか所蔵していない図書(=NCID)を自分の図書館では何冊(=NCIDの件数)持っているかのグラフを表示。ささくれ、で紹介されているウィルキングラフ、というグラフです。たぶん、大抵ぐーっと横長のグラフになるので、ブラウザの横バーをうごかしてみてください。
“ウィルキン・グラフ”―他のX館が所蔵している資料をうちは何冊所蔵しているか?
http://current.ndl.go.jp/node/22526
○○図書館における出版年ごとの冊数のグラフを表示
出版年ごと(1年スパン)に何冊の図書(=NCID)を持っているかをグラフに表示。
使っているもの
NII提供のFANOリスト
今後の予定
前回から、1年あいてしまったので正直なんともいえないのですが、機能追加していけたらと考えています。館としての可視化もあれば、一冊の図書を各館のフィルターを通して可視化してみる、というのも。もしリクエスト等あればお寄せいただけると嬉しいです。しかし、List.js使ったの2度目ですが使いやすいですね、これ。
List.js
去年、仕事で少し使ってたList.jsを別件で使っています。
http://listjs.com/
これ、かなり使えます。サーチ、ソート、フィルター、組み合わせも。とにかくシンプル。
今回、1200件のリストを読み込ませると「表示されない」、のでちょっとソースをいじる必要あり。そのメモ。
start: function()の、
self.page = 200;
を好きな数字に変えてやればその数字が表示限度になります。
CiNii Booksの所蔵館情報からメールアドレスリストをつくってみる
はじめに
某MLでこんな感じの話題が少し前にあったのでCiNiiの所蔵館情報から正規表現を使ってメールアドレスを抜き出すスクリプトをシェルスクリプトで書いてみました。
仕組み
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>@<\/noscript>/\@/g'| uniq) EMAIL=$(echo ${CINII_DATA} | grep -e 'writeAtMark()' -e '@' | sed -e 's/<script>writeAtMark()<\/script><noscript>@<\/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
合宿
果たせなかった約束をようやく果たせました。
リードテック合宿。
今夜は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年間。
気づけば、一年を通して、ほとんどどこにも出かけなくなりました。
来年、もしどこかでお会いしたらよろしくお願いします。
CiNii JSONとはてなブログでできること
はじめに
旧CiNiiがCiNii Articlesというサービスとなり、JSONの返戻データの形式も変わってしまったため、このエントリーのコードは動かなくなっていることに気がつきましたので、コード部分だけでも動くように修正をしました。2017/11/6
CiNii APIがJSONに対応しました。
http://ci.nii.ac.jp/info/ja/index_2013.html#20131011-3
id:otani0083 が書いてますので詳細はこちらを。
http://otani0083.hatenablog.com/entry/2013/10/19/162832
さて、おーたにさんの記事はPythonで処理してます。サーバサイドでの処理もいいのですが、せっかくのJSONでXMLHttpRequest対応なんだからJavascriptでしょうここは、と偉そうにコメントしてしまっていたので年内にやっつけでもいいので記事書いてすっきりしたいと思います*1。あとは「JavaScript使える!」と超盛り上がって*2わいわいとLi:d techで先着何名の招待をもらったはてなブログを使いはじめたのが2011/11/24であれから2年経ったということなので、初心に戻ってはてなブログとJavascriptで遊んでみました。
はてなブログからCiNii検索
はてなブログからCiNiiの検索結果を取得する感じの一番オーソドックスな活用方法みたいなのを作ってみました。下の検索窓に入力するとajaxでCiNiiへ検索しにいき検索結果がサジェストされます。サジェストされたタイトルの中から、選択すると、その下の枠に「やっつけCSV形式」で他の書誌事項とともに表示されます。
ソース
はてなブログやホームページなどに貼付けてもらえれば動くと思います。
<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。