LoginSignup
1
2

More than 5 years have passed since last update.

Elixirのメモ

Last updated at Posted at 2014-11-23
iex(2)> System.cwd
"/Users/N1210A001/Playground"

iex(3)> System.get_env("HOME")
"/Users/N1210A001"

iex(7)> System.cmd("date",[])
{"2015年 6月12日 金曜日 11時18分41秒 JST\n", 0}

iex(8)> pwd
/Users/N1210A001/Playground
:ok

The Keyword type is an Elixir module. But it is implemented as a list of tuple. The Keyword module assumes that any value it works on is a list that has been structured a certain way.

iex(8)> options = [{:width, 72}, {:style, "light"}, {:style, "print"}]
[width: 72, style: "light", style: "print"]
iex(9)> Keyword.get_values options, :style
["light", "print"]
iex(10)> List.last options
{:style, "print"}

IO.ANSI.enabled?

Checks if ANSI coloring is supported and enabled on this machine.

iex(16)> IO.ANSI.enabled?
true

Enum.at(collection, n, default \\ nil)

Finds the element at the given index (zero-based).
Returns default if index is out of bounds.

iex(5)> Enum.at([2,4,6], 0)
2
iex(6)> Enum.at([2,4,6], 2)
6
iex(7)> Enum.at([2,4,6], 10)
nil
iex(8)> Enum.at([2,4,6], 10, :none)
:none

iex(9)> Enum.at({2,4,6}, 1, :none)
** (Protocol.UndefinedError) protocol Enumerable not implemented for {2, 4, 6}

List.update_at

リスト特定の場所を更新する。2番目の引数はリストのインデックス範囲外の場合、元のリストを返す.インデックスは0から始まる

iex(1)> List.update_at([1,4,9], 1, &(&1*20))
[1, 80, 9]
iex(2)> List.update_at([1,4,9],3, &(&1*20))
[1, 4, 9]
iex(3)> List.update_at([1,4,9],-1, &(&1*20))
[1, 4, 180]
iex(4)> List.update_at([1,4,9],33, &(&1*20))
[1, 4, 9]

--
Stream.with_index(Enumerable.t) :: Enumerable.t

Creates a stream where each item in the enumerable will be wrapped in a tuple alongside its index.

iex(3)> stream = Stream.with_index([1,2,3,4,5])
#Stream<[enum: [1, 2, 3, 4, 5],
 funs: [#Function<53.29647706/1 in Stream.with_index/1>]]>

iex(4)> Enum.to_list(stream)
[{1, 0}, {2, 1}, {3, 2}, {4, 3}, {5, 4}]

iex(5)> stream = Stream.with_index(1..10)
#Stream<[enum: 1..10, funs: [#Function<53.29647706/1 in Stream.with_index/1>]]>

iex(6)> Enum.to_list(stream)
[{1, 0}, {2, 1}, {3, 2}, {4, 3}, {5, 4}, {6, 5}, {7, 6}, {8, 7}, {9, 8},
 {10, 9}])

IO.write(device \\ :erlang.group_leader(), item)

Writes the given argument to the given device.
By default the device is the standard output. It returns :ok if it succeeds.

iex(1)> IO.write "sample"
sample:ok
iex(2)> IO.write :stderr, "sample"
sample:ok

scpコマンドでファイルを送る

成功するときに0を返す

iex(1)> System.cmd("scp", ["attributes.exs", "aws:~"])
{"", 0}

失敗するときに1を返す

iex(12)> System.cmd("scp", ["attributes.exs", "aws:~/path/not/found"])
scp: /home/ec2-user/path/not/found: No such file or directory
{"", 1}

ElixirのTaskを利用して、ファイルを送る

iex(2)> task = Task.async(fn -> System.cmd("scp", ["foo", "aws:~"]) end)
%Task{pid: #PID<0.58.0>, ref: #Reference<0.0.0.97>}
iex(3)> Task.await(task, 500000)
{"", 0}

上のコマンドは500秒のタイムアウト時間が設定されている


Elixirでsshを通して,命令を実行する

iex(2)> {:ok, conn} = :ssh.connect('localhost', 22, [user: 'wzj', password: '123', silently_accept_hosts: true])
{:ok, #PID<0.74.0>}
iex(3)> {:ok, chan_id} = :ssh_connection.session_channel(conn, :infinity)
{:ok, 0}
iex(4)> success = :ssh_connection.exec(conn, chan_id, 'touch /tmp/elixirssh', :infinity)
:success
iex(5)>

defmodule MyFile do
  @file "case.ex"

  case File.open(@file) do
    { :ok, file} ->
      IO.puts "First line: #{IO.read(file, :line)}"
    { :error, reason } ->
      IO.puts "Failed to open file: #{reason}"
  end
end

@fileのような書き方はElixirでは定数を表している

1
2
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
1
2