ElixirImp/fukuoka.ex/kokura.exとLiveView JPの piacere です、ご覧いただいてありがとございます
昨夜、ラズパイでElixir/Nervesを動かすコラムを書いた後、
「もしかしたら、同じエッジAndroidスマホでも、Elixirって動かせるんじゃね?」
ってふと思い立ち、攻略していったところ、成功しました
今回は、そのノウハウをシェアします(あと、ひさびさに軽いノリです)
内容が、面白かったり、役に立ったら、「LGTM」よろしくお願いします
Advent Calendar、fukuoka.ex1位、Elixir2位達成ヽ(=´▽`=)ノ
fukuoka.ex Advent Calendar、Webテクノロジーカテゴリで堂々1位 … 各コラムぜひお読みください
https://qiita.com/advent-calendar/2020/fukuokaex
そして、プログラミング言語カテゴリは、1位がRust、2位がElixir、3位がGoとモダン言語揃い踏みでのトップ3、熱いネー
https://qiita.com/advent-calendar/2020/elixir
基本となる思考パターン
GCPやAWS、ラズパイの全てに共通する思考パターンが、
Ubuntuが動くプラットフォームなら、Elixirはカンタンに動かせる
という考え方です
これはAndroidスマホに関しても同様で、AndroidでUbuntuが動けば、Elixirの可能性が拓くワケです
そして、この背景にあるのが、Elixir公式サイトに書いているUbuntu版Elixirインストール記載です(なお日本語版サイトは情報が古いので、参考にしないようご注意ください … 早くアップデートして欲しい…)
https://elixir-lang.org/install.html
CentOS等のUbuntu以外のLinuxで、ここの手順でのElixirインストールをされた方はご存知かもですが、
Ubuntu以外のLinuxは、最新版のElixirが入らない(それもかなり古い…)
という困った状況なのですが、それがUbuntuの手順であれば、ほとんどタイムラグ無く、確実に最新版が入ります
また、asdf含むソースビルドでの最新版Elixirインストールは、コマンドの暗記がそもそも不可能で、面倒臭く、なんか環境が荒れた気分にもさせられるビルドツール群の導入※がツキモノなんですが、Ubuntuなら、それらも一切不要です ※注:そういうのお好きであれば止める理由は無いです
ちなみに、docker pullだと環境構築は統一できますが、メモリ食いなので、せっかくのElixir/Phoenixの軽量さ/低メモリ消費が台無しの部分はあります(Phoenixで大量アクセスを捌くときは、nginxすらムダにメモリ食う邪魔者なんで…)
なので、お金に任せて雑に展開したり、グロースの可能性があまり無いようなサービスならさておき、グロース余地が高い成長性あるサービスや、大量アクセスを扱うシステムで、GCPやAWS含む、Linux系本番環境作るときは、問答無用でUbuntuにしておけば、面倒事は一切無くなり、気持ちスッキリです
スケールアウトを楽にしたいなら、KubernetesでOKです
要するに、言いたいことは、
Ubuntuこそが、世界最強のコンテナです
宇宙空間を公転軌道するISS(国際宇宙ステーション)に行き、Ubuntu創生に目覚めたマーク・シャトルワースにみんな感謝しましょう … 彼は我々人類の頭痛のタネを、見事に取り払ってくれました
開発環境と本番環境を統一し、バージョン整合性に後で泣きたくないガチ派なら、macノートみたいな似て非なるものを使ってる場合では無く、Ubuntuノートに今すぐしましょう(特に、mix releaseやDistilleryでバイナリビルドリリースしたいんだ勢は絶対に)
どうやってAndroidスマホでUbuntuを動かすか?
ズバリ、「UserLAnd」というアプリで一発解決です
UserLAnd
https://play.google.com/store/apps/details?id=tech.ula&hl=ja&gl=US
スマホのGooglePlayで「UserLAnd」と検索し、インストールしたら、ユーザ登録などをするだけで、UbuntuがAndroidスマホ上で使えます
AndroidスマホでUbuntu動いた後は?
まずはElixirのインストール
それがAndroidスマホだろうが、タダのUbuntuです
上記した公式のElixirインストールを行ってください …
… と言いたいところだけど、esl-erlangのインストールでコケた
$ sudo apt install esl-erlang
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package esl-erlang is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package 'esl-erlang' has no installation candidate
まぁ、ここはおとなしく、esl無しのErlangを入れましょう
$ sudo apt install erlang
erlを起動した実機は、こんな感じです(ちなみに私のスマホは、フリスクサイズのラズパイZero WHより一回り大きいくらいの世界最小サイズです)
Erlangの細かいバージョンを確認します
$ sudo apt show erlang
Package: erlang
Version: 1:20.2.2+dfsg-1ubuntu2
…
んん?Erlang 20.2.2?
… Elixir 1.10以降が使えないでは無いか …
Release v1.10.0 · elixir-lang/elixir (Elixir 1.10はOTP 21以降が対象)
https://github.com/elixir-lang/elixir/releases/tag/v1.10.0
ま、たいした差では無いので、aptで入れられる最新版は早々に諦めて、Elixir 1.9系列の最も新しいプリコンパイルドバイナリをダウンロードしてインストールします
Release v1.9.4 · elixir-lang/elixir
https://github.com/elixir-lang/elixir/releases/tag/v1.9.4
$ mkdir elixir
$ cd elixir
$ sudo apt install wget unzip
$ wget https://github.com/elixir-lang/elixir/releases/download/v1.9.4/Precompiled.zip
$ unzip Precompiled.zip
$ sudo cp -a * /usr/local
iexを起動してみましょう
$ iex
Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:8:6] [ds:8:6:10] [async-threads:10]
[kernel-poll:false]
warning: the VM is running with native name encoding of latin1 which may cause Elixir to
malfunction as it expects utf8. Please ensure your locale is set to UTF-8 (which can be
verified by running "locale" in your shell)
Interactive Elixir (1.9.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
無事、起動し、Elixir 1.9.4がインストールされていることも確認できました
あとは、いつものElixirです … 存分にお楽しみください
次にPhoenixのインストール
この環境に、Phoneix 1.5.7自体はインストールできるけど、OTP 21前提のものがゴロゴロ入ってる(cowboy 2.8
LiveView、他にもあるかも)ので、LiveViewがバインドされていないPhoneix 1.4系の最新版を入れて、Phoenix PJを作成します
$ mix archive.install hex phx_new 1.4.17
$ mix phx.new sample --no-ecto --no-webpack
それから、cowboyのバージョンを2.7.0に固定します(固定しないとPhoneix 1.4.17でもcowboy 2.8が入ってしまう)
…
defp deps do
[
{:cowboy, "== 2.7.0"},
{:phoenix, "~> 1.5.4"},
…
その後、deps.getし直す前に、deps.unlockでバージョンロックを解除し、deps.getし、Phoenixを起動します
$ mix deps.unlock --all
$ mix deps.get
$ mix phx.server
ここまで出来たら、AndroidスマホのPhoenixを、PCや他スマホのブラウザで見れます
なお、スマホのグローバルIPは、ブロックされてて見れない可能性が高いので、無線LANなどに繋いで、同一無線LANセグメント内からだと見れます
最後に
とうとうスマホでElixir/Phoenixが動いてしまいました
これで、エッジ/エッジサーバ/クラウドを全てElixirにする野望に、スマホも仲間入りで、ますますエキサイティングなElixirライフが送れるというものです
それと、これでもうノートPCを持ち歩かなくても、スマホさえ持っていけば、Web開発可能になりますね(Bluetoothキーボード無いと厳しいけど)
余談
冒頭「Ubuntuノートに今すぐしましょう」の文脈からの続き
「WindowsでElixirしてるお前に言われたくない!」
…え?…うん、まぁ、そーだよね…
やー、だって私、MS信者歴38年の筋金入りですし、ElixirもWindows版は、Ubuntuと双璧を成す、常に最新バージョンがキレイに入るディストリ(?)だから難儀しないし
そもそも、「Windowsだとブチ当たる困難に立ち向かい、全て乗り越える」というドMプレイというか、縛りプレイに燃えてる節すら …
… つまり、言いたいことは、こういうことです