Elixir 문자로 재생

8442 단어 Elixir


분위기에서 엔지니어하고 있습니다.

트리입니다만 어제 열을 내고 최고의 이브를 보내고, 한층 더 크리스마스인 것조차 잊고 있었으므로, 지금 산타씨도 깜짝 놀랄 정도로 대황해서 되는 것입니다.
그렇다고 해서 몇번 달여 모르겠지만, Elixir의 이상한(?) 문자 세계에서 놀아요.

그녀 (망상)에서 L ○ NE 왔다.


77 101 114 114 121 67 104 114 105 115 116 109 97 115

Elixir은 시점에서 감명 좋은 사람은 즉시 무엇이 쓰여 있는지 알 수 있군요.
이런 L○NE를 보내주는 바이너리인 그녀가 있으면 기쁘네요.

확실하지 않은 경우 Elixir를 인스코하고 Repl을 시작하고 귀여운 그녀를 위해 무엇이 쓰여 있는지 읽어보십시오.
$ iex
Erlang/OTP 22 [erts-10.6.1] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe] [dtrace]

Interactive Elixir (1.9.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> <<77, 101, 114, 114, 121, 67, 104, 114, 105, 115, 116, 109, 97, 115>>
"MerryChristmas"

멋진 메시지!

<<>> 바이너리 세계로 쉽게 다이빙



대부분의 프로그래밍 언어인 File을 읽거나 하는 사람을 살펴보겠습니다.
File.read("hoge.wav")
# {:ok,
# <<82, 73, 70, 70, 252, 94, 66, 2, 87, 65, 86, 69, 102, 109, 116, 32, 16, 0, 0,
#   0, 1, 0, 2, 0, 68, 172, 0, 0, 16, 177, 2, 0, 4, 0, 16, 0, 100, 97, 116, 97,
#   236, 93, 66, 2, 0, 0, 0, 0, ...>>}

여기에서 Wave 파일을 모처럼 읽었으므로 깜박이 헤더를 들여다 보겠습니다. Wave 파일의 구조에 대해서는 별도로 참조하십시오.
defmodule Wave do
  def parse(file) do
    File.read(file)
    |> header()
  end

  def header({:error, _}), do: {:error, "読み込み失敗"}
  def header({:ok, body}) do
    <<riff :: binary-size(4), size :: unsigned-size(32), wave_header :: binary-size(4), fmt_chunk :: binary-size(4), rest :: binary>> = body
    IO.inspect riff
    IO.inspect size
    IO.inspect wave_header
    IO.inspect fmt_chunk
    IO.inspect rest
  end
end

적절한 Wave 파일을 읽어보십시오.
$ iex -S mix
iex(1)> Wave.parse("hoge.wav")
"RIFF"
4234035714
"WAVE"
"fmt "
<<16, 0, 0, 0, 1, 0, 2, 0, 68, 172, 0, 0, 16, 177, 2, 0, 4, 0, 16, 0, 100, 97,
  116, 97, 236, 93, 66, 2, 0, 0, 0, 0, 0, 0, 255, 255, 1, 0, 2, 0, 254, 255,
  253, 255, 3, 0, 4, 0, 252, 255, ...>>

패턴 매치 최고.

문자도 이진



뭐야.
"a" <> "b" # "ab"
"a" <> <<0>> # <<97, 0>>
match? "a", <<97>> # true

결국 그 숫자는 뭔가 ASCII입니다.
아무튼 이 근처는 Elixir의 튜토리얼에서도 쓰고 있는 것이군요.

더 분해해 보자



조금 전의 그녀로부터의 메시지의 머리 글자 "M"로 조금 깊은 해자."M" <> <<0>><<77, 0>> 이므로 <<77>> == "M" 네요( ?M 만으로도 조사할 수 있습니다).77 는 2진수로 1001101 네요. 이것을 Elixir로 쓰면
<<0::1, 1::1, 0::1, 0::1, 1::1, 1::1, 0::1, 1::1>>

라는 것은
$ iex -S mix
iex(1)> <<0::1, 1::1, 0::1, 0::1, 1::1, 1::1, 0::1, 1::1>>
"M"
iex(2)> match? "M", <<0::1, 1::1, 0::1, 0::1, 1::1, 1::1, 0::1, 1::1>>
true

이것만 보면 알 수가 없네요.

요약



평소에는 그다지 접하지 않는 0/1의 세계에, 의외로 간편하게 들어갈 수 있는 재미가 Elixir에는 있다고 생각합니다.
후왓과 이해하고 있던 bit라든지의 단위에 대해서가 클리어가 되지구나.
그리고 Elixir의 패턴 매치 덕분에 이 손의 코드는 짧게 쓸 수 있다고 생각합니다.
전 전 전직에서는 Elixir를 사용해 상당히 바이너리 놀고 즐겼습니다. 그때 만든 라이브러리가 몇 개 공개했을 터…

의외로 이야기가 퍼지지 않아 곤란했습니다만, 우선 메리 크리스마스.
여러분 어드벤트 캘린더 수고하셨습니다.

좋은 웹페이지 즐겨찾기