自作した時間割アプリが大学の公式アプリに採用された話

# 記事の概要
私（芝浦工業大学学部4年生）が大学3年時に1人で制作した、大学のポータルアプリ（ポータルサイトからスクレイピングして時間割などを表示する）が、大学に正式採用され、公式アプリ"ScombApp"としてリリースされるに至った経緯を時系列順に説明します。  

ホーム画面  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/f41e31c7-32fb-52dd-61e2-75386e54054c.png" width=50%>  

時間割画面  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/79bc6095-2702-f164-d23c-7555e77a8cbf.png" width=50%>  

https://apps.apple.com/jp/app/scombapp/id1669657083  

https://play.google.com/store/apps/details?id=jp.ac.shibaura_it.sic.scombmobile  

# 制作の動機
大学のポータルサイト使いにくいがち。  
ポータルサイトのスマホアプリ版があれば便利そう。  
他にやってる人いなさそうだし、最初に作ったらみんな使ってくれそう。

# ポータルサイトの問題点
大学ポータルサイトで使いにくかった点を挙げていく。  
とりあえずこれを克服することを目標にした。  

## ログインの時に自動補完が使えない
制作当時はBASIC認証で、スマホからだとログインの自動補完ができなかった。  
毎回手打ちでパスワードを入力している人がほとんど ←！？  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/ee23afad-3f9e-0c4d-67c6-66ab86ebd1fa.jpeg" width=50%>  
次の授業や教室を確認するだけでも、毎回手打ちログインが必要。  

## 何も知らせないお知らせ
お知らせとは？  
重要な通知がポータルホームで確認できない  
![news.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/4a0411ce-ce29-c6c0-e202-cce4b08d7590.jpeg)  
このポータルサイトがリニューアルされた時は使えていたが、しばらくして"負荷軽減のため"とか言われて消えた  
2年ぐらいこのまま放置されている。  

## まとめて表示されない締め切り
締め切りのある提出が課題、テスト、アンケートの3つに分かれていて、アンケートだけ別のページで確認しなければならない  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/e7b80f6f-ccdd-1129-6515-70a4bc6d0089.jpeg" width=50%>  

## シラバスとの連携不足
とっている授業のページからシラバスに飛べない  
学期始まってすぐの履修キャンセルできる期間に、最終課題や授業進行、使用書籍を頻繁にみるので毎回一覧から探すのはしんどい  
![syllabus.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/2d8494bb-7cc5-179b-3ebe-c87e7760ee81.jpeg)  

## 忘れ去られる課題
これは私の自己管理不足
課題の締め切り前に通知が欲しい  

# 実現したいこと
現状の使いにくい点を克服する  
- ネイティブのスマホアプリにしたい  
- ログイン情報を保存して、ログイン画面をスキップしたい  
- 締め切り系を一覧で確認したい  
- 授業が開かれる教室をすぐ確認したい  
- お知らせをちゃんとお知らせしたい  

# ターゲット
- ポータルサイトに不満を持っている本学学生  
- 自分　　
~~最悪誰にも使われなくても、自分で使うからいいか~~  

# とりあえず作ってみる(大学3年生7月22日)
去年長期インターンでAndroid開発を経験したので、とりあえずそれで作り始める  
Kotlinは結構好きです  

## 独自のログイン画面からログイン
ログイン時のHTTP通信をデベロッパツールで監視  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/e8f7ed00-8d38-dd4f-1906-d9cb28b95e48.png" width=60%>  
ログイン成功後にSESSIONをCookieに保存しているらしい。ふーん。  

![autologin_test_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/457f4ec3-7ac4-78f3-6d2c-003cf1ba6efb.png)  
試しにCookieに過去にログイン成功したSESSIONを強制的に注入して、ログインが必要なページにアクセスしてみる  

![autologin_test_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/f02a275f-5b3e-1ade-6d00-31ba3fa660ff.png)  
表示できた  

独自の画面のテキストボックスに入力したユーザ名とパスワードのBASIC認証情報を送信  
WebViewにJavaScriptを仕込み、ログインボタンを自動で押させる  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/7ede48c7-9327-4492-94c3-fab7e485bdba.gif" width=50%>  
無事ポータルホームにログインできた  

## ログインスキップ
ポータルホーム表示前に、WebView側でCookieに前回ログイン時のSESSIONを強制注入して、ログインスキップを実装してみる  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/315c0b2a-2dc4-2bc0-ff59-6cf7c15835ec.gif" width=50%>  
ログインスキップは実装できた。  
これが最初で最難関だった。  
この時はログインスキップしてポータルサイトをWebViewで表示するだけでも十分かなとか思った。  

## ログインが必要なページのスクレイピング
ポータルサイトの情報を取得するにはスクレイピングするしかない(APIがあればなあ)  
ログインが必要なサイトのスクレイピングは結構厄介  
CookieにSESSIONをくっつけて、ポータルホームのHTMLを取得  
あとはHTMLをJSoup🍲でごにょごにょして時間割と課題を抽出するだけ  

## プロトタイプ完成(大学3年生8月1日)

ポータルサイトから取得した時間割を表示。色を変えられる。  
一度取得した時間割は1週間キャッシュとしてローカルで保存して、スクレイピングによる負荷をかけないようにしている。  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/f8956ee3-92c1-8b4f-871c-4d1f01801fc2.png" width=50%>

課題とテストとアンケートを全て一覧で表示する。  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/aed7319e-3684-309d-1d41-f3e106e3eb8b.png" width=50%>  

締め切り前に通知してくれる  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/ff066cdc-56bf-0833-d0ba-d2f38d263888.png" width=50%>  

勢い余って、締め切りカレンダー画面も作った  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/caac5f3c-0245-349c-e103-ece7ad7ff6f1.png" width=50%>  

## 知り合いに使ってもらう
と思ったが、Android使ってる人少なすぎる。よく考えてみたら私もiPhoneユーザだった。  
デバッグ用Androidを貸して使わせてみる。  
割と好感触だったので、開発続行。  

# 製品版（非公式）の制作
アプリ名は、本家ポータルサイト"ScombZ"のスマホアプリである、ということがすぐわかるようにするため、"ScombMobile"とした。  

## 究極の選択
製品版でiOSアプリの開発は必須。  
- 案1：現在のAndroid版プロトタイプをブラッシュアップして、iOS版はSwiftで新しく作る  
- 案2：現在のプロトタイプを捨てて、Flutterで1から作り直す  

今後のメンテナンスとかを考えて案2を採用。後から考えてもこれは英断だったと思う（自画自賛）  

## Flutterで1から実装し直す(大学3年生8月8日)
Flutterの知識ゼロで実装につっこんでいったので、初期のコードは悲惨。  
あとでリファクタリング地獄を見ることを知る由もない。  

## オリジナルのアイコン作成
プロトタイプでは仮で本家サイトのアイコンを使っていたが、リリースを見越してオリジナルのアイコンを作成  
本家アイコンをモノトーンの手書き風にアレンジした  
![splash.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/d7b757cc-8f95-bbe6-6d0f-b3fb2a6c4d34.png)


## 製品版（非公式）完成
https://github.com/kouheisatou/ScombMobileFlutter  

### 時間割
時間割画面  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/5c7d1923-5e23-3336-d71f-097194249976.png" width=50%>  

授業詳細ウィンドウ  
授業名でシラバスを自動検索して紐づけている  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/8e4ed388-255a-7536-d093-bfc45f2f99d4.png" width=50%>  

課題カレンダー画面  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/513a409f-1aea-b02a-b1af-8d23baba71db.png" width=50%> 　

### 締め切り一覧画面
課題・テスト・アンケートを一覧表示 　
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/d9d4f5cc-8ac3-f147-6042-df825593b50d.png" width=50%>  

締め切り通知  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/29364cfc-f211-c25f-a7fb-1fe98ca2d8c0.png" width=50%>  

### お知らせ一覧画面
お知らせ表示
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/8c9d502c-9173-2ed6-72f5-c700e46f0397.gif" width=50%>  
お知らせ詳細の取得にAJAXを使っていたのでスクレイピングで取得できなかった。  
WebView上で強引に、特定のお知らせを表示するJavaScript関数を呼び出して該当のお知らせを表示させている。  

### 時間割作成画面
時間割管理画面  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/fd952527-fb26-f1af-e0c2-69362efc9dd8.png" width=50%>  

時間割作成画面  
時間割一覧のWebページから簡単に授業をインポートできる  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/c787cba9-8f51-ae52-ccbe-c649617c650e.gif" width=50%>  

### シラバス検索
シラバスの全文検索を使いやすく改良した  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/9c2a3998-65fc-cd61-4ea6-ef7549ab6270.gif" width=50%>  

# 製品版（非公式）リリース(大学3年生8月18日)
AppStoreとGooglePlayStoreで公開（現在は非公開）  
Twitter（当時）でアカウントを作成し、本学学生を片っ端からフォローした後、リリース告知  

## 好意的な意見  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/93df82de-ebf4-1318-f631-a224eb6496dc.png" width=60%>  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/9c3b90f2-fb2f-db90-b23d-684b714c2b1d.jpeg" width=60%>  

![twitter_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/687b06fa-74f5-1633-374d-f7a21d17f8ce.png)  
![twitter_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/c66f44bd-da72-096e-3544-7f9cc0e083c7.png)  
![twitter_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/c97a4191-3ddf-2299-96f2-854981b69bda.png)  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/53d0ae6a-7ed2-1f2a-12d4-1b83ae340362.png" width=40%>  

## 否定的な意見
「アプリにパスワードを入力するのが不安」と言う声が多かった ←確かに。  
怪しいことしてないと証明するため、アプリのソースコードを公開  

## 公開による軋轢
学内の一部の人たちから反感を買った  

# 大学に交渉
大学のパスワードを入力させるため、このままだといつか大学からお咎めを喰らう  
それなら先手打ったれの精神で特攻  

## とりあえず学生課に行った
メールで学情に問い合わせてくれとのこと  

## 学情にメール
簡単な紹介動画をAdobePremiereProで作成し、添付。  
学情の人と実際に会ってミーティングをすることになった  

## ミーティングと大学公式アプリ化決定
話されたこと  
- すでに他大学でサードパーティ製のLMSスクレイピングアプリみたいなものは存在していて、問題になっている。  
- 大学としてはちゃんとしたものかよくわからないアプリに対して、パスワードを入れることを推奨できない。  
- しかし、このようなアプリがあったほうが学生のためになるのも事実。  
- 今後このアプリは学情のアプリとして引き継ぎ、ここでアルバイトとして開発を続けてはどうか？  

絶対無理だと思っていたから、正直驚いた。かなり柔軟な大学だと思う。  

# 学情の開発アルバイトとして公式アプリScombApp開発開始(大学3年11月1日)
公式アプリScombAppとして機能実装や修正をしていくことになった。  
時給は学生にしては良い。友人を誘って2人で開発を続けることに。  

## 念願のAPI整備
今までスクレイピングで情報を取得していたが、公式アプリに採用されるにあたって、専用のAPIが用意された。  

## いらない機能削除
泣く泣く削除した機能たち👋
- 締め切りカレンダー  
- 履修計画（いつか別アプリとして復活させたい）  

結局プロトタイプの状態で機能的にはほぼ完成していた。もっと早い段階でリリースしていれば、無駄な機能を実装せずに済んだかもしれない。  
ユーザのニーズに合わせてこのような機能を実装していくべきだった。  

# 大学公式版リリース(大学3年3月31日)

https://apps.apple.com/jp/app/scombapp/id1669657083  

https://play.google.com/store/apps/details?id=jp.ac.shibaura_it.sic.scombmobile  

ホーム画面  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/bb837dcd-8eb9-8896-1a86-fa867adf31a8.png" width=50%>  

時間割画面  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/79bc6095-2702-f164-d23c-7555e77a8cbf.png" width=50%>  

お知らせ一覧画面  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/97faed18-8f72-e3e7-134f-f9c47911f5b3.jpeg" width=50%>  

締め切り一覧画面  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/a9ab4e62-7609-07e6-f1b6-8ee79070bd90.png" width=50%>  

累計8000ダウンロード  
リリース直後はAppストアセルラン82位に乗った  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677129/30c86faa-c72e-318a-be63-f68fa0616b3d.jpeg" width=50%>  

# 大学広報からプレスリリースとして発信(大学4年12月)
複数のメディアに取り上げてもらった。  

https://www.shibaura-it.ac.jp/headline/detail/koho1204_7070_623.html  

# アルバイト追加募集(大学4年12月)
学生の中から、学情の開発アルバイトのメンバーを募集。  
大学1年にインターンを探しているとき、どこの募集も大体実務経験必須だった。当時一切実務経験のなかった私は絶望した。実務を経験したい学生は多くいるにも関わらず、そのほとんどが実務経験必須の壁を越えられず断念していると思う。本学の学情の開発アルバイトは、そのようなやる気のある学生に実務経験を積む最初のステップとして活用してもらいたい。  

# まとめ
柔軟に対応してくれた大学には本当に感謝してもしきれない。この大学に入ると、こんな自由なこともできるってことをもっと全面に打ち出せば志願者増える気がする。  
大学生特権は強力。多分同じことを社会人になってからやっても、ここまで注目はされていないと思う。  

# この記事を書いた人
佐藤衡平
芝浦工業大学大学院
https://github.com/kouheisatou