2016年8月31日水曜日

Elixirで構造体(Structs)

Elixir構造体(Structs)です。struct は、map 拡張とのこと。なんとなくわかる気がします。

defmodule User do
  defstruct [:firstname, :lastname, :age]

  def name(user) do
    "#{user.firstname} #{user.lastname}"
  end
end

User.name %User{firstname: "Hello", lastname: "World", age: 20}
"Hello World"

参考サイト
構造体 - Structs(Elixir)
Writing assertive code with Elixir(Plataformatec Blogさん)

2016年8月30日火曜日

「Phoenix」フレームワークで、Scaffold

Phoenix」フレームワークで、Scaffoldです。phoenix.gen.html コマンドで、コントローラー、モデル、ビュー、テンプレートと作成してくれます。

$ mix phoenix.gen.html User users name:string email:string bio:string number_of_pets:integer

$ mix ecto.migrate


参考サイト
Ecto Models(Phoenix)
RailsのscaffoldをPhoenixでやる(Qiita)
Mix.Tasks.Phoenix.Gen.Html(Phoenix)

2016年8月29日月曜日

「Phoenix」フレームワークで、チャンネル(Channels)

Phoenix」フレームワークで、チャンネル(Channels)です。チャットでリアルタイム通信するような部分で利用できるらしいです。ソースを見ても内容は全くわかりませんでしたが、サンプル通りに設定したら、見事に動きました。その面白さだけは理解できました。使いこなせたら、エキサイティングなこと間違いなし!

  • Socket Handlers
  • Channel Routes
  • Channels
  • PubSub
  • Messages
  • Topics
  • Transports
  • Transport Adapters
  • Client Libraries



参考サイト
Channels(Phoenix)
phoenix_chat_example(GitHub)

2016年8月28日日曜日

インテルが人工知能チップを開発

インテルが人工知能チップを開発するとのこと。この分野は、競争が激しくなりそうですね。
インテルは、プロセッサー「Xeon Phi(ジーオン・ファイ)」シリーズの新製品を来年発表する計画を明らかにした。 このシリーズはもともと科学技術計算アプリケーション向けだが、人工知能(AI)関連タスクの処理速度を向上させる機能を追加する。


参考サイト
インテル、人工知能チップを開発へ(ウォール・ストリート・ジャーナル)
グーグルがAIチップを開発 インテル、エヌヴィディアは駆逐される?(Market Hack)

2016年8月27日土曜日

PHPでCronジョブを管理する「Crunz」

PHPでCronジョブを管理する「Crunz」 プログラム側で柔軟に定期ジョブを管理できますので、使い勝手は良いかなと思います。ただし、Cron自体の設定は毎分起動する設定になります。ちょっと違和感があるかも? とにかく、メモです。

* * * * * /project/vendor/bin/crunz schedule:run

2016年8月26日金曜日

「Phoenix」フレームワークで、ディフォルトのレイアウト指定

Phoenix」フレームワークで、ディフォルトのレイアウト指定です。plug :put_layout として指定すると、コントローラー内で共通のレイアウトが利用できます。

/web/controllers/hello_controller.ex
defmodule HelloPhoenix.HelloController do
  use HelloPhoenix.Web, :controller

  plug :put_layout, "admin.html"

  def index(conn, _params) do
    render conn, "index.html"
  end

  def test(conn, _params) do
    render conn, "test.html"
  end
end
参考サイト
Function Plugs(Phoenix)
Proper way to use different Layouts for Templates in Phoenix(Stack Overflow)

2016年8月25日木曜日

「Phoenix」フレームワークで、サニタイジング

Phoenix」フレームワークで、サニタイジングです。ディフォルトでエスケープされるとのこと。安心ですね。

/web/templates/page/index.html.eex
<%= "<hello>" %>

<%= html_escape("<hello>") %>

<%= raw "<hello>" %>
参考サイト
More About Views(Phoenix)
Phoenix.HTML

2016年8月24日水曜日

「Phoenix」フレームワークで、URLの生成

Phoenix」フレームワークで、URLの生成です。Railsで言うところのurl_formix phoenix.routes コマンドで、ルートの確認をしながら設定すると、わかりやすいです。

/web/templates/page/index.html.eex
<a href="<%= page_path @conn, :index %>">index</a>
<a href="<%= user_path @conn, :index %>">user_index</a>
<a href="<%= user_path @conn, :show, 1 %>">user_show</a>
<a href="<%= admin_user_path @conn, :index %>">admin_user_index</a>

参考サイト
Views(Phoenix)
「Phoenix」フレームワークでルーティング(Routing)その2

2016年8月23日火曜日

「Phoenix」フレームワークで、テンプレートで変数の有無をチェック

Phoenix」フレームワークで、テンプレートで変数の有無をチェックする方法です。

if assigns[:(変数名)] do

else

end

こんな感じで、判定できます。

/web/controllers/hello_controller.ex
def index(conn, _params) do
  conn
  |> assign(:page_title, "こんにちは世界")
  |> render("index.html")
end
/web/templates/layout/app.html.eex(タイトルが設定されていれば、Titleタグ内に表示する例)
<%= if assigns[:page_title] do %>
  <title><%= @page_title %> - 実験サイト</title>
<% else %>
  <title>実験サイト</title>
<% end %>

参考サイト
How do i check if a variable exist, in eex? - (Stack Overflow)

2016年8月22日月曜日

Elixirで文字列の連結(Enum.join)

Elixir文字列の連結(Enum.join)です。何もわかっちゃいないので、初歩の初歩からです。

join(要素, 区切り)
iex> Enum.join([1, 2, 3])
"123"

iex> Enum.join([1, 2, 3], " = ")
"1 = 2 = 3"

iex> Enum.join(["Hello", "world"], " ")
"Hello world"

参考サイト
Enum(Elixir)
Elixir の Enum メモ(Qiita)

2016年8月21日日曜日

Microsoftが「PowerShell」をオープンソース化

Microsoftが「PowerShell」をオープンソース化しました。Ubuntu 16.04、Ubuntu 14.04、CentOS 7、OS XなどのOSをサポートしています。既存のツールを扱うことができ、構造化されたデータ(Json、CSV、XMLなど)、REST API、オブジェクトモデルなどを扱うために最適化されています。



参考サイト
マイクロソフト、「PowerShell」をオープンソース化--アルファ版を「GitHub」上で公開(ZDNet Japan)
PowerShell/PowerShell(GitHub)

2016年8月20日土曜日

JavaScriptフレームワーク「Aurelia」1.0がリリース

JavaScriptフレームワーク「Aurelia」1.0がリリースされました。Aurelia(オーレリア?)は、モバイル、デスクトップ、ウェブ用のJavaScriptクライアントフレームワークです。





参考サイト
未来を見据えたAurelia JavaScriptフレームワークの1.0がリリース(InfoQ)

2016年8月19日金曜日

「Phoenix」フレームワークで、コンテンツタイプ(Content-Type)

Phoenix」フレームワークで、コンテンツタイプ(Content-Type)です。XML形式のレスポンスを返す例です。

/web/controllers/hello_controller.ex
  def index(conn, _params) do
    conn
    |> put_resp_content_type("text/xml")
    |> send_resp(200, "<?xml version=\"1.0\" ?><catalog><book id=\"1\"><title>Developer's Guide</title><genre>Computer</genre></book></catalog>")
  end

参考サイト
Setting the Content Type(Phoenix)

2016年8月18日木曜日

「Phoenix」フレームワークで、カスタム404ページ

Phoenix」フレームワークで、カスタム404ページです。ディフォルトの404ページはそっけないので、変更したいところ。

/config/dev.exs(設定ファイルで、デバックモードを解除)
config :hello_phoenix, HelloPhoenix.Endpoint,
  http: [port: 4000],
  debug_errors: false,
  code_reloader: true,
  cache_static_lookup: false,
/web/views/error_view.ex(エラービューでの出力設定を変更)
  def render("404.html", _assigns) do
    # "Page not found"
    render("not_found.html", %{})
  end
/web/templates/error/not_found.html.eex(エラーテンプレートを準備)
<h2>404 - Page Not Found</h2>

参考サイト
The ErrorView(Phoenix)
Making a custom 404 page with Phoenix(Learning with JBさん)

2016年8月17日水曜日

「Phoenix」フレームワークでリダイレクト(redirect)

Phoenix」フレームワークでリダイレクト(redirect)です。

redirect(conn, opts)
サイト内(to:
def index(conn, _params) do
  redirect conn, to: "/hello/world"
end
外部サイト(external:
def index(conn, _params) do
  redirect conn, external: "http://elixir-lang.org/"
end

参考サイト
Redirection(Phoenix)
Phoenix.Controller(Phoenix)

2016年8月16日火曜日

「Phoenix」フレームワークでレイアウトの変更(Layout)

Phoenix」フレームワークでレイアウトの変更(Layout)です。put_layout で指定できます。

put_layout(conn, layout)
/web/controllers/hello_controller.ex
(レイアウトなし)
defmodule HelloPhoenix.HelloController do
  use HelloPhoenix.Web, :controller

  def index(conn, _params) do
    conn
    |> put_layout(false)
    |> render "index.html"
  end
end
(レイアウト指定 admin.html.eex)
defmodule HelloPhoenix.HelloController do
  use HelloPhoenix.Web, :controller

  def index(conn, _params) do
    conn
    |> put_layout("admin.html")
    |> render("index.html")
  end
end

参考サイト
Assigning Layouts(Phoenix)
Phoenix.Controller(Phoenix)

2016年8月15日月曜日

「Phoenix」フレームワークでビューへの出力変数割当て(assign)

Phoenix」フレームワークでビューへの出力変数割当て(assign)です。Plug.Conn.assign を利用して、変数を割り当てます。Phoenix.Controller は、Plug.Conn モジュールを読み込むので、assign のみで利用できるとのこと。

assign(conn, key, value)
/web/controllers/hello_controller.ex
defmodule HelloPhoenix.HelloController do
  use HelloPhoenix.Web, :controller

  def index(conn, _params) do
    conn
    |> assign(:message, "こんにちは、")
    |> assign(:name, "世界")
    |> render("index.html")
  end
end
/web/templates/hello/index.html.eex
<%= @message %> <%= @name %> 

参考サイト
Rendering(Phoenix)
Plug.Conn(Plug)

2016年8月14日日曜日

モーショングラフィックス用JavaScriptライブラリ「mo.js」

モーショングラフィックス用JavaScriptライブラリ「mo.js」 動作が軽快でなめらか。用意されているAPIを組み合わせることで、かなり複雑な動きを実装できます。



参考サイト
legomushroom/mojs(GitHub)

2016年8月13日土曜日

BSDとLinux用の軽量デスクトップ環境「Lumina Desktop Environment」

BSDとLinux用の軽量デスクトップ環境「Lumina Desktop Environment」 ルミナデスクトップは、他のデスクトップ環境よりも少ない依存性で構成できるように設計されていて、非常に軽量です。GNOMEKDEが重いと感じたら、試してみるべきかもしれません。各OSへのインストール方法はこちら



参考サイト
初のオフィシャルリリース、Lumina Desktop 1.0登場(マイナビニュース)

2016年8月12日金曜日

「Phoenix」フレームワークでレンダリング(Rendering)

Phoenix」フレームワークでレンダリング(Rendering)です。text を利用すると文字列が出力され、json を使うと、JSON形式で出力されます。render を使うとテンプレートに出力されます。

/web/controllers/hello_controller.ex
text(conn, data)
def show(conn, %{"id" => id}) do
  text conn, "Showing id #{id}"
end
json(conn, data)
def show(conn, %{"id" => id}) do
  json conn, %{id: id}
end
render(conn, template_or_assigns)
render(conn, template, assigns)
render(conn, view, template, assigns)
def show(conn, %{"id" => id}) do
  render conn, "show.html", id: id
end

参考サイト
Rendering(Phoenix)

2016年8月11日木曜日

Elixirでコメントアウト

Elixirでコメントアウトです。

defmodule MyModule
  def foo do
    # コメント行
    a = "new code"
  end

  def bar do
    """
    コメント行複数
    コメント行1
    コメント行2
    """
    a = "new code"
  end
end

参考サイト
Is there any way to comment out line(s) of code in function in Elixir(Stack Overflow)

2016年8月10日水曜日

「Phoenix」フレームワークでフラッシュメッセージ(Flash Messages)

Phoenix」フレームワークでフラッシュメッセージ(Flash Messages)です。

  • put_flash(設定)
  • get_flash(読み込み)
  • clear_flash(クリア)

/web/controllers/page_controller.ex
defmodule HelloPhoenix.PageController do
  use HelloPhoenix.Web, :controller

  def index(conn, _params) do
    conn
    |> put_flash(:info, "ようこそ Phoenix!")
    |> put_flash(:error, "エラーです。")
    |> render("index.html")
  end
end
/web/templates/layout/app.html.eex
<p class="alert alert-info" role="alert"><%= get_flash(@conn, :info) %></p>
<p class="alert alert-danger" role="alert"><%= get_flash(@conn, :error) %></p>

参考サイト
Controllers(Phoenix)

2016年8月9日火曜日

「Phoenix」フレームワークでプラグ(Plug)

Phoenix」フレームワークでプラグ(Plug)です。さあ、わからなくなってきました。こういうものがあると受け入れて、深く考えずに次に進むしかありません。
プラグは、Webアプリケーションの構成モジュールの仕様です。 また、Webサーバの接続アダプタの抽象化層でもあります。 プラグの基本的な考え方は、「接続」の概念を統一することです。 これは、リクエストとレスポンスがミドルウェアに分離されるような、HTTPミドルウェア層のRackなどとは異なります。

プラグには function plugs と module plugs の2種類があります。
/web/router.ex
defmodule HelloPhoenix.Plugs.Locale do
  import Plug.Conn
  @locales ["en", "fr", "de"]

  def init(default), do: default
  def call(%Plug.Conn{params: %{"locale" => loc}} = conn, _default) when loc in @locales do
    assign(conn, :locale, loc)
  end
  def call(conn, default), do: assign(conn, :locale, default)
end

defmodule HelloPhoenix.Router do
  use HelloPhoenix.Web, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
    plug HelloPhoenix.Plugs.Locale, "en"
  end

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

    get "/", PageController, :index
  end
end

参考サイト
Plug(Phoenix)
Rails と Rack(Ruby on Rails ガイド)

2016年8月8日月曜日

「Phoenix」フレームワークでルーティング(Routing)その2

Phoenix」フレームワークでルーティング(Routing)その2です。resources で指定すると、CRUDのURLをすべて用意してくれます。更に、onlyexcept で細かく制御が可能。また、scope を利用すると、URLをまとめて管理することができます。

/web/router.ex
scope "/", HelloPhoenix do
  pipe_through :browser # Use the default browser stack

  get "/", PageController, :index
  resources "/users", UserController do
    resources "/posts", PostController, only: [:index, :show]
    resources "/comments", CommentController, except: [:delete]
  end
end

scope "/admin", HelloPhoenix.Admin, as: :admin do
  pipe_through :browser

  resources "/images",  ImageController
  resources "/reviews", ReviewController
  resources "/users",   UserController
end
コントローラーが存在しなくても、ルートの確認はできます。
$ mix phoenix.routes

        page_path  GET     /                                  HelloPhoenix.PageController :index
        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
   user_post_path  GET     /users/:user_id/posts              HelloPhoenix.PostController :index
   user_post_path  GET     /users/:user_id/posts/:id          HelloPhoenix.PostController :show
user_comment_path  GET     /users/:user_id/comments           HelloPhoenix.CommentController :index
user_comment_path  GET     /users/:user_id/comments/:id/edit  HelloPhoenix.CommentController :edit
user_comment_path  GET     /users/:user_id/comments/new       HelloPhoenix.CommentController :new
user_comment_path  GET     /users/:user_id/comments/:id       HelloPhoenix.CommentController :show
user_comment_path  POST    /users/:user_id/comments           HelloPhoenix.CommentController :create
user_comment_path  PATCH   /users/:user_id/comments/:id       HelloPhoenix.CommentController :update
                   PUT     /users/:user_id/comments/:id       HelloPhoenix.CommentController :update
 admin_image_path  GET     /admin/images                      HelloPhoenix.Admin.ImageController :index
 admin_image_path  GET     /admin/images/:id/edit             HelloPhoenix.Admin.ImageController :edit
 admin_image_path  GET     /admin/images/new                  HelloPhoenix.Admin.ImageController :new
 admin_image_path  GET     /admin/images/:id                  HelloPhoenix.Admin.ImageController :show
 admin_image_path  POST    /admin/images                      HelloPhoenix.Admin.ImageController :create
 admin_image_path  PATCH   /admin/images/:id                  HelloPhoenix.Admin.ImageController :update
                   PUT     /admin/images/:id                  HelloPhoenix.Admin.ImageController :update
 admin_image_path  DELETE  /admin/images/:id                  HelloPhoenix.Admin.ImageController :delete
admin_review_path  GET     /admin/reviews                     HelloPhoenix.Admin.ReviewController :index
admin_review_path  GET     /admin/reviews/:id/edit            HelloPhoenix.Admin.ReviewController :edit
admin_review_path  GET     /admin/reviews/new                 HelloPhoenix.Admin.ReviewController :new
admin_review_path  GET     /admin/reviews/:id                 HelloPhoenix.Admin.ReviewController :show
admin_review_path  POST    /admin/reviews                     HelloPhoenix.Admin.ReviewController :create
admin_review_path  PATCH   /admin/reviews/:id                 HelloPhoenix.Admin.ReviewController :update
                   PUT     /admin/reviews/:id                 HelloPhoenix.Admin.ReviewController :update
admin_review_path  DELETE  /admin/reviews/:id                 HelloPhoenix.Admin.ReviewController :delete
  admin_user_path  GET     /admin/users                       HelloPhoenix.Admin.UserController :index
  admin_user_path  GET     /admin/users/:id/edit              HelloPhoenix.Admin.UserController :edit
  admin_user_path  GET     /admin/users/new                   HelloPhoenix.Admin.UserController :new
  admin_user_path  GET     /admin/users/:id                   HelloPhoenix.Admin.UserController :show
  admin_user_path  POST    /admin/users                       HelloPhoenix.Admin.UserController :create
  admin_user_path  PATCH   /admin/users/:id                   HelloPhoenix.Admin.UserController :update
                   PUT     /admin/users/:id                   HelloPhoenix.Admin.UserController :update
  admin_user_path  DELETE  /admin/users/:id                   HelloPhoenix.Admin.UserController :delete
参考サイト
Routing(Phoenix)

2016年8月7日日曜日

2016年8月6日土曜日

MicrosoftがJavaScriptエンジンの「ChakraCore」をNode.jsの基盤として使えるようにする?

MicrosoftがJavaScriptエンジンの「ChakraCore」をNode.jsの基盤として使えるようにする動きを見せているとのこと。Microsoftは、実験的な実装だとしながらも、Node.jsのJavaScriptエンジンとしてChakraCoreを利用する「Node-ChakraCore」のLinux用プレビュー版と、Linux用とMac OS用に実装したChakraCoreランタイムを公開したそうです。興味深いですねぇ!



参考サイト
MicrosoftはChakraをオープンソースにしてNode.jsを実行しようとしている(InfoQ)
米MSが自前JavaScriptエンジンに本腰 V8に対抗(Computerworld)

2016年8月5日金曜日

「Phoenix」フレームワークでテンプレート(Template)

Phoenix」フレームワークでテンプレート(Template)です。個々のデザインページには、レイアウト継承などの指定がないので、非常にすっきりしています。

/web/templates/layout/app.html.eex(レイアウト)
<body>
  <div class="container">
    <p class="alert alert-info" role="alert"><%= get_flash(@conn, :info) %></p>
    <p class="alert alert-danger" role="alert"><%= get_flash(@conn, :error) %></p>
    <main role="main">
      <%= render @view_module, @view_template, assigns %>
    </main>
  </div>
  <script src="<%= static_path(@conn, "/js/app.js") %>"></script>
</body>
/web/templates/hello/show.html.eex(個々のページのデザイン)
<div class="jumbotron">
  <h2>こんにちは、世界、from <%= @messenger %>!</h2>
</div>
参考サイト
Adding Pages(Phoenix)
Phoenix.Template – Phoenix

2016年8月4日木曜日

「Phoenix」フレームワークでビュー(View)

Phoenix」フレームワークでビュー(View)です。ビュー(View)を定義しているファイルが独立して存在しているのはユニークだなと思いました。テンプレート(Template)も存在しますが、こちらが、いわゆる広く認識されているビューの具体的なデザイン表示部分に当たるのかなと思います。

  • ビュー(View)-> 表示方法、表示先の定義
  • テンプレート(Template)-> 具体的なデザインの定義

/web/views/hello_view.ex
defmodule HelloPhoenix.HelloView do
  use HelloPhoenix.Web, :view
end

参考サイト
Adding Pages(Phoenix)
Phoenix.View – Phoenix
Elixir Atoms(Qiita)

2016年8月3日水曜日

「Phoenix」フレームワークでコントローラーの追加(Controller)

Phoenix」フレームワークでコントローラーの追加(Controller)です。こういうものだと、まずは慣れるしかないでしょう。

/web/controllers/hello_controller.ex
defmodule HelloPhoenix.HelloController do
  use HelloPhoenix.Web, :controller

  def index(conn, _params) do
    render conn, "index.html"
  end

  def show(conn, %{"messenger" => messenger}) do
    render conn, "show.html", messenger: messenger
  end
end

参考サイト
Adding Pages(Phoenix)
Phoenix.Controller – Phoenix

2016年8月2日火曜日

「Phoenix」フレームワークでルーティング(Route)

Phoenix」フレームワークでルーティング(Route)です。とりあえず、簡単なものだけですが、追加できました。

/web/router.ex
  scope "/", HelloPhoenix do
    pipe_through :browser # Use the default browser stack

    get "/", PageController, :index
    get "/hello", HelloController, :index
    get "/hello/:messenger", HelloController, :show
  end
mix phoenix.routes コマンドで、設定されているルートを確認できます。
$ mix phoenix.routes
Generated hello_phoenix app
 page_path  GET  /                  HelloPhoenix.PageController :index
hello_path  GET  /hello             HelloPhoenix.HelloController :index
hello_path  GET  /hello/:messenger  HelloPhoenix.HelloController :show

参考サイト
Adding Pages(Phoenix)
Phoenix.Router – Phoenix

2016年8月1日月曜日

「Phoenix」フレームワークの初期設定

Phoenix」フレームワークの初期設定です。エラー出過ぎ。泣けました。

$ mix phoenix.new hello_phoenix
$ cd hello_phoenix
$ mix ecto.create
$ mix phoenix.server
[error] Could not start node watcher because script "/home/vagrant/hello_phoenix/node_modules/brunch/bin/brunch" does not exist. 
Your Phoenix application is still running, however assets won't be compiled. 
You may fix this by running "npm install".
$ npm install
npm ERR! 404 'phoenix_html' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it
npm ERR! 404 It was specified as a dependency of 'hello_phoenix'
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, or http url, or git url.
$ node -v
v0.10.25
$ npm -v
1.4.21
Node.js のバージョンをあげたら、うまくいきました。
$ node -v
v4.4.2
$ npm -v
2.15.0

$ npm install
$ mix phoenix.server

参考サイト
Up And Running(Phoenix)
[Elixir][Phoenix]hello Phoenixを試す(tomohikoのブログさん)