地域図書館の貸出記録を取得

これまで図書館で借りた本など、読んだ本の情報は手作業で書き留めていました。

でも図書館のホームページには例えば貸出延長したりできるようなサービスがあって、今自分が借りている図書の一覧を表示してくれるんですよね。これを利用しない手は無いと思い、貸出図書一覧を自動的に取得してデータベースに登録するシェルスクリプトを作成してみました。

とにかくログインするのが苦労しました。

 "https://.../webopac/nonidf.do?userid=${USERID}&password=${PASSWD}"

までは比較的容易だったのですが、最後の

   "&cmd=login"

に気が付くまで3日もかかりました。

ログインしてクッキーを取得して、そのクッキーをサーバーに送信するという手順については下記URLなどを参考にさせて頂きました。

http://qiita.com/kuboon/items/85169dcec746db552935

私が利用している地域図書館では、例えば

資料名:    首折り男のための協奏曲∥伊坂 幸太郎/著∥新潮社∥2014.1∥Fイサカ◇Fイサカ◇913.6

のように「∥」(スラッシュ-スラッシュではありません。シフトJISで8161の一文字の記号です)を区切り文字として、タイトル、著者名、出版社、発行年月などを表示してくれますので、awkを使って変数に読み込み、データベースに登録しました。

登録後のテーブルの内容です。

mysql> select seq,auther,title,出版社,発行年月 from library;
+-----+---------------------+---------------------------------------------------------------+-----------------+--------------+
| seq | auther              | title                                                         | 出版社      | 発行年月     |
+-----+---------------------+---------------------------------------------------------------+-----------------+--------------+
|   1 | 西條奈加/著         | いつもが消えた日(お蔦さんの神楽坂日記[2])   | 東京創元社      | 2013-11-01   |
|   2 | 上田早夕里/著       | 妖怪探偵・百目3百鬼の楽師(光文社文庫う18-5)   | 光文社       | 2015-11-01   |
|   3 | 堀川アサコ/著       | 小さいおじさん(新潮文庫nexほ-21-22)   | 新潮社          | 2016-04-01   |
|   4 | 山本甲士/著         | つめ                                                    | 小学館          | 2016-10-01   |
|   5 | 伊坂幸太郎/著       | 首折り男のための協奏曲                      | 新潮社          | 2014-01-01   |
|   6 | 坂木司/著           | 短劇(光文社文庫さ24-2)                          | 光文社          | 2011-02-01   |
+-----+---------------------+---------------------------------------------------------------+-----------------+--------------+
6 rows in set (0.24 sec)

 


 

#!/bin/bash
WORKDIR=~/library
USERID=XXXXXXXXX # 図書館カードのID番号
PASSWD=XXXXXXXX  # 事前に登録したパスワード

# データベースにテーブルが存在しない場合定義します
mysql  life_log << _SQL_
 create table if not exists library(
  seq int primary key auto_increment,
  title tinytext,
  auther tinytext,
  出版社 tinytext,
  発行年月 date,
  その他 tinytext,
  org tinytext,
  insertDate datetime,
  comment varchar(20)
);
_SQL_

# SSL認証によりログインしてクッキーを取得
curl "https://web.oml.city.osaka.lg.jp/webopac/nonidf.do?\
userid=${ USERID }&password=${ PASSWD }&cmd=login" \
-c ${ WORKDIR }/cookie.txt > /dev/null 2>&1

# クッキーを使用して利用状況一覧を取得
curl -b ${ WORKDIR }/cookie.txt \
"https://web.oml.city.osaka.lg.jp/webopac/nonasklst.do" \
> ${ WORKDIR }/temp.html 2>/dev/null

num_book=`\
 w3m -dump ${ WORKDIR }/temp.html |\
 grep "貸出中の資料" |\
 sed -e "s/貸出中の資料//g" |\
 sed -e "s/件//g" |\
 sed -e "s/ //g"`
echo ${ num_book }冊借りてます

# 貸出一覧を取得します。
# 一度に3冊までしか表示してくれませんので
# ${ num_book }回取り込みます
for ( ( book=1; book<=${ num_book }; book++ ) )
do
 curl -b ${ WORKDIR }/cookie.txt \
 "https://web.oml.city.osaka.lg.jp/\
webopac/nonlenlst.do?startpos=${ book }" \
 > ${ WORKDIR }/temp.html 2>/dev/null
 original=`\
  w3m -dump ${ WORKDIR }/temp.html -cols 255 |\
  grep "資料名" |\
  sed -n '1p' |\
  sed -e "s/資料名://g"|\
  sed -e "s/ //g"`
 nchar=`echo  "$original" | wc -c`
 echo ${nchar}文字です
 if [ $nchar -ge 255 ]
 then
  original="tinytext型は255文字までです"
 fi

# 区切り文字「∥」により書名、著者名、出版社、発行年月などを
# 取得します
 title=`echo "$original" | awk -F∥ '{ print $1 }'`
 auther=`echo "$original" | awk -F∥ '{ print $2 }'`
 publish=`echo "$original" | awk -F∥ '{ print $3 }'`
 pubDate=`echo "$original" | awk -F∥ '{ print $4 }'`
 other=`echo "$original" | awk -F∥ '{ print $5 }'`
 pubDate=`echo $pubDate | sed -e "s/$/\.1/g"`

  echo -----------------
  echo タイトル=$title
  echo 著者=$auther
  echo 出版社=$publish
  echo 発行年月=$pubDate
  echo その他="$other"

# データベースに登録します
  mysql - life_log << _SQL_
   insert into library(title,auther,出版社,発行年月,その他,org,insertDate)
   value("$title","$auther","$publish","$pubDate","$other","$original",
   now() );
_SQL_
done
rm ${ WORKDIR }/temp.html

 

 

mbrolaで狸囃し

 無料のボーカロイドmbrolaをインストールして、童謡「しょうじょうじのたぬきばやし」を歌わせてみました。

”こい、こい、こい!”の部分で、少し苦労しています。

 


 

#!/bin/bash
# パッケージmbrolaの取得
for package in mbrola
do
success=`
apt list ${ package } |\
 grep インストール済み |\
 wc -l`
if [ ${ success } -eq 0 ]
then
 sudo apt install ${ package }
else
 echo ${ package } はインストール済み
fi
done
# 日本語音声のダウンロード
wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/jp3/jp3.zip
unzip jp3.zip

cat <<+ |\
mbrola jp3/jp3 /dev/stdin -.au | aplay
S    100    0    131
o    400    0    131
S    100    0    165
o    400    0    165
S    100    0    196
o    150    0    196
dZ    100    0    165
o    150    0    165
dZ    100    0    131
i    150    0    131
_    250    
S    100    0    196
o    150    0    196
dZ    100    0    165
o    150    0    165
dZ    100    0    147
i    150    0    147
n    100    0    131
o    150    0    131
n    100    0    147
i    150    0    147
w    100    0    165
a    150    0    165
w    100    0    196
a    150    0    196
_    250    
t    100    0    165
u    400    0    165
t    100    0    196
u    400    0    196
t    100    0    261
u    150    0    261
k    100    0    330
i    150    0    330
j    100    0    293
o    150    0    293
d    100    0    261
a    150    0    261

m    100    0    196
i    275    0    196
n    50    0    196
a    75    0    196
d    100    0    219
e    150    0    219
t    100    0    196
e    100    0    196
k    40    0    261
o    50    0    261
i    100    0    261
_    10
k    40    0    261
o    50    0    261
i    100    0    261
_    10
k    40    0    261
o    50    0    261
i    100    0    261
_    250        
+

 

 

 

データベースをキーワードで検索

まず、下記のテーブルを作成しました。

mysql> select * from keyword;
+-----+--------+
| seq | word   |
+-----+--------+
|   1 | 長野   |
|   2 | 地震   |
+-----+--------+
2 rows in set (0.00 sec)

一応興味があるキーワードのリストと考えています。これを、

select n.seq,title,pubDate,word from nhk_main n join keyword
 where title like concat('%',word,'%')
 and effect=1 order by word,pubDate;

というSQL文で検索すると、

 

+------+----------------------------------------------------------------------------------+---------------------+--------+

| seq  | title                                                           | pubDate         | word   |

+------+----------------------------------------------------------------------------------+---------------------+--------+

|   53 | 調理実習でスイセン食べ食中毒か 14人搬送 長野          | 2017-05-16 18:48:00 | 長野   |
|  844 | 長野 飯山の土砂崩れ 土石流のおそれで住民に避難勧告      | 2017-05-21 11:59:00 | 長野   |
|  852 | マラソン大会で男女7人を搬送 熱中症か 長野              | 2017-05-21 15:38:00 | 長野   |
| 1019 | JR長野駅 トイレで異臭 高校生2人手当て                | 2017-05-22 13:00:00 | 長野   |
| 1106 | 土石流がダム乗り越えたか 避難指示に切り替え 長野 飯山   | 2017-05-22 22:32:00 | 長野   |
| 1238 | 避難指示の土砂崩れ 危険性下がらずと専門家 長野          | 2017-05-23 20:52:00 | 長野   |
| 1660 | JR長野駅近くにイノシシ 男性襲われけが                 | 2017-05-26 08:55:00 | 長野   |
| 1687 | JR長野駅近くで男性襲ったイノシシ 住宅地で捕獲         | 2017-05-26 12:31:00 | 長野   |
| 2386 | 防災ヘリ墜落9人死亡事故で合同追悼式 長野 松本          | 2017-05-30 15:19:00 | 長野   |
| 2784 | 中学教諭が生徒に体罰 母親もけが 長野 白馬村             | 2017-06-01 20:13:00 | 長野   |
+------+----------------------------------------------------------------------------------+---------------------+--------+

|  529 | 熊本地震の災害公営住宅 用地確保は約40%にとどまる     | 2017-05-19 17:01:00 | 地震   |
| 1795 | 南海トラフ地震 地域の危険度に応じた対策を               | 2017-05-27 04:08:00 | 地震   |
| 2057 | 秋田駒ヶ岳火山性地震21回 今後の火山活動に注意       | 2017-05-28 15:35:00 | 地震   |
| 3974 | 熊本地震の発生前 約7割の住民“活断層知らず”           | 2017-06-09 04:17:00 | 地震   |

+------+----------------------------------------------------------------------------------+---------------------+--------+

 

という風に、ここ最近のニュースが表示されます。

キーワードのリストを徐々に増やしてゆけば、どんなニュースが現在ホットなのか分析可能となりそうです。

 

 

嚥下障害 ~冷し汁粉~

水60ccに「さらしあん25g」と「粉砂糖15g」および「塩茶さじ1杯」を混ぜ、だまにならないように良く溶かします。これにとろみ剤大さじ1を加えてミキサーで撹拌しました。

f:id:S_E_Hyphen:20170616111223j:plain

少し塩分が強めでしたが、まずまずの出来だったと思います。

 

f:id:S_E_Hyphen:20170616111405j:plain

口直しの昆布茶です。

水100ccに茶さじ2杯程度の昆布茶を加え、大さじ1杯のとろみ剤とともに撹拌したものです。

 

デジカメのEXIF情報

デジカメで撮影した画像にはEXIF情報というのが盛り込まれてあって、カメラの型番やら撮影時刻なんかが全部読み取れるようになっているそうです。

これらの情報を秘匿するためのシェルスクリプトを作成してみました。

昨日 アジサイの写真の元画像のEXIFは以下の通りでした。

File name    : P6120002.JPG
File size    : 2306002 bytes
File date    : 2017:06:12 11:51:42
Camera make  : OLYMPUS IMAGING CORP.  
Camera model : TG-2            
Date/Time    : 2017:06:12 11:51:42
Resolution   : 3968 x 2232
Flash used   : No (auto)
Focal length :  4.5mm  (35mm equivalent: 25mm)
Exposure time: 0.0031 s  (1/320)
Aperture     : f/2.8
ISO equiv.   : 100
Whitebalance : Auto
Metering Mode: pattern
Exposure     : program (auto)
GPS Latitude : ? ?
GPS Longitude: ? ?
JPEG Quality : 92

作成したシェルスクリプトを実行した本日のアジサイの写真のEXIF

File name    : P6120002_for_upload.jpg
File size    : 48579 bytes
File date    : 2017:06:13 17:11:57
Resolution   : 952 x 536
JPEG Quality : 30

となっています。

f:id:S_E_Hyphen:20170613172543j:plain

 


 

#!/bin/bash
# パッケージとしてimagemagickとjhead
# を使用します
for package in imagemagick jhead
do
success=`
apt list ${ package } |\
 grep インストール済み |\
 wc -l`
if [ ${ success } -eq 0 ]
then
 sudo apt install ${ package }
else
 echo ${ package } はインストール済み
fi
done

# 300dpiを72dpi(24%)に間引きます
# ついでに画質も落としておきます
file=`basename $1 .JPG`
convert -geometry 24% -quality 30 ${ file }.jpg ${ file }_for_upload.jpg
jhead -purejpg ${ file }_for_upload.jpg

 

GMT ver.5 を使ってドルチャート描画

まず下記のようなデータベースを準備しておきます。

 

mysql> select updateDate,y2d,d2y from dollar\

     where "2017-6-5"<updateDate order by updateDate limit 10;
+---------------------+--------+--------+
| updateDate          | y2d    | d2y    |
+---------------------+--------+--------+
| 2017-06-05 06:20:00 | 110.79 | 110.29 |
| 2017-06-05 06:30:00 | 110.81 | 110.31 |
| 2017-06-05 06:50:00 |  110.7 |  110.2 |
| 2017-06-05 07:00:00 | 110.73 | 110.23 |
| 2017-06-05 07:10:00 | 110.71 | 110.21 |
| 2017-06-05 07:20:00 | 110.78 | 110.28 |
| 2017-06-05 07:30:00 | 110.83 | 110.33 |
| 2017-06-05 07:40:00 | 110.78 | 110.28 |
| 2017-06-05 07:50:00 | 110.81 | 110.31 |
| 2017-06-05 08:00:00 | 110.76 | 110.26 |
+---------------------+--------+--------+
10 rows in set (0.11 sec)

 

データベース準備にあたって、RSSの取得やxmlの取り扱いについては、 RSSの取得 - あるStray Engineer の日記xmlのmysqlへの登録 - あるStray Engineer の日記 も参考にしてみて下さい。

このデータベースから所望の期間の検索を行ってグラフを描画するスクリプトを作成しました。

f:id:S_E_Hyphen:20170611103229j:plain

今週では6月7日が比較的円高だったみたいですね。同時に金の価格も高かったようです。

 

 


 

#/bin/bash
# 一時ファイル$tempの作成
temp=`mktemp ./XXXX.tmp`
psfile=/home/user/nhk/金ドル.ps

# ドル-円チャートの最大最小値の定義
min_y=105
max_y=115
# 金価格チャートの最大最小値の定義
min_g=4800
max_g=4900

# $dateには現在日時をMYSQLに適した書式で取得
date=`date +'%Y-%m-%d %H:%M:%S'`

# 7日前から現在までのドル価格を検索
if [ ! -z $temp ]
then
mysql life_log -N << _MYSQL_ > $temp
 select updateDate,y2d,d2y from dollar
  where "$date" - interval 7 day<=updateDate
  and updateDate <="$date"
  order by updateDate;
_MYSQL_
fi

# GMT ver.5ではgmtのコマンドは必ずgmtから始まります
# 日本語フォントなどの設定を行っています
gmt gmtset FORMAT_DATE_MAP yy-mm-dd
gmt gmtset FONT_TITLE 12p,GothicBBB-Medium-UniJIS-UTF8-H
gmt gmtset FONT_LABEL 8p,GothicBBB-Medium-UniJIS-UTF8-H
gmt gmtset FONT_ANNOT_PRIMARY 8p,GothicBBB-Medium-UniJIS-UTF8-H

date1=`date -d "$date 6 days ago" +'%Y-%m-%d'`
date2=`date -d "$date 1 days" +'%Y-%m-%d'`
# 軸の設定です
# -JオプションでX軸にTが入っているのは時間軸を示す
# -Rオプションはver.4と変わりないみたいです
# -Bオプションは大きく変わってます。
#  まず図のタイトルを+t"タイトル"で定義してます。
#  ver.4ではX軸/Y軸でしたが、
#  -Bx+l"X軸ラベル" -By+l"Y軸ラベル"
#    と定義するようになりました。
gmt psbasemap -JX25cT/3c \
 -R"$date1"T00:00:00/"$date2"T00:00:00/${ min_y }/${ max_y } \
 -BWESn+t"最近1週間の円/ドル換算レート" \
 -Bxa1Df1D+l"年-月-日" \
 -Bya5g1 \
 -K -Y15c > $psfile
# ドルを買う際の円の値段をグラフ化しています(赤線)。
# psxyの-Wオプションも変わってますね。
# ver.4では -W1/255/0/0でしたが、-W1p,255/0/0に
# なってます。この後ろに線種(破線とか点線とか)
# の指定もできるようです。
cat $temp |\
 awk -v min="$min_y" -v max="$max_y"\
 '$3<min{printf "%sT%s %s\n",$1,$2,min;next}\
  $3>max{printf "%sT%s %s\n",$1,$2,max;next}\
        {printf "%sT%s %s\n",$1,$2,$3}' |\
 gmt psxy -J -R -B -O -K -W1p,255/0/0 >> $psfile
# ドルを売る際の円の値段をグラフ化しています(青線)。
cat $temp |\
 awk -v min="$min_y" -v max="$max_y"\
 '$4<min{printf "%sT%s %s\n",$1,$2,min;next}\
  $4>max{printf "%sT%s %s\n",$1,$2,max;next}\
        {printf "%sT%s %s\n",$1,$2,$4}' |\
 gmt psxy -J -R -B -O -K -W1p,0/0/255 >> $psfile
# pslegendはver.4でもあまり使ったことがないのですが、
# 相当変わったと思います。大体オプションの最中で+とか
# 聞いたことないし…。
gmt pslegend -R -J -DJ${ date2 }/${ max_y }+w2.5+jTR \
 -F+gwhite+i0.1c/1p -K -O << END >> $psfile
N 1
S 0.2c s 0.5c 0/0/255 0.25p 0.6c ドル→円
S 0.2c s 0.5c 255/0/0 0.25p 0.6c 円→ドル
END

#############################
# ここからは金チャートです  #
#############################

# 7日前から現在までの金価格を検索
if [ ! -z $temp ]
then
mysql life_log -N << _MYSQL_ > $temp
 select insertDate,title from gold
  where "$date" - interval 7 day<=insertDate
  and insertDate <="$date"
  and effect=1
  order by insertDate;
_MYSQL_
fi

# 軸の設定です。ドル-円チャートと大体同じです。
gmt psbasemap -JX25cT/3c \
 -R"$date1"T00:00:00/"$date2"T00:00:00/${ min_g }/${ max_g } \
 -BWESn+t"最近1週間の金価格" \
 -Bxa1Df1D+l"年-月-日" \
 -Bya50g10 \
 -K -O -Y-7c >> $psfile

# 金価格を黒丸で表示します。
cat $temp |\
 sed -e "s/金//g" |\
 sed -e "s/円.*$//g" |\
 sed -e "s/,//g" |\
 awk -v min="$min_g" -v max="$max_g" \
 '$3<min{printf "%sT%s %s\n",$1,$2,min;next} \
  $3>max{printf "%sT%s %s\n",$1,$2,max;next} \
        {printf "%sT%s %s\n",$1,$2,$3}' |\
 gmt psxy -J -R -B -O -Sc0.3 -G0/0/0 >> $psfile

#一時ファイルを消去して画像ファイルを変換します。
rm $temp
convert -density 200 -quality 30\
 $psfile `echo $psfile|sed -e "s/.ps/.jpg/g"`