大学のバス時刻表のWeb-APIを作ってAWS Serveless Java Containerに上げるまで(2/n日目)

あけおめです。この記事はCIST (公立千歳科学技術大学) Advent Calendar 2022の6日目の記事だったことにします(書かれていなかった日を後日ハックしました)*1

はじめに

記事の目的や方針は前回の記事をご覧ください!

前回は、目指すサービス全体像を整理して、鳥瞰的なゴール「大学サイトにアップロードされたバス時刻表PDFに基づいて、バス発着時刻のデータ利用希望者に(もう少し扱いやすい形式で)データ提供を行うWeb-APIの作成」を定めました。

この記事では、さらに作成するシステムの概要を見据える手順を進めていきます。

「作ってみよう!」のその前に、システム概要を整理する

ゴールに向けて、さて早速プログラミング...となりたいところですが、もう少し堪えて、システムの概要を整理します*2

今回、最終的に作成したいのはWeb-API、というゴールの内容からもあまり大きいシステムにはならなそうな予感はしますが、一旦レイヤードアーキテクチャの中で、本件で行いそうな処理内容を当てはめて、どんなシステムにになりそうか概要を見据えてみます。

レイヤードアーキテクチャに当てはめた想定処理

プレゼンテーション層は、いつか学生が作ってくれるイケてるアプリ(クライアント)からの要求を捌くWeb-APIです。どんな要求がくるのか・どんなJSONを返答すれば良いかは後ほど考えましょう。

アプリケーション層は、ゴールの達成に必要なサービス群から構成されます。今回は、バス時刻表PDFからバス時刻を抽出してキャッシュするぐらいかなあと思いましたが、後述するデータ層に任せても良い様な気もします。そのほか、利用管理ぐらいはWeb-APIの設計上はあるんではという気がするので入れてあります*3*4

インフラストラクチャ層は、通常はDB操作などを行いますが、今回は大学サイト上のバス時刻表PDFを取得します。上述のとおり、PDFからの抽出もやってしまってもいいかもしれないと思います。ただし、テストのしやすさや、バス時刻表PDFが将来違った形で提供された時*5を考えると、サクッと実装を切り替えたい様な気もしますので、ここはアプリケーション層のインターフェースを実装する様な形ですすめたいと思います。

正直この辺りは、作成しながら調整をしていく可能性も大きいです。今回もガチガチには決めず、まあこんなものかなというアタリで進めます。なので、まだ手がついてない後半に取り掛かる中で、変わる可能性もあります。

簡単なことを文章や図にしてるけれど

なお、現実世界ではここまで思い立って脳内だけで組み立てるなら10分ぐらいです。

その脳内イメージをこうやって文章や図に出力するだけで10倍以上の時間かかってますが、でも文章や図に直す過程で、その10分の思いつきについてクールダウンしてもう一度考えたり、改めて自分の知識も含めてあやふやなところを再確認したりする*6機会を得ています。

多くの場合、これをチームでやるわけで、そうするとその人たちの脳内はさらにバラバラなわけで。こういう過程にしっかり時間をかけるのは改めて大事だと思います。

PDFの取得部分にむけて

さて、だいぶプログラミングのパートに近づいてきました。

定めたゴールからも、上記のシステム概要からも、当然、PDFの取得や抽出が一番重たい仕事になりそうです。

このあたり、実際のWebサイトの状況を見ながら、作戦を立てていきましょう。

実際のPDFを取得するWebサイトを見て、作戦を立てる

大学Webサイトから時刻表PDFを取得するので、実際の大学Webサイト(アクセスページ)がどうなっているのか確認してみましょう。

某大学のバス時刻表サイト

スクリーンショットを撮ったのが学休期直前なので、学休期とその後のバス時刻表PDFが一度に3つ掲載されています。ここに何個のPDFが提供されるかは週によってまちまちで、1ファイルの場合もあれば、2ファイルの場合もある様です。

ちなみにファイル名は

  • R4年度シャトルバス時刻表秋学期_1226-0110.pdf
  • R4年度シャトルバス時刻表秋学期_0113.pdf

の様に、命名規則がやや人間味あふれる感じです*7*8*9

また、このサイトには他にも乗り場などのPDFファイルが存在しているので、それらの中からWeb-APIで表示するPDF(例えば、時刻表PDFの一番上と決め打ちする、クライアントからのパラメータ等での指定を受け入れるなど)を考慮して取得しないといけなさそうです。

スクレイピングは少しオーバーかなあと思いながら、まずはシンプルな実装として、以下の様な処理フローを考えました。

  1. 大学のアクセスページのBodyを取得する
  2. 大学のアクセスページ内から、バス時刻表のpdfのパスを取得する
  3. バス時刻表のpdfのパスから、一番上に表示されているものをファイルで取得する(とりあえず、クライアントからの要求は想定しないことにする)

次回はこの処理フローの想定に基づいて、実際にPDF取得部分のプログラミングを進めていきたいと思います。

*1:年も明けましたが、まだ俺たちのクリスマスは終わってないぜ!

*2:本来のシステム開発であれば、この前段階でステークホルダーとのレビューを開始して、要求分析の続きや要件定義:ユースケースやユーザーストーリーを整理したり...を行いますが、前回述べた通り、この記事は業務ドメイン等に触らない、小規模な開発なのでスキップします。

*3:利用管理はこの記事の着眼点とは違うので触れない予定です。完全なオープンデータならいらないかも。

*4:難しそうな業務ロジックが入って来れば、それはアプリケーション層から利用されるドメイン層等に置きます。

*5:とはいえ、提供方法変わったらさっさと実装書き換えた方が早い気がします。なので実のところオニオンアーキテクチャっぽくしておきたいだけのカッコつけです。

*6:漫画から引用したいあのセリフどこだっけ?とか探すのも含む

*7:何故、人類(日本人)は全角と半角を混ぜてしまうのか...

*8:ブラウザキャッシュを回避するためファイル名を変えてると思いたい。

*9:PDFファイルの中身も人間味があふれており、こっちの方が後々問題になりそうだなと思ったので見なかったことにしよう。