2016年10月31日月曜日

Elixirで、文字列連結演算子「<>」

Elixirで、文字列連結演算子「<>です。今まで、こんな連結方法は見たことがないです。独特ですね。

iex(1)>  "he" <> rest = "hello"
"hello"
iex(2)> rest
"llo"
iex(3)>
file_read = File.read "priv/contents/" <> param <> ".md"

参考サイト
Cowboy Tutorial Part 2: Creating Flat File Blog(ElixirDoseさん)
Binaries, strings and char lists(Elixir)

2016年10月30日日曜日

Java製ポータルサイト用オープンソース「Liferay」

Java製ポータルサイト用オープンソース「Liferay」 ポータルサイト構築では非常にメジャーな存在だそうで、知らずに恥ずかしい思いをしたのでメモです。かなりの重量級です。



参考サイト
liferay/liferay-portal(GitHub)

2016年10月29日土曜日

Node.js 7.0がリリース

Node.js 7.0がリリースされました。長期サポート版ではないため、サポートは、2017年6月程度までとのこと。


2016年10月28日金曜日

Elixirでファイルの読み込み(File.read)「(ArgumentError)」になる場合

Elixirでファイルの読み込み(File.read)です。なんで、argument errorになるんだろうと思いましたが、File.readFile.read! では、戻り値が違うんですね。目から鱗が落ちました。

$ iex -S mix

iex(1)> file_read = File.read "priv/contents/filename.md"
{:ok, "### Hello world!"}

iex(2)> marked = Markdown.to_html file_read
** (ArgumentError) argument error
    Markdown.to_html({:ok, "### Hello world!"}, [])
iex(2)> {:ok, file_read} = File.read "priv/contents/filename.md"
{:ok, "### Hello world!"}

iex(3)> marked = Markdown.to_html file_read
"<h3>Hello world!</h3>\n"

iex(4)> file_read = File.read! "priv/contents/test.md"
"### Hello world!"

iex(5)> marked = Markdown.to_html file_read
"<h3>Hello world!</h3>\n"

参考サイト
Cowboy Tutorial Part 2: Creating Flat File Blog(ElixirDoseさん)
File(Elixir)
ArgumentError(Elixir)
「Phoenix」フレームワークでMarkdown(Earmark)

2016年10月27日木曜日

ElixirのCowboyで静的ファイル(cowboy_static)

ElixirCowboyで静的ファイル(cowboy_static)です。

/priv/static_files/ を静的ファイルのパスに指定する例
routes = [
  {"/", DdsBlog.Handler, []},
  {"/static/[...]", :cowboy_static, {:priv_dir, :dds_blog, "static_files"}}
]
http://localhost/static/flower.jpg などでアクセスできるようになります。

参考サイト
Cowboy Tutorial Part 2: Creating Flat File Blog(ElixirDoseさん)
rizafahmi/dds-blog(GitHub)
cowboy_static(Cowboy Function Reference)
priv_dir/1(Erlang)

2016年10月26日水曜日

ElixirでOTP(Open Telecom Platform) スケルトンアプリ作成

ElixirでOTP(Open Telecom Platform) スケルトンアプリ作成です。ElixirDoseさんの簡易ブログチュートリアルを見つけたので、チャレンジ。本当に必要最低限の構成なので、理解が深まった気分?

$ mix new dds_blog --sup
/mix.exs
def application do
    [applications: [:logger, :cowboy],
    mod: {DdsBlog, []}]
end

defp deps do
  [
    {:cowboy, "~> 1.0"}
  ]
end



参考サイト
Cowboy Tutorial Part 2: Creating Flat File Blog(ElixirDoseさん)
OTPとは何か?(Learn you some Erlangさん)
Mix.Tasks.New(Mix)
CowboyとElixirで静的ページを表示する(ハードリカーエンジニアさん)
Erlang/OTP architectures: cowboy(Mediumさん)

2016年10月25日火曜日

「Phoenix」フレームワークでMarkdown(Earmark)

Phoenix」フレームワークでMarkdownです。 Earmarkというマークダウンパーサがあるので、組み込んでみました。

/mix.exs
  defp deps do
...
     {:earmark, "~> 1.0.2"},
...
  end
$ iex -S mix

iex(1)> Earmark.to_html("# hello world")
"<h1>hello world</h1>\n"
iex(2)> Earmark.to_html("[Yahoo](http://www.yahoo.co.jp 'Yahoo')")
"<p><a href=\"http://www.yahoo.co.jp\" title=\"Yahoo\">Yahoo</a></p>\n"


参考サイト
[Elixir+Phoenix]PhoenixでもMarkdownしたい(Qiita)
[Elixir+Phoenix]Display of Markdown in Phoenix (with highlight.js)(だるい@あぷれんてぃすさん)

2016年10月24日月曜日

ElixirでMD5

ElixirMD5です。

/web/models/registration.ex
defmodule HelloPhoenix.Registration do
  def md5(str) do
    :crypto.hash(:md5, str)
      |> :erlang.bitstring_to_list
      |> Enum.map(&(:io_lib.format("~2.16.0b", [&1])))
      |> List.flatten
      |> :erlang.list_to_bitstring
  end
end
$ iex -S mix

iex(1)> HelloPhoenix.Registration.md5("password")

参考サイト
Get MD5 message digest by elixir-lang(GitHub)

2016年10月22日土曜日

Ubuntu 16.10がリリース

Ubuntu 16.10がリリースされました。
コンテナハイパーバイザである「LXD」も導入された。LXDは、大規模なコンテナ環境でハイレベルな管理とパフォーマンスを提供できるよう設計されている。LXDのコンテナは、仮想マシン(VM)と同様に扱えるようにすることを目指して作られており、これによって企業は、アプリケーションや運用に変更を加えることなく、VMからコンテナへ移行することができるようになる。


参考サイト
「Ubuntu 16.10(Yakkety Yak)」リリース(Think IT)
Ubuntu 16.10--クラウドとコンテナのためのLinux(ZDNet Japan)
LXD

2016年10月21日金曜日

「Phoenix」フレームワークでユーザー認証(ヘルパー)

Phoenix」フレームワークでユーザー認証ヘルパーです。ログインユーザー情報をテンプレート上で扱えるようになります。ソースを見れば、何となく分かるのですが、書き方がエレガントすぎて、ついていけません(笑)。

/web/models/session.ex(モデル)
  def current_user(conn) do
    id = Plug.Conn.get_session(conn, :current_user)
    if id, do: HelloPhoenix.Repo.get(User, id)
  end

  def logged_in?(conn), do: !!current_user(conn)
/web/web.ex
  def view do
    quote do
      import HelloPhoenix.Session, only: [current_user: 1, logged_in?: 1]
    end
  end
/web/templates/layout/app.html.eex(テンプレート)
<%= if logged_in?(@conn) do %>
 <p><%= current_user(@conn).email %></p>
 <p><%= link "ログアウト", to: session_path(@conn, :delete), method: :delete %></p>
<% else %>
 <p><%= link "ログイン",    to: "/login" %></p>
 <p><%= link "会員登録", to: registration_path(@conn, :new) %></p>
<% end %>

参考サイト
User Authentication from Scratch in Elixir and Phoenix(Nithin Bekalさん)

2016年10月20日木曜日

Elixirの命名規則「!」「?」「_」など

Elixirの命名規則「!」「?」「_」などです。

Elixirの基本は、snake_case

_」アンダースコアで始まるものは、変数の場合は、他で利用しないもの。関数の場合は、インポートさせないもの。

!」エクスクラメーションマーク(ビックリマーク)で終わるものは、例外を発生させる。

?」クエスチョンマーク(はてなマーク)で終わるものは、boolean型で、true か false を返す。

本当は、クエスチョンマーク2つの「!!」を調べたかったのですが、結局わからず。



参考サイト
Naming Conventions(Elixir)
What's the meaning of "!", "?", "_", and "." syntax in elixir(Stack Overflow)

2016年10月19日水曜日

「Phoenix」フレームワークでユーザー認証ログイン

Phoenix」フレームワークでユーザー認証ログインです。モデルのloginメソッドで、ログイン判定しているらしい。真似して覚えていくしかないでしょう。

/web/controllers/session_controller.ex(コントローラー)
defmodule HelloPhoenix.SessionController do
  use HelloPhoenix.Web, :controller

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

  def create(conn, %{"session" => session_params}) do
    case HelloPhoenix.Session.login(session_params, HelloPhoenix.Repo) do
      {:ok, user} ->
        conn
        |> put_session(:current_user, user.id)
        |> put_flash(:info, "ログインしました。")
        |> redirect(to: "/")
      :error ->
        conn
        |> put_flash(:error, "ログインに失敗しました。")
        |> render("new.html")
    end
  end
end
/web/models/session.ex(モデル)
defmodule HelloPhoenix.Session do
  alias HelloPhoenix.User

  def login(params, repo) do
    user = repo.get_by(User, email: String.downcase(params["email"]))
    case authenticate(user, params["password"]) do
      true -> {:ok, user}
      _    -> :error
    end
  end

  defp authenticate(user, password) do
    case user do
      nil -> false
      _   -> Comeonin.Bcrypt.checkpw(password, user.crypted_password)
    end
  end
end

参考サイト
User Authentication from Scratch in Elixir and Phoenix(Nithin Bekalさん)

2016年10月18日火曜日

「Phoenix」フレームワークでユーザー認証(コントローラー)

Phoenix」フレームワークでユーザー認証(コントローラー)です。インサート(Repo.insert(changeset))しないで、Registrationモデルのcreateメソッドで、登録しているところがミソです。

/web/controllers/registration_controller.ex
defmodule HelloPhoenix.RegistrationController do
  use HelloPhoenix.Web, :controller

  alias HelloPhoenix.User

  def new(conn, _params) do
    changeset = User.changeset(%User{})
    render(conn, "new.html", changeset: changeset)
  end

  def create(conn, %{"user" => user_params}) do
    changeset = User.changeset(%User{}, user_params)
    #case Repo.insert(changeset) do
    case HelloPhoenix.Registration.create(changeset, HelloPhoenix.Repo) do
      {:ok, _user} ->
        conn
        |> put_flash(:info, "登録されました。")
        |> redirect(to: user_path(conn, :index))
      {:error, changeset} ->
        render(conn, "new.html", changeset: changeset)
    end
  end
end

参考サイト
User Authentication from Scratch in Elixir and Phoenix(Nithin Bekalさん)
「Phoenix」フレームワークでユーザー認証(モデル)

2016年10月17日月曜日

「Phoenix」フレームワークでユーザー認証(モデル)

Phoenix」フレームワークでユーザー認証(モデル)です。 Nithin Bekalさんのブログで会員登録、ログインのユーザー認証について説明されています。 素晴らしいブログです。

挫折の海に溺れかかっていますので、少しづつ進めていくことにします。

/web/models/user.ex(「password」列をバーチャルで設けているところがミソ)
schema "users" do
  field :email, :string
  field :crypted_password, :string
  field :password, :string, virtual: true
  timestamps
end
/web/models/registration.ex(登録の際「crypted_password」列にハッシュ化されたパスワードを保存する)
defmodule HelloPhoenix.Registration do
  import Ecto.Changeset, only: [put_change: 3]

  def create(changeset, repo) do
    changeset
    |> put_change(:crypted_password, hashed_password(changeset.params["password"]))
    |> repo.insert()
  end

  defp hashed_password(password) do
    Comeonin.Bcrypt.hashpwsalt(password)
  end
end

参考サイト
User Authentication from Scratch in Elixir and Phoenix(Nithin Bekalさん)
Ecto.Schema(Ecto)
Ecto.Changeset(Ecto)
「Phoenix」フレームワークでElixirのパスワードハッシュライブラリ「Comeonin」

2016年10月16日日曜日

Node.jsでできた静的サイトジェネレーター「Hexo」

Node.jsでできた静的サイトジェネレーター「Hexo」 気になったのでメモ。プラグインやデザインテーマが充実している印象です。



参考サイト
チームブログをGitHubとHexoではじめよう!(Tokyo Otaku Mode Blogさん)

2016年10月15日土曜日

FreeBSD 11.0がリリース

FreeBSD 11.0がリリースされました。FreeBSD 11は新しいサポートモデルの下で、少なくとも2021年9月30日までの5年間サポートされるとのこと。



参考サイト
FreeBSD 11.0-RELEASE登場、新サポートモデルで5年間サポート(ニフティニュース)

2016年10月14日金曜日

「Phoenix」フレームワークでElixirのパスワードハッシュライブラリ「Comeonin」

Phoenix」フレームワークにElixirのパスワードハッシュライブラリ「Comeonin」を組み込んでみました。

/config/config.exs
defp deps do
  [ {:comeonin, "~> 2.5"} ]
end

def application do
  [applications: [:logger, :comeonin]]
end
str = "difficult2guess"

bcrypt_hash = Comeonin.Bcrypt.hashpwsalt(str)
pbkdf2_hash = Comeonin.Pbkdf2.hashpwsalt(str)

bcrypt_auth = Comeonin.Bcrypt.checkpw(str, bcrypt_hash)
pbkdf2_auth = Comeonin.Pbkdf2.checkpw(str, pbkdf2_hash)


参考サイト
Comeonin

2016年10月13日木曜日

「Phoenix」フレームワークでElixirの日付・時間ライブラリ「Timex」

Phoenix」フレームワークにElixirの日付・時間ライブラリ「Timex」を組み込んでみました。Timex の v3 は、Elixir の 1.3 以上が必要ということなので、Timex の v2を組み込みました。これで、datetime型が扱いやすくなったのかな?

/config/config.exs
defp deps do
  [{:timex, "~> 2"}]
end

defp application do
  [applications: [:timex]]
end
use Timex

datetime = DateTime.today
strftime_str = Timex.format(datetime, "%FT%T%:z", :strftime)


参考サイト
timex

2016年10月12日水曜日

「Phoenix」フレームワークでBambooを利用してGmailからメール送信

Phoenix」フレームワークでBambooを利用してGmailからメール送信です。GmailをSMTPサーバーとしてメール送信できました。長いトンネルを抜けました。嬉しすぎます(笑)。

/config/config.exs
config :hello_phoenix, HelloPhoenix.Mailer,
  adapter: Bamboo.SMTPAdapter,
  server: "smtp.gmail.com",
  port: 587,
  username: "sample_from@gmail.com",
  password: "password",
  tls: :if_available, # can be `:always` or `:never`
  ssl: false, # can be `true`
  retries: 1
/lib/hello_phoenix/mailer.ex
defmodule HelloPhoenix.Mailer do
  use Bamboo.Mailer, otp_app: :hello_phoenix
end
/lib/email.ex
defmodule HelloPhoenix.Email do
  use Bamboo.Phoenix, view: HelloPhoenix.EmailView

  def welcome_text_email(email_address) do
    new_email
    |> to(email_address)
    |> from("sample_from@gmail.com")
    |> subject("メール送信テスト")
    |> text_body("マイクのテスト中\nマイクのテスト中")
  end
end
$ iex -S mix
iex(1)> HelloPhoenix.Email.welcome_text_email("sample_to@gmail.com") 
|> HelloPhoenix.Mailer.deliver_now

参考サイト
Sending Email(Phoenix)
[Elixir]Send mail from Elixir (Using Mailman Library)(だるい@あぷれんてぃすさん)

2016年10月11日火曜日

「Phoenix」フレームワークでメール送信挫折

Phoenix」フレームワークでメール送信挫折です。ダメ、全くわかりません。bambooライブラリを組み込んだだけで、終わりました。意味のないブログです。自分の実力の無さを思い知らされました。ガックリ。笑ってやってください。

mix.exs
defp deps do
  [{:phoenix, "~> 1.2.0"},
   {:phoenix_pubsub, "~> 1.0"},
   {:phoenix_ecto, "~> 3.0"},
   {:postgrex, ">= 0.0.0"},
   {:phoenix_html, "~> 2.6"},
   {:phoenix_live_reload, "~> 1.0", only: :dev},
   {:gettext, "~> 0.11"},
   {:cowboy, "~> 1.0"},
   {:bamboo, "~> 0.7"},
   {:bamboo_smtp, "~> 1.2.1"}]
end
$ mix deps.get

参考サイト
Sending Email(Phoenix)

2016年10月10日月曜日

PostgreSQL 9.6がリリース

PostgreSQL 9.6がリリースされました。
「PostgreSQL 9.6」で特に注目されるのはいくつかのクエリがパラレルクエリに対応した点。これにより、従来、単一のコアしか使うことのできなかった処理で、複数のコアを同時に利用できるようになる。実際は、搭載しているコアの数に依存するが、特定の大規模データ処理で最大32倍の高速化が実現したとしている。


参考サイト
PostgreSQL 9.6登場(マイナビニュース)

2016年10月9日日曜日

「.NET Core 1.0」と「ASP.NET Core 1.0」が正式リリース

.NET Core 1.0」と「ASP.NET Core 1.0」が正式リリースされたそうです。
Windowsアプリケーションの動作基盤となる.NET Frameworkのうち、GUIにかかわる部分を省いた開発環境が一通りそろったことになる。WindowsのコンソールアプリケーションやWebアプリケーション開発環境の「ASP.NET」のコードをLinuxやmacOSで開発・実行できる。


参考サイト
LinuxでWindowsコードが動く「.NET Core」正式版リリース(ITpro)
.NET Core(GitHub)

2016年10月8日土曜日

JavaScriptのユーティリティライブラリ「MooTools」

JavaScriptのユーティリティライブラリ「MooTools」 AjaxやDOM操作が行えますので、jQuery対抗馬という存在だと思います。



参考サイト
jQuery vs MooTools(偉大な2つの JavaScript を選択するさん)

2016年10月7日金曜日

Windows+IIS+PHPの構成で「open(C:\Windows\temp\sess_*****, O_RDWR) failed: Permission denied」

Windows+IIS+PHPの構成の場合、error_logupload_tmp_dirsession.save_pathなどで指定されている「C:\Windows\Temp」をIISユーザー(IIS_IUSRS)が読み書きできるようになっている必要があります。セッションが保持できなくなって、またハマりました。
  • error_log
  • upload_tmp_dir
  • session.save_path

2016年10月6日木曜日

Windows+IIS+PHPの構成には「Microsoft Web Platform Installer」

Windows+IIS+PHPの構成には「Microsoft Web Platform Installer」を使うと、問題なくインストールできます。PHPをダウンロードして、解凍し、手動で設定していたらハマりました。意図するphp.iniを読み込んでくれないなどの問題に見舞われ、どうしたものかと完全に行き詰まっていました。「Microsoft Web Platform Installer」を使って、Windowsに身を任せるのが良いと思います。pdo_sqlsrv、pdo_mysqlなども勝手にインストールしてくれます。



2016年10月5日水曜日

SQLServerでユニコードは、nchar、nvarchar、ntext

SQLServerでユニコードは、ncharnvarcharntextを使うとのこと。プレフィックスの「n」 は、National (Unicode) データ型という意味だそうです。
ntext、text、および image の各データ型は、将来のバージョンの Microsoft SQL Server で削除される予定です。 新しい開発作業では、これらのデータ型の使用は避け、現在これらのデータ型を使用しているアプリケーションは修正するようにしてください。 代わりに、nvarchar(max)、varchar(max)、varbinary(max) を使用してください。

2016年10月4日火曜日

「Phoenix」フレームワークでモデル(Model)を変更するマイグレーション(Migration)

Phoenix」フレームワークでモデル(Model)を変更するマイグレーション(Migration)です。

$ mix ecto.gen.migration add_fields_to_users
/priv/repo/migrations/201610_add_fields_to_users.exs
defmodule HelloPhoenix.Repo.Migrations.AddFieldsToUsers do
  use Ecto.Migration

  def change do
    alter table(:users) do
      add :age, :integer
      # フィールドタイプを変更する場合は modify らしいです。
      # modify :name, :binary
    end
  end
end
$ mix ecto.migrate
間違えたら
$ mix ecto.rollback

参考サイト
[Phoenix]Ectoを使って再マイグレーションする(Qiita)
Adding Fields to an Ecto Model in Phoenix(Wendy Smoakさん)
How to change field type in Ecto?(Stack Overflow)
Ecto.Migration(Ecto)

2016年10月3日月曜日

「Phoenix」フレームワークでセッション

Phoenix」フレームワークでセッションです。

セッションデータ設定
put_session/3

セッションデータ取得
get_session/2

/web/controllers/hello_controller.ex
  def index(conn, _params) do
    # セッションデータ取得
    test = get_session(conn, :test)

    # セッションデータ設定
    conn
    |> put_session(:test, "abc")
  end

参考サイト
Sessions(Phoenix)

2016年10月2日日曜日

LINEがチャットBOTを開発できるAPI「Messaging API」を公開

LINEがチャットBOTを開発できるAPI「Messaging API」を公開 これは面白そうですね。
アカウントからユーザーに送るメッセージとして、能動的にチャットボットから配信する「プッシュメッセージ」と、ユーザーが送ったメッセージや情報に対して即時に返信する「リプライメッセージ」の2種類に区分して利用可能。リプライメッセージについては、アカウント種別やプラン・メッセージの通数を問わず、すべて無料で利用できる。


参考サイト
LINE、チャットボットAPIを本格提供--グループトークにも対応(CNET Japan)
LINE(GitHub)
LINE Notify

2016年10月1日土曜日

BIND 9にDoS攻撃が可能となる深刻な脆弱性

BIND 9にDoS攻撃が可能となる深刻な脆弱性 アップデート版がリリースされているようなので、更新する必要があるでしょう。



参考サイト
「BIND 9」全バージョンに深刻なDoS脆弱性、パケット1つでnamed異常終了(INTERNET Watch)