hogecoder

つたじろう(Tsuta_J) 競技プログラミングの記録

HCPC のホームページを移行した話

この記事は Competitive Programming (1) Advent Calendar 2019 の 12 日目の記事として書かれました。

2019 年 11 月に、北海道大学競技プログラミングサークルのホームページを FC2 から GitHub Pages へと移行しました。移行していろいろと便利になりましたので、今後競技プログラミングサークルでホームページを作ることを検討している方への参考になればと思い、記事を書くことにしました。

TL; DR

GitHub を使って、資料管理・ホームページ作成をするやり方を説明します。資料管理用・ホームページ用リポジトリをそれぞれ作り、GitHub Pages + Jekyll (+ CI) でページをビルドします。

ホームページのコンテンツ

弊サークルのホームページの主なコンテンツは以下が挙げられ、これらを便利に見れるようにすることを重視してホームページを構成しました。

  • ICPC 参加報告
  • スライド
    • 弊サークルでは「勉強会」という、予め決定されたテーマについてスライドを通じて勉強する活動があります。今まで作られたスライドがどこかにまとまっていれば、新しくサークルに興味を持ってくれた方にも勧めやすいですし、勉強もしやすいです。
    • 大学サークル主催の競技プログラミング合宿で出した問題やその解説についても、どこかにまとめる必要があります。
  • 連絡先

従来のホームページの構成、その問題点

従来の構成は以下のようになっていました。

ですが、この構成にはいくつか問題点があります。

  • ホームページを三ヶ月以上更新しないと広告がつく
    • これは FC2 のホームページ側が課している制約です。無料だし仕方ないですが、できればこの制約はなくしたいところです。
  • SlideShare でスライドをアップロードしても日本語が見れない
    • フォントが埋め込みされていない、などが理由の場合もあります。
    • しかしながらフォントを埋め込んでいるのに見れない場合もあります。こういった場合はなぜかフルスクリーンにすると大体は見れるのですが、わざわざフルスクリーンにするのは不便です。
  • SlideShare でスライドを差し替えられない
    • SlideShare にはスライドを編集して再アップロードする機能はありません。いったんスライドを削除して全く同じものをアップロードしても、スライドへの URL は今までとは異なるものになってしまいます。
    • スライドの中身を変更した場合、URL の変更を何らかの形で周知しなければならないことを考えるとこれも非常に不便な点です。

これらの問題を解消するために、以下で説明する構成に変更しました。

移行後のホームページの構成

GitHub Pages では広告が付きません。また、今時 PDF が見れないブラウザを使用する人はそうそういないだろう・・・ということで、資料はリポジトリに直接入れて Web 上で見れるようにしました。ファイルを編集して再アップロードする機能は当然 GitHub に備わっていますので、日本語が見れない問題や再アップロードができない問題は解消されました。

それでは、実際にこの構成でホームページを作成してみましょう。資料管理・ホームページ作成について、どう設定すればよいかを以下で詳しく説明します。

資料管理について

資料管理用に、archive というリポジトリを作ったとします。

まず、master ブランチに各種資料を push します。次に、GitHub Pages を有効にするために以下を設定します。

  • リポジトリのページに飛び、「Settings」タブを押す
  • 「Settings」の中に「GitHub Pages」という項目があるので、Source を「master branch」に設定

f:id:tsutaj:20191207204800p:plain
生成元ブランチ選択画面

これで、資料が Web 上から参照できるようになります。

GitHub Pages について

ここに書くと記事が非常に長くなるので、別途リポジトリ tsutaj/pages-example を用意しました。Jekyll や CI について簡単に知ることができる構成にしたつもりです。

上に示したものを fork するかリンク先のコンテンツを含んだリポジトリを自分で作成するかして、説明を読んだり、ビルドしたものがどのように見えるか試してみたりしてください。

サンプルはこちらにあります: tsutaj.github.io/pages-example/

f:id:tsutaj:20191207205024p:plain
用意した pages-example リポジトリ

まとめ

GitHub Pages + Jekyll は少しの設定で便利にホームページを構成できます。また、CI と組み合わせることで Jekyll への機能追加にも柔軟に対応できます。

この記事に関して質問がありましたら tsutaj までご連絡ください。

宣伝?

現在、kimiyuki さんと beet さんと自分で kmyk/online-judge-verify-helper を開発中です。これは CI と連携して C++ のライブラリリポジトリを自動で verify し、その結果を GitHub Pages で可視化するというものです。まだ現在進行中で開発をしているところですが、よろしければぜひお試しください。

f:id:tsutaj:20191211235923p:plain

ICPC の現役を引退した

今年の ICPC アジアの大会参加記 にも書いたとおり、今回をもって ICPC の現役を引退しました。それと同時に、北海道大学競技プログラミングサークルの運営 (部長的立場なんですが、役職という概念が存在しないため適切な用語がない) も退くことになりました。

完全にポエムなんですが、ここまでの一年間で自分がやったことを雑にまとめました。

普段の活動をとりまとめた

弊サークルは週 2 回活動しておりますが、活動があるごとにいつ・どんな活動を行うか (例えば「今日は練習会を AOJ でやります」とか) を他のメンバーに共有する必要があります。今まではそれをメーリングリストで行っていたのですが、サークル外から気まぐれに殴り込みにいきたい (?) 需要などもあるようで、Twitter で共有する方式に変更しました。

とりまとめたといっても大したことはやっておらず、バチャを建てたりスライドを作ってもらったりという感じでした。なんだかんだバチャは (普段の活動だけで) 年 40 回弱建てることになるので、すでに使った問題を避けるとかは当然必要ですが、そのへんは勘でやってました (は?)

合宿 (RUPC, ACPC) に問題セットを提供した

これは結構大変でした (それはそう)

作問担当になっている大学どうしで連絡をとりあったり、提供する問題セットの Writer / Tester / 最終確認 などなどをしました。特に最終確認は骨の折れる作業ですが、しないと問題セットがボロボロのまま出題する羽目になってしまうので、そうならないようにかなり気を遣った気がします。

RUPC のためにまた問題つくらないとなあ

HUPC を開催した

なんか開きたくなってしまって結局本当に開催しました。具体的に何をしたのかについて、詳しくは HUPC 参加記の記事 をご覧ください。

JAG 夏合宿に問題セットを提供した

HUPC Day2 の Writer 陣が優秀すぎて問題が余りまくったので、not さんからの提案もあり夏合宿で出させていただくことになりました。ACPC の作問と並行してやっていたので正直余裕がなく、自分は簡単枠を作るのと担当の部分をこなすのと体裁チェックくらいしかできなかったので他のスタッフには頭が上がりませんね・・・

ホームページを改修した

フリーサーバーで動いているゆえにホームページを長期間放置すると広告が付いたり、SlideShare の調子が悪すぎたり、などなど状況として良くなかったので改修しました。

GitHub Pages + Jekyll + Travis CI という連携で動いています (アドベントカレンダーでこの辺の話をまとめる予定です)

ICPC アジア地区大会に行った

やはり ICPC の国内予選を今年も通過できたのは良かったです。それに今年も 2 チーム出れたし。

2 チームで出るとなると 7〜8 人で一緒に遠征するということになるのですが、宿泊する場所をまとめたりしてわいわいやっていました。楽しかったです。

所感

振り返ってみるとかなり色々やった気がします。個人的には、今後も ICPC 国内予選通過が安定してできるようになってほしいなあという思いがあったので、特に練習会の難易度設定はかなりこだわっていましたし、結果的に実力の底上げは達成できつつあってよかったなあという感じです。また、弊サークルは作問機会に非常に恵まれていて、そこでも得られたものがたくさん (作問ノウハウとかマネジメントとか) あったなあと思います。

約 1 年間運営できてしあわせでした。ありがとうございました。来年度以降も活動楽しんでね。

ACM-ICPC 国際大学対抗プログラミングコンテスト アジア横浜大会 参加記

2019/11/16 〜 18 に行われた ICPC アジア横浜大会 に参加しました。

Day 0

鳥取の学会に行っていたので、鳥取から横浜まで夜行バスで移動しました。所要時間は 11 時間 (つらい)。あまり寝られなかったので AOJ-ICPC の問題を考察してました。

Day 1

午前 7 時くらいに横浜到着。ネカフェでシャワーを借りたり駅で昼飯を食べたりして会場に向かった。

序盤の英語フェーズにもさすがに慣れてきた (言うことがある程度決まっているため)。

知っている人とお話したり Practice をやったりしていたら一日が終わった。

中華、うめ〜

さすがにバスの座席での睡眠だけで身体が持つわけはないのでちゃんと寝た。布団で寝ると・・・気持ちいいな!

Day 2

ちゃんと起きて、前日に会場でもらったカツサンドくん etc を食べてからコンテスト会場に行った。

緊張するな〜と思いながら過ごしていたらコンテスト開始時間が急に 5 分早まって緊張がどっか行った。

開始直後は B, C, D, E の問題文を読んでいた。B は面倒そうだけどできそう (あとで実装してそこまで面倒でないことがわかった)。C は解きたい。D は解きたくない (自分に正直)、E はぜひ解きたい、という感じ。

A が AC された後に B を実装した。例年 B 問題で異常にハマりがちだったんですが、今回は一発で AC できた。

その後はずっと E を考えていた。しばらくすると H ができそうとのことだったので見てみると、たしかにできそう。実装方針が最初破滅していたがマシな方針を提案して、TAB 君に書いてもらう。少々詰まったが AC、えらい

G もなんかできそうとのことだったので見てみた。TL がギリギリっぽいので余計な log とかはつけれないよなあと思いながらマシな実装方針を提案して、えび君に書いてもらう (自分は方針言ってるだけで実装なんもしてない・・・)。これも AC したのでえらい

E はほとんど何もわからなくて、非常に面倒な二乗解法を思いつくも落ちてしまった。あとで自宅番兵さんに解法を聞いたら天才的解法だったので完全に敗北した。公式の解説スライドはよくわからなかったので読み返したいですね。

解説を聞いた感じだと I をまともに考察してなかったのは痛かったなぁと思いました。

懇親会では、昨年あまり肉が取れなかった反省を活かして早めに肉を取りました。JAG バッジをもらったり Google のブースで配っていた問題トラップにハマったりしていた。

その後は北大勢で打ち上げをして、宿に戻った後も †酒†

酔った状態で海中を探検すると帰ってこれないので気をつけてください。

Day 3

企業見学に行った。最初は HUAWEI でした、コンピュータビジョンの話がたくさん聞けた気がする。

次は NEC でした。思ったより自由なんだな〜というのと、ビルの一階にある展示がすごかった。

最後は †しながわ水族館

これが企業見学なんだよなぁ・・・ (楽しかったです)

まとめ

これで ICPC の現役生活が終わりました。ここまであっという間でした。今後は OB として大会をサポートしていけたらなあと思っています。来年また ICPC 会場に行くことができたら、現役の皆さんとお会いしたいです。

良い大会をありがとうございました!楽しかったです