c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

Haskell is good for scripting language ヾ(〃l _ l)ノ゙

Clojure/Haskell の誓ひと云ふのを立ててゐる。個人的な programming を Clojure/Haskell 以外でしないと云ふ誓ひだ。大体の事は置き換へてゆける。Java を使ふところは Clojure に置き換へる。Lisp を使ひたかったし、SuperCollider (Overtone)と Processing (Quil)を同時に扱ふのが簡單であるので、Haskell-like (Eta)ではなく Clojure を使ってゐる。JavaScriptHaskell に置き換へられる。Web front-end 用 framework (Miso)すら在る。

一つ困ってゐて、shell script とその仲間を捨てられずにゐた。ClojureHaskell も shell script を置き換へるのは辛からうと思った。ClojureJVM を起動しなければならないし、又これは 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

-- vim:set ft=haskell:

今困ってゐるのは、Haskell の文件を開くと Emacs (Evil) が固まる事。kill するしか無くなってしまふ。代りに Vim を使ってゐるが…。

ヾ(〃l _ l)ノ゙