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はどうするんだったかな? ググったら、こん なのが出てきた。

The cabal-install package

HTTPとzlibが必要とな。超昔にやった記憶が有るぞ。

cabal install cabal-install

tar玉を展開しといて、上記を実行でいいみたい。古いcabalが利用されるけど、 新らしいのになる。

haskell-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

第57回 機能テストや性能テストをCabalで自動化

[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)

A criterion tutorial

ベンチマーク in cabal

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+"$@"}

こういう物なのか。これぐらいにしておく。


This year's Index

Home