この記事は2024年5月に部内向けに書いたブログを外部公開向けに書き直したものです。
はじめに
こんにちは。koukawa_ppです。
さて、皆さんは優柔不断ですか?僕は優柔不断です。
これが本当に一番望んでいる選択なのか、延々と悩み続けてしまいます。
順番を付ける場合も然りです。
これが最適な順位じゃなさそう、というふうに一度思ってしまうと、そのあとずるずると悩み続けてしまいます。
特にこれは選択肢が多い場合に顕著に表れます。
そこで僕は選択肢の多い場合にどのように順番を決めるかという基準として、
「複数の段階を作って項目をグループ分けして、その段階の中で順位付けする」
という方法を採用しています。
こうすることにより、段階間においては上下が明らかに決定されるので、その段階の中でのみ順番を悩めばよいということになり、考慮すべきパラメータを減らすことができます。
何事も(適切に)細分化すること、これはプログラムについてもよく言われていますし、井上ひさし著「握手」において、ルロイ修道士が「困難は分割せよ」といっていたことにも通じます。
そこで、今回は順番を作成することを補助するためのアプリを作りました。
そのたとえとして、1Qと3Qの前にある文系教養科目の履修希望の順位作成を例にとって使い方をご説明します。
もしいいなと思ったら使っていただけると喜びます。
なお、コードは こちらの GitHub リポジトリ に入れてあります。
開発環境
- Windows 11 Homem
- Android Studio Panda1
使い方
アプリを開く
Windows版の場合は、「make_rank_app_windows.zip」を解凍して、その中のexeファイルを実行してください。
そうすると、次のようなウィンドウが出てきます。

データを読み込む
そこで、これを開いたら、次はデータを読み込みます。
全てのファイルが選択可能になっていますが、csvファイルを読み込んでください。
また、全ての行について列の数が等しくないとエラーが発生します。
とりあえずすべての行について列の数を等しくしてください。
正常にデータを読み込めると、次のように出てくるはずです。

ちなみに、たぶんですがcsvファイルの文字コードはutf-8が良いと思います。
後でも説明しますが、Excelで作成したものはひょっとすると文字化けするかもしれません。
データの処理
ここでは二つできることがあります。
まず、最初の行をヘッダとしている場合、これを指定することができます。
「最初の行をヘッダとする」をOnにすると、次のようになります。

各列について、ヘッダの名称が次のメニュー「表示する列を選択」に反映され、下のデータのテーブルからヘッダが非表示になります。
次に、表示する列を選択します。
これは最後に結果を出力する際に使うこともありますし、途中経過で表示する列を表示するために使うオプションになります。
例えばここですべての列を表示する設定にすると、この後のページで次のようになります。

このように表示されるので、この表示されている項目が多いと思われたら、表示する列を制限してもらえればOKです。
今回はまず、授業名は重要です。次に曜日と時間割も大事ですね。
それ以外については必要ないので、次のように表示項目を調整しました。

もちろん、時間とか関係なく、受けたい講義を選ぶんだ、という方は、名前だけにされてもOKです。
選び終わったら、「次へ」を押してください。
セクションの追加
先ほど段階に分けて順位付けをするとお話ししましたが、その「段階」をここでは「セクション」と呼んでいます。

ここでは、そのセクションを追加する段階になります。
「追加」ボタンを押すことで、セクションを追加できます。
セクションについては、順位の高いものから低いものの順番で並べてください。
ここでは僕は次の三項目を追加するので、順番は次のようになります。
- 受けたい講義
- あまり受けたくない講義
- 受けたくない講義

誤解のないよう教員の方にお伝えしておくと、「この学期に絶対受けたい講義があるから、他の講義はあまり受けたくないのだ」というふうに捉えていただければと思います。
あと学部時代を思い出してみると、「前にこの講義は受けたから、今度は他の講義を受けたい、だから受けたくないのだ」といった前向きなものもいくらかありました。
セクションはもちろん、もっと追加していただいてもかまいません。
そうすると、左側の二本バーをドラッグすると順番が変えられるので、適切な順番になるようにセクションを設定してください。
セクションを追加でき、順番変更ができたら「次へ」を入力してください。
項目の追加
次に、セクションごとに項目を追加していきます。

ドロップダウンボタンで項目を追加したいセクションを選択して、そしてその後セクションに追加したい項目を上から選択して、「追加」ボタンを押すことでセクションに追加できます。
なお、間違って追加してしまった項目については、下のリストから選択して、「削除」ボタンを押すことで削除することができます。
その場合は上のリストに戻ります。
また、項目を追加した際に、順番を並べ替えることも忘れないでくださいね。
ここで順番を並べ替えることで、後でこれらのセクションが結合され、全ての項目に対しての順位を知ることができます。
並べ終わると、次のような感じにすることができると思います。

並べ替えることができたら、「次へ」ボタンを押してください。
結果の閲覧
これにより、結果を閲覧することができます。

各教科の名誉のために一応隠しておきますが、希望順位を付けないといけないので仕方ないとしてください。
順位をつけなかった教科がある場合、この結果には表示されなくなります。
結果を確認出来たら、「保存」ボタンを押してください。
結果の保存
さて、次の画面では、結果を保存できます。

各々のオプションについて説明します。
まず、「順位を表す列を含む」とは、左端の順位が書かれている列を含む、ということです。
次に、「ヘッダを含む」とは、一番上の項目(科目コード、授業名、曜日など)を含むか、ということです。
次に、「元データの順番に並べなおす」とは、データの順番を、順位の順番にするのではなく、元のcsvファイルの順番にするということです。
これをOnにしておくことで、教務Webシステムの履修予約をする際に、上から順番に入力するだけで済むようになります。僕はOnにしておきます。

最後に、「非表示のデータを含む」とは、最初のページで設定した「表示する列」に含まれていない列を表示するか、ということです。
試しにここでOffにすると、こうなります。

さて、ここで曜日と時間割は必要でしょうか。
あるならあるでよいかもしれませんが、実際履修予約をするだけなら、授業名と順位だけが示されていればいいはずです。
そこで、授業名以外は非表示にしましょう。これについては、最初のページに戻って授業名以外のチェックを外せばOKです。
基本的にページを変更しても、設定は消えないようになっているはずで、もし設定を変更すると、ほかの部分にも反映されるようになっています。
ただし、読み込むデータを変更すると、すべてがリセットされます。

変更後は上のようになります。
このように変更したら、「保存」ボタンを押してください。
そうすると、このプレビューに示されている表データを、csvファイルにして保存することができます。
おわりに
本日は順位作成補助アプリを紹介しました。
ただ履修予約用としてはこれで完璧とはあまり思っていなくて、例えばシラバスをスクレイピングして、そのデータをもとにcsvファイルを作成し、それを読み込んでこのアプリにつなげてくると、毎回簡単に履修計画を立てることができるようになるはずです。
ただ個人的にスクレイピングの仕方はよくわかっていないのと、それによってサーバに負荷をかけてしまっては元も子もないので、現状は実装していません。
とはいえ優先順位を決めるといった操作は今後もすることがあると思いますので、よろしければぜひ使ってみてください。
最後までお読みいただき、ありがとうございました。