cassava (csv)
Table of Contents
言語沼
再放送と番宣のNHKがやってる、番組か? それとも、 haskell,ruby,python,scheme,forth,rust,go,juliaみたいな奴か?
チャウ・チャウでーー。 本を読んだらおもしろかったので、続きはユーチューブって事ですん。
プログラミング言語は言語なの?【ゆるコンピュータ科学ラジオ4】#66
オブジェクト指向は万能の薬ではなかった。関数型の流行へ。【プログラミングパラダイム・シフト5】#68
姉妹編にゆるコンピュータ科学ラジオも有って、上記はその一例。
こちらは、本当の言語沼 How Start Haskell
ghc 9.2.7 -> 9.2.8
ghc 9.2.8が見え隠れしてたので、updateしてみた。
ghcup install ghc 9.2.8 ghcup set ghc 9.2.8 ghcup rm ghc 9.2.7 rm -rf ~/.cabal/store/ghc-9.2.7
新らしいのをインストール。環境を新らしいのに切り替え。古いやつを削除。 古いcabal群も削除。.cabal/bin/の中にあるやつで、古いcabalにリンクされ てる物は使えなくなる。こればかりは、温存させておいた方がいいかも。 環境をゴソッと切り替えられる機構なんだな。こうして、手を動かすと実感が 湧く。
hadrian
haskell人によるmakeの再発明。何でもhaskellって、その気持判るよ。 で、ghciをやってみる。
sakae@deb:~/MINE/src/ghc$ ./hadrian/ghci
と、言ってるそばから、alex,happyが無いから継続できないと文句を言われた。
なんだか消してしまった9.2.7を参照してるっぽかったので、コンパイルのや り直し。4時間待ちです。
sakae@deb:~/MINE/src/ghc$ hadrian/ghci Computing arguments for ghc Build completed in 1.06s GHCi, version 9.2.8: https://www.haskell.org/ghc/ :? for help Loaded GHCi configuration from /home/sakae/.ghci [117 of 796] Compiling GHC.Types.Var[boot] ( /home/sakae/MINE/src/ghc/compiler/GHC/Types/Var.hs-boot, nothing ) [missing old d ependency] : [428 of 796] Compiling GHC.Cmm.CLabel ( /home/sakae/MINE/src/ghc/compiler/GHC/Cmm/CLabel.hs, nothing ) [missing old dependen cy] Ok, 796 modules loaded. ghci> ghci> :show linker ----- Loader state ----- Pkgs: [ghci-9.7-inplace, ghc-heap-9.7-inplace, ghc-boot-9.7-inplace, binary-0.8.9.1-inplace, hpc-0.6.2.0-inplace, containers-0.6.7-inplace, process-1.6.17.0-inplace, directory-1.3.8.1-inplace, semaphore-compat-1.0.0-inplace, unix-2.8.1.0-inplace, time-1.12.2-inplace, filepath-1.4.100.1-inplace, bytestring-0.11.4.0-inplace, exceptions-0.10.7-inplace, template-haskell, pretty-1.1.3.6, deepseq-1.4.6.1, ghc-boot-th-9.7-inplace, stm-2.5.0.2, array-0.5.4.0, mtl-2.3.1-inplace, transformers-0.6.1.0-inplace, base, ghc-bignum, ghc-prim, rts] Objs: [] BCOs: []
とんでもなく、沢山の物をリンクしてんなー。
./hadrian/build stage2:exe:ghc-bin lint:compiler : compiler/GHC/StgToJS/Rts/Rts.hs:2:1-34: Warning: Unused LANGUAGE pragma Found: {-# LANGUAGE TypeApplications #-} Perhaps you should remove it. : Development.Shake.cmd, system command failed Command line: hlint --colour=never -j1 --cpp-define=i386_HOST_ARCH --cpp-include=_build/stage1/rts/build/include --cpp-include=compiler --cpp-include=_build/stage1/rts/build/include/ghcplatform.h --cpp-include=_build/stage1/compiler/build -hcompiler/.hlint.yaml compiler Exit code: 1 Stderr: Build failed.
lint無しで実行したら、20秒ぐらいで終了した。後は試しに、こんなコマンド を投入。
./hadrian/build stage2:lib:text : | Run Ghc LinkHs Stage2: _build/stage2/libraries/text/build/c/cbits/is_ascii.dyn_o (and 49 more) => _build/stage2/libraries/text/build/libHStext-2.0.2-inplace-ghc9.7.20230607.so | Copy package 'text' # cabal-copy (for _build/stage2/lib/package.conf.d/text-2.0.2-inplace.conf) | Run GhcPkg Recache Stage2: none => none Build completed in 42m31s
build install
インストールしてみるかな。まあ、bin/とlib/が隣あってるのが、最低条件ら しいので、手動で配置してしまうと言う荒技もあるみたいだけど。
sakae@deb:~/MINE/src/ghc$ ./hadrian/build install --prefix=/home/sakae/MINE : | Successfully generated docs/index.html from its template Non optional builder 'sphinx-build' is not specified in 'hadrian/cfg/system.config' file. Build failed.
手抜きしたつけが回ってきた。ちゃんと書類が揃わないと先に進めないお役所 であります。
you can use the `--docs` CLI flag to selectively disable some or all of the documentation targets: - `--docs=none`: don't build any docs - `--docs=no-haddocks`: don't build haddocks - `--docs=no-sphinx`: don't build any user manual or manpage - `--docs=no-sphinx-html`: don't build HTML versions of manuals - `--docs=no-sphinx-pdfs`: don't build PDF versions of manuals - `--docs=no-sphinx-man`: don't build the manpage
これって、抜け道? 法の裏側をかいくぐる方法は、ちゃんと用意 されてます。それを称して、ザル法と申します。
cabal-bin
コマンド・ラインから使うcabalはどうするんだったかな? ググったら、こん なのが出てきた。
HTTPとzlibが必要とな。超昔にやった記憶が有るぞ。
cabal install cabal-install
tar玉を展開しといて、上記を実行でいいみたい。古いcabalが利用されるけど、 新らしいのになる。
sakae@deb:/tmp/cassava$ cabal install cassava Wrote tarball sdist to /tmp/cassava/dist-newstyle/sdist/cassava-0.5.3.0.tar.gz Warning: Unknown/unsupported 'ghc' version detected (Cabal 3.6.2.0 supports 'ghc' version < 9.4): /home/sakae/MINE/bin/ghc is version 9.7.20230607 Warning: Unknown/unsupported 'ghc' version detected (Cabal 3.6.2.0 supports 'ghc' version < 9.4): /home/sakae/MINE/bin/ghc is version 9.7.20230607 Resolving dependencies... cabal: Cannot build the executables in the package cassava because it does not contain any executables. Check the .cabal file for the package and make sure that it properly declares the components that you expect.
新しすぎても、駄目なのか。難しいのう。
/home/sakae/MINE/lib/ghc-9.7.20230607/lib/package.conf.d Cabal-3.10.1.0 Cabal-syntax-3.10.1.0 :
適当に持ってきた物じゃ駄目な訳ね。
cassava
いも?
cassavaって、アフリカの主食のいもだよな。それが何でcsvと関係するの? 上で見付けた記事がなければ、一生知らなかっただろう? 名前重要って、あ の人が主張してたけど、正にその通りだと思うぞ。
いや、Browse and search packages このサイトは全てを知ってるから大丈夫 だ。csvで検索すれば、DL数が断トツだってすぐに判る。パッケージのヒット チャートみたいなものだな。
ああ、DL数でソートするとpandocが一位だったわい。ただ、こちらは機能が豊 富すぎる。目的にあわせて十分検討しないと、後で泣きをみるぞ。
test run
案内にあったのを走らせる準備をする。cabalとストレートにghcを叩く方式の 2本立て。 csv.cabal
build-type: Simple version: 0.1.0.0 name: test executable testme main-is: Main.hs build-depends: base, bytestring, cassava, vector default-language: Haskell2010
超最低限の設定。 gen.sh
#! /bin/sh ghc \ -o a.out \ -package base \ -package bytestring \ -package vector \ -package cassava \ Main.hs
サンプルは、勝手知ったる血圧データ。 Main.hs
{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE OverloadedStrings #-} import qualified Data.ByteString.Lazy as BL import Data.Csv import qualified Data.Vector as V main :: IO () main = do csvData <- BL.readFile "current.csv" case decode NoHeader csvData of Left err -> putStrLn err Right v -> V.forM_ v $ \ (ymdh::Int, hi::Int, lo::Int, pl::Int) -> putStrLn $ show ymdh ++ " " ++ show hi
テキスト・ファイルからデータをとりだすのは、decodeになるのね。そうする と、ファイルに書き出すのは、encodeか。
show build
cabal installだと詳細が出てこないので、show build してみる。ソースから のコンパイルで、ソースが在住してるのがいいな。これぞOSSだ。
[sakae@arch cassava]$ cabal repl Resolving dependencies... Build profile: -w ghc-9.2.7 -O1 In order, the following will be built (use -v for more details): - Only-0.1 (lib) (requires download & build) - scientific-0.3.7.0 (lib) (requires build) - attoparsec-0.14.4 (lib) (requires build) - cassava-0.5.3.0 (lib) (first run) Downloading Only-0.1 : [ 1 of 10] Compiling Data.Csv.Types ( src/Data/Csv/Types.hs, interpreted ) : [10 of 10] Compiling Data.Csv ( src/Data/Csv.hs, interpreted ) Ok, 10 modules loaded. ghci> :i decode decode :: FromRecord a => HasHeader -> Data.ByteString.Lazy.Internal.ByteString -> Either String (Data.Vector.Vector a) -- Defined at src/Data/Csv/Encoding.hs:81:1
例にやったdecodeは、何処よ?
test and benchmark
What I Wish I Knew When Learning Haskell
[sakae@arch cassava]$ cabal v2-test Build profile: -w ghc-9.2.7 -O1 In order, the following will be built (use -v for more details): - cassava-0.5.3.0 (test:unit-tests) (first run) Preprocessing test suite 'unit-tests' for cassava-0.5.3.0.. Building test suite 'unit-tests' for cassava-0.5.3.0.. Running 1 test suites... Test suite unit-tests: RUNNING... Test suite unit-tests: PASS Test suite logged to: /tmp/cassava/dist-newstyle/build/x86_64-linux/ghc-9.2.7/cassava-0.5.3.0/t/unit-tests/test/cassava-0.5.3.0-unit-tests.log 1 of 1 test suites (1 of 1 test cases) passed.
[sakae@arch cassava]$ cd benchmarks/ [sakae@arch benchmarks]$ cabal v2-bench benchmark-ref : benchmarking comparison/lazy-csv time 435.8 μs (431.9 μs .. 439.1 μs) 0.999 R² (0.999 R² .. 1.000 R²) mean 437.5 μs (434.4 μs .. 441.7 μs) std dev 12.18 μs (9.098 μs .. 16.99 μs) variance introduced by outliers: 20% (moderately inflated)
haddock
ソースを閲覧してたら、やたらコメントが記述してあった。これはきっと、 html用の原稿に違いない。こんなコマンドを使うと、抽出してくれるんだな。 rubyにも、同様な仕組みが備わっていたな。えと、何だったかな。もう忘れた。
sakae@deb:~/cassava$ cabal v2-haddock : Documentation created: /home/sakae/cassava/dist-newstyle/build/i386-linux/ghc-9.2.8/cassava-0.5.3.0/doc/html/cassava/index.html
これでネットワークにアクセスしなくても良くなるな。
ghc-9.7
一応インストールできたので、確認しておく。
sakae@deb:~/MINE/bin$ ls -l total 36 lrwxrwxrwx 1 sakae sakae 16 Jun 13 07:18 ghc -> ghc-9.7.20230607* -rwxr-xr-x 1 sakae sakae 390 Jun 13 07:18 ghc-9.7.20230607* lrwxrwxrwx 1 sakae sakae 17 Jun 13 07:18 ghci -> ghci-9.7.20230607* -rwxr-xr-x 1 sakae sakae 421 Jun 13 07:18 ghci-9.7.20230607* lrwxrwxrwx 1 sakae sakae 20 Jun 13 07:18 ghc-pkg -> ghc-pkg-9.7.20230607* -rwxr-xr-x 1 sakae sakae 450 Jun 13 07:18 ghc-pkg-9.7.20230607* lrwxrwxrwx 1 sakae sakae 24 Jun 13 07:18 haddock -> haddock-ghc-9.7.20230607* -rwxr-xr-x 1 sakae sakae 418 Jun 13 07:18 haddock-ghc-9.7.20230607* lrwxrwxrwx 1 sakae sakae 22 Jun 13 07:18 hp2ps -> hp2ps-ghc-9.7.20230607* -rwxr-xr-x 1 sakae sakae 390 Jun 13 07:18 hp2ps-ghc-9.7.20230607* lrwxrwxrwx 1 sakae sakae 20 Jun 13 07:18 hpc -> hpc-ghc-9.7.20230607* -rwxr-xr-x 1 sakae sakae 386 Jun 13 07:18 hpc-ghc-9.7.20230607* lrwxrwxrwx 1 sakae sakae 23 Jun 13 07:18 hsc2hs -> hsc2hs-ghc-9.7.20230607* -rwxr-xr-x 1 sakae sakae 1111 Jun 13 07:18 hsc2hs-ghc-9.7.20230607* lrwxrwxrwx 1 sakae sakae 19 Jun 13 07:18 runghc -> runghc-9.7.20230607* -rwxr-xr-x 1 sakae sakae 401 Jun 13 07:18 runghc-9.7.20230607* lrwxrwxrwx 1 sakae sakae 23 Jun 13 07:18 runhaskell -> runhaskell-9.7.20230607* -rwxr-xr-x 1 sakae sakae 409 Jun 13 07:18 runhaskell-9.7.20230607*
やけにghcが小粒なので、確認。
sakae@deb:~/MINE/bin$ cat ghc-9.7.20230607 #!/usr/bin/sh exedir="/home/sakae/MINE/lib/ghc-9.7.20230607/bin" exeprog="./ghc-9.7.20230607" executablename="/home/sakae/MINE/lib/ghc-9.7.20230607/bin/./ghc-9.7.20230607" bindir="/home/sakae/MINE/bin" libdir="/home/sakae/MINE/lib/ghc-9.7.20230607/lib" docdir="/home/sakae/MINE/share/doc/ghc-9.7.20230607" includedir="/home/sakae/MINE/include" exec "$executablename" -B"$libdir" ${1+"$@"}
こういう物なのか。これぐらいにしておく。