2016年12月31日土曜日

2016年の今年もっともアクセスが多かった記事

2016年の今年もっともアクセスが多かった記事ベスト3です。

No.1

CakePHP 3で、ファイルのアップロード(file upload)

No.2

CakePHP 3で、チェックボックス(Checkboxes)

No.3

PHPからGoogle V8 Javascript Engineを利用できる「V8Js」


技術ネタが上位を占めるとは、このブログもちょっとは大人になりましたか?
アクセス数は超低空飛行ですが(笑)。

最後に、ちょっとでもアクセスいただいた方、ありがとうございました。
中身はありませんが、継続こそ力なりの精神で来年も続けていきます。

みなさん、良いお年をお迎えください!!

2016年12月29日木曜日

Laravel5.3でデバック用ツールバー「Laravel Debugbar」

Laravel5.3でデバック用ツールバー「Laravel Debugbar」を設定してみました。リクエストやセッション情報、クエリデータなどが簡単に確認できます。ありがたい。

$ php composer require barryvdh/laravel-debugbar

/config/app.php
  'providers' => [
    Barryvdh\Debugbar\ServiceProvider::class,
  ],

  'aliases' => [
    'Debugbar' => Barryvdh\Debugbar\Facade::class,
  ],



参考サイト
Laravel5.0でlaravel-debugbarを使う(Qiita)

2016年12月28日水曜日

Laravel5.3でフォーム「LaravelCollective/html」

Laravel5.3でフォーム「LaravelCollective/html」を設定してみました。自動でcsrf_tokenを組み込んでくれて便利。

$ php composer.phar require "laravelcollective/html":"5.3.0"

/config/app.php
  'providers' => [
    Collective\Html\HtmlServiceProvider::class,
  ],

  'aliases' => [
      'Form' => Collective\Html\FormFacade::class,
      'Html' => Collective\Html\HtmlFacade::class,
  ],

/resources/views/blog/create.blade.php
{!! Form::open(['url'=>'blog']) !!}

{!! Form::label('title','タイトル',['class'=>'label']) !!}
{!! Form::text('title',null,['class'=>'input']) !!}

{!! Form::submit('登録',['class'=>'button']) !!}

{!! Form::close() !!}

参考サイト
初めてのLaravel 5.1 : (16) Formの作成(ララ帳さん)
Laravel5で新規データの作成(WinRoad徒然草さん)
Forms & HTML(Laravel Collective)

2016年12月27日火曜日

Laravel5.3で、コンソール画面「php artisan tinker」

Laravel5.3で、コンソール画面「php artisan tinker」 こんなのあったんですね。今まで知らずに過ごしてきました(汗)。まだまだ修行が足りません。

$ php artisan tinker

>>> App\User::count();
>>> factory(App\User::class, 10)->create();
>>> App\User::count();
>>> App\User::all();

# ドキュメントも読めます。
>>> doc phpinfo
>>> doc print_r



参考サイト
PHPを「シェル化」する [psy/psysh](超PHPerになろうさん)
Tinker with the Data in Your Laravel Apps with Php Artisan Tinker(Scotchさん)
psysh

2016年12月26日月曜日

Laravel5.3で、すべてのビューでデータを共有

Laravel5.3で、すべてのビューでデータを共有する設定です。非常に便利。

/app/Providers/AppServiceProvider.php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        View::share('service_name', 'サイト名');
    }
}
/resources/views/○○.blade.php
{{ $service_name }}

参考サイト
Views(Laravel)

2016年12月25日日曜日

個人間で無料送金できるアプリ「Kyash」

個人間で無料送金できるアプリ「Kyash」 素晴らしいサービスで、是非、使ってみたいと思います! しかし、これどこで商売として儲けているんでしょう? 心配になってしまいます(笑)。

現金の入出金・振り込みにかかる手数料、銀行口座の情報は不要。簡単なアカウント登録を済ませたあと、クレジットカードなどの各種カードを登録するだけで利用可能だという。



参考サイト
個人間の無料送金アプリ「Kyash」クローズドβ版提供(ASCII.jp)

2016年12月24日土曜日

Linux Mint 18.1がリリース

Linux Mint 18.1がリリースされました。Ubuntu 16.4ベースの長期サポート版です。
Linux Mintはようやく自動的にアップグレードできるようになった。これまでMintでは、ホームディレクトリの個人用ファイルを別のパーティションに分離しておいた上で、手動でアップグレードする必要があった。




参考サイト
Linux Mint 18.1 Serenaがリリース(ZDNet Japan)

2016年12月23日金曜日

Ubuntuに遠隔から任意のコードが実行できる脆弱性

Ubuntuに遠隔から任意のコードが実行できる脆弱性が発見されました。Ubuntu 12.10以降のUbuntuがこの影響を受けるとのこと。
脆弱性の中心となっているのはApportと呼ばれるツール。このツールがデータを処理する段階でコード実行の関数を呼び出しており、結果として細工されたデータを開こうとすると、この処理が走り任意のコードが実行されるという事態が発生するとのこと。


参考サイト
Ubuntuに遠隔から任意のコードが実行できる脆弱性(マイナビニュース)
Ubuntu のクラッシュレポート機能 (Apport) により権限昇格されてしまう脆弱性(Scan Tech Report)(ScanNetSecurity)

2016年12月22日木曜日

Laravel5.3のファサード(Facades)

Laravel5.3のファサード(Facades)とは何? ということで、またお勉強です。なかなか先に進めません。
ファサードは、アプリケーションのサービスコンテナで使用可能なクラスに「静的」なインタフェースを提供します。 Laravelのファサードは、サービスコンテナ内の基底クラスに「静的プロキシ」として機能し、伝統的な静的メソッドよりも高いテスト容易性と柔軟性を維持しながら、簡潔で表現力豊かな構文の利点を提供します。
「何のこっちゃ?」となるわけですが、
ファサードは、よりシンプルで読みやすいインターフェースを提供するため、複雑なライブラリをラップするクラスです。
という説明を見つけました。

本来、こう書かなければならないところ、
App::make('some_service')->methodName();


ファサードのおかげで、スタティックなメソッドのように、こう書けるということだと思います(?)。
someService::methodName();

サンプルにあるCacheクラスは、設定ファイルで、エリアス登録されているから利用できるということなのでしょう(?)。

/config/app.php
'aliases' => [
  'Cache'=>Illuminate\Support\Facades\Cache::class,
]

参考サイト
Facades(Laravel)
ファサードとは(ララ帳さん)
What Are Laravel 5.0 Facades?(Envato Tuts+)
How Laravel Facades Work and How to Use Them Elsewhere(SitePoint)

2016年12月21日水曜日

Laravel5.3のサービスコンテナ(Service Container)

Laravel5.3のサービスコンテナ(Service Container)とは何? ということで、わからないながらも、Symfony2ドキュメントの「サービスコンテナ」を読むと、イメージはつかめるかなと思います。

サービスコンテナは 1 つの PHP オブジェクトであり、アプリケーション内でオブジェクトをインスタンス化、組み立て、取り出すのに利用します。サービスコンテナを使うと、アプリケーションにおけるオブジェクトの生成方法を標準化し、一元化できるようになります。再利用可能で疎結合なコードのためのアーキテクチャを提供しています。
具体例は、Laracasts。こちらで、確実にわかったつもりになれます(笑)!


参考サイト
Service Container(Laravel)
サービスコンテナ(Symfony2ドキュメント)
Laravel 5 Fundamentals: The Service Container(Laracasts)

2016年12月20日火曜日

Laravel5.3で、リクエストの流れ(Request Lifecycle)

Laravel5.3で、リクエストの流れ(Request Lifecycle)です。フレームワークの動きを理解するために重要な部分でしょう。

Step 1.
/public/index.php
Composerのautoloaderを読み込み。

Step 2.
/bootstrap/app.php
Laravelインスタンスを取得。

Step 3.
/app/Http/Kernel.php
リクエストは、 HTTP kernel(console kernel)に送られ、HTTPリクエストを受取り、HTTPレスポンスを返す。

  • このKernel処理で、最も重要なアクションの1つは、アプリケーションのサービスプロバイダをロードすることです。
  • サービスプロバイダは、フレームワークのさまざまなコンポーネント(データベース、キュー、バリデーション、ルーティングなど)をすべて起動準備します。
  • サービスプロバイダが登録されると、リクエストはルータに渡されて処理されます。
  • ルーターは、ルートまたはコントローラーにリクエストをディスパッチし、あるいはミドルウェアを実行します。

なんとなく、大まかな処理の流れがわかるような気がします。

参考サイト
Request Lifecycle(Laravel)

2016年12月19日月曜日

Laravel5.3で、カスタム404ページ

Laravel5.3で、カスタム404ページです。単に、404.blade.php のテンプレートファイルを追加するだけで良いみたいですね。

/resources/views/errors/404.blade.php



参考サイト
Errors & Logging(Laravel)

2016年12月18日日曜日

人工知能(AI)によってレジなし店舗を実現「Amazon Go」

人工知能(AI)によってレジなし店舗を実現「Amazon Go」 すごい世界になりますねぇ。財布ではなく、スマホを持っていないと、買い物ができなくなるかもしれません(笑)。

Amazonは動画の中で、Amazon Goには、コンピュータビジョン、ディープラーニングアルゴリズム、センサ融合など、自律走行車に採用されているものと似た技術が採用されていると述べた。


参考サイト
レジなし、行列もなし-アマゾンがAI活用の新コンセプトストア「Amazon Go」を開店(CNET Japan)

2016年12月16日金曜日

Laravel5.3で、カスタム例外ページ

Laravel5.3で、カスタム例外ページです。Handler.php にレポート先を指定すればOKらしい。

/app/Exceptions/Handler.php
public function render($request, Exception $exception)
{
    if ($exception instanceof CustomException) {
        return response()->view('errors.500', [], 500);
    }

    return parent::render($request, $exception);
}

テンプレートファイルを追加。「$exception」の変数で例外の内容を受け取れます。
/resources/views/errors/500.blade.php
{{ $exception }}

参考サイト
Errors & Logging(Laravel)

2016年12月15日木曜日

Laravel5.3のディレクトリ構成

Laravel5.3のディレクトリ構成です。なんとなく、大まかな全体像がつかめる(?)ような気がします。

/app/Console -> Artisanコマンド
/app/Http -> コントローラ、ミドルウェア、リクエスト

/app/Jobs などは、ArtisanコマンドでJobクラスを生成しないと、存在しないとのこと。

.
|-- .env
|-- app
|   |-- Console
|   |-- Exceptions
|   |-- Http
|   |   |-- Controllers
|   |   |   `-- Auth
|   |   `-- Middleware
|   `-- Providers
|-- bootstrap
|   `-- cache
|-- config
|-- database
|   |-- factories
|   |-- migrations
|   `-- seeds
|-- public
|   |-- css
|   `-- js
|-- resources
|   |-- assets
|   |   |-- js
|   |   |   `-- components
|   |   `-- sass
|   |-- lang
|   |   `-- en
|   `-- views
|       |-- errors
|       `-- vendor
|-- routes
|-- storage
|   |-- app
|   |   `-- public
|   |-- framework
|   |   |-- cache
|   |   |-- sessions
|   |   `-- views
|   `-- logs
|-- tests
`-- vendor

参考サイト
Directory Structure(Laravel)

2016年12月14日水曜日

Laravel5.3でメンテナンスモード

Laravel5.3でメンテナンスモード(Maintenance Mode)です。これ面白い。そして便利。頻繁にメンテナンスしたくなります(笑)。

$ php artisan down
Application is now in maintenance mode.

$ php artisan up
Application is now live.

デザインの変更は、/resources/views/errors/503.blade.php のファイルを編集。



参考サイト
Laravel 5 メンテナンスモード IP制限(ajisaba.netさん)

2016年12月13日火曜日

Laravel5の「PHP dotenv」

Laravel5の「PHP dotenv」です。
.envファイルは.htaccessファイルのように、環境変数を簡単にロードできます。 プログラムファイルを編集する必要はなく、データベースのパスワードやサードパーティーのログイン情報など、ソースコードから切り離すことができます。
確かに、ログイン情報などは切り離して管理すべきですよね。

print "<pre>" ;
var_dump($_ENV);
var_dump($_SERVER);
var_dump(App::environment());
var_dump(getenv('APP_ENV'));
print "</pre>" ;



参考サイト
vlucas/phpdotenv(GitHub)

2016年12月12日月曜日

Laravel5.3をインストール

Laravel5.3をインストールしてみました。Elixirで疲れたので、気分転換です(笑)。Laravel5に初めて挑戦してみましたが、スゴイことになっていますね。ビックリ仰天です。

$ composer create-project --prefer-dist laravel/laravel blog
$ cd blog
$ php artisan serve --host 0.0.0.0



参考サイト
Laravelのartisanでサーバを立ち上げた時にプライベートIPでアクセスできない問題と、その対処法(Front-end beginner's luckさん)

2016年12月11日日曜日

Android代替OS?「Sailfish OS」

Android代替OS?「Sailfish OS」 こんな選択肢もあるんですね。興味深い。

Sailfish OSは、米国ベースのモバイルオペレーティングシステムとは異なり、真の独立した代替手段を提供します。 Sailfish OSのパートナーとユーザーは、制限やプライバシー侵害なしに、最も重要なモバイルコンテンツを構築できます。






参考サイト
ロシア政府がJollaのSailfish OSを初のAndroid代替OSとして認可(TechCrunch Japan)

2016年12月10日土曜日

PHP 7.1がリリース

PHP 7.1がリリースされました。順調にバージョンアップしていますね。素晴らしい。
「PHP 7.1.0」に導入された新機能は従来よりもより明確にデータや型を指定できるようにする機能や、より書き方をわかりやすくする機能などとなっている。


参考サイト
PHP 7.1登場、便利な新機能が多数追加(マイナビニュース)
What's New and Exciting in PHP 7.1?(SitePoint)
PHP 7.1でOPcacheがすごい速くなってた(Qiita)

2016年12月9日金曜日

ElixirでTCP Echo server(Task.Supervisor版)

ElixirTCP Echo server(Task.Supervisor版)です。Supervisorで監視するようにすると、複数のtelnetで接続し、それぞれコネクションを切ってクラッシュさせても、サービスは起動したままになります。わからないながらも面白い。Supervisorの働きがよくわかります。

/lib/kv.ex
defmodule KV do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      supervisor(Task.Supervisor, [[name: KVServer.TaskSupervisor]]),
      worker(Task, [KVServer, :accept, [4040]])
    ]

    opts = [strategy: :one_for_one, name: KVServer.Supervisor]
    Supervisor.start_link(children, opts)
  end
end
/lib/kv_server.ex
defmodule KVServer do
  def accept(port) do
    {:ok, socket} = :gen_tcp.listen(port,
                      [:binary, packet: :line, active: false])
    IO.puts "Accepting connections on port #{port}"
    loop_acceptor(socket)
  end

  defp loop_acceptor(socket) do
    {:ok, client} = :gen_tcp.accept(socket)
    #serve(client)
    #Task.start_link(fn -> serve(client) end)
    Task.Supervisor.start_child(KVServer.TaskSupervisor, fn -> serve(client) end)
    loop_acceptor(socket)
  end

  defp serve(socket) do
    socket
    |> read_line()
    |> write_line(socket)

    serve(socket)
  end

  defp read_line(socket) do
    {:ok, data} = :gen_tcp.recv(socket, 0)
    data
  end

  defp write_line(line, socket) do
    :gen_tcp.send(socket, line)
  end
end

参考サイト
ElixirでTaskを使ってEchoServerを動かす( ヽ(´・肉・`)ノログさん)
Task and gen_tcp - Elixir

2016年12月8日木曜日

ElixirでTCP Echo server

ElixirTCP Echo serverです。全然わかっていませんが、エコーが返ってくる楽しさはわかりました(笑)。

/lib/kv_server.ex
defmodule KVServer do
  def accept(port) do
    # The options below mean:
    #
    # 1. `:binary` - receives data as binaries (instead of lists)
    # 2. `packet: :line` - receives data line by line
    # 3. `active: false` - block on `:gen_tcp.recv/2` until data is available
    #
    {:ok, socket} = :gen_tcp.listen(port,
                      [:binary, packet: :line, active: false])
    IO.puts "Accepting connections on port #{port}"
    loop_acceptor(socket)
  end

  defp loop_acceptor(socket) do
    {:ok, client} = :gen_tcp.accept(socket)
    serve(client)
    loop_acceptor(socket)
  end

  defp serve(client) do
    client
    |> read_line()
    |> write_line(client)

    serve(client)
  end

  defp read_line(socket) do
    {:ok, data} = :gen_tcp.recv(socket, 0)
    data
  end

  defp write_line(line, socket) do
    :gen_tcp.send(socket, line)
  end
end

サーバーを起動。telnetの接続を切ると、エラーで終了。
$ iex -S mix

iex(1)> KVServer.accept(4040)
Accepting connections on port 4040

** (MatchError) no match of right hand side value: {:error, :closed}
    (kv) lib/kv_server.ex:48: KVServer.read_line/1
    (kv) lib/kv_server.ex:41: KVServer.serve/1
    (kv) lib/kv_server.ex:35: KVServer.loop_acceptor/1

4040ポートにtelnet接続。任意にタイプすると、エコーが返ってくる。
$ telnet 127.0.0.1 4040
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Hello
Hello
World
World
Are you there?
Are you there?
^]
telnet> quit
Connection closed.

参考サイト
ElixirでTaskを使ってEchoServerを動かす( ヽ(´・肉・`)ノログさん)

2016年12月7日水曜日

Erlangのマルチユーザ分散型DBMS「Mnesia」

Erlangのマルチユーザ分散型DBMS「Mnesia」 こんなDB があるんですねぇ。クエリやトランザクション機能を備えています。Elixirを勉強していなかったら、まず出会わなかったでしょうから、使えるかどうかは別として、素晴らしい出会いです(笑)。

Mnesiaの特徴

  • 高速リアルタイムkey-value検索
  • 複雑な非リアルタイムクエリ(操作および保守)
  • 分散アプリケーションのための分散データ
  • 高いフォールトトレランス
  • ダイナミックな再構成(Dynamic reconfiguration)
  • 複雑なオブジェクト

  • 高速リアルタイム操作
  • フォールトトレランス(レプリケーション)
  • システムを停止、または一時停止せずに再構成する機能
MnesiaはErlangで書かれているため、Erlangをデータベースプログラミング言語に変えています。 これには多くの利点がありますが、第一に、DBMSで使用されるデータ形式と、データを操作するために使用されるプログラミング言語で使用されるデータ形式との間のインピーダンスの不一致が全くないことです。
  • データベーススキーマは、実行時に動的に再構成できます。
  • テーブルは、場所、レプリケーション、永続性などのプロパティを持つように宣言できます。
  • フォールトトレランスを向上させるために、テーブルを複数のノードに移動または複製することができます。
  • テーブルの位置はプログラマにはわかりません。 プログラムではテーブル名を扱い、システムはテーブルの位置を追跡しています。
  • データベーストランザクションを分散することができ、多くの機能を1つのトランザクション内で呼び出すことができます。
  • 複数のトランザクションを同時に実行でき、その実行はDBMSによって完全に同期されます。 Mnesiaは、2つのプロセスが同時にデータを操作しないことを保証します。
  • トランザクションは、システム内のすべてのノードで実行されるか、または実行されないかのプロパティを割り当てることができます。



参考サイト
分散DBMS「Mnesia」の並列処理(インターネットコム)

2016年12月6日火曜日

Elixirで「GenServer」(その2)

Elixirで「GenServer」(その2)です。Cultttさんの「Understanding GenServer in Elixir」のブログを読んで、ようやく、どういうことか見えてきたような気がします。

/lib/kv/shopping_list.ex
defmodule ShoppingList do
  use GenServer
 
  # Client API
 
  def start_link do
    # 1. サーバーのコールバックが実装される場所(同じモジュール内に実装する場合は「__MODULE__」)
    # 2. モジュールの初期化引数(何もなければ「:ok」)
    # 3. オプションのリスト([])
    GenServer.start_link(__MODULE__, :ok, [])
  end
 
  def read(pid) do
    # callは、サーバーからの応答を受信するまでプロセスをブロック。
    # 1. プロセスのPID
    # 2. リクエスト
    GenServer.call(pid, {:read})
  end

  def add(pid, item) do
    # castは、サーバーからの応答を待たない。
    # 1. プロセスのPID
    # 2. リクエスト
    GenServer.cast(pid, {:add, item})
  end
 
  # Server Callbacks
 
  # サーバーを初期化
  def init(:ok) do
    {:ok, []}
  end
 
  # 1. リクエスト
  # 2. プロセスのPID
  # 3. 現在の状態
  def handle_call({:read}, from, list) do
    {:reply, list, list}
  end
 
  # 1. リクエスト
  # 2. 現在の状態
  def handle_cast({:add, item}, list) do
    {:noreply, list ++ [item]}
  end
end
実際に利用してみた例
$ iex -S mix

iex(1)> {:ok, pid} = ShoppingList.start_link
{:ok, #PID<0.123.0>}

iex(2)> ShoppingList.add(pid, "milk")
:ok

iex(3)> ShoppingList.add(pid, "bread")
:ok

iex(4)> ShoppingList.add(pid, "cheese")
:ok

iex(5)> ShoppingList.read(pid)
["milk", "bread", "cheese"]

参考サイト
Understanding GenServer in Elixir(Culttt)
Elixirでクライアント・サーバ関係を実装する「GenServer」

2016年12月5日月曜日

Elixirでクライアント・サーバ関係を実装する「GenServer」

Elixirでクライアント・サーバ関係を実装する「GenServer」 まあ、よくわかりませんが、雰囲気(?)だけは感じ取れます(笑)。
GenServerは他のElixirプロセスと同様のプロセスであり、状態の保持、コードの非同期実行などに使用できます。 このモジュールを使用して実装されたジェネリックサーバープロセス(GenServer)を使用する利点は、標準のインターフェイス関数セットを持ち、トレースとエラーレポートの機能を含むことです。 スーパービジョンツリー(supervision tree)にも適合します。
GenServerの動作は、共通のクライアントとサーバーの対話を抽象化します。 開発者は、コールバックと機能を実装するだけで済みます。
/lib/kv/stack.ex
defmodule Stack do
  use GenServer

  def handle_call(:pop, _from, [h | t]) do
    {:reply, h, t}
  end

  def handle_cast({:push, item}, state) do
    {:noreply, [item | state]}
  end
end
call は同期でサーバーからの返答を待ち、castは非同期で返答を待ちます。
$ iex -S mix

iex(1)> {:ok, pid} = GenServer.start_link(Stack, [:hello])
{:ok, #PID<0.123.0>}

iex(2)> GenServer.call(pid, :pop)
:hello

iex(3)> GenServer.cast(pid, {:push, :world})
:ok

iex(4)> GenServer.call(pid, :pop)
:world

参考サイト
Elixir の OTP (GenServer 編)(Qiita)
[Elixir]GenServerの基本を習得する(Code of Resistance!!さん)

2016年12月4日日曜日

対話型アプリを構築できる「Amazon AIプラットフォーム」

対話型アプリを構築できる「Amazon AIプラットフォーム」を発表したとのこと。ディープラーニングによって、すごい世界に変化しつつあるのが、実感として伝わってきますね。そろそろ技術者として引退を考えないとマズイかも(笑)。
  • Amazon Lex(会話型アプリ)
  • Amazon Rekognition(画像認識)
  • Amazon Polly(テキストを音声に変換)



参考サイト
Amazon AIがローンチ、Alexaのような音声アプリが開発可能に(TechCrunch Japan)
MSやIBM追撃の会話アプリ向け「Amazon Lex」など、AWSが15サービス投入(ITpro)

2016年12月3日土曜日

PHPからGoogle V8 Javascript Engineを利用できる「V8Js」

PHPからGoogle V8 Javascript Engineを利用できる「V8Js」 こんなものがあるんですね。どういう用途が考えられるのか、すぐに想像できませんが、とにかくメモです。



参考サイト
phpv8/v8js(GitHub)

2016年12月2日金曜日

Elixirでプロセスに状態を保持できる「Agent」

Elixirでプロセスに状態を保持できる「Agent」です。軽量プロセスとは、こういうことなのかなと思いました。最近、苦痛の日々を過ごしていましたが、ようやく、Elixirプログラミングの光が見えてきたような?(笑)

$iex -S mix

iex(1)> {:ok, agent} = Agent.start_link fn -> [] end
{:ok, #PID<0 .123.0="">}

iex(2)> Agent.update(agent, fn list -> ["eggs" | list] end)
:ok

iex(3)> Agent.update(agent, fn list -> ["hams" | list] end)
:ok

iex(4)> Agent.update(agent, fn list -> ["potatoes" | list] end)
:ok

iex(5)> Agent.get(agent, fn list -> list end)
["potatoes", "hams", "eggs"]

iex(6)> Agent.stop(agent)
:ok

iex(7)> Agent.get(agent, fn list -> list end)
** (EXIT) no process

  1. 空のリスト(list)の初期状態のAgentを開始。
  2. Agentの状態を更新し、新しい項目をリスト(list)の先頭に追加。
  3. Agent.update/3の第2引数は、エージェントの現在の状態を入力として受け取り、その新しい状態を返す関数。
  4. Agent.get/3の第2引数は、状態を入力として受け取り、Agent.get/3自身が返す値を返す関数。
  5. Agentプロセスを終了するためにはAgent.stop/3を呼び出す。

$iex -S mix

iex(1)> {:ok, bucket} = KV.Bucket.start_link
{:ok, #PID<0 .123.0="">}

iex(2)> KV.Bucket.get(bucket, "milk") == nil
true

iex(3)> KV.Bucket.put(bucket, "milk", 3)
:ok

iex(4)> KV.Bucket.get(bucket, "milk")
3

iex(5)> KV.Bucket.put(bucket, "milk", 333)
:ok

iex(6)> KV.Bucket.get(bucket, "milk")
333

iex(7)> KV.Bucket.put(bucket, "milk", 0)
:ok

iex(8)> KV.Bucket.get(bucket, "milk")
0

iex(9)> KV.Bucket.put(bucket, "milk", nil)
:ok

iex(10)> KV.Bucket.get(bucket, "milk")
nil

参考サイト
プロセス(Elixir)
Agent(Elixir)

2016年12月1日木曜日

Elixirで利用される「@」アットマークの意味

Elixirで利用される「@」アットマークの意味です。

  1. モジュールに注釈を付ける役割(アノテーション)
    • @moduledoc - 現在のモジュールのドキュメント。
    • @doc - 属性に続く関数またはマクロのドキュメント。
    • @behaviour - OTPやユーザー定義の動作を指定するために使用される。
    • @before_compile - モジュールがコンパイルされる前に呼び出されるフック。 これにより、コンパイルの直前にモジュール内に関数を挿入することができる。
  2. 定数
  3. コンパイル時に使用される一時的なモジュールストレージ

2番目の定数の例
defmodule MyServer do
  @my_data 14
  def first_data, do: @my_data
  @my_data 13
  def second_data, do: @my_data
end

MyServer.first_data
MyServer.second_data

3番目の「コンパイル時に使用される一時的なモジュールストレージ」は、意味がよくわかりませんでした。

参考サイト
[Elixir]compile timeに決定されるモジュールの定数(徒然なるままにさん)
Building a web framework from scratch in Elixir(Code Wordsさん)

2016年11月30日水曜日

Elixirで自作フレームワーク?

Elixirで自作フレームワーク? タイトルは威勢がいいですが、Code Wordsさんの「Building a web framework from scratch in Elixir」というブログを見つけたので、初歩の初歩から、もう一度勉強し直します。

initで初期化して、callする手順はわかるのですが、起動して、http://localhost:4000 にアクセスすると、「hello!」が2つづつ表示されます。1度しかアクセスしていないんですけどね? 謎です。またわからなくなりました。ため息が出ます。

/lib/hello_plug.ex
defmodule HelloPlug do
  def init(default_opts) do
    IO.puts "starting up"
    default_opts
  end

  def call(conn, _opts) do
    IO.puts "hello!"
    Plug.Conn.send_resp(conn, 200, "Hello, world!")
  end
end
$ iex -S mix

iex(1)> {:ok, _} = Plug.Adapters.Cowboy.http HelloPlug, []
starting up
{:ok, #PID<0.123.0>}

iex(2)> hello!
hello!
hello!
hello!



参考サイト
Module attributes(Elixir)
Plug
ElixirでのPlugの基本

2016年11月29日火曜日

Elixirのマクロ(Macros)で利用される「__using__」

Elixirのマクロ(Macros)で利用される「__using__」です。ブログを書いていて虚しいのですが、よくわかりません。マクロ(Macros)自体がわかりませんから、当然といえば、当然ですが。笑ってやってください。サンプルだけコピーしておきます。
モジュールでuseを呼び出すと、そのモジュールで__using__マクロが呼び出され、開発者は必要なコードを生成できます。 また、引数リストも取ります。
defmodule AwesomeLibrary do  
  defmacro __using__(_) do
    quote do
      def print(s), do: IO.puts(s)
    end
  end
end
defmodule TestLibrary do  
  use AwesomeLibrary
end
iex(1)> TestLibrary.print("Hello World")  
Hello World  
:ok

参考サイト
[Elixir]__using__について分かったこと(Code of Resistance!!さん)
What's 'use' statement in Elixir?(zabirauf || Zohaibさん)
Elixirでマクロ(Macros)

2016年11月28日月曜日

Elixirでマクロ(Macros)

Elixirマクロ(Macros)です。Elixirのマクロはdefmacro/2で定義されるとのこと。 サンプルを見ても何を意図したいのか意味がよくわからない。そのうち理解できるようになることを信じて、次に進むことにしましょう。
マクロは最後の手段としてのみ使用してください。 「明示的」は「暗黙的」よりも優れていることに注意してください。 明確なコードは簡潔なコードよりも優れています。
macros.exs
defmodule Unless do
  def fun_unless(clause, do: expression) do
    if(!clause, do: expression)
  end

  defmacro macro_unless(clause, do: expression) do
    quote do
      if(!unquote(clause), do: unquote(expression))
    end
  end
end
iex(1)> require Unless
nil
iex(2)> Unless.macro_unless true, do: IO.puts "this should never be printed"
nil
iex(3)> Unless.fun_unless true, do: IO.puts "this should never be printed"
this should never be printed
nil
マクロのUnless.macro_unlessで、"this should never be printed"の文字列が表示されないのは、関数呼び出しの引数が関数を呼び出す前に評価されるためです。 マクロは引数を評価しません。 代わりに、引数をquoteされた式として受け取り、それを他のquoteされた式に変換します。

参考サイト
Elixir: Macro入門(Qiita)
マクロと変数(Qiita)
Elixirのマクロについて浅く語ってみる(mmagさん)
Elixirのquoteとunquote

2016年11月27日日曜日

スーパーコンピューターランキングTOP500は、ほぼLinuxが独占

スーパーコンピューターランキングTOP500は、ほぼLinuxが独占。世界最速のコンピュータ500台のうち、498台がLinuxを搭載したものだそうです。オープンソースの力は偉大ですねぇ。

2016年11月26日土曜日

ウェブサーバシェアApacheが首位で46.30%、Nginxが2位で19%

ウェブサーバシェアApacheが首位で46.30%、Nginxが2位で19%だそうです。
Apacheの手前で、負荷分散やアプリケーションにNGINXを使用している。NGINXのアーキテクチャはかなり異なっており、並行的にウェブサービスを提供するのに向いている。
確かに、こういう構成をよく見かけますよね。



参考サイト
ウェブサーバのNGINX、Apacheとはどう使い分ける?(ZDNet Japan)

2016年11月25日金曜日

Elixirのquoteとunquote

Elixirquoteとunquoteです。Elixirのプログラムは、3つの要素を持つタプルとして組み上がるとのこと。 最初の要素は関数名、2番目はメタデータを含むキーワードリスト、3番目は引数リストです。quoteを使用すると、任意の式の表現を得ることができます。unquoteを使用すると、quoteせず、そのまま特定のコードを挿入できます(?)。奥が深くて、難しい。
  1. 関数名
  2. メタデータを含むキーワードリスト
  3. 3番目は引数リスト
iex(1)> 1+2
3
iex(2)> quote do: 1 + 2
{:+, [context: Elixir, import: Kernel], [1, 2]}

iex(3)> IO.puts "hello world"
hello world
:ok
iex(4)> quote do: IO.puts "hello world"
{{:., [], [{:__aliases__, [alias: false], [:IO]}, :puts]}, [], ["hello world"]}

iex(5)> number = 13
13
iex(6)> Macro.to_string(quote do: 11 + number)
"11 + number"
iex(7)> Macro.to_string(quote do: 11 + unquote(number))
"11 + 13"

参考サイト
ElixirのMetaprogrammingに出ているquote(Qiita)

2016年11月24日木曜日

Elixirのマイクロフレームワーク「trot」でクエリストリング(URLパラメータ)の取得

Elixirのマイクロフレームワーク「trot」でクエリストリング(URLパラメータ)の取得です。どうやって取得するのだろうと悩みましたが、Plug.Connのfetch_query_paramsを利用すると、取得できました。

/lib/my_trot.ex
defmodule MyTrot do
  use Trot.Router

  get "/hello" do
    conn = fetch_query_params(conn)
    name = conn.params["name"]
    "Hello, #{name}!"
  end
end

参考サイト
Elixirでtrotを使ってみる(Qiita)
Simple elixir web server with plug(Tutorials and notes)
hexedpackets/trot(GitHub)

2016年11月23日水曜日

サーバを丸ごと液体に浸して冷却するデータセンター

サーバを丸ごと液体に浸して冷却するデータセンターについてです。「液浸冷却技術」と呼ばれるものだそうで、空冷の1000倍もの熱輸送効率を実現できるとのこと。理論はわかりますが、実際に実現できてしまうところがすごいですねぇ。

  • スペース削減
  • 消費電力の削減
  • 故障率の低下(10℃温度を下げると故障率が半減)
  • データセンターの無音化



参考サイト
サーバを丸ごと液浸して消費電力を30%削減! 斬新な冷却技術でデータセンターに革命を(FUJITSU JOURNAL)
10℃2倍則(10℃半減則)(製品設計知識)

2016年11月22日火曜日

Elixirのマイクロフレームワーク「trot」でテンプレート

Elixirのマイクロフレームワーク「trot」でテンプレートです。@template_rootで、テンプレートパスの設定。render_templateで、テンプレートファイル名と変数のリストを指定という具合。

/lib/my_trot.ex
defmodule MyTrot do
  use Trot.Router
  use Trot.Template
  @template_root "priv/templates/root"

  get "/compression/pied_piper" do
    render_template("results.html.eex", [title: "EExのテスト", weissman_score: 5.2])
  end

  get "/compression/nucleus" do
    render_template("results.html.haml", [title: "HAMLのテスト", weissman_score: 2.89])
  end
end
/priv/templates/root/results.html.eex
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title><%= @title %></title>
</head>
<body>
  <div class="container">
    <div class="row">
      <%= @weissman_score %>
    </div>
  </div>
</body>
</html>

参考サイト
[Elixir+Trot]テンプレートをレンダリングするだけの簡単なお仕事(Qiita)
Elixirのマイクロフレームワーク「trot」

2016年11月21日月曜日

Elixirのマイクロフレームワーク「trot」

Elixirのマイクロフレームワーク「trot」を設定してみました。非常に軽いです。ルーティングのデフォルト404表示は、import_routes Trot.NotFoundを置くか、モジュールの最後にTrot.NotFoundを使用することで有効にできるらしい。

mix.exs
  def application do
    [applications: [:logger, :trot]]
  end

  defp deps do
    [{:trot, github: "hexedpackets/trot"}]
  end
/config/config.exs
config :trot, :port, 4000
config :trot, :router, MyTrot
config :trot, :heartbeat, "/heartbeat"
/lib/my_trot.ex
defmodule MyTrot do
  use Trot.Router

  get "/" do
    "こんにちは、世界!"
  end

  static "/css", "assets"

  get "/bad" do
    :bad_request
  end

  get "/text" do
    "Thank you for your question."
  end

  get "/text/body", headers: ["x-text-type": "question"] do
    {:redirect, "/text"}
  end

  get "/text/body" do
    {201, "optimal tip-to-tip efficiency"}
  end

  get "/json" do
    %{"hyper" => "social"}
  end

  get "/presenter/:name" do
    "The presenter is #{name}"
  end

  import_routes Trot.NotFound
end



参考サイト
Elixirでtrotを使ってみる(Qiita)
[Elixir+Trot] Trot-Frameworkを使って"Hello Trot!!"するだけの簡単なお仕事(Qiita)

2016年11月20日日曜日

Skypeアカウントがなくても、ブラウザからSkypeが利用可能に

Skypeアカウントがなくても、ブラウザからSkypeが利用可能になったそうです。個人的には、Web for Skypeで良いじゃないかと思いますが、これはこれで、便利に使えるのでしょう。





参考サイト
ブラウザ上でSkypeが利用可能に(ライフハッカー)

2016年11月19日土曜日

TumblrがPHP5からPHP7への移行して、性能が大幅向上

TumblrがPHP5からPHP7への移行して、性能が大幅向上したそうです。こういった実例を示されると、やっぱり、PHP7を使うべしと思いますね。
Tumblrのブログ記事ではレイテンシやCPU負荷のグラフも掲載されているが、PHP 7への移行でレイテンシは200ms前後から120ms前後になり、CPUロードアベレージも低くなっていることが分かる。


参考サイト
Tumblr、PHP 5からPHP 7への移行で性能が大幅向上(財経新聞)

2016年11月18日金曜日

Elixir(Erlang)のパッケージマネージャー「Hex」

Elixir(Erlang)のパッケージマネージャー「Hex」 こういうウェブサイトがあると安心しますね(笑)。キーワードで必要なパッケージを探すことが可能です。


2016年11月17日木曜日

Elixirで並行プロセス

Elixir並行プロセスです。 Elixirは、並行処理のためにアクターモデルに依存していて、並行プログラムは3つの基本要素から成り立っています。
  1. spawn(生み出す)
  2. send(送信)
  3. receive(受信)
receiveの処理は、何度か繰り返してみると、徐々にわかってきます。
iex(1)> pid = spawn fn -> 1 + 2 end
#PID<0 .123.0="">

iex(2)> Process.alive?(pid)
false

iex(3)> self()
#PID<0 .124.0="">

iex(4)> Process.alive?(self())
true

iex(5)> send self(), {:hello, "world"}
{:hello, "world"}

iex(6)> receive do
...(6)>   {:hello, msg} -> msg
...(6)>   {:world, msg} -> "won't match"
...(6)> end
"world"

iex(7)> receive do
...(7)>   {:hello, msg}  -> msg
...(7)> after
...(7)>   1_000 -> "nothing after 1s"
...(7)> end
"nothing after 1s"

iex(8)> parent = self()
#PID<0 .125.0="">

iex(9)> spawn fn -> send(parent, {:hello, self()}) end
#PID<0 .126.0="">

iex(10)> receive do
...(10)>   {:hello, pid} -> "Got hello from #{inspect pid}"
...(10)> end
"Got hello from #PID<0 .126.0="">"

iex(11)> send self(), :hello
:hello

iex(12)> flush()
:hello
:ok

参考サイト
プロセス - Processes -(Elixir)

2016年11月16日水曜日

ElixirでSupervisor(スーパーバイザ)のstrategy(戦略)

ElixirSupervisor(スーパーバイザ)のstrategy(戦略)です。strategyとはなんぞやということで、調べてみました。

strategy()
strategy ::
  :simple_one_for_one |
  :one_for_one |
  :one_for_all |
  :rest_for_one
:one_for_one - 失敗した子プロセスのみを再起動します。
:one_for_all - 失敗したイベントの中にある全ての子プロセスを再起動します。
:rest_for_one - 失敗したプロセスと、そのプロセスより後に開始された全てのプロセスを再起動します。
:simple_one_for_one - 動的にアタッチされた子プロセスに最適です。スーパーバイザは1つだけ子プロセスを含む必要があります。

参考サイト
OTPスーパーバイザ(Elixir School)
Supervisor and Application(Elixir)
ElixirでのPlugの基本(その3)「Supervised handlers」

2016年11月15日火曜日

ElixirでのPlugのテスト

ElixirPlugのテストです。use Plug.Test というモジュールを使うらしい。

/my_plug/test/my_plug_test.exs
defmodule MyPlugTest do
  use ExUnit.Case, async: true
  use Plug.Test

  @opts MyRouter.init([])

  test "returns index" do
    # Create a test connection
    conn = conn(:get, "/")

    # Invoke the plug
    conn = MyRouter.call(conn, @opts)

    # Assert the response and status
    assert conn.state == :sent
    assert conn.status == 200
    assert conn.resp_body == "index page"
  end
  
  test "returns hello world" do
    # Create a test connection
    conn = conn(:get, "/hello")

    # Invoke the plug
    conn = MyRouter.call(conn, @opts)

    # Assert the response and status
    assert conn.state == :sent
    assert conn.status == 200
    assert conn.resp_body == "world"
  end
  
  test "the truth" do
    assert 1 + 1 == 2
  end
end
$ mix test

Finished in 0.06 seconds (0.06s on load, 0.00s on tests)
3 tests, 0 failures

参考サイト
Testing plugs(Plug)
ElixirでのPlugの基本
ElixirでのPlugの基本(その2)
ElixirでのPlugの基本(その3)「Supervised handlers」

2016年11月14日月曜日

ElixirでのPlugの基本(その3)「Supervised handlers」

ElixirでのPlugの基本(その3)「Supervised handlers」です。プロダクション環境では、アプリケーション監視ツリーの下で起動すべしということでしょうか?? 基本がなってないですねぇ。深く考えずに、こういうものだと言い聞かせて、進むしかありません。

/my_plug/lib/my_plug.ex
defmodule MyPlug do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec

    children = [
      Plug.Adapters.Cowboy.child_spec(:http, MyRouter, [], [port: 4000])
    ]

    opts = [strategy: :one_for_one, name: MyPlug.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

参考サイト
Supervised handlers(Plug)
ElixirでのPlugの基本
ElixirでのPlugの基本(その2)

2016年11月13日日曜日

ブロックチェーンのオープンソースデータベース「BigchainDB」

ブロックチェーンのオープンソースデータベース「BigchainDB」 ブロックチェーンとは、分散型ネットワークで、ビットコインの中核技術として実装された技術だそうです。

ブロックチェーンは多数のノードに同一の記録を同期させる仕組みである。 ノード間の記録に差異が生じた場合には、一定のルールに基づく多数決によって正統な記録を決定することにより、記録の同期を確保していく仕組みとなっている。 また、既存の記録(ブロック)に新しい記録を追加する際に、チェーン状に次々と追加していくことから、ブロックチェーンと呼ばれている。
BigchainDBは、「証跡が残らない形ではデータの書き換えができない」など基本的なブロックチェーンの特性を持ち、同じくオープンソースソフトウェアである「RethinkDB」をベースに、デジタルアセット操作(所有権のコントロール)をサポートしたデータストアです。


参考サイト
Pythonで操作するブロックチェーンベースのデータストアBigchainDBとは(@IT)
ブロックチェーン(Wikipedia)
RethinkDB

2016年11月12日土曜日

サーバーサイドでレンダリングされるReactアプリケーションのためのフレームワーク「Next.js」

サーバーサイドでレンダリングされるReactアプリケーションのためのフレームワーク「Next.js」 変化が激しすぎて、ついていけないですが、とにかく要チェック。



参考サイト
ext.js: ReactベースのシンプルなUniversal JavaScriptフレームワーク(InfoQ)
zeit/next.js(GitHub)

2016年11月11日金曜日

ElixirでのPlugの基本(その2)

ElixirでのPlugの基本(その2)です。Plug.Routerを利用すると、ルーティングを制御できます。

RouterにはPlugパイプラインが含まれており、デフォルトではmatchdispatchの2つのPlugが必要です。 一致が見つかった場合は、ディスパッチに転送されます。

/my_plug/lib/my_router.ex
defmodule MyRouter do
  use Plug.Router

  plug :match
  plug :dispatch

  get "/" do
    send_resp(conn, 200, "index page")
  end

  get "/hello" do
    send_resp(conn, 200, "world")
  end

  match _ do
    send_resp(conn, 404, "not found")
  end
end
コンパイルして、Cowboyを起動
iex(1)> c "/path/to/my_plug/lib/my_router.ex"
[MyRouter]
iex(2)> {:ok, _} = Plug.Adapters.Cowboy.http MyRouter, []
{:ok, #PID<123>}

参考サイト
Plug.Router(Plug)
ElixirでのPlugの基本

2016年11月10日木曜日

ElixirでのPlugの基本

ElixirでのPlugの基本です。Plug.Connを利用する場合は、initで初期化して、callするということなのでしょうか。わかった気分を味わいつつも、ますます闇の中へ。

Plugとは?

  • Webアプリケーション間の構成可能なモジュールの仕様
  • Erlang VM内の異なるWebサーバーの接続アダプタ

/my_plug/lib/my_plug.ex
defmodule MyPlug do
  import Plug.Conn

  def init(opts) do
    Map.put(opts, :my_option, "Hello")
  end

  def call(conn, opts) do
    conn
    |> put_resp_content_type("text/plain")
    |> send_resp(200, "#{opts[:my_option]}, World!")
  end
end
コンパイルして、Cowboyを起動
iex(1)> c "/path/to/my_plug/lib/my_plug.ex"
[MyPlug]
iex(2)> {:ok, _} = Plug.Adapters.Cowboy.http MyPlug, %{}
{:ok, #PID<123>}

参考サイト
Getting started with Plug in Elixir(Brian Stortiさん)
Plug.Conn(Plug)

2016年11月9日水曜日

Elixirで、再帰(Recursion)

Elixirで、再帰(Recursion)です。特にリストの[head | tail]でループさせているのは特徴的で、慣れないと、難しいですね。
Elixirでは、Forループすることはできず、そのかわり関数型言語は再帰に頼ります。関数は再帰的に呼び出され,停止の条件になるまで,動作し続けます.
defmodule Recursion do
  def print_multiple_times(msg, n) when n <= 1 do
    IO.puts msg
  end

  def print_multiple_times(msg, n) do
    IO.puts msg
    print_multiple_times(msg, n - 1)
  end
end
defmodule Math do
  def sum_list([head | tail], accumulator) do
    sum_list(tail, head + accumulator)
  end

  def sum_list([], accumulator) do
    accumulator
  end

  def double_each([head|tail]) do
    [head * 2| double_each(tail)]
  end

  def double_each([]) do
    []
  end

  def exponential_each([head|tail]) do
    [head * head| exponential_each(tail)]
  end

  def exponential_each([]) do
    []
  end
end
iex(1)> Recursion.print_multiple_times("Hello!", 3)
Hello!
Hello!
Hello!
:ok

iex(2)> Math.sum_list([1, 2, 3, 4, 5, 6, 7, 8, 9], 0)
45

iex(3)> Math.sum_list([1, 2, 3, 4, 5, 6, 7, 8, 9], 1000)
1045

iex(4)>  Math.double_each([1, 2, 3, 4, 5, 6, 7, 8, 9])
[2, 4, 6, 8, 10, 12, 14, 16, 18]

iex(5)> Math.exponential_each([1, 2, 3, 4, 5, 6, 7, 8, 9])
[1, 4, 9, 16, 25, 36, 49, 64, 81]

2016年11月8日火曜日

Elixirで、Eachループ

Elixirで、Eachループです。Enum.eachを利用して、Enum.each(リスト、関数)で、処理するらしい(?)

iex(1)> file_lists = File.ls! "priv/contents/"
["aaa.md", "bbb.md", "ccc.md", "ddd.md"]

iex(2)> Enum.each(file_lists, fn x -> IO.puts x end)
aaa.md
bbb.md
ccc.md
ddd.md
:ok

iex(3)> Enum.each(file_lists,  &(IO.puts &1))
aaa.md
bbb.md
ccc.md
ddd.md
:ok

iex(4)> Enum.each(file_lists,  &IO.puts/1)
aaa.md
bbb.md
ccc.md
ddd.md
:ok

iex(5)> file_lists |> Enum.each(&IO.puts/1)
aaa.md
bbb.md
ccc.md
ddd.md
:ok

参考サイト
Ruby vs. Elixir: #Each(Strideさん)
Enum(Elixir)
関数(Elixir School)

2016年11月7日月曜日

Elixirで、ファイル関数(File)

Elixirで、ファイル関数(File)です。ファイルのリストを取得して、並べている例。

iex(1)> file_lists = File.ls! "priv/contents/"
["aaa.md", "bbb.md", "ccc.md", "ddd.md"]

iex(2)> Enum.each(file_lists, fn x -> IO.puts x end)
aaa.md
bbb.md
ccc.md
ddd.md
:ok

iex(3)> {:ok, file_lists} = File.ls "priv/contents/"
{:ok, ["aaa.md", "bbb.md", "ccc.md", "ddd.md"]}

iex(4)> Enum.each(file_lists, fn x -> IO.puts x end)
aaa.md
bbb.md
ccc.md
ddd.md
:ok

参考サイト
Cowboy Tutorial Part 2: Creating Flat File Blog(ElixirDoseさん)
Elixirでファイルの一覧とかのディレクトリ操作(BlankTarさん)
File

2016年11月6日日曜日

JSONでiOSアプリを作成できる「Jasonette」

JSONでiOSアプリを作成できる「Jasonette」 レイアウトに、アクション、スタイルと、それぞれJSONデータのみで、プログラミングしていくことになるらしいです。これ面白いですね。





参考サイト
HTTP経由でiOSアプリを簡単にプログラムできる「Jasonette」(GIGAZINE)
Jasonette/JASONETTE-iOS(GitHub)

2016年11月5日土曜日

BIND 9に危険度「高」の脆弱性

BIND 9に危険度「高」の脆弱性が見つかったとのこと。BIND 9は、日本国内でも脆弱性悪用を狙う攻撃が観測されていることから、まだ更新版を適用していない場合は対応を急ぐ必要があるそうです。



参考サイト
「BIND 9」の更新版公開、危険度「高」の脆弱性に対処(ITmedia)

2016年11月3日木曜日

Ubuntu系デスクトップLinuxの「Bodhi Linux」

Ubuntu系デスクトップLinuxの「Bodhi Linux」 興味をそそられたのでメモ。見た感じは、使いやすそうな印象です。
デスクトップ環境としては「Enlightenment DR17」をベースとした「Moksha Desktop」が採用されている。軽量かつ軽快な動作が特徴で、低スペックなPCでも動作する。




参考サイト
UbuntuベースのLinuxディストリビューション「Bodhi Linux 4.0」リリース(Think IT)
Enlightenment
Moksha Desktop(Bodhi Linux)

2016年11月2日水曜日

Elixirで、埋め込みテンプレート(Embedded Elixir)

Elixirで、埋め込みテンプレート(Embedded Elixir)です。EEx.eval_fileEEx.eval_stringを使うと、簡単に実現できます。

iex(1)> EEx.eval_string "foo <%= bar %>", [bar: "お名前は?"]
"foo お名前は?"

iex(2)> EEx.eval_string "foo <%= bar %>", [bar: "太郎"]
"foo 太郎"

iex(3)> template = "priv/themes/index.html.eex"
"priv/themes/index.html.eex"

iex(4)> File.read! template
"<html lang=\"ja\">\r\n<head>\r\n  <meta charset=\"utf-8\">\r\n  <title><%= title %></title>\r\n</head>\r\n<body>\r\n  <%= content %>\r\n</body>\r\n</html>"

iex(5)> EEx.eval_file template, [title: "ホームページのタイトル", content: "Hello world!!<br>"]
"<html lang=\"ja\">\r\n<head>\r\n  <meta charset=\"utf-8\">\r\n  <title>ホームページのタイトル</title>\r\n</head>\r\n<body>\r\n  Hello world!!<br>\r\n</body>\r\n</html>"

iex(6)> EEx.eval_file template, [title: "ホームページのタイトル", content: "Hello world!!<br>
...(6)> 改行します1。<br>
...(6)> 改行します2。<br>
...(6)> 改行します3。<br>"]
"<html lang=\"ja\">\r\n<head>\r\n  <meta charset=\"utf-8\">\r\n  <title>ホームページのタイトル</title>\r\n</head>\r\n<body>\r\n  Hello world!!<br>\n改行します1。<br>\n改行します2。<br>\n改行します3。<br>\r\n</body>\r\n</html>"

iex(7)> footer = "priv/themes/footer.html.eex"
"priv/themes/footer.html.eex"

iex(8)> EEx.eval_file footer
"c 2016 talkativepg. Powered by Blogger."

iex(9)> File.read! footer
"c 2016 talkativepg. Powered by Blogger."

参考サイト
Cowboy Tutorial Part 2: Creating Flat File Blog(ElixirDoseさん)
EEx

2016年11月1日火曜日

Elixirで、String関数

Elixirで、String関数です。ユニコードを扱えるので、日本語も問題なし。

$ iex -S mix

iex(1)> str = "日本語のテスト"
"日本語のテスト"
iex(2)> String.length str
7
iex(3)> sliced = String.slice str, 0, 3
"日本語"
iex(4)> String.first str
"日"
iex(5)> String.last str
"ト"
iex(6)> String.split str, "の"
["日本語", "テスト"]
iex(7)> String.replace str, "日本語", "英語"
"英語のテスト"
iex(8)> String.slice str, 3, 1
"の"
iex(9)> String.slice str, 3, 2
"のテ"
iex(10)> String.reverse str
"トステの語本日"
iex(11)> String.contains? str, "の"
true
iex(12)> String.at str, 3
"の"
iex(13)> String.at str, 0
"日"

参考サイト
Cowboy Tutorial Part 2: Creating Flat File Blog(ElixirDoseさん)
String(Elixir)

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)

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