2016年11月30日水曜日

Elixirで自作フレームワーク?

Elixirで自作フレームワーク? タイトルは威勢がいいですが、Code Wordsさんの「Building a web framework from scratch in Elixir」というブログを見つけたので、初歩の初歩から、もう一度勉強し直します。

initで初期化して、callする手順はわかるのですが、起動して、http://localhost:4000 にアクセスすると、「hello!」が2つづつ表示されます。1度しかアクセスしていないんですけどね? 謎です。またわからなくなりました。ため息が出ます。

/lib/hello_plug.ex
defmodule HelloPlug do
  def init(default_opts) do
    IO.puts "starting up"
    default_opts
  end

  def call(conn, _opts) do
    IO.puts "hello!"
    Plug.Conn.send_resp(conn, 200, "Hello, world!")
  end
end
$ iex -S mix

iex(1)> {:ok, _} = Plug.Adapters.Cowboy.http HelloPlug, []
starting up
{:ok, #PID<0.123.0>}

iex(2)> hello!
hello!
hello!
hello!



参考サイト
Module attributes(Elixir)
Plug
ElixirでのPlugの基本

2016年11月29日火曜日

Elixirのマクロ(Macros)で利用される「__using__」

Elixirのマクロ(Macros)で利用される「__using__」です。ブログを書いていて虚しいのですが、よくわかりません。マクロ(Macros)自体がわかりませんから、当然といえば、当然ですが。笑ってやってください。サンプルだけコピーしておきます。
モジュールでuseを呼び出すと、そのモジュールで__using__マクロが呼び出され、開発者は必要なコードを生成できます。 また、引数リストも取ります。
defmodule AwesomeLibrary do  
  defmacro __using__(_) do
    quote do
      def print(s), do: IO.puts(s)
    end
  end
end
defmodule TestLibrary do  
  use AwesomeLibrary
end
iex(1)> TestLibrary.print("Hello World")  
Hello World  
:ok

参考サイト
[Elixir]__using__について分かったこと(Code of Resistance!!さん)
What's 'use' statement in Elixir?(zabirauf || Zohaibさん)
Elixirでマクロ(Macros)

2016年11月28日月曜日

Elixirでマクロ(Macros)

Elixirマクロ(Macros)です。Elixirのマクロはdefmacro/2で定義されるとのこと。 サンプルを見ても何を意図したいのか意味がよくわからない。そのうち理解できるようになることを信じて、次に進むことにしましょう。
マクロは最後の手段としてのみ使用してください。 「明示的」は「暗黙的」よりも優れていることに注意してください。 明確なコードは簡潔なコードよりも優れています。
macros.exs
defmodule Unless do
  def fun_unless(clause, do: expression) do
    if(!clause, do: expression)
  end

  defmacro macro_unless(clause, do: expression) do
    quote do
      if(!unquote(clause), do: unquote(expression))
    end
  end
end
iex(1)> require Unless
nil
iex(2)> Unless.macro_unless true, do: IO.puts "this should never be printed"
nil
iex(3)> Unless.fun_unless true, do: IO.puts "this should never be printed"
this should never be printed
nil
マクロのUnless.macro_unlessで、"this should never be printed"の文字列が表示されないのは、関数呼び出しの引数が関数を呼び出す前に評価されるためです。 マクロは引数を評価しません。 代わりに、引数をquoteされた式として受け取り、それを他のquoteされた式に変換します。

参考サイト
Elixir: Macro入門(Qiita)
マクロと変数(Qiita)
Elixirのマクロについて浅く語ってみる(mmagさん)
Elixirのquoteとunquote

2016年11月27日日曜日

スーパーコンピューターランキングTOP500は、ほぼLinuxが独占

スーパーコンピューターランキングTOP500は、ほぼLinuxが独占。世界最速のコンピュータ500台のうち、498台がLinuxを搭載したものだそうです。オープンソースの力は偉大ですねぇ。

2016年11月26日土曜日

ウェブサーバシェアApacheが首位で46.30%、Nginxが2位で19%

ウェブサーバシェアApacheが首位で46.30%、Nginxが2位で19%だそうです。
Apacheの手前で、負荷分散やアプリケーションにNGINXを使用している。NGINXのアーキテクチャはかなり異なっており、並行的にウェブサービスを提供するのに向いている。
確かに、こういう構成をよく見かけますよね。



参考サイト
ウェブサーバのNGINX、Apacheとはどう使い分ける?(ZDNet Japan)

2016年11月25日金曜日

Elixirのquoteとunquote

Elixirquoteとunquoteです。Elixirのプログラムは、3つの要素を持つタプルとして組み上がるとのこと。 最初の要素は関数名、2番目はメタデータを含むキーワードリスト、3番目は引数リストです。quoteを使用すると、任意の式の表現を得ることができます。unquoteを使用すると、quoteせず、そのまま特定のコードを挿入できます(?)。奥が深くて、難しい。
  1. 関数名
  2. メタデータを含むキーワードリスト
  3. 3番目は引数リスト
iex(1)> 1+2
3
iex(2)> quote do: 1 + 2
{:+, [context: Elixir, import: Kernel], [1, 2]}

iex(3)> IO.puts "hello world"
hello world
:ok
iex(4)> quote do: IO.puts "hello world"
{{:., [], [{:__aliases__, [alias: false], [:IO]}, :puts]}, [], ["hello world"]}

iex(5)> number = 13
13
iex(6)> Macro.to_string(quote do: 11 + number)
"11 + number"
iex(7)> Macro.to_string(quote do: 11 + unquote(number))
"11 + 13"

参考サイト
ElixirのMetaprogrammingに出ているquote(Qiita)

2016年11月24日木曜日

Elixirのマイクロフレームワーク「trot」でクエリストリング(URLパラメータ)の取得

Elixirのマイクロフレームワーク「trot」でクエリストリング(URLパラメータ)の取得です。どうやって取得するのだろうと悩みましたが、Plug.Connのfetch_query_paramsを利用すると、取得できました。

/lib/my_trot.ex
defmodule MyTrot do
  use Trot.Router

  get "/hello" do
    conn = fetch_query_params(conn)
    name = conn.params["name"]
    "Hello, #{name}!"
  end
end

参考サイト
Elixirでtrotを使ってみる(Qiita)
Simple elixir web server with plug(Tutorials and notes)
hexedpackets/trot(GitHub)

2016年11月23日水曜日

サーバを丸ごと液体に浸して冷却するデータセンター

サーバを丸ごと液体に浸して冷却するデータセンターについてです。「液浸冷却技術」と呼ばれるものだそうで、空冷の1000倍もの熱輸送効率を実現できるとのこと。理論はわかりますが、実際に実現できてしまうところがすごいですねぇ。

  • スペース削減
  • 消費電力の削減
  • 故障率の低下(10℃温度を下げると故障率が半減)
  • データセンターの無音化



参考サイト
サーバを丸ごと液浸して消費電力を30%削減! 斬新な冷却技術でデータセンターに革命を(FUJITSU JOURNAL)
10℃2倍則(10℃半減則)(製品設計知識)

2016年11月22日火曜日

Elixirのマイクロフレームワーク「trot」でテンプレート

Elixirのマイクロフレームワーク「trot」でテンプレートです。@template_rootで、テンプレートパスの設定。render_templateで、テンプレートファイル名と変数のリストを指定という具合。

/lib/my_trot.ex
defmodule MyTrot do
  use Trot.Router
  use Trot.Template
  @template_root "priv/templates/root"

  get "/compression/pied_piper" do
    render_template("results.html.eex", [title: "EExのテスト", weissman_score: 5.2])
  end

  get "/compression/nucleus" do
    render_template("results.html.haml", [title: "HAMLのテスト", weissman_score: 2.89])
  end
end
/priv/templates/root/results.html.eex
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title><%= @title %></title>
</head>
<body>
  <div class="container">
    <div class="row">
      <%= @weissman_score %>
    </div>
  </div>
</body>
</html>

参考サイト
[Elixir+Trot]テンプレートをレンダリングするだけの簡単なお仕事(Qiita)
Elixirのマイクロフレームワーク「trot」

2016年11月21日月曜日

Elixirのマイクロフレームワーク「trot」

Elixirのマイクロフレームワーク「trot」を設定してみました。非常に軽いです。ルーティングのデフォルト404表示は、import_routes Trot.NotFoundを置くか、モジュールの最後にTrot.NotFoundを使用することで有効にできるらしい。

mix.exs
  def application do
    [applications: [:logger, :trot]]
  end

  defp deps do
    [{:trot, github: "hexedpackets/trot"}]
  end
/config/config.exs
config :trot, :port, 4000
config :trot, :router, MyTrot
config :trot, :heartbeat, "/heartbeat"
/lib/my_trot.ex
defmodule MyTrot do
  use Trot.Router

  get "/" do
    "こんにちは、世界!"
  end

  static "/css", "assets"

  get "/bad" do
    :bad_request
  end

  get "/text" do
    "Thank you for your question."
  end

  get "/text/body", headers: ["x-text-type": "question"] do
    {:redirect, "/text"}
  end

  get "/text/body" do
    {201, "optimal tip-to-tip efficiency"}
  end

  get "/json" do
    %{"hyper" => "social"}
  end

  get "/presenter/:name" do
    "The presenter is #{name}"
  end

  import_routes Trot.NotFound
end



参考サイト
Elixirでtrotを使ってみる(Qiita)
[Elixir+Trot] Trot-Frameworkを使って"Hello Trot!!"するだけの簡単なお仕事(Qiita)

2016年11月20日日曜日

Skypeアカウントがなくても、ブラウザからSkypeが利用可能に

Skypeアカウントがなくても、ブラウザからSkypeが利用可能になったそうです。個人的には、Web for Skypeで良いじゃないかと思いますが、これはこれで、便利に使えるのでしょう。





参考サイト
ブラウザ上でSkypeが利用可能に(ライフハッカー)

2016年11月19日土曜日

TumblrがPHP5からPHP7への移行して、性能が大幅向上

TumblrがPHP5からPHP7への移行して、性能が大幅向上したそうです。こういった実例を示されると、やっぱり、PHP7を使うべしと思いますね。
Tumblrのブログ記事ではレイテンシやCPU負荷のグラフも掲載されているが、PHP 7への移行でレイテンシは200ms前後から120ms前後になり、CPUロードアベレージも低くなっていることが分かる。


参考サイト
Tumblr、PHP 5からPHP 7への移行で性能が大幅向上(財経新聞)

2016年11月18日金曜日

Elixir(Erlang)のパッケージマネージャー「Hex」

Elixir(Erlang)のパッケージマネージャー「Hex」 こういうウェブサイトがあると安心しますね(笑)。キーワードで必要なパッケージを探すことが可能です。


2016年11月17日木曜日

Elixirで並行プロセス

Elixir並行プロセスです。 Elixirは、並行処理のためにアクターモデルに依存していて、並行プログラムは3つの基本要素から成り立っています。
  1. spawn(生み出す)
  2. send(送信)
  3. receive(受信)
receiveの処理は、何度か繰り返してみると、徐々にわかってきます。
iex(1)> pid = spawn fn -> 1 + 2 end
#PID<0 .123.0="">

iex(2)> Process.alive?(pid)
false

iex(3)> self()
#PID<0 .124.0="">

iex(4)> Process.alive?(self())
true

iex(5)> send self(), {:hello, "world"}
{:hello, "world"}

iex(6)> receive do
...(6)>   {:hello, msg} -> msg
...(6)>   {:world, msg} -> "won't match"
...(6)> end
"world"

iex(7)> receive do
...(7)>   {:hello, msg}  -> msg
...(7)> after
...(7)>   1_000 -> "nothing after 1s"
...(7)> end
"nothing after 1s"

iex(8)> parent = self()
#PID<0 .125.0="">

iex(9)> spawn fn -> send(parent, {:hello, self()}) end
#PID<0 .126.0="">

iex(10)> receive do
...(10)>   {:hello, pid} -> "Got hello from #{inspect pid}"
...(10)> end
"Got hello from #PID<0 .126.0="">"

iex(11)> send self(), :hello
:hello

iex(12)> flush()
:hello
:ok

参考サイト
プロセス - Processes -(Elixir)

2016年11月16日水曜日

ElixirでSupervisor(スーパーバイザ)のstrategy(戦略)

ElixirSupervisor(スーパーバイザ)のstrategy(戦略)です。strategyとはなんぞやということで、調べてみました。

strategy()
strategy ::
  :simple_one_for_one |
  :one_for_one |
  :one_for_all |
  :rest_for_one
:one_for_one - 失敗した子プロセスのみを再起動します。
:one_for_all - 失敗したイベントの中にある全ての子プロセスを再起動します。
:rest_for_one - 失敗したプロセスと、そのプロセスより後に開始された全てのプロセスを再起動します。
:simple_one_for_one - 動的にアタッチされた子プロセスに最適です。スーパーバイザは1つだけ子プロセスを含む必要があります。

参考サイト
OTPスーパーバイザ(Elixir School)
Supervisor and Application(Elixir)
ElixirでのPlugの基本(その3)「Supervised handlers」

2016年11月15日火曜日

ElixirでのPlugのテスト

ElixirPlugのテストです。use Plug.Test というモジュールを使うらしい。

/my_plug/test/my_plug_test.exs
defmodule MyPlugTest do
  use ExUnit.Case, async: true
  use Plug.Test

  @opts MyRouter.init([])

  test "returns index" do
    # Create a test connection
    conn = conn(:get, "/")

    # Invoke the plug
    conn = MyRouter.call(conn, @opts)

    # Assert the response and status
    assert conn.state == :sent
    assert conn.status == 200
    assert conn.resp_body == "index page"
  end
  
  test "returns hello world" do
    # Create a test connection
    conn = conn(:get, "/hello")

    # Invoke the plug
    conn = MyRouter.call(conn, @opts)

    # Assert the response and status
    assert conn.state == :sent
    assert conn.status == 200
    assert conn.resp_body == "world"
  end
  
  test "the truth" do
    assert 1 + 1 == 2
  end
end
$ mix test

Finished in 0.06 seconds (0.06s on load, 0.00s on tests)
3 tests, 0 failures

参考サイト
Testing plugs(Plug)
ElixirでのPlugの基本
ElixirでのPlugの基本(その2)
ElixirでのPlugの基本(その3)「Supervised handlers」

2016年11月14日月曜日

ElixirでのPlugの基本(その3)「Supervised handlers」

ElixirでのPlugの基本(その3)「Supervised handlers」です。プロダクション環境では、アプリケーション監視ツリーの下で起動すべしということでしょうか?? 基本がなってないですねぇ。深く考えずに、こういうものだと言い聞かせて、進むしかありません。

/my_plug/lib/my_plug.ex
defmodule MyPlug do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec

    children = [
      Plug.Adapters.Cowboy.child_spec(:http, MyRouter, [], [port: 4000])
    ]

    opts = [strategy: :one_for_one, name: MyPlug.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

参考サイト
Supervised handlers(Plug)
ElixirでのPlugの基本
ElixirでのPlugの基本(その2)

2016年11月13日日曜日

ブロックチェーンのオープンソースデータベース「BigchainDB」

ブロックチェーンのオープンソースデータベース「BigchainDB」 ブロックチェーンとは、分散型ネットワークで、ビットコインの中核技術として実装された技術だそうです。

ブロックチェーンは多数のノードに同一の記録を同期させる仕組みである。 ノード間の記録に差異が生じた場合には、一定のルールに基づく多数決によって正統な記録を決定することにより、記録の同期を確保していく仕組みとなっている。 また、既存の記録(ブロック)に新しい記録を追加する際に、チェーン状に次々と追加していくことから、ブロックチェーンと呼ばれている。
BigchainDBは、「証跡が残らない形ではデータの書き換えができない」など基本的なブロックチェーンの特性を持ち、同じくオープンソースソフトウェアである「RethinkDB」をベースに、デジタルアセット操作(所有権のコントロール)をサポートしたデータストアです。


参考サイト
Pythonで操作するブロックチェーンベースのデータストアBigchainDBとは(@IT)
ブロックチェーン(Wikipedia)
RethinkDB

2016年11月12日土曜日

サーバーサイドでレンダリングされるReactアプリケーションのためのフレームワーク「Next.js」

サーバーサイドでレンダリングされるReactアプリケーションのためのフレームワーク「Next.js」 変化が激しすぎて、ついていけないですが、とにかく要チェック。



参考サイト
ext.js: ReactベースのシンプルなUniversal JavaScriptフレームワーク(InfoQ)
zeit/next.js(GitHub)

2016年11月11日金曜日

ElixirでのPlugの基本(その2)

ElixirでのPlugの基本(その2)です。Plug.Routerを利用すると、ルーティングを制御できます。

RouterにはPlugパイプラインが含まれており、デフォルトではmatchdispatchの2つのPlugが必要です。 一致が見つかった場合は、ディスパッチに転送されます。

/my_plug/lib/my_router.ex
defmodule MyRouter do
  use Plug.Router

  plug :match
  plug :dispatch

  get "/" do
    send_resp(conn, 200, "index page")
  end

  get "/hello" do
    send_resp(conn, 200, "world")
  end

  match _ do
    send_resp(conn, 404, "not found")
  end
end
コンパイルして、Cowboyを起動
iex(1)> c "/path/to/my_plug/lib/my_router.ex"
[MyRouter]
iex(2)> {:ok, _} = Plug.Adapters.Cowboy.http MyRouter, []
{:ok, #PID<123>}

参考サイト
Plug.Router(Plug)
ElixirでのPlugの基本

2016年11月10日木曜日

ElixirでのPlugの基本

ElixirでのPlugの基本です。Plug.Connを利用する場合は、initで初期化して、callするということなのでしょうか。わかった気分を味わいつつも、ますます闇の中へ。

Plugとは?

  • Webアプリケーション間の構成可能なモジュールの仕様
  • Erlang VM内の異なるWebサーバーの接続アダプタ

/my_plug/lib/my_plug.ex
defmodule MyPlug do
  import Plug.Conn

  def init(opts) do
    Map.put(opts, :my_option, "Hello")
  end

  def call(conn, opts) do
    conn
    |> put_resp_content_type("text/plain")
    |> send_resp(200, "#{opts[:my_option]}, World!")
  end
end
コンパイルして、Cowboyを起動
iex(1)> c "/path/to/my_plug/lib/my_plug.ex"
[MyPlug]
iex(2)> {:ok, _} = Plug.Adapters.Cowboy.http MyPlug, %{}
{:ok, #PID<123>}

参考サイト
Getting started with Plug in Elixir(Brian Stortiさん)
Plug.Conn(Plug)

2016年11月9日水曜日

Elixirで、再帰(Recursion)

Elixirで、再帰(Recursion)です。特にリストの[head | tail]でループさせているのは特徴的で、慣れないと、難しいですね。
Elixirでは、Forループすることはできず、そのかわり関数型言語は再帰に頼ります。関数は再帰的に呼び出され,停止の条件になるまで,動作し続けます.
defmodule Recursion do
  def print_multiple_times(msg, n) when n <= 1 do
    IO.puts msg
  end

  def print_multiple_times(msg, n) do
    IO.puts msg
    print_multiple_times(msg, n - 1)
  end
end
defmodule Math do
  def sum_list([head | tail], accumulator) do
    sum_list(tail, head + accumulator)
  end

  def sum_list([], accumulator) do
    accumulator
  end

  def double_each([head|tail]) do
    [head * 2| double_each(tail)]
  end

  def double_each([]) do
    []
  end

  def exponential_each([head|tail]) do
    [head * head| exponential_each(tail)]
  end

  def exponential_each([]) do
    []
  end
end
iex(1)> Recursion.print_multiple_times("Hello!", 3)
Hello!
Hello!
Hello!
:ok

iex(2)> Math.sum_list([1, 2, 3, 4, 5, 6, 7, 8, 9], 0)
45

iex(3)> Math.sum_list([1, 2, 3, 4, 5, 6, 7, 8, 9], 1000)
1045

iex(4)>  Math.double_each([1, 2, 3, 4, 5, 6, 7, 8, 9])
[2, 4, 6, 8, 10, 12, 14, 16, 18]

iex(5)> Math.exponential_each([1, 2, 3, 4, 5, 6, 7, 8, 9])
[1, 4, 9, 16, 25, 36, 49, 64, 81]

2016年11月8日火曜日

Elixirで、Eachループ

Elixirで、Eachループです。Enum.eachを利用して、Enum.each(リスト、関数)で、処理するらしい(?)

iex(1)> file_lists = File.ls! "priv/contents/"
["aaa.md", "bbb.md", "ccc.md", "ddd.md"]

iex(2)> Enum.each(file_lists, fn x -> IO.puts x end)
aaa.md
bbb.md
ccc.md
ddd.md
:ok

iex(3)> Enum.each(file_lists,  &(IO.puts &1))
aaa.md
bbb.md
ccc.md
ddd.md
:ok

iex(4)> Enum.each(file_lists,  &IO.puts/1)
aaa.md
bbb.md
ccc.md
ddd.md
:ok

iex(5)> file_lists |> Enum.each(&IO.puts/1)
aaa.md
bbb.md
ccc.md
ddd.md
:ok

参考サイト
Ruby vs. Elixir: #Each(Strideさん)
Enum(Elixir)
関数(Elixir School)

2016年11月7日月曜日

Elixirで、ファイル関数(File)

Elixirで、ファイル関数(File)です。ファイルのリストを取得して、並べている例。

iex(1)> file_lists = File.ls! "priv/contents/"
["aaa.md", "bbb.md", "ccc.md", "ddd.md"]

iex(2)> Enum.each(file_lists, fn x -> IO.puts x end)
aaa.md
bbb.md
ccc.md
ddd.md
:ok

iex(3)> {:ok, file_lists} = File.ls "priv/contents/"
{:ok, ["aaa.md", "bbb.md", "ccc.md", "ddd.md"]}

iex(4)> Enum.each(file_lists, fn x -> IO.puts x end)
aaa.md
bbb.md
ccc.md
ddd.md
:ok

参考サイト
Cowboy Tutorial Part 2: Creating Flat File Blog(ElixirDoseさん)
Elixirでファイルの一覧とかのディレクトリ操作(BlankTarさん)
File

2016年11月6日日曜日

JSONでiOSアプリを作成できる「Jasonette」

JSONでiOSアプリを作成できる「Jasonette」 レイアウトに、アクション、スタイルと、それぞれJSONデータのみで、プログラミングしていくことになるらしいです。これ面白いですね。





参考サイト
HTTP経由でiOSアプリを簡単にプログラムできる「Jasonette」(GIGAZINE)
Jasonette/JASONETTE-iOS(GitHub)

2016年11月5日土曜日

BIND 9に危険度「高」の脆弱性

BIND 9に危険度「高」の脆弱性が見つかったとのこと。BIND 9は、日本国内でも脆弱性悪用を狙う攻撃が観測されていることから、まだ更新版を適用していない場合は対応を急ぐ必要があるそうです。



参考サイト
「BIND 9」の更新版公開、危険度「高」の脆弱性に対処(ITmedia)

2016年11月3日木曜日

Ubuntu系デスクトップLinuxの「Bodhi Linux」

Ubuntu系デスクトップLinuxの「Bodhi Linux」 興味をそそられたのでメモ。見た感じは、使いやすそうな印象です。
デスクトップ環境としては「Enlightenment DR17」をベースとした「Moksha Desktop」が採用されている。軽量かつ軽快な動作が特徴で、低スペックなPCでも動作する。




参考サイト
UbuntuベースのLinuxディストリビューション「Bodhi Linux 4.0」リリース(Think IT)
Enlightenment
Moksha Desktop(Bodhi Linux)

2016年11月2日水曜日

Elixirで、埋め込みテンプレート(Embedded Elixir)

Elixirで、埋め込みテンプレート(Embedded Elixir)です。EEx.eval_fileEEx.eval_stringを使うと、簡単に実現できます。

iex(1)> EEx.eval_string "foo <%= bar %>", [bar: "お名前は?"]
"foo お名前は?"

iex(2)> EEx.eval_string "foo <%= bar %>", [bar: "太郎"]
"foo 太郎"

iex(3)> template = "priv/themes/index.html.eex"
"priv/themes/index.html.eex"

iex(4)> File.read! template
"<html lang=\"ja\">\r\n<head>\r\n  <meta charset=\"utf-8\">\r\n  <title><%= title %></title>\r\n</head>\r\n<body>\r\n  <%= content %>\r\n</body>\r\n</html>"

iex(5)> EEx.eval_file template, [title: "ホームページのタイトル", content: "Hello world!!<br>"]
"<html lang=\"ja\">\r\n<head>\r\n  <meta charset=\"utf-8\">\r\n  <title>ホームページのタイトル</title>\r\n</head>\r\n<body>\r\n  Hello world!!<br>\r\n</body>\r\n</html>"

iex(6)> EEx.eval_file template, [title: "ホームページのタイトル", content: "Hello world!!<br>
...(6)> 改行します1。<br>
...(6)> 改行します2。<br>
...(6)> 改行します3。<br>"]
"<html lang=\"ja\">\r\n<head>\r\n  <meta charset=\"utf-8\">\r\n  <title>ホームページのタイトル</title>\r\n</head>\r\n<body>\r\n  Hello world!!<br>\n改行します1。<br>\n改行します2。<br>\n改行します3。<br>\r\n</body>\r\n</html>"

iex(7)> footer = "priv/themes/footer.html.eex"
"priv/themes/footer.html.eex"

iex(8)> EEx.eval_file footer
"c 2016 talkativepg. Powered by Blogger."

iex(9)> File.read! footer
"c 2016 talkativepg. Powered by Blogger."

参考サイト
Cowboy Tutorial Part 2: Creating Flat File Blog(ElixirDoseさん)
EEx

2016年11月1日火曜日

Elixirで、String関数

Elixirで、String関数です。ユニコードを扱えるので、日本語も問題なし。

$ iex -S mix

iex(1)> str = "日本語のテスト"
"日本語のテスト"
iex(2)> String.length str
7
iex(3)> sliced = String.slice str, 0, 3
"日本語"
iex(4)> String.first str
"日"
iex(5)> String.last str
"ト"
iex(6)> String.split str, "の"
["日本語", "テスト"]
iex(7)> String.replace str, "日本語", "英語"
"英語のテスト"
iex(8)> String.slice str, 3, 1
"の"
iex(9)> String.slice str, 3, 2
"のテ"
iex(10)> String.reverse str
"トステの語本日"
iex(11)> String.contains? str, "の"
true
iex(12)> String.at str, 3
"の"
iex(13)> String.at str, 0
"日"

参考サイト
Cowboy Tutorial Part 2: Creating Flat File Blog(ElixirDoseさん)
String(Elixir)