噺
長さは長いものの内容は薄いので斜めに読んで下さい。
電気通信大学という大学には休講という概念があって、講義がお休みになります。広義の休講では自主的なものも含まれるようですが今回は狭義でいきます。
便利なページがありまして、電気通信大学(学域・学部) 休講のお知らせ というのですが、これを見ることで講義があるか否かを知ることができます。
大変なのはこのページが不定期で更新されることで、朝見て休講がないままよ~し行くぞと大学に着いたら誰もいないみたいなことがあります。つまりいつの間にか休講になっていたりするということです。
なんとかして更新を知りたくなるわけで、cronを回すか何かしてみようとなるわけです。curlするとこうなります。
$ curl kyoumu.office.uec.ac.jp/kyuukou/kyuukou.html
<HTML>
<HEAD>
<TITLE>d
C?M・
wi
襴
wj@
u?ィm点</TITLE> x
"<meta name='viewport' Content = 'width=320,' height=480, initial-scale=1.0, minimum-scale=1.0,maximum-scale=2.0,user-scalable=yes' />"
<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>
</HEAD>
<BODY BGCOLOR=#FFFFFF>
<H2>d
C?M・
wi
襴
wj@
u?ィm点</H2> x
<font color='red'>
wアⅲVXe?pX[h?X??「ト <BR>
wアⅲVXe?pX[hェA<strong>ⅲ
靏Z^[
・
?ュセウ「B<BR>ヲⅲ nVXe?pX[h</strong>??靹湜?オスB</font><BR>ヲ[Uシヘ?ィ・キフ?イ
(後略)
charset=Shift_JISとの指定があります、あいにくUTF-8環境なのでnkfでねじ伏せます。
$ curl kyoumu.office.uec.ac.jp/kyuukou/kyuukou.html | nkf -Sw
<HTML>
<HEAD>
<TITLE>電気通信大学(学域・学部) 休講のお知らせ</TITLE>
"<meta name='viewport' Content = 'width=320,' height=480, initial-scale=1.0, minimum-scale=1.0,maximum-scale=2.0,user-scalable=yes' />"
<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>
</HEAD>
<BODY BGCOLOR=#FFFFFF>
<H2>電気通信大学(学域・学部) 休講のお知らせ</H2>
<font color='red'>★ 学務情報システムのパスワード変更について ★<BR>学務情報システムのパスワードが、<strong>情
(後略)
すごいですね。上の文字化け状態でもわかりますが、HTMLタグが大/小文字混じっているとか、fontタグとか、沢山使われていて良いです。何より良いのは4行目で、クオートがついていて丁寧です。
view-source:http://kyoumu.office.uec.ac.jp/kyuukou/kyuukou.htmlとかすれば同じものが見られます。
まぁ実はこの辺りは変わらないので特に気にしないでokです。
必要なのは下の方にある表です。
<TABLE BORDER=2>
<TR BGCOLOR=#DDDDDD>
<TD ALIGN=CENTER><B>クラス</B></TD>
<TD ALIGN=CENTER><B>月日</B></TD>
<TD ALIGN=CENTER><B>時限</B></TD>
<TD ALIGN=CENTER><B>科目</B></TD>
<TD ALIGN=CENTER><B>担当教員</B></TD>
<TD><B>備考</B></TD>
</TR>
<TR>
<TD ALIGN=CENTER>
(後略)
と続きます。これを
- うまいことパースして
- 更新されてるか確認して
- うまいこと通知する
ことがしたいですね。
パースは何も考えずにシェルスクリプトでやりました。awkとか使ってコクを出します。
$ curl kyoumu.office.uec.ac.jp/kyuukou/kyuukou.html | nkf -Sw | egrep -i '<(tr|td)' | tr -d '\r' | sed 's/<\/\?b>//ig' | sed 's/<\([^\s>]\+\)\s\+[^\s>]*>/\1 /i' | sed 's/<\(tr\|td\)>/\1 /ig' | sed 's/\(tr\|td\) /\1,/ig' | sed 's/<\/\(tr\|td\)>//ig' | awk 'BEGIN{FS=",";f=0} /TD/{s=s "|" $2} NR>1 && /TR/{print s "|";s="";if(f==0){print "|:---|:---|:---|:---|:---|:---|";f++;}} END{print s "|";}'
パイプ9本で済みます。2016/12/04/00:00現在ではこんな感じ↓になります。
|クラス|月日|時限|科目|担当教員|備考|
|:---|:---|:---|:---|:---|:---|
|3S・電子工学コース・光エレクトロニクスコース・応用物理工学コース|12月2日(金)|1|熱・統計物理学基礎|尾関| |
|1年昼・クラス4・9・10|12月2日(金)|2|Academic Written English Ⅱ|上原| |
|2昼|12月2日(金)|4|英語演習|上原| |
|1K|12月3日(土)|2|Academic Spoken English Ⅱ|○ロイ| |
|1K|12月3日(土)|3|Academic Written English Ⅱ|○ロイ| |
|2I・I2クラス|12月5日(月)|2|情報・通信演習2|西(一)| |
|2I・I2クラス|12月5日(月)|3|基礎電気回路|西(一)| |
|3S生体機能システムコース|12月5日(月)|3|分子分光学|山北| |
|1年昼・クラス9|12月6日(火)|2|微分積分学第二 |山口(耕)| |
|1年昼・クラス7・8・12|12月6日(火)|3|Academic Spoken English Ⅱ|上原| |
|1年昼・クラス9|12月6日(火)|3|物理学概論第二|來住| |
|1年昼・クラス12|12月6日(火)|4|微分積分学第二 |山口(耕)| |
|1年昼・クラス3・4・6|12月6日(火)|4|Academic Spoken English Ⅱ|上原| |
|上級科目|12月6日(火)|5|Preparation for Graduate School|上原| |
|人文社会|12月7日(水)|1|地理学B|○戸田| |
|2M|12月8日(木)|2|プログラミング演習|結城| |
|2I・I1クラス|12月8日(木)|4|基礎電子工学|○望月| |
|2I・I2クラス|12月13日(火)|2|プログラミング通論(I2クラス)|○丸山| |
|II類第4クラス|12月14日(水)|1|確率統計|川端| |
|2I・I2クラス|12月15日(木)|4|情報通信と符号化|川端| |
|3K・EMCコース|12月17日(土)|4・5|専門実験B テーマ5(応力解析)担当:梶川のみ休講|梶川|対象はグループA。なお、17日の補講については10日の実験の際に相談して決めます。|
|人文社会|12月21日(水)|5|歴史学B|○倉橋| |
|人文社会|1月4日(水)|1|文化人類学B|○執行| |
|1年・Ⅱ類|1月4日(水)|1|力学|柳澤| |
|2I・I2クラス|1月4日(水)|3|生涯スポーツ演習B(卓球)|○額谷| |
|2I・I1クラス|1月4日(水)|4|生涯スポーツ演習B(卓球)|○額谷| |
|クラス4・9・10|1月13日(金)|2|Academic Writing in English Ⅱ|○近藤(良)| |
|1年昼・クラス6|2月3日(金)|1|線形代数学第二|○中井| |
|1年昼・クラス5|2月3日(金)|2|線形代数学第二|○中井| |
これで扱いやすいmarkdownの表ができました。列の数は固定なので便利ですね。
これをcronして、md5sumか何かで更新されたか否かを見て、SlackだとかLINE Notifyなんかに投げてあげれば、スマートフォンで更新通知を受け取ることができます。
残った欲望としては自分に関連するところだけを通知したいんですが、講義によって様々な分け方が存在するため、出てくるパターンの全貌が不明です。収集して図鑑みたいにするとできそうですね。