Coder Social home page Coder Social logo

rime's People

Contributors

arosh avatar asi1024 avatar blue-jam avatar chiro avatar hiroshi-cl avatar hyamaguchi-dw avatar kinaba avatar koba-e964 avatar ktateish avatar matsu7874 avatar not522 avatar nuip avatar nya3jp avatar orisano avatar tossy310 avatar tubo28 avatar yuta1024 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

rime's Issues

Stress Test

ストレステストをコマンドで自動的に出来るようにしたい。
rime stress_test 100 を叩くとrime testが100回実行される挙動を想定してます。
シードはRIME_SEEDがdefineされているとか環境変数に入れるとか。
固定ケースは除くようになっていると良さそう。

Run lint

flake8 あたりが通るようになるといいかんじです。

インデント幅が2なのもついでに直せるといいですが相当しんどいので、それだけ後回しでいいかも。

quietオプション

CIでrimeを走らせていると大量の出力が出てしまうので抑制したいが、
/dev/nullに捨てると全部見えなくなってしまうので適当に省略した出力を表示したい。
具体的にはprogress=Trueの出力を抑制したい。

命名規則

命名規則をpep8に準拠させる。
pep8-namingを入れてflake8が走るようになればOK。

設定ファイルの雛形を指定したい

rime add をした時に生成される PROJECT/PROBLEM/SOLUTION/TESTSET の雛形はソースコードに埋め込まれているが、これらを指定できるようにしたい。
具体的には、 common 以下に雛形が用意されていればそれを使い、無ければデフォルトの雛形を使うようにしたい。

wikifyでcleanするかどうかをオプションで指定したい

wikify/wikify_full は最初にcleanしてから走るようになっているが、cleanするかどうかをオプションで指定できるようにしたい。

yield self.Clean(ui)

yield self.Clean(ui) # 重すぎるときはコメントアウト

# yield self.Clean(ui) # 重すぎるときはコメントアウト

icpc_mergerはテストケースをシャッフルすべき?

現行のicpc_mergerの挙動は、ファイルをそのままファイル名順に結合するものであると認識しています。
ところで、例えば手動生成のケースなどは9_corner_*.inなどの名前をつけることが多く、結果的に「コーナーケースが入力の最後の方にまとまって配置される」という傾向が生じてしまうことがあります。
(模擬)国内予選の形式では選手が入力ファイルを閲覧できるため、選手が最後の方のテストケースを目視してコーナーケースのデバッグに使えてしまう可能性があり、これは練習機会の提供という意図にそぐわないのではないかという懸念を持っています。

このような傾向を避けるため、サンプル以外のケースについてはマージ前にシャッフルした方が良いのではないかと考えたのですが、これはどの程度妥当あるいは有益でしょうか。

wikifyのようにmarkdownを出力したい

早稲田の一部の人で、僕がforkした https://github.com/tossy310/rime/tree/markdownify を使って、wikify_full と同内容のものをmarkdown形式出力したものを使っています。

需要があれば、上の実装をクリーンアップしたものを PR に出したいと思うのですが、いかがでしょうか。

GitHub 上で作問作業をする場合、htmlifyの出力をgithub pagesから見ることも可能ですが、markdownのほうが特別な追加作業なしで見れるので便利でした。
(一方、markdownの表現力が弱いため、表が多少見にくくなりがちです。)

Set up CI

Lint とか unit test とかを CI で走らせたい

コンテスト準備時のGitHub Actions整備について

現在 @not522 さんの助言もあり、標題の件について検討しています。
ここで取り組みたいことは、push時の各種情報のArtifact化であり、成果物はexample以下に配置しようと考えています。

ここでArtifact化させる情報は次の二点を想定しています。

  • markdownifyした結果ファイル
  • packした情報のまとめ

現在実験的にコードを書いており、下記のような形で動作することができています。
https://github.com/tokoharu/rime/runs/685658254

現在の問題点は次の点かと思います。コメントなどいただければ幸いです。

  • Kotlinのコンパイルが通らない (詳しい方教えてください)
  • artifact生成条件の方針について
    artifactとしてmarkdownifyしたファイルとpackした後のファイルを配置しますが、markdownify後のファイルは、markdownifyがErrorしていても生成してほしいように感じます。一方で、pack後のファイル群は、誤ってアップロードしても困るので、Errorがあればskipして生成しない方がよいのではないかと考えていますが、いかがでしょうか。

使用するコンパイラを指定したい

Macにhomebrewでgccをインストールして使っているので,いつもインストール後に basic/codes.py を直接編集して gcc -> gcc-7, g++ -> g++-7 と書き換えているのですが .rimerc のような設定ファイルに書けるようになると嬉しいです。

Register to PyPI

pip でインストールする時に GitHub URL を指定するのではなくて

$ pip install rime

だけでよくなるとよさそうです。

atcoder_config の upload_script を相対パスで指定できない

現状, upload_script を絶対パスで指定しないと動きませんが, base_dir からの相対パスで指定できると嬉しいです.

相対パスを指定して rime upload を dry-run すると,以下のコードの 216 行目で AttributeError: 'NoneType' object has no attribute 'startswith' が生じます.

script = os.path.join(problem.project.atcoder_upload_script)
if not os.path.exists(os.path.join(problem.project.base_dir, script)):
ui.errors.Error(problem, script + ' is not found.')
yield False
stmp = files.ReadFile(script)
if not stmp.startswith('#!/usr/bin/php'):
ui.errors.Error(problem, script + ' is not an upload script.')
yield False

211 行目の if 文はスクリプトのパスが base_dir と join されるので通りますが,次の 215 行目では join されていないので,スクリプトが読み込めていないのだと考えます.

Rime version 3

Rimeの設計を大幅に見直す検討をしています。特にアーキテクチャが複雑すぎて機能追加が難しくなっている点を解決したいと思っています。
参照 : icpc-jag/rime-plus#9

(参考)
最近よく使われている競プロツール

他の作問支援ツール

以下の方針は個人的に考えているもので、開発陣の総意ではありません。コメントで自由に意見をください。


まず、rime-plusでの議論に沿って個人的に考えている解決案を書きます。

開発時とは作問事情が大きく変わっていてますますいろいろな機能を追加する必要がある

Rime+でほぼカバーされているのでは?これ以上特殊なジャッジに対応する必要はなさそう。

メタプログラミングをかなり濫用しているのでアーキテクチャが複雑すぎる

これはその通りでもっとシンプルに書き直した方が良い。とはいえ並列実行をするためにはそれなりに工夫が必要。

Python 2 なので Python 3 への移行が必要

移行済み。

config が JSON とかではなく生 python なのでエディタとか周辺ツールの整備がやりづらい

JSON等に移行しましょう。TOMLも良い感じに見えます。

環境合わせ面倒なのでdockerとかクラウドとかと連携したい

GitHub Actionsで完結するようにすると良い感じになるはず。

静的型くれ

Pythonでも型を書けるようになったので多少はマシな状況になった?

コンパイラを揃える話

GitHub Actionsで緩和されるはず。

リアクティブとか部分点ジャッジ

とりあえずRime+で十分?

配布・非Linux

最近はWSLも出たので現状のままでも大きな問題はないはず。

ビルドシステムの話

makeに任せてしまうというのは並列実行を考えると魅力的ですが、可読性が落ちるのではと懸念しています。


上記を踏まえて、以下のような方針を検討しています。

  • 言語はPythonのまま
  • Rime+を本体に統合
  • plugin機能を廃止
  • 設定ファイルをJSON等に変更
  • 問題文生成機能を追加
  • GitHub Actionsを使った標準的な作問ワークフローを作る

言語はPythonのまま

元のコードをそのまま活かせるメリットは大きいと思います。

Rime+を本体に統合
plugin機能を廃止

pipでインストールするようになったので、pluginを追加するより本体に機能追加をしてもらう方がやりやすいと思います。

設定ファイルをJSON等に変更

JSONなら外部ライブラリなしで使えるというメリットはありますが、TOMLの方がコメントも書けるなど便利になる可能性はあります。
外部ライブラリを極力減らすことで、pipインストールを上手くできない人が直接Rimeのソースコードを叩いて実行できるようになるメリットはありましたが、そもそもその機能が知られていない上、他でも( #69 (comment) )外部ライブラリを使う話が出ているのであまりこだわる必要はないと思います。

問題文生成機能を追加

Google DocsやGitHubで問題文テンプレートを準備し、サンプルや制約の値などを自動的に挿入する機能を追加したいです。
例えば、library-checker-problemsは同じような形式になっています。
https://github.com/yosupo06/library-checker-problems/blob/master/sample/aplusb/task.md

GitHub Actionsを使った標準的な作問フローを作る

現状のRimeだけでは作問フローが完結せず、他のサービスに依存している面がありました。例えばJAGではPukiWiki・Google Docs・Werckerを使っています。これをRime+GitHubで完結するように設計することで、導入を楽にしたいと思っています。一方、Google Docsなどと連携することでより便利になる可能性もあるので、(pluginではなく)追加のスクリプトなどで対応できるようにしたいと思います。


この方針で試験的に書き直しを進めています。現状はpluginを廃止し機能は本体に取り込み、設定ファイルをJSONに書き直している途中です。

https://github.com/not522/rime/tree/v2

rime-plusを本体に統合する

rime-plusはmonkey patchからなるプラグインで作られているが、今後もメンテすることを考えるとデメリットしかなさそうである。本体の方にパッチを反映して単純化したい。

万が一、オリジナル版が欲しくなった場合も pip でバージョン指定すれば十分のはず…

Python3対応

大掛かりな修正になるのでversion分けたほうが良さそう

ヘルプ画面でエラーが出る

$ CC=gcc-7 CXX=g++-7 rime
rime.py <command> [<options>...] [<args>...]

    Rime is a tool for programming contest organizers to automate usual, boring
    and error-prone process of problem set preparation. It supports various
    programming contest styles like ACM-ICPC, TopCoder, etc. by plugins.
    
    To see a brief description and available options of a command, try:
    
    rime.py help <command>

Commands:

 add             Add a new target directory.
 build           Build a target and its dependencies.
 clean           Clean intermediate files.
 help            Show help.
 htmlify_full    Local version of htmlfy_full. (htmlify_full plugin)
 pack            Pack testsets to export to online judges.
 submit          Submit solutions to online judges.
 test            Run tests in a target.
 upload          Upload testsets to export to online judges.
 wikify          Upload test results to Pukiwiki. (wikify plugin)
 wikify_full     Upload all test results to Pukiwiki. (wikify_full plugin)

Global options:

Traceback (most recent call last):
  File "/Users/sho-ii/git/regional-2017/.direnv/python-2.7.14/lib/python2.7/site-packages/rime/core/main.py", line 162, in Main
    return InternalMain(args)
  File "/Users/sho-ii/git/regional-2017/.direnv/python-2.7.14/lib/python2.7/site-packages/rime/core/main.py", line 121, in InternalMain
    cmd.PrintHelp(ui)
  File "/Users/sho-ii/git/regional-2017/.direnv/python-2.7.14/lib/python2.7/site-packages/rime/core/commands.py", line 112, in PrintHelp
    ui.commands[None]._PrintOptionDescription(ui)
  File "/Users/sho-ii/git/regional-2017/.direnv/python-2.7.14/lib/python2.7/site-packages/rime/core/commands.py", line 157, in _PrintOptionDescription
    (i == 0 and left_col_head or ''), offset)
  File "/usr/local/Cellar/python/2.7.14/Frameworks/Python.framework/Versions/2.7/lib/python2.7/string.py", line 433, in ljust
    return s.ljust(width, *args)
TypeError: an integer is required

以下のコミットで壊れてしまった模様。

f17157e#diff-5885a313cc7939628810cb97a148ce79

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.