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

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

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

音樂はSoundCloud等バラバラの場所に公開中です。申し訳ないがlinkをたどるなどして探してください。

考察は現在は主に此のblogで公表中です。

programmingは、ひろくみせるものはGitHubで、個人的なものはBitBucketで開発中です。

c4se

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)ノ゙