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

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

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

音樂は SoundCloud に公開中です。

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

Programming は GitHub で開發中です。

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。

JSONを整形してからdiffをとるtool、diff-with-jsonを作った

JSON を整形してから diff をとる tool、diff-with-json を作った。

github.com JSON を jq command に通して整形し、colordiff が在れば其れを、無ければ diff を使って差分を表示する。

次の a1.json と a2.json が在ったとしやう。

// a1.json
{ "m": 42, "n": 57 }
// a2.json
{ "m": 42, "n": "parrot" }

.n を 57 から"parrot"に変へたものだ。此れを diff で diff -u -L a1.json -L a2.json a1.json a2.json として差分を出すと斯う成って了ふ。

--- a1.json
+++ a2.json
@@ -1 +1 @@
-{"m":42,"n":57}
+{"m":42,"n":"parrot"}

JSON の構造は全く無視される。代はりに diff-with-json を使へば diff-with-json -L a1.json -L a2.json a1.json a2.json として、

--- a1.json
+++ a2.json
@@ -1,4 +1,4 @@
 {
   "m": 42,
-  "n": 57
+  "n": "parrot"
 }

JSON の構造を保った差分が見られる。

情報を JSON で、一行に圧縮して Git や SVN に入れてゐる場合に好く使へる。特に svn diff と共に使ふ樣に作ってある。svn diff --diff-cmd diff-with-json と--diff-cmd option として diff-with-json を指定してやれば、SVN に一行にして格納してゐる JSON の差分が見易い。

使ふ時は jq command と、diff 或いは colordiff command が必要だ。

Crystal で作った。