ブログ用のCSSをちょっといじってみた。pandoc
で出力されるHTMLファイルには勝手にCSSクラス名を付けてくれるので、それに合わせてCSSファイルを書けば色が付くのだが、全部自分でやったらかかる手間は並大抵のものではない。
せっかく自分のサイトなので出来合いのものではなく自作しようと決めたものの、でもブラウザ間の差は埋めるべきだと思ったのでnormalize.css をまず採用した。
あとはまあ色々調べながら適当に。コードブロックは普段僕が使ってるターミナルみたいに黒い背景の色にしてみた。せっかくなのでHaskellのコードブロックについてはちょっと色も付けてみた。いつも使っているVimのシンタックスハイライトと同じ色合いに。最初のブログ記事が一番よく違いが出ていると思う。
…と思ってこの記事を読み返したら色の付き方が思ってたのと違う!出力する CSSクラス名を修正しないと直せないから100%狙い通りの色付けを行うのは困難を極めそうだ。
この前作ったラムダ計算のプログラムでちょっと自信のないところがあったので単体テストを作成することにした。Haskellのビルドツールであるcabal
では test-suite
スタンザを記述することでテストを置くことができるが、テスト対象のモジュールをインポートして使いたいならexecutable
じゃなくて library
にしなければならない(privateでも可)。
例えば、最初の状態がexecutable
しかない構成の場合:
-- foo.cabal
-- 前略
executable foo
main-is: Main.hs
other-modules: Foo
build-depends: base >=4.13 && <=4.14
hs-source-dirs: src
default-language: Haskell2010
ghc-options: -Wall -threaded
この場合、まずexecutable foo
スタンザをlibrary
化した後に、 test-suite
スタンザを加えると上手くいく:
-- foo.cabal (修正後)
-- 前略
library -- (1)
exposed-modules: Foo.Foo
Foo.Main -- (2)
build-depends: base >=4.13 && <=4.14
hs-source-dirs: src
default-language: Haskell2010
ghc-options: -Wall
executable foo
main-is: src/foo.hs -- (3a)
-- other-modules:
build-depends: foo, base -- (4a)
-- hs-source-dirs: -- (3b)
default-language: Haskell2010
ghc-options: -Wall -threaded
test-suite unittest
type: exitcode-stdio-1.0
main-is: Main.hs
other-modules Foo.FooSpec
build-depends: foo, base -- (4b)
, QuickCheck
, hspec
hs-source-dirs: test/unittest
default-language: Haskell2010
ghc-options: -Wall
ポイントがいくつかある。
(1)
: library
というキーワードの後に名前を書かない場合はpublicライブラリ(通常のライブラリ)に、名前を書く場合はprivateライブラリになる。今後Hackageにうpしたいかどうかによって変わるが、そのつもりがないならどちらでもOK。
(2)
: executable
スタンザにあったMain
モジュールをまるごとライブラリに移動してしまうのが手っ取り早くておすすめ。そうしたらexecutable
の方のMain
モジュールはこれだけになる:
import qualified Foo.Main
main :: IO ()
= Foo.Main.main main
Hackageにうpする場合はmain
関数がライブラリに残っているのは不格好かもしれない。
(3a)
(3b)
: library
とexecutable
のhs-source-dir
は同じにしてはいけない。同じにしてしまうと2度コンパイルされてしまう。 executable
のファイル名は上記(2)
に従うならファイル一枚になるので、名前は適当でいい。
(4a)
(4b)
: executable
とtest-suite
はライブラリ(foo
)と同じ base
パッケージを必ず使用するので、バージョンの範囲を指定する必要はない。
なるべく手間を減らし、かつcabal
をきれいに使うやり方だと自分で思っているけどやはりめんどくさい。。。executable
を直接test-suite
の build-depends
に書いてインポートできるようになってくれないだろうか。結構よくある用途な気がするんだが……