10
9

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 5 years have passed since last update.

Elixirを勉強し始めたときに役立つトピック

Last updated at Posted at 2018-07-16

はじめに

基本、Webサイト「Elixir School」 と 書籍「プログラミング Elixir」を使って勉強

本記事では、
 1、勉強し始めたばかりのときに調べた用語
 2、実装時、覚えるまで手元に置いておきたい情報
 3、実装時、覚えるまで手元に置いておきたいコマンド
 4、参照URL
を記載します

すぐに不要になっちゃうレベルの内容だけど、誰かのお役に立てれば!

1、勉強し始めたばかりのときに調べた用語

アトム(Atoms)

名前が自身の値を表わしている定数(別言語でいうところのシンボル)

アリティ(arity)

引数の数

リスト

定義方法:[1, 2, 3]

タプル(tuple)

定義方法:{1, 2, 3}
リストのようなもの。リストとの違いは以下

  • 波括弧
  • 各要素をメモリ上に隣接して格納
      …補足
       リストは事実上の連結リストで実装されている
       そのため、長さを得る処理はタプルのほうが高速だが
       先頭に要素を追加するには、ほとんどの場合リストのほうが高速となる
  • データを変更できない

マップ

定義方法:%{key1: => val1, key2 => val2}
 …キーがアトム型のみの場合は %{key1: val1, key2: val2} という書き方もOK
値の取得:map[key]
 …map:マップ名、key:キー名
  キーがアトムの場合は、map.key でもOK
値の更新:%{map | key: val}
 …mapそのものが書き換わるわけではないことに注意

アキュムレータ(accumulator、acc)

レジスタ/変数の一種
論理演算や四則演算などによるデータの入出力と結果の保持に用いる
記憶された値と別の値の間で演算が行われ、結果がまたそこに記憶される

ビヘイビア(behavior / behaviour)

特定の要素がある条件下でどのような 振る舞い/挙動 をするかを指す

シギル(sigil)

文字列リテラルを表現したり取り扱うための構文
チルダ(~)から始まり文字が一つそれに続く

# 例:シギルの「~c」を使った例
iex> ~c/2 + 7 = #{2 + 7}/
'2 + 7 = 9'

レプル(REPL、Read-eval-print loopの略)

読む・評価・表示 を繰り返す対話型評価環境のこと
Elixir開発では、IEx がそれ

フォールトトレランス(fault tolerance)

過失許容性
システムにおいて起こりうる障害(誤作動や誤操作)に対する耐性のこと
障害が発生しても予備の系統に切り替えるなどして機能を保ち、正常に稼動させ続けることをいう
また,この耐性を向上させるため,事前対策を行おうとする設計(思想)のこと
フェイル-セーフ,フール-プルーフなどの方法がある

OTP(Open Telecom Platformの略)

並行プログラミングのために完備された開発環境
システム開発の基盤となる Erlangの コンパイラ/ライブラリ、および、フレームワーク・デザイン原則 の総称

GenServer

汎用サーバモジュール
Elixirによって用意されたフレームワークの一つであり、
OTPのデザイン原則の中心的なものの一つ「アプリケーションパターン」(ビヘイビア)では
共通的なタスクに対して汎用的な実装を定義しており、その一例でもある
更新された状態を伝える反復処理のたびに1つのリクエストを処理するループ

2、実装時、覚えるまで手元に置いておきたい情報

Elixirでの偽

nil と false のみ

モジュール内での定数定義

アットリビュートを使用する
例)@greeting "Hello"

Elixirでの予約語

予約語 用途
moduledoc 現在のモジュールにドキュメントを付ける
doc 関数やマクロについてのドキュメント管理
behaviour OTP またはユーザが定義した振る舞い(ビヘイビア)に用いる

文字列と文字リスト

文字列
ダブルクオートで生成される
バイナリで表現されているコードポイントを UTF-8 でエンコードしている

# 例
iex> "テスト"
"テスト"
iex> "テスト" <> <<0>>
<<227, 131, 134, 227, 130, 185, 227, 131, 136, 0>>

文字リスト
シングルクオートで生成される
バイナリで表現されているコードポイント

# 例
iex> 'テスト'
[12486, 12473, 12488]

通常は、文字列を使う
文字リストは、一部の Erlang モジュールが必要としているためサポートされている形

コメント記載方法

① インラインドキュメント

example.ex
# コメント

② モジュールレベルのドキュメント
 →defmodule 宣言の直後に記載

example.ex
defmodule Greeter do
  @moduledoc """
  ...コメント...
  """

③ 関数レベルのドキュメント
 → 注釈を付けたい関数の直前に記載

example.ex
@doc """
...コメント...

## パラメータ
  - name: 人名を表現する文字
## 例
  iex> Greeter.hello("Sean")
  "Hello, Sean"
"""
@spec hello(String.t()) :: String.t()
def hello(name) do
  "Hello, " <> name
end

補足事項

  • 関数に言及する場合は、「`hello/1`」のようにバッククォートを使用すること
  • なるべくコード例も記載することで、自動テスト(doctest)を生成すること
  • コメント更新時は、コマンド「mix docs」を実行することも忘れずに
  • ドキュメントを綺麗なHTML表記に変換するため、依存関係(mix.exsのdeps内)に以下を定義しておくとよい
     定義追加後は、コマンド「mix deps.get」を実行することも忘れずに
mix.exs
{:earmark, "~> 0.1", only: :dev},
{:ex_doc, "~> 0.11", only: :dev}

Mixタスクの説明文記載

Mixタスクの .ex 内で「@shortdoc "XXX"」を記載する
ここで記載した内容は、ターミナルで「mix help」を実行時に表示される

プロジェクト構成

.
├── _build                  #ビルドによる成果物
├── config                  #設定ファイル
│   └── config.exs
├── deps                    #依存関係
│   └── XXX
├── doc                     #ドキュメント
│   └── XXX
├── lib                     #アプリケーションのソースコード
│   └── example.ex
├── mix.exs                 #プロジェクトの定義(プロジェクト名、バージョン、依存関係など)
├── README.md
└── test                    #テストコード
    ├── example_test.exs
    └── test_helper.exs

3、実装時、覚えるまで手元に置いておきたいコマンド

実行終了方法

iexの終了時は、CTRL/C → a(abort)
打ち間違えなどでのコマンド実行中断時は、「#iex:break」

ヘルプ呼び出し

コマンド「h」
例)h Enum

補足事項

  • コマンド型、ソースコード在り処 や 関連モジュールなどの情報を見る場合は、コマンド「i」を使う
  • mix について知りたい場合は、iexの外部で「mix help」を実行

画面クリア

「clear」

入出力

「IO.puts "XXX"」
例)
IO.puts "hoge"
IO.puts "#{foo}"

プロジェクトの作成

「mix new XXXX」 XXXX:プロジェクト名

プロジェクトの実行

プロジェクト直下のディレクトリで「iex -S mix」を実行

コンパイル

「iex -S mix」でプロジェクト実行時、必要に応じてコードの変更をコンパイルしてくれるが
明示的にコンパイルしたい場合は「mix compile」を実行
また、モジュール単位など部分的にコンパイルしたい場合は「r XXXX」(XXXX:モジュール名) で実行可能

プロジェクトの実行環境確認/変更

mixは、以下3つの環境で動作するようになっている
 - :dev - 開発時に用いられる環境
 - :test - mix testで用いられる環境
 - :prod - アプリケーション製品出荷時に用いられる環境

現在の実行環境は「Mix.env」で取得することができる
環境を変更するには、MIX_ENV環境変数を変更する
例)$ MIX_ENV=prod mix compile

プロジェクトへの依存関係の取り込み

mix.exsのdeps内に定義した依存関係を取り込むためには「mix deps.get」を実行

コメント記載からのドキュメント作成/更新

「mix docs」
実行後、ドキュメント(ExDoc)は、ディレクトリ:doc/ 内に出来上がる

テストの実行

「mix test」

文字列のバイナリ表記

1バイトずつカンマ区切りで<<...>>で囲む

# 例
iex> <<104, 101, 108, 108, 111>>
"hello"

バイト列の結合は<>演算子を使う

# 例
iex> <<104, 101, 108>> <> <<108, 111>>
"hello"

文字列のバイナリ表現を確認するには、NULL文字<<0>>を結合
 …<<0>> を追加することで文字列として不正となり、バイナリで表示される
  文字コードを確認する時などに便利

# 例
iex> "hello" <> <<0>>
<<104, 101, 108, 108, 111, 0>>

エラーハンドリング

try/rescue を使う

iex> try do
...>   # 通常処理
...> rescue
...>   # エラー処理。複数エラーにマッチさせることができる
...>   e in RuntimeError -> IO.puts("An error occurred: " <> e.message)
...>   e in File.Error -> IO.puts("unable to read source file")
...> after
...>   # エラー有無に関わらず実行したい処理
...>   IO.puts "The end!"
...> end

throw/catch もあるが、Elixir コードでこれらを使うのは非常に稀

プロジェクトの終了

終了する場合は「exit("XXX")」を実行

実行ファイルのビルド/実行

以下の対応を入れることで、コマンドラインから実行できるようになる

[実行ファイルの準備]
Mixfile で以下2点を修正する
①escript オプションを追加

mix.exs
def project do
[
  app: :example,
  ・・中略・・,
  escript: escript()  #ココを追加
]
end

②「main_module」 を指定

mix.exs
defp escript do
  [main_module: XXXX]    #XXXX:実行ファイル
end

[ビルド]
「mix escript.build」を実行

[実行]
「./XXXX YYYY」を実行  XXXX:アプリ名、YYYY:引数

4、参照URL

10
9
2

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
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?