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さん)