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

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

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

音樂は SoundCloud に公開中です。

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

Programming は GitHub で開發中です。

XML を表現する時 XML の階層が表現する code にも表れて欲しい (Python)

偶々 ClojureAtom を、PythonSVG を生成する機會が有った。どちらも XML だ。Python には標準でxml.etree.ElementTreeと云ふ class が含まれてゐて、これで XML を讀み書き出來る。

Clojure だと XML を生成するには、

(require '[clojure.xml :as xml])

(->> {:tag :svg
      :attrs {:xmlns "http://www.w3.org/2000/svg"
              :height "148mm"
              :width "210mm"}
      :content [{:tag :g
                 :content [{:tag :line
                            :attrs {:stroke "black"
                                    :x1 "5mm"
                                    :x2 "200mm"
                                    :y1 "4mm"
                                    :y2 "144mm"}}
                           {:tag :text
                            :attrs {:fill "black"
                                    :font-family "sans-serif"
                                    :font-size "12pt"
                                    :x "25mm"
                                    :y (str (+ 25 (* 12 0.353)) "mm")}
                            :content ["日本語"]}]}]}
     xml/emit
     with-out-str)
<?xml version='1.0' encoding='UTF-8'?>
<svg xmlns="http://www.w3.org/2000/svg" height='148mm' width='210mm'>
<g>
<line stroke='black' x1='5mm' x2='200mm' y1='4mm' y2='144mm'/>
<text fill='black' font-family='sans-serif' font-size='12pt' x='25mm' y='29.236mm'>
日本語
</text>
</g>
</svg>

と map を作ればよい。map は Clojure の得意とする data であるし、map の階層は XML のものと等しい。改行と escape の問題は有る。escape は自前で出來るし、改行に就いてはWhy clojure.xml/emit prints new lines around string contents inside tags? - Stack Overflowの如く patch を当てるかclojure.data.xmlを使ふ事に成る。

これが Python では、

import xml.etree.ElementTree as ET

svg = ET.Element(
    "svg",
    {
        "xmlns": "http://www.w3.org/2000/svg",
        "height": "148mm",
        "width": "210mm",
    },
)
g = ET.SubElement(svg, "g")
ET.SubElement(
    g,
    "line",
    {
        "stroke": "black",
        "x1": "5mm",
        "x2": "200mm",
        "y1": "4mm",
        "y2": "144mm",
    },
)
text = ET.SubElement(
    g,
    "text",
    {
        "fill": "black",
        "font-family": "sans-serif",
        "font-size": "12pt",
        "x": "25mm",
        "y": f"{25 + 12 * 0.353}mm",
    },
)
text.text = "日本語"
ET.tostring(svg).decode("utf-8")
<svg xmlns="http://www.w3.org/2000/svg" height="148mm" width="210mm"><g><line stroke="black" x1="5mm" x2="200mm" y1="4mm" y2="144mm" /><text fill="black" font-family="sans-serif" font-size="12pt" x="25mm" y="29.236mm">&#26085;&#26412;&#35486;</text></g></svg>

何だこれ。見よこれが OOP だよ。いや Groovy のgroovy.xml.MarkupBuilderも有るが…。

JavaScript も似た樣なものだ。

const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svg.setAttribute("height", "148mm");
svg.setAttribute("width", "210mm");
const g = document.createElement("g");
svg.appendChild(g);
const line = document.createElement("line");
line.setAttribute("stroke", "black");
line.setAttribute("x1", "5mm");
line.setAttribute("x2", "200mm");
line.setAttribute("y1", "4mm");
line.setAttribute("y2", "144mm");
g.appendChild(line);
const text = document.createElement("text");
text.setAttribute("fill", "black");
text.setAttribute("font-family", "sans-serif");
text.setAttribute("font-size", "12pt");
text.setAttribute("x", "25mm");
text.setAttribute("y", `${25 + 12 * 0.353}mm`);
text.textContent = "日本語";
g.appendChild(text);
svg.outerHTML;
<svg height="148mm" width="210mm"><g><line stroke="black" x1="5mm" x2="200mm" y1="4mm" y2="144mm"></line><text fill="black" font-family="sans-serif" font-size="12pt" x="25mm" y="29.236mm">日本語</text></g></svg>

酷い。これが素で書き下せて嫌に成る。Ruby の REXML も殘念だがこれの類いである。

require 'rexml/document'

REXML::Document.new.tap do |doc|
  doc << REXML::XMLDecl.new('1.0', 'UTF-8')
  doc << REXML::Element.new('svg').tap do |svg|
    svg.add_attributes(
      'xmlns' => 'http://www.w3.org/2000/svg',
      'height' => '148mm',
      'width' => '210mm'
    )
    svg << REXML::Element.new('g').tap do |g|
      g << REXML::Element.new('line').tap do |line|
        line.add_attributes(
          'stroke' => 'black',
          'x1' => '5mm',
          'x2' => '200mm',
          'y1' => '4mm',
          'y2' => '144mm'
        )
      end
      g << REXML::Element.new('text').tap do |text|
        text.add_attributes(
          'fill' => 'black',
          'font-family' => 'sans-serif',
          'font-size' => '12pt',
          'x' => '25mm',
          'y' => "#{25 + 12 * 0.353}mm",
        )
        text.text = '日本語'
      end
    end
  end
end.to_s
<?xml version='1.0' encoding='UTF-8'?><svg height='148mm' width='210mm' xmlns='http://www.w3.org/2000/svg'><g><line stroke='black' x1='5mm' x2='200mm' y1='4mm' y2='144mm'/><text fill='black' font-family='sans-serif' font-size='12pt' x='25mm' y='29.236mm'>日本語</text></g></svg>

Object#tapでごまかした。ごまかせるのは好い事だ。

Goovy だとこう書け、迚も好い。

import groovy.xml.MarkupBuilder

def writer = new StringWriter()
new MarkupBuilder(writer).svg(xmlns:'http://www.w3.org/2000/svg', width:'148mm', height: '210mm') {
  g {
    line(stroke:'black', x1:'5mm', x2:'200mm', y1:'4mm', y2:'144mm')
    text(fill:'black', 'font-family':'sans-serif', 'font-size':'12pt', x:'25mm', y: "${25 + 12 * 0.353}mm", '日本語')
  }
}
writer.toString()
<svg xmlns='http://www.w3.org/2000/svg' width='148mm' height='210mm'> <g> <line stroke='black' x1='5mm' x2='200mm' y1='4mm' y2='144mm' /> <text fill='black' font-family='sans-serif' font-size='12pt' x='25mm' y='29.236mm'>日本語</text> </g> </svg>

Clojure と同じく函數型である Erlang の xmerl を Elixir から使ふと…、

{:ok, pid} = StringIO.open("")

IO.puts(
  pid,
  :xmerl.export_simple(
    [
      {:xmlElement, :svg, :svg, [], {:xmlNamespace, :"http://www.w3.org/2000/svg", []}, [], 1,
       [
         {:xmlAttribute, :xmlns, [], [], [], [svg: 1], 1, [], 'http://www.w3.org/2000/svg',
          false},
         {:xmlAttribute, :height, [], [], [], [svg: 1], 2, [], '148mm', false},
         {:xmlAttribute, :width, [], [], [], [svg: 1], 3, [], '210mm', false}
       ],
       [
         {:xmlElement, :g, :g, [], {:xmlNamespace, :"http://www.w3.org/2000/svg", []}, [svg: 1],
          1, [],
          [
            {:xmlElement, :line, :line, [], {:xmlNamespace, :"http://www.w3.org/2000/svg", []},
             [g: 1, svg: 1], 1,
             [
               {:xmlAttribute, :stroke, [], [], [], [line: 1, g: 1, svg: 1], 1, [], 'black',
                false},
               {:xmlAttribute, :x1, [], [], [], [line: 1, g: 1, svg: 1], 2, [], '5mm', false},
               {:xmlAttribute, :x2, [], [], [], [line: 1, g: 1, svg: 1], 3, [], '200mm', false},
               {:xmlAttribute, :y1, [], [], [], [line: 1, g: 1, svg: 1], 4, [], '4mm', false},
               {:xmlAttribute, :y2, [], [], [], [line: 1, g: 1, svg: 1], 5, [], '144mm', false}
             ], [], [], '', :undeclared},
            {:xmlElement, :text, :text, [], {:xmlNamespace, :"http://www.w3.org/2000/svg", []},
             [g: 1, svg: 1], 2,
             [
               {:xmlAttribute, :fill, [], [], [], [text: 2, g: 1, svg: 1], 1, [], 'black', false},
               {:xmlAttribute, :"font-family", [], [], [], [text: 2, g: 1, svg: 1], 2, [],
                'sans-serif', false},
               {:xmlAttribute, :"font-size", [], [], [], [text: 2, g: 1, svg: 1], 3, [], '12pt',
                false},
               {:xmlAttribute, :x, [], [], [], [text: 2, g: 1, svg: 1], 4, [], '25mm', false},
               {:xmlAttribute, :y, [], [], [], [text: 2, g: 1, svg: 1], 5, [], String.to_charlist("#{25 + 12 * 0.353}mm"), false}
             ],
             [
               {:xmlText, [text: 2, g: 1, svg: 1], 1, [], [26085, 26412, 35486], :text}
             ], [], '', :undeclared}
          ], [], '', :undeclared}
       ], [], '', :undeclared}
    ],
    :xmerl_xml
  )
)

{:ok, {_, contents}} = StringIO.close(pid)
contents
<?xml version="1.0"?><svg xmlns="http://www.w3.org/2000/svg" height="148mm" width="210mm"><g><line stroke="black" x1="5mm" x2="200mm" y1="4mm" y2="144mm"/><text fill="black" font-family="sans-serif" font-size="12pt" x="25mm" y="29.236mm">日本語</text></g></svg>

これは Erlang の record が惡過ぎて書けない。

これらは全て標準 library だ。標準 library は優れたものである必要が有る。でなければ含まれてゐないはうが好い。

さて PyPI から適切なものを見繕って來れば好いのだらうが、手元で濟ませてしまおう。

from contextlib import contextmanager
from functools import partial
import typing as t
import xml.etree.ElementTree as ET

@contextmanager
def e(
    tag: str, attrib: t.Dict[str, str] = {}, text: str = "", parent: ET.Element = None
) -> None:
    if parent is not None:
        element = ET.SubElement(parent, tag, attrib)
    else:
        element = ET.Element(tag, attrib)
    if text != "":
        element.text = text
    yield partial(e, parent=element)

これでこう成る。

svg = ET.Element(
    "svg",
    {
        "xmlns": "http://www.w3.org/2000/svg",
        "height": "148mm",
        "width": "210mm",
    },
)
with e("g", {}, parent=svg) as _e:
    with _e(
        "line",
        {
            "stroke": "black",
            "x1": "5mm",
            "x2": "200mm",
            "y1": "4mm",
            "y2": "144mm",
        },
    ):
        pass
    with _e(
        "text",
        {
            "fill": "black",
            "font-family": "sans-serif",
            "font-size": "12pt",
            "x": "25mm",
            "y": f"{25 + 12 * 0.353}mm",
        },
        "日本語",
    ):
        pass
ET.tostring(svg).decode("utf-8")
<svg xmlns="http://www.w3.org/2000/svg" height="148mm" width="210mm"><g /><g><line stroke="black" x1="5mm" x2="200mm" y1="4mm" y2="144mm" /><text fill="black" font-family="sans-serif" font-size="12pt" x="25mm" y="29.236mm">&#26085;&#26412;&#35486;</text></g></svg>

XML での表現とそれを生成する code での表現とが一致してゐると好い。

Clojure で task runner を書く

度々簡易な task runner を書いてゐる。いつもは Makefile を使ってゐて、makeと打つだけで何をするべきか思ひ出せるやうにしてある。例へば、

.PHONY: help
help:
    @awk -F':.*##' '/^[-_a-zA-Z0-9]+:.*##/{printf"%-16s\t%s\n",$$1,$$2}' $(MAKEFILE_LIST) | sort

.PHONY: format
format: ## Format all stuffs.
    clojure -m cljfmt.main fix .
    npx prettier --write package.json
    npx prettier --parser yaml --write .yamllint .github/workflows/*.yml
    ag -g '\.md$' | xargs -t -P "$(($(nproc) * 2))" -I {} sh -eux -c 'npx prettier --write "{}" && npx textlint --fix "{}"'

makemake helpが實行され、help が見られる。

便利 shell script 集として Makefile を使ってゐるのである。shell 藝が難しく成ってきたら Makefile を捨てる。普通はtools/format.sh等の樣に個別の shell script file を用意するのであらう。趣味でやってゐるのでなければそうするだらう。自分は Rakefile を書いてゐた。しかしその project で Ruby を使ふのが躊躇はれる場合、且つそれが趣味であれば shell script 集としての task runner 位いは書いてしまふ。Python だとこうだ。先ず task 一覧を記録する變數を作る。

tasks = {}

そこに次の樣に decorator を書くと記録される樣にしたい。

@task
def format():
    """Format code."""
    run(r"ag -l '\r' | xargs -t -I{} sed -i -e 's/\r//' {}")
    with docker() as _run:
        _run("poetry run black *.py imperial_calendar tests ui")
        _run("npx prettier --write README.md templates/*.md")
        _run("npx prettier --write *.js")
        _run(
            "sh -eux -c {:s}".format(
                quote(
                    r"ag --hidden -g \.ya?ml$ | xargs -t npx prettier --parser yaml --write"
                )
            )
        )

これは高階の手續きで書ける。

def task(function):
    """Define a task."""
    if function.__doc__:
        tasks[function.__name__] = function.__doc__

    def wrapper():
        function()

    return wrapper

task を實行する code も短い。help こそ欲しい機能であるからそれも實裝する。

if __name__ == "__main__":
    if len(sys.argv) == 1 or sys.argv[1] == "help":
        for task_name, describe in tasks.items():
            print(f"{task_name.ljust(16)}\t{describe}")
        exit(0)
    for task_name in sys.argv[1:]:
        locals()[task_name]()

これで./tasks.pyを叩けば全てを思ひ出せる。task の依存關係を解決する仕組みは無い。build 成果物を指定したい時には pull 型或いは bottom up の依存解決が要る (例へば ne-sachirou/docker-elixir/lib/mix/tasks/make.ex)。しかし shell script 集の樣なもの詰まり push 型や top down とでも言へるものである場合は、高機能な programming 言語が手元に有るのだから、依存する task を明示して呼べば濟む。若しくは手續き (記法としては函數) を書いて呼べば好い。

shell command を實行する機能は当然要る。これは project 毎に特殊な處理と成るが、例へば、

def run(command: str, capture_output=False, text=None) -> subprocess.CompletedProcess:
    """Run command."""
    command = command.strip()
    print(command)
    env = os.environ.copy()
    env["DOCKER_BUILDKIT"] = "1"
    return subprocess.run(
        command,
        env=env,
        capture_output=capture_output,
        check=True,
        shell=True,
        text=text,
    )

Clojure で同じ事をやらう。先ず task 一覧を記録する變數を作る。Clojure は transactional に再代入可能な變數を作れる。

(def tasks (ref {}))

次の樣に macro で task を書ける樣にしたい。

; deps.edn
{:deps {
  cljfmt {:mvn/version "0.6.7"}}}
(require '[cljfmt.main :as cljfmt])

(deftask format
  "Format all stuffs."
  (sh "sh" "-eux" "-c" "ag -l '\\r' | xargs -t -I {} sed -i -e 's/\\r//' {}")
  (println "+ clojure -m cljfmt.main fix .")
  (cljfmt/fix ["."] (cljfmt/merge-default-options {}))
  (sh "npx" "prettier" "--write" "package.json")
  (sh "npx" "prettier" "--parser" "yaml" "--write" ".yamllint" ".github/workflows/*.yml"))

簡單な macro。

(defmacro deftask [task-name doc & body]
  (dosync (alter tasks assoc task-name {:doc doc :body (conj body 'do)}))
  nil)

實行するには少し手間が要る。先ず task を呼ぶ部分はこう。

(defn act [task-name]
  (let [tasks @tasks
        task-name (symbol task-name)]
    (if (contains? tasks task-name)
      (->> tasks task-name :body eval)
      (do (println (format "Task %s not found." task-name))
          (System/exit 1)))))

(defn main [argv]
  (cond
    (or (empty? argv) (some #(= % "help") argv)) (help)
    (some #(= % "repl") argv) (repl)
    :else
    (do (doseq [task-name argv] (act task-name))
        (System/exit 0))))

(main (vec *command-line-args*))

help は、

(defn help []
  (println (format "%-16s\t%s" 'help "Show this help."))
  (println (format "%-16s\t%s" 'repl "Start a REPL."))
  (doseq [[task-name task] @tasks]
    (println (format "%-16s\t%s" task-name (:doc task)))))

面倒なのは次だ。Clojure は、實行は速いが JVM の起動が遲い。そこでclojure tasks.cljとしても實行出來、更に REPL でも動かせる樣にしておく。

(defn repl []
  (println "`(help)` to print a help.")
  (println "`(act :TASK-NAME)` to run the task.")
  (help)
  (clojure.main/repl))

これを起動するには、

rlwrap -c -b "(){}[],^%$#@\"\";:''|\\" clojure tasks.clj repl

これは覺えられないので Makefile を書いておく。

.PHONY: repl
repl:
    rlwrap -c -b "(){}[],^%$#@\"\";:''|\\" clojure tasks.clj repl

makeと叩けば REPL が起動し、help が表示される。

shell script を實行するのには例へばこう。

(require '[clojure.java.shell :as shell])

(defn sh [exe & args]
  (println (clojure.string/join " " (concat ["+" exe] args)))
  (let [{:keys [exit out err]} (apply shell/sh (cons exe args))]
    (if (= 0 exit)
      (print err out)
      (do (print (format "Exit with %d\n" exit) out err)
          (System/exit exit)))))

Community-Powered Clojure Documentation and Examples | ClojureDocs に全て載ってゐる。

四方對象と學の四角形

Graham Harman と云ふ著述家の書いた四方對象と云ふ圖式を二つ書き写す。(cf. 四方対象: オブジェクト指向存在論入門)

緊張 (時間・空間・本質・形相) と、攪乱 (融合 (魅惑・因果作用) / 分裂 (simulation・理論)) の圖。

\begin{array}{c} 實在的對象 & =^{本質=因果作用}= & 實在的性質 \\ || & & || \\ {\small 空間=魅惑} & & {\small 形相\leftrightarrow 理論} \\ || & & || \\ 感覚的性質 & =_{時間\leftrightarrow simulation}= & 感覚的對象 \end{array}

放射 (縮約・發出・二重性) と接合 (退隱・隣接・沒頭) の圖。

f:id:Kureduki_Maari:20200226022800p:plain

この世の指向しうるものを有無を問はず對象として、その自身との、また他の對象との構造を示すもの。感覺的/實在的、對象/性質の2\times 2=4肢構造を持つ。それぞれの感覺的/實在的-對象/性質は四角形のどこに來ても好い。自由に囘轉しひねって好く、圖が書き易い位置に置くと好い。

2\times 2=4に就いては以前2 * 2 = 4 の原形としての Cynefin frameworkに書いた。

Harman が述べる所の Martin Heidegger の四方界の圖を、緊張と攪乱の圖と同じ位置に對應させて示す。(cf. 技術とは何だろうか 三つの講演 (講談社学術文庫))

\begin{array}{c} 實在的對象 & 實在的性質 \\ 感覚的性質 & 感覚的對象 \end{array}

\begin{array}{c} 大地 & 天空 \\ 死すべき者 & 神々 \end{array}

學の四角形を考へる。先づ學の對象と成る理を置く。理と理學とを區別する。次に理學と理學者とを區別する。最後に理學者と理學會とを區別する。これらを緊張と攪乱の圖と同じ位置に對應させて置く。

\begin{array}{c} 理 & =^性= & 理學 \\ || & & || \\ {\small 心} & & {\small 配分} \\ || & & || \\ 理學者 & =_{訓練}= & 理學會 \end{array}

學の四角形は四方對象とは獨立して考へられたが好く對應してゐる。理學者には科學者、醫學者 (醫者)、技術者等が入れられる。性/心・配分/訓練 (矯正) は手垢の附いた言葉であって、それぞれ x 即理・x 的正義として解釈する事を意圖してゐる。

見附けた應用として資本家の四角形を書けると思ふ。

\begin{array}{c} 資本 & =^性= & 金融 \\ || & & || \\ {\small 心} & & {\small 配分} \\ || & & || \\ 資本家 & =_{訓練}= & 市場 \end{array}

尚この資本家は商人ではない (「資本家である人間が同時に商人である事は無い」と云ふ事ではなく、資本家と商人とはそれぞれ概念としては區別される事のみを述べてゐる)。

tacit programming : Point-free, Concatenatives & J

tacit programming は point-free style としても知られてゐる。函數適用を使って函數を組み立てるのではなく、函數合成を基本の部品とするやり方だ。見た目上では函數の定義から引數が消える。

tacit programming から連鎖性 programming 言語 (concatenative programming language) と J 言語へ繋がる理路が有る。それを書いた資料がこれだ。

tacit programming : Point-free, Concatenatives & J - Speaker Deck

先づ Haskell での例を擧げてある。例へば階乘は入門書的には

factorial n = n * factorial (n - 1)
factorial 0 = 1

factorial 9

とするだらう。ここには n と云ふ引數が見えてゐる。foldr を使ふとこれは tacit に出來る。

factorial = (foldr (*) 1) . (enumFromTo 1)

factorial 9

引數が消えた。平均の例も見る。

average xs = foldr (+) 0 xs / (fromIntegral . length $ xs)

average [2, 3]

これは tacit ではない。(->) に關する Applicative を使ふと tacit に出來る。

instance Applicative ((->) a) where
   pure = const
   (<*>) f g x = f x (g x)
   liftA2 q f g x = q (f x) (g x)

これで、

average = ((/) . foldr (+) 0) <*> (fromIntegral . length)

average [2, 3]

(<*>) の定義を好く見てみると、これは SKI combinatory 論理の S に成ってゐる。ここから combinatory 論理の紹介を資料ではしてある。

さて combinatory 論理を基に發想された programming 言語に、連鎖性 programming 言語と呼ばれる一群の言語が有る。Factor や Popr 等が皆さんの手元でも使へるだらう。

Factor programming language

HackerFoo/poprc: A Compiler for the Popr Language

Popr で平均はこうする。

average: dup sum swap length /f

[2 3] averge

階乘はこうする。Factor ではこう。

MEMO: factorial ( n -- n! )
  dup 1 > [ [1,b] product ] [ drop 1 ] if ;

9 factorial

1 から 9 までの數列を作り綜積をとってゐる。Popr ではこう。

factorial: [1 == 1 swap !] [dup dup 1 - factorial * swap 1 > !] | pushl head

9 factorial

| はその前の 2 つに同時に pushl head を作用させ、失敗した計算を捨て成功した計算を輯める。n True ! は成功し n False ! は失敗する。

fact と縮める事にして、2 fact は概ね下の樣に評價される。

2 fact
2 [1 == 1 swap !] [dup dup 1 - fact * swap 1 > !] | pushl head
[2 1 == 1 swap !] [2 dup dup 1 - fact * swap 1 > !] | head
[False 1 swap !] [2 dup dup 1 - fact * swap 1 > !] | head
[1 False !] [2 dup dup 1 - fact * swap 1 > !] | head
[2 dup dup 1 - fact * swap 1 > !] head
[2 2 dup 1 - fact * swap 1 > !] head
[2 2 2 1 - fact * swap 1 > !] head
[2 2 1 fact * swap 1 > !] head
[2 1 fact * 2 1 > !] head
[2 1 fact * True !] head
2 1 fact *
2 1 [1 == 1 swap !] [dup dup 1 - fact * swap 1 > !] | pushl head *
2 [1 1 == 1 swap !] [1 dup dup 1 - fact * swap 1 > !] | head *
2 [True 1 swap !] [1 dup dup 1 - fact * swap 1 > !] | head *
2 [1 True !] [1 dup dup 1 - fact * swap 1 > !] | head *
2 [1] [1 dup dup 1 - fact * swap 1 > !] | head *
2 [1] [1 1 dup 1 - fact * swap 1 > !] | head *
2 [1] [1 1 1 1 - fact * swap 1 > !] | head *
2 [1] [1 1 0 fact * swap 1 > !] | head *
2 [1] [1 0 fact * 1 1 > !] | head *
2 [1] [1 0 fact * False !] | head *
2 [1] head *
2 1 *
2

Factor に就いては昔書いた事が有る。

Unix の pipe & filter も仲間だ。Unix pipe & filter は一次元だが、連鎖性 programming 言語はこれを多次元化してゐる事に成る。

同じく combinatory 論理を基にしたが J 言語は連鎖性 programming 言語とは異なる拡張の仕方を行った。

Jsoftware

足し算の例。

  2+3
5

これでは tacit ではない。insert と云ふ adverb (副詞) を使ふと tacit に出來る。adverb は凡そ高階函數であり、insert は fold に當たる。

  +/2 3
5

平均はこうする。

  average:=(+/%#)

  average 2 3
2.5

連鎖性言語では combinatory 論理の規則は函數として見えてゐる。J 言語では combinatory 論理の規則は函數として見えてゐるものも有るが、多くは函數合成の規則に閉じ込められた。今囘登場する規則は二つだ。

  • monadic fork :  (fgh)x=(fx)g(hx)
  • monadic hook :  (fg)x=xf(gx)

"monadic" は「單項の」である。"dyadic" 「二項の」も J 言語では言ふ。

平均の評價を辿る。

(+/ % #) 2 3
(+/ 2 3) % (# 2 3)  NB. monadic fork
5 % 2
2.5

NB. は comment の始まりを示す。階乘の例。先づ J 言語には階乘を計算する函數が有る。

  !9
362880

數列を作って疊み込む例。

  */1+i.9
362880

評價手順を示す。

*/ 1 + i. 9
*/ 1 + 0 1 2 3 4 5 6 7 8  NB. `i.` creates a vector
*/ 1 2 3 4 5 6 7 8 9  NB. vector operation
1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9  NB. folds `*`
362880

再歸を使ふ例。

  factorial =: 1: ` (* factorial@<:) @. *

  factorial 9
362880

factorial 2 の評價手順を示す。

factorial 2
1: ` (* factorial@<:) @. * 2
(* factorial@<:) 2  NB. `@.` selects the second
2 * (factorial@<: 2)  NB. monadic hook
2 * (factorial 1)
2 * (1 * (factorial 0))  NB. same as `factorial 2`
2 * (1 * (1: ` (* factorial@<:) @. * 0))
2 * (1 * (1: 0))  NB. `@.` selects the first
2 * (1 * 1)
2 * 1
2

masawada ではないものって何? どれだけ在るの? 調べてみました!

masawada Advent Calendar 2019 - Adventar 12/11

masawada ではないものって何? どれだけ在るの? 調べてみました!

和田

和田(わだ)はどこ?Weblio 辞書

姓氏の一。関東御家人。三浦氏一族。義盛は早くから源頼朝に従い幕府内に重きをおいたが、和田合戦に敗れて滅亡。庶流はのち越後で勢力を伸ばした。

ホータン 【Khōtan】

中国、新疆ウイグル自治区タリム盆地南縁にあるオアシス都市。古代・中世には東西中継貿易で繁栄。玉の産地として有名。コータン。旧称、于闐(うてん)。 〔「和闐」 「和田」とも書く〕

和田さんの名字の由来や読み方、全国人数・順位|名字検索 No.1/名字由来 net |日本人の苗字・姓氏 99%を掲載!!

語源は、曲がっている田、輪のような地形の田、丸田から来ている。また、よい田、稔りのある田、吉田のことである。全国に姓氏・地名ともにきわめて多い。

家紋は木瓜、橘、月星など。

だわ

方言語尾。轉じて女性語尾。また方言から轉じて近年は男性も広く使ふやうに成ったと思はれる。斷定の助動詞「だ」に詠嘆の終助詞「わ」が附いたものではなからうか。

沢田、澤田

沢田(さわだ)はどこ?Weblio 辞書

沢田さんの名字の由来や読み方、全国人数・順位|名字検索 No.1/名字由来 net |日本人の苗字・姓氏 99%を掲載!!

山間地には、沢のつく地名は極めて多い。沢田は、文字通り山峡の水田という意味。

佐和田

佐和田町 - Wikipedia

佐和田町(さわたまち)は、かつて新潟県佐渡郡におかれていた町。佐渡島内のバス交通の要衝であり、経済の中心であった。2004 年 3 月 1 日に合併して佐渡市の一部になった。地元では「さわだ」と濁って発音されることも多く、店名などで「さわだ」の表現が使用されることも見られる。

"まさわだ".chars.permutation.map{ |cs| cs.join("") } - ["まさわだ"]

まさだわ

MSDW : Morgan Stanley Dean Witter

真砂だわ。何とも真砂だわ。

まわさだ

MWSD : Marine Wing Support Detachment 24

摩・和定

まわださ

MWDS : Metallic Wear Debris Sensor

まわわ…ダサッ…。

まださわ

MDSW : Maryland Sheep and Wool Festival

未だ沢にをんねん。迷ってぇな。

まだわさ

MDWS : https://www.youtube.com/channel/UCoxB3hVgCu2ZRKuj-FGkghg

www.youtube.com

未だだワサワサ。どしたの?

さまわだ

SMWD : Surigao Metropolitan Water District

サマワだ。

サマーワ - Wikipedia

サマーワ、あるいはアッ=サマーワ(السماوة al-Samāwa 英語表記は Samawah, as-Samawah など)は、イラク共和国ムサンナー県の都市。

さまだわ

SMDW : Swedish midsummer design weekend

樣だわ! 樣と御附けなさいっ。

さわまだ

SWMD : Solid Waste Management Department

サ、和間だ。

さわだま

SWDM : shortwave wavelength division multiplexing

茶話魂。茶話の靈。

さだまわ

SDMW : Secure Dynamic Middleware for Defeating Port and OS Scanning

定囘。定まった囘り方をする事。

さだわま

SDWM : Aldeia de Metuktire Airport

差だわ、マ―ッ。

わまさだ

WMSD : Work-related Musculoskeletal Disorders

ワッ、真砂だ!

わまださ

WMDS : Weapon of mass destruction

和間、ダサッ…(は?)

わさまだ

WSMD : World School Milk Day

輪様だ…。その者は輪と呼ばれた。

わさだま

WSDM : Web Search and Data Mining

山葵玉。

わだまさ

WDMS : World Digital Mining Summit

わ! 騙さ (ブツッ…)

わださま

WDSM : 710 AM 98.1 FM WDSM | The Talk of the North | Duluth, MN

和田樣。支配者。

だまさわ

DMSW : Drug Manufacturing SoftWare

打魔茶輪。茶の葉を輪に竝べて魔を打つ事。

だまわさ

DMWS : Defence Medical Welfare Service

默話差。默る事と話す事の差。

ださまわ

DSMW : FAO Digital Soil Map of the World

The サマーワ

ださわま

DSWM : Department of Solid Waste Management

だ伊那西部広域農道ま。え、何これ…。

伊那西部広域農道 - Wikipedia

伊那西部広域農道(いなせいぶこういきのうどう)は、長野県上伊那郡箕輪町沢(さわ)の国道 153 号との交差点から上伊那郡南箕輪村を経て、同県伊那市西春近(にしはるちか)までを結ぶ広域農道である。伊那市上伊那郡宮田村の境にて伊那中部広域農道に接続する。

だわまさ

DWMS : Data Warehouse Management System

駄話増さむ。どうでもよい話が増えること。

だわさま

DWSM : Dynamic Watershed Simulation Model

打羽 summer。

("masawada".chars.permutation.map{ |cs| cs.join("") } - ["masawada"]).size

40296

早稲田

早稲田 - Wikipedia

早稲田の地域は、古くは牛込村に属しており江戸牛込村字早稲田であったが、江戸時代初期には、別村になり「早稲田村」と呼ばれるようになった。1868 年(慶応 4 年、明治元年)、東京府の設置により、南豊島郡牛込早稲田村となった。1878 年(明治 11 年)、郡区町村編制法により東京府牛込区が発足し、早稲田村は牛込区に所属することになった。さらに、1889 年(明治 22 年)、市制、町村制の施行に伴う東京市の設置により、東京市牛込区は、南豊島郡牛込早稲田村編入した。 1943 年(昭和 18 年)、東京都制施行により、早稲田は東京都牛込区早稲田町牛込区早稲田鶴巻町等となった。

早稲田大学 - Wikipedia

早稲田大学教旨

早稲田大学は学問の独立を全うし、学問の活用を効し、模範国民を造就するを以て建学の本旨と為す。

早稲田大学は学問の独立を本旨と為すを以て、之が自由討究を主とし、常に独創の研鑽に力め、以て世界の学問に裨補せん事を期す。

早稲田大学は学問の活用を本旨と為すを以て、学理を学理として研究すると共に、之を実際に応用するの道を講じ、以て時世の進運に資せん事を期す。

早稲田大学は模範国民の造就を本旨と為すを以て、立憲帝国の忠良なる臣民として個性を尊重し、身家を発達し、国家社会を利済し、併せて広く世界に活動す可き人格を養成せん事を期す。

DWU

Deep Web Underground

MAZDA

アフラ・マズダー

善惡を越え善惡を可能にし、スプンタ・マンユアンラ・マンユの對立を可能にする者。後にスプンタ・マンユと同一視される。

ダエーワ

ダエーワ - Wikipedia

インドのサンスクリット語における Deva(デーヴァ、天部)と共通語源。しかし、古代インドでデーヴァが善神として崇拝の対象であり続けたのに対し、古代イランではダエーワは「悪神」「悪魔」という逆の意味になっている。ゲラルド・ニョリ(イタリア語版)などによれば、これはザラスシュトラ宗教改革の結果だという。より古い時代からの神々(デーヴァ)のうち、戦士機能を割り当てられていたインドラ、サウルウァ(ルドラ)、ワユ(ヴァーユ)などがダエーワとされた。いっぽう、インドのアスラが神々と敵対する存在とみなされる以前から知られていた古い神格である、アスラに属する神ヴァルナは、イランにおいてアフラ・マズダーに対応した。

悪神としてのダエーワという語は、さらにスラヴ語に借用された(古代教会スラヴ語で divu「悪魔」)。しかし後の時代になってもソグド語やアラム語の一部では善性の存在として使われることもあった。

ダエーバイト文明

SCP-140 - SCP 財団

SCP-140 は現在の南シベリア地方に起源を持つ、ダエーバイトと認識されている古代文明の詳細な記録です。他の全ての文明と同様にダエーバイト文明もまた時と共に進化し、変化を続けましたが、彼らは異常な一貫性を保ちました。ダエーバイト文化は全ての時代において、軍国主義、侵略傾向、祖先崇拝、多くの奴隷人口を持つ都市中枢、陰惨な人身御供、明らかに有効性を持つ秘跡儀式の実践、といった特徴を持ち続けました。この記述が信用できるとすれば、ダエーバイト文明の残した遺物と化物の多様さは異常かつ危険であり、それだけで十分に封じ込めに値します。

調べた結果、masawada ではないものとは何か解りませんでした! 全ては masawada なのかもしれませんね…。

如何でしたか??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????