万年素人からHackerへの道

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

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    モトスミ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/