Comments (6)
いつも使用して頂き、ありがとうございます。
不安感について
活発に更新される件
1.0時点でのアップデートは企業コンへの対応であり、1.1後のアップデートはWebpackへの移行によって生じたバグの修正や外部サーバーの負荷軽減となっています。これに関しては現状終了したものと認識しています。
後述のようにスクリプト自体を分離することを考えているため、predictorに直接関係のないアップデートは行われないようになるはずです。
そのため、更新はこの後殆ど行われなくなると考えています。
外部サーバーとの通信について
サーバーでは、コンテストに参加している全ユーザーの過去パフォーマンスを取得する処理を代行しています。これをユーザー毎に行わせることは非現実的なため、外部からの情報取得は避けられない物だと考えています。また、リクエストがGETのみでリクエスト内容についての見通しも確保できていると考えるため、ここの改善については現状あまり考えていません。
ただ、独自サーバーと通信している状況はあまり好ましくないと思います。優先度は低いですが、将来的にはGitHub Gist等の外部に静的データを置ける場所から読み込ませる、といった形にすることも検討しています。
バンドルファイルの容量が多い
UserScriptの行数が肥大化して不安だと言うのは仰る通りだと思います。
「ソースコードの見通しを良くし、誰でも提供しているUserScriptと同じものを発行できるようにしよう」と、先日ロジック周りのリファクタリングとWebpackへの移行を行いました。その結果として、user.js
ファイルの行数が更に肥大化してしまいました。
しかし、当初の目標であったソースコードの見通しの良さは確保できたと考えています。バンドルファイルが小さいがソースコードが開発者ですら難読と言った前の状態よりは多少安心できる状態になったのではないでしょうか。
しかし、user.js
をなるべく小さくするべきだというのは変わりありません。
スクリプトの分離などの考慮材料とするため、行数の内訳を調べました。
行数 | 内容 | 依存されている物 |
---|---|---|
87行 | WebpackBootstrap | 全体 |
138行 | 外部モジュール読込 | atcoder-libs |
74行 | atcoder-libs | Predictor/Estimator |
6行×3 | HTML | SideMenu/Predictor/Estimator |
624行 | css-loader関連 | SideMenu |
108行 | SideMenu | Main |
145行 | Data関連 | Predictor/Estimator |
90行 | Rating関連 | Estimator/Predictor |
91行 | IndexedDB関連 | Predictor |
249行 | Contest関連 | Predictor |
75行 | PredictorModel | Predictor |
289行 | Predictor | Main |
61行 | EstimatorModel | Estimator |
74行 | Estimator | Main |
28行 | Main | なし |
SideMenuやData関連等、一部分のライブラリ的なものについてはこのUserScriptから切り離して@require
で読み込むスクリプトとして発行することが考えられます。
これは以前も考えましたが、その際はユーザーの見えないところに大量のスクリプトが置かれることになってしまうのは不誠実ではないかと考えた結果現状のようになっています。
ただし、その結果としてEstimatorなど分離することが望ましい機能も抱き合わせになってしまっています。
なので、ライブラリの外部エクスポートについて再検討してみることにします。(これを行うことによって #24 も副次的に達成することが可能ですし。)
しかし、これを行ったとしても800行弱のコードとなってしまうことは避けられません。(1.0
時代は420行程度でした。)
SideMenuに追加されているPredictorの方の処理で100行程度取られていますが、順位表に追加する部分を取り出してみたとしても相当な行数になってしまいます。これはいくつかの部分をclassに分離したりした弊害です。そのため、この程度の行数になってしまうことはご了承頂きたいです。
結論
外部からデータを受け取らないことは不可能なので、そこの改善についてはあまり考えていません。
predictorに直接関係のないスクリプトは分離し、外部スクリプトとして読み込むことにすることを検討します。
from ac-predictor.user.js.
丁寧な説明ありがとうございます。
とても納得できました。
外部サーバーとの通信については、 AtCoder Problems にプルリクを出して内部レーティングの一覧を提供してもらうようにするのが理想だと考えています。ただし、あちらは最近は負荷がつらそうなので可能なのかは分かりません。
バンドルファイルの容量は、 800 行というのはそれ単体ではまだすこし多く感じられますが、「必要なものだけ残した結果です」との説明があれば理解できます。
from ac-predictor.user.js.
バージョン1.2.5をリリースしました。一部のライブラリを外部(atcoder-userscript-libs
, atcoder-sidemenu
)に分離することで行数を削減しましたが、linterの導入や、estimatorの分離を先送りにした影響で1100行程度に落ち着くことになりました。
現状の削減はこのようになりましたが、引き続き行数の削減と見通しを良くし続ける努力をしていきます。
from ac-predictor.user.js.
更新お疲れ様です。
しかし以下のふたつ理由により、この更新はかなり不満です。
- (本体の行数は減ったが、) 悪意が存在していないことの確認のために読むべきコード全体の行数は減っていない
- #38 に述べたもの
(1.) に関して、
「レート変化の予測をするだけの UserScript」と「お遊び機能が詰まったサイドメニューを追加する UserScript」とに分割されるとよい
と書きましたが、これはつまり「順位表に予想レートの列を増やすこと以外の機能をすべて削除してほしい」という意味 (あるいは攻撃的に言い換えれば「どうでもいい機能を消せ」という意味) です。このUserScriptの説明は以下のようなものとなっているので、過不足なく「コンテスト中にAtCoderのパフォーマンスを予測する」ことだけをするべきです。
ac-predictor.user.js/src/main.js
Line 5 in 935cb37
(1.) はお互いに相手の意図を理解できていなかったことから来ているように見えます (ごめんなさい)。
「複数ファイルに分割する」というのは正直なところまったく予想していませんでしたし、おそらくそちらは「複数のUserScriptに分割する」というのを単なるファイル分割として理解していたはずです。
また、私の主張の背景にはUNIX哲学の「ひとつのことだけをうまくやれ」がありますが、そちらはあまりこういうことを意識してはいなかったのだと思います。
from ac-predictor.user.js.
論点を整理します。
- 分離によって読むべきスクリプトの量が本質的には変化せずに隠蔽されるようになったため、状況は良い方向に変わっていない
- どうでもいい機能を消すべき
分離によって読むべきスクリプトの量が変化しない
前のコメントにて
SideMenuやData関連等、一部分のライブラリ的なものについてはこのUserScriptから切り離して@requireで読み込むスクリプトとして発行することが考えられます。
これは以前も考えましたが、その際はユーザーの見えないところに大量のスクリプトが置かれることになってしまうのは不誠実ではないかと考えた結果現状のようになっています。
と書きましたが、まさにそのようなことですよね。これは変更を一切行わないコードを切り離すのであればよい方向に働くと思い、分離することにしました。
そのため、#38 はまさにするべき対処でした。ありがとうございます。
現実的な問題として、読むべきコードの量を減らすことは不可能です。
ビルド前のリポジトリを公開しておりバンドルファイルと同一のものを生成することができる以上、「読むべきもの」はバンドルファイルではなくリポジトリのコードだと考えます。そのため、リポジトリが機能ごとに分離されていることは、読むべきコードを簡潔にするという役割も果たしていると考えます。
ビルド後のファイルとの同一性を容易に確認できるようにするため、ビルド後のハッシュをどこかに表示させることを検討します。
機能から逸脱したものを削除するということについて
predictor自体について
私としては、sidemenuに追加されている以下の要素が「本体」だと考えています。(歴史的経緯を持ち出すのはあまり好ましくはないですが、順位表に予測レートの列を追加する機能は後に実装されたもだということからも分かると思います。)
この要素が提供するものは「コンテストページ上においてパフォーマンス予測を行う」ことであり、それはコンテスト中にAtCoderのパフォーマンスを予測する
行為から逸脱するものではないと考えます。そのため、削除する予定はありません。
それとは別の問題として、この要素が多数にとっては使用していないものであるということは事実です。しかし、使用している人がいるということもまた事実です。以下は使用状況のアンケートを取った結果です。
アンケート
sidemenuの存在について
コンテストページ上で邪魔にならないように要素を載せるための方法を考えた際のベストな方法だと思っています。
コンテストページ外で表示するのはおかしいということについては、estimatorを分離することによって解決します。
estimatorの存在について
これについては仰る通りだと思います。いきなり消すのは不親切であるため、移行の案内を出しつつ別のスクリプトとして分離し、最終的には削除することを考えています。
外部ファイルへの分離について
これについては意図を理解できていないところがあったと思います。
外部へのライブラリ分離については、「globalに簡単に使えるモジュールをエクスポートし、他の拡張機能の開発も促進されて欲しい」と考えていたことでもあったため、そのような方法が先行してしまいました。これについても、非ネイティブなスクリプトを前提スクリプトとして使用を推奨するのはあまり望ましくないかもしれません。
from ac-predictor.user.js.
とりあえずの目標は「読むべきコードの量を減らす」ことです。
私は、これを達成するための手段として「機能を削るべきだ」と主張しています。
#38 の問題や estimator については忘れてよいので、基本的な論点は「sidemenu を消すか、消さないか」のみだと思っています。
sidemenu を消すべきであることについて
根拠は次の2点です。ひとつ前のコメントからは実質的に何も増減していません。
- 消せばコードが減る
- ほとんどのユーザは主に順位表を利用している
(1.) は自明に真であり、 (2.) も事実です。
sidemenu を消すべきでないことについて
消すことに対する反論として、次の2点が提出されたと理解しています。
-
私としては、sidemenuに追加されている以下の要素が「本体」だと考えています。
-
... しかし、使用している人がいるということもまた事実です。
まず反論 (1.) について。
これは単に @key-moon さん自身の感情の問題であり、こちらとしては「そうなのですね」以外の言葉を持ちません。もし論理だけを追うのであれば、まったく無効な言明です。
そして、多数のユーザはおそらくはこの「本体」を本体だとは思っていないでしょう。実際私も、この事実をまったく認識できていませんでした。
自然な認識では sidemenu は本体ではなく、これは「本体でないものを消しましょう」という話なので、sidemenu は消されるべきです。
次に反論 (2.) について。
sidemenu のみを使っているユーザは 8 / (8 + 65 + 7) = 10% ということでした。10% はたしかに何も考えずに切り捨てられる量ではありません。
しかし、今回は無視してよいはずです。なぜなら、 sidemenu か順位表かの違いは「予測されたレートをどのように提示するか」の違いであり、どちらか一方だけあれば十分だからです。人間しか使わない UserScript であり実質的に同等な機能が提供され続けるのですから、後方互換性の問題は起こりません。
反論 (1.) は無効であるとして、反論 (2.) のみを考えたとき、そのような sidemenu を残すことは妥当とは言えません。コードが減って簡潔になることや、結果として残る UserScript の機能のシンプルさと比較すれば、これらの利点が勝つと見る方が自然であるように思います。
実際に消すのか、消さないのか
反論 (1.) の
私としては、sidemenuに追加されている以下の要素が「本体」だと考えています。
を主張しているということは、@key-moon さんの感情としてはこれを消したくないのだと予想できます。
もし「理屈は分かったが、それでも私はこれを消したくないのだ」とか「なんとなく嫌だ」というのを根拠に主張をするのであれば、それは尊重しますし、それでよいと思っています。
from ac-predictor.user.js.
Related Issues (20)
- 「現在開いている問題を正解した場合の順位」ボタン
- コンテストページのtopを固定した際に表示が崩れる HOT 1
- 「お気に入りのみ」にした時に順位表が崩れる
- 順位表上で同順位同レートの人の遷移が混ざる HOT 2
- Sidemenuの機能オンオフ HOT 1
- ABC129の救済措置中にUnratedが大量に発生する HOT 1
- スクリプトの一部を分離する HOT 2
- 順位表が自動更新された時にpredictorも自動更新したい HOT 1
- ペナルティ:"なし"のパースに失敗する
- resultsが未初期化の時にaddPerfToStandingsが呼ばれるとエラーを吐く
- 特定外部サーバーに配置されたコードを実行させられる
- predictorがdisabledになるべきページでpredictorの行が表示される
- 過去のコンテストでのデフォルトパフォーマンスがおかしい
- パフォーマンスもpositivizeされるようになった
- 他スクリプトがjqueryをインストールしている場合、tooltip表示でコケる
- Vue順位表によって壊れた HOT 1
- APerfをlocalDBに置いておく処理が正常に動作していない
- バーチャル参加順位表にもpredictorを表示させたい
- 新AtCoderデザインで色々干渉する
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from ac-predictor.user.js.