やわらかテック

興味のあること。業務を通して得られた発見。個人的に試してみたことをアウトプットしています🍵

fukuoka.exさんのもくもく会にリモートで参加させて頂きました【Phoenix入門】

参加したもくもく会

以前から合同で勉強会をさせて頂いていたり、様々なことを教えて頂いているfukuoka.exさんのリモート勉強会に再び参加させて頂きました
名古屋には多くの勉強会があるとは言える状況ではないですが、リモートで接続可能な勉強会があるというのはありがたいことです

fukuokaex.connpass.com

また今回のもくもく会で以前よりtwitterでよしなにして頂いているElixirの先駆者piacereさんに初対面致しました

twitter.com

いつも「いいね、RT」頂きまして本当に有難うございます!!

今回も経験者トラックで参加しておりますが、選んだテーマはPhoenix入門
PhoenixでjsonAPIを作成したことはあるんですが、ページビュー含めて開発したいなと思ってこのテーマを選定
謎のエラーがでる & ほとんど清流elixirのメンバーと雑談しつつ、もくもくしていた(?)のであまり進めることは出来なかった

何とかphoenixのwelcome画面まで進めることが出来た

Phoenix大入門

いまさらながらPhoenixでプロジェクトを始めるまでの手順をまとめてみる
元々、elixirは自分の環境にインストール済みだったのでphoenixをインストールする(あれ、インストールしてたはずなんやが...)

$ mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez

無事にインストールが完了したっぽい

$ mix phx.new -v
Phoenix v1.3.4

さっそくプロジェクトを作成してみる
今回は以下の記事をもとにミニマムブログを作成してみる

qiita.com

プロジェクトの名前はmin_blogとした
コマンドを実行する

$ mix phx.new min_blog

お、色々と生成されて無事にプロジェクトが始められたっぽい

* creating test/config/config.exs
* creating test/config/dev.exs
* creating test/config/prod.exs
* creating test/config/prod.secret.exs
* creating test/config/test.exs
* creating test/lib/test/application.ex
* creating test/lib/test.ex
:
:
* creating test/assets/static/robots.txt
* creating test/assets/static/images/phoenix.png
* creating test/assets/static/favicon.ico

依存関係をインストールするかと聞かれているので「Y」と入力してお願いする
Yを選択すると

mix deps.get
:
mix deps.compile

のコマンドが走り、必要な外部ライブラリをDLしてくれる
DLが終了して「さぁPhoenixサーバーを立ち上げてくれよな」という文言が現れる

    $ cd min_blog

Then configure your database in config/dev.exs and run:

    $ mix ecto.create

Start your Phoenix app with:

    $ mix phx.server

You can also run your app inside IEx (Interactive Elixir) as:

    $ iex -S mix phx.server

言われる通りにコマンドを実行していく

$ cd min_blog
$ mix ecto.create

おや... 謎のerrorが...

** (Postgrex.Error) FATAL 28000 (invalid_authorization_specification): role "postgres" does not exist
    (db_connection) lib/db_connection/connection.ex:163: DBConnection.Connection.connect/2
    (connection) lib/connection.ex:622: Connection.enter_connect/5
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message: nil
State: Postgrex.Protocol
** (Mix) The database for MinimumBlog.Repo couldn't be created: FATAL 28000 (invalid_authorization_specification): role "postgres" does not exist

なんか怒られた
postgresqlはインストール済みであることを確認

$ psql --version
psql (PostgreSQL) 11.2

どうやら「postgres」というroleが生成されていないようなので急いで作成する

$ createuser -d postgres

再度、dbをcreateするためにコマンドを実行する
またエラーかい〜〜

$ mix ecto.create
warning: found quoted keyword "min_blog" but the quotes are not required. Note that keywords are always atoms, even when quoted. Similar to atoms, keywords made exclusively of Unicode letters, numbers, underscore, and @ do not require quotes
  mix.exs:57

The database for MinimumBlog.Repo has been created
➜  minimum_blog mix phx.server
warning: found quoted keyword "min_blog" but the quotes are not required. Note that keywords are always atoms, even when quoted. Similar to atoms, keywords made exclusively of Unicode letters, numbers, underscore, and @ do not require quotes
  mix.exs:57

warning: please add the following dependency to your mix.exs:

    {:plug_cowboy, "~> 1.0"}
:
:
[info] Application minimum_blog exited: MinimumBlog.Application.start(:normal, []) returned an error: shutdown: failed to start child: MinimumBlogWeb.Endpoint
    ** (EXIT) shutdown: failed to start child: Phoenix.Endpoint.Handler
        ** (EXIT) "plug_cowboy dependency missing"
** (Mix) Could not start application minimum_blog: MinimumBlog.Application.start(:normal, []) returned an error: shutdown: failed to start child: MinimumBlogWeb.Endpoint
    ** (EXIT) shutdown: failed to start child: Phoenix.Endpoint.Handler
        ** (EXIT) "plug_cowboy dependency missing"

あーこれは分かりやすいエラー。外部ライブラリが不足している様だ
./mix_blog/mix.exs/に以下を追加して再び外部ライブラリをDLする

defp deps do
    [
      :
      :
      {:cowboy, "~> 1.0"},
      {:plug_cowboy, "~> 1.0"}
    ]
  end
$ mix deps.get

3度目の正直。ecto.createを実行する

$ mix ecto.create
Generated min_blog app
The database for min_blog.Repo has been created

やったぜ。phoenixサーバーを立ち上げる

$ mix phx.server
[info] Running TestWeb.Endpoint with cowboy 2.6.3 at 0.0.0.0:4000 (http)
[info] Access TestWeb.Endpoint at http://localhost:4000

ようやくwelcome画面とご対面
f:id:takamizawa46:20190803144405p:plain:w700

ここまで長かった
docker-composeを使って楽すれば良かったと後悔

お知らせ

いつもお世話になっているfukuoka.exさんが小倉城という城(すごすぎ)をジャックして
ElixirConf JP 2019 Kokurajo~を開催されます

fukuokaex.connpass.com

私は現在お財布と予定とにらめっこ中です
会社からElixir関連では経費が落ちないそうです。くぅ~