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

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

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

音樂は SoundCloud に公開中です。

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

Programming は GitHub で開發中です。

Work lein-droid with Leiningen 2.8 ヾ(〃l _ l)ノ゙

Clojureをやる。Overtone (SuperCollider)とQuil (Processing)が目當てだったが、JVM は此いつで濟ませて了へさうだ。AndroidClojure で書ける。

書けてゐた。

或る日突然書けなく成った。Leiningenを更新したからだ。lein 2.8 に成った。

% lein -v
Leiningen 2.8.1 on Java 1.8.0_152 Java HotSpot(TM) 64-Bit Server VM

AndroidVM は OpenJDK ではない。JVM っぽい JVM に似たものだから、Clojure の普通の compiler で出力したものは動かない。android-sdk で compile する必要が在る。此れを遣って呉れるのがlein-droidと云ふ Leiningen plugin だ。lein droid doallとひとたび叩けば android-sdk で compile し apk を作り實機に入れ起動し、debug console もこなす優れものだが、此れが error を吐く樣に成った。

調べると此れは Leiningen が内で使ふ library を新しいものに差し替へたからで、lein-droid が其の内で使ってゐた library を直截に使ってゐた。其所で、新しく差し替はった library を呼ぶ樣にしたり、依存を明示する樣にして直してみた。

github.com

所が反應が無い。元々 2016-10-23 から音沙汰が無い。つらい。何故誰も ClojureAndroid アプリを作らないのか。文明。世界。宇宙。

Clojure 自體は活潑に開發され、Android framework は根本的には變はってゐないので、Android アプリは作れるんですよ。好いですよ、Clojure。最高の Lisp。Elixir が目指したもの。

わっちが直したものを下記の手順で安裝installすれば、lein-droid が蘇る。

github.com

git clone git@github.com:ne-sachirou/lein-droid.git
cd lein-droid
git checkout -b fix/for_latest_leiningen origin/fix/for_latest_leiningen
lein install

cd PROJECT_PATH
lein droid doall

(〃l _ l)☆

A patch to run whatyouhide/stream_data in Elixir 1.4.* ヾ(〃l _ l)ノ゙

github.com

whatyouhide/stream_data は素晴らしい library だが Elixir 1.5 以上でなければ動かない。他の事の序でついでに 1.4 に對應させてみた。

diff --git a/lib/ex_unit_properties.ex b/lib/ex_unit_properties.ex
index f9822b1..f95bcad 100644
--- a/lib/ex_unit_properties.ex
+++ b/lib/ex_unit_properties.ex
@@ -373,7 +373,7 @@ defmodule ExUnitProperties do
         # TODO: Use :rand.export_seed in Elixir master.
         # The value may be :undefined in a new process
         # though, which means we may need to generate one.
-        initial_seed: {0, 0, ExUnit.configuration()[:seed]},
+        initial_seed: {0, 0, ExUnit.configuration()[:seed] || 1},
         initial_size:
           options[:initial_size] || Application.fetch_env!(:stream_data, :initial_size),
         max_runs: options[:max_runs] || Application.fetch_env!(:stream_data, :max_runs),
diff --git a/lib/stream_data.ex b/lib/stream_data.ex
index 6584798..ef4e673 100644
--- a/lib/stream_data.ex
+++ b/lib/stream_data.ex
@@ -513,7 +513,7 @@ defmodule StreamData do
     children =
       int
       |> Stream.unfold(next_division)
-      |> Stream.drop_while(&((int - &1) not in range))
+      |> Stream.drop_while(&(not (int - &1) in range))
       |> Stream.map(&integer_lazy_tree(int - &1, range))

     lazy_tree(int, children)
diff --git a/mix.exs b/mix.exs
index a658b0c..1d19f65 100644
--- a/mix.exs
+++ b/mix.exs
@@ -8,7 +8,7 @@ defmodule StreamData.Mixfile do
     [
       app: :stream_data,
       version: @version,
-      elixir: "~> 1.5",
+      elixir: "~> 1.4",
       start_permanent: Mix.env() == :prod,
       deps: deps(),

diff --git a/test/ex_unit_properties_test.exs b/test/ex_unit_properties_test.exs
index 8bc162d..3fd66a6 100644
--- a/test/ex_unit_properties_test.exs
+++ b/test/ex_unit_properties_test.exs
@@ -83,7 +83,7 @@ defmodule ExUnitPropertiesTest do
     property "shrinking" do
       assert_raise ExUnit.AssertionError, fn ->
         check all list <- list_of(integer()) do
-          assert 5 not in list
+          refute 5 in list
         end
       end
     end

が、私が作ってる library の 1.4 對應は切らうと思ふ。

Drop Elixir 1.4.* support · ne-sachirou/inner_cotton@63ce4f5

ヾ(〃l _ l)ノ゙

Elixirの優先度附きキューライブラリPQueue2を作った

pqueue2 | Hexを作った。

github.com

Erlang で書かれたpqueueに含まれてる pqueue2 モジュールを、Elixir でラップしたもの。

q = PQueue2.new |> PQueue2.put(:a, 2) |> PQueue2.put(:b, 1) |> PQueue2.put(:c, 1)
{:b, q} = PQueue2.pop

Collectable と Enumerable も實裝したので次の書き方も出來る。

[:b, :c, :a, :d] == [{:a, 2}, {:b, 1}, {:c, 1}, {:d, 2}] |> Enum.into(PQueue2.new) |> Enum.to_list

Hex を檢索すると、優先度附きキューを實裝したと述べるライブラリは沢山在る。全てを試してみたが、正しく「優先度附きキュー」として動作するライブラリは、pqueue と、pqueue をラップしたものしか無い。あとは「優先度附き」ではあるが「キュー」として動作しない。pqueue を Elixir でラップしたものは數年更新が停まってゐる。pqueue は最近でも更新されてゐる。そこで pqueue を使ふ事にした。pqueue は Erlang で書かれてゐて、Elixir らしい使ひ方をするには不便だ。だから Elixr でラップした。

PropCheckで property based test を書いたりした。

遲延評價Streamでgzip/gunzipするElixirのライブラリを作った

Stream で hash を計算する

stream_hash | Hex

何故無かった。

github.com

"test/fixture/xyzxyz.txt"
|> File.stream!
|> StreamHash.hash(:sha512)
|> Enum.to_list
|> hd

# <<215, 133, 241, 243, 115, 159, 59, 127, 111, 242, 140, 106, 171, 211, 130, 48,
#   174, 198, 241, 236, 195, 112, 105, 150, 106, 133, 78, 249, 2, 178, 132, 254,
#   50, 181, 85, 46, 183, 97, 187, 7, 38, 17, 26, 188, 232, 143, 152, 210, 71, 54,
#   245, 48, 107, 70, 180, 43, 96, 26, 69, 90, 17, 156, 111, 65>>

Stream で gzip/gunzip する

stream_gzip | Hex

何故無かった。

github.com

Gunzip:

"x.gz"
|> File.stream!
|> StreamGzip.gunzip
|> Enum.join

Gzip:

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

日本の祝日を扱ふholiday_jpをElixirに移植したholiday_jp-elixirを作った

日本の祝日を扱ふ holiday_jp を Elixir に移植した holiday_jp-elixir を作った

github.com

普段は Ruby や Elixir や Python や Crystal を扱ってゐる。祝日と云ふのは本質的に難しい。何時が祝日であるかは国民の祝日に関する法律と云ふ法律に依って決まる。一年のいつが祝日であるか此の法律に書いてあるし、例外處理も書かれてゐる。故に此の法律から祝日は決定出來る。では現在の此の法律を基に祝日を扱ふ處理を書いて了って好いだらうか。ところが法律は改正されるのである。即ち現在の此の法律の algorithm は過去に遡って適用出來ないし、未來に下って適用も出來ない。無論改正を全て algorithm に組み込む事は出來る。然し其んな面倒な事をするよりも、數少ない祝日を全て羅列した方が安全で簡單である。Ruby ではholiday_jpと云ふ gem が此れをやって呉れ、皆便利に使へる樣に成った。此の度 Elixir で祝日を扱ふ必要が在ったので、此れを移植した。

mix.exs の deps/0 に :holiday_jp を追加し、同じく mix.exs の applications/0 にも :holiday_jp を追加すれば使へる。HolidayJp.between/2HolidayJp.holiday?/1 と云ふ二つの函數を提供する。

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

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

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

祝日の一覧はholiday-jp/holiday_jpを git submodule して依存してある。

因みに holiday_jp-elixir を使って作ったのは、平日丈罵倒して呉れる Slack botbot の framework にはHedwigを使った。打倒 Hubot。