大学生活のちょっとしたことを自動化してみる

ISer Advent Calendar 2019の10日目の記事です。

IS20erの@joechtrです。アドベントカレンダー初エントリーです。理情のアドベントカレンダーがある、ということで勢いで登録してしまったはいいものの何を書こうかなと迷っていましたが、今回は大学生活のちょっとしたことが少し楽になるような自動化ツールについて書こうと思います。みなさんのお役に立てば幸いです。

メールでの課題提出を楽にする

理情の2年には情報科学基礎実験という演習形式でプログラミングの課題を解いて提出していく授業があり、この授業では課題の提出はメールで行います。採点する先生側が自動採点システムを導入していることから、以下のようにフォーマットが指定されています。

  • 件名: [課題番号] [所属/内定先] [学生証番号] [氏名] (数字は半角)
  • ソースコードのファイルを添付して提出。ファイル名はkadai[課題番号].c(拡張子は言語によって異なります。)

例えば課題3を提出するときは、件名は「03 理学部情報科学科 123456 東大太郎」とし、添付ファイルはkadai3.cとする必要があります。

計80個以上の課題を提出する必要があるのですが、これを毎回手で送るのは面倒ですし、数字の打ち間違い等ちょっとした間違いがあれば採点されるのが遅れてしまいます。そこで、課題番号とファイル名以外は全て共通しているのでPythonで自動化スクリプトを書いてみました。主に使ったのはSMTPについての諸々を扱えるsmtplibモジュールとメールについての諸々を扱えるemailモジュールです。ソースコードこちら に上げました(Gmail用に書いていますが、少し変えれば他のメールも扱えると思います)。同じディレクトリに.envファイルを作成して環境変数を一通り埋め、必要なモジュールを追加すれば使えるようになります。Pythonのバージョンは3を想定しています。

※一つ注意点があります。これはGoogleアカウントにメールアドレスとパスワードでログインしてメールを送っているのですが、これを実行するためにはGoogleアカウントの設定から「安全性の低いアプリへのアクセス」を許可する必要があります。不安な方はこれ専用のGoogleアカウントを作るのもいいかもしれませんね。

python autosend.py -f [ファイルのパス] -k [課題番号]

のようにすると自動でメールが送信されます。

Makefileを使うとmake send n=23のように数字だけ指定することもできるようになり、もう少し便利になります。

LMSへの提出を楽にする

これはどの学科でもよくあることですが、課題をitc-lms上で提出することがあります。毎回ログインしたりファイルを選んだりするのに意外と時間がかかるので、これも少しだけ楽にしてみました。

先ほどのメール自動送信はサーバーに投げるだけなので純粋なスクリプトでなんとかなりましたが、LMSの場合はそうもいきません。APIが提供されている訳でもないのでブラウザを操作する必要があると思い、今回はSeleniumとheadlessモードのChromeDriverを用いることにしました(言語はまたPythonです。便利ですね)。基本的にはHTMLタグやCSSのクラスを頑張って読み取ってクリックするのを繰り返すだけなのでやっていることは非常に地味ですし、もしitc-lmsのデザインが変わればおそらくコードも書き換える必要があるのが難点ですが 、なかなか便利になりました。ソースコードこちら です。メールの自動送信同様、.envファイルを作成して環境変数を一通り埋め、必要なモジュールとChromeDriverをインストールしたら使えるかと思います(自分のPCに入っているGoogle Chromeアプリのバージョンと同じバージョンのChromeDriverをダウンロードしないと動かなかった覚えがあるので注意してください)。諸々の準備が終わった後に

python lms.py -f [提出するファイルのパス] -s [科目名] -t [課題のlms上のタイトル]

で提出されるはずです!(ここでもPythonのバージョンは3を想定しています)

ex) python lms.py -f hw8.pdf -s 情報数学 -t 第8回

-t フラグは部分一致していれば大丈夫です。この場合でしたら-t 8としても動作します。数字は全角でも半角でも大丈夫です。

作ったウェブサイトの紹介(ある意味自動化?)

ギリギリ自動化というテーマに入ると信じ、最後に夏に作ったウェブサイトを紹介します。

英語のサイトを読むとき、先に知らない英単語をリストアップして意味を軽く頭に入れてから読むようにしたら止まることなくスムーズにサイトを読めるのではないかと思い、urlを入れたらそのページにある英単語を自動でとってきて難易度ごとにフィルターをかけられる&意味も見られるというサイト https://vocab.joehtr.com を作ってみました。正直使い勝手は悪く細かいバグもあり(直さなきゃ、、)、何より難易度をうまく判定する方法が思いつかず*1ガバガバな判定になっているので、結局当初の目的が達成されたかと言われればおそらく達成されていないですが、、それでも何かの役にたてば嬉しいです*2。  

まとめ

技術的、学問的に難しいことでなくても、自分の扱える技術の範囲内で少し工夫したら日々の生活が少しだけ楽になった、という体験ができて個人的には楽しかったです。最初の2つのソースコードこちらのGitHubリポジトリ に公開しています。もし役立ちそうなものがあれば是非使ってみてください。このやり方の方がいい、などの意見も大歓迎です*3。これからも自動化に関するコードはこのリポジトリに上げられる範囲で上げていきたいので、いいアイデアやバグがあればプルリクを出してくださるととても喜びます。。。明日からのアドベントカレンダーも楽しみですね。

それでは少し早いですが、良いお年を!

*1:知恵を貸してください!!

*2:実装はTypeScriptとGoです

*3:実際、エラーハンドリングは最低限のものしか実装できていません