Clojure/Haskell の誓ひと云ふのを立ててゐる。個人的な programming を Clojure/Haskell 以外でしないと云ふ誓ひだ。大体の事は置き換へてゆける。Java を使ふところは Clojure に置き換へる。Lisp を使ひたかったし、SuperCollider (Overtone)と Processing (Quil)を同時に扱ふのが簡單であるので、Haskell-like (Eta)ではなく Clojure を使ってゐる。JavaScript は Haskell に置き換へられる。Web front-end 用 framework (Miso)すら在る。
一つ困ってゐて、shell script とその仲間を捨てられずにゐた。Clojure も Haskell も shell script を置き換へるのは辛からうと思った。Clojure は JVM を起動しなければならないし、又これは JVM に關はる事ではないからできれば Haskell でやりたい。しかし GHC の標準 library では全然足りないから幾つも library を入れ追從しなければならない。と思ってゐた。さういふ時には、Ruby を書いたり Perl を書いたり Crystal を書いたりしてゐた。誓ひは破られたのである。
この度に、少々無理にでも Haskell で軽く scripting できる手法を見附けておくべきだらうと思ひ決めた。GHC の標準 library は貧弱だと思ひ込んでゐたから、その貧弱な標準 library で苦心するか、Stack project を作る事無く Hackage の library を簡單に扱へる方法を組み立てやうと決め、もそもそと調べ出した。
しかし書けたのである。特に苦勞は無かった。runghc も GHC の標準 library も好い仕事をした。皆とりこし苦勞だった。
昔との違ひはDashを使ふ樣に成ってゐた事である。何をするにもその環境の標準 library を全文檢索する癖が附いてゐたから、そんな誤解もしなく成ってゐた。全文檢索は凄い。runghc も頗る速かった。この理由は知らない。
以下が shell script から移してきた短い Haskell script である。git-deploy
と名附け、git-deploy some_host_on_ssh_config /home/some_user
の樣に使ふ。雜な内容から用途の雜さは推して知るべしである。
#!/usr/bin/env runghc
import System.Environment ( getArgs, getExecutablePath )
import System.FilePath ( takeBaseName )
import System.Posix.Directory ( getWorkingDirectory )
import System.Process ( readCreateProcess, shell )
import Text.Printf ( printf )
main :: IO ()
main = do
args <- getArgs
case args of
host:remoteDir:_ -> deploy host remoteDir
_ -> help
help :: IO ()
help = putStr $ unlines [ "Help: deploy HOST REMOTE_DIR" ]
deploy :: String -> String -> IO ()
deploy host remoteDir = do
projectName <- fmap takeBaseName getWorkingDirectory
sh $ printf "git archive -9 -o /tmp/%s.tar.gz --prefix %s/ HEAD" projectName projectName
sh $ printf "scp /tmp/%s.tar.gz %s:%s/%s.tar.gz" projectName host remoteDir projectName
sh $ unlines
[ (printf "ssh %s -K 'bash -s' <<EOF" host)
, (printf "cd %s" remoteDir)
, (printf "tar xzf %s.tar.gz" projectName)
, "EOF"
]
sh :: String -> IO ()
sh command = do
putStrLn $ "+" ++ command
out <- readCreateProcess (shell command) ""
putStrLn out
今困ってゐるのは、Haskell の文件を開くと Emacs (Evil) が固まる事。kill するしか無くなってしまふ。代りに Vim を使ってゐるが…。
ヾ(〃l _ l)ノ゙