LoginSignup
6
3

More than 1 year has passed since last update.

HacobuneでLivebookをイゴかす(Elixir)

Last updated at Posted at 2021-08-21

はじめに

  • Elixirを楽しんでいますか:bangbang::bangbang::bangbang:
  • 今日は、Hacobune(はこぶね) β版にてLivebookをイゴかしてみます
  • 現在、Hacobune(はこぶね)は、オープンβ版にて無料で利用できるとのことでつかってみました
  • デプロイ方法は次の3種類とのことです
    • ①パブリックのDockerイメージを使用
    • ②プライベートのDockerイメージを使用
    • ③GitHubレポジトリをHacobuneに接続して使用(Dockerfileが必須)
  • 今回は、①パブリックのDockerイメージを使用でやってみます

できたもの :tada::tada::tada::tada:

Hacobune(はこぶね)を知ったきっかけ

  • チャレキャラという九州の学生のための育成型アプリコンテストの2021/8/21(土)イベントに先生役で参加しました
  • イベント終了後、@zembutsu さんによるDockerコンテナ開発入門というセミナーがありました
  • 私は学生ではありませんが、参加してもよいとのことでしたので、Dockerについて基礎から学ばせていただきました
    • ありがとうございました!

Hacobune(β版)ドキュメント に従って設定を進めます

  • アプリケーションの設定は以下のような感じです

スクリーンショット 2021-08-21 21.17.07.png

  • アプリケーション名は、小文字から始める必要があるようです
  • ポートは、8080にします
  • 環境変数LIVEBOOK_PASSWORDは、公式の通りに設定をしました
  • 環境変数LIVEBOOK_PORTを設定しておかないと以下のエラーがでました
    • コンソールの「アプリケーションログ」から確認しました
ERROR!!! [Livebook] expected LIVEBOOK_PORT to be an integer, got: "tcp://10.233.58.201:8080"
  • リソースはスタンダード(CPU 1 core、メモリ 2GB)を選びました

Run

イゴかし方

Explore

  • いろいろ探検してください!
  • Elixir and Livebookがわかりやすいかとおもいます
  • プログラムが書いてあるところにカーソルをあわせると、Evaluateというボタンがでてきますので、迷わず押してみてください
  • Elixirのプログラムが実行されて結果が表示されます
  • Elixirを楽しんでください!!!

スクリーンショット 2021-08-21 21.27.27.png

New notebook

  • 今度は自分でElixirのプログラムを書いてみましょう
  • 右上にNew notebookという青のボタンがあります
  • 適当にポチポチおしていくとElixirのプログラムが書けます

Qiita API

  • Elixirタグのついた最新記事を20件取得して、そのタイトルの一覧を表示してくれます
Mix.install([
  {:httpoison, "~> 1.8"},
  {:jason, "~> 1.2"}
])

"https://qiita.com/api/v2/items?query=tag:Elixir"
|> HTTPoison.get!()
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& &1["title"])

グラフ表示

  • メモリ使用量をグラフに書いてみます
  • 3つのパートにわけて、Elixirのプログラムを書いてみましょう
Mix.install([
  {:kino, "~> 0.3.0"},
  {:vega_lite, "~> 0.1.0"}
])

alias VegaLite, as: Vl

memory = [
  total: :red,
  processes: :yellow,
  atom: :green,
  binary: :pink,
  code: :orange,
  ets: :blue
]

layers = 
  for {layer, color} <- memory do
    Vl.new()
    |> Vl.mark(:line)
    |> Vl.encode_field(:x, "iteration", type: :quantitative)
    |> Vl.encode_field(:y, Atom.to_string(layer), type: :quantitative, title: "Memory usage (MB)")
    |> Vl.encode(:color, value: color, datum: Atom.to_string(layer))
  end

widget = Vl.new(width: 500, height: 200)
  |> Vl.layers(layers)
  |> Kino.VegaLite.new()
Kino.VegaLite.periodically(widget, 200, 0, fn i ->
  point =
    :erlang.memory()
    |> Enum.map(fn {type, bytes} -> {type, bytes / 1_000_000} end)
    |> Map.new()
    |> Map.put(:iteration, i)

  Kino.VegaLite.push(widget, point, window: 1000)
  {:cont, i + 1}
end)
for i <- 1..1_000_000 do
  :"atom#{i}"
end
  • Evaluateするとこんなグラフが表示されます

スクリーンショット 2021-08-21 22.02.07.png

Wrapping Up :lgtm::lgtm::lgtm::lgtm::lgtm:

6
3
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
6
3