エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

コンソールにQRコードを表示したい

Webアプリケーションを開発しているとき、携帯端末での表示を確認したくなるときがあります。 ブラウザのレスポンシブ・デザイン・モードを利用すれば、デスクトップでも見た目の確認はできますが、やはり手のひらの中でどのように表示されるかを知るには、端末そのものに表示させるのが一番です。

そのようなときにURLを携帯端末に送るため、コンソールにQRコードを表示する簡単なスクリプトを書いてみました。

自分で書かなくても、完成度の高いツールは巷に溢れていると思いますが、今後QRコードをブラウザに表示したり、メールで送信したりする必要に迫られることもないとは言えないので、そのトレーニングの意味合いも込めて。

とは言え、QRコードエンコーディングをすべて書くのは大変なので、そこはパッケージを利用し、表現のところだけ自分で実装しています。

エンコーディングのパッケージは Hex に公開されている qr_code を利用しました。

hex.pm

Elixir 1.12 からは Mix.install/2 が実装されて、パッケージを簡単に利用できるようになりました。 これも、スクリプトを書くハードルを下げてくれた気がします。

# qr.exs

Mix.install([:qr_code])

defmodule QR do
  @white IO.ANSI.light_white_background()
  @black IO.ANSI.black_background()

  def show_as_qr_code(str) do
    IO.puts(str)

    {:ok, %{matrix: matrix}} =
      str
      |> QRCode.create()

    len = length(hd(matrix))

    edge = [@white, String.duplicate("  ", len + 2), @black]

    IO.puts(edge)

    matrix
    |> Enum.each(fn row ->
      IO.write([@white, "  ", @black])

      row
      |> Enum.map(fn
        1 -> [@black, "  "]
        0 -> [@white, "  "]
      end)
      |> IO.write()

      IO.puts([@white, "  ", @black])
    end)

    IO.puts(edge)
  end
end

System.argv()
|> Enum.each(&QR.show_as_qr_code/1)

スクリプトを書いたら elixir コマンドで実行です。

$ elixir qr.exs https://elixir-lang.org

初回だけ、パッケージのインストールが実行された後にQRコードが表示されます。

2回目以降は、すぐに結果を表示してくれるはずです。