週刊Elixirライブラリ2015-17

Elixirのライブラリの解説を週ごとにお届けする記事です。
解説が間違っていた場合には、コメントか@hayabusa333にご連絡くださると嬉しいです。

今回はProgressBarについて

# ProgressBar is 何?
ProgressBarは、Elixirにてターミナル上にプログレスバーを表示できるようにするライブラリです。

# 実行環境
OS:OS X Yosemite
Erlang:Eshell V6.5, OTP-Version 18
Elixir:v1.0.4

# ProgressBarの実行を行うための新規プロジェクトの作成

$ mix new my_progress_bar
$ cd my_progress_bar

# HexにてProgressBarをインストールするために設定ファイルの記載を行う

$ vim mix.exs

mix.exsの内容は下記となります。

defmodule MyProgressBar.Mixfile do
  use Mix.Project

  def project do
    [app: :my_progress_bar,
     version: "0.0.1",
     elixir: "~> 1.0",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps]
  end

  # Configuration for the OTP application
  #
  # Type `mix help compile.app` for more information
  def application do
    [applications: [:logger]]
  end

  # Dependencies can be Hex packages:
  #
  #   {:mydep, "~> 0.3.0"}
  #
  # Or git/path repositories:
  #
  #   {:mydep, git: "https://github.com/elixir-lang/mydep.git", tag: "0.1.0"}
  #
  # Type `mix help deps` for more examples and options
  defp deps do
    [{:progress_bar, "~> 1.2.1"}]
  end
end

# 依存関係の解決を行います。

$ mix deps.get
$ mix deps.compile

# ProgressBar を実行してみる

$ iex -S mix

# 2/3の状態のプログレスバーを表示する
iex(1)> ProgressBar.render(2, 3)
|=================================================                        |  67%:ok
# 3/3の状態のプログレスバーを表示する
iex(2)> ProgressBar.render(3, 3)
|=========================================================================| 100% 
:ok
# Enumにてプログレスバーを自動的に数値が増えていくように表示する
iex(3)> Enum.each 1..100, fn (i) ->
...(3)>   ProgressBar.render(i, 100)
...(3)>   :timer.sleep 25
...(3)> end
|=                                                                        |   
1%|=                                                                        |   
2%|==                                                                       |   
3%|===                                                                      |   
4%|====                                                                     |   
5%|====                                                                     |   
6%|=====                                                                    |   
7%|======                                                                   |   
8%|=======                                                                  |   
9%|=======                                                                  |  
10%|========                                                                 |  
11%|=========                                                                |  
12%|=========                                                                |  
13%|==========                                                               |  
14%|===========                                                              |  
15%|============                                                             |  
16%|============                                                             |  
17%|=============                                                            |  
18%|==============                                                           |  
19%|===============                                                          |  
20%|===============                                                          |  
21%|================                                                         |  
22%|=================                                                        |  
23%|==================                                                       |  
24%|==================                                                       |  
25%|===================                                                      |  
26%|====================                                                     |  
27%|====================                                                     |  
28%|=====================                                                    |  
29%|======================                                                   |  
30%|=======================                                                  |  
31%|=======================                                                  |  
32%|========================                                                 |  
33%|=========================                                                |  
34%|==========================                                               |  
35%|==========================                                               |  
36%|===========================                                              |  
37%|============================                                             |  
38%|============================                                             |  
39%|=============================                                            |  
40%|==============================                                           |  
41%|===============================                                          |  
42%|===============================                                          |  
43%|================================                                         |  
44%|=================================                                        |  
45%|==================================                                       |  
46%|==================================                                       |  
47%|===================================                                      |  
48%|====================================                                     |  
49%|=====================================                                    |  
50%|=====================================                                    |  
51%|======================================                                   |  
52%|=======================================                                  |  
53%|=======================================                                  |  
54%|========================================                                 |  
55%|=========================================                                |  
56%|==========================================                               |  
57%|==========================================                               |  
58%|===========================================                              |  
59%|============================================                             |  
60%|=============================================                            |  
61%|=============================================                            |  
62%|==============================================                           |  
63%|===============================================                          |  
64%|===============================================                          |  
65%|================================================                         |  
66%|=================================================                        |  
67%|==================================================                       |  
68%|==================================================                       |  
69%|===================================================                      |  
70%|====================================================                     |  
71%|=====================================================                    |  
72%|=====================================================                    |  
73%|======================================================                   |  
74%|=======================================================                  |  
75%|=======================================================                  |  
76%|========================================================                 |  
77%|=========================================================                |  
78%|==========================================================               |  
79%|==========================================================               |  
80%|===========================================================              |  
81%|============================================================             |  
82%|=============================================================            |  
83%|=============================================================            |  
84%|==============================================================           |  
85%|===============================================================          |  
86%|================================================================         |  
87%|================================================================         |  
88%|=================================================================        |  
89%|==================================================================       |  
90%|==================================================================       |  
91%|===================================================================      |  
92%|====================================================================     |  
93%|=====================================================================    |  
94%|=====================================================================    |  
95%|======================================================================   |  
96%|=======================================================================  |  
97%|======================================================================== |  
98%|======================================================================== |  
99%|=========================================================================| 
100% 
:ok
# プログレスバーの横の長さを設定して表示
iex(4)> ProgressBar.render(97, 100, width: 30)
|====================== |  97%:ok
# プログレスバーのフォーマットを使用し、カラー表示で出るように表示
iex(5)> format = [
...(5)>   bar_color: [IO.ANSI.green_background],
...(5)>   blank_color: [IO.ANSI.red_background],
...(5)>   bar: " ",
...(5)>   blank: " ",
...(5)>   left: " ", right: " ",
...(5)> ]
[bar_color: ["\e[42m"], blank_color: ["\e[41m"], bar: " ", blank: " ",
 left: " ", right: " "]
iex(6)> Enum.each 1..100, fn (i) ->             
...(6)>   ProgressBar.render(i, 100, format)    
...(6)>   :timer.sleep 25                       
...(6)> end
# 赤色のバーが100%に近づくごとに緑色のバーへ切り替わっていけば成功です
:ok
# プログレスバーのフォーマットを使用し、カラー表示で出るように表示
iex(7)> format = [
...(7)>   bars_color: [IO.ANSI.yellow],                                      
...(7)>   done_color: [IO.ANSI.green],                                       
...(7)> ]
[bars_color: ["\e[33m"], done_color: ["\e[32m"]]
iex(9)> ProgressBar.render_indeterminate(format, fn -> :timer.sleep 5000 end)
|==============================================================================|
:ok

# まとめ
今回はElixirにてProgressBarを表示するライブラリを紹介いたしました。
Elixirのライブラリを作った時のテストに組み込んでみたり、処理が重いものに組み込んでみてはいかがでしょうか?

それでは皆さま、良いElixirライフを