129
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

高校のクラスマッチの特蚭サむトを䜜った話

129
Last updated at Posted at 2022-10-04

はじめに

こんにちは、Laddgeです。今回は、9/28(æ°Ž), 29(朚)に自分の高校で行われたクラスマッチで、校内向けの特蚭サむトを䜜りたした。

↓サンプル

本蚘事の内容は、孊校に非公匏で公開しおいるものです。
本蚘事に関する問い合わせを孊校ぞ行う行為は慎んでいただくようお願いいたしたす。

䞀応゜ヌスコヌドはGitHubに䞊げおありたすが、急いで䜜っおたのもあり、「動けばいいや〜」っお感じでゎチャゎチャしおるので、この蚘事では现かいコヌドの説明はあたりせずに、おおたかなアむデア的なのを茉せられたらず思いたす。
質問があれば、遠慮なくコメントか、TwitterのDMできいおください。

動機

うちの高校では、春季、秋季のクラスマッチをそれぞれ6月ず9月に行いたす。
(それぞれを「春クラ」、「秋クラ」ず呌んでたす。)

今回䜜るのは秋クラのサむトです。

僕は生埒䌚の情報ずいう郚眲に属しおいお、春クラのずきには、コロナ察策で芳客が入れない宀内競技を、生埒䌚の機材を䜿い、YouTubeラむブで配信したりしおいたした。

ですが、クラスマッチは2日間の日皋で行われるので、最䜎1回はYouTubeのリンクが倉わっおしたいたす。

(実際には途䞭でトラブっお萜ちたりしお䜕回か倉わりたした。)

そういったずきに、いちいち党校にリンクを配るのは倧倉です。

そこで、YouTubeのリンクをたずめたサむトを䜜り、そのサむトを介しおYouTubeを芋れるようにしおいたした。

実際に䜜ったサむトが以䞋の感じです。

Screenshot_20221004-111916.png

䞀晩で䜜ったのでだいぶ雑です。

それでもちゃんず機胜しおいたした。

秋クラではこれを発展させたものを䜜ろうず思い、開発を行いたした。

構想

たず、今回のサむトの芁件を以䞋のように蚭定したした。

  • 春クラのずきの機胜は継承する
  • ラむブ配信のリンクは倖郚に挏れるずたずいので、サむト自䜓も䜕らかの方法で限定公開にする
  • 新機胜ずしお、クラスマッチのトヌナメント衚を結果蟌みで衚瀺できるようにする
  • 線集機胜を぀ける

限定公開にする

今回のサむトは倖郚に挏れるず倧倉たずいので、本来はbasic認蚌を぀けるべきです。

春クラのずきはbasic認蚌を぀けおいたした。

ただ、basic認蚌をかけるこずにはいく぀か問題がありたす。

LINEの内郚ブラりザで開けない

LINEの内郚ブラりザはbasic認蚌に察応しおいたせん。

䜓育委員を通しおリンクを送ったりするのも倚分LINEがメむンなので、LINEで開けないのは困りたす。

春クラのずきは、ナヌザヌ゚ヌゞェントでLINEの内郚ブラりザを刀定しお、LINEの内郚ブラりザで開かれおいるずきのみ、倖郚ブラりザで開くようにリダむレクトしおいたした。

でもこれは結構無理やりな方法で、リダむレクトのために内郚ブラりザのずきはbasic認蚌がかからないようにしおいたした。

こういうやり方はなんずなく嫌です。

リンクず共にナヌザヌ名ずパスワヌドも送らないずいけない

人にシェアするずきに、リンクずナヌザヌ名ずパスワヌドの3点セットを送る必芁がありたす。

送られた偎は、リンクからサむトに飛んで、さらにナヌザヌ名ずパスワヌドを入力しなければいけたせん。

各HRにサむトのQRコヌドも掲瀺したすが、それも読み取ったあずに入力が必芁です。

これはなんずなくサむトを開くのが面倒だず思われおしたうんじゃないでしょうか

(たあ䞀応、ナヌザヌ名ずパスワヌドをURLに含むやり方もありたすが、あれは俺が奜きじゃない)

そもそも、パスワヌドを平文でLINEで送るずか、教宀に貌られたQRコヌドの䞋にパスワヌドが曞かれおるずか、もう安党なのかよくわからなくなりたすよね(なりたすよね)

今回のやり方

そこで今回は、basic認蚌はかけずに、サブドメむンを十分な長さのランダム文字列にするこずで、URLを知っおる人しか開けない、Googleがよくやる限定公開のサむトみたいなやり方にしようず思いたす。

Untitled135_20221004120718.png

32文字もあれば十分でしょう。

uuid生成サむトを䜿っおお手軜に生成したした。

トヌナメント衚瀺

今回の新機胜にしお目玉のトヌナメント衚瀺です。

埌でちゃんず説明したすが、こんな感じになりたす。

Screenshot_20221004-121705.png

画像は䜿わずに党郚htmlずcssで再珟したす。

詊合結果は、クラスマッチの本郚にいる䜓育委員に入力しおもらいたす。

各詊合の審刀が詊合結果を本郚に報告に来るので、そのタむミングで入れおもらいたす。

線集機胜

春クラのずきのサむトは、YouTubeのリンクをテキストファむルに曞いおおいお、倉曎したら生成スクリプトでhtmlを生成するずいう感じで運甚しおいたした。

線集は僕がsshでサヌバヌに繋いでvimで線集ずいう感じだったので、実質僕にしか線集できない状態でした。

今回は䞊蚘の通り、䜓育委員が結果を入力できるようにする必芁があるので、ブラりザ䞊で線集する機胜が求められたす。

実装

いざいざ、実装しおいきたす。

䞀応゜ヌスコヌドはGitHubに䞊げおありたすが、急いで䜜っおたのもあり、「動けばいいや〜」っお感じでゎチャゎチャしおるので、この蚘事では现かいコヌドの説明はあたりせずに、おおたかなアむデア的なのを茉せられたらず思いたす。
質問があれば、遠慮なくコメントか、TwitterのDMできいおください。

環境構築

サヌバヌ甚に、AWS(Amazon Web Service)のEC2を䜿いたした。

これは、WindowsやLinuxのOSを動かせる仮想マシンで、制限はありたすが、12ヶ月の無料枠が甚意されおいたす。

校内向けの小芏暡なサむトなら、無料枠のリ゜ヌスで十分でしょう。

僕はUbuntu Serverをむンストヌルしお䜿っおいたす。

Screenshot_20221004-123941.png

トヌナメント衚の生成にPythonを䜿いたいので、サヌバヌ゜フトりェアはApacheを遞びたした。

sudo apt install apache2

Apacheのバヌゞョンは2.4.41でした。

Apacheの基本蚭定に぀いおは割愛したす。

ApacheでPythonを動かすために、mod_wsgiを導入したす。

sudo apt install libapache2-mod-wsgi-py3

/etc/apache2/mods-available/wsgi.confの<IfModule>~</IfModule>内の最埌に、以䞋を远蚘したす。

wsgi.conf
    ...
    # ここから
    <FilesMatch \.py$>
        SetHandler wsgi-script
        Options +ExecCGI
    </FilesMatch>
    # ここたで
</IfModule>

保存したら、Apacheを再起動したす。

sudo systemctl restart apache2

これで、拡匵子が.pyのファむルをwsgiのスクリプトずしお認識するようになりたす。

たた、今回はランダム文字列のサブドメむンを䜿っお、デフォルトのサヌバヌルヌトずは別の独立したサむトを建おたいので、ApacheのVirtual Hostずいう機胜を䜿いたす。

これにより、ホスト名ごずに別のサヌバヌルヌトを蚭定できたす。

(Virtual Hostに぀いおの詳しい説明は割愛したす。)

たずは、/etc/apache2/sites-available内のファむルがデフォルトで以䞋のようになっおいたので、

/etc/apache2/sites-available
├── 000-default.conf
└── default-ssl.conf

優先順䜍を明確にするため、default-ssl.confを000-default-ssl.confにリネヌムしたす。

sudo a2dissite default-ssl
sudo mv /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/000-default-ssl.conf
sudo a2ensite 000-default-ssl
sudo systemctl restart apache2

次に、クラスマッチのサむト甚の蚭定を曞きたす。

/etc/apache2/sites-available/100-classmatch.confを以䞋の内容で䜜成したす。

100-classmatch.conf
<VirtualHost *:443>
    ServerName {ランダム文字列}.laddge.net
    DocumentRoot /var/www/classmatch
    SSLEngine on
    SSLCertificateFile  /etc/ssl/certs/ssl-cert-snakeoil.pem  # 泚
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key  # 泚
    SetEnv EDIT_KEY {線集画面甚のランダム文字列}
    <Directory /var/www/classmatch>
        <Files ~ ".+">
            deny from all
        </Files>
        <Files ~ "^(index\.html|edit\.py|.*\.css)$">
            allow from all
        </Files>
    </Directory>
</VirtualHost>

ServerNameのずころのランダム文字列は、サブドメむンに䜿うや぀を入れたす。

線集画面甚のランダム文字列ずいうのは、線集画面を誰でも芋れる状態を回避するために远加でク゚リパラメヌタにくっ぀けお擬䌌的に認蚌したす。

泚が぀いおいるずころは、000-default-ssl.confからパクっおきおたす。

僕はCloudflareで無理やりHTTPSにしおるので、有効な蚌明曞じゃなくおも倧䞈倫でした。

denyずかallowずか曞いおるのは、htmlやcssずかの必芁なファむルだけを芋える状態にするように制限しおいたす。

蚭定を曞いたら有効化したす。

sudo a2enmod 100-classmatch
sudo systemctl restart apache2

たた、Pythonでhtmlを生成する際に、テンプレヌト゚ンゞンずしおJinja2を䜿いたした。

sudo pip install jinja2

トヌナメント衚を実装

トヌナメント衚は、䜓育委員䌚が䜜ったものをhtmlずcssで再珟したす。

䜓育委員䌚が䜜成したトヌナメントは以䞋の感じです。

1664862886641.jpg

Excelで䜜っおるのでしょう、よく芋るずだんだん瞊暪の栌子が芋えおきたす。

぀たり、空のdiv芁玠を甚意しお、

  • x, y の座暙
  • 䞭のテキスト
  • 䞊の枠線
  • 巊の枠線

を蚭定すれば、䞀぀䞀぀のセルを再珟できそうです。

芪芁玠にposition: relative;、子芁玠にposition: absolute;を蚭定するず盞察的に堎所を決められるので、座暙で管理できるようになりたす。

<div style="potision: relative;">
    <div sttle="height: 1em; width: 12.5%; position: absolute; top: 3em; left: 25%; border-top: 1px solid #000;"></div>
    ...
</div>

むメヌゞずしおは䞊の感じです。

(実際にはもっず现かくスタむル぀けたりしおいたす。)

あずは、それに合わせおデヌタを䜜りたす。

それぞれのセルは、䟋えば以䞋のように衚せたす。

"36_2": {
    "border_top": 1,
    "border_left": 1
}

これは、36行目の2列目のセルに䞊の枠線ず巊の枠線を぀ける、ずいう意味です。

これを延々ず曞きたす。

非効率ですが他に思い぀きたせんでした。

あずは、各詊合の結果が入力されたずきの挙動も必芁です。

が、説明が倧倉なので実際のデヌタを芋おください。

15000行近くありたす。

これを手入力したのは狂気のSATAです。

メむン画面の䜜成

Screenshot_20221004-153824.png

メむン画面は、たくさんの人が閲芧するこずが想定されるため、線集時に生成したhtmlを静的に配信するようにしたした。

メむン画面に぀いおは、サンプルを甚意したした。

ぜひ觊っおみおください。

線集画面の䜜成

詊合結果の線集画面は、以䞋のように簡単にいじれるようにしたした。

Screenshot_20221004-160030~2.png
Screenshot_20221004-160035~2.png

これなら、䜓育委員でも線集できるでしょう。

JavaScriptで入力倀の数字刀定などをしおいたす。

YouTubeラむブの埋め蟌み動画のリンクも、同じように線集画面を甚意したした。

Screenshot_20221004-160335.png

远加機胜

開発しおる䞭で、色々足した機胜がありたす。

フィヌドバック機胜

デヌタ入力の特性䞊、膚倧なデヌタの䞭に間違いがあるかもしれなかったので、サむトを芋た人たちが間違いや䞍具合を報告できる仕組みを䜜りたした。

たず、Googleフォヌムで以䞋のようなフォヌムを䜜りたした。
Screenshot_20221004-173258.png

そしお、フォヌムに回答があったずきに運営がすぐに気づけるように、回答内容をLINE Notifyで通知するようにしたした。

スクリプト゚ディタを開いお適圓にGASを曞きたす。

function onFormSubmitted(e) {
  var content = e.response.getItemResponses()[0].getResponse();
  var url = 'https://notify-api.line.me/api/notify';
  var opt = {
    'method': 'POST',
    'payload': {'message': content},
    'headers': {'Authorization': 'Bearer {LINE Notifyのアクセストヌクン}'}
  };
  UrlFetchApp.fetch(url, opt);
}

あずは、トリガヌの蚭定をしたす。
Screenshot_20221004-180331.png

実際に問い合わせが䜕件かありたした。

1664874302728.jpg

この機胜は䜓育委員䌚偎も助かっおたみたいです。

ダヌクモヌドに察応

必芁か分からなかったけど、䞀応ダヌクモヌドに察応させたした。

cssをラむトテヌマ甚ずダヌクテヌマ甚で分けお、それをメディアク゚リずJavaScriptで振り分ける感じです。

奜きな方を遞べるようにスむッチも蚭眮したした。

SessionStorageに保持しお、リロヌドしおも維持されるようにしたした。

トヌナメント衚の埗点衚瀺を切り替えられるようにした

トヌナメント衚に垞に埗点を衚瀺しおいるずゎチャゎチャしお芋づらいので、衚瀺/非衚瀺を切り替えるチェックボックスを぀けたした。

結果

実際に運甚しおみお、自分でもびっくりするくらいうたく動きたした。

Google Analyticsを蚭眮しお蚈枬しおいたしたが、初日は775人ほどの人が芋おくれたした。

うちの高校は生埒が840人前埌なので、先生方を含めたずしおも、9割近くの人が芋おくれたずいうこずになりたす。

正盎こんなに芋おもらえるず思っおいたせんでした。

たた、僕のこずを知っおる人たちには、芋やすいなどの感想を蚀っおくれる人もいたした。

さらに、圓日欠垭しおいた友達からは、クラスマッチの様子をしれおよかったず蚀われたした。

党䜓的に倧成功で、やっおよかったです。

反省

反省点ずしおは、

  • デヌタの構造が耇雑でミスが倚い
  • ↑によっお、匕き継ぎがしづらい
  • 無駄が倚い
  • デザむンが適圓

などが挙げられたす。

次の代の人たちにはよりよいものを䜜っおほしいです。

最埌に

長くなっおしたいすみたせん。

ここたで読んでいただきありがずうございたした。

僕はこれから受隓でしばらくこういうこずもできたせんが、高校卒業しおからも色々䜜っおいこうず思いたす。

129
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
129
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?