🌏

AtCoder Eco Manager : 提出データ管理をより緑に

2024/02/17に公開

AtCoder Eco Manager : 提出データ管理をより緑に

背景

AtCoderは世界中のエンジニアが技術を競い合い、スキルを磨くための競技プログラミングプラットフォームです。
多くの参加者が問題を解くためにコードを提出していますが、提出コードを効率的に管理することは参加者にとって一つの課題となっています。
サーバへの頻繁なアクセスはサーバーへの不必要な負荷とデータ転送量の増加に繋がる可能性があります。

目的

AtCoder Eco Managerはサーバへの頻繁なアクセスを減らし、提出データの効率的な管理を実現します。

機能概要

  • 最新のAC(Accept)提出の自動検出と保存
    • AtCoderからユーザーの最新のAC提出を検出し、ローカルシステムに自動で保存します。
  • 提出言語に基づくファイル拡張子の自動選択
    • 提出されたコードの言語を自動識別し、適切なファイル拡張子で保存します。
  • 通信の最適化
    • 保存済みの提出物のタイムスタンプ情報を利用して不要な通信を減らし、効率的なデータ更新を行います。
  • ファイル名の整形
    • 特殊文字を含むファイル名をファイルシステム上での問題ない形式に整形します。

使用技術やその関連

  • 言語
    • Python(3.11.1)
      • 外部APIとの連携、データ処理の容易さから広く使用されているため。
  • ライブラリ(一部)
    • requests
      • HTTPリクエストを簡単に扱うため。
    • beautifulsoup4
      • 提出ページからのデータ抽出を効率的に取得するため。
    • json
      • APIから取得したデータの処理や、タイムスタンプ情報の保存に利用するため。
  • API

使用方法

  1. 環境設定
    • Pythonと必要なライブラリのインストール
      • Pythonがインストールされていない場合はインストールし、requests, beautifulsoup4など必要なライブラリをインストールします。
  2. GitHubの準備
  3. 設定ファイルの編集
    • Atcoder_USERNAME にAtCoder上でのユーザー名を設定します。
      export Atcoder_USERNAME=YOUR_USERNAME
      
  4. スクリプトの実行
    • 管理したい場所でatcoder_eco_manager.pyというファイルを作り、コードを貼り付けます。
    • スクリプトを実行します。
      python3 atcoder_eco_manager.py
      
    • スクリプトを実行すると、指定されたユーザー名に基づいてAtCoderから提出情報を取得し、指定したディレクトリ構造内にソースコードファイルと問題情報ファイルを生成します。
          ├── atcoder_eco_manager.py
          │── recorderd_timestamp.json
          │── requirements.txt
          │── submissions    
          │  ├── abc305
          │  └── abc306
          │     ├── abc306_a
          │     ├── abc306_b  
          ........
      
  5. GitHubレポジトリへ反映

実装

AtCoder Eco Manager

https://github.com/mkazu23/AtCoder-Eco-Manager

最新のAC(Accept)提出の自動検出と保存&通信の最適化

取得した情報から提出結果がACかつ最新である情報を辞書に格納していくことで最新のAC提出データを獲得します。
保存されたタイムスタンプ情報をファイルから読み込み、提出情報のタイムスタンプと比較して、更新が必要かどうかを判断します。タイムスタンプが提出情報のものより古い、または、保存された情報にキーが存在しない場合は更新が必要と判断し、後に通信を発生させます。更新が必要と判断されない場合には通信を発生させないようになります。

https://github.com/mkazu23/AtCoder-Eco-Manager/blob/main/atcoder_eco_manager.py#L94-L149

提出言語に基づくファイル拡張子の自動選択

提出したコードのプログラミング言語に基づき、拡張子を設定します。

https://github.com/mkazu23/AtCoder-Eco-Manager/blob/main/atcoder_eco_manager.py#L27-L60

https://github.com/mkazu23/AtCoder-Eco-Manager/blob/main/atcoder_eco_manager.py#L209-L221

ファイル名の整形

取得情報の中にはファイル名に使用できない特殊文字が含まれています。
そのため、それらをアンダースコアに置き換えています。

https://github.com/mkazu23/AtCoder-Eco-Manager/blob/main/atcoder_eco_manager.py#L197-L207

※各関数の詳細はコード上に記載しているので、参考にしてただければ嬉しいです。

最後に

kenkooooさんが公開しているAtCoder Problems APIのおかげでAtCoder Eco Managerを構築できました。ありがとうございます。
環境により優しいデータ管理方法を構築することに加えて、あなたのGitHubにも多くの緑が増えること間違いなしです。

Discussion