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

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

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

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

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

programmingは、GitHubで開発中です。

Develop Google Apps Script in ClojureScript

qiita.com🎂

What is Google Apps Script?

f:id:Kureduki_Maari:20181223190842p:plain

Google Apps Script (以下Apps Script) は、Googleのserver上でのserverlessなJavaScript實行環境です。serverlessなJavaScript實行環境ですのでCloud Functionの仲間です。函數を起動できるeventの種類が限られている、またSLA (Service Level Agreement) が不明である為、Cloud Functionのやうに大規模なserviseを作る事は、できません。代はりに、DocsやGmail等[など]のGoogle Appsと連携するやう簡單に設定できる為、この意味でVBA (Visual Basic for Applications) の仲間でもあります。更にGoogle Appsが使へる環境であれば無料です。その代はり一日当りの實效囘數等が制限されてゐます。

Apps Scriptと云へばGoogle Apps向けのVBAである、と思はれる向きもあり、GmailとSpreadsheetを同時に見たり更新したりできると云ふ使ひ途もあるのですが、cronの代はりとしてGoogle Appsに全く觸らない函數も作れます。であるので、Google Apps accountで使へるserverless FaaS (Function as a Service) だと見るのがよいです。今の所書ける言語はJavaScriptだけです。

Google Appsのweb site上にApps Scriptのeditorがあるのですが、ただのtext editorであり、version管理も難しく、複數人で編集したりtestを書いたりlibraryを使ったりする事ができません。programmerですので、日々使ってゐるeditor (Emacs) で書き、日々使ってゐるversion管理system (Git) で管理し、人間にも讀めるcodeを書きたいものです。これをお膳立てしてくれるのがclaspです。

github.com

Apps Script用のCLI toolであり、localのscriptをuploadする、Google Apps上のscriptをdownloadする、Google Apps上のscriptを實行する、Google Apps上の現在のversionにtagを打つ、Apps Scriptが吐いたlogを見る、等の事ができます。まともな開發に要る事はできさうです。人間でゐませう (發狂せずとも濟みさうと云ふ意)。

What is ClojureScript?

f:id:Kureduki_Maari:20181223190914p:plain:w128

ClojureScript (a.k.a. cljs) はClojureの實裝の一つです。Clojureと云へばJVM上のLispの一つとして生まれましたが、その後.NET CLR上でも實裝され、JavaScriptへのtranspilerも作られました。この二つはClojureと同じ或いは近しいcommunityで作られてゐます。他にもErlang VM上で動くclojerlや、Cにtranspileするclojurec (これの開發は停まってゐます) もあります。廣く實行環境を見れば、Android上で動かすlein-droid (これも開發が停まってゐます)、React Nativeで動かすRe-Natal、Unityで動くArcadia等があり、更にはGraalでJVM用のClojureをnative codeに落とせるので (GraalがMySQLに搭載されたらそこでも動く) (clojure-clrをMono LLVMに流すと云ふ手も在ります)、どこででも動きますね (Ethereumのcontract自體を書く方法は見附からないのでEthereumVMでは動きませんね)。CloduinoArduinoも弄れるみたいです。珍しい所ではQuilからProcessingで映像を描けたり、OvertoneからSuperColliderで音樂を生成したりできます。

Clojureはimmutableなdataを基礎とし、vectorやmap等のdata構造 & 使ひ易い記法を持ったLispです。Lispである事が我々にとってはまづ一つの利点ですし、dataがimmutableですから、programを抽象化し易く、concurrencyを簡單に扱へます。ClojureScriptはClojureからJavaScriptへのtranspilerです。JVMAPIは使へませんが、Clojureのcore APIの大半が使へますし、JavaScriptを簡單に呼び出せます。無論NPMも使へます。

Isomorphicと云ふ言葉は懐かしいですが、懐かしくなったからといって重要で無くなった譯ではありません。Reagent等便利なWeb frontend frameworkが在ります。

Develop Apps Script in ClojureScript.

以下の二つをinstallします。

  • cljs : Macであればbrew install clojurescriptでClojureScriptを、或いはbrew install leiningenでLeiningenを入れてproject毎にinstallします。
  • clasp : NPMを入れ、npm install -g @google/claspで入れます。

私はLeiningenでprojectを作ったので、こんなproject.cljができます。

(defproject apple-is-dead "0.1.0"
  :description "Appleの障害情報を監視し通知する"
  :url "〜〜〜"
  :license {:name "Do What The F*ck You Want To Public License"
            :url "http://sam.zoy.org/wtfpl/COPYING"}
  :plugins [[jonase/eastwood "0.3.3"]
            [lein-ancient "0.6.15"]
            [lein-cljfmt "0.5.7"]
            [lein-cljsbuild "1.1.7"]]
  :dependencies [[org.clojure/clojure "1.9.0"]
                 [org.clojure/clojurescript "1.10.439"]]
  :hooks [leiningen.cljsbuild]
  :aliases {"lint" ["run", "-m" "apple-is-dead.tasks.lint/go"]
            "release" ["run", "-m" "apple-is-dead.tasks.release/go"]}
  :cljsbuild {:builds
              [{:source-paths ["src"]
                :compiler {:main apple-is-dead.main
                           :output-to "release/main.js"
                           :output-dir "target"
                           :optimizations :advanced
                           :pretty-print false
                           :foreign-libs [{:file "src/entrypoint.js"
                                           :provides ["apple-is-dead.entrypoint"]}]
                           :externs ["src/extern.js"]}}]})

lein-cljsbuildが、LeiningenにClojureScriptをbuildするやり方を教えます。

  :hooks [leiningen.cljsbuild]
  :cljsbuild {:builds
  〜〜〜

とhookすると、lein compileでClojureScriptのfileである*.cljsを探してJavaScriptにtranspileします。

:aliasesのlintでは

prettier --write src/*.js
lein cljfmt fix
lein ancient check
lein eastwood

のやうな事をさせてゐ、releaseでは

lein compile
clasp push

のやうな事をさせてゐます。

作ったClojureScriptのproject内でclasp create 〜〜〜を叩き、Apps Script projectを作ります。この時に作られるfile達が大切なので、これらをcpしておき、これらが在るdiractoryで以後clasp commandを叩きます。

あとはClojureScriptとApps Scriptのreferenseを御覽ください。Apps Scriptではlogを見たりerrorをmailに通知する事ができますので、そこを適切に作ると運用が樂になります。errorをcatchする時は(js/console.error err)でlogを吐く、實行の重要なstep毎に(js/console.info message)でlogを吐く、catchすべきでないerrorをcatchしない、retryされてもよいやうに冪等にする等、batch處理を書く時と似た事を注意する筈です。

:foreign-libs:externsは載せておきます。

                           :foreign-libs [{:file "src/entrypoint.js"
                                           :provides ["apple-is-dead.entrypoint"]}]
                           :externs ["src/extern.js"]

:foreign-libsJavaScriptからClojureScriptを呼ぶ時に要ります。Apps Scriptは書かれたものがJavaScriptであらうと前提して呼び出しますから、JavaScript側から呼べるinterfaceを開けておかなければなりません。ここに指定したfileにJavaScriptを書いておくと、それはClosure Compiler (ClojureScriptがClosure Compilerを呼び出して、codeを圧縮したりdead codeを消したりします) で變換されずに、出力されるJavaScriptにそのまま載ります。

// entrypoint.js
function main(evt) {
  apple_is_dead.main.main();
}
; main.cljs
(defn ^:export main []
  (doseq [service ((apple.get-status) :services)]
    (check-apple-service service)))

これでApps Scriptはmain()を呼び出せ、それによりapple_is_dead.main.main()、すなはち(apple-is-dead.main.main)を實行できます。

:externsは、Closure Compilerが圧縮してはいけない變數名を列擧するfileです。これらは外の環境にglobalに定義されてゐるから、このままの名前で呼び出さなければならない、例えばJavaScriptのcoreに定義されたmodule達ですが、これらはどうやらClosure Compilerが既に知ってゐます。しかしClosure CompilerはApps Scriptの事は知りません。それでもClosure Compilerはたいていうまくやりますが、一部見逃してしまふやうです。私の場合はCacheServiceの事は教えてやらねばなりませんでした (他にも色々呼び出したのですが、これ以外はうまく、圧縮せずにゐてくれました) (Closure Scriptの實裝を読んでゐないのが惡いのですが)。

// extern.js
var CacheService = {};
CacheService.getScriptCache = function() {};

これでClojureScriptでApps Scriptを開發できると思ひます。

The Best of Access @ Elixir

Immutable data is a foundation of abstraction - it localizes program computation. So immutable data makes concurrency easy & decreases bugs. All data in Erlang/Elixir is immutable. We are happy to use functional programming techniques, worrying about nothing on parallel programming.

To lookup in a nested data is easy. When there is a map below :

v = %{
  x: [
    {:ok, a: 1, b: 2},
    {:ok, a: 3, b: 4},
  ]
}

Following codes are same.

1 = elem(Enum.at(v.x, 0), 1)[:a]

1 = elem(Enum.at(v[:x], 0), 1)[:a]

1 = (v.x |> Enum.at(0) |> elem(1))[:a]

# We can pipe all.
1 = v |> Map.get(:x) |> Enum.at(0) |> elem(1) |> Keyword.get(:a)

1 = v |> Access.get(:x) |> Enum.at(0) |> elem(1) |> Access.get(:a)

1 = get_in(v.x, [Access.at(0), Access.elem(1)])[:a]

1 = get_in(v, [:x, Access.at(0), Access.elem(1), :a])

We can use pattern matching too.

1 = with %{x: [{:ok, a: a, b: _} | _]} = v, do: a

1 = case v, do: (%{x: [{:ok, a: a, b: _} | _]} -> a)

true = match?(%{x: [{:ok, a: 1, b: _} | _]}, v)

But it's hard to UPDATE a nested data.

v_2 = Map.update!(v, :x, fn x ->
  List.update_at(x, 0, fn {:ok, k} ->
    {:ok, Keyword.update!(k, :a, &(&1 + 1))}
  end)
end)

1 = elem(Enum.at(v.x, 0), 1)[:a]
2 = elem(Enum.at(v_2.x, 0), 1)[:a]

Why this's hard? The nested callback functions is complecated. It's not composable, so we can't split this into simple parts. Is there no way?

JavaScript - Immer

Let's see some examples in other languages.

Data in JavaScript isn't immutable. But after React & Redux comes, JavaScript loves immutability. Immer is a nice library to update nested data with immutability.

f:id:Kureduki_Maari:20181205120623p:plain

mweststrate/immer: Create the next immutable state by mutating the current one

import produce from "immer";

const v = {
  x: [
    ["ok", {a: 1, b: 2}],
    ["ok", {a: 3, b: 4}],
  ]
};

const v2 = produce(v, v => { v.x[0][1].a += 1 });

assert.equal(v.x[0][1].a, 1);
assert.equal(v2.x[0][1].a, 2);

Data in JavaScript is mutable, so it has short syntax to update data. Immer use it. It Proxy the data, listen all mutation operations & create a new data. This's the way in a mutable language to update nested data with immutability.

Lens @ Haskell

f:id:Kureduki_Maari:20181205121329p:plain

Haskell is close to Elixir because data in Haskell is immutable. Haskell has a nice mechanism - Lens.

lens: Lenses, Folds and Traversals

microlens: A tiny lens library with no dependencies. If you're writing an app, you probably want microlens-platform, not this.

Lens is a set of functions of composable getter & setter.

{-# LANGUAGE TemplateHaskell #-}
import Lens.Micro
import Lens.Micro.TH

data Item = Item { _a :: Integer, _b :: Integer } deriving (Show)
makeLenses ''Item

data V = V { _x :: [(String, Item)] } deriving (Show)
makeLenses ''V

v = V {
  _x = [
      ("ok", Item { _a = 1, _b = 2 }),
      ("ok", Item { _a = 3, _b = 4 })
    ]
  }

main = do
  print $ v ^?! to _x . ix 0 . _2 . to _a
  -- 1

  print $ v ^?! x . ix 0 . _2 . a
  -- 1

  print $ v & x . ix 0 . _2 . a .~ 2
  -- V {_x = [("ok",Item {_a = 2, _b = 2}),("ok",Item {_a = 3, _b = 4})]}

  print $ v & x . ix 0 . _2 . a %~ (+ 1)
  -- V {_x = [("ok",Item {_a = 2, _b = 2}),("ok",Item {_a = 3, _b = 4})]}

  print $ v & (x . ix 0 . _2 . a) +~ 1
  -- V {_x = [("ok",Item {_a = 2, _b = 2}),("ok",Item {_a = 3, _b = 4})]}

Lens is just a function, so we can compose them & create custom Lens (makeLenses dose).

Clojure - a neighbor of Elixir

f:id:Kureduki_Maari:20181205121313p:plain

In ancient days Elixir was born from Clojure. So we look at that. Clojure is a functional language which is based on immutable data.

get-in, assoc-in & update-in are the basic tools to manipulate nested data.

(def v
  {:x [["ok" {:a 1, :b 2}] ["ok" {:a 3, :b 4}]]})

; get
; => 1
((((v :x) 0) 1) :a)
(:a (((:x v) 0) 1))
(:a (get (get (:x v) 0) 1))
(-> v :x (get 0) (get 1) :a)
(get-in v [:x 0 1 :a])
(let [{:keys [x]} v [[_ {:keys [a]}]] x] a)

; assoc
; => {:x [["ok" {:a 2, :b 2}] ["ok" {:a 3, :b 4}]]}
(update v :x (fn [x] (update x 0 (fn [i] (update i 1 (fn [j] (assoc j :a 2)))))))
(assoc-in v [:x 0 1 :a] 2)

; update
; => {:x [["ok" {:a 2, :b 2}] ["ok" {:a 3, :b 4}]]}
(update v :x (fn [x] (update x 0 (fn [i] (update i 1 (fn [j] (update j :a #(+ 1 %))))))))
(update-in v [:x 0 1 :a] #(+ 1 %))

Note assoc & update. Nested callbacks are transformed into a sequence of keys [:x 0 1 :a]. The sequence is just a data, so we can compose them.

Elixir has Access!

Like get-in, assoc-in & update-in in Clojure, Elixir has get_in/2, put_in/3, update_in/3 & pop_in/2.

v = %{x: [{:ok, a: 1, b: 2}, {:ok, a: 3, b: 4}]}

1 = get_in(v, [:x, Access.at(0), Access.elem(1), :a])

%{x: [{:ok, a: 2, b: 2}, {:ok, a: 3, b: 4}]} =
  put_in(v, [:x, Access.at(0), Access.elem(1), :a], 2)

%{x: [{:ok, a: 2, b: 2}, {:ok, a: 3, b: 4}]} =
  update_in(v, [:x, Access.at(0), Access.elem(1), :a], &(&1 + 1))

{1, %{x: [{:ok, b: 2}, {:ok, a: 3, b: 4}]}} =
  pop_in(v, [:x, Access.at(0), Access.elem(1), :a])

These are family of Access module. These take a "path", a sequence of keys & functions. Map & Keyword takes a key. List needs Access.at/1. Tuple needs Access.elem/1.

%{x: 2} = put_in(%{x: 1}, [:x], 2)
%{x: 2} = put_in(%{x: 1}[:x], 2)
%{x: 2} = put_in(%{x: 1}.x, 2)

[x: 2] = put_in([x: 1], [:x], 2)
[x: 2] = put_in([x: 1][:x], 2)

%{x: 1, y: 2} = put_in(%{x: 1}[:y], 2)

[y: 2, x: 1] = put_in([x: 1][:y], 2)

# `Access.key!/1` is also available for Map.
%{x: 2} = put_in(%{x: 1}, [Access.key!(:x)], 2)

try do
  put_in(%{x: 1}, [Access.key!(:y)], 2)
rescue
  err in KeyError -> err
end

try do
  put_in(%{x: 1}.y, 2)
rescue
  err in KeyError -> err
end

# `Access.key/2` provides a default value. This is useful for put_in & update_in.
%{x: 1, y: %{z: 2}} = put_in(%{x: 1}, [Access.key(:y, %{}), :z], 2)

# List
[2] = put_in([1], [Access.at(0)], 2)

nil = get_in([1], [Access.at(1)])

# Tuple
{2} = put_in({1}, [Access.elem(0)], 2)

You'll find that accessing Struct causes an error. Struct isn't accessible in default. But we can use Access.key!/1 & Access.key/2.

defmodule Example do
  defstruct x: 1
end

defmodule Main do
  def main do
    %Example{x: 2} = put_in(%Example{}, [Access.key!(:x)], 2)
    %Example{x: 2} = put_in(%Example{}, [Access.key(:x)], 2)
  end
end
Main.main

One of the best feature of Access is Access.all/0 & Access.filter/1. These reduce nested Enum calls. Access.all/0 traverses a List. Access.filter/1 traverses a List & filter them.

%{x: [%{a: 2}, %{a: 3}]} =
  update_in(%{x: [%{a: 1}, %{a: 2}]}.x, fn x -> for %{a: a} <- x, do: %{a: a + 1} end)  

%{x: [%{a: 2}, %{a: 3}]} =
  update_in(%{x: [%{a: 1}, %{a: 2}]}, [:x, Access.all(), :a], &(&1 + 1))

require Integer

%{x: [%{a: 1}, %{a: 1}]} = update_in(
  %{x: [%{a: 1}, %{a: 2}]}.x,
  fn x ->
    x
    |> Enum.reduce(
      [],
      fn
        %{a: a}, accm when rem(a, 2) == 0 -> [%{a: div(a, 2)} | accm]
        i, accm -> [i | accm]
      end
    )
    |> Enum.reverse
  end
)

%{x: [%{a: 1}, %{a: 1}]} = update_in(
  %{x: [%{a: 1}, %{a: 2}]},
  [:x, Access.filter(&Integer.is_even(&1.a)), :a],
  &div(&1, 2)
)

Extend Access

There are 2 ways to extend Access.

  1. Create an Access fun
  2. @impl Access

Create an Access fun

We can create functions like Access.*/* by ourselves. It's called "access_fun".

access_fun(data, get_value) ::
  get_fun(data, get_value) | get_and_update_fun(data, get_value)

access_fun is an union of get_fun & get_and_update_fun.

get_fun(data, get_value) ::
  (:get, data, (term() -> term()) -> {get_value, new_data :: container()})

get_and_update_fun(data, get_value) ::
  (:get_and_update, data, (term() -> term()) ->
     {get_value, new_data :: container()} | :pop)

Let's create one. In a following situation,

v = %{x: [{:ok, a: 1, b: 2}, {:ok, a: 3, b: 4}]}

1 = get_in(v, [V.a(1), :a])

%{x: [{:ok, a: 2, b: 2}, {:ok, a: 3, b: 4}]} = put_in(v, [V.a(1), :a], 2)

%{x: [{:ok, a: 2, b: 2}, {:ok, a: 3, b: 4}]} = update_in(v, [V.a(1), :a], &(&1 + 1))

the access_fun will be this.

defmodule V do
  def a(a), do: fn command, data, next -> a(command, data, a, next) end

  defp a(:get, data, a, next) do
    data.x
    |> Enum.find(fn
      {:ok, x} -> x[:a] == a
      _ -> false
    end)
    |> elem(1)
    |> next.()
  end

  defp a(:get_and_update, data, a, next) do
    {{:ok, x}, i} =
      data.x
      |> Enum.with_index
      |> Enum.find({{:ok, nil}, nil}, fn
        {{:ok, x}, _} -> x[:a] == a
        _ -> false
      end)

    case next.(x) do
      {get, update} ->
        data = put_in(data, [:x, Access.at(i), Access.elem(1)], update)
        {get, data}

      :pop ->
        if is_nil(i) do
          data
        else
          {_, data} = pop_in(data, [:x, Access.at(i), Access.elem(1)])
          data
        end
    end
  end
end

access_fun pros :

  • It can traverse all data.
  • Separate from other Access behaviour.
  • You can write complex behaviour.

access_fun cons :

  • It has many boilerplate.
  • Too complex.

When you just want a short cut of Access path, you can implement a Access behaviour.

@impl Access

Access behaviour provides more fluent syntax for users. When a struct is, you should implement Access like this.

defmodule V do
  defstruct x: []

  @behaviour Access

  @impl Access
  def fetch(v, key) do
    case path_to(v, key) do
      nil -> :error
      path -> {:ok, get_in(v, path)}
    end
  end

  @impl Access
  def get_and_update(v, key, fun) do
    case path_to(v, key) do
      nil -> {nil, v}
      path -> get_and_update_in(v, path, &fun.(&1))
    end
  end

  @impl Access
  def pop(v, {_, _} = key) do
    case path_to(v, key) do
      nil -> {nil, v}
      path -> pop_in(v, path)
    end
  end

  defp path_to(v, {:a, a}) do
    with i when not is_nil(i) <-
      Enum.find_index(v.x, fn
        {:ok, x} -> x[:a] == a
        _ -> false
      end) do
      [Access.key!(:x), Access.at(i), Access.elem(1)]
    else
      _ -> nil
    end
  end
end

Easy. Then you can call this like natively supported syntax.

defmodule Main do
  def main do
    v = %V{x: [{:ok, a: 1, b: 2}, {:ok, a: 3, b: 4}]}

    1 = v[{:a, 1}][:a]

    %V{x: [{:ok, a: 2, b: 2}, {:ok, a: 3, b: 4}]} =
      put_in(v[{:a, 1}][:a], 2)

    %V{x: [{:ok, a: 2, b: 2}, {:ok, a: 3, b: 4}]} =
      update_in(v[{:a, 1}][:a], &(&1 + 1))

    {1, %V{x: [{:ok, b: 2}, {:ok, a: 3, b: 4}]}} =
      pop_in(v, [{:a, 1}, :a])
  end
end
Main.main

Access is composable & extensible abstraction to get & update deep nested data. Let's enjoy functional programming on Elixir!

ヨコガナ/縦Latin Advent Calendar 2018

ヨコガナ/縦Latin Advent Calendar 2018です。

毎日、橫假名/縱Latinを書いて畫像を貼ります。募集もしてます。

應募先 : https://mstdn.res.ac/@ne_sachirou

今迄の書例は下記に在ります。

ももんが Advent Calendarの系譜 :

12/1

橫假名

f:id:Kureduki_Maari:20181201234848j:plain
いろはにほへど ちりぬるを わがよたれぞ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせず

縱Latin

f:id:Kureduki_Maari:20181201234802j:plain
Quick brown fox jumps over the lazy dog.

ももんが

f:id:Kureduki_Maari:20181202000738j:plain

12/2

橫假名

f:id:Kureduki_Maari:20181203004632j:plain
とりなくこゑす ゆめさませ みよあけわたる ひんかしを そらいろはえて おきつへに ほふねむれゐぬ もやのうち

f:id:Kureduki_Maari:20181203004659j:plain
火星に榮光、地に平和、人には善意があります樣に。

縱Latin

f:id:Kureduki_Maari:20181203190959j:plain
Rafael Alberti "El mar. La mar"

ももんが

f:id:Kureduki_Maari:20181207093511j:plain

12/3

橫假名

f:id:Kureduki_Maari:20181203004839j:plain
あめ つち ほし そら やま かは みね たに くも きり むろ こけ ひと いぬ うへ すゑ ゆわ さる おふせよ えのYEを なれゐて

f:id:Kureduki_Maari:20181203005108j:plain
火星帝國國歌。

縱Latin

f:id:Kureduki_Maari:20181210203316j:plain
длина кириллицы (Dlina krillicy) (方式はISO 9:1995)

ももんが

f:id:Kureduki_Maari:20190111113457j:plain

12/4

橫假名

f:id:Kureduki_Maari:20181205112229j:plain
ゾンビランドサガのオープニングより。

縱Latin

f:id:Kureduki_Maari:20181210204732j:plain
3.14159265359 , 2.71828182846

ももんが

f:id:Kureduki_Maari:20190111113510j:plain

12/5

橫假名

f:id:Kureduki_Maari:20181207095635j:plain
みんなも よこがなで いろいろな ことばを かいて みて くださいね。 かけたら ハッシュタグ “#橫假名” もしくは “#横仮名” を つけて とうかう 之てね。

縱Latin

f:id:Kureduki_Maari:20181210231850j:plain
Robert Browning "Pippa's Song"

ももんが

12/6

橫假名

f:id:Kureduki_Maari:20181210235307j:plain
ねがはくは 花のもとにて 春死なむ その如月の 望月のころ (西行)

縱Latin

f:id:Kureduki_Maari:20181210234100j:plain
I'm going to make him an offer he can't refuse.

ももんが

12/7

橫假名

f:id:Kureduki_Maari:20181215015958j:plain
のめやうたえ

縱Latin

f:id:Kureduki_Maari:20181216002104j:plain
Bibe, cantabo. (のめやうたえ)

ももんが

12/8

橫假名

f:id:Kureduki_Maari:20181216002400j:plain
こえこえず心をかくるなみもなし人の思ひぞ末の松山 (藤原定家)

縱Latin

f:id:Kureduki_Maari:20181230231939j:plain
Simple made easy

ももんが

12/9

橫假名

f:id:Kureduki_Maari:20181216002722j:plain
あけぬとていでつる人のあともなしただ時のまにつもる白雪 (藤原定家)

縱Latin

f:id:Kureduki_Maari:20181230232215j:plain
x2 - n y2 = 1

ももんが

12/10

橫假名

f:id:Kureduki_Maari:20181210120029j:plain
すっごい にじむよ!

f:id:Kureduki_Maari:20181210120121j:plain
いっしゃう もじ かいて あそんで くらしたい!!!

f:id:Kureduki_Maari:20181210174053j:plain
もう直ぐ生誕日の人がゐるので。

縱Latin

f:id:Kureduki_Maari:20181230232559j:plain
All's well that ends well.

ももんが

12/11

橫假名

f:id:Kureduki_Maari:20181216003046j:plain
おもひやる室の八島をそれと見ば聞くに煙のたちやまさらん (藤原定家)

縱Latin

f:id:Kureduki_Maari:20181230233010j:plain
Curiosity killed the cat.

ももんが

12/12

橫假名

f:id:Kureduki_Maari:20181216004048j:plain
しぐれゆくよものこずゑの色よりも秋はゆふべのかはるなりけり (藤原定家)

縱Latin

f:id:Kureduki_Maari:20181230233327j:plain
Please do not act like a baby.

ももんが

12/13

橫假名

f:id:Kureduki_Maari:20181229152630j:plain
ヨコガナ

縱Latin

f:id:Kureduki_Maari:20181230233558j:plain
Bien está lo que bien acaba.

ももんが

12/14

橫假名

f:id:Kureduki_Maari:20181229152725j:plain
昔せし隠れ遊びになりなばや片すみもとによりふせりつつ (西行)

縱Latin

f:id:Kureduki_Maari:20181230234028j:plain
A caballo regalado, no le mires el diente.

ももんが

12/15

橫假名

f:id:Kureduki_Maari:20181229152951j:plain
旅に病で夢は枯野をかけ廻る (芭蕉)

縱Latin

f:id:Kureduki_Maari:20181230234538j:plain
Ayunen los santos, que no tiene tripa. Barriga llena, a Dios alaba.

ももんが

12/16

橫假名

f:id:Kureduki_Maari:20181216005243j:plain
石となれ 石は 怖れも 苦しみも 憤りも なけむ はや 石となれ

f:id:Kureduki_Maari:20181216010137j:plain
我はもや 石とならむず 石となりて 冷たき海を 沈み行かばや

f:id:Kureduki_Maari:20181217214530j:plain
氷雨 降り狐火 燃YEむ 冬の 夜に われ 石となる 黑き 小石に

f:id:Kureduki_Maari:20181217214619j:plain
眼 瞑づれば 氷の 上を 風が 吹く 我は 石となりて 轉びて行くを

縱Latin

f:id:Kureduki_Maari:20181217214711j:plain
„An die Freude“ の一部。竊かに泣き乍ら此の集ひを立ち去って下さい。

ももんが

12/17

橫假名

f:id:Kureduki_Maari:20181229153127j:plain
ひらひらと挙ぐる扇や雲の峰 (芭蕉)

縱Latin

f:id:Kureduki_Maari:20181230235243j:plain
Alter schützt vor Torkeit nicht.

ももんが

12/18

橫假名

f:id:Kureduki_Maari:20181229153218j:plain
詩がわたしたちの歌を捨てた時わたしたちの詩は死んだのです (麻井シキ)

縱Latin

f:id:Kureduki_Maari:20181230235742j:plain
Zeit ist Geld.

ももんが

12/19

橫假名

f:id:Kureduki_Maari:20181229153603j:plain
月夜に拾って猫を飼う (麻井シキ)

縱Latin

f:id:Kureduki_Maari:20181230235931j:plain
cogito, ergo sum.

ももんが

12/20

橫假名

f:id:Kureduki_Maari:20181229153719j:plain
私の心臓に鈴を結んで、跳び跳ねるとちりちり鳴ります (麻井シキ)

縱Latin

f:id:Kureduki_Maari:20181231000258j:plain
vita brevis, ars longa.

ももんが

12/21

橫假名

f:id:Kureduki_Maari:20181222204410j:plain
なんだか とっても つかれて ゐて、げんじつの ぺんを にぎる きりょくが ない。

f:id:Kureduki_Maari:20181222204636j:plain
ざるで みづを くんでゐるやうな くうきょな とろうかんだけが ある。

縱Latin

f:id:Kureduki_Maari:20181231000529j:plain
Mi amas vin.

ももんが

12/22

橫假名

f:id:Kureduki_Maari:20181229153926j:plain
切って配った私の体の籠いっぱいの部品が (麻井シキ)

縱Latin

f:id:Kureduki_Maari:20181231000948j:plain
mi prami do .isemu'ibo dunda lo melbi xrula

ももんが

12/23

橫假名

f:id:Kureduki_Maari:20181223233011j:plain
ふゆ きたりなば はる とほからじ

f:id:Kureduki_Maari:20181223233202j:plain
文字の精靈は我等に安寧を與へ、また奪ふ。

縱Latin

f:id:Kureduki_Maari:20181231001354j:plain
Allah bir kapiyi kaparsa bin kapiyi açar.

ももんが

12/24

橫假名

f:id:Kureduki_Maari:20181229154019j:plain
世界は深くわたしの既知である (麻井シキ)

縱Latin

f:id:Kureduki_Maari:20181230231802j:plain
grass wWWwww (麻井シキ)

ももんが

12/25

橫假名

f:id:Kureduki_Maari:20181225221300j:plain
メリークリスマス

縱Latin

f:id:Kureduki_Maari:20181225221315j:plain
2018-12-25 / Merry Christmas / Happy Holidays

ももんが