2016年9月30日金曜日

ErlangのETS (Erlang Term Storage)とは?

ErlangETS (Erlang Term Storage)とは? ということで、何もわからなかったので、調べるだけ、調べてみました。いや~、Erlang、奥が深いです。己の無知を痛感せずにはいられません。精進するべし。

このモジュールは、Erlangの長期保存データ用の組み込み関数インタフェースです。 Erlangのランタイムシステム内で、データを大量に保存する機能を提供し、データへのアクセスが可能です。 (「ordered_set」の場合、アクセスは保存されたオブジェクトの数の対数に比例します。)

データは、タプルを格納できる動的テーブルのセットとして構成されています。 各テーブルは、プロセスによって作成されます。 プロセスが終了すると、テーブルは自動的に破棄されます。 各テーブルは、作成時に設定されたアクセス権を持っています。

テーブルは4つの異なるタイプ、「set」、「ordered_set」、「bag」、および「duplicate_bag」に分かれています。 「set」と「ordered_set」テーブルは、各キーに関連付けられた一つのオブジェクトを持つことができます。 「bag」とや「duplicate_bag」テーブルは、各キーに関連付けられている多くのオブジェクトを持つことができます。

1つのErlangノードに格納されるテーブルの数は限られています。 現在のデフォルト制限値は、約1,400テーブルです。 上限は、Erlangのランタイムシステムを起動する前に、環境変数「ERL_MAX_ETS_TABLES」を変更することによって増加させることができます。 実際の制限値は、指定された値よわずかに多いですが、決して制限値を下回ることはありません。

このテーブルには、自動ガベージコレクションが存在しないことに注意してください。 任意のプロセスからテーブルへの参照がない場合でも、オーナープロセスが終了しない限り、データは自動的に破棄されません。 明示的にテーブルを破棄するためには、「delete/1」関数を利用します。 デフォルトのデータ所有者は、テーブルを作成したプロセスです。 プロセスの終了時にテーブルの所有権を譲渡するには、オプション「heir」を使用するか、「give_away/3」を呼び出します。



参考サイト
Erlang Term Storage (ETS) (Elixir School)

2016年9月29日木曜日

「Phoenix」フレームワークでファイルのアップロード

Phoenix」フレームワークでファイルのアップロードです。Rails に似て、洗練されたシンプルなソースコード。美しい(笑)!

/web/templates/user/form.html.eex(multipart 設定して、入力にfile形式を指定)
<%= form_for @changeset, @action, [multipart: true], fn f -> %>
  <div class="form-group">
    <label>写真</label>
    <%= file_input f, :photo, class: "form-control" %>
  </div>
  <div class="form-group">
    <%= submit "登録", class: "btn btn-primary" %>
  </div>
<% end %>
/web/controllers/user_controller.ex
  def update(conn, %{"id" => id, "user" => user_params}) do

    IO.inspect user_params
    if upload = user_params["photo"] do
      extension = Path.extname(upload.filename)
      File.cp(upload.path, "/var/www/html/uploads/user-#{user.id}#{extension}")
    end

  end

参考サイト
File Uploads(Phoenix)
IO(Elixir)
Path(Elixir)
File(Elixir)

2016年9月28日水曜日

「Phoenix」フレームワークでMySQL

Phoenix」フレームワークでMySQLです。mariaex というモジュールを利用するらしい。名前だけ見ると、MariaDB用かなと思ってしまいます。

$ mix phoenix.new hello_phoenix --database mysql
mix.exs
  defp deps do
    [{:phoenix, "~> 1.2.0"},
     {:phoenix_pubsub, "~> 1.0"},
     {:phoenix_ecto, "~> 3.0"},
     {:mariaex, ">= 0.0.0"},
     {:phoenix_html, "~> 2.6"},
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:gettext, "~> 0.11"},
     {:cowboy, "~> 1.0"}]
  end
/config/dev.exs
# Configure your database
config :hello_phoenix, HelloPhoenix.Repo,
  adapter: Ecto.Adapters.MySQL,
  username: "root",
  password: "password",
  database: "hello_phoenix_dev",
  hostname: "localhost",
  pool_size: 10

参考サイト
Using MySQL(Phoenix)

2016年9月27日火曜日

Elixirのリリースバージョン管理「Exrm」

Elixirのリリースバージョン管理「Exrm」 組み込んでみましたが、うまくいかずに挫折。だましだまし進めてきましたが、Elixirを基本から勉強し直したほうが良いのかなと思ったりしています。



参考サイト
Exrm Releases(Phoenix)
exrm

2016年9月26日月曜日

「Phoenix」フレームワークをHerokuにデプロイ

Phoenix」フレームワークをHerokuにデプロイです。絶対に躓くと思っていたのですが、すんなりデプロイできてしまいました。自分が怖い(笑)。

環境変数は、System.get_env で取得することになるので、環境が変わっても、設定の変更は最小限で済みそうです。

/config/prod.exs
use Mix.Config

config :hello_phoenix, HelloPhoenix.Endpoint,
  http: [port: {:system, "PORT"}],
  url: [scheme: "https", host: "talkativepg-phoenix.herokuapp.com", port: 443],
  force_ssl: [rewrite_on: [:x_forwarded_proto]],
  cache_static_manifest: "priv/static/manifest.json",
  secret_key_base: System.get_env("SECRET_KEY_BASE")

# Do not print debug messages in production
config :logger, level: :info

# Configure your database
config :hello_phoenix, HelloPhoenix.Repo,
  adapter: Ecto.Adapters.Postgres,
  url: System.get_env("DATABASE_URL"),
  pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
  ssl: true
実際に設定してみたサイトがこちら

参考サイト
Heroku(Phoenix)

2016年9月25日日曜日

HerokuのようなIoT PaaS「Isaax」

HerokuのようなIoT PaaS「Isaax」 よくわかりませんが、面白いことになりそうです。注目のサービスでしょう。
IsaxxではJavaScript、Python、Ruby、PHP、Golang、C++のいずれかの言語の1つが使えれば、デバイスのアプリも含めて開発、デバッグ、ローンチ後のアップデートなどが可能です。


参考サイト
開発・デバッグ、数百デバイスへの反映も一発、HerokuのようなIoT PaaS「Isaax」が登場(TechCrunch Japan)

2016年9月24日土曜日

「TypeScript 2.0」がリリース

TypeScript 2.0」がリリースされました。
「TypeScript」は、Webで広く使われているプログラミング言語「JavaScript」へ静的型付け機能などを追加して、「JavaScript」が苦手としてきた大規模開発などの用途へ対応させた言語。ソースコードは「JavaScript」へコンパイル(変換)して利用する仕組みになっており、「JavaScript」をサポートする環境で広く利用することができる。


参考サイト
Microsoft、「TypeScript 2.0」を正式公開(窓の杜)

2016年9月23日金曜日

「Phoenix」フレームワークで、プロダクション環境立ち上げ

Phoenix」フレームワークで、プロダクション環境立ち上げです。開発環境と見た目はあまり変わらないような気がしますが、例えば、存在しないURLを入力すると、プロダクション環境では、きちんと404エラーが返ります。

# 依存パッケージの準備
$ mix deps.get --only prod
$ MIX_ENV=prod mix compile

# 静的ファイルの準備
$ brunch build --production
$ MIX_ENV=prod mix phoenix.digest

# DBのマイグレーション
$ MIX_ENV=prod mix ecto.migrate

# 立ち上げ(4001ポート)
$ PORT=4001 MIX_ENV=prod mix phoenix.server

参考サイト
DEPLOYMENT Introduction(Phoenix)
Mix.Tasks.Deps.Get(Mix)

2016年9月22日木曜日

JavaScriptのアニメーションライブラリ「anime.js」

JavaScriptのアニメーションライブラリ「anime.js」 滑らかで軽快な動きが実現できます。CSS、SVG、DOMやJSオブジェクトで動作します。



参考サイト
juliangarnier/anime(GitHub)

2016年9月21日水曜日

画像、JavaScript、CSS などの静的ファイルを管理する「Brunch」

画像、JavaScript、CSS などの静的ファイルを管理する「Brunch」 「Phoenix」フレームワークでは、ディフォルトで、Brunch を利用するということなので、慣れておくべし(?)。

$ sudo npm install -g brunch
$ brunch build --production
ファイルがコンパイルされて、/priv/static/ フォルダにファイルが出来上がる。設定ファイルは、brunch-config.js のはず(?)。



参考サイト
HANDLING OF YOUR APPLICATION SECRETS(Phoenix)
brunch/brunch(GitHub)

2016年9月20日火曜日

Erlangで書かれたウェブサーバー「Cowboy」

Erlangで書かれたウェブサーバー「CowboyPhoenixフレームワークを立ち上げると、立ち上がるので何なのかなと思っていましたが、ウェブサーバーでした。Websocketなんかも扱えるようです。

Running HelloPhoenix.Endpoint with Cowboy using http://localhost:4000


参考サイト
ninenines/cowboy(GitHub)
Phoenix Framework Guide をなんとなく訳してみた① Overview(Qiita)

2016年9月19日月曜日

Facebookが自社ストレージエンジンとMySQLを組み合わせた「MyRocks」

Facebookが自社ストレージエンジンとMySQLを組み合わせた「MyRocks」を発表しました。いろいろな世界がありますねぇ。
Facebooはすでにフラッシュストレージ向けのKey-Balueストア「RocksDB」をオープンソースで公開しているが、今回発表されたMyRocksは、RocksDBをMySQLのストレージエンジンとして統合するものとなる。RocksDBをバックエンドのストレージと利用しながらMySQLの機能を利用でき、アプリケーションはSQLやMySQLコネクタ経由でRocksDBストレージにアクセスできる。


参考サイト
MyRocks advantages over InnoDB(GitHub)
Facebook、新しいMySQL用ストレージエンジン「MyRocks」をオープンソースで公開。フラッシュに適したデータの書き込みと圧縮効果(Publickey)
米Facebook、自社ストレージエンジンとMySQLを組み合わせた「MyRocks」を発表(OSDN Magazine)
RocksDB

2016年9月18日日曜日

次期MySQLはバージョン8.0?

次期MySQLはバージョン8.0になるそうです。なんでそんなにバージョンが上がるのか、現時点では、意味がわからないですね(笑)。期待して待つしかなさそうです。
米オラクルが2016年9月18日より開催する年次イベント「Oracle OpenWorld 2016」のMySQL関連セッション予定を見ると、「What's new in MySQL 8.0」など「MySQL 8.0」と銘打たれたセッションを多数確認できます。次のバージョン番号が8.0になるのは確実です。


参考サイト
OSSデータベースのMySQLとPostgreSQLは「次の段階」へ進む(@IT)
MySQL 8.0: What's New(MySQL)

2016年9月17日土曜日

Angular 2.0 がリリース

Angular 2.0(Angular 2.0 Final Release)リリースされました。

「最終リリース(Final Release)とは」とは何を意味するのでしょうか?

安定性、生産性、小さいサイズ、およびパフォーマンスのために最適化されています。 事前コンパイラおよび遅延ロードで、ブラウザ、デスクトップ、モバイル環境間で最速、最小のアプリケーションを開発できますとのこと。



参考サイト
GoogleがAngular 2.0の最終リリースバージョンをローンチ、Reactからの移行もねらうか?(TechCrunch Japan)

2016年9月16日金曜日

「Phoenix」フレームワークで、モデルのテスト

Phoenix」フレームワークで、モデルのテストです。ドキュメントを参考に動かしてみました。

/test/models/user_test.exsuser_test.exs
defmodule HelloPhoenix.UserTest do
  use HelloPhoenix.ModelCase

  alias HelloPhoenix.User

  @valid_attrs %{bio: "some content some content some content", email: "some@content.com", name: "some content", number_of_pets: 42}
  @invalid_attrs %{}

  test "changeset with invalid attributes" do
    changeset = User.changeset(%User{}, @invalid_attrs)
    refute changeset.valid?
  end
  
  test "changeset with valid attributes" do
    changeset = User.changeset(%User{}, @valid_attrs)
    assert changeset.valid?
  end
  
  test "bio is not required" do
    changeset = User.changeset(%User{}, Map.delete(@valid_attrs, :bio))
    refute changeset.valid?
  end
  
  test "email is not required" do
    changeset = User.changeset(%User{}, Map.delete(@valid_attrs, :email))
    refute changeset.valid?
  end
  
  test "name is not required" do
    changeset = User.changeset(%User{}, Map.delete(@valid_attrs, :name))
    refute changeset.valid?
  end
  
  test "number_of_pets is not required" do
    changeset = User.changeset(%User{}, Map.delete(@valid_attrs, :number_of_pets))
    refute changeset.valid?
  end
  
  test "number_of_pets is less than 999" do
    attrs = %{@valid_attrs | number_of_pets: 9999}
    changeset = User.changeset(%User{}, attrs)
    refute changeset.valid?
  end
  
  test "number_of_pets is more than 0" do
    attrs = %{@valid_attrs | number_of_pets: -9}
    changeset = User.changeset(%User{}, attrs)
    refute changeset.valid?
  end
  
  test "bio must be at least 10 characters long" do
    attrs = %{@valid_attrs | bio: "content"}
    changeset = User.changeset(%User{}, attrs)
    refute changeset.valid?
  end
  
  test "email must contain at least an @" do
    attrs = %{@valid_attrs | email: "fooexample.com"}
    assert {:email, "無効な形式が含まれています"} in errors_on(%User{}, attrs)
  end
end

参考サイト
Models(Phoenix)

2016年9月15日木曜日

「Phoenix」フレームワークで、テスト(Testing)

Phoenix」フレームワークで、テスト(Testing)です。「test」フォルダ内に生成されるファイルを見ると、なんとなくどんなテストを行っているのかわかります。

/test/controllers/
/test/models/
/test/views/

$ mix test

$ mix test test/controllers/

$ mix test test/views/

$ mix test test/views/error_view_test.exs

参考サイト
Testing(Phoenix)

2016年9月14日水曜日

「Phoenix」フレームワークで、データのリレーション

Phoenix」フレームワークで、データのリレーションです。ユーザー(User)にビデオ(Video)データを追加しました。

$ mix phoenix.gen.model Video videos name:string approved_at:datetime description:text likes:integer views:integer user_id:references:users

$ mix ecto.migrate
/web/models/user.ex
defmodule HelloPhoenix.User do
  use HelloPhoenix.Web, :model

  schema "users" do
    field :name, :string
    field :email, :string
    field :bio, :string
    field :number_of_pets, :integer

    has_many :videos, HelloPhoenix.Video
    timestamps()
  end
end
/web/controllers/user_controller.ex
def index(conn, _params) do
  users = User |> Repo.all |> Repo.preload([:videos])
  render(conn, "index.html", users: users)
end

def show(conn, %{"id" => id}) do
  user = User |> Repo.get!(id) |> Repo.preload([:videos])
  render(conn, "show.html", user: user)
end
ウェブからアクセスしてみると、「videos」テーブルのSQLクエリが追加されているのがわかります。

参考サイト
Data Relationship and Dependencies(Phoenix)

2016年9月13日火曜日

ElixirでEctoにアクセス(delete)

ElixirEctoにアクセス(delete)です。少しづつ慣れてきたかな?

$ iex -S mix

# 削除するデータを取得
iex()> user = HelloPhoenix.Repo.get!(HelloPhoenix.User, 1)

# データを削除
iex()> HelloPhoenix.Repo.delete(user)

# これでも削除可能
iex()> HelloPhoenix.Repo.delete!(%HelloPhoenix.User{id: 1})

参考サイト
Ecto.Repo(Ecto)
chrismccord/phoenix-guides(GitHub)

2016年9月12日月曜日

ElixirでEctoにアクセス(update)

ElixirEctoにアクセス(update)です。更新する元データを変更データと掛けあわせて、チェンジセット(changeset)データに変更するところがミソです。

$ iex -S mix

# 更新する元データを取得
iex()> user = HelloPhoenix.Repo.get!(HelloPhoenix.User, 1)

# 更新するデータを定義
iex()> params = %{id: 1, name: "Sakura", email: "sakura@example.com", bio: "Sakura is a cool girl", number_of_pets: 20, updated_at: %Ecto.DateTime{year: 2016, month: 9, day: 12, hour: 22, min: 20, sec: 31}}

# チェンジセット(changeset)データに変更
iex()> update_user = HelloPhoenix.User.changeset(user, params)

# チェンジセット(changeset)データを更新
iex()> HelloPhoenix.Repo.update(update_user)

参考サイト
Ecto.Repo(Ecto)
chrismccord/phoenix-guides(GitHub)
「Phoenix」フレームワークの「チェンジセット(changeset)」とは?

2016年9月11日日曜日

統計解析向けのプログラミング言語「R言語」

統計解析向けのプログラミング言語「R言語」 興味をそそられたので、とりあえずメモです。

R言語はオープンソース・フリーソフトウェアの統計解析向けのプログラミング言語及びその開発実行環境である。


参考サイト
プログラマーのためのR言語入門(Qiita)
普通のSQLよりも150倍速いと謳ってるPeriscope Dataのさらに150倍の速さでサクッとRで分析してみた。(Qiita)
R言語(Wikipedia)

2016年9月10日土曜日

Google ChromeがHTTP接続を「Not secure」と表示

Google ChromeがHTTP接続を「Not secure」と表示するそうです。HTTPS化が、さらに加速しそうですね。

いずれ、Chromeで全てのHTTPページを安全でないページとみなし、アドレスバーのURLの前に、赤い文字で「Not secure」の警告マークを表示すると予告した。



参考サイト
Google、2017年1月から非セキュアな一部サイトに警告を表示(マイナビニュース)
Google、HTTPページに警告表示 まずはパスワード入力から(ITmedia)

2016年9月9日金曜日

ElixirでEctoにアクセス(insert)

ElixirEctoにアクセス(insert)です。

例1
struct型のデータで、データ型が合っていれば何でも登録できてしまう。バリエーションが働かない。
$ iex -S mix

# 登録データを定義
iex()> changeset = %HelloPhoenix.User{name: "Taro", email: "taro@example.com", bio: "Taro is a cool guy.", number_of_pets: 2, inserted_at: %Ecto.DateTime{year: 2016, month: 9, day: 9, hour: 22, min: 10, sec: 31}, updated_at: %Ecto.DateTime{year: 2016, month: 9, day: 9, hour: 22, min: 10, sec: 31}}

# データをインサート
iex()> HelloPhoenix.Repo.insert(changeset)

例2
チェンジセット(changeset)にデータを変換しているので、バリエーションが働く。
$ iex -S mix

# 登録データのモデルを用意
iex()> user = %HelloPhoenix.User{}

# 登録データデータを定義
iex()> param = %{name: "Jiro", email: "jiro@example.com", bio: "Jiro is a cool guy.", number_of_pets: 9999, inserted_at: %Ecto.DateTime{year: 2016, month: 9, day: 9, hour: 22, min: 40, sec: 31}, updated_at: %Ecto.DateTime{year: 2016, month: 9, day: 9, hour: 22, min: 40, sec: 31}}

# チェンジセット(changeset)データに変更
iex()> new_user = HelloPhoenix.User.changeset(user, param)

# チェンジセット(changeset)データをインサート
iex()> HelloPhoenix.Repo.insert(new_user)

参考サイト
Ecto.Repo(Ecto)
chrismccord/phoenix-guides(GitHub)
「Phoenix」フレームワークの「チェンジセット(changeset)」とは?
Elixirで構造体(Structs)

2016年9月8日木曜日

ElixirでEctoにアクセス

ElixirEctoにアクセスです。SQLクエリのログを確認しながら、いろいろ試せます。

$ iex -S mix

iex()> HelloPhoenix.Repo.all(HelloPhoenix.User)

iex()> HelloPhoenix.Repo.get(HelloPhoenix.User, 1)

iex()> HelloPhoenix.Repo.get(HelloPhoenix.User, 100)
nil

iex()> HelloPhoenix.Repo.get!(HelloPhoenix.User, 100)
** (Ecto.NoResultsError) expected at least one result but got none in query:

iex()> HelloPhoenix.Repo.get_by(HelloPhoenix.User, name: "test1")

参考サイト
Ecto.Repo(Ecto)
EctoをElixirから使う(Qiita)

2016年9月7日水曜日

HTTPの「PATCH」と「PUT」メソッド

HTTPの「PATCH」と「PUT」メソッドについてです。ルーティング(Routing)の部分で見過ごしていましたが、調べてみました。結局、よくわからなかったのですが、とにかくこういうメソッドがあるということだけ、認識しておこうと思います。

  • PUT - 全体を更新(?)
  • PATCH - 部分更新(Railsで言うところの「update_attributes」?)

user_path  GET     /users           HelloPhoenix.UserController :index
user_path  GET     /users/:id/edit  HelloPhoenix.UserController :edit
user_path  GET     /users/new       HelloPhoenix.UserController :new
user_path  GET     /users/:id       HelloPhoenix.UserController :show
user_path  POST    /users           HelloPhoenix.UserController :create
user_path  PATCH   /users/:id       HelloPhoenix.UserController :update
           PUT     /users/:id       HelloPhoenix.UserController :update
user_path  DELETE  /users/:id       HelloPhoenix.UserController :delete
/users/new
<form accept-charset="UTF-8" action="/users" method="post">
  <input name="_csrf_token" type="hidden" value="abcdefg==">
  <input name="_utf8" type="hidden" value="✓"> 

  <input class="btn btn-primary" type="submit" value="登録">
  </form>
/users/1/edit
<form accept-charset="UTF-8" action="/users/1" method="post">
  <input name="_method" type="hidden" value="put">
  <input name="_csrf_token" type="hidden" value="abcdefg==">
  <input name="_utf8" type="hidden" value="✓">  

  <input class="btn btn-primary" type="submit" value="登録">
</form>

参考サイト
PUT か POST か PATCH か?(Qiita)
HTTP メソッド、PUT と PATCH の違いをもっとくわしく知りたい(GitHub)

2016年9月6日火曜日

「Phoenix」フレームワークで、エラーメッセージの日本語化

Phoenix」フレームワークで、エラーメッセージの日本語化です。エラーメッセージを日本語訳した .po ファイルを用意してくれている殊勝な方がいらっしゃいます。これ(phoenix-locale_ja)を導入すれば、バリデーションのエラーメッセージが日本語化されます。ありがたい。

ダウンロードしたファイルをコピー
priv/gettext/ja/LC_MESSAGES/errors.po
config/config.exs(設定ファイルに追加)
config :hello_phoenix, HelloPhoenix.Gettext, default_locale: "ja"
その後、再起動。



参考サイト
hykw/phoenix-locale_ja(GitHub)
Gettextの使い方メモ(mmagさん)

2016年9月5日月曜日

「Phoenix」フレームワークで、バリデーション(Validations)

Phoenix」フレームワークで、バリデーション(Validations)です。よく使うものとしては、こんなところでしょうか?
  • validate_acceptance(changeset, field, opts \\ [])
  • validate_confirmation(changeset, field, opts \\ [])
  • validate_exclusion(changeset, field, data, opts \\ [])
  • validate_format(changeset, field, format, opts \\ [])
  • validate_inclusion(changeset, field, data, opts \\ [])
  • validate_length(changeset, field, opts)
  • validate_number(changeset, field, opts)
  • validate_required(changeset, fields, opts \\ [])

/web/models/user.ex
defmodule HelloPhoenix.User do
  use HelloPhoenix.Web, :model

  schema "users" do
    field :name, :string
    field :email, :string
    field :bio, :string
    field :number_of_pets, :integer

    timestamps()
  end

  @doc """
  Builds a changeset based on the `struct` and `params`.
  """
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:name, :email, :bio, :number_of_pets])
    |> validate_required([:name, :email, :bio, :number_of_pets])
    |> validate_length(:bio, min: 10)
    |> validate_length(:bio, max: 200)
    |> validate_inclusion(:number_of_pets, 1..100)
    |> validate_format(:email, ~r/@/)
  end
end

参考サイト
Changesets and Validations(Phoenix)
Ecto.Changeset(Ecto)
[Elixir+Phoenix]Ecto.ChangesetのValidate関数を使う(だるい@あぷれんてぃすさん)

2016年9月4日日曜日

Googleが、決済サービス「アンドロイドペイ(Android Pay)」を今秋にも開始

Googleが、決済サービス「アンドロイドペイ(Android Pay)」を今秋にも開始するそうです。日本市場にどれだけ食い込めるか、お手並み拝見ですねぇ。
アンドロイドペイは2015年秋の米国を皮切りに、英国やシンガポールなどでサービスが始まっている。事前にクレジットカードなどを登録すると、インターネット上の決済に使えるほか、実店舗でも読み取り機にスマホをかざして買い物をすることができる。




参考サイト
グーグル決済、日本でも秋開始 三菱東京UFJ銀と提携 (朝日新聞デジタル)
グーグルのスマホ決済、米で小売店が歓迎しない理由(ダイヤモンド・オンライン)

2016年9月3日土曜日

2016年9月2日金曜日

「Phoenix」フレームワークの「チェンジセット(changeset)」とは?

Phoenix」フレームワークの「チェンジセット(changeset)」とは? ということで調べてみました。
構造体(Structs)のデータを扱う際、フィルタリング(filtering)、キャスティング(casting)、検証(validation)、および制約(constraints)の定義を可能にします。

チェンジセット(changeset)は、モデルの作成と変更のために使用されます。 チェンジセットは、文字通り、一連のデータの変更内容を格納する構造体(Structs)とバリデーション(validation)ルールです。

チェンジセットは、現在、Ectoのモデルを更新するための唯一の方法です。

defmodule User do
  use Ecto.Schema
  import Ecto.Changeset

  schema "users" do
    field :name
    field :email
    field :age, :integer
  end

  def changeset(user, params \\ %{}) do
    user
    |> cast(params, [:name, :email, :age])
    |> validate_required([:name, :email])
    |> validate_format(:email, ~r/@/)
    |> validate_inclusion(:age, 18..100)
    |> unique_constraint(:email)
  end
end

参考サイト
What is a changeset in phoenix elixir(Stack Overflow)
Ecto.Changeset(Ecto)
Elixirで構造体(Structs)

2016年9月1日木曜日

Elixirで正規表現(Regex)

Elixir正規表現(Regex)です。

iex(1)> str = "user1@example.com"
"user1@example.com"
iex(2)> [email, username, host] = Regex.run(~r/(\w+)@([\w.]+)/, str)
["user1@example.com", "user1", "example.com"]
iex(3)> email
"user1@example.com"
iex(4)> username
"user1"
iex(5)> host
"example.com"

参考サイト
Regex(Elixir)
Elixir Regular Expressions(Qiita)
Elixir Email Regex(GitHub)