ラベル Phoenix の投稿を表示しています。 すべての投稿を表示
ラベル Phoenix の投稿を表示しています。 すべての投稿を表示
2016年9月28日水曜日

Elixir/Phoenixを何度もインストールする時に

少し前にインストールした、Elixir/Phoenixを再利用しようとしたら、動かないところがあったので、記事にします。

対応としては、mixphoenixをリインストールします。ただし、以前構築したphoenixは動かなくなることがあります。

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

以下は詳細です。

phoenix_ecto, phoenix_htmlのエラー

mixでプロジェクトを作成して、mix phoenix.serverしたところエラーが出ました。

mix phoenix.new prj --database mysql
cd prj
mix phoenix.server

依存性エラーが出ます。

== Compilation error on file lib/phoenix_ecto/html.ex ==
** (CompileError) lib/phoenix_ecto/html.ex:7: unknown key :model for struct Phoenix.HTML.Form
    (elixir) src/elixir_map.erl:185: :elixir_map."-assert_struct_keys/5-lc$^0/1-0-"/5
    (elixir) src/elixir_map.erl:62: :elixir_map.translate_struct/4

could not compile dependency :phoenix_ecto, "mix compile" failed. You can recompile this dependency with "mix deps.compile phoenix_ecto", update it with "mix deps.update phoenix_ecto" or clean it with "mix deps.clean phoenix_ecto"

mix.exsを以下のように変更したら依存性はOKになる。

{:phoenix_ecto, "~> 3.0"},
{:mariaex, ">= 0.0.0"},
{:phoenix_html, "~> 2.6"},

phoenixをリインストールしてOKならば、上記のようにリインストールする。 ただ、リインストールすると、当然古いphoenixプロジェクトは動かなくなることがある。

dev.exsの設定

つい忘れがちなconfig設定も行います。 localhostで動かないときは、netstat -an | grep 3306などで解放ホストとポートを確認すると良いです。 今回は、外部IPで開いていて、localhostでは通りませんでした。 mysqlクライアントからは、localhostで入れてもectoからはいけない時があります。

config :word_prj, WordPrj.Repo,
  adapter: Ecto.Adapters.MySQL,
  username: "XXX",
  password: "XXX",
  database: "XXXDB",
  hostname: "XXX.XXX.XXX.XXX",
  pool_size: 10

あとは、migrateして

MIX_ENV=dev mix ecto.migrate

起動します。

mix phoenix.server

ページを追加

ページ追加については同じコマンドで動きました。

# テンプレート作成
phoenix.gen.html Repos table col1:string col2:string
# DBにマイグレート
MIX_ENV=dev mix echo.migrate
# router追加
vi web/router.ex

 scope "/", Prj do
   pipe_through :browser # Use the default browser stack

   get "/", PageController, :index
   resources "/card", CardsController
 end
# サーバー起動
mix phoenix.server

今時、一つのサーバに複数のWEBアプリを入れることは稀なケースかと思いますが、一つのサーバに複数世代のphoenixを混在させる場合は注意が必要です。

2016年9月11日日曜日

Phoenix framework をDebianで試す

ElixirのRails風フレームワークPhoenix frameworkをDebianで試したときの手順です。

Nodejsのセットアップなど幾つか必要な手順があります。

こちらはDebianで試しましたが、apt-getが使えるubuntuでも基本動くと思います。

環境

Debian 8 jessie

参考記事

  • Phoenix 公式インストール手順
    http://www.phoenixframework.org/docs/installation
  • nodejs 公式インストール手順
    https://nodejs.org/en/download/
  • 日本語記事 Install elixir & phoenix framework
    http://qiita.com/oikyn/items/738fcad11549593111b9 Phoenix入門1 - Hello Phoenix
    http://ruby-rails.hatenadiary.com/entry/20151011/1444560106#phoenix-tutorial-1-insatall-phonix

nodejsのインストール

nodejsを使っているので事前にインストールしておきます。v5.0以上です。 公式のインストール手順を参考に、バイナリ設置でインストールしました。 パッケージ管理を使ってインストールもできます。

wget https://nodejs.org/dist/v5.10.1/node-v5.10.1-linux-x64.tar.xz
tar xvf node-v5.10.1-linux-x64.tar.xz
cd node-v5.10.1-linux-x64
sudo cp -p bin/* /usr/bin
sudo cp -p lib/* /usr/lib
sudo cp -p share/* /usr/share
which nodejs
which npm

inotify-toolsのインストール

サーバーを立ち上げた時にエラーが出る場合があります。

sudo apt-get install inotify-tools

Elixir/Phoenixのインストール

準備ができたのでElixir/Phoenixをインストールします。

Elixir

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
sudo apt-get update
sudo apt-get install esl-erlang
sudo apt-get install elixir

Hex

mix local.hex

Phoenix

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

Phoenixの起動

プロジェクト作成

mysqlを使用する場合は、--database mysqlが必要です。

また、事前にapt-get install mysql-serverでmysqlをインストールしておきます。

mix phoenix.new <prj> --database mysql

npmでセットアップ

cd <prj>
npm install

Phoenix起動

mix phoenix.server

[info] Running PhTest.Endpoint with Cowboy using http on port 4000
2016年8月4日木曜日

Elixir で Sinatra 風なマイクロフレームワーク

新しい言語でシンプルなWeb APIを作りたいとき、とりあえず、言語名+Sinatraで検索することがあります。

Elixrだと、Phoenixを使うほどでもないと思うときですね。

簡単なスクリプトでも、Elixirでは基本サーバープロセスを立ち上げてというアーキテクチャになりやすいので、REST APIをインターフェースとして使えると便利です。

Plug

Elixir公式プロジェクトのPlugをそのまま組み合わせて使う方法です。 Phoenix内部で使っていますし、安心して使えます。

詳細はここ

https://elixirschool.com/jp/lessons/specifics/plug/

Trot

上のPlugを使って、MicroWebFrameworkに仕上げたプロジェクトです。 Plugは組み合わせなどを考えないとですが、こちらはFrameworkに従って書くだけなので気軽に使えます。

詳細はここ

http://qiita.com/techno-tanoC/items/23e5d3d6ed54e0e23156

2016年7月31日日曜日

「超高速なJSON APIをElixirフレームワークのPhoenixでビルドしてテストしよう」のアップデート

「超高速なJSON APIをElixirフレームワークのPhoenixでビルドしてテストしよう」

上の記事は、Elixir/PhoenixでJSON APIを作るガイドです。

実際には、mixのタスクを使って作るのが効率的ですが、TDD的にテストコードを書いて、テストを通すようにコードを作っていくため、PhoenixでのJSON APIの扱いをステップバイステップで理解することができます。

↓こちらはmix タスクを使った例

http://qiita.com/FL4TLiN3/items/41ca80cdbfca1956ed78

↓こちらはバージョニングした例

http://qiita.com/5t111111/items/79b861349f0e1ffae1e9

ただ、現在Phoenixは活発に開発が進んでいるため、一部コードが動かなくなっています。

今回、以下のバージョンで動くようにしました。

% iex -v
Erlang/OTP 18 [erts-7.3] [source-d2a6d81] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

IEx 1.2.3
% mix -v
Mix 1.2.3
  defp deps do
    [{:phoenix, "~> 1.1.4"},
     {:postgrex, ">= 0.0.0"},
     {:phoenix_ecto, "~> 2.0"},
     {:phoenix_html, "~> 2.4"},
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:gettext, "~> 0.9"},
     {:cowboy, "~> 1.0"}]
  end

変更箇所

mix ecto migration

add/1 は廃止。型を指定する必要がある

priv/repo/migrations/XXX_create_contacts.exs

-      add :name
-      add :phone
+      add :name, :string
+      add :phone, :string

確認

$ psql -U postgres -W
# database確認
postgres# /l
# テーブル定義確認
postgres# /d table_name

transaction のエラー

以下のerrorが出る。

理由は、現行だとtest_helper.exsが自動でtransactionをスタートするコードになっている。

** (RuntimeError) cannot begin test transaction because we are already inside one

以下を削除する

test/controllers/contact_controller_test.exs

  setup do
    SQL.begin_test_transaction(Repo)

    on_exit fn ->
      SQL.rollback_test_transaction(Repo)
    end
  end

ConnCaseモジュールを使用する(test/support/conn_case.ex(自動生成))

test/controllers/contact_controller_test.exs

-  use ExUnit.Case, async: false
-  use Plug.Test
+  use HelloPhoenixConnCase, async: false
  alias HelloPhoenix.Contact
  alias HelloPhoenix.Repo
  alias Ecto.Adapters.SQL

Poison.encode!できない

Repo.insert の戻り値が{:ok, ...}で戻ってくるため、Poinson.encodeに失敗する

test/controllers/contact_controller_test.exs

       |> List.wrap
+      |> Enum.map(&(elem(&1, 1))) 
       |> Poison.encode!

controller内にplug :actionがあると、responseが重複する

以下のエラーが出る。

** (Plug.Conn.AlreadySentError) the response was already sent

原因はここ参考。 https://github.com/phoenixframework/phoenix/issues/888 http://stackoverflow.com/questions/32448308/phoenix-elixir-ejabberd-response-already-sent-error

plug :action を削除

HelloPhoenix.ContactController

-     plug :action

clean upについて

  • そのまま動きます。
  • 場所はtest_helper.ex, test/support/conn_case.exどちらでもOK
  • modelはテストケースで直接読み込んだ方がいいかもしれません

Elixir/Phoenixの活用方法としては、APIサーバーとしての利用がまず考えられると思います。

その入り口として、動かしてみたい方は参考にどうぞ

2016年7月24日日曜日

Elixir 1.3.1 を CentOS で yum install

最新の Elixir を CentOS 6/7 にインストールしたい

ググるとソースからビルドするという記事が出てきます。

調べてみると、以下の状況。

  • CentOS6(EPEL)は、Elixir入ってない。
  • CentOS7(EPEL)は、Elixir入ってるが、0.12.5(ドキュメントほとんどないし、開発環境が違いすぎる)。
  • Fedoraは、Elixir入っているて、yumでインストールできる。
  • CentOS6/7でも、ソースからなら、問題なく入る。

Fedoraで動いていれば、rpmを作り直せば、そのまま使えそうなので、作りました。 コンテナもいいですが、手に馴染んだ環境にサクッとyum installで入るのは魅力的ですよね。

すぐに使ってみたい方は、こちら。Fedora公式RPMホスティングサービスのCOPRを使いました。

# CentOS7
$ curl -OL https://copr.fedorainfracloud.org/coprs/ynishi/elixir/repo/epel-7/ynishi-elixir-epel-7.repo
$ mv ynishi-elixir-epel-7.repo /etc/yum.repos.d/
# CentOS6
$ curl -L https://copr.fedorainfracloud.org/coprs/ynishi/elixir/repo/epel-6/ynishi-elixir-epel-6.repo
$ mv ynishi-elixir-epel-7.repo /etc/yum.repos.d/
$ sudo yum install elixir

COPRのプロジェクトページ

https://copr.fedorainfracloud.org/coprs/ynishi/elixir/

CentOS7ので、公式のElixirをとにかく触ってみたい(Phoenixもmixもいらない)という方はこちら。

$ sudo yum install epel-release
$ sudo yum install elixir

一応mixも入るのですが、最新のmixに用意されてるタスクとは随分違っていて、最低限の状態です。

CentOS7の場合

基本的なやり方はここと同じです。 http://qiita.com/bellflower2015/items/d33ca026b7d9c626adc9

rpmを作る一般的なやり方はこちら。

https://blog.tnmt.info/2011/04/29/rpmbuild-for-beginner/ https://osdn.jp/magazine/14/01/10/090000/

COPRというサービスは、RPMソースをアップして、サーバ上でRPMビルドして、できたRPMをホスティングしてくれますので、作業用インスタンスで、ビルド・インストールの確認をして、できたRPMソースをアップしました。

COPRについてはこちら。

http://qiita.com/hnakamur/items/336758b1d9564b759d49

コマンドはまとめて、Githubにあげました。build.shの通りでできるはずです。

https://github.com/ynishi/elixir-rpm

Erlangのインストール

まずは、Erlangを入れます。これは、Fedoraの最新版ソースからそのままリビルドできました。

ビルド中にメモリ使用量が最大で1GBくらいまで行きました。 メモリ500MBくらいの一番安いインスタンスだと厳しかったです。 ビルド時間は1時間弱くらいでした。(GCPの共有CPUインスタンスで)

 CXX  x86_64-redhat-linux-gnu/wxe_funcs.o
 g++: internal compiler error: Killed (program cc1plus)
 Please submit a full bug report,
 with preprocessed source if appropriate.
 See <http://bugzilla.redhat.com/bugzilla> for instructions.
 make[3]: *** [x86_64-redhat-linux-gnu/wxe_funcs.o] Error 4
 make[3]: Leaving directory `/home/YutakaNishimura/rpmbuild/BUILD/otp-OTP-18.3.4.1/lib/wx/c_src'
 make[2]: *** [opt] Error 2
 make[2]: Leaving directory `/home/YutakaNishimura/rpmbuild/BUILD/otp-OTP-18.3.4.1/lib/wx'
 make[1]: *** [opt] Error 2
 make[1]: Leaving directory `/home/YutakaNishimura/rpmbuild/BUILD/otp-OTP-18.3.4.1/lib'
 make: *** [libs] Error 2
 エラー: /var/tmp/rpm-tmp.X8FB4G の不正な終了ステータス (%build)


RPM ビルドのエラー:
    /var/tmp/rpm-tmp.X8FB4G の不正な終了ステータス (%build)

インスタンス上でビルドできることを確認したら、COPRにFedoraのRPMソースを指定して、ビルドします。

Elixir

これもFedoraの最新版をほぼそのまま使えました。

ただ、現行のElixirのgitリポジトリは、Erlangのビルドツール rebar のバイナリが含まれていて、単体でビルドできるようになっています。

ですので、Elixirのgitリポジトリのビルド方法を使うことにしました。

そうするとLOCALEがUTF8でないという警告が出るので、LOCALE指定も追加しました。

こちらは、オリジナルで作ったRPMソースをWeb上にアップロードして、それをCOPR に指定しました。

こちらは5分くらいでビルドできました。

COPRでは、ビルドするときのyum レポジトリを外部リポジトリとして設定することで、EPELにない、rpmを読み込みます。

最初、Erlang用のレポジトリを作って、Elixirのリポジトリから呼び出してましたが、Elixirのリポジトリにまとめて入れておけば、ビルドもインストールも簡単になるので、一つにまとめました。

Cent OS7は以上です。

Cent OS6 の場合

Erlang

CentOS6と、Fedora/CentOS7との最大の違いはsystemdです。(Erlangのrpm ビルドを考えると)

結局、specファイルでsystemdがないバージョンは回避するようになっていたのですが、いくつか修正が必要でした。

  • makeのオプションにベタ書きされていた
  • empdのサービスファイルが全てのバージョンで使われてた

あと、erlang, elixir のtar.gzソースファイルを自分で設置する必要がありました。 その辺りも、build.shに残しました。

また、依存関係のrpmは、CentOS7では、Fedoraの最新rpmソースからまとめてインストールしていたのですが、CentOS6では、systemdがないため、インストールできませんでした。

そのため、一旦EPELのErlangをインストールしてからビルドしましたが、いくつか手動でパッケージを追加しました。

上記対応をして、ビルドしたRPMソースをCentOS7の時と同様にCOPRでビルドしました。

Elixir

CentOS7とほぼ同じものでうまくできました。 ただ、testの際に、改めてLOCALEを設定しないと、テストが通らず、インストール完了しませんでした。

上記修正して、同じくCOPRにアップしました。

今後

今回、必要なファイルだけのリポジトリを切って作りましたが、RPMの本元のリポジトリからフォークして作成した方が、今後の保守性を考えると良いと思います。

また、COPRは、今回初めて知りましたが、カスタムRPMを作って配布するプラットフォームとしては、かなり良いと思いました。

簡単に使えて、プレーンな環境でビルドしなおしているので、一定の動作は保証できるためです。

パッケージをメンテナンスしている方のおかげで、さっくりと使えるRPMができました。

2016年7月3日日曜日

Phoenix Routeの便利コマンド

PhoenixのRoutesについて、便利そうな機能を公式GUIDEから抜粋しました。

本家はこちら

Routesを確認する

Phoenixには、routeの設定を確認するツールがあります。

設定ファイル(web/router.ex)を確認するより有効なものが整理されてでてくるので、実際にどのように設定されたかを確認できます。

$ mix phoenix.routes
page_path GET / Prj.PageController :index
# /への全てのGETリクエストはPrj.PageControllerのindexを使うということ 

まだ、初回実行してない場合は、以下をまず実行します。

$ mix do deps.get, compile

Resourcesを使う

PhoenixのRouteは、HTTPアクセスをまとめて作るmacroを提供しています。

resourcesを使って以下のようなシンプルな設定をrouteに追記するだけで、各種HTTPアクセスに対応したルーティング設定ができます。

resource "/users", UserController

phoenix.routesの結果はこちらです

user_path  GET     /users           Prj.UserController :index
user_path  GET     /users/:id/edit  Prj.UserController :edit
user_path  GET     /users/new       Prj.UserController :new
user_path  GET     /users/:id       Prj.UserController :show
user_path  POST    /users           Prj.UserController :create
user_path  PATCH   /users/:id       Prj.UserController :update
           PUT     /users/:id       Prj.UserController :update
user_path  DELETE  /users/:id       Prj.UserController :delete

必要なメソッドのみ設定することも、:only, :exceptを使って実現できます。

2016年4月10日日曜日

Phoenixのtutorial

フレームワークをインストールしたら、一通りtutorialを試してみたくなると思います。
Phoenixのtutorialは、ネット上に充実したものがあるので、そのリンクをまとめました。
公式tutorialは英語ですが、1つずつ丁寧に説明してあり、コードもそのまま動くので、オススメです。

日本語

Phoenix入門

Phoenixを使ってChatアプリを作る
http://ruby-rails.hatenadiary.com/entry/20151011/1444560106

ElixirのRoR風フレームワークPhoenixのはじめ方

DB設定の仕方が詳しい
http://etc9.hatenablog.com/entry/2015/08/06/001906

超高速なJSON APIをElixirフレームワークのPhoenixでビルドしてテストしよう

REST Web APIを実装する。Phoenix上で開発する一連の流れがつかめて実践的。
http://postd.cc/testing-a-phoenix-elixir-json-api/

ここらで日本一わかりやすく「Phoenix + Webpack + React」を試してみようか

フロントエンドよりのtutorial。静的ページ、React連携など。
http://tech.donuts.ne.jp/articles/20

公式tutorial(英語)

アプリ起動(前回の起動までできてればOKだと思います)

http://www.phoenixframework.org/docs/up-and-running

ページを追加して、Hello, world してみる

http://www.phoenixframework.org/docs/adding-pages

ルーティング

http://www.phoenixframework.org/docs/routing
Written with StackEdit.
2016年4月7日木曜日

Elixir PhoenixFrameworkをdebian/ubuntuにインストールしました

最近話題のElixir & Phoenixをインストールしてみました。

Macの記事が多いので、debianで動かしてコマンドをまとめました。ubuntuでもほぼ動くと思います。
インストールした感じですが、とにかくインストール時間が短く快適でした。
いくつかエラーがでましたが、よい記事がいくつかあり、すぐに解決できました。感謝です。

興味のある方は、一度インストールしてみてはどうでしょうか。

環境

debian 8.3 Jessie
GCPで新規インスタンスを用意

参考記事

こちらを参考にしました。

nodejsのインストール

nodejsを使っているので事前にインストールしておきます。v5.0以上です。 公式のインストール手順を参考に、バイナリ設置でインストールしました。 パッケージ管理を使ってインストールもできます。
wget https://nodejs.org/dist/v5.10.1/node-v5.10.1-linux-x64.tar.xz
tar xvf node-v5.10.1-linux-x64.tar.xz
cd node-v5.10.1-linux-x64
sudo cp -p bin/* /usr/bin
sudo cp -pr lib/* /usr/lib
sudo cp -pr share/* /usr/share
which node
which npm

inotify-toolsのインストール

サーバーを立ち上げた時にエラーが出る場合があります。
sudo apt-get install inotify-tools

Elixir/Phoenixのインストール

準備ができたのでElixir/Phoenixをインストールします。

Elixir

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
sudo apt-get update
sudo apt-get install esl-erlang
sudo apt-get install elixir

Hex

mix local.hex

Phoenix

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

Phoenixの起動

プロジェクト作成

mysqlを使用しました
mix phoenix.new <prj> --database mysql

セットアップ

cd <prj>
npm install
# エラーがでたときはこれを実施: curl -0 -L http://npmjs.org/install.sh | sudo sh

起動

mix phoenix.server

# [info] Running PhTest.Endpoint with Cowboy using http on port 4000