haskell-jp / atcoder-lang-updates #8

すみません, containers を最新版に更新すると installed ghc-heap-9.4.4 とconflict して Hackage上から落としてくるのですが,Hackage上には ghc-heap-9.4.1ghc-heap-9.6.1 など x.y.1 しかないため containers をアップデートしながら ghc-heap-9.4.4 をインストールすることは不可能とわかりました.「使えない」状態でインストールされるかどうか,も上手に検証できないため, ghc-heap は排除します.
license report は 取り敢えず cabal v2-freeze だけやった Mac 上の環境で cabal-plan license-report を走らせて書いてきました.
なんとかfreeze 前に手元環境で Exposed modules の imports を全部チェックできました! 生成したチェック用のソースは: https://gist.github.com/gksato/0993d739f2ac6e81100f41815a27a978#file-3-imports-hs
コードテストばっかり投げてて実際の提出をサボっていて,数日前にやっと
https://atcoder.jp/contests/language-test-202301/submissions/40808418
を投げたのですが,そしたら

コンパイルエラー
Warning: The package list for '' is 16 days old.
Run 'cabal update' to get the latest list of available packages.
Warning: The package list for '' is 16 days old.
Run 'cabal update' to get the latest list of available packages.
Warning: The directory
/home/runner/.cabal/store/ghc-9.4.4/incoming/new-2/home/runner/.cabal/store/ghc-9.4.4/submission-0.1.0.0-e-main-65f18b2df59be1b1a37cc9cf6a1a6fef2ceea8c33303cd81c9373b649724db38/bin
is not in the system search path.

という警告が出てしまいました.

その上,最後の, Warning: The directory 云々の警告は未だ原因調査できておらず,どうやったら除去できるかもよくわかりません(あとで questions にも投げようかと思います).

しかし,今回こちらで問題にしたいのは Warning: The package list for 云々の方です.これは見慣れた警告で,なんとかなりそうです.言語/ライブラリ追加は終了しているものの,コマンド変更は未だ受け付けられていますので,コンパイル・インストールコマンドを修正して解決してしまって良さそうです.この警告が出される条件を cabal-install のコードを追って確かめれば,ad-hoc には,コンパイルコマンド

$ source ~/.ghcup/env && cd /judge/submission && cabal v2-install --installdir=.. --install-method=copy --offline

を実行する直前に,package repository cacheのtarのmodification dateを更新しておけばいいとわかります:

$ touch ~/.cabal/packages/hackage.haskell.org/01-index.tar

しかし,この方法はあまりに ad-hoc で implementation-dependent なので,この方法を実行していいかわからず,相談がしたかったのでこちらに書き込ませていただきました.

なお,このような方法に頼らなくても, cabal --ignore-expiry v2-install でコンパイルするか, cabal.projectignore-expiry: True を足すかすれば良いかと思ったのですが, ignore-expirycabal v2-update の時に Hackage の署名の期限を検証しないことを表すもので,この問題には無関係のようですね(勘違いして cabal の github に issue を投げてしまったので,恥ずかしい思いをしました).
よくわからないんですけど、 Warning: The package list for '' is 16 days old. については cabal update をどこかで実行すればよいように見えるんですが、ダメなんですかね?
あと、
Warning: The directory
/home/runner/.cabal/store/ghc-9.4.4/incoming/new-2/home/runner/.cabal/store/ghc-9.4.4/submission-0.1.0.0-e-main-65f18b2df59be1b1a37cc9cf6a1a6fef2ceea8c33303cd81c9373b649724db38/bin
is not in the system search path.

こちらは件のパスが PATH に入っていない、というものなので、可能なら無視したほうがいいと思います。
cabal v2-update はコンパイル時に実行しようとするとインターネット接続を仮定してしまうので,だめです.後半は無視した方が良いのはわかっているのですが,そのパス的にどうにもバグくさいのでどうしたら良いかがよくわからないという状況です.
ありそうなのは, cabal v2-build が これらのWarning を出さないように見えるので,

cabal v2-build && cabal v2-install --verbose=0 --installdir=.. --install-method=copy --offline

でやっちゃう,というのは手としてあるかもしれません.
... Replies ...
ただ,手元環境とサーバ環境で表示される警告が違うので,あんまり確信を持って修正できないのが正直なところなんですよね….
あるいは,さっきのコマンドだと2回コンパイルしてしまうみたいなので,

cabal v2-build && cabal v2-exec -- bash -c 'cp $(which main) ../main'

でもいいかもしれないですね.
意見募集: とくに反対がなければ,コンパイルコマンドを

cd /judge/submission
source ~/.ghcup/env
cabal v2-build --offline && cabal v2-exec -- bash -c 'cp $(which main) ../'

に変更しようと思いますが,どうでしょう?
... Replies ...
cabal v2-install --verbose=0 ではだめでしたか?
... Replies ...
なるほど.ご指摘を受けて修正するなら,

cd /judge/submission
source ~/.ghcup/env
cabal v2-build --offline && cp $(cabal list-bin main) ../

でしょうか.
cabal v2-installの挙動はちょっと調べてもよくわからないところがあるので,v2-installは使わずv2-buildしてバイナリ抜き出す方針が良さそうですね
では,改善もされたことですし,明日まで待って特に反対がなければ

cd /judge/submission
source ~/.ghcup/env
cabal v2-build --offline && cp $(cabal list-bin main) ../

に提案シートを書き換えた上で feedback に追加freezeの要望を出します.
... Replies ...
報告を忘れていましたが,昨日未明(おとといの深夜)に記入してきました.
提案ページの編集
フィードバックページの編集
Language Test Contestが4/11版に更新されたようです
https://atcoder.jp/contests/language-test-202301
... Replies ...
遅くなりましたが, のインポートテストコードがCompile を通ることを確認しました.
環境構築用の cabal.project.freeze ファイルをコードテスト:

main :: IO ()
main = putStr =<< readFile "/judge/submission/cabal.project.freeze"

で取得しました!

https://gist.github.com/gksato/0993d739f2ac6e81100f41815a27a978#file-4-cabal-project-freeze
事態の収拾がつかなくなりそうでAtCoder社員さまの労力が心配ですが,こんな確認事項がSpreadsheetに追加されました:

https://docs.google.com/spreadsheets/d/1HXyOXt5bKwhKWXruzUvfMFHQtBxfZQ0047W7VVObnXI/edit#gid=1056940558&range=C13
時間が開いてしまったため言語およびライブラリのアップデートを許可することにします
ただし以下のような変更は依然として却下です
- これまでに申請済みのライセンスが変わる
- 新規言語、新規ライブラリの追加
参考: https://docs.google.com/spreadsheets/d/1HXyOXt5bKwhKWXruzUvfMFHQtBxfZQ0047W7VVObnXI/edit#gid=1835616968&range=K111
これに乗じて GHC 9.4.5 をつっこめますね! GHC Issue #22998 とか不安だったので地味にホッとしています….異論がなければ,仮想環境ビルドを 9.4.5 に bump して試した上で 書き換えを行います.
... Replies ...
なお,同時に次回の Freeze が 6/19 で確定しました!
バージョンアップ作業中です.
unix-2.7.3 (installed with GHC) の unix-2.8.1.1 へのアップデートを試みましたが,`unix-2.8.1.1` は filepath >= 1.4.100.0 を要求し,これが既存のバージョン指定 filepath < 1.4.100 に矛盾したため,とりあえず unix ==2.7.3 で固定しておきます.異論があればお願いします.なお,`filepath <1.4.100` を外してもインストールは可能と思われます.`filepath <1.4.100` のバージョン指定の由来は次のとおりです:4/11 freeze時に, hpc (the version bundled with GHC-9.4.4 + all versions on Hackage) と filepath >=1.4.100 がdependency上かコード上(dependency rangeで許可されているがコンパイルエラーが出るという意味)で非互換であるため, hpc を外し filepath を installed with GHC のバージョンに固定しておくという経過措置をとったものです.
... Replies ...
ライセンスのリストにghcup, cabal-install, LLVM のライセンスをつけ忘れていたので,フィードバックシートで言い訳+確認をしてきました:

https://docs.google.com/spreadsheets/d/1HXyOXt5bKwhKWXruzUvfMFHQtBxfZQ0047W7VVObnXI/edit#gid=1835616968&range=J115
今更気になりました.
「まずはじめに」の “License” のところに「言語やライブラリのライセンスへの URL をすべて記入してください。」とありますが,
言語(コンパイラ/インタプリタ)でもライブラリでもない部分,例えば
・ビルドシステム (Haskellで言えば cabal-install, Rustで言えばCargo)
・ツールマネジャ(Haskellで言えば ghcup, Rustで言えばrustup …といってもRustは今回のLang updateでrustup不使用)
・LLVM
・apt
・sudo, curl, rm, cp その他のUNIX系shellで利用されるツール
などのライセンスはどう扱えば良いでしょうか…?
Haskellではとりあえず「言語とライブラリ」のライセンスだけ付けてるのですが.
「まずはじめに」で「言語とライブラリ」とだけ書いてあったのでだいぶ気が楽になりました.気にし過ぎだといいのですが:sweat_smile:
... Replies ...
擬似環境の生成に成功しました.GHCによってバージョンが固定されてしまうパッケージを ^>= から == にするのと,その他のパッケージを更新するのとで次のような dependency の更新が起こります:
GHC: 9.4.4 -> 9.4.5
QuickCheck: ^>=2.14.2 -> ^>=2.14.3
array: ^>=0.5.4.0 -> ==0.5.4.0
base: ^>=4.17.0.0 -> ==4.17.1.0
deepseq: ^>=1.4.8.0 -> ==1.4.8.0
ghc-boot-th: ==9.4.4 -> ==9.4.5
ghc-prim: ^>=0.9.0 -> ==0.9.0
massiv: ^>=1.0.3.0 -> ^>=1.0.4.0
megaparsec: ^>=9.3.0 -> ^>=9.4.1
regex-tdfa: ^>=1.3.2 -> ^>=1.3.2.1
template-haskell: ^>=2.19.0.0 -> ==2.19.0.0
unix: ^>=2.7.3 -> ==2.7.3
utility-ht: ^>=0.0.16 -> ^>=0.0.17
とりあえず書き込んできました.ご確認ください.
忘れてました! LLVM が 13 から 14 になってます!
Language Test が Freeze 4, 20230619 版にアップデートされました.

freeze file を取得済みです:
https://gist.github.com/gksato/67ce95de203c1799841a99777758e2f5#file-5-cabal-project-freeze

不要な cabal 由来の警告が消えています:
https://atcoder.jp/contests/language-test-202301/submissions/42867827

全モジュールインポートも通ります:
https://atcoder.jp/contests/language-test-202301/submissions/42867961

ついでにコンパイル時警告はきちんと -Wall で出ますし, {-# OPTIONS_GHC -Wno-unused-imports #-} でちゃんと警告の除外もできてるみたいですね.
なお, Freeze 5 は 2023-07-03 であり, Freeze 6 はその1-2週間後で, Freeze 6 が最終freezeとなるようです.それまでにTest Contest の Practice A に AC 解を投げておく必要がありますが,この一個上の投稿に含まれる提出で要求を充足しているので,それそのものは気になさらなくても大丈夫です.ただし,ライブラリの正常動作に関してはインポートまでしか確認していないので,必要に応じてテストコンテストで動作確認を行っていただけると助かります.

Lang update 202301スプレッドシートの「要確認事項」シート,セルC14 より引用:
次々回のfreeze(次回のfreezeから1~2週間後を予定)をもってジャッジを確定させる予定です
入れたい言語/ライブラリが正常に動作することを必ず確認してください
またジャッジの内部テスト用などに使用するため
https://atcoder.jp/contests/language-test-202301/tasks/practice_1
この問題においてAC解を提出してください
ACが確認できない言語においては最終のジャッジからは外される可能性があることがあります
同スプレッドシート,「まずはじめに」シート,「今後の進め方」(セル範囲B5:D5) より一部引用:
次のfreeze : 2023-07-03
特段の不具合が見つからない場合に次々回(次回のfreezeから1~2週間後を予定)のfreezeをもって新ジャッジを確定させる予定です
また必ずAC解を提出しておいてください
詳しくは要確認事項シートの該当項目を確認してください
LLVM, ghcup, cabal-install 等のライセンスの件ですが,

https://docs.google.com/spreadsheets/d/1HXyOXt5bKwhKWXruzUvfMFHQtBxfZQ0047W7VVObnXI/edit#gid=1835616968&range=K115

現状の「言語とライブラリ」だけで今のところ問題ありません
ただしもし懸念事項があるならば注記で書いていただけると助かります
と返信いただいたので問題はなさそうかな?
フィードバック #119 を見てて思ったのですが,インストールの最後に
rm -rf ~/.ghcup/bin/ghcup ~/.ghcup/cache ~/.ghcup/logs ~/.ghcup/tmp ~/.cabal/logs

あたり実行した方が良いのでしょうか?


フィードバック #119 の引用:
https://docs.google.com/spreadsheets/d/1HXyOXt5bKwhKWXruzUvfMFHQtBxfZQ0047W7VVObnXI/edit#gid=1835616968&range=123:123
Q:「インストール時に一時的に使用するファイルは/tmpに置くようにしてもらえると実行環境からは除かれるので“助かります“」とありますが、
インストールからコンパイル、コンパイルから実行への転送量がジャッジの負荷やコストに結構影響するのでしょうか?
例えば、インストールで使った git を apt-get remove && apt-get autoremove したり、
コンパイル後にコンパイラとライブラリを消したほうがいいですか?

A: インストールに際して一時的に使用されるもののみ/tmpに置く、ないしはインストールの最後に削除していただくとジャッジを複数台立てるときにそのコピーするデータ量が減るためありがたいということです
例えばコンパイラ本体を含む圧縮ファイルや、バイナリインストールのためにダウンロードしてきたソースコードなどは実行環境上には不要なものであるはずなので、それらは基本的に/tmpで作業をしてもらえるとインストールコマンドをすべて実行し終わったあとに削除され、コンパイル/実行環境からは消えた状態となります

コンパイル時に行った各種操作による後片付けはしなくても大丈夫です
逆に下手にコンパイル時に後片付けを行うと
- 実行時に必要なファイルまで間違えて消してしまう可能性がある
- 後片付けもコンパイル時間に含まれ、コンパイル時間は一定時間で制限されているためこの制限時間を超えてしまう可能性がある
といった点からおすすめはしません
... Replies ...
リストアップしてもらったものに関しては削除してしまってもいいんじゃないでしょうか
明日昼にテストをした上で,24:00を目処に ~/.ghcup/trash を加えて

rm -rf ~/.ghcup/bin/ghcup ~/.ghcup/cache ~/.ghcup/logs ~/.ghcup/tmp ~/.ghcup/trash ~/.cabal/logs

を最後に実行するように変更しようかと思います.ご意見があればお願いします.
忘れてました.

sudo apt-get remove -y libncurses-dev libncurses5
sudo apt-get autoremove -y

も試したいと思います. ghcupghcup tui のために vty を通して ncurses に依存しますが,それを必要とするパッケージが我々のdependency に含まれないように見えるからです.
追加で,コマンド最初の apt-get を

$ sudo apt-get install -y build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5 llvm-14

から

$ sudo apt-get install -y curl
$ sudo apt-get install -y --no-install-recommends build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5 llvm-14

に変更しました.その上で,インストール最後に

$ sudo apt-get remove -y curl libncurses5 libncurses-dev
$ sudo apt-get autoremove -y
$ rm -rf ~/.ghcup/bin/ghcup ~/.ghcup/cache ~/.ghcup/logs ~/.ghcup/tmp ~/.ghcup/trash ~/.cabal/logs

を実行した上で,モジュールインポートのコードのビルド・実行が正しく行われることを確認しました!
https://docs.google.com/spreadsheets/d/1HXyOXt5bKwhKWXruzUvfMFHQtBxfZQ0047W7VVObnXI/edit#gid=408033513&range=K38

上の内容を提案シートに反映しました.ただし,

$ sudo apt-get remove -y curl libncurses5 libncurses-dev
$ sudo apt-get autoremove -y

については追加を見合わせました.この理由は,GHC/cabal-install の実行に curl, libncurses5, libncurses-dev が必要ないという確信を持てなくなったからです.そもそも,これらのパッケージは言語環境インストール開始時に次のコマンドでインストールしたものです.

$ sudo apt-get install -y --no-install-recommends build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5 llvm-14

これらインストールパッケージの由来は, GHCup がインストール時に要求する System Requirementsです.実際の文面は次のとおり:

System requirements 
  Please ensure the following distro packages are installed before continuing (you can exit ghcup and return at any time): build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5

そこで,GHCupインストールスクリプトのこのメッセージを発行する箇所() を読みにいって確認したところ,これは $ ghcup tool-requirements によって表示されていることがわかりました. ghcup tool-requirements の機能は, --help によれば

Show the requirements for ghc/cabal
とのことで,このたびの apt-get remove の追加見合わせはこの一文が理由です. どう考えても curl やら ncurses やら使ってそうなのは ghcup だろと断言したいのは山々なのですが,安全側に倒しておきたいと判断しました.
最終フリーズの日程が確定しました.2023-07-17(月)です.

Language Update 202301 spreadsheet まずはじめに - 今後の進め方() から一部引用:
次のfreeze : 2023-07-17
上記freezeをもって新ジャッジを確定し、以降の修正は受け付けない予定です
Language Test も 最新版 (Freeze 5, 20230703) にアップデートされました.正常に動作しているようです.動作確認AC提出を貼っておきます:
https://atcoder.jp/contests/language-test-202301/submissions/43298808
https://atcoder.jp/contests/language-test-202301/submissions/43298825
https://atcoder.jp/contests/language-test-202301/submissions/43308487
License 欄に書いたLicense reportへの Gist リンクがリビジョン指定なしのやつだったので,リビジョン指定付きのpermalinkを追加しておきました:
https://docs.google.com/spreadsheets/d/1HXyOXt5bKwhKWXruzUvfMFHQtBxfZQ0047W7VVObnXI/edit#gid=408033513&range=P38
@ has left the channel
@kakkun61 has left the channel
@naoya has joined the channel
最終版のFreezeは 7/18 に予定通り実施され,2023-07-21 22:00にLanguage Test が最終版に更新されています.一応全インポートも投げておきました:
https://atcoder.jp/contests/language-test-202301/submissions/43826108
今日新ジャッジテストコンテストがあります:
algorithm: https://atcoder.jp/contests/newjudge-2308-algorithm
heuristic: https://atcoder.jp/contests/newjudge-2308-heuristic
main = return () の提出で 15 秒ぐらい待機時間があるのは
もしかして長いですか……?
... Replies ...
@zackey has joined the channel
@CLERK has joined the channel