Folding@home: Top500の日本チームを表示するスクリプト

 

Folding@home Top 500に入っている日本チームを手動でリストアップするのは辛いのでPythonスクリプトを書こうと思い調べたらFolding@home APIがあった。

Folding@home API 

curlコマンドを使う場合は次のようになる。ここでteamの後の番号はチームIDである。

  • $ curl -G https://api.foldingathome.org/team/257261

ソースコード

Pythonのrequestsモジュールを使い書き換え、次のコードを作成した。Folding@homeでは国別の統計データがないのでトップ500のチームはチーム名、URLやその他情報を元に選んだ。抜けている場合は連絡頂ければありがたい。なお、新たなチームの追加や削除は8行目のjapan_team_idsを変更すればよい。

import datetime
import json
import re
import requests
from operator import attrgetter
japan_team_ids = [162, 222, 106346, 252872, 253284, 254402, 255396, 257002, 257261, \
257728, 258804, 259660, 260900, 261481, 263245, 263536, 263798, 264491]

class JapanTeam:
    def __init__(self, id, rank, name, founder, wus, score):
    self.id = id
    self.rank = rank
    self.name = name
    self.founder = founder
    self.wus = wus
    self.score = score

teams = []

for id in japan_team_ids:
    url = 'https://api.foldingathome.org/team/' + str(id)
    response = requests.get(url)
    dict = json.loads(response.text)
    teams.append(JapanTeam(dict['id'],dict['rank'],dict['name'],dict['founder'], \
dict['wus'], dict['score']))

teams = sorted(teams, key=attrgetter('rank'))
date = datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S')

print(" *** Folding@home Ranking in Japan (",date,") ***")
print(" No Rank Name ID Score Works")
for i in range(0, len(teams)):
    print('{0:>3} {1:>4} {2:<25} {3:>8} {4:>13} {5:>10}'.format(i+1, teams[i].rank, teams[i].name, teams[i].id, teams[i].score, teams[i].wus))

実行方法

  • 上のコードにrank.pyと名前を付けて保存し、次のコマンドを実行する。実行結果は上の図である。
  • $ python3 rank.py

問題点としては、チーム数(現在、17)だけHTTPリクエスト・レスポンスを処理しているので30秒ほど時間がかかることである。

コメント

  1. M. Kajiura より:

    コメントだとコードのインデントがなくなってしまうみたいですね。
    forの前に適当のスペースを入れてください。

  2. M. Kajiura より:

    perlだとこんな感じですかね
    (json_ppが破滅的な文字列を返さないと信じてevalを使ってます)

    #!/bin/perl
    chomp ( $date = `date +’%Y/%m/%d %H:%m:%S’` );
    print ” *** Folding\@home Ranking in Japan ($date) ***\n”;
    print ” No Rank Name ID Score Works\n”;
    $d{$_} = eval `curl -s https://api.foldingathome.org/team/$_ | json_pp -t dumper`
    for ( 162, 222, 106346, 252872, 253284, 254402, 255396, 257002, 257261, 257728,
    258804, 259660, 260900, 261481, 263245, 263536, 263798, 264491 );
    printf “%3d %4d %-25s %8d %13d %10d\n”, ++$no, $d{$_}{rank}, $d{$_}{name}, $_, $d{$_}{score}, $d{$_}{wus}
    for sort { $d{$a}{rank} $d{$b}{rank} } keys %d;

タイトルとURLをコピーしました