これは「UEC Advent Calendar 2014」の20日目の記事です。UECについては別の方が書かれていると思うのですが、UECとは東京都調布市にある電気通信大学のことです。
先に書いておくと、僕はUECの現役学生でもOBでもありません。iPhoneで使える「休講情報 for 電気通信大学」アプリを作っている人です。こんなアプリです。
https://itunes.apple.com/jp/app/xiu-jiang-qing-bao-for-dian/id635224999?mt=8&uo=4&at=10l8JW&ct=hatenablog
今日はその「休講情報 for 電気通信大学」アプリについて書きたいと思います。
UECとの出会い
UECとの出会いは、僕が休講情報アプリを作るキッカケでもあります。
2012年当時、僕はぬるぷー氏(@nullpoo)と昨今の休講情報のフォーマットの乱れについて議論を交わしていました。特に東京電機大学で採用されているUNIPAでの休講情報の配信フォーマットについては統一性がなく、ぬるぷー氏もセッションで述べているように問題がありました。
僕はこの頃、ウェブスクレイピングが楽しくて、特に自分がお世話になっている近所の大学のを中心に、色んな大学の休講情報をスクレイピングして遊んでいました。
表記自体バラツキがあり、統一したインターフェイスで休講情報を見ることができれば、学生にとってどんなに楽なのかと考えていました*1。
だいたい同じ頃、ぬま氏(@numa08)と出会います。ぬま氏とはTwitterでの絡みも含めてリアルでも色々と話をしたような気がするのですが、でじこちゃんのこと以外覚えていません。でじこちゃんとは、ゲーマーズのマスコットキャラクターの「デ・ジ・キャラット」です。
本題とはあまり関係ありませんが、高校生時代に僕もでじこちゃんにハマってしまい、挙句の果てにトレカ交換オフ会に参加することとなります。多くのバイト代がトレカに注ぎ込まれました*2。初めてインターネットの人と会うキッカケでもありますが本題と関係ないので割愛します。重要なことなので2回書きました。
話の道筋が逸れてしまいましたが、そのぬま氏がUEC生であることと知り、電気通信大学の休講情報をみることができるアプリの開発を着手します。
「休講情報 for 電気通信大学」アプリを支えるインフラ
最初、休講情報アプリを支えるインフラは下記のようになっていました。自宅にちょうどファイルを置いておくためのサーバーがあったので、自宅サーバー上で動き始めました。
この構成でしばらく問題なかったのですが、住んでいる家が欠陥住宅で水道の水圧があまりにも低すぎてキッチンで洗い物をしているとシャワーがでなくなる、洗濯機を回している時間には水道が一切使えない(トイレも水が溜まらないので連続使用ができない)という問題を抱えていて引っ越すにあたりサーバーを停止しなければいけませんでした。
サーバーが停止されると当然データが更新されなくなり休講情報アプリを使っている方が困るのではないかと心配になり、Amazon Web ServicesやMicrosoft Azureなどクラウド上の仮想マシンが流行り始めていたのもあり移行を決意しました。移行直後はAWS上の、次にAzure上の仮想マシン(Windows Server)を使います。インフラの構成は下記の通りです。
これが現在運用している形となります。Azure to AWSで無駄に転送量がかかっているのですがこれ以上の改修が面倒くさい工数をかけることができずにそのままになっています。
電気通信大学の休講情報ページをHtml Agility Packを使ってスクレイピングする
先ほどの図の①の電気通信大学の休講情報ページから休講情報の取得処理ではスクレイピングしているのですが、そのスクレイピングをするために使っているのは以下のツールとライブラリ(?)です。
- Visual Studio 2013
- ライブラリ: Html Agility Pack
- ライブラリ: AWS SDK for .NET
- ライブラリ: Json.NET
12月に入ってからこのブログで「Html Agility Pack」の使い方を紹介する記事をいくつか書いているので読んでもらえると嬉しいです。Html Agility Packを使えば電気通信大学の休講情報を簡単に取得することができます。また、Xamarin.iOSを使えばiPhone上でも同じことができます。
実際には例外処理をかなり書いているのでこのままではありませんが、Html Agility Packを使って休講情報を取得する処理はざっくりと下記のような感じです。
var doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(sr.ReadToEnd()); var record = doc.DocumentNode.Descendants("tr").Skip(1); var query = record.Select(item => { var datas = item.Descendants("td"); // クラス名 var className = datas.ElementAt(0).InnerText.Trim(); // 休講日 var date = datas.ElementAt(1).InnerText.Trim(); // 時限 var period = datas.ElementAt(2).InnerText.Trim(); // 授業名 var subject = datas.ElementAt(3).InnerText.Trim(); // 教員名 var lecturer = datas.ElementAt(4).InnerText.Trim(); if (string.IsNullOrWhiteSpace(lecturer)) { lecturer = "-"; } // 備考 var note = datas.ElementAt(5).InnerText.Trim(); // 適当に休講情報を返す return new { Subject = subject }; }
このようにして取得した休講情報をJson.NETでjsonフォーマットにシリアライズして、AWS SDK for .NETを使ってS3にjsonファイルをアップロードしています(ざっくりな説明)。
休講情報アプリの今後について
前述した通り、ぬまさんが喜んでくれればという想いで開発を始めた「休講情報 for 電気通信大学」ですが、開発を開始した時点でぬまさんは社会人になっていたというオチがあります。
既に休講情報アプリを開発する理由がありませんが、使い続けてくれている学生さんもいるようです。まじで???
こーはい「電通大の休講情報アプリあって便利なんですよ〜」
— Masayoshi Wada (@masawada) 2014年12月18日
僕「どうせ知り合いが作ってるんだろうなァ」
僕「アッ醋酸先生だ」
自分が開発したアプリを使ってくれるのは嬉しく、2012年の最初のローンチから2年以上もアプリのメンテナンスを続けることができました。その他にもウェブ側の休講情報のフォーマットが変わっていないからと特にサーバーで大きな改修が必要なかったというとてもシンプルな理由もあります。
しかし、事情が変わりつつあります。iOS向けのアプリを開発している方には周知ですが、AppleはApp Store審査の担当者によって今まで問題とされていなかったことではじくことがあります。休講情報アプリでも同じことが起きました。千葉工業大学向けの休講情報アプリで致命的な不具合が発生して、それを修正させてもらえずストアから削除するということがありました。
一応、アプリ広告を掲載しているものの収益を考えるとサーバー代すらペイできていないので、複数の休講情報アプリをメンテしていくことに限界を感じ始めています。休講情報を収集するためのサーバー側のメンテナンスは仕方ないにしろ、少しでも負担を抑えるために複数あるアプリを集約してメンテナンスコストを下げようと考えいて、各大学の休講情報を統合した「休講情報アプリ(統合版)」を開発進めています。
現在リリースしている既存の「休講情報 for ○○大学」の今後のアップデートでは休講情報アプリ(統合版)とのデータの共通化を検討します。「休講情報アプリ(統合版)」がリリースされた後は、一定期間をおいて「休講情報 for ○○大学」については、App Storeから取り下げて休講情報も更新を停止させる予定です。
あ、統合版では今まで着手しては挫折していた、Android用のアプリ開発もします。Androidユーザーの方はしばらくお待ちいただけると嬉しいです。来春までにはなんとかします……
さいごに
UEC生でもOBでもない、共通点といえば同じ調布市にいるくらいの人間がUEC Advent Calendarを書かせていただきました。まだUECと関連ができて2年ですが調布祭も楽しませて頂いています。そのお礼(?)ではありませんが、もしiPhoneをお使いでしたら是非休講情報アプリを使ってみてください。
明日のUEC Advent Calendarの担当は、dora22sibuyaさんです。それでは!