OmniAICreator/Qiita-1.07M huggingface dataset:
獲得経験値のカスタマイズ

装備やイベントなどで、戦闘終了後の獲得経験値を2倍にするには、
特殊能力値：経験獲得率*200%の「ステート」をかけるのがてっとり早いのですが、

![sshot 1.jpg](https://qiita-image-store.s3.amazonaws.com/0/180923/537a2fb3-8ff1-1874-9fe4-1b10bc10b1da.jpeg)

この方法、ケースによってはあまり使い勝手が良くなく、

・全キャラの経験値に変化をかけたい場合、全キャラにかけないといけない
・倍化された経験値が、戦闘終了メッセージには反映されない
・戦闘不能や、宿屋の全回復処理などで、ステートが解除されてしまう

という問題を含んでいます。

そこで、
**スイッチID:100がONの時は、全員の獲得経験値が2倍になる**
という処理を作ってプラグイン化してしまいましょう。

変更すべき点はrpg_managers.jsのこの部分。

```ruby:rpg_managers.js
BattleManager.makeRewards = function() {
    this._rewards = {};
    this._rewards.gold = $gameTroop.goldTotal();
    this._rewards.exp = $gameTroop.expTotal();
    this._rewards.items = $gameTroop.makeDropItems();
};

```

スイッチID100がONの時は2倍という処理を挿入し、分岐させます。

```ruby:rpg_managers.js
BattleManager.makeRewards = function() {
    this._rewards = {};
    this._rewards.gold = $gameTroop.goldTotal();
	if ($gameSwitches.value(100) === true) {
    	this._rewards.exp = $gameTroop.expTotal() * 2;
    }else{
    	this._rewards.exp = $gameTroop.expTotal();
    }
	this._rewards.items = $gameTroop.makeDropItems();
};

```
※コアスクリプトを直接変更すると色々問題が発生するので、外部jsファイル上に書き込みプラグインとして読み込んでください。

これで、たとえ戦闘不能になってもその影響は受けませんし、戦闘終了時のメッセージにも反映されます。条件終了時は必ずスイッチはOFFにしておきましょう。忘れるとずっと倍になりっぱなしです。

*2 の数値を *3にすれば3倍になりますし、*0.5にすれば半分になります。
小数を使う場合は Math.floor()もしくはMath.ceil()で囲って小数点を消してやる必要があったと思います。

獲得金額を変更したい場合、$gameTroop.goldTotal()の処理を同様にしてやる事で対応が可能。


これを応用して、ドラゴンクエストXの「元気玉」の様なアイテムを作ってみましょう。
ドラクエにおける元気玉とは、一定時間の獲得経験値を倍にするアイテムですが、
ここでは一定戦闘回数の獲得経験値を倍にするアイテムの作り方を解説しておきます。

# 10回分の戦闘の獲得経験値を2倍にするアイテム「元気玉」の作り方

上述のスクリプトを挿入した上で、
「元気玉使用」「元気玉使用中」の2種類のコモンイベントと、
「元気玉使用時の戦闘回数」「元気玉使用中の戦闘回数」の2つの変数を用意します。

**元気玉使用のコモンイベント**
![sshot 4.jpg](https://qiita-image-store.s3.amazonaws.com/0/180923/8aaf4e27-9fdc-55e2-b494-8502f91cbada.jpeg)

上述の例同様、スイッチID100をON。
変数ID:1「現在の戦闘回数」に、ゲームデータ「戦闘回数」を変数にセットします。

**元気玉使用中のコモンイベント**
![sshot 5.jpg](https://qiita-image-store.s3.amazonaws.com/0/180923/b50de3fe-8163-3bdc-fee2-16d4a4878cc4.jpeg)

スイッチID100をトリガーとして並列処理を起動。
変数ID:2「玉使用後の戦闘回数」に、ゲームデータ「戦闘回数」を記録します。
条件分岐のスクリプトで

```js:条件分岐：スクリプト
$gameVariables.value(2) >= ($gameVariables.value(1) + 10)
```

つまり玉使用後の戦闘回数が、玉使用時の戦闘回数から10回目に達したら、
スイッチID100をOFFにして、効果を切ります。

あとはコモンイベント「元気玉使用」を実行するアイテムを作れば、完成です。

![sshot 6.jpg](https://qiita-image-store.s3.amazonaws.com/0/180923/4e13e4ed-a077-f493-54b5-4f5d3e474cd2.jpeg)
Raspberry Pi 3とAirMac Extremeでsshの設定をする


# 1. 概要

AirMac Expressに接続したRaspberry Pi 3にMacからssh接続しようとしたときにつまづいたのでメモ。どのサイトも192.168.x.xから始まるアドレスになっていたので、同じようなアドレスで設定しようとしていたのですが、AirMac側では10.0.x.xで固定する設定になっていたことが原因です。

# 2. 用意するもの

* Raspberry Pi 3
* 電源コード
* SDカード
* PC (MacBook Pro(Retina, 13-inch, Mid 2014) & macOS Sierra 10.12.3)

# ３. 方法

## ３.1 SSHを有効化する

左上のRaspberry Piマークから、「設定」->「Raspberry Piの設定」を選択します。
「インターフェイス」のタブの「SSH」の項目を有効にし「OK」を押します。

![snapshot6.png](https://qiita-image-store.s3.amazonaws.com/0/94069/07ac0a8b-491e-624a-a190-c71698e51fe5.png)


左上のRaspberry Piマークから「Shutdown」を選び「Reboot」を押して再起動します。


## 3.2 方法1: MacからAirMacユーティリティから設定する

1. AirMacユーティリティのAirMac Extremeをクリック->「編集」
　　　　
　　　　![スクリーンショット 2017-05-15 21.00.58.png](https://qiita-image-store.s3.amazonaws.com/0/94069/5289e12f-d0e3-bf91-f99f-8667c51fa811.png "スクリーンショット 2017-05-15 21.00.58.png")
　　　　
2. 「ネットワーク」タブで「DCHPの予約」欄の「+」を選択
　　　　
　　　　![スクリーンショット_2017-05-15_21_15_18.png](https://qiita-image-store.s3.amazonaws.com/0/94069/e3890ffb-b22f-229a-a98b-e65c6e7094ce.png "スクリーンショット_2017-05-15_21_15_18.png")
　　　　
3. 今回は以下のように設定しました。
    * 説明：自由に
    * アドレスの予約方法：MACアドレス
    * MACアドレス：Raspberry Piのターミナルで`ifconfig`と入力し`wlan0`の`HWaddr`に書かれている数字(xx:xx:xx:xx:xx:xx)
    * IPv4アドレス：設定したい固定アドレス
　　　　
　　　　
　　　　![スクリーンショット_2017-05-15_21_16_10.png](https://qiita-image-store.s3.amazonaws.com/0/94069/c7c16e26-bf86-fab8-ed3b-26bdc026ef46.png "スクリーンショット_2017-05-15_21_16_10.png")
　　　　
4. 「保存」を選択し、アップデートします。

この場合固定アドレスは「DHCPの範囲」のところに10.0.1.2~10.0.1.200の範囲であると書かれています。
私はこの範囲を無視して192.168.x.xのアドレスを設定しようとしていました。

もし192.168.x.xのアドレスを設定したい場合は、「ネットワークオプション」を選択し、IPv4 DHCPの範囲というところで「192.168」を選択します。

![スクリーンショット_2017-05-15_21_28_11.png](https://qiita-image-store.s3.amazonaws.com/0/94069/e36f2a74-270e-6b44-d584-a5a78e07d873.png "スクリーンショット_2017-05-15_21_28_11.png")

# 4.3 方法2: Raspberry Piから設定する方法

1. デスクトップ右上のネットワークのアイコン上で右クリック->「Wireless & Wired Network Settings」を選択

    ![snapshot3.png](https://qiita-image-store.s3.amazonaws.com/0/94069/d09f7b1d-80ed-ee7f-c6f1-19faf5899e13.png)


2. Network Preferencesのウィンドウの「Configure」で「interface」と「wlan0」を選択。

    ![snapshot4.png](https://qiita-image-store.s3.amazonaws.com/0/94069/75387ff2-e761-04e9-faeb-7da99b2e84a2.png)
    
3. 「Automatically configure empty options」のチェックを外し、その下に設定したいアドレスを入力し「適用」、「閉じる」の順に押す。
    
    
4. 確認するには「LXTerminal」を開き、`ifconfig`と入力し、wlanのアドレスを確認する。

![snapshot5.png](https://qiita-image-store.s3.amazonaws.com/0/94069/0fc85a19-4f1b-6b6c-7ea0-a9a3503d6f96.png)

# Raspberry Piを再セットアップしたらエラーが発生した

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
(略)
```
以下のサイトを参考にして`ssh-keygen -R [remote_host_name]`してみた。するとSSH接続するときに確認されるが`yes`と答えるとSSH接続が完了した。

* 参考：[SSH接続エラー回避方法：.ssh/known_hostsから特定のホストを削除する/削除しないで対処する3つの方法 - Qiita](http://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938)
Docker | docker id does not support capital letter user name

docker id には大文字が使えないっぽい。

# Capital letter case (Error)

```
$ docker login
```

```
Username: YumaInaura
Password:
```

```
Error response from daemon: Get https://registry-1.docker.io/v2/: unauthorized: incorrect username or password
```

# Lower letter case (Succeed)

```
$ docker login
```

```
Username: yumainaura
Password:
```

```
Login Succeeded
```

# On Web Sign up

If you inputted capital case to Username,

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/d2d70536-d414-646f-4a5f-e92f2e67023b.png)

This interface replace capital case with lower case silently.

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/5ef00f20-c0d5-fa6a-96ba-5e6a035579b5.png)

Opps!

# I think

Replace letter case automatically in docker services is better.

And I think "Username" expression is bad 
Display "username" is better.










<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Alibaba CloudのECSインスタンスにMackerel-Agentをインストール方法

## はじめに
qiitaでは、[Mackerelについての記事](http://qiita.com/search?q=mackerel)が多いですが、クラウドサーバー(Alibaba Cloud, AWS)へのインストール方法をまとめる記事がまだ存在していないため、インストール方法について書きたいと思います。

## Mackerelのインストール手順

### グローバルIPを持つインスタンスの場合

グローバルIPを持つインスタンスはインターネットへ接続可能のため、[公式ドキュメントにある手順](https://mackerel.io/ja/docs/entry/howto/install-agent)の通りにインストールすることができます。自動化したい場合は、`ansible`や`chef`といったプロビージョンニングツールを使えばよいでしょう。

その一方、Alibaba Cloud のECSの場合は、「ユーザーデータ」という機能を利用してインストールすることもできます。Alibaba CloudのECSを購入する画面にあります。
![image](https://qiita-image-store.s3.amazonaws.com/0/74420/094ed2bf-a5f4-ec4f-6d74-ab5d2c7a600b.png)

ユーザーデータの入力ボックスに渡されるコマンドは、インスタンスが作成・初期化された後で実行されます。この機能を使えば、インスタンスを初期設定をBootstrapすることができます。

今回は、ユーザーデータを使用して、インスタンスを作成した後で `mackerel-agent`を自動インストールしたいと思います。インスタンス購入画面で、スペックなどを選択した後で、ユーザーデータのところに、以下のBashスクリップを入力することで、インスタンス作成が終わったあとで、`mackerel-agent`がインストールされます。

```
#!/bin/bash
curl -fsSL https://mackerel.io/assets/files/scripts/setup-yum.sh | sh
sudo yum install -y mackerel-agent
sudo yum update -y mackerel-agent
echo 'apikey = "<YOUR_API_KEY>"' | sudo tee --append /etc/mackerel-agent/mackerel-agent.conf
systemctl enable mackerel-agent
```

`YOUR_API_KEY`はMackerelの管理画面で確認できます

![image](https://qiita-image-store.s3.amazonaws.com/0/74420/cd6fbe03-49e0-e63b-ad69-5dfd9bce1996.png)

インスタンスが「実行中」の状態になったら、SSHでログインし`mackerel-agent`のインストールが確認できます。

```
[telescreen@iz6weh3wauwb270w71hzitz ~]$ cat /etc/mackerel-agent/mackerel-agent.conf$ cat /etc/mackerel-agent/mackerel-agent.conf
# pidfile = "/var/run/mackerel-agent.pid"
# root = "/var/lib/mackerel-agent"
# verbose = false
# apikey = ""

# [host_status]
# on_start = "working"
...
apikey = "<YOUR_API_KEY>"
[telescreen@iz6weh3wauwb270w71hzitz ~]$ sudo systemctl start mackerel-agent
[telescreen@iz6weh3wauwb270w71hzitz ~]$ systemctl status mackerel-agent
● mackerel-agent.service - LSB: start and stop mackerel-agent
   Loaded: loaded (/etc/rc.d/init.d/mackerel-agent; bad; vendor preset: disabled)
   Active: active (running) since Fri 2017-05-12 17:11:09 CST; 2 days ago
     Docs: man:systemd-sysv-generator(8)
  Process: 2127 ExecStart=/etc/rc.d/init.d/mackerel-agent start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/mackerel-agent.service
           └─2129 /usr/bin/mackerel-agent --pidfile=/var/run/mackerel-agent.pid --root=/var/lib/mackerel-agent

May 12 17:11:06 iZ6weh3wauwb270w71hzitZ systemd[1]: Starting LSB: start and stop mackerel-agent...
May 12 17:11:09 iZ6weh3wauwb270w71hzitZ mackerel-agent[2127]: Starting mackerel-agent:[  OK  ]
May 12 17:11:09 iZ6weh3wauwb270w71hzitZ systemd[1]: Started LSB: start and stop mackerel-agent.
```

Mackerel管理画面の方でも、インスタンスのホスト名が表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/74420/d9386cd8-e89b-a923-a565-08c2ede9a1dd.png)


### グローバルIPを持たない場合

[VPCのSNATゲートウェイの作成手順](http://qiita.com/talzeus/items/2cd54f6e3042af217e4c)に書いた通りにまずSNATゲートウェイを設定してから、グローバルIPを持つ手順通りに設定できます。
docker psで特定のカラムだけ出力


```bash
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                                                    NAMES
d5a8c739ee64        fluent/fluentd:stable       "/bin/sh -c 'exec ..."   22 hours ago        Up 44 minutes       5140/tcp, 24224/tcp                                                      srv_fluentd_1
924087a0909d        minio/minio                 "/usr/bin/docker-e..."   22 hours ago        Up 44 minutes       0.0.0.0:9000->9000/tcp                                                   srv_s3minio_1
052a30806814        redis:latest                "docker-entrypoint..."   22 hours ago        Up 44 minutes       6379/tcp                                                                 srv_redis_1
7061da5cc50a        kalabox/proxy:stable        "/init"                  2 months ago        Up 46 minutes       127.0.0.1:80->80/tcp, 127.0.0.1:443->443/tcp, 127.0.0.1:8160->8160/tcp   kalabox_proxy_1
48de439e470b        kalabox/unison:2.49         "/run.sh"                2 months ago        Up 46 minutes                                                                                pouchdbsync_unison_1
```

## `CONTAINER ID`と`NAMES`のカラムだけ出力する

`COMMAND`とか`PORTS`とかは削り、カラム名つけて出力


```bash
docker ps --format "table {{.ID}} {{.Names}}"
```
```bash
# 出力
CONTAINER ID        NAMES
d5a8c739ee64 srv_fluentd_1
924087a0909d srv_s3minio_1
052a30806814 srv_redis_1
7061da5cc50a kalabox_proxy_1
48de439e470b pouchdbsync_unison_1
```

## `NAMES`のカラムだけ出力。カラム名は不要

```bash
docker ps --format "{{.Names}}"
```
```bash
# 出力
srv_fluentd_1
srv_s3minio_1
srv_redis_1
kalabox_proxy_1
pouchdbsync_unison_1
```

## Doc

https://docs.docker.com/engine/reference/commandline/ps/#formatting

- シンタックスは、go temlate
BCPとbcp

BCPは事業継続計画だが、bcpはbulk copy program だ。
bcpとタグを打ったらBCPに書き直さないでくれ。

それともマイナーなbcp(bulk copy program)はbcpユーティリティというタグを新設して移動すべきか？

##bcp
MicrosoftのSQL Serverのツールにbcpというツールがあります。
bulk copy programの略。
csvのデータをSQL Serverに取り込むなどの処理をしてくれます。

[bcpユーティリティ](https://msdn.microsoft.com/ja-jp/library/ms162802.aspx)

##BCP
BCP(Business Continuity Plan)、事業継続計画という言葉もあります。
テロや大規模災害があった時にどのように早期に復旧し事業を継続するのかを平時の時から決めておき準備しておく活動です。

[BCPとは](http://www.chusho.meti.go.jp/bcp/contents/level_c/bcpgl_01_1.html)

##どっちの意味で言ってるの？
僕ら企業の中に入っている情報システム屋やシステム管理運用部隊はどっちの言葉もよく使うんです。

SQL Serverからcsvデータ吐き出すのにはbcpユーティリティだよね。

偉い人から
「我が社のBCPはどう考えているのかね。
本社で大地震が起こって壊滅的な被害が出たとしても我が社は事業を継続することは出来るのかね？
サーバーのバックアップは遠隔地にあるのかね？」
なんて聞かれることあるわけです。

##ハッキリ決めるべき
情報共有の為の仕組みと名打っているQiitaの場合はハッキリ決めるべきだと思う。
共通認識の上の知識なのですから。



##議論で決めるべき？
Wikipediaの場合、同じような略語があった場合は振り分けするようなページが出てきます。
Wikipediaは記事にいちゃもんをいつでもどの場合でもつけられるような仕組みになっている。
タグについて相談するような場が必要なのかもしれません。

あまりにも相互監視を厳しくし過ぎると厳しすぎて誰も記事を書かなくなる可能性も出てくるので匙加減は難しいです。
Docker 初心者 |  python サーバーを起動してローカルからアクセスする | 公式チュートリアル part2 より

# Dockerfileを作成

ローカルの適当なディレクトリに Dockerfile を作る。

```bash:Dockerfile
# ベースとなるイメージの指定
# 自動的に docker hub からダウンロード出来る
FROM python:2.7-slim

# コンテナのワークディレクトリの指定
WORKDIR /app

# ローカルのカレントディレクトリの中身を全て コンテナのワークディレクトリにコピーする
# コンテナ実行時ではなく、イメージ作成時にコピーされる
ADD . /app

# python スクリプトでモジュールをインストールするための処理
RUN pip install -r requirements.txt

EXPOSE 80

# 環境変数の指定
# Docker コンテナで export NAME=World した状態になる
ENV NAME World

# コンテナ実行時に走らせるコマンドの指定
# この例では $ python app.py というコマンドが走る
CMD ["python", "app.py"]
```

# スクリプト作成

同じディレクトリにpythonスクリプトを作る。

```py:app.py
from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr('counter')
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv('NAME', "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
	app.run(host='0.0.0.0', port=80)
```

```text:requirements.txt
Flask
Redis
```

# イメージの作成

Dockerfile を元に、名前付きでイメージを作る。

```
docker build -t python-server .
```

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python-server       latest              c3907742b08f        7 seconds ago       195 MB
```

# コンテナの作成

ポートを指定してコンテナを走らせる。

この例では docker上の80番を、ローカルの4000番からアクセスできるようにする。

```
docker run -p 4000:80 python-server
```

## ローカルからアクセス

http://localhost:4000/ が表示できたら成功だ。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/0ab1872b-1fd9-16b8-c5d1-5453769328c8.png)

(手元ではなぜかredisが動いていなかった…あとで調べる)

# dockerサーバーに入る

コンテナ実行中であれば、dockerサーバーに直接入ることが出来る。

## プロセスIDの確認

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                  NAMES
c7b95a8a2a22        python-server       "python app.py"     About a minute ago   Up About a minute   0.0.0.0:4000->80/tcp   examole-server
```

## exec

コンテナIDを指定して `docker exec` する。

例:

```
docker exec -it c7b95a8a2a22 /bin/bash
```

## ファイルの確認

dockerコンテナ上にファイルが展開されているのが分かる。

```bash
$ ls
Dockerfile  app.py  requirements.txt
```

## 環境変数の確認

Dockerfileに記述した環境変数が export されている。

```bash
$ echo $NAME
World
```

# 参考

- [Get Started, Part 2: Containers - Docker Documentation](https://docs.docker.com/get-started/part2/)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Vim patchダイジェスト [2017/05]

[Vim](http://www.vim.org/) patchダイジェスト \[2017/05]
([8.0.0595](https://github.com/vim/vim/commit/beb9cb19c660484488a71a25eda46ab0fa579278) ～ [8.0.0606](https://github.com/vim/vim/commit/6e62da3e14d32f76f60d5cc8b267059923842f17))

* [runtimeファイル更新](https://github.com/vim/vim/commit/b4d6c3ea4a59c6d8d4e0e52120596866f0edd510): sbtのftplugin, syntax定義を追加。他。
* [8.0.0602](https://github.com/vim/vim/commit/2a79ed293c077ba791db962f0e121cf97ba4f7a7): `gF`が失敗した場合にカーソルが移動してしまうことがある件を修正しました。
* [8.0.0596](https://github.com/vim/vim/commit/4475b623960671898dac6a72b13a8d140402afa6): `'completefunc'`に設定した関数内で`complete_add()`の後に`complete()`が呼ばれるとクラッシュする件を修正しました。

---
#### 凡例

|表記|意味|
|:------|:------|
|:four_leaf_clover:|新機能|
|`'hoge'`|オプション (`:h options`参照)|
|`:hoge`|Exコマンド (`:h :index`参照)|
|`hoge()`|組み込み関数 (`:h functions`参照)|
|`v:hoge`|Vim定義済変数 (`:h v:`参照)|

---
#### 方針
[こちら](http://qiita.com/h_east/items/23cd0d10932505072e6b#%E6%96%B9%E9%87%9D)を参照。

---
#### ひとこと
5月はBram氏多忙につきpatchはあまりリリースされませんでした。
[todo](https://github.com/vim/vim/commit/b4d6c3ea4a59c6d8d4e0e52120596866f0edd510#diff-38d7929bd26d74d92ceddf984bbfc8db)は更新されていますのでご安心を。
デザインパターン学習メモ：「Facade」

## このパターンの目的
GoF本より引用する。

> サブシステム内に存在する複数のインタフェースに１つの統一インタフェースを与える。Facadeパターンはサブシステムの利用を容易にするための高レベルインタフェースを定義する。(P.197)

多数のクラスが依存し、それぞれが依存関係をもつような複雑なシステム（ライブラリ）があったとする。このシステム（ライブラリ）の利用者は、システムの内部（クラス構造）を知り、それらのクラスを組み合わせて目的を達成しなければならない。

複数の利用者がいた場合、それぞれが複雑な構造を理解しなければいけない状態は、なかなか辛い。

そこで複雑なシステム側に新たにインタフェース（クラス）を作成し、利用者はそのクラスのメソッドを呼びだせば大抵の目的を達せられるようにする。

もともとあったクラス群については隠蔽せず、そちらを使いたい人は使えばよい。

しかし、多くの利用者は新たに作成されたインタフェースを用いるだろう。

## 実装例
サンプルコードは割愛する。（他のパターンと比べるとシンプルで理解しやすいため）

Facadeパターンの実装方法はシンプルで、利用者が使うクラス（統一的なインタフェースを示す。Facade役）を１つ作ればよい。

このFacade役のクラスは、「実際の処理を担当する各クラス」への参照を持ち、「委譲」を用いて処理を進める。反対に、「実際の処理を担当する各クラス」からFacade役クラスへの参照を持つことはない。

## 利用例
GoF本のコンパイラサブシステムの例がわかりやすい。

「Scannerクラス」、「Parserクラス」、「ByteStreamクラス」...などを組み合わせてコンパイル処理を実施する必要がある場合、「Compilerクラス」(Facade役)を作成し、そこに「compileメソッド」を実装する。

そうすると、利用者はこのメソッドを呼び出すだけで、各クラスの使い方やそのクラスの存在自体を知らなくても、容易にコンパイル処理を行える。

## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一、吉田　和樹 監訳、SBクリエイティブ
ビルド開始後、不可解なエラーが出た場合の対処方法

キャッシュの状態を確認<br>
```
$ ccache -s
```
必要に応じて例えば10GBに増やす<br>
```
$ ccache -M 10G
```
キャッシュをクリア<br>
```
$ ccache -c
```
ビルド再開<br>
[Androidのビルド開始手順](http://qiita.com/SaburoJiro/items/7b456297fb4aa3b32c62)を参考<br>
以上です。<br>
ベクトルを任意の範囲に標準化する

　適当なベクトル　$v$ を、範囲 $[0, 1]$ や $[-1, 1]$ に標準化する機会は多いですね。
今、$v$ を以下のようにランダムな数値を持つベクトルとして作ります。

```python:random_vector.py

import random
random.seed(1)
v = [random.random() for _ in range(10)]

```

　上のpythonコードで、$v$ は例えば以下のように与えられます。

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/122354/bad2d14d-bdab-f6a5-d7c3-75d1c07351d2.png)

　このベクトルを範囲$[0,1],[-1,1]$に標準化するには、それぞれこうします。

- $[0,1]$へ標準化

```math

\frac{v - min(v)}{max(v) - min(v)}

```

- $[-1,1]$ へ標準化

```math

\frac{2v - (max(v) + min(v))}{max(v)-min(v)}

```

　これにより、$v$ は線形に標準化されます。

![figure_2.png](https://qiita-image-store.s3.amazonaws.com/0/122354/b473a634-e9e4-1c4f-129f-e9fb3ad234e8.png)


　ただ、ベクトルを**任意の範囲** [newmin, newmax] に**標準化**したいときってありますね。

　そんなときには、まず2つの定数 $a, b$ を計算します。

```math

a = (newmax - newmin)/(max(v) - min(v))　\\
b = newmax - a*max(v)

```

　このとき、$b = newmin - a*min(v)$でも同じです。

　最後に、**$a$ が傾き、$b$ が切片となる一次関数**を作り、元のベクトル$v$ を代入すれば、線形に標準化された新しいベクトルが出てきます。

```math

normalized\ vector = a*v + b

```

　これが、ベクトルを線形に標準化するときの一般形です。

　Python、 Matlabでベクトル $v$ を範囲 [newmin, newmax] に標準化するコードを載せておきます。

***
 Python


```python:normalize.py

def normalize(v,newmin,newmax):
    a = (newmax - newmin)/(max(v) - min(v))
    b = newmax - a*max(v)
        
    return [a*i + b for i in v]

```

***
Matlab

```matlab:normalize.m

function [normalized_vector] = normalize(v, newmin, newmax)

a = (newmax - newmin)/(max(v) - min(v));
b = newmax - max(v)*a;

normalized_vector = a*v + b;

```

***
昨日の続き　kivy

注意書き：
日本語表示するために、うまくいかず調べてたらすっきりする方法が見つかりました。下の方に、自分が調べた限り少ない記述でのやり方を書いてますが、~~記録としてめんどくさいやり方も残しておきますｗ~~

※読み返してみたらすぐ下に書いてあるコードがめんどくさいみたいにとれる感じがしたので書き直してます。
自分のめんどくさいやり方というのは
kvファイルのLabelに1個ずつ font_name: ~ を
書くやり方ですｗ（追加する部分が３つしかないので、気付くまでそれで対処しようとしてた）


---


#ここからが本題
```
from kivy.core.text import LabelBase, DEFAULT_FONT
from kivy.resources import resource_add_path

resource_add_path('./fonts')
LabelBase.register(DEFAULT_FONT, 'mplus-2c-regular.ttf') 
```
記事通りならこれでとおるはずなんだが、自分の環境のせいなのか通らない。

記述が間違ってないかも確認したし、全コピペでもだめだった。
ttfファイルを置いた階層も間違ってないはずなのに・・・

対処法：
KvファイルのLableに
font_name: "HGRPP1.TTC"
これをはっつけた。

このファイルは自分の場合(Windows10)
CドライブのWindow/fonts　の中からコピーして持ってきた

置いた場所は
main.py
test.kv
HGRPP1.TTC
と、いう感じ。

まだ枠数が少ないから4か所程度で済んだけど、大きいプログラムを作るときが来た場合のために、勉強しながら探していこう。。

ちなみに結果はこんな感じ。

![bandicam 2017-05-16 03-11-37-001.jpg](https://qiita-image-store.s3.amazonaws.com/0/158551/9308240a-5a67-f848-12f3-37f3971fcb2e.jpeg)

![bandicam 2017-05-16 03-11-42-362.jpg](https://qiita-image-store.s3.amazonaws.com/0/158551/835add46-71c9-f59e-c398-b2925a600b03.jpeg)

![bandicam 2017-05-16 03-11-45-773.jpg](https://qiita-image-store.s3.amazonaws.com/0/158551/7fa5a760-270d-e775-c915-bb3202f8cddb.jpeg)

![bandicam 2017-05-16 03-11-48-089.jpg](https://qiita-image-store.s3.amazonaws.com/0/158551/0700e232-5639-2d6d-4040-e40b45610b17.jpeg)

なんとか日本語表示をすることは出来た。
補足：
このやり方だとこの記事の上の方に書いてあるコードはいらないです。

さっき調べたときに
<Label>:
    font_name: "HGRPP1.TTC"

っていうふうに書くってのがあったんだけど、なんで出来ないんだろうって思ってたらインデントをミスってただけでしたｗ


最終的に日本語表示するときはこのやり方にしましたｗ

```
TextWidget:
<Label>:
    font_name: "HGRPP1.TTC"

<MyButton@Button>:
    font_sise: 68

<TextWidget>:
    BoxLayout:
        orientation: 'vertical'
        size: root.size

        # ラベル
        Label:
            size_hint_y: 0.7
            id: label1
            font_size: 68
            text: root.text
            color: root.color
        
        BoxLayout:
            size_hint_y: 0.3
            padding: 20,30,20,10
            Button:
                id: button1
                text: "朝"
                font_size: 68
                on_press: root.buttonCliked()

            Button:
                id: button2
                text: "昼"
                font_size: 68
                on_press: root.buttonCliked2()

            Button:
                id: button3
                text: "夜"
                font_size: 68
                on_press: root.buttonCliked3()
```

pyファイル(メインのファイル)と同じ場所に
紹介されていた記事の
mplus-2c-regular.ttfというファイルも配置すればちゃんと読み込んでくれました。

こんなかんじで。

![bandicam 2017-05-16 03-34-48-117.jpg](https://qiita-image-store.s3.amazonaws.com/0/158551/2b91e7d1-aaac-6a0f-bca3-a18a4c2e960d.jpeg)

ただ今後、音楽や画像などを使ったりするときはごちゃごちゃするのでsoundフォルダやimageフォルダ, fontsフォルダなどを作り
font_name: "./fonts/mplus-2m-medium.ttf"
と書いた方がフォルダの中がスッキリします。
（kvファイルの方にパス指定するとうまくいくんだよなぁ。。）

まぁこのやり方が記述短いしいっか！

そして現在１７のところ！

起動時orサンプル１クリック時に同じ画像らしいんだけど、
起動時だと真っ白なんだよねえ・・

ボタンを押すと画像が切り替わる機能はちゃんと動いてるのになんでだろー。


---

2017/5/16
追記:
記事の作成者様から元記事の補足と訂正のコメントをいただきました。
解決しました！

ありがとうございます！
パスワード生成プログラムの JavaScript 版

先日公開した Python 3 の[パスワード生成プログラム](http://qiita.com/sekik/items/37e283f527301ec50c98)の JavaScript 版を作成した。

[パスワード生成プログラムのデモ](http://seki.webmasters.gr.jp/password.html)

使い方としては

- html ファイルのソースコードを編集して、サイトごとの情報を入れる。
- 「マスター」にマスターパスワードを入れると、リアルタイムでパスワードが生成され「コピー」でクリップボードにコピーされる。
- モバイルからhtml ファイルにアクセスして使う。
- PC から使う場合には Python 3 版の方が便利で、Python 版と JavaScript 版で、サイト情報が同じであれば同じマスターパスワードから同じパスワードが生成される。
Firebase Admin SDKのない言語でユーザ管理操作をする

**自己責任でお願いします。**

# Firebase Admin SDK Auth API

https://firebase.google.com/docs/auth/admin/

Firebaseの認証機構は非常に便利ですよね。この認証情報にサーバサイドからアクセスするにはAdmin SDKを使います。

しかし、このAdmin SDKはNode.jsとJavaしか提供されていない上、2017/5/16現在、Admin User Management APIはFirebase Admin Node.js SDKでしか利用できません。

例えば、サーバ側でFirebaseにアカウントを作成・削除したり、カスタム認証を使用している場合にリクエストで受け取ったUIDのプロバイダ情報にアクセスしたいような場合、SDKがないと困ってしまいます。

Node.jsでサーバを書いていればいいですが、Javaで書くことも多いでしょうし、PythonやGo言語とかで書きたいこともあるでしょう。

Firebaseの認証機構はGoogle IdentityToolKitとの統合を図っており、IdentityToolKitのREST APIを使うことでAdmin SDKのない環境でもデータを取得することができます。

APIリファレンス：https://developers.google.com/identity/toolkit/web/reference/relyingparty

例えば、ユーザのアカウント情報をFirebase UIDから引きたい場合は、`https://www.googleapis.com/identitytoolkit/v3/relyingparty/getAccountInfo`にそのままUIDを渡せば大丈夫です。

リファレンス：https://developers.google.com/identity/toolkit/web/reference/relyingparty/getAccountInfo

APIの引数にトークンとありますが、サービスアカウントの場合はシークレットトークンから生成できます。

identitytoolkitはJavaやGoを始めとして多くの言語に対応した公式のSDKがあるので、そちらを使うことも出来ます。

公式リファレンスのトップに大きく書かれているように、将来的にはFirebaseに統合される事となると思います。Firebase Admin SDKが整備されたらそちらを使いましょう。どうしても急ぎでこれらを使う場合は、抽象化したラッパーをかませるように設計しておくことをおすすめします。
開発用ドキュメントの配置

​
### はじめに

プロジェクトのドキュメント配置について、いろいろな選択肢があると思うので整理したい。

### github形式のリポジトリ

そもそもなぜドキュメント配置に悩むようになったかと言えば、githubのリポジトリには直下にREADME.mdがあり、ここに概要を書いてwikiにドキュメントを充実させていくので十分なんだっけ？というところから始まる。
１つのリポジトリで完結するようなライブラリはこれでもいいと思う。wikiに画像をupできないが、<プロジェクト名>.wikiとしてチェックアウトする事で画像もコミットできるので、このやり方に慣れれば特に問題ないはず。ブラウザ上で履歴や差分も確認できる。


### srcとdocは近い方がいい
元々はprojectリポジトリにdocフォルダを作成して、そこにmdファイルをアップしていた。これはこれでsrcとdocが一リポジトリで完結して収まりが良い。docの名前はdocsの方がしっくりくるとかはこの際どうでも良くて、docの部分もsrcと同じようにプルリクしたりレビューしたり履歴確認できるので業務でチーム開発するにはこれがいいんじゃないのか。
全体としては一つのサービスでもマイクロサービスに分割しておいて、サービス間はjsonやprotocolbufなんかで連携して、各マイクロサービスごとにデプロイできたり、技術的に古くなったりしたら入れ替えたりできるようにしておきたい。
例えばあるサービスではmember/order/productの各マイクロサービスで構成するとしてらこんな感じになる。

```
member/
  |-doc/
  |-src/
    |-main/
    |-test/
order/
  |-doc/
  |-src/
  ...
product/
  |-doc/
  |-src/
  ...
```

サービスのドキュメントには各サービスの概要、満たすべき仕様(API仕様書など)や、テスト、デプロイ方法などを記述する。

未だにドキュメントとソースが一対一の関係になるような詳細設計書を書いてる人はほとんどいないと思う。その時間でソース書けるし改修の時に置いていかれてソースとドキュメントが乖離する原因になるからだ。テストについては自動化するとしても、その自動化したテストが要件をすべてチェックしているかどうか確認するための一覧用のドキュメントは欲しいところだ。


### プロジェクト全体のドキュメント

srcとdocが近い方がいいとはいえ、要件定義とかアーキテクチャ設計、配置図などプロジェクトを通したドキュメントはどうするか。これらは各マイクロサービスで共通となるので、プロジェクト用docリポジトリを作った方がよくなる。会議の議事録なんかもこのリポジトリに突っ込めばすべてgitで履歴管理できて便利。まあでもプロジェクト管理用に別途JiraでもRedmineでも導入して、そこのwikiで履歴管理した方がわかりやすいか。

偉い人(コードの読めない人)に見せる時用にdocリポジトリは一つになってる方が便利な時もありそう。でもやっぱりマイクロサービスならDB定義やテスト仕様書は各サービスごとに独立しているべきである。でないと一部サービスだけ技術入替とかをする時に影響範囲が多岐に渡ってしまい、改修漏れなどの原因となる。

```
proj_doc/
|- requirements/
|- architecture/
|- basic design/
|(- management/ ... 管理用)

proj_member/
|- doc/
|- src/

proj_order/
|- doc/
|- src/
...
```

### まとめ
というわけで新しくprojを始める時はまずproj_docを作ってそこに要件定義とか進捗とかを入れていくことになるのね。そして各マイクロサービスに個別のdocを掘る。

前に書いたときと違う結論になってしまったけど、やっぱりこっちの方がいいな。
fenrirにMigemoを導入する（2017年版）


色々調べてやったけど、書いてあることがバラバラでスゲェ混乱したのでメモ。

## パッケージのダウンロード
- fenrir本体
    - http://hp.vector.co.jp/authors/VA026310/soft2.htm
        - fenrir075c.zip
- Migemo
    - https://www.kaoriya.net/software/cmigemo/
        - 「C/Migemo for Windows 32bit」＝cmigemo-default-win32-20110227.zip
        - または「C/Migemo for Windows 64bit」＝cmigemo-default-win64-20110227.zip
- BREGEXP.DLL
    - http://www.hi-ho.ne.jp/babaq/bregexp.html
        - 「Down Load! 」リンクから「bregexp.lzh」

全部必須。

## 配置
fenrirを適当な場所に解凍。

fenrir.exeがあるのと同じフォルダに、以下を配置。

① cmigemo-default-win32(64)-20110227.zip内の、dictフォルダの中の、cp932サブフォルダを、「dict」とリネームして配置。
 
    dict
    ┣han2zen.dat
    ┣hira2kata.dat
    ┣migemo-dict
    ┣roma2hira.dat
    ┗zen2han.dat

この5つが入っているはず。

②bregexp.lzh内の、BREGEXP.DLLのみ。

### 余談
fenrir.exeがあるのと同じフォルダというのは、普通にfenrirを起動した場合の作業フォルダのこと。

`/dir`オプションを利用すると指定のフォルダ以下を検索することができるが、ここで指定したフォルダは「作業フォルダ」ではない。（インスタントコマンドにおける`%W`変数に格納されない。）  
作業フォルダが変わるのは、Windowsショートカットを作るかランチャ系アプリに登録するかして、わざわざ別の作業フォルダを指定した場合のみ。

そんなめんどうなことはしなければいいのだが、インスタントコマンドで別の作業フォルダを参照したい場合は変えるしかない。  
その場合、「作業フォルダにdata\fenrir.iniがなければ`/inifile`オプションを指定」→「作業フォルダにdictフォルダがなければiniファイルで`MigemoDictPath`を指定」でMigemoが使える。`MigemoDictPath`については後述。

## 設定
data\fenrir.iniが存在しない場合、fenrirを一度起動し、終了する。するとdata\fenrir.iniが作成される。

その後、fenrir.iniのmigemo関連項目を変更する。以下設定例。

```ini
MigemoMode=2
MigemoStrings=
MigemoDictPath=
MigemoStartLen=3
```

MigemoMode     ：Migemoを使用するかどうか。どのモードで使用するか。
MigemoStrings   ：`MigemoMode=1`の場合の起動文字列。
MigemoDictPath：migemo-dictファイルのパス。dictフォルダのパスではない。通常は設定の必要はない。フルパスもしくは作業フォルダからの相対パスで記述。
MigemoStartLen：Migemoを起動する文字数。初期設定は3文字＝2文字までは起動しない。


`MigemoMode=0`では、Migemoを使用しない。

`MigemoMode=1`では、`MigemoStrings`の入力によりMigemoを起動する。例えば、以下のような設定で、pathに「C:\app\あふ」が含まれるとすると、「@afu」でヒットする。

```ini
MigemoMode=1
MigemoStrings=@
MigemoDictPath=
MigemoStartLen=3
```

`MigemoMode=2`では、大文字入力によりMigemoを起動する。例えば、「Afu」でヒットする。

`MigemoMode=3`では、小文字入力によりMigemoを起動する。例えば、「afu」でヒットする。

編集が終わったら、fenrir.iniを保存した上で、fenrirを起動する。これでMigemoによるローマ字日本語検索ができるようになっているはず。

## 注意点
fenrir.iniを編集するエディタに注意。文字コードが変更されるとfenrirが正常に動作しなくなる場合がある。

実際、UTF-8モードのoeditで編集したらえらい目にあった。文字コードSJISで改行コードCR+LFなら大丈夫だと思うのだが、とりあえずメモ帳でやれば確実。
git fetchしてgit branch -rしてもリモートブランチが表示されなかった時

# 他の人のブランチをcheckoutしようとしたができない
remoteブランチがローカルの端末上だと表示されない。git fetch しても何をしてもどうしてもremoteブランチを取得できなかった。

行き着いた先のstackoverflow
http://stackoverflow.com/questions/12319968/remote-branch-not-showing-up-in-git-branch-r

つまり gitのconfigがおかしい。
.git/config
を覗いてみると以下の通り。

```
  1 [core]
  2     repositoryformatversion = 0
  3     filemode = true
  4     bare = false
  5     logallrefupdates = true
  6     ignorecase = true
  7     precomposeunicode = true
  8 [remote "origin"]
  9     url = https://github.com/github_account_name/hoge.git
```

ここに

```
10     fetch = +refs/heads/*:refs/remotes/origin/*
```

を追加することで正しくリモートブランチをfetchすることができました。
mac上の仮想環境に構築したcentos7にPHPを導入する

## リポジトリの導入
centosの標準リポジトリにはないモジュールを導入するために外部リポジトリをインストールで利用するための登録をします。

### EPELリポジトリ
EPELリポジトリをインストールします。

```
[vagrant@localhost ~]$ sudo yum install epel-release
〜省略〜
================================================================================
 Package                アーキテクチャー バージョン      リポジトリー      容量
================================================================================
インストール中:
 epel-release           noarch           7-9             extras            14 k
〜省略〜
インストール:
  epel-release.noarch 0:7-9                                                     

完了しました!
```

###remiリポジトリ
remiリポジトリをインストールします。

```
[vagrant@localhost ~]$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
http://rpms.famillecollet.com/enterprise/remi-release-7.rpm を取得中
警告: /var/tmp/rpm-tmp.SPvaji: ヘッダー V4 DSA/SHA1 Signature、鍵 ID 00f97f56: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:remi-release-7.3-1.el7.remi      ################################# [100%]
```

##PHPのインストール

```
[vagrant@localhost ~]$ sudo yum install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd

[vagrant@localhost ~]$ php --version
PHP 5.6.30 (cli) (built: Jan 19 2017 07:57:06) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
```

##composerの導入
```
[vagrant@localhost ~]$ sudo curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...

Composer (version 1.4.1) successfully installed to: /home/vagrant/composer.phar
Use it: php composer.phar
```
composerをパスの通った場所へ移動します。

```
[vagrant@localhost ~]$ sudo mv composer.phar /usr/local/bin/composer
```

## 参考
macOS Sierra バージョン10.12.4
Vagrant 1.9.4
VirtualBox 5.1.22
CentOS 7.0 64bit
PHP 5.6.30
composer 1.4.1

***
## シリーズ一覧 (vagrant centos LAMP環境構築）
1.[macにvagrantでcentos7の仮想環境を構築したときの初期設定](http://qiita.com/saboten10/items/40a1331b69536534b7dc)
2.[mac上の仮想環境に構築したcentos7にPHPを導入する](http://qiita.com/saboten10/items/7026539e47093a62673c)
3.[mac上の仮想環境に構築したcentos7でPHPのビルトインサーバーを利用する](http://qiita.com/saboten10/items/e916bd2cd33c059f266b)
4.[mac上の仮想環境に構築したcentos7にapahceを導入する](http://qiita.com/saboten10/items/4bf506c81b5eed3aae78)
5.[mac上の仮想環境に構築したcentos7にmysqlを導入する](http://qiita.com/saboten10/items/298e884c953255708a61)
6.[centos7に導入したMySQL5.6の初期設定と動作確認](http://qiita.com/saboten10/items/4d2c79d507d1eae00d1b)
SwiftではバージョンはStructにして演算子オーバーロードで比較したらどうでしょう

# はじめに

iOSアプリでは現在実行中のバージョンを前回起動した際のバージョンと比較したり、特定のバージョンと比較したりということがあります。そういう時、バージョン表記としてStringで取得できる"1.0.1"のようなカンマが2つある文字列はそのままでは数値として成立しないので比較することが出来ません。その解決方法として、簡単なのはStringのcompareメソッドで比較したりしますよね。ただ、compareするにしても演算子（オペレータ）オーバーロードを使えば表現が分かりやすくなりますよという話を書いておきます。

3行くらいでやりたいことをまとめると

- iOSで取得できるバージョンの文字列は大抵カンマが2つありそのまま数値にして比較できない
- Stringの文字列比較で大小を比べられるため大抵はそれをメソッド化する
- メソッド化するにしても`Version`という型を演算子で比較できるようにしとけば分かりやすい表現になる

# struct でバージョンを表現する

まずstructでVersionを定義する

```swift
struct Version {
    let rawString: String    
}
```

次に演算子オーバーロードを定義します。

```swift
func < (lhs: Version, rhs: Version) -> Bool {
    if lhs.rawString.compare(rhs.rawString, options: .numeric) == .orderedAscending {
        // バージョンの文字列を数値として比較してます。"1.0.1" < "2.0" なら .orderedAscending
        return true
    }
    
    return false
}
```

compareの戻り値は enum ComparisonResult なので `.orderedAscending` などが返ってくるんですが、そういうのを隠蔽化したいという話ですね。

利用例は

```swift
Version(rawString: "1.0.0") < Version(rawString: "2.0") // true
Version(rawString: "1.0.0") < Version(rawString: "0.2") // false
```

このままで何のバージョンにでも使えるようなVersionが作れました。しかし、現在のアプリのバージョンが一番使うじゃないですか。というかそのために作ってるので次のように取得できるようにします

```swift
extension Version {
    static let currentApp = Version(rawString: Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String)
}
```

利用例は次のようになります。

```swift
print(Version.currentApp.rawString) // 1.0
Version(rawString: "0.1") < Version.currentApp // true
Version(rawString: "1.1") < Version.currentApp // false
Version(rawString: "10.1") < Version.currentApp // false
```

ちなみにXcode8.3.2のPlaygroundでは CFBundleShortVersionString で取得するバージョンは1.0になっていましたのでそれとの比較になります

ただ、Versionのextensionでアプリのバージョンを返すのが少し嫌な感じです。バージョンという型がアプリのことを知っているのってやりすぎかもしれませんね。

なので、struct CurrentApp というアプリ情報を返す型が、バージョンを返すことを考えてみましょうか。

```swift
struct CurrentApp {
    static let version = Version(rawString: Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String)
}

// 利用例もあわせて書くと
Version(rawString: "10.1") < CurrentApp.version
```

CurrentAppはバージョンの他にもビルド用の何かの情報を出したりするのに良いでしょうね。

# その他

struct Versionではinitを省略したため自動で暗黙的にイニシャライザが作られたので、 `rawString` という外部引数名が出てきましたが、この`rawString`を外部引数名として露出したくない時は、もちろんinitで外部引数名を省略すれば良いのでこちらのほうが短くて好みの人は多そうです。

```swift
struct Version {
    let rawString: String
    
    init(_ rawString: String) {
        self.rawString = rawString
    }
}

Version("0.1") < Version("1.1") // true
```

# おわりに

このような比較の他にも、struct Versionのメリットとして現在のバージョンが 1..<2の間かどうか、などの際も演算子をオーバーロードすれば、範囲内かどうかの表現を演算子で表現できて、読みやすいコードになるかもしれないですね（そんなふうな事をするアプリにならないのが一番ですが）。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/yimajo">@yimajo</a> 役割がはっきりして良さそうですよね。そういえば思い出しましたけど Swift Package Manager にも Version 表現する構造体があったりしました。 <a href="https://twitter.com/hashtag/swift?src=hash">#swift</a> <a href="https://t.co/HhRmOLB9HI">https://t.co/HhRmOLB9HI</a></p>&mdash; 熊谷 友宏 (@es_kumagai) <a href="https://twitter.com/es_kumagai/status/864327974614556672">2017年5月16日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
SQL SELECT基礎(2) スカラ値いろいろ

この記事は「SQL SELECT基礎」の第2回目です。
[SQL SELECT基礎 目次](http://qiita.com/Hiraku/items/67cf329f1ddb897b1436)
←前の記事は[SQL SELECT基礎(1) データと表](http://qiita.com/Hiraku/items/df2b81269c430c932686)
→次の記事は[SQL SELECT基礎(3) その場で表を作る](http://qiita.com/Hiraku/items/aafc3b58d2efa4e97511)

※以下がわかっていたらこの章は飛ばしてOK


1. SELECT文で「Hello, world」と出力して下さい。
2. SELECT文中にはダブルクォーテーションで囲まれている単語と、囲まれていない単語が登場します。  
両者は何が違うのでしょう？説明して下さい。

## スカラ値いろいろ

前回の記事で、表の枠の中にはスカラが入っていると書きました。
具体例を書いていきます。

### 文字列

スカラの代表例は文字列です。
プログラミング言語を学ぶとき、最初に`Hello, world!`を出力する、というお約束があります。
SELECT文で書くならこんな感じです。

```sql
SELECT "Hello, world!"
```

各自の環境で実行してみて下さい。ちゃんと返ってくるはず。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/1126/10713a93-0821-59aa-f444-6e2e910fc094.png)

こんな風に、SQL文中で文字列を表現する場合は「"」ダブルクォーテーションか、「'」シングルクォーテーションで囲みます。文字列本体に「"」が登場する場合は「'」で囲うと読みやすくなりますね。

`SELECT`というキーワードはダブルクォーテーションでくくってないことに気をつけて下さい。これは「予約語」と呼ばれる特殊なキーワードで、`SELECT`は「これからデータベースに問い合わせますよ〜」という合図になります。

### 整数

データベースに数字を保存することは多いですね。もちろん数字も扱うことができます。

```sql
SELECT 123
```

マイナスも書けます。

```sql
SELECT -123
```

小数も書けます。

```sql
SELECT 1.08
```

その場で四則演算も書けますよ！計算された結果が得られます。
計算の優先順位を示すのにカッコを使うことができます。

```sql
SELECT (100 + 250) * 1.08
```

### 真偽値

各種プログラミング言語だと、真偽値(true/false)が用意されていることがあります。

MySQLの場合、`true/false`というキーワードは用意されていますが、0はfalseとみなされ、0以外はtrueとみなされます。

今の時点ではよくわからないと思うので、WHERE句の回で詳しく解説します。

### 日付・時刻

日時系はデータベースによって方言が激しいジャンルです。

MySQLでサーバーの現在時刻を調べるには

```sql
SELECT NOW()
```

もしくは

```sql
SELECT CURRENT_TIMESTAMP
```

とすればよいですが、まあ、マニュアルを読みながら試してみるとよいです。筆者もよく覚えていません。

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.7 日付および時間関数](https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html)

他にも記法を調べたい場合は、公式マニュアルを読んでみましょう。
[MySQL :: MySQL 5.6 リファレンスマニュアル :: 11 データ型](https://dev.mysql.com/doc/refman/5.6/ja/data-types.html)

### 関数

ところで、先程しれっと`NOW()`というワードが出てきました。こういう後ろにカッコを付けて書くものは**関数**と言って、MySQLに予め用意されている機能の一つです。実行すると何か特別な値を返してくれたり、値を加工してくれたりします。

例えばこんなのがあります。

* `CONCAT(text1, text2, text3, ...)` ... カッコの中に書いた複数の文字列を連結し、一つの文字列にして返します
* `NOW()` ... 現在時刻を返します
* `FLOOR(108.012)` ... 小数点を切り捨て、この場合だと`108`を返します。

非常にたくさんあるので、調べながら使うと良いです。追々、よく使うものだけ覚えていきましょう。

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 12 関数と演算子](https://dev.mysql.com/doc/refman/5.6/ja/functions.html)


### 補足

* この記事はFROM句を省略できるというMySQLの方言を使って記載しています。OracleやDB2だと省略できないので、ちょっと記法が変わります。

----

この記事は「SQL SELECT基礎」の第2回目です。
[SQL SELECT基礎 目次](http://qiita.com/Hiraku/items/67cf329f1ddb897b1436)
←前の記事は[SQL SELECT基礎(1) データと表](http://qiita.com/Hiraku/items/df2b81269c430c932686)
→次の記事は[SQL SELECT基礎(3) その場で表を作る](http://qiita.com/Hiraku/items/aafc3b58d2efa4e97511)
SQL SELECT基礎 目次

> 見ての通り、絶賛書きかけだよ

弊社では職種を問わずSQL(SELECT文)を書いて、分析や簡単な自動化を行ったりする機会があります。
ただ、SQLは(構文や概念が独特という意味で)難しいので、SELECT文に限って、段階を踏んできっちり説明する資料が欲しいと思い、つらつらと書いていきます。

この記事は、データベースを作っていく立場ではなく、既に存在するデータベースを参照して何か情報を得ようとする人に向けて書いています。入門書だとたいてい、環境構築にそれなりのページが割かれるのですが、そこは社内的に必要ないので省略します。

MySQLで使える構文をベースに解説していきます。

## はじめに

* SELECT文とは、データの集合を加工し、別のデータの集合を作っていく構文です。
* 変数やループは使わず、集合全体を、くっつけ、削り取り、集約し、またくっつけ、…というふうに書きます。**このイメージを掴むことがとても大事**。
    * 本職のプログラマでもSQL苦手という人がいます
    * 手続き型言語とはだいぶ違う思考回路が必要なので、覚えるとプログラマとしての幅が広がるかもしれません。
* SQLの構文キモいって言ってる偉い人(C. J. Date)もいるので、難しいと思うのはあなたがアホだからではありません。SQLが悪い。SQLが悪いということにしていいので、諦めないでね。

## 目次(予定)

### 基礎編

1. [データと表](http://qiita.com/Hiraku/items/df2b81269c430c932686)
2. [スカラ値いろいろ](http://qiita.com/Hiraku/items/2bf26e8cdf117a7f81e8)
3. [その場で表を作る](http://qiita.com/Hiraku/items/aafc3b58d2efa4e97511)
4. 表の加工
    1. [列を減らす (project 射影)](http://qiita.com/Hiraku/items/abc592d2b19b671669b1)
    2. [行を減らす (WHERE句、restrict 制限)](https://qiita.com/Hiraku/items/683241229f6990d9edc2)
    3. 縦方向にくっ付ける (UNION 和)
    4. 横方向にくっ付ける (NATURAL JOIN 自然結合)
    5. 左右でバランスが悪い場合その1 (LEFT OUTER JOIN 外部結合)
    6. 左右でバランスが悪い場合その2 (INNER JOIN 内部結合)
    6. 考えうる全ての組み合わせを作る (CROSS JOIN デカルト積)
    7. 並び替え (ORDER BY)
    8. 件数制限 (LIMIT)
5. 加工した表を更に加工する (サブクエリ)
6. 1x1の表 (スカラサブクエリ)
7. 区切って集約 (GROUP BY)
8. 相関サブクエリ (EXISTS)
9. スカラ値の加工
    1. CASE式
    2. CONCATによる文字列結合

### 雑学編

1. NULLの理解
2. 真偽値
3. SELECT文の実行順序
4. MySQLの日時の扱い

### 組み合わせ編

1. 最大/最小の取得 (ORDER BYとLIMITの組み合わせ)
2. 時間ごとの集計 (GROUP BYと集約関数)
3. 抽選 (ORDER BY RAND)
4. 表と表の比較

### 現実世界編

1. パフォーマンスチューニングの考え方
2. インデックスの基礎
3. OR条件をUNIONにする
4. 平らにする
5. サブクエリの大きさを気にする
Bash on Ubuntu on Windows環境構築メモ

# Bash on Ubuntu on Windowsについて
ざっくり言うとWindows上でUbuntuが動きますよって言うもの。
略してBoWと呼ぶことも。（この記事でも以降BoWで呼びます）

![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/116289/4f7c5597-9234-cc78-b393-203c61877e11.jpeg)

執筆時（2017/05）はUbuntu 16.04.2 LTSが扱える模様。

詳しい解説はこの辺の記事が参考になると思います。

* [Bash on Ubuntu on Windowsとは？ そのインストールと使い方](http://www.buildinsider.net/enterprise/bashonwindows/01)
* [Buildで発表された「Bash on Ubuntu on Windows」とは？](http://qiita.com/Aruneko/items/c79810b0b015bebf30bb)

ただ、デフォルトのままだと色々と不便な点が多いので、使いやすくなるようカスタマイズしていきます。

# 環境構築用のメモ
ちょっとだけ快適な環境になるまでのメモです。

## Windows 10 Creators Updateを適用させる
BoWを入れる前にWindows 10 Creators Updateを適用させておくことを後々楽になる。
このアップデート自体はBoWを使うのに必須ではないものの、導入時のUbuntuのバージョンが新しくなっている事と
sudoがホスト名が解決できなくて使えないバグ、日本語の表示が崩れるバグ等いくつかの不具合が解消されている。

インストール方法は以下を参考に。

* [【解禁】Windows 10 Creators Update インストール手順の紹介](http://blog.serverworks.co.jp/tech/2017/04/22/creators-update/)

また、BoWに直接関係ないが他にも色んな機能がアップデートされるので上げて損することはなし。

* [Windows 10 Creators Update の新機能](https://blogs.windows.com/japan/2017/04/18/whats-new-in-the-windows-10-creators-update/#Ew5sYKLXUJvJ4BEx.97)

## BoWを導入する
この辺を参考に導入。とても参考になります。

* [Bash on Ubuntu on Windowsをインストールしてみよう！](http://qiita.com/Aruneko/items/c79810b0b015bebf30bb)
* [[Bash on Ubuntu on Windowsとは？ そのインストールと使い方](http://www.buildinsider.net/enterprise/bashonwindows/01)

## 言語を英語に
BoWインストール時にあるロケールの設定でついつい日本語を選んでしまったものの、
仕事で英語のLinux環境に触る機会が多かったせいか、日本語だと違和感があったので英語に合わせた。
以下を参考にロケールを再設定した。

* [Windows 10のBash on Windowsのロケールを英語モードに切り替える](http://www.atmarkit.co.jp/ait/articles/1610/14/news033.html)

## Gitを最新版に
デフォルトだと古いバージョンが入っている。
公式のaptのリポジトリは最新のパッケージが入っていないので、git-core/ppaを追加。

```bash
sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt upgrade
sudo apt install -y git
```
これで最新版が入る（執筆時では2.11.0）

Git以外にも古いパッケージがあるので、必要に応じてPPAを追加するといいかも。

## Bashのエラー音を消す
デフォルトのままだと、何かしらエラーが起きた時やコマンドの補完でTabキーを押す度に、ビープ音が鳴ってうるさい。
なので ~/.inputrc に以下の記述を書いてビープ音を無効化させた。

```bash:~/.inputrc
set bell-style none
```

その後、ターミナルを立ち上げ直して設定を反映する。これで解決。

* [bash のビープ音を消す方法](https://futuremix.org/2004/01/bash-beep)

## Caps LookキーをCtrlキーに差し替える
Macのターミナルを触っている時と同じ感覚にしたかったので、Caps LockキーをCtrlキーに変更した。
Microsoft Tech Netから提供されているCtrl2capを使って対応。
手順は以下を参考。

* [Windows10でCapsLockをCtrlにする](http://akaneko85r.hatenablog.com/entry/2015/08/09/232813)

## もっかい最初から作り直したい！
インストール時の設定をもっかいやり直したかったり、環境をいじり過ぎてぶっ壊しちゃった時に。
以下を参考にアンインストール、再インストールができる。

* [Windows 10のBash on Ubuntu on Windows環境を初期化／再インストールする](http://www.atmarkit.co.jp/ait/articles/1610/05/news033.html)
brew updateしても0.9.9から更新されなくなったので、手動で1.2.0にアップグレードした

要約：
1. `brew update`しても0.9.9からバージョンが変わらないときは、
2. 公式の [README.mdのUpdate-bug](https://github.com/homebrew/brew#update-bug) に従って、
3. brewのローカルレポジトリを `git reset --hard origin/master` すれば1.2.0にアップグレードできる

# 現象

家ではMacBook Air 11inch Mid 2012をメインマシンとして使っているのだが、いつからか
`brew update`しても`Already up-to-date.`としか返ってこなくなった。
Sierra対応時間かかるんだなぁ、と特に気に留めず、放ったらかしにしていた。

しかしOS更新してから半年以上経つぞと思い立って調べてみると、brewはバージョンは1.2に更新されていた。では、なぜうちのmacは更新されないのだろうか。

# 対策

[How to upgrade? Brew stuck on 0.9.9](https://discourse.brew.sh/t/how-to-upgrade-brew-stuck-on-0-9-9/33)を見ると、Sean Oldhamさんが2016年９月に公式README.mdを参照しながら解決策を示している。

2017年5月現在でも、[brewの公式README.md](https://github.com/homebrew/brew#update-bug)にはそのまま同じ対策が書かれていて、Homebrewのgitリポジトリを手動でリセットせよ、とのこと。

> If Homebrew was updated on Aug 10-11th 2016 and brew update always says Already up-to-date. you need to run:
> `cd "$(brew --repo)" && git fetch && git reset --hard origin/master && brew update`

# 実行

ステップバイステップでやってみた
文頭の `%` はコマンドプロンプト

必要のないファイルは事前に削除しておく

```zsh
% brew cleanup
==> This operation has freed approximately 22.2G of disk space.
```

２２GBって、どんだけ溜まっていたんだと愕然とした

次にバージョンの確認。2016年８月１０日が最終更新日。

```zsh
% brew --version
Homebrew 0.9.9 (git revision 06fe3; last commit 2016-08-10)
Homebrew/homebrew-core (git revision b163b; last commit 2016-08-10)
```

では、いよいよ手動アップグレード手順に入る。まず１コマンド目。

```zsh
% cd "$(brew --repo)"
```

デフォルトのインストール先を使ったので、 `/usr/local` だった
ログを確認してみる。当然2016年８月１０日。

```zsh
% git log
commit 06fe347de97975dc01e726f87bf07a56a6fb713e
Author: Martin Afanasjew <martin@afanasjew.de>
Date:   Wed Aug 10 17:56:46 2016 +0200

    os/mac/ruby_keg: improve error reporting
    
    A failure to change a dylib ID or install name would previously cause a
    rather cryptic error message, that didn't include the name of the file
    that caused the failure, unless `--debug` was specified. Make sure to
    output this information in all cases before re-raising the exception.
```

次に２コマンド目、３コマンド目を実行

```zsh
git fetch
git reset --hard origin/master
```

ログを確認してみると、たしかに更新されている事がわかる

```zsh
% git log
commit ea8be174f6009bc9bdec67b13ca501b5b83fc4b8
Merge: 9889b42ec4 91efcb045e
Author: Mike McQuaid <mike@mikemcquaid.com>
Date:   Mon May 15 10:02:47 2017 +0100

    Merge pull request #2631 from GauthamGoli/audit_homepage_rubocop
    
    audit: Port audit_homepage method to rubocop and add tests
```

最後に、`brew update`を実行すると、バージョン間の移行が行われる。大きな違いは、`/usr/local`ではなく`/usr/local/Homebrew`を使うようになったこと。`/usr/local`の所有者は`root'wheel`に戻して良いよと。

```zsh
% brew update
Updated 6 taps (caskroom/cask, go-delve/delve, homebrew/core, homebrew/dupes, homebrew/fuse, osx-cross/avr).
==> New Formulae

...
==> Migrating HOMEBREW_REPOSITORY (please wait)...
==> Migrated HOMEBREW_REPOSITORY to /usr/local/Homebrew!
Homebrew no longer needs to have ownership of /usr/local. If you wish you can
return /usr/local to its default ownership with:
  sudo chown root:wheel /usr/local
```

後は、`brew upgrade`すれば個々のソフトウェアもアップグレードされる

# 感想

- アンインストールして新規インストールしようかと思ったが、調べてみてよかった
- 日本語の文書は見つからなかったので、記事にしてみた
Apple Keyboard を Windows で気持ちよく使うためのソフトウェアとその設定

初投稿は、環境設定からと言うことで、
Apple有線キーボードをWindowsで使う際に、割り当て変更がなかなか上手くいかない
”英数”キーを攻略した際の手順のメモ。
わかるとすごく簡単です。

基本形はこちら：Change key
http://satoshi3.sakura.ne.jp/f_soft/dw_win.htm


手ごわい”英数”キーはこちら：Auto hot Key

ソフトを入手
https://autohotkey.com

設定ファイルに下記を追記
”英数”キーに、Windowsキーボードの半角/全角を割り当て

```
#InstallKeybdHook

;Mac keyboard
#USEHOOK
vkE9sc071 Up::Send,{vkF3sc029 Down}{VkF3sc029 Up}  ;Apple英数->半全
vkFFsc072 Up::Send,{vkF3sc029 Down}{VkF3sc029 Up}  ;Appleかな->半全
#USEHOOK off
```



以上
Scala-PlayFramework2.5で2.2時代のtodolistチュートリアルをやってみた・その３

[その２](http://qiita.com/12345/items/e5de0a7a9a67d70e74b1)からのつづき。
画面の初期表示までできたので、あとは実際に画面を動かしてみる。

が、続きに入る前に、今の状態で`Create`ボタンを押すと以下のようなエラーになる。

```
Unauthorized
You must be authenticated to access this page.
```
ので、以下のような修正を行う。

```diff:Application.scala
-    def tasks = Action {
+    def tasks = Action { implicit request =>
```

```diff:index.scala.html
-@(tasks: List[Task], taskForm: Form[String])(implicit messsages:Messages)
+@(tasks: List[Task], taskForm: Form[String])(implicit messsages:Messages, request: RequestHeader)

...

     @form(routes.Application.newTask) {
+        @CSRF.formField
         @inputText(taskForm("label")) 
```

##「[フォーム投稿処理](https://www.playframework.com/documentation/ja/2.2.x/ScalaTodoList#フォーム投稿処理)」の章
- `Application.scala`の`newTask`アクションのコードを実装する。

##「[データベース内のタスクを永続化する](https://www.playframework.com/documentation/ja/2.2.x/ScalaTodoList#データベース内のタスクを永続化する)」の章
- `build.sbt`と`conf/application.conf`にそれぞれ以下の設定を追記する。

```build.sbt
libraryDependencies += evolutions
libraryDependencies ++= Seq(
    jdbc,
    "com.typesafe.play" %% "anorm" % "2.4.0"
)
```

```application.conf
db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"
```
- コマンドプロンプトで`Ctrl+D`を押してサーバを停止させ、`exit`コマンドでsbtを一旦抜ける。２回目以降の起動は`sbt run`コマンド一発でok。
- チュートリアルに従ってエボリューションスクリプト`1.sql`を作成する。
- ブラウザをリロードし、`Apply this script now!`ボタンを押す。
- チュートリアルに従い、`Task.scala`のコードを実装する。

これでtodoリストの新規追加が行えるようになる。
![finish.PNG](https://qiita-image-store.s3.amazonaws.com/0/181011/1909dcad-046c-4920-7d49-d5047b0b4f64.png)

##「[タスクの削除](https://www.playframework.com/documentation/ja/2.2.x/ScalaTodoList#タスクの削除)」の章
- `Application.scala`の`deleteTask`アクションのコードを実装する。

これによりtodoリストの削除操作も行えるようになる。

と、思いきや、削除操作についても

```
Unauthorized
You must be authenticated to access this page.
```
になってしまうので、追加時と同様にコード修正を行う。

```diff:index.scala.html
                 @form(routes.Application.deleteTask(task.id)) {
+                    @CSRF.formField
                     <input type="submit" value="Delete">
```
以上。
Scala-PlayFramework2.5で2.2時代のtodolistチュートリアルをやってみた・その２

[その１](http://qiita.com/12345/items/8d52e0ce1b82ff1d2200)からのつづき。
いよいよチュートリアリング。

## 「[概要](https://www.playframework.com/documentation/ja/2.2.x/ScalaTodoList#概要)」の章
まず、`routes`ファイルの中身を書き換える。１つめのGETをコメントアウトし、代わりにチュートリアルに記載されているGETの定義を追加する。

```
# GET / controllers.HomeController.index
GET / controllers.Application.index
```

次に`controllers`フォルダの下に新規に`Application.scala`ファイルを作成し、チュートリアルの内容を記載する。その際に"`object`"を"`class`"に書き換える。

```diff
-object Application extends Controller {
+class Application extends Controller {
```
また、`HomeController.scala`のファイル名の後ろに.bakを付けるなどしてリネームし、コンパイル対象外にしておく（またはファイルごと削除でも可）。
## 「[開発フロー](https://www.playframework.com/documentation/ja/2.2.x/ScalaTodoList#開発フロー)」の章
チュートリアルに従い、`Application.scala`の内容を書き換えてブラウザを更新してみる。
![hello-world.PNG](https://qiita-image-store.s3.amazonaws.com/0/181011/34a01707-14c0-3bb3-55f7-875907d58760.png)
エラーのケースも同様に。

## 「[アプリケーションの準備](https://www.playframework.com/documentation/ja/2.2.x/ScalaTodoList#アプリケーションの準備)」の章
- チュートリアルに従って、`routes`ファイルの内容を追記する。
- ブラウザでエラーを確認。
- 同様に、`Application.scala`にもコードを追加。
- ブラウザで確認。画面デザインは異なるが同じメッセージが出る。
- `index`アクションをリダイレクトするように書き換える。

## 「[Taskモデルの準備](https://www.playframework.com/documentation/ja/2.2.x/ScalaTodoList#Task-モデルの準備)」の章
- `app`フォルダの下に`models`フォルダを作成し、その下に`Task.scala`ファイルを作成してコードを実装する。

## 「[アプリケーションテンプレート](https://www.playframework.com/documentation/ja/2.2.x/ScalaTodoList#アプリケーションテンプレート)」の章
- `index.scala.html`ファイルを書き換える。

## 「[タスクフォーム](https://www.playframework.com/documentation/ja/2.2.x/ScalaTodoList#タスクフォーム)」の章
- `Application.scala`にコードを追加する。`import`文はクラス定義の外、`val taskForm`はクラス定義の中に。

## 「[最初のページをレンダリングする](https://www.playframework.com/documentation/ja/2.2.x/ScalaTodoList#最初のページをレンダリングする)」の章
- `Application.scala`に`import`文を追加し、`def tasks`のコードを書き換える。

ここで`localhost:9000/tasks`を呼び出すと以下のようなコンパイルエラーになる。

```
Compilation error
could not find implicit value for parameter messages: play.api.i18n.Messages
```
ので、以下のようにコードを修正する。[^1]

```diff:index.scala.html
-@(tasks: List[Task], taskForm: Form[String])
+@(tasks: List[Task], taskForm: Form[String])(implicit messages:Messages)
```

```diff:Application.scala
+import play.api.i18n.Messages.Implicits._
+import play.api.Play.current
```
これで画面が表示されるようになる。
![tasks.PNG](https://qiita-image-store.s3.amazonaws.com/0/181011/7914f08c-12af-cbbf-8a7d-3ec40d2b4231.png)

そうそう！こんな画面だった（気がする）。

[その３](http://qiita.com/12345/items/46cce376cff58197cb3a)へつづく。
***
 [^1]: 参考）http://qiita.com/uchiko/items/e57ecd487889d787b35e