8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

闘魂Elixir ── ANSIエスケープコードをElixirの出力で使う(コンソールの出力を上書きする)

Last updated at Posted at 2023-02-11

$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$

$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$

はじめに

闘魂Elixirが出会いました。
闘魂 meets Elixir.です。
Elixir meets 闘魂.でもよいです。

この記事を書くにあたって使ったテクニックを特出しして記事にしておきます。

iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}

この記事は、もくもく会イベント autoracex #177 の成果です。

対象とする読者

プログラミングを楽しんでいるそこのあなた
特に、「闘魂プログラミング(ストロングスタイル)」を楽しんでいるそこのあなた
わたしが長年夢であった本当の Elixirを通じて プログラミングを通じて 世界平和(を)必ず実現します!」に共感していただけるそこのあなた

つまりは
$\huge{全人類}$
です。

$\huge{For You All}$
です。

ANSIエスケープコードとは

こちらの記事を参照してください。

ありがとうございます!
ありがとうございます!
ありがとうございます!

いろいろと使いみちはあるのだとおもいます。
私はコンソールの出力を上書きすることで使ってみたいとおもっています。

コンソールの出力を上書きする

「コンソールの出力を上書きする」とはこういうことです。

output.gif

他には進捗プログレスの表示などに使えそうです。

コード例

さきほどのアニメーションGIFのコードを示します。

words = ~w(闘 魂 猪 木 燃 🔥)

f = fn ->
  for _i <- 1..5 do
    for _j <- 1..5 do
      Enum.random(words)
    end
    |> Enum.join()
  end
  |> Kernel.++(["\e[5A"])
  |> Enum.join("\n")
end

print = fn
  lines, 100 -> lines |> String.slice(0..28) |> IO.puts()
  lines, _ -> IO.write(lines)
end

1..100
|> Enum.each(fn i ->
  Process.sleep(50)

  f.()
  |> print.(i)
end)

ESC[nA(カーソルを上にn移動させる。(nには整数が入る、省略すると1))を使っています。
Elixirのプログラムでは、"\e[5A"のところです。
今回は5行出力しているので上に5行移動させることにしています。


おまけ

words = ~w(闘 魂 猪 木 燃 🔥)

f = fn ->
  for _i <- 1..5 do
    for _j <- 1..5 do
      Enum.random(words)
    end
  end
end

print = fn
  lines, :halt -> lines |> String.slice(0..28) |> IO.puts()
  lines, :cont -> IO.write(lines)
end

Stream.iterate(0, &(&1 + 1))
|> Enum.reduce_while(0, fn i, _acc ->
  Process.sleep(1)

  lines = f.()
  Enum.at(lines, 2)

  halt_or_cont =
    if Enum.at(lines, 2) == ~w(燃 闘 魂 猪 木) do
      :halt
    else
      :cont
    end

  lines
  |> Enum.map(&Enum.join/1)
  |> Kernel.++(["\e[5A"])
  |> Enum.join("\n")
  |> print.(halt_or_cont)

  {halt_or_cont, i}
end)
|> IO.puts()

3行目に「燃える闘魂アントニオ猪木」 = 燃闘魂猪木 が並ぶまで繰り返してみました。

output.gif

上のアニメーションGifでは6541と表示されたときに、 燃闘魂猪木 が3行目に並んでいます。


さいごに

この記事では、「コンソールの出力を上書きする」ことをElixirで行う例を示しました。

闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。

$\huge{1、2、3 ぁっダァー!}$



$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?