読者です 読者をやめる 読者になる 読者になる

万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

モトスミHack #76 もくもく会

URL http://connpass.com/event/22061/

ドットインストールのRails 4のを見ながらElixir/Phoenixやってみる。

・ドットインストール http://dotinstall.com/lessons/basic_rails_v2/

Elixir は ErlangVM上で動くプログラミング言語です。 Elixirのバージョン確認

> elixir -v
Elixir 1.0.5

mix・・・ビルド用のコマンド ※Rubyでいうgemとrakeみたいなもの?

バージョン確認

> mix help | grep phoenix
mix phoenix.new       # Create a new Phoenix v1.0.2 application

v1.0.2が入ってた。

mix phoenix.new --version

今(2015/11/01 Sun)は、1.0.3が最新。 ※最新版はここのリリースノートみるのがいい? https://github.com/phoenixframework/phoenix/releases/

ここ参考にアップデートした http://www.kaeruspoon.net/articles/1135

v1.0.2を一旦消す。

mix archive.uninstall phoenix_new-1.0.2.ez

そのままインストールするとエラーになるらしいのでダウンロードしてから入れる https://github.com/phoenixframework/phoenix/releases/download/v1.0.3/phoenix_new-1.0.3.ez を適当におとして(なぜかcurl -Oだとファイル壊れた)、

mix archive.install ./phoenix_new-1.0.3.ez

05 タスク管理アプリを作ってみよう

ゼロからタスク管理アプリを作ってみます。まずはModelの設定を行っていきます

→01〜04は飛ばす

Project - Task

taskapp

新規作成

Railsコマンド

rails new taskapp --skip-bundle

Phoenixコマンド

mix phoenix.new taskapp

SQLiteにしたい場合、おそらくデフォルトはPostgreSQL

mix phoenix.new taskapp --database sqlite

新規作成

Railsコマンド

rails g model Project title
rake db:migrate

Phoenixコマンド

モデル名: Project テーブル名: projects

mix phoenix.gen.model Project projects title:string

したあと

mix ecto.migrateをする前に、

sqliteにしたいので、まず、mix.exsを以下のように編集

http://qiita.com/tatarou1986/items/5e1a8761809dc344ad0d を参考にした

def application do
  [applications: [:logger, :sqlite_ecto, :phoenix_ecto]]
end

# 新規作成時にsqliteのオプションを付けてもこれは必須かもしれない・・・
defp deps do
  [{:sqlite_ecto, "~> 1.0.2"}]
end

編集後依存関係の解決

mix deps.get

変なwarning出たが無視したw。

c_src/sqlite3.c:8863:26: warning: unused variable 'sqlite3one' [-Wunused-const-variable]
SQLITE_PRIVATE const int sqlite3one = 1;
mix ecto.migrate
(Mix) The task "compile.phoenix" could not be found.

ん?わからないのでとりあえずElixirをアップデート

アップデート

sudo brew update
sudo brew unlink elixir
sudo brew install elixir

Elixir 1.1.1にした!

しかし、

** (ArgumentError) raise/1 expects an alias, string or exception as the first argument, got: {:cantopen, 'unable to open database file'}
    (ecto) lib/ecto/pools/poolboy.ex:115: Ecto.Pools.Poolboy.do_checkout/4
    (stdlib) timer.erl:166: :timer.tc/1
    (ecto) lib/ecto/pools/poolboy.ex:82: Ecto.Pools.Poolboy.checkout/3
    (ecto) lib/ecto/pool.ex:169: Ecto.Pool.checkout/3
    (ecto) lib/ecto/pool.ex:156: Ecto.Pool.do_run/4
    (ecto) lib/ecto/adapters/sql.ex:244: Ecto.Adapters.SQL.query/6
    (ecto) lib/ecto/adapters/sql.ex:222: Ecto.Adapters.SQL.query/5
    (ecto) lib/ecto/adapters/sql.ex:183: Ecto.Adapters.SQL.query!/5
    (elixir) lib/enum.ex:1387: Enum."-reduce/3-lists^foldl/2-0-"/3
    lib/sqlite_ecto.ex:33: Sqlite.Ecto.execute_ddl/3
    (ecto) lib/ecto/migrator.ex:36: Ecto.Migrator.migrated_versions/1
    (ecto) lib/ecto/migrator.ex:134: Ecto.Migrator.run/4
    (ecto) lib/mix/tasks/ecto.migrate.ex:62: Mix.Tasks.Ecto.Migrate.run/2
    (mix) lib/mix/cli.ex:55: Mix.CLI.run_task/2
    (elixir) lib/code.ex:363: Code.require_file/2

DBがない? おそらくこれでDBを先に作る? mix ecto.createが何のコマンドかわからなかったがDBを作るコマンドのよう

> mix ecto.create
The database for Taskapp.Repo has been created.

再度

mix ecto.migrate
14:55:49.178 [info]  == Running Taskapp.Repo.Migrations.CreateProject.change/0 forward

14:55:49.178 [info]  create table projects

14:55:49.183 [info]  == Migrated in 0.0s

試しに起動

mix phoenix.server

いけた。

06 rails db/rails consoleを使おう

データベースやオブジェクトをインタラクティブに操作できるrails db/rails consoleコマンドの使い方について説明していきます。

→ 飛ばす

07 Controllerを作ってみよう

Controllerを作った後にルーティングの設定をしていきます。

08 Projectsの一覧を表示させよう

projects#indexアクションを作り、viewを作成することでProjectsの一覧を表示させます。

07と08を同時にやる actionは07では言ってないから。

コントローラを作ってみる

Railsコマンド

rails g controller Projects

projects#index相当も必要

Phoenixコマンド

mix phoenix.gen.controller projects index

と思ったが、

** (Mix) The task "phoenix.gen.controller" could not be found. Did you mean "phoenix.gen.html"?

deprecatedなのかな?警告通りのコマンドを参考に、

mix phoenix.gen.html project index

に置き換えた。

さっきのModelを上書きしたのだがそのまま上書きした。

mix ecto.migrate

変なエラー。

Compiled web/models/project.ex

== Compilation error on file web/controllers/project_controller.ex ==
** (CompileError) web/controllers/project_controller.ex:25: function project_path/2 undefined
    (stdlib) lists.erl:1337: :lists.foreach/2
    (stdlib) erl_eval.erl:669: :erl_eval.do_apply/6
    (elixir) lib/kernel/parallel_compiler.ex:100: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/8

https://chodounsky.net/2015/06/02/adding-ecto-model-in-phoenix-throws-path-slash-3-undefined/ を参考、

web/router.exに追加してみる。最後の方にやってみた。

  get "/", PageController, :index
  # Project追加
  resources "/project", ProjectController

resourcesのあとの文字列はURLであり、

フォルダ自体は「project」なので「projects」としてはダメ。

先ほどのコマンドでweb/controllers/project_controller.exにコントローラがあるようだ。 結局CRUDを作るscaffoldingだったかも??

mix ecto.migrate

が成功した。

mix phoenix.server

で起動しhttp://localhost:4000/projects/にアクセス。

テンプレートはここでいじる

web/templates/project/index.html.eex

10 共通テンプレートを編集しよう

共通テンプレートの編集方法、image_tagやlink_toの使い方について学びます。

web/templates/layout/app.html.eex

Projecr Euler

http://odz.sakura.ne.jp/projecteuler/