言語アップデートのスプレッドシートが公開されましたので、この文書は2019年7月3日をもって更新を停止します。
透明性を持って広く議論を行うため今後の更新等につきましては haskell-jp/atcoder-haskell-resources リポジトリに移りましたので、そちらをご参照ください。
- 本文書の内容は reddit または haskell-jp 公式 slack の random チャンネル等の内容に基づきます。
そもそもこの提案はまとめようとしたのは、以下のツイートを見つけたからです。
【良いお知らせ】AtCoderの言語アップデートテストが6月に行われる"予定"です。入れたい言語とかがある人は、Ubuntuでのバージョンを固定した導入方法、および必要なライブラリやコンパイルオプションや実行コマンドあたりを調べておいてください。
上記のツイートは以下のURLから引用しています。
後になって、とあるライブラリが無い/GHCのバージョンが古すぎる/もっと良いコンパイルオプションがある等の理由によって AtCoder で Haskell を選びづらいという状況ができるだけ発生しないように、これから AtCoder を通して Haskell の理解を深めようと思う人の大半が満足できる環境を提案できたらと思います。(また、現状の不満も同様に解決できたらと思っています)
- AtCoder の Haskell 環境を整備する
- 以下の内容について Haskell-jp コミュニティの意見をまとめる
- コンパイラ&ライブラリのインストール方法について
- GHC のバージョン
- ライブラリ
- コンパイルオプション
まとめた内容の提出方法はスプレッドシートへの書き込みという感じになるようです。
こんな感じで統一見解を出して貰えるとたしかにいいかも。AtCoder的にはspreadsheetを公開するだけになると思うから、そこに補足とかを書いてもらえるとわかりやすい
上記のツイートは以下のURLから引用しています。
現在の AtCorder の環境は ルール に記載されています。以下の表は該当箇所だけ抜き出したものです。(OS についてはツイートの内容に基づきます)
項目 | 値 |
---|---|
OS | Ubuntu |
コンパイラ | Haskell (GHC 7.10.3) |
コマンド | ghc -o ./a.out -O2 ./Main.hs |
インストール方法 | Haskell Platform |
import Distribution.Simple
import Distribution.Simple.GHC
import Distribution.Verbosity
import Distribution.Simple.Program
import Distribution.Simple.PackageIndex
import Data.List
main :: IO ()
main = do
(_, _, conf) <- configure silent Nothing Nothing defaultProgramConfiguration
installedPackageIndex <- getPackageDBContents silent GlobalPackageDB conf
mapM_ putStrLn $ map (pretty . fst) $ allPackagesBySourcePackageId installedPackageIndex
pretty (PackageIdentifier name ver) = unPackageName name ++ "-" ++ intersperse '.' (concatMap show $ versionBranch ver)
出力結果 (バージョン適当に繋げたのでちょっとバグってる)
Cabal-1.2.2.5.0
GLURaw-1.5.0.2
GLUT-2.7.0.3
HTTP-4.0.0.0.2.2.0
HUnit-1.3.0.0
ObjectName-1.1.0.0
OpenGL-2.1.3.1.0
OpenGLRaw-2.6.0.0
QuickCheck-2.8.1
StateVar-1.1.0.1
array-0.5.1.0
async-2.0.2
attoparsec-0.1.3.0.1
base-4.8.2.0
bin-package-db-0.0.0.0
binary-0.7.5.0
bytestring-0.1.0.6.0
case-insensitive-1.2.0.5
cgi-3.0.0.1.2.2.2
containers-0.5.6.2
deepseq-1.4.1.1
directory-1.2.2.0
exceptions-0.8.0.2
fgl-5.5.2.3
filepath-1.4.0.0
ghc-7.1.0.3
ghc-prim-0.4.0.0
half-0.2.2.1
hashable-1.2.3.3
haskeline-0.7.2.1
haskell-src-1.0.2.0
hoopl-3.1.0.0.2
hpc-0.6.0.2
hscolour-1.2.3
html-1.0.1.2
integer-gmp-1.0.0.0
mtl-2.2.1
multipart-0.1.2
network-2.6.2.1
network-uri-2.6.0.3
old-locale-1.0.0.7
old-time-1.1.0.3
parallel-3.2.0.6
parsec-3.1.9
pretty-1.1.2.0
primitive-0.6.1.0
process-1.2.3.0
random-1.1
regex-base-0.9.3.2
regex-compat-0.9.5.1
regex-posix-0.9.5.2
rts-1.0
scientific-0.3.3.8
split-0.2.2
stm-2.4.4
syb-0.6
template-haskell-2.1.0.0.0
terminfo-0.4.0.1
text-1.2.1.3
tf-random-0.5
time-1.5.0.1
transformers-0.4.2.0
transformers-compat-0.4.0.4
unix-2.7.1.0
unordered-containers-0.2.5.1
vector-0.1.1.0.0
xhtml-3.0.0.0.2.1
zlib-0.5.4.2
この結果より、Haskell Platform の Core Libraries, provided with GHC
と Libraries with Full Platform
に列挙されているパッケージが含まれていることがわかった。
言語を bash
にして ghc-pkg list
でもっと簡単に確認できた・・・。
素の GHC が依存するライブラリについては Haskell Hierarchical Libraries や GHC Commentary: Libraries に色々と説明がある。
MEMO
- パッケージを追加する場合は
cabal install --global mwc-random
のようにする- オプション無しで
--user
相当だとすると、unix ユーザーが変わると見えなくなってしまいます。
- オプション無しで
Ubuntuですと、aptで入れると最新のcosmicでも2014.2.0.0(GHC7とか)が入ってしまうようなので最新のパッケージをいれるようにはしたいですね(Haskell-platformで行くなら)
パッケージ: haskell-platform (2014.2.0.0.debian5)
じゃぁgeneric-linuxならどうやねん、と思ったら、generic-linux向けのHaskell Platformのインストーラーはないからstackかghcupを使え、と... 結局stackに帰ってきた
- ghc は cosmic (18.10) だと 8.2.2, disco (19.04) だと 8.4.4 のようですね。=> https://packages.ubuntu.com/search?keywords=ghc
- 18.04 LTS のサポート終了は「2023年4月 (Extended Security Maintenance は 2028年4月まで)」なので、これが選ばれそうな気がする。その場合は ghc-8.0.2 になってしまう。
MEMO
PATH
に$(stack path --programs)/ghc-<version>/bin/
を追加する必要がありそうstack exec ghc --
でコンパイルすると良い- パッケージのインストールは
stack install vector
のように行う
まだブレインストーミング段階です。以下は slack に出てきたライブラリをリスト化したものです。(アルファベット順)
- array
- bytestring
- 入力処理で必須
- containers
- extra
- fgl
- グラフ
- hashmap
- heaps
- lens
- mwc-random
- psqueues
- unboxing-vector
- unordered-containers
- utility-ht
- vector
- vector-algorithms
- Data.List.sort が遅すぎるため
ライブラリの決め方や候補についての意見 (まだまだ募集中)
- 基本的には haskell platform に含まれるものが使えたら良いんじゃないか?
- 特定の問題で利用できるという明確な利用意図があった方が良いのかもしれない
- 極めてベーシックなデータ構造系以外はない方がプロコン的には面白いんじゃないか?
- 具体例: vector, array, hashmap
- データ構造については haskell-jp wiki の データ構造列伝 に色々とまとまっている
- 競技プログラミングとしての面白さは減らさずに便利 (または制限時間やメモリの問題をクリアするために必要となってくるよう) なパッケージを選べたら良いのではないか?
- Python (NumPyは除く) みたいに、できるには出来るけど効率悪いかもよ?みたいな状態で止めておくのが無難かもしれない?
- C++ 標準で入ってそーなデータ構造は入れてもよさそう
- stl
- C++ のほうも C++17 を入れていいみたいな話になってるのかな。それ基準で考えましょう
- UnionFindとか地味に欲しいのですが地味に候補が多い
- ライブラリをどれぐらいまでインストールできるか?
確か以下のプログラムを使って計測したと思う・・・。(要確認)
import System.Random.MWC
-- http://blog.livedoor.jp/rtabaladi_58/archives/65158189.html の例を借用
main :: IO ()
main = do
gen <- createSystemRandom
randValue <- uniform gen :: IO Int
print randValue
あんまりちゃんと比較できていないけど、なぜか stack exec
経由だと少し早い?
# time ghc -o ./a.out -O2 ./Main.hs
real 0m4.089s
user 0m1.820s
sys 0m0.530s
# time ghc -o ./a.out -O2 ./Main.hs
real 0m2.552s
user 0m1.370s
sys 0m0.460s
# time stack exec -- ghc -o ./a.out -O2 ./Main.hs
real 0m1.819s
user 0m1.280s
sys 0m0.260s
# time ghc -o ./a.out -O2 ./Main.hs
real 0m3.397s
user 0m1.330s
sys 0m0.580s
動作確認には以下の mwc-random
パッケージを使ったコードを利用しています。
import System.Random.MWC
-- http://blog.livedoor.jp/rtabaladi_58/archives/65158189.html の例を借用
main :: IO ()
main = do
gen <- createSystemRandom
randValue <- uniform gen :: IO Int
print randValue
FROM ubuntu:bionic-20190307
RUN apt-get update
RUN apt-get install -y \
curl
RUN apt-get install -y \
gcc \
make \
libgmp-dev \
libnuma-dev \
libtinfo-dev
RUN curl https://get-ghcup.haskell.org -sSf | sh
ENV PATH ~/.cabal/bin:/root/.ghcup/bin:$PATH
RUN echo "source /root/.ghcup/env" >> ~/.bashrc
RUN cabal v2-update
RUN cabal v2-install --global --lib \
mwc-random-0.14.0.0 \
vector-algorithms-0.8.0.1
###########################
# ghc: 8.6.3
# cabal-install: 2.4.1.0
###########################
FROM ubuntu:bionic-20190307
RUN apt-get update
RUN apt-get install -y \
haskell-platform
# v2 コマンドには対応していない
RUN cabal update
RUN cabal install --global \
mwc-random-0.14.0.0 \
vector-algorithms-0.8.0.1
###########################
# ghc: 8.0.2
# cabal-install: 1.24.0.2
###########################
FROM ubuntu:bionic-20190307
RUN apt-get update
RUN apt-get install -y \
software-properties-common
# https://launchpad.net/~hvr/+archive/ubuntu/ghc/
RUN add-apt-repository ppa:hvr/ghc
RUN apt-get update
RUN apt-get install -y \
libtinfo-dev \
ghc-8.6.4 \
cabal-install-2.4
ENV PATH /opt/ghc/bin:$PATH
RUN cabal v2-update
RUN cabal v2-install --global --lib \
mwc-random-0.14.0.0 \
vector-algorithms-0.8.0.1
###########################
# ghc: 8.6.4
# cabal-install: 2.4.1.0
###########################
FROM ubuntu:bionic-20190307
RUN apt-get update
RUN apt-get install -y \
curl
RUN curl -sSL https://get.haskellstack.org/ | sh
ENV PATH /root/.local/bin:$PATH
RUN stack install \
mwc-random \
vector-algorithms
###########################
# ghc: 8.6.4
# stack: 1.9.3
###########################
以下の方々の発言を引用させていただきました。(slack, github name のアルファベット順)
- @Akihito Kirisaki
- @autotaker
- @cohei
- @fumieval
- @gksato
- @igrep
- @kakkun61
- @khibino
- @matonix
- @matsubara0507
- @mod_poppo
- @suiheilibe
- @waddlaw
- @りんご姫
ご協力ありがとうございます。
改善提案にはあまり関係しないでしょうが、現在の環境について確認したことがあったので一つ。
言語Bashで
が走るということで、ピンときて
を走らせてみたところ、
stack
が見つからないとのことで、stackではなくHaskell Platformからのインストールのようです。