酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

電気通信大学の休講情報アプリについて

これは「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での絡みも含めてリアルでも色々と話をしたような気がするのですが、でじこちゃんのこと以外覚えていません。でじこちゃんとは、ゲーマーズのマスコットキャラクターの「デ・ジ・キャラット」です。

デ・ジ・キャラット by くーの on pixiv

本題とはあまり関係ありませんが、高校生時代に僕もでじこちゃんにハマってしまい、挙句の果てにトレカ交換オフ会に参加することとなります。多くのバイト代がトレカに注ぎ込まれました*2。初めてインターネットの人と会うキッカケでもありますが本題と関係ないので割愛します。重要なことなので2回書きました。

話の道筋が逸れてしまいましたが、そのぬま氏がUEC生であることと知り、電気通信大学の休講情報をみることができるアプリの開発を着手します。

「休講情報 for 電気通信大学」アプリを支えるインフラ

最初、休講情報アプリを支えるインフラは下記のようになっていました。自宅にちょうどファイルを置いておくためのサーバーがあったので、自宅サーバー上で動き始めました。

f:id:ch3cooh393:20141219231454p:plain

この構成でしばらく問題なかったのですが、住んでいる家が欠陥住宅で水道の水圧があまりにも低すぎてキッチンで洗い物をしているとシャワーがでなくなる、洗濯機を回している時間には水道が一切使えない(トイレも水が溜まらないので連続使用ができない)という問題を抱えていて引っ越すにあたりサーバーを停止しなければいけませんでした。

サーバーが停止されると当然データが更新されなくなり休講情報アプリを使っている方が困るのではないかと心配になり、Amazon Web ServicesやMicrosoft Azureなどクラウド上の仮想マシンが流行り始めていたのもあり移行を決意しました。移行直後はAWS上の、次にAzure上の仮想マシン(Windows Server)を使います。インフラの構成は下記の通りです。

f:id:ch3cooh393:20141219231514p:plain

これが現在運用している形となります。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 電気通信大学」ですが、開発を開始した時点でぬまさんは社会人になっていたというオチがあります。

既に休講情報アプリを開発する理由がありませんが、使い続けてくれている学生さんもいるようです。まじで???

自分が開発したアプリを使ってくれるのは嬉しく、2012年の最初のローンチから2年以上もアプリのメンテナンスを続けることができました。その他にもウェブ側の休講情報のフォーマットが変わっていないからと特にサーバーで大きな改修が必要なかったというとてもシンプルな理由もあります。

しかし、事情が変わりつつあります。iOS向けのアプリを開発している方には周知ですが、AppleはApp Store審査の担当者によって今まで問題とされていなかったことではじくことがあります。休講情報アプリでも同じことが起きました。千葉工業大学向けの休講情報アプリで致命的な不具合が発生して、それを修正させてもらえずストアから削除するということがありました。

一応、アプリ広告を掲載しているものの収益を考えるとサーバー代すらペイできていないので、複数の休講情報アプリをメンテしていくことに限界を感じ始めています。休講情報を収集するためのサーバー側のメンテナンスは仕方ないにしろ、少しでも負担を抑えるために複数あるアプリを集約してメンテナンスコストを下げようと考えいて、各大学の休講情報を統合した「休講情報アプリ(統合版)」を開発進めています。

f:id:ch3cooh393:20141220000255p:plain

現在リリースしている既存の「休講情報 for ○○大学」の今後のアップデートでは休講情報アプリ(統合版)とのデータの共通化を検討します。「休講情報アプリ(統合版)」がリリースされた後は、一定期間をおいて「休講情報 for ○○大学」については、App Storeから取り下げて休講情報も更新を停止させる予定です。

あ、統合版では今まで着手しては挫折していた、Android用のアプリ開発もします。Androidユーザーの方はしばらくお待ちいただけると嬉しいです。来春までにはなんとかします……

さいごに

UEC生でもOBでもない、共通点といえば同じ調布市にいるくらいの人間がUEC Advent Calendarを書かせていただきました。まだUECと関連ができて2年ですが調布祭も楽しませて頂いています。そのお礼(?)ではありませんが、もしiPhoneをお使いでしたら是非休講情報アプリを使ってみてください。

明日のUEC Advent Calendarの担当は、dora22sibuyaさんです。それでは!

*1:これは冷静に考えると学生は所属している大学の休講情報さえ見ることができればよいので、統一したインターフェイスにする必要がなければ楽もくそもない……

*2:基本的にバイト代は画塾とアクリル絵の具と鉛筆に消えていってた

C#でHtml Agility Packを使って豊橋技科大の休講情報を取得する

この記事は「TUT Advent Calendar 2014」の3日目です。たまたまAdventarで発見した豊橋技術科学大学関係者向けのアドベントカレンダーで、3日目が空いていたので学外の人ですが参加してみます。

Html Agility Packという.NET Framework向けに書かれたHTMLパーサーライブラリがあります。このライブラリはC#から利用することができます。簡単にウェブスクレイピングすることができます。

豊橋技術科学大学の休講情報を試しにパースしてみましょう。TUT休講情報botが存在しているので、学内の方もおそらく同じようにスクレイピングしているのではないかと思いますが、休講情報は下図のようにとても綺麗なTable構造になっています。

f:id:ch3cooh393:20141203014038p:plain

このページには休講情報と補講情報とが掲載されているのですが、ここでは休講情報に絞りたいので休講情報が掲載されているテーブル部分をXPathを指定して取得し、そこからLINQのSelectメソッドを使って、trタグ別に分割して取得処理を実行したいと思います。

以下、サンプルコードです。

// 休講情報を取得したいサイトのURL
var urlstring = "https://www.ead.tut.ac.jp/board/main.aspx";

// 指定したサイトのHTMLをストリームで取得する
var doc = new HtmlAgilityPack.HtmlDocument();
using (var client = new HttpClient())
using (var stream = await client.GetStreamAsync(new Uri(urlstring)))
{
    // HtmlAgilityPack.HtmlDocumentオブジェクトにHTMLを読み込ませる
    doc.Load(stream, Encoding.UTF8);
}

// XPathを指定して休講情報テーブル部分を取得する
var items = doc.DocumentNode.SelectNodes("//*[@id=\"grvCancel\"]/tr")
    .Skip(1)
    .Select(item =>
    {
        // td単位で複数のデータを取得する
        var data = item.SelectNodes("td");

        // 休講日
        var date = data.ElementAt(1).InnerText;

        // 時限
        var period = data.ElementAt(2).InnerText;

        // 授業の名前
        var subject = data.ElementAt(3).InnerText;

        return new { Date = date, Period = period, Subject = subject };
    });

// 取得した休講情報を出力する
items.ToList().ForEach(item =>
{
    Debug.WriteLine("{0}({1}) {2}", item.Date, item.Period, item.Subject);
});

上記のサンプルコードを実行した結果です。C#とHtml Agility Packを使えば、とても簡単に休講情報を得ることができます。

f:id:ch3cooh393:20141203014802p:plain

これらの休講情報を元にTwitterで呟くbotを作りたいな……と考えている方が居れば、こちらの記事も参考にしてみてください。

明日は……

ごめんなさい。どなたなのでしょう……

関連記事

このブログでHtml Agility Packについて取り扱った記事をピックアップしました。

休講情報APIが提供されている大学一覧

f:id:ch3cooh393:20141126235135p:plain

タイトルに反するようですが、休講情報APIは通常公開されていません。有志(個人であったりサークルであったり)によってAPI化されて公開されています。

電通大にもAPIがあったようなが気がするのですが見つけることができませんでした。他にも公開されている休講情報APIがあれば教えてください。よろしくお願いします。

都市大YC休講情報API

東京都市大学 横浜キャンパスの休講情報APIです。

ただし、APIの名前から分かる通りYC(横浜キャンパス)が対象となっているようです。東京都市大学には横浜キャンパスの他にも世田谷キャンパスと等々力キャンパスとがありますが、こちらの分に関しては提供されていないようです。

(2014/12/8追記)今日教えていただきました。世田谷キャンパスの休講情報APIもあるようですので追記します。現時点では等々力キャンパスのAPIはないようです。

CIT Campus Portal API

千葉工業大学の休講情報APIです。

昔に一度、下記の記事で紹介したことがありました。

「CIT Campus Portal API」は一時サーバーの不調からかエラーが返ってくるようになったので、 CITの休講情報アプリはApp Storeから取り下げていますが、現在はサーバーが復旧しているようです。

九州大学休講情報

九州大学の休講情報APIです。教育学部、文学部、法学部、理学部、経済学部に対応しているようです。

http://kyukou-kyudai.rhcloud.com/api

九州大学には他にも学部*1がありますが、ひょっとするとそれらについては提供されていないのかもしれません。未確認のため。

*1:歯学部、薬学部、工学部、芸術工学部、農学部、医学部

千葉工大の休講情報アプリを起動するとクラッシュする不具合を修正しました

CIT休講情報アプリを起動すると、クラッシュする不具合が発生していることに気付きましたので修正しました。

原因としては夏休みに入り休講情報が存在しない状態になったため、サーバーからのレスポンスがnullになってしまい、JSONデータのパースに失敗しアプリがクラッシュしていました。

サーバー側の修正で完結しておりますので、休講情報アプリをご利用頂くことができます。キャッシュが残っている場合もありますので、もしクラッシュするのが直っていない場合はアプリの再インストールを試してください。

千葉工業大学 休講情報

千葉工業大学 休講情報

  • KENJI WADA
  • 教育
  • 無料

授業は終わってもランチ情報は更新されていますので、ご使用されていた方にはご迷惑をお掛けして申し訳ございませんでした。

千葉工業大学 休講情報 for iPhone をリリースしました

本日、iPhone(iOS 6.1〜)で千葉工業大学(CIT)の休講情報学食のランチ情報を見るためのアプリをリリースしました。曜日タブを選択するとその曜日の休講情報が閲覧する事ができます。

f:id:ch3cooh393:20140610103106p:plain

おまけ機能のひとつですが、千葉工業大学の学食別のランチ情報もみることができます。アプリを起動して「設定ボタン」をタップして、「ランチメニュー」を選択すると、その週のランチメニューが表示されます。

f:id:ch3cooh393:20140610132823p:plain

アプリのダウンロードはこちらからどうぞ。

千葉工業大学 休講情報

千葉工業大学 休講情報

  • KENJI WADA
  • 教育
  • 無料

ポータルサイトに掲載されている休講情報の一次ソースを確認できないので、もし表示内容が異なっていた場合は教えてください。

東京農業大学 休講情報アプリで休講情報が見れなくなっていた不具合を修正しました

たまたま今日アプリのレビューを見ていたら、今年になってから休講情報が表示されていないという書き込みをしている学生の方がいるのに気付きました。

調べてみたところ、どうやら今年度から休講情報のフォーマットが少し変わったようで、休講情報の取得に失敗していたようです。

東京農業大学 休講情報

東京農業大学 休講情報

  • KENJI WADA
  • 教育
  • 無料

学校が始まってから1ヶ月半放置してしまっていたようです。気付くのが遅くなってしまってまことに申し訳ございませんでした m( )m

追記(2014.5.18)

デバッグ中に、他の休講情報アプリでも下記の問題が発生していることを確認しましたので、農大休講情報アプリだけではなくv2.2のアップデートを出しました。

  • 閲覧している当日より1日前の曜日*1の休講情報がリスト上に表示されなくなっていた不具合の修正
  • 休講情報 詳細画面の科目名が、指定したテーマカラーと異なる背景色で表示されている不具合の修正

多分誰も困らない不具合だと思いますが、キチンと修正しておきましたのでよろしくお願い致します。

電気通信大学 休講情報

電気通信大学 休講情報

  • KENJI WADA
  • 教育
  • 無料

*1:例えば、閲覧日が金曜日の場合は木曜日