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

7 libraries I made by Elixir ヾ(〃l _ l)ノ゙

qiita.com

12/5

Elixirを使って製品を作ってゐると、releaseして此れ程の時が経ち此れ程の人が利用してゐるのに樣々のものが足りない。此の世では、必要なものは作る事に成ってゐるさうだ。なので一つづつ作ってきた。

みなさんも一つづつ作ってゆきませう。世界。

  • holiday_jp
  • inner_cotton
  • Mnemonics
  • PQueue2
  • stream_gzip
  • stream_hash
  • witha

holiday_jp

holiday_jp | Hex

Japanese holiday.

Rubyにはholiday_jpと云ふ便利なgemが在る。日本の休日をdatabaseにしたものだ。

休日と云ふのは規則的な樣だが、法律で決まるものであり、法律の改正によって變はるものだ。年に20日弱しか無い休日は數十年前から先迄樂に羅列できる。複雜な規則を法律の改正日で条件分岐しながら書き起こすより、羅列して引いてくるはうがずっと樂でbugを出しにくい。千年後はどうなるかわからないが当分は充分である。

此のElixirのholiday_jpは、Rubyのholiday_jpと同じdataを使ってゐる。函數は三つ用意してある。between/2holiday?/1on/1だ。

iex> HolidayJp.between ~D[2016-03-01], ~D[2016-03-31]
[
  %HolidayJp.Holiday{date: ~D[2016-03-20], week: "", week_en: "Sunday", name: "春分の日", name_en: "Vernal Equinox Day"},
  %HolidayJp.Holiday{date: ~D[2016-03-21], week: "", week_en: "Monday", name: "振替休日", name_en: "Holiday in lieu"},
]

iex> HolidayJp.holiday? ~D[2017-01-02]
true

iex> HolidayJp.holiday? ~D[2016-01-02]
false

iex> HolidayJp.on ~D[2017-02-11]
[%HolidayJp.Holiday{date: ~D[2017-02-11], week: "", week_en: "Saturday", name: "建国記念の日", name_en: "National Foundation Day"}]

inner_cotton

inner_cotton | Hex

Collection of recommended Elixir check utilities.

幾つかapplicationやlibraryを作ってゐると幾度も同じlibraryを入れる事に成る。静的check toolでいつも使ふものを集めた。私の作ったものには全て此のinner_cottonを入れてある。意味は「中綿」、Lint(糸屑)を集めたもの。

現状では以下のものが入る。

  • Credo : Lint, coding style enhancer.
  • Dialyxir : Type checker using Dialyzer. Erlang附屬の型檢査toolを實行する。
  • InchEx : Document (ExDoc) improver.

HEADでは更に次のものが入る。

  • stream_data : Property base testing like QuickCheck. 多數のrandom dataを使って性質testを書ける。性質が常に成り立つか檢査するかのやうな事に使ふ。
  • EyeDrops : Guardの樣に、fileの變更を監視してcommandを實行する。

mix cotton.initで各tool用の設定fileを置き、mix cotton.lintでCredoとDialyzerとInchが走り、mix testでいつも通りtestが走り、mix cotton.watchでfileの變更に合はせてlintとtestが走る(HEADでは)。今はExCoverallsを入れやうとしてゐる。

Mnemonics

mnemonics | Hex

Read only data store for Elixir: fast, concurrently, for large data & hot reloadable.

Mnesiaに匹敵しさうな名前を考へたらMnemonicsに成った。皮肉は效いてゐないが……。

數十MB位いのreadonly dataをon memoryに置いて讀み出す爲のものだ。RubyActiveHashがElixirにも欲しくて作った。Read onlyなETS tableを管理するlibraryとして在る。同じtable名のdataを複數version管理できる。realtimeにdataを差し替へる爲だ。

versionとdataのcache機能を附け終へた所だ。Mnemonicsを使ったcodeがtestableにならないのが一番の課題で、次は其れに取り組まうとしてゐる。ExMachinaの擴張を書く事に成ると思ふ。

PQueue2

pqueue2 | Hex

Priority queue that wraps pqueue2.

優先度附きqueue。

優先度附きqueueすら無かったのか何故作ったと思ふかもしれぬ。私もさう思った。然して調べてみると「優先度附きqueue」と名乗るElixirのlibraryは幾つも在った。私は全て調べた。結果、優先度附きqueueとして動作する實裝は無かった。同じ優先度からはrandomに出てくるものも在ったし(此れはPSQで、但しmapとしても機能する好いものだ)、一番uniqueな實裝はLIFOとして動いた、即ち優先度附き「stack」であった。辛うじて動いた一つはとっくに開發が放棄されてゐた。

ElixirではなくErlangにはちゃんとした實裝が在った。pqueueだ。此れをElixirから便利に呼び、EnumerableとCollectableを實裝したものがPQueue2である。今作ってゐるapplicationの背骨に使ってゐる。

stream_gzip

stream_gzip | Hex

Gzip or gunzip a stream.

ElixirのStreamは遲くて嫌はれてゐるかもしれないが、pararellに處理する程ではない場面で少ないmemoryで大きなdataを手軽に扱へる好いものだ。stream_gzipはdata全体をmemoryに載せずにgzip / gunzipできるStreamだ。

"x.js"
|> File.stream!
|> StreamGzip.gzip
|> Stream.into(File.stream! "x.js.gz")
|> Stream.run

gzipでき、

"x.js.gz"
|> File.stream!
|> StreamGzip.gunzip
|> Stream.into(File.stream! "x.js")
|> Stream.run

でgunzipできる。Web applicationでdataを生成しつつgzipでstreaming下載downloadさせる所で使った。

stream_hash

stream_hash | Hex

Stream into md4, md5, ripemd160, sha, sha224, sha256, sha384, sha512 hash.

上記stream_gzipをtestする爲に作ったが、どこかで使へる事も在るだらう。

witha

witha | Hex

With aspect: Monad chain, like Haskell's do or Clojure's cats.core/alet.

{:ok, value} | {:error, reason}を返す函數を連鎖したくて作った。Elixir標準のwith式で似た事はできるが、より各構造に特化した連鎖を書ける。

witha Witha.Error,
      [x1 <- {:ok, 1},
       x2 <- {:ok, x1 + 1}],
  do: x1 + x2
# {:ok, 3}

nil | valueも連鎖できる。

witha Witha.Nilable,
      [x1 <- nil,
       x2 <- x1 + 1],
  do: x1 + x2
# nil

AST level (macro)でnew (return) & flat_map (bind)する作りに成ってゐる。此れ丈だとwith式の亜種なので、もっと高度な抽象化を取り込みたい。

tokyo.ex #8

speakerdeck.com

ヾ(〃l _ l)ノ゙