OmniAICreator/Qiita-1.07M huggingface dataset:
スタティックライブラリを作って読み込んでみる

# はじめに
Visual Studio 2017 でスタティックライブラリ(.lib)を使って実行ファイルを作る方法を記載しておきます。

Visual Studio では複数のプロジェクトをまとめて管理するためのソリューションと呼ばれるコンテナが簡単につくれます。
これを使うとスタティックライブラリと実行ファイルアプリを単独で作れるのでとても便利です。

```
[イメージ]

ソリューション
  ├プロジェクト1(.lib)
  └プロジェクト2(.exe) ← プロジェクト1(.lib)を使用するプロジェクト
```

# ソリューション(とスタティックライブラリのプロジェクト)を作成

 `ファイル(F) -> 新規作成(N) -> プロジェクト(P)` の順で選択してソリューションと新規プロジェクトを作成する。


![新しいプロジェクト1.png](https://qiita-image-store.s3.amazonaws.com/0/112253/3a1ef275-95ff-7e5d-99c7-8b67251b57a3.png)

+ `Win32 プロジェクト`を選択
+ 名前(N)を`LibProject`にする
+ ソリューション名(M)を`HelloWorld`にする


`次へ -> アプリケーション設定`画面まで遷移する。

![project2.png](https://qiita-image-store.s3.amazonaws.com/0/112253/02ab550d-96b2-6d44-19d2-fcc0a123890a.png)

+ `スタティックライブラリ(S)`を選択
+ それ以外のチェック項目は外す


ソースファイル -> 追加 -> 新しい項目 から `StaticLibTest.c` を作成して以下をコピペ

```C
#include <stdio.h>
#include "StaticLibTest.h"

int TestFunc() {

	printf("Hello World\n");

	return 0;
}
```

ヘッダーファイル -> 追加 -> 新しい項目 から `StaticLibTest.h` を作成して以下をコピペ

```C
#pragma once

int TestFunc();

```

ビルドして`HelloWorld/Debug`に`LibProject.lib`が出来ている事を確認する。


# 実行プロジェクトの追加
ソリューション(HelloWorld)を選択して 追加 -> 新しいプロジェクトを選択

![project4.png](https://qiita-image-store.s3.amazonaws.com/0/112253/5926f503-c7bf-354e-58d5-30f689ff41ad.png)
+ `Win32 プロジェクト`を選択
+ 名前(N)を`EXEProject`にする
+ ソリューション名(M)を`HelloWorld`にする

ソースファイル -> 追加 -> 新しい項目 から `main.c` を作成して以下をコピペ

```C
#include "StaticLibTest.h"

int main() {

	TestFunc();

	return 0;
}
```


# プロパティ設定

ここからはスタティックライブラリから関数を呼び出す為の設定を行います。

スタティックライブラリから関数の呼び出しですが、まずはスタティックライブラリでの.hが必要になります。
今回の例ですと`StaticLibTest.h`です。
これをVisual Stduioの`構成プロパティ -> C/C++ -> 追加インクルード`で指定しましょう。
指定するときはLibProjectの.hの場所を相対パスで参照しましょう。




次に使用するlibの指定を行います。
`構成プロパティ -> リンカ -> 入力 -> 追加の依存ファイル`に追加しましょう。


最後に使用するlibが置いてあるディレクトリの指定を行います。
`構成プロパティ -> リンカ -> 全般 -> 追加のライブラリディレクトリ`に追加しましょう。
ライブラリはソリューション直下のDebugフォルダ内を指定する。


これでLibProject -> EXEProject の順でビルドすればビルドが通りHelloWorldが表示される事が確認出来ると思います。




# もしかしたら

ソリューションのリビルドを行ったり、EXEProjectを先にビルドすると`LNK1104 ファイルLibProject.libを開くことが出来ません`とエラーが出るかもしれません。
そのときはソリューションからのプロパティで`プロジェクトの依存関係`を選択してプロジェクトをEXEProjectに選択して依存先LibProjectにチェックアウトします。

![ソリューション.png](https://qiita-image-store.s3.amazonaws.com/0/112253/14d0f1a6-b62f-cceb-eba9-dacd4bb0714f.png)

これはEXEProjectはLibProjectに依存しているため、LibProjectが正しくビルド出来てからEXEProjectをビルドする様に設定しています。
PHP で生成したパスワードハッシュが Python でマッチするか確認

## 環境
PHP 7.1
Python 2.7.6

## 確認したいこと
現在、PHP で新規開発をしていて、パスワードの暗号化に `password_hash` を使用している。
かなり先のことだが、将来的に別の言語（ここでは Python）に移行した際に、暗号化したパスワードが同じように使えるのか疑問:question:
つまり、 Python に移行してもユーザーのパスワードの照合が正常にできて、ログインできることを確認したい。
もう少しミクロな言い方をすると、 `password_hash` は Blowfish という暗号化アルゴリズムを使用しているので（後述）、Python でも Blowfish が使えて照合できるかを確認したい。

## PHP で暗号化する
```.php
password_hash('password', PASSWORD_DEFAULT);
// $2y$10$BN2hH0B3gnZceNlW1JXiNOUN8NWybLlfqZh6WQ/imah4htM8fktFW

password_hash('password', PASSWORD_BCRYPT);
// $2y$10$CuZkO0N29B1YtHHI9mwvIOCSUitQh4ptyfxYWvHhHoHHP2GZqC5Ga
```

### 解説
`password_hash` では現在、PASSWORD_DEFAULT と PASSWORD_BCRYPT という 2 種類の定数を指定できる。
http://php.net/manual/ja/function.password-hash.php

#### 定数の中身を確認してみた（スタブだけど）
```/php/lib/php.jar!/stubs/standard/password.php
define("PASSWORD_DEFAULT", 1);
define("PASSWORD_BCRYPT", 1);
```

**結局 PASSWORD_DEFAULT も PASSWORD_BCRYPT も同じ値を指している。**
この場合、Bcrypt での実装になる。
Bcrypt ≒ Blowfish なので、現在の `password_hash` の暗号化アルゴリズムは必ず Blowfish になるもよう。

※ Bcrypt の解説はここが分かりやすかった
https://goo.gl/kpS5En

※他の暗号化アルゴリズムを使いたかったら `Crypt` を使えばできそう
http://php.net/manual/ja/function.crypt.php

## Python で照合できるか確認

```.py
import bcrypt

password = b'password'
phpHash = '$2y$10$BN2hH0B3gnZceNlW1JXiNOUN8NWybLlfqZh6WQ/imah4htM8fktFW'

if bcrypt.checkpw(password, phpHash):
    print("It Matches!")
else:
    print("It Does not Match :(")

# It Matches!
```

**無事にマッチした :ok_woman_tone1:**

### 解説
- bcrypt モジュールを用いて、PHP で暗号化したパスワードがマッチするか確認している
 - 事前に bcrypt というモジュールのインストールが必要
     - https://pypi.python.org/pypi/bcrypt/3.1.3
 - `bcrypt.checkpw` が PHP で言う `password_verify` にあたる

## マメ知識（知らなかっただけ）
PHP の `password_hash` を用いて生成した値の暗号化バージョン（1番左の部分）は `$2y$` になる。
しかし Python の bcrypt モジュールを用いて生成する場合、暗号化バージョンは `$2a$` と `$2b$` のみしか指定できないもよう。

```.py
salt = bcrypt.gensalt(rounds=10, prefix=b'2a')
password = b'password'
hashed = bcrypt.hashpw(password, salt)
```
※`prefix` の部分

これでは同じパスワードとみなしてくれないのでは？:rolling_eyes: と思ったが、上述の通りマッチした。
逆に `bcrypt.hashpw` で生成した値を `password_verify` で照合しても無事にマッチした。
つまり、暗号化バージョンが `$2a$` と `$2y$` のように異なっていても同じパスワードとして認識してくれるので、将来的に Python に移行した際にわざわざ `$2y$` を `$2a$` に置換するなどの処理は不要。
Firefox DeveloperEditionでフルスクリーンショット（アドオン不要）

アドオン入れてたんですが、動作が不安定だったりレスポンシブデザインモードでは動かなかったりしたので、別の方法を見つけました。

1. `command+option+I` で、開発ツールを表示する。
2. 開発ツールの設定を押す  
<img width="118" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/19478/6cb56483-8054-362a-b8df-bfae251407dc.png">
3. 「利用可能なツールボックスのボタン」から、「ページ全体のスクリーンショットを撮ります」をチェック  
<img width="270" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/19478/e942bea7-6c42-f144-0be0-2d76b89eabc9.png">
4. 開発ツールにカメラのボタンが増えるので、それを押せばダウンロードフォルダに保存される。  
<img width="84" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/19478/6289dc77-e679-6db8-d0b0-6de6b1526ab8.png">


---
参照: [https://developer.mozilla.org/ja/docs/Tools/Release_notes#Firefox_32](https://developer.mozilla.org/ja/docs/Tools/Release_notes#Firefox_32)
回転楕円体面上（地球表面上）の二点間距離近似

こんにちは。
回転楕円体面上の二点間距離の計算は測地線の逆問題ですが[^1]、短距離条件で近似計算[^2]を行ってみました。下記の近似精度評価例では、12.457km の距離に対する計算誤差は 1.3mm です。

[^1]: これは [GeographicLib](https://geographiclib.sourceforge.io/) を使って計算できます（```Inverse()```）。
[^2]: これは、GeographicLib の逆問題計算の中の Newton 法向け初期値計算にも使われている方法です。

```console
$ ./geodesic_inverse_approx.py 60.0 60.1 0.1
input: lat1= 60.000000  lat2= 60.100000  lam12=     0.100000
output: az1= 26.526      az2= 26.612       s12= 12456.777
error:  az1= 1.2e-05     az2= 1.2e-05      s12=   1.3e-03
```

```geodesic_inverse_approx.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import division
from __future__ import print_function
import sys
import numpy as np
from easydict import EasyDict as edict
from geographiclib.geodesic import Geodesic

RE = 6378137.0 # IS-GPS
FE = (1/298.257223563) # IS-GPS
E2 = FE * (2 - FE)
DEGREE = np.pi/180
geod = Geodesic.WGS84

# "Algorithms for geodesics" Charles F. F. Karney (2013)
#  5. Starting point for Newton’s method
#  solving for the great circle on the auxiliary sphere
def geodesic_inverse_approx(beta1, beta2, lam12):
    cosBeta = (beta1.cos + beta2.cos)/2
    wm = np.sqrt(1-E2*cosBeta**2)
    omg12 = angle_approx(lam12/wm)
    az1, r = angle(beta1.cos*beta2.sin - beta1.sin*beta2.cos*omg12.cos, beta2.cos*omg12.sin)
    az2, _ = angle(-beta1.sin*beta2.cos + beta1.cos*beta2.sin*omg12.cos, beta1.cos*omg12.sin)
    sig12 = arg_approx(beta1.sin*beta2.sin + beta1.cos*beta2.cos*omg12.cos, r)
    s12 = sig12 * wm
    return az1, az2, s12

def reducedLatitude(lat):
    chi = np.tan(lat/2)
    beta, _ = angle(1-chi**2, 2*chi*(1-FE))
    return beta

def arg(*args):
    if len(args) == 1:
        c, s = args[0].cos, args[0].sin
    else:
        c, s = args[0], args[1]
    return np.arctan2(s, c)

def arg_approx(c, s):
    x = s/c
    return x*(1-x**2/3)

def angle(*args):
    if len(args) == 1:
        x = np.tan(args[0]/2)
        return angle(1-x**2, 2*x)
    r = np.hypot(args[0], args[1])
    c, s = args[0]/r, args[1]/r
    return edict({'cos': c, 'sin': s}), r

def angle_approx(x):
    return edict({'cos': 1-x**2/2, 'sin': x})

def print_geodesic_inverse(lat1, lat2, lam12):
    print("input: lat1=%10.6f  lat2=%10.6f  lam12=%13.6f" % (lat1, lat2, lam12))
    beta1 = reducedLatitude(lat1*DEGREE)
    beta2 = reducedLatitude(lat2*DEGREE)
    az1, az2, s12 = geodesic_inverse_approx(beta1, beta2, lam12*DEGREE)
    az1, az2, s12 = arg(az1)/DEGREE, arg(az2)/DEGREE, s12*RE
    print("output: az1=%7.3f      az2=%7.3f       s12=%10.3f" % (az1, az2, s12))
    g = edict(geod.Inverse(lat1, 0, lat2, lam12))
    print("error:  az1=%8.1e     az2=%8.1e      s12=%10.1e" % (az1-g.azi1, az2-g.azi2, s12-g.s12))
    return

def main():
    args = sys.argv[1:]
    if len(args) == 3:
        print_geodesic_inverse(*map(lambda x:np.float(x), args))
    return

if __name__ == '__main__':
    main()
    exit(0) 
```
ESP32でゲームを作ってみた

![DSC_0036.JPG](https://qiita-image-store.s3.amazonaws.com/0/174906/6b1b23b4-8d13-8b5a-ac18-7e2a27a4b354.jpeg)
倉庫番

![DSC_0009.JPG](https://qiita-image-store.s3.amazonaws.com/0/174906/af60beb5-1efe-211f-8906-471a76ddf69f.jpeg)
テトリス

![DSC_0011 1.JPG](https://qiita-image-store.s3.amazonaws.com/0/174906/6b3d447a-9dcc-6b69-b816-35048e0d6ec2.jpeg)
15パズル

![DSC_0008 2.JPG](https://qiita-image-store.s3.amazonaws.com/0/174906/bcb7cccf-aabd-ab12-fc8e-ff54438ad95a.jpeg)
パックマン

表示はAitendoの液晶モジュールを使用しました。操作はAndroidケータイからWiFiを通じて無線で行う、またはUSBからSerial Portを通じて行います。esp32については自分の動画 [【ゆっくり解説】 WiFiの使い方2 【電子工作】](http://www.nicovideo.jp/watch/sm31250966)で紹介しています。

#準備
以下のものを用意します。

- [ESP32-DevKitC] (http://akizukidenshi.com/catalog/g/gM-11819/) ESP32 1480円：秋月
- [M024C9328SPI] (http://www.aitendo.com/product/10944) TFTカラー液晶 1950円：Aitendo

#配線
ESP32と液晶を以下のように配線します。液晶基板裏面の電源設定用ジャンパーパッドJ1/J2は、J2をショートさせることによって5V電源の設定にします。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/174906/2cdafb07-ac2b-5a03-8516-583eef248ac4.png)
![DSC_0010.JPG](https://qiita-image-store.s3.amazonaws.com/0/174906/b25ba2d5-2c57-a947-c86b-9fa48b7c1552.jpeg)


# プログラム
開発環境は[Arduino-esp32](https://github.com/espressif/arduino-esp32)を使います。プログラムは以下になります。
[esp32_ILI9328_Sokoban](https://github.com/MhageGH/esp32_ILI9328_Sokoban)
[esp32_ILI9328_Tetris](https://github.com/MhageGH/esp32_ILI9328_Tetris)
[esp32_ILI9328_15Puzzle](https://github.com/MhageGH/esp32_ILI9328_15Puzzle)
[esp32_ILI9328_Pacman](https://github.com/MhageGH/esp32_ILI9328_Pacman)

以下の自分の動画と、DrNCXCortexさんのコードを参考にしました。
[【ゆっくり解説】 倉庫番の作り方 【ゲームプログラミング】](http://www.nicovideo.jp/watch/sm17872199)
[【ゆっくり解説】 テトリスの作り方 【ゲームプログラミング】](http://www.nicovideo.jp/watch/sm17983957)
[【ゆっくり解説】 15パズルの作り方 【Androidプログラミング】](http://www.nicovideo.jp/watch/sm18916587)
[GitHub - Pacman Game for Arduino Due](https://github.com/DrNCXCortex/Pacman-Arduino-Due)

# コントローラの設定
Serial Portを使うときはテンキーの8(↑ボタン), 6(→ボタン), 2(↓ボタン), 4(←ボタン) と zキー(Aボタン), xキー(Bボタン)を使います。

Androidケータイでは[WiFi TCP/UDP Controller](https://play.google.com/store/apps/details?id=udpcontroller.nomal&hl=ja)でボタンにSerial Portのときと同じASCIIコードを充てます。TCP/UDPはUDP、IPは192.168.4.1、Portは10000に設定します。これらの設定は手動でも行えますが、プログラムのフォルダにあるWiFi_UDP_Controller_config.txtをAndroidのフォルダマネジャーでホームフォルダ/Controller Backup に置き、WiFi TCP/UDP Controllerでロードすることでも行えます。
![2ffbd2b4-76d9-7c82-12b6-974a678a7f3a.jpeg](https://qiita-image-store.s3.amazonaws.com/0/174906/b809c2e9-acc5-04da-dde2-49400b30f089.jpeg)

# ゲームについて
倉庫番： ミクダヨーが主人公です。アニメーション作成にはMMDを使いました。全10面
テトリス： シンプルなテトリスです。プログラミングの学習にもベスト。
15パズル： picture.hの240×320ピクセルの16ビット画像データを変えれば絵を変えれます。
パックマン： Pacman Game for Arduino Dueの移植です。素晴らしいコードです。
【ArchLinux】pacmanでエラー（conflicting files）

#pacman で -Syu（システムフルアップデート）が失敗する

###以下のエラーが発生．

```
[root@alarmpi pkg]# pacman -Syu
～
:: Proceed with installation? [Y/n] y
(67/67) checking keys in keyring
(67/67) checking package integrity
(67/67) loading package files
(67/67) checking for file conflicts
error: failed to commit transaction (conflicting files)
ca-certificates-utils: /etc/ssl/certs/ca-certificates.crt exists in filesystem
Errors occurred, no packages were upgraded.
[root@alarmpi pkg]# 
```

「conflict」は、「争う、矛盾する」といった意味らしい．
上のエラーは、「ca-certificates.crtというファイルは既にあるよ」と言っている．
軽く調べると、認証まわりで使うファイルらしい．（はじめてみた）

###解決策

公式にこんな記事がありました．

https://www.archlinux.org/news/ca-certificates-utils-20170307-1-upgrade-requires-manual-intervention/

やってみる．

```
[root@alarmpi pkg]# ls /etc/ssl/certs/ | grep ca-certificates
ca-certificates.crt
[root@alarmpi pkg]# 
[root@alarmpi pkg]# rm /etc/ssl/certs/ca-certificates.crt 
rm: remove symbolic link '/etc/ssl/certs/ca-certificates.crt'? n
[root@alarmpi pkg]# 
```

シンボリックリンクだと！？シンボリックリンクをrmだと！？
焦りましたが、中身を見てみると

```
[root@alarmpi pkg]# ll /etc/ssl/certs/ca-certificates.crt 
lrwxrwxrwx 1 root root 49 Dec 12 13:56 /etc/ssl/certs/ca-certificates.crt -> ../../ca-certificates/extracted/tls-ca-bundle.pem
[root@alarmpi pkg]# 
```

消して良さげ？
騙されたと思って消してみる．

```
[root@alarmpi pkg]# rm /etc/ssl/certs/ca-certificates.crt 
rm: remove symbolic link '/etc/ssl/certs/ca-certificates.crt'? y
[root@alarmpi pkg]# 
[root@alarmpi pkg]# ll /etc/ca-certificates/extracted/tls-ca-bundle.pem 
-r--r--r-- 1 root root 257492 Jan 29 09:21 /etc/ca-certificates/extracted/tls-ca-bundle.pem
[root@alarmpi pkg]# 
```

あれ？-rfないと全部消えないんだっけ．

とりあえず，システムアップデートを再開したらできました．
ログは長いので割愛．
AnsibleのScriptモジュールで冪等性をいい感じに担保したい

# はじめに
Ansibleの次のようなモジュールは冪等性を担保してくれません。
毎回毎回実行し、ステータスはchangedになってしまいます。

- command
- shell
- script

そこで、よくある冪等性の担保として事前に状態を確認するタスクを用意し、
その結果に応じてskipするか実行するかを判断するものです。

こんなやつ↓

```yaml
tasks:
  - name: check hoge file
    command: ls /tmp/hoge
    register: result
    changed_when: false
    always_run: yes

  - name: make hoge file
    command: touch /tmp/hoge
    when: result.rc != 0
```

Ansibleでは、基本的にモジュール側で冪等性を担保するため、
Playbookでの条件分岐は単純なものしかできず、複雑な条件分岐は難しいと思っています。

commandモジュールやshellモジュールだけで解決できるような処理ならいいですが、
複雑なことをやらせようとするとPlaybookがどんどん長くなってしまいます。

# 解決方法
そこで、シェルスクリプトに冪等性を担保させ、Ansibleには実行と、終了時の結果確認のみをさせるようにします。

以下のようにシェルスクリプトとPlaybookを作成することで実現できます。

```bash:mkhoge.sh
#!/bin/bash
changed="no"

if [ -f /tmp/hoge ]; then
    touch /tmp/hoge
    changed="yes"
fi

if [ $changed == "yes" ]; then
    exit 254
else
    exit 0
fi
```

```yaml:mkhoge.yml
tasks:
  - name: make hoge file
    script: mkhoge.sh
    register: result
    changed_when: result.rc == 254
    failed_when: result.rc not in [0, 254]
```

registerでスクリプトの終了コードを取得し、

- 0 -> ok
- 254 -> changed
- それ以外 -> failed

という動作になります。

# おわりに
今回の内容が使えるのは

- 標準モジュールで実現できない
- 変数が不要な決まった処理
- 実行判断の条件分岐が複雑または多い

といったパターンの処理をさせたい場合ですので、あまり使う機会はないかな？と思います。
ただ、今までシェルスクリプトを使ってきていてそれを有効活用したいとかであれば有用かと思います。

registerとかchanged_when, failed_whenでの条件分岐だったり、with_itemsでのループだったり、
結構できることはあるものの知らないことがまだまだありそうです。

with_****系とかたくさんあるようですが、with_itemsしか使ったことないですし、
便利な記述を見つけることができたらまたまとめたいと思います。
Dockerのrunコマンドで使用する為のサービス自動起動スクリプトを作成する

chkconfigの設定はコンテナ起動時に自動起動されないのでコンテナ起動時にサービスを起動するスクリプトを作成してみる
（Centos7のsystemctlは/sbin/initで自動起動されるのでスクリプトは必要ありません）

```shell-session
#!/usr/bin/env bash

service sshd start
service mysqld start
service memcached start
service httpd start

# process keep running
tail -f /dev/null
```

または

```shell-session
#!/usr/bin/env bash

service sshd start
service mysqld start
service memcached start
service httpd start

# process keep running
while true
do
    sleep 300
done
```

というように自動起動スクリプトを作成し
docker run時に/sbin/initの代わりに設定すればコンテナが起動する予定だったが、コンテナは作成されるがコンテナが起動しなくて躓いた。

結果的に改行コードがCRLFでシェルスクリプトが実行出来ていなかった
のが原因でした。コンテナ内での出来事でしたので気づくのに時間がかかってしまって悔しい。
upLaTeX + Beamer で Source Han Sans を使うための1行

Ubuntu で LaTeX beamer スライドをつくっていると， Noto Sans を使いたいと思うことがあります。

Source Han Sans (実質同じ) を埋め込むパッケージ [tcsourcehans](https://github.com/doraTeX/tcsourcehans) を doraTeX さんが公開しているので，その使い方をご紹介します。

1. 上記 tcsourcehans の「インストール法」を実行。 `sudo cp` するとパーミッションが不適切になることがあるので， `chmod` で適切なパーミッションを設定します。 `sudo cp -p` でもうまくいくかもしれません。
2. プリアンブル (`\begin{document}` よりも前) に，以下のようにパッケージの宣言と日本語書体の指定を追加します。

```latex
\usepackage{tcsourcehans}
\renewcommand{\kanjifamilydefault}{sourcehans}
```
`\renewcommand{\kanjifamilydefault}{\gtdefault}` が既にある場合は，コメントアウトするか，上記のように編集します。

これで日本語がすべて Source Han Sans になると思います。 `Alert` の太字も他の書体同様に反映されるはずです。
Unity・Rails間のデータ送受信の方法

こんにちは。

今回はUnity・Ruby on Rails間のデータ送受信の方法を説明します。

# 環境
- Unity 5.6.0f3
- Rails 5.0

# データ送信

データを送信する場合の例です。

## Unity側
```C#
using UnityEngine.Networking;

	public void ConnectionStart(){
		StartCoroutine(Coneection("str"));
	}

	private IEnumerator Connection(string name)
	{
		WWWForm form = new WWWForm();
		form.AddField("name", name);
		UnityWebRequest request = UnityWebRequest.Post("https://myapp.com", form);

		// リクエスト送信
		yield return request.Send();

		if (request.isError) {
			Debug.Log ("エラー:" + request.error);
		} else {
			if (request.responseCode == 204) {
				Debug.Log ("せいこう！");
			} else {
				Debug.Log ("しっぱい…:" + request.responseCode);
			}
		}
	}
```

送信するデータは``` WWWForm ```クラスの``` AddField ```メソッドを使って設定します。
``` yield return request.Send(); ```はUnityの[コルーチン](https://docs.unity3d.com/jp/540/Manual/Coroutines.html)という機能を使っています。
ここでは、リクエストの結果が返ってくるまで次の処理に行かないようにしています。
``` request.responseCode ```にはリクエストのHTTPステータスコードが入っています。

[ステータスコード一覧はこちら](https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89)

## Rails側

```rb:routes.rb
post '/', to: 'top_pages#create'
```

```rb:top_pages_controller.rb
  def create
    puts params[:name]
  end
```

Railsでは、routes.rbとtop_pages_controller.rbに上記のコードを追加します。
Unity側の``` form.AddField("name", name); ```の第1引数と、
Rails側の``` params[:name] ```のシンボルが対応しています。

さらに、Unity側の``` form.AddField("name", name); ```の第2引数と、
Rails側の``` params[:name] ```の中身が対応しています。

# データ受信

データを受信する場合の例です。

## Unity側

```C#
using UnityEngine.Networking

	public void ConnectionStart(){
		StartCoroutine(Connection());
	}

	private IEnumerator Connection() {
		UnityWebRequest request = UnityWebRequest.Get("https://myapp.com/show");

		// リクエスト送信
		yield return request.Send();

		if (request.isError) {
			Debug.Log("エラー:" + request.error);
		} else {
			if (request.responseCode == 200) {
				Debug.Log ("せいこう！");
				Debug.Log (request.downloadHandler.text));
			} else {
				Debug.Log ("しっぱい…:" + request.responseCode);
			}
		}
	}
```

基本的にデータ送信とほとんど変わりません。Railsから受信したデータは```request.downloadHandler.text ```に入っています。

## Rails側

```rb:routes.rb
  get '/show', to: 'top_pages#show'
```

```rb:top_pages_controller.rb
  def show
    render :text "str"
  end
```

Railsのコードも基本的にデータ送信とほとんど変わりません。
``` render ```を使うことでRailsからUnityにデータを送れます。
ここでは文字列を例にしましたが、文字列以外も送れます。

[詳しくはこちらから](http://railsdoc.com/references/render)

何か質問がありましたらお気軽に。

# 参考
[UnityWebRequestによるHTTP通信](http://blog.applibot.co.jp/blog/2016/07/20/unity-webrequest/)
Mongooseでクエリパラメータの数を動的に変更する

## 前提

* Express
* Mongoose
* APIっぽいものを作っている

## 単純な例


次のようなクエリで、findに渡すパラメータをオプショナルとしたい場合
※スキーマ定義などは省略

```js:sample.js
router.get('/', function(req, res, next) {
  let userId = req.query.userid;
  let userType = req.query.usertype || null;

  User.find({userid: userId, usertype: userType}, (err, docs) => {
    // userTypeをオプショナルなパラメータとしたい !!
    res.json(docs);
  });

});

```



事前にクエリを作成しておくとよい


```js:sample2.js
router.get('/', function(req, res, next) {
  let userId = req.query.userid;
  let userType = req.query.usertype || null;
  }
  
  // findの第一引数に渡すqueryオブジェクトを事前に作成
  let query = {
    userid: userId,
  }
  // 必要に応じて追加
  if (userType != null) {
    query.type = dripType;
  }

  User.find(query, (err, docs) => {
    res.json(docs);
  });

});

```


コレが一番単純な方法だと思いますが、他によい方法があればコメント頂けるとうれしいです。
GCEでLaravelからメールが送れなかった


いつもメール送信は[SendGrid](https://sendgrid.com/)さんにお世話になってるんですが、GCEにLaravelを乗せたらメールが送れない・・・

よくよくドキュメントを読んたら、ポート 25、465、587 での送信接続は許可がされていないだけでした。

[インスタンスからのメールの送信   Compute Engine  Google Cloud Platform](https://cloud.google.com/compute/docs/tutorials/sending-mail/)

いつも587とか465とかで送ってるのを2525に変更したら送れました。

```
MAIL_DRIVER=smtp
MAIL_HOST=smtp.sendgrid.net
MAIL_PORT=587
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=[mail.address]
MAIL_FROM_NAME=
MAIL_USERNAME=[mail.address]
MAIL_PASSWORD=[passwd]
MAIL_PRETEND=true
```
Amazon WorkSpacesでASP.NET開発環境をつくってみた ～その１～

うれし恥ずかし初めてのQiita投稿 (/ω＼)
自社プロダクト向けの開発環境をWorkSpacesで作り、更にそれをイメージ化しておいて、必要な時にポンポンと簡単に複製したいという思惑でチャレンジしました。
一部つまづいた所もありましたので、皆さまの参考になれば幸いです。

# WorkSpacesで構築したい開発環境

ちょっと古め。ASP.NET 4.5ベースの開発環境、SQL Serverも使います。

* VisualStudio 2010 Express
* .NET Framework 4.5.1
* SQL Server 2008 R2 Sp2 Express

# 全体の目次
その1. WorkSpacesのセットアップ　★ 今回はここ ★
その2. ASP.NET開発向け各種ソフトのセットアップ
その3. WorkSpacesのイメージ化　からの環境複製

# 大まかな手順【WorkSpacesのセットアップ】

## １．Simple ADのセットアップ
まず、WorkSpacesを利用するためにはAWS Directory Serviceが必要となります。
Active Directoryの簡易版のSimple ADを利用。詳細は割愛。

## 2. WorkSpacesのセットアップ
あとは専用ウィザードに従うのみ。

1. AWSマネジメントコンソールからWorkSpacesに移動し、左上の[Launch WorkSpaces]を迷わずクリック <br/><br/>
2. Launch WorkSpacesウイザード ＞ Step 1: Select Directory<br/>
先程セットアップしたDirectory Serviceを選択して[Next Step]をクリック<br/><br/>
3. Launch WorkSpacesウイザード ＞ Step 2: Identify Users<br/>
このWorkSpacesを利用するユーザーを、「Select Users from Directory」エリアで選択する。<br/>
「Create New Users and Add Them to Directory」エリアで、対象のDirectory Serviceに新規ユーザーを作成することも可能。<br/>
完了したら[Next Step]をクリック<br/><br/>
4. Launch WorkSpacesウイザード ＞ Step 3: Select Bundles<br/>
各種バンドルがリストアップされるので、必要な構成のものを選択する。ちなみに私は「Standard with Windows 7」を選択。<br/>
Languageは「Japanese（日本語）」を選択し、[Next Step]をクリック<br/><br/>
5. Launch WorkSpacesウイザード ＞ Step 4: WorkSpaces Configuration<br/>
・Running Mode<br/>
　 端的に言うと、月額課金(AlwaysOn)か時間課金(AutoStop)かの選択です。<br/>
　どっちがお得か？については、80時間/月くらいが閾値になりそう。<br/>
　今回はよくわかんないので、とりあえずAutoStopを選択<br/><br/>
・Encryption
　マウントされるボリュームを暗号化するかどうかの設定。<br/>
　※ここで暗号化にチェックを入れると後工程でイメージを作成できなくなります！！ 当然、今回はチェックOFF<br/><br/>
そして[Next Step]をクリック<br/><br/>
6. Launch WorkSpacesウイザード ＞ Step 5: Review<br/>
いちおう確認して、問題なければ[Launch WorkSpaces]をクリック。

## 3. WorkSpacesにアクセス
しばらく（20分ほど）すると「Launch WorkSpacesウイザード ＞ Step 2: Identify Users」で選択したユーザーのメールアドレス宛に作成完了のメールが届くので、メール記載の手順に従ってWorkSpacesにアクセス。


# 感想
とりあえずここまではめっちゃ簡単です。
使い心地は今のところ快適。各種デバイスからアクセスできるんで非常に便利です。

今回は時間課金(AutoStop)を選択したので、マシンの停止を忘れて死ぬほど請求がきたらどうしよう・・・
と、おっかなびっくりでしたが、その名の通りAutoStop（自動停止）の時間を設定できるので安心。
また、作成後に月額課金(AlwaysOn)への変更もできるようですので、まずは時間課金で手軽に始めてみるといいかもですね。

それでは、次回は「その2. ASP.NET開発向け各種ソフトのセットアップ」に移ってまいります ('◇')ゞ
Chromeのクソウザダウンロードバー野郎をkillする方法まとめ


- 何かをダウンロードすると下の方に通知が出る
- 自動で消えない
- マウスで「☓」クリックとかしないといけない
- しね

## 1. 拡張機能「Always Clear Downloads」
- [Always Clear Downloads \- Chrome ウェブストア](https://chrome.google.com/webstore/detail/always-clear-downloads/cpbmgiffkljiglnpdbljhlenaikojapc/)

とりあえずこれ入れといたら解決

他にも似たような拡張があるのでそれでもいい

## 2. 試験運用機能「新しいダウンロードUI」（削除済み）
- [Google Chromeの煩わしいダウンロードバーを非表示にする｜リスティング広告の運用代行ならカルテットコミュニケーションズ](https://quartet-communications.com/info/topics/8772)
 
> ※ 以前までは、アドレスバーに「chrome://flags」と入力して試験運用機能の画面を開き、「新しいダウンロードUI」を有効にするという方法で完全に非表示にすることが出来たのですが、2012年9月末のアップデート以降、これが出来なくなっていました。

ふぁっく

## 3. キーボードショートカット
- [Chrome のキーボード ショートカット \- Chrome ヘルプ](https://support.google.com/chrome/answer/157179?hl=ja)

### Windows
- [Google Chromeのブラウジングが爆速になるショートカットまとめ \| Web制作会社スタイル](http://www.hp-stylelink.com/news/2013/09/20130920.php)

公式ヘルプには書かれていないが、F6(Shift+F6)でフォーカスを移動する場合、ダウンロードバーが表示されていればそれも含まれる。

ただし、ダウンロードバーがフォーカスされているとき、その表示を消すショートカットが存在しない。Tab(Shift+Tab)でさらにフォーカスを移動して、「☓」がフォーカスされているときにSpaceとかEnterを押すしかない。

ページコンテンツがフォーカスされているとき、最短の手順は以下の通り。

- Shift+F6：ダウンロードバーをフォーカス
- Shift+Tab：「☓」ボタンをフォーカス
- Enter：ダウンロードバーを消去

いちおう、ダウンロードページを開くとダウンロードバーは消えるので、Ctrl+J→Ctrl+Wという手もないではない。

### Mac
Macの場合、該当するショートカットキーが存在しない。

Tab(Shift+Tab)で**アドレスバー、ブックマークバー、ページコンテンツ、ダウンロードバー、そしてそれぞれの包含する項目を順にフォーカス**できることはできるので、Tab連打してたらそのうち辿り着くってやってらんねえ。

いちおう、Cmd+Lでアドレスバーにフォーカスして、そっからShift+Tabで逆順が一番早いと思う。

Cmd+J→Cmd+WはWindowsと同様に可能。
LTPでBash on Windowsを検証する

## はじめに

日々進化を続けるBash on Windows(以下BoW)ですが、Linuxとどれだけ互換があるのか気になることがあります。

そこで、以前、自分が書いた[LTPによるLinuxシステム検証](http://qiita.com/stc1988/items/e53a6e9ac818233cc66f)　という記事で紹介しているLTPというLinux検証ツールを用いてでBoWを検証してみようと思いました。

## LTPは実施されていた

が、MicrosoftでもLTPを実施しており、その結果が公開されています。
https://github.com/Microsoft/CommandLine-Documentation/tree/live/LTP_Results

Bowのリリースノートにも毎回LTPの結果が掲載されています。
https://msdn.microsoft.com/ja-jp/commandline/wsl/release_notes

## 自分でも実施してみる

実際に自分で動かして結果を見たい人もいるかもしれないので、実施してみる。
とは言え、手順も[前に書いた記事](http://qiita.com/stc1988/items/e53a6e9ac818233cc66f)の通りで大丈夫でした。

やったことは、BoWにmakeやらgccが足りていないので　最初にインストールしました。

``` terminal
# apt install build-essential
```

実施環境は以下通りです。
* Windows10 15063.13
* Bash on Windows - Ubuntu 16.04.2 LTS
* LTP - 20170116

systemcallsを実施したのですが、MSの結果同様にfork014のテストが帰ってこなかった。

LTPって以外と使われるのだな、と再認識しました(記事としての成果は無し
HoloLensのアプリケーションをC#使って開発する際に気を付けること

# .NET使いからみるUnityのC#でいろいろするとつらくなる件
Unityでアプリケーション実装する際にC#使っているときは色々とつらいことが発生しています。その中でもUnityだけでアプリ開発している人が何かほかのC#ライブラリを持込む等するときに気を付けたほうがいいと思うことを備忘録として残します。

## 気を付けるポイントを理解するための前置き
### その1 - HoloLensはUWPアプリケーションです。
重要です。UWPアプリケーションは一応C#でかけるのですが、.NET Frameworkとは別物です。いやいや同じC#言語でかけるでしょ！？となると思います。乱暴な言い方ですが、<font color="OrangeRed">.NET Framework X.XとUWPは別のバイナリで動いてる</font>と思ってまちがいないです。
この仕様があるため、<font color="OrangeRed">.NET Framework X.XでビルドしたクラスライブラリをUWPでは参照することができません（逆もしかり）。</font>

### その2 - Unityの.NETは「.NET Framework 3.5」が基本
Unityは.NET Framework 3.5が基本となっています。ここで「あれ？」となる人がいると思います。さっきも言ったようにHoloLensはUWPアプリケーションです。基本Unityが.NET 3.5なのになぜUWPでアプリケーションが作れるのか。とても簡単な話で単純にUnityでBuildした場合、Unity内で.NET 3.5のC#コードをUWPのプロジェクトに変換して出力しています。<font color="OrangeRed">Unity上でビルドエラーが出ていない状態のC#のコードであれば何の問題もなくUWPに変換されます。(一部の問題を除いて)</font>

## 気を付けないといけないこと
以上を踏まえ本題の内容になります。

### 外部ライブラリ(dll)を使用する場合.NET Framework X.Xで作られたものは使えない。
先ほどの一部の問題というのがこれに当たります。Unityは.NET 3.5のルールでコードを書くのでまず.NET 3.5より上位（4.0～)で作られたライブラリは使えません。
これだけならいいのですが、<font color="OrangeRed">.NET3.5で作られたライブラリはUnity内では使えますが、UnityからHoloLens用にUWPでビルドすると参照できないために動きません。</font>これは先に話したUWPと.NET X.Xのライブラリは参照関係をとれないためです。よって外部のdllを使用して作ったUnityアプリをPlayerで確認してOKでも、ビルドしてダメになるパターンが発生します。

#### 対応方法
１つの方法として、dllの元となるソースコードがある場合、UnityのProjectにコードを全部入れてしまうという方法です。これであればHoloLens用にUWPをビルドするタイミングで変換してくれるので問題なく利用できます。ただし、投入したコードが別のdll（標準の.NETは除く）を見ているとだめなのですが。

## 個人的に困ると感じていること。
### その1 - 部品としての流用が難しい。
上記のような対応を行う場合、Unity限定なら必要なライブラリをまとめてパッケージにすることで流用もできますし問題ないです。ただ私の場合、Unity以外の.NETでもライブラリとして使いたいことがあるのでUnityのパッケージでは不便を感じています。

### その2 - 最新の技術が使えない。
現状リリースされている.NETファミリーは最新が.NET Framework 4.7です。この上で動作するC#についてはまた別にバージョンを持っています。最新はC#7.0です。Unityで使える.NET Framework 3.5は.NETとしては１世代以上前の技術になります。このため不便な部分が多々あります。下位のバージョンは処理としては同じことができますが手間が違います。

#### 不便な例－同期/非同期処理

　重い処理を非同期でさせるということはよくある話ですが、複数の非同期処理を組み合わせる処理があると思います。クラウドのサービスを２，３連携して呼ぶようなパターンです。これを.NET 4.5以降では以下のように、次の処理を同期的に待たせたりとかをかなり自然に書けます。非同期処理を待たせたい場合はawait入れるだけでその部分は処理を同期してくれます。.NET 3.5では自分で待機処理を書かないとできないです。

```csharp
public Task async Hoge()
{
      //非同期１つ目。待たなくてもいいパターン
      ExecuteAsync();

      //非同期２つ目。後続がこの処理の結果を必要とするので待つ必要がある。
      var result = await ExecuteAsync2();

      //非同期3つ目。2つ目の結果を受け取って処理する。
      await ExecuteAsync3(result);
} 
```

## その他
Unityで無難にC#で書こうとするとUnity上で全部コード書かないといけない＆HoloLensはUWPのくせにUWPの便利なものが使えない。過去にUWPと組み合わせるために色々試行してるものがあるのですが、まだまだ中途半端です。
色々不便さがあるので、より使いやすい方法でうまくライブラリ化して利用しやすい構造をとれるようにしていきたいと思います。案は色々あるのでいい方法ができればまた報告したいと思います。
AndroidでSSID取得(Unityでビルド)

# 概要
UnityでビルドしたAndroidアプリで、SSIDを取得する。
端末が受信したSSID一覧を取得する。


# 環境

|Unity |5.6.0f3 on macOS|
|----|----|
|AndroidStudio|2.3.1|
|実機端末|VAIO PHONE　Android6.0.1|


# 作業

## 1:UnityにAndroid用プラグインを追加
参考：http://indie-du.com/entry/2016/07/14/200000

上記を参考に、アラートが出るのを確認する。
僕は、Log.dで確認しました


## 2:Javaのソースを改造する

＊参考サイトとは、パッケージ名、クラス名が違うので、注意。

```SSIDManager.java
package com.exsample.android.mock.sakuma.myssid;

import android.content.Context;
import android.util.Log;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import java.util.List;

public class SSIDManager {


    static public void getSSID(Context context){

        Log.d("testLog:","aaaa");




        final WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        if (manager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {
            manager.startScan();
            List<ScanResult> results = manager.getScanResults();

            Log.d("testLog:","bbbb" + results.size());
            final String[] items = new String[results.size()];
            for (int i=0;i<results.size();++i) {
                items[i] = results.get(i).SSID;
                Log.d("testLog:", items[i]);
            }

        }

        Log.d("testLog:","cccc");


    }
}

```

## 3:パーミッション追加
SSID取得するために、パーミッション追加

```AndroidManifest.xml
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

```

## 4:ライブラリ作成し、Unityにインポート
1の参考サイトどおりに、aarファイルを作成し、
Unityにインポート

## 5:Unity呼び出し元を修正



```SceneManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;


public class SceneManager : MonoBehaviour {

	// Use this for initialization
	void Start () {
        #if UNITY_ANDROID
        AndroidJavaClass ssidManager = new AndroidJavaClass ("com.exsample.android.mock.sakuma.myssid.SSIDManager");

        // Context(Activity)オブジェクトを取得する
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
        AndroidJavaObject context  = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        context.Call ("runOnUiThread", new AndroidJavaRunnable(() => {

            // staticメソッドを呼び出す
            ssidManager.CallStatic (
                "getSSID",
                context
            );
        }));

        #endif
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

```

## 6:ビルドして終わり
端末で実行
ログにSSIDが出力されるはず



# 補足
Android6からACCESS_FINE_LOCATIONのパーミッションがないと
SSID取得できないっぽい。
圧倒的当事者意識（ATI）ってちょっと傲慢じゃないでしょうか

# あくまで意識
圧倒的当事者意識は文字通り、自分が当事者であることを想像して作業をするということ。
それは、他人のことを完全に理解するのは無理なので、頑張って想像しましょうということ。

# あなたのことはわからない。だけどわかりたいんだ！
っていう相手に対する尊敬や愛があってATIは成り立つと思う。
だからATI、ATIと口にする前に、愛を持つということが大事なんじゃないでしょうか。
カスタマやクライアント、PJ関係者、すべてに・・・（難しいかな）。

# だから愛がないならATIをしなくてもいい気もする
愛がないATIはその人に対して失礼だと思うので。
Linuxのdateコマンドを使ってAprとかFebが何月なのかを知る方法、そしてその逆

日付フォーマットが「Sun Apr 23 22:36:20...」とか[18/Feb/2017:22:19:42 +0900]のように月の部分が英語表記になっている機会に出くわすことがよくあるんですが、「Febって何月だっけなー」みたいに悩んでしまう事があります。

そんな時にLinuxのdateコマンドを使って調べる方法です。UbuntuとTiny Core Linuxで試していますが他のLinux上でいけると思います。


## 英語表記の月名から数字の月を得る
`date`コマンドを使えば英語表記の月名から数字の月を得る事ができます。案外とシンプルに書けますので覚えやすいかなと思います。

```console:英語表記が何月かを調べる
$ date -d"Apr 1" +%m
04
$ date -d"Feb 1" +%m
02
```

英語表記の後の「1」は日にちを表していて「Apr 1」は「4月1日」となって%mで月だけ取り出すという感じです。なので「1」の部分は「2」でも「3」でも「7」でも日にちの範囲内なら何でもOKです。

## 更に短く
ちょっと分かりにくくなりますがスペースは省略可能ですので、更に短く書くことができます。

```console:更に短く
$ date -dApr1 +%m
04
$ date -dFeb1 +%m
02
```

## 日本語環境なら更に更に短くできる（ちょっとコツが必要）
日本語環境なら月は数字で表記されるため+%mを省略しても何となく分かります。年、日、時間を自分の頭の中でフィルターして月だけを見るというコツが必要となりますが…。

```console:更に更に短く（日本語環境のみ）
$ date -dApr1
2017年  4月  1日 土曜日 00:00:00 JST
$ date -dFeb1
2017年  2月  1日 水曜日 00:00:00 JST
```

## 英語表記の部分の大文字小文字は関係ないけど…
英語表記の部分は大文字小文字は関係ありませんが、%mのところを%Mとすると意味が違ってしまうので注意が必要です。%mは月で%Mは時間を表します。

```console:大文字でも小文字でもOK
$ date -d"apr 1" +%m
04
$ date -d"feb 1" +%m
02
$ date -d"APR 1" +%m
04
$ date -d"FEB 1" +%m
02
```

```console:%mは大文字にするとNG
$ date -d"APR 1" +%M
00
$ date -d"FEB 1" +%M
00
```

## 念のため全ての月で試してみた
もしかしてという事もあるので全ての月名を試してみました。うん大丈夫そうですね。

```console:全て変換
$ date -d"Jan 1" +%m
01
$ date -d"Feb 1" +%m
02
$ date -d"Mar 1" +%m
03
$ date -d"Apr 1" +%m
04
$ date -d"May 1" +%m
05
$ date -d"Jun 1" +%m
06
$ date -d"Jul 1" +%m
07
$ date -d"Aug 1" +%m
08
$ date -d"Sep 1" +%m
09
$ date -d"Oct 1" +%m
10
$ date -d"Nov 1" +%m
11
$ date -d"Dec 1" +%m
12
```

スペースを省略した場合も試してみました。こちらも大丈夫そうです。

```console:スペースを省略した場合
$ date -dJan1 +%m
01
$ date -dFeb1 +%m
02
$ date -dMar1 +%m
03
$ date -dApr1 +%m
04
$ date -dMay1 +%m
05
$ date -dJun1 +%m
06
$ date -dJul1 +%m
07
$ date -dAug1 +%m
08
$ date -dSep1 +%m
09
$ date -dOct1 +%m
10
$ date -dNov1 +%m
11
$ date -dDec1 +%m
12
```

## 数字の月から英語表記を得る事も可能です
4月を英語表記にするとどうなるんだっけ？という時も`date`コマンドが使えます。考え方は全く同じです。

```console:数字から英語表記を調べる
$ date -d"4/1" +%b
Apr
$ date -d"12/1" +%b
Dec
$ date -d4/1 +%b #ダブルクォートは略してもOK
Apr
$ date -d12/1 +%b #ダブルクォートは略してもOK
Dec
```

日本環境だと` 4月`とか`12月`と表示されてしまって意味がない結果となってしまうので、そうゆう場合は`LC_ALL=C`を指定することで英語名を取得できます。

```console:日本語環境の場合でもLC_ALL=Cを指定すればOK
$ date -d"4/1" +%b
 4月
$ date -d"12/1" +%b
12月
$ LC_ALL=C date -d"4/1" +%b
Apr
$ LC_ALL=C date -d"12/1" +%b
Dec
```
[社内向け]Docker勉強会(入門)

# Dockerってなによ？
@IT [超入門Docker:第1回　Dockerとは](http://www.atmarkit.co.jp/ait/articles/1701/30/news037.html) 参照

# Dockerで開発してみる
## ローカルにDockerを導入する
+ [Docker for Mac](https://docs.docker.com/docker-for-mac/install/) -> ネットワーク周りが微妙に特殊
+ [Docker for Windows](https://docs.docker.com/docker-for-windows/install/) -> Windows10からなのが残念
+ [Docker Toolbox](https://docs.docker.com/toolbox/overview/) -> Windows7は64bitOSである必要あり
+ [VirtualBox+Vagrant](http://qiita.com/mikoski01/items/7ed36ac9e402658bb93e) -> たぶんいちばん汎用的

ほかにもあるけどこの辺がおそらく主流

## とりあえずDockerでHello world!
```bash
$ docker container run hello-world
```

### なにが起こったの？
1. [Docker Hub](https://hub.docker.com/)から[hello-world](https://hub.docker.com/_/hello-world/)のイメージをダウンロード(`docker image pull`)
2. hello-worldイメージをフォアグラウンドで実行

#### hello-worldイメージはなにをしているのか見てみよう
[Dockerfile](https://github.com/docker-library/hello-world/blob/bdee60d7ff6b98037657dc34a10e9ca4ffd6785f/hello-world/Dockerfile)を見てみるとわかります

## これを踏まえて開発の流れ
1. ベースイメージを決める
2. Dockerfileを作成する
3. Dockerfileを元にイメージをbuild(`docker image build`)
4. buildしたイメージをデプロイ(実行)

(ベースイメージ内で作業した内容をcommitする方法もあるけどアンチパターンだと思う)

### golangでhello-worldしてみよう
#### 1. ベースイメージを決める
[golangの公式イメージ](https://hub.docker.com/_/golang/)(golang:1.7.5)を使用することにします。
当然、まっさらなイメージを選択して自分でgolangのインストールから実施するのもOKです。

#### 2. Dockerfileを作成する
```Dockerfile
FROM golang:1.7.5
COPY hello-world.go /src/
RUN go build /src/hello-world.go && rm /src/hello-world.go
ENTRYPOINT ./hello-world
```

```hello-world.go
package main
import "fmt"
func main() {
  fmt.Printf("Hello world\n")
}
```
#### 3. Dockerfileを元にイメージをbuild
```bash
$ docker image build . -t dockertest:1.0
```

#### 4. buildしたイメージをデプロイ(実行)
```bash
$ docker container run dockertest:1.0
```

## Dockerfile書き始める前に色々試したい
ベースイメージでbashを実行して作業しましょう。

```bash
$ docker container run -it --rm golang:1.7.5 /bin/bash
```

---
とりあえず今日はこのあたりまで。指摘とかあったら修正します。
次回(あるのか!?)はコンテナ間の通信について、とかかな。
Mac版 OpenFrameWorks 0.9.8 projectGenerator.app 使い方

# projectGenerator.appの使い方
普通にクリックすると以下のようになる。
<img width="559" alt="スクリーンショット 2017-04-24 17.50.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/54553/44eed6c2-f488-9ec5-34d0-abc8f9405c1a.png">



エラーの通り、"addons"と"libs"があるディレクトリにappを移動します。
<img width="453" alt="スクリーンショット 2017-04-24 19.40.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/54553/3aa60675-3413-aa0b-fa1c-93cf24ff9b96.png">




appのフォルダにパス通せば、エラーが無くなった。
<img width="595" alt="スクリーンショット 2017-04-24 17.49.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/54553/e54c1870-c95b-514a-ae8d-542731bcf6d0.png">
Apacheの基本知識（CentOS 6.9 ver）

#1. Apacheとは
Apacheとは、Webサーバーの実装の一種。
Webサーバーとは、HTTPをサポートしているサーバーであり、Webサーバーの基本機能は、サーバーマシン上のファイル（リソース、コンテンツ）をクライアントに転送することである。
現在のWebサーバーのマーケットシェア率（世界中の全サイト対象、2017年4月時点）は、

1位　Microsoft 45%
**2位　Apache 23%**
3位　nginx 19%
4位　その他
となっている。by[ Netcraft](https://news.netcraft.com/archives/2017/04/21/april-2017-web-server-survey.html)


#2. バージョン確認と起動と停止
環境はCentOS6.9を用いた。

導入したApacheのバージョンを確認するコマンド
`/usr/sbin/apachectl -v`
or
`rpm -qa | grep httpd`
後者はyumやrpmパッケージでインストールしている場合のみ有効

起動、停止、再起動、状態確認に関してはsudoコマンドが必要

起動
`/etc/init.d/httpd start`
停止
`/etc/init.d/httpd stop`
再起動
`/etc/init.d/httpd restart`
状態確認
`/etc/init.d/httpd status`

#3. 設定ファイル
##3-1. 場所

`/etc/httpd/conf/httpd.conf`
**httpd が起動する際に最初に読み込まれるメインの設定ファイル**。

`/etc/httpd/conf.d`
httpd.conf ファイル内で include 指定されているディレクトリ。
**このディレクトリ内に置かれた拡張子が.conf であるファイルも設定ファイルとして使用される。**

##3-2. コンテンツの配置
**※以下のコードは全てhttpd.conf内の記述である。**

**ドキュメントルート ( DocumentRoot )**
Apache が公開するファイルを含むディレクトリは、DocumentRoot ディレクティブで指定されています。CentOS6.9のデフォルトの場合、

`DocumentRoot "/var/www/html"`
と設定されている。このディレクトリに公開したいファイルを配置することになる。

**インデックスファイル ( DirectoryIndex )**
クライアントからの要求にファイル名の指定が無い場合に、デフォルトで返されるファイル名を指定。

`DirectoryIndex index.html index.html.var`

**Indexes オプション ( Options Indexes )**
通常、指定されたディレクトリ内にインデックスファイルが存在しなければエラーとなるが、Indexes オプションが設定されている場合、ディレクトリ内のファイルの一覧が返される。

/var/www/html にIndexes オプションを設定する場合
`<Directory "/var/www/html">
   Options Indexes
   ...
</Directory>`

##3-3. ログの管理方法
サーバーが出力するログには、エラーログとアクセスログがある。

**エラーログ**：サーバープロセスに関連するログ。起動、停止時やリクエストを処理したときのエラーが記録される。

`ErrorLog errorlog_filename
LogLevel ( debug|info|notice|warn|error|crit|alert|emerg )`

デフォルトの場所は、
`/var/log/httpd/error_log`
である。エラーで詰まって辛くなったら、とりあえずこの中身を見て、エラー内容をググれば、なんとかなるかも。

**アクセスログ**クライアントからのリクエストを指定されたフォーマットで記録する。（大事！！）

`LogFormat "format" format_nickname CustomLog accesslog_filename format_nickname`

`"format"`の部分には様々な文字列が使用可能（下記参照）。
[アクセスログのフォーマット(LogFormat)](https://www.adminweb.jp/apache/log/index2.html)
これをカスタマイズすることで、自分が欲しい情報のみを的確に捉えられる。

##3-4. モジュール
Apacheには、多くのモジュール（いま風な言い方で言うとプラグイン）が提供されている。
実行時に使用するか選択できるモジュールのことを「動的な」モジュールといい、httpd.conf内に**LoadModuleディレクティブ**を用いて設定される。

**LoadModule構文**
`LoadModule module_name module_file`
module_file:モジュール名。
module_file:モジュールの実装ファイル
FlowのType Refinementsが便利

FlowのType Refinementsが便利だった。使ってるFlowのバージョンは0.44.2。

<https://flow.org/en/docs/lang/refinements/>

[Union Type](https://flow.org/en/docs/types/unions/)に対してifやswitchを使って、変数の型を検証することで、そのブロック内で検証済みの型として利用することができる。

具体的にはこんな感じ。

```js
// @flow
function logString(value: string) {
    console.log(value);
}

function logBoolean(value: boolean) {
    console.log(value);
}

function test(value: string|boolean) {
    if (typeof value === 'string') {
        logString(value);
    } else if(typeof value === 'boolean'){
        logBoolean(value);
        // logString(value); だとflowがエラーを吐く
    }
}
```

これがどういう時に嬉しかったかというと、最近flux/utilsを使う機会があって、Actionの型定義とReduceStoreでのActionの処理が素直かつ型安全にかけた（と思ってる）。
具体的にはこんな感じ。Stateは今回関係ないのでanyとしておく、ActionとStoreは実際には別ファイルに書いてる。

```js
// @flow
type Action = {
    type: 'STRING_ACTION',
    value: string,
} | {
    type: 'BOOLEAN_ACTION',
    value: boolean,
}

function reduce(state: any, action: Action) {
    switch (action.type) {
        case 'STRING_ACTION':
            logString(action.value);
            break;
        case 'BOOLEAN_ACTION':
            logBoolean(action.value);
            // logString(action.value);だとエラー
            break;
    }
}
```

実際のflux/utilsを使ったコードは、fluxのexampleだと、flux-flowかflux-asyncあたりで該当のコードを確認できる。

<https://github.com/facebook/flux/blob/master/examples/flux-flow/src/AppActions.js>
<https://github.com/facebook/flux/blob/master/examples/flux-flow/src/AppStore.js>


リファクタリングとかも楽になるし、レールに乗れてるうちはFlowは便利だなというのが今のところの印象。
hiveのparse_urlについてまとめてみた

# はじめに
サイトのアクセス解析をするときに、urlを解析して、ドメインやクエリ文字列を使用したい場合がある。
そのときによく使うparse_urlという関数についてまとめてみた。

## HOST
ドメインが取得できる
parse_url('http://domain1.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST')
⇒　domain1.com

## PATH
ドメインより後ろのPathが取得できる
parse_url('http://domain1.com/path1/p.php?k1=v1&k2=v2#Ref1', 'PATH')
⇒　/path1/p.php

## QUERY
クエリ文字列が取得できる
parse_url('http://domain1.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY')
⇒　k1=v1&k2=v2

keyを指定すればその文字列を取得することもできる
parse_url('http://domain1.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY', 'k1')
⇒　v1

TreasureDataであれば以下の関数を利用してデコードをすることもできる
td_url_decode(parse_url('http://domain1.com/path1/p.php?k1=%e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a&k2=v2#Ref1', 'QUERY', 'k1'))
⇒　あいうえお

## REF
ラベルが取得できる
parse_url('http://domain1.com/path1/p.php?k1=v1&k2=v2#Ref1', 'REF')
⇒　Ref1

## PROTOCOL
プロトコルが取得できる
parse_url('http://domain1.com/path1/p.php?k1=v1&k2=v2#Ref1', 'PROTOCOL')
⇒　http

## FILE
PATH + QUERYが取得できる
parse_url('http://domain1.com/path1/p.php?k1=v1&k2=v2#Ref1', 'FILE')
⇒　/path1/p.php?k1=v1&k2=v2
HTC Viveのモーションキャプチャシステムを使う時のtips

## 概要
このURLで公開されているHTC Viveとvive tracker3個を使うフルボディIKを試す時に、覚えておくと良いことを書きます。

https://github.com/JamesBear/vive_ik_demo

## 最初に動作確認
**ルームセットアップ済みを前提にします**

上記URLからzipなりcheckoutしたディレクトリにある
vive_ik_test.rar
を解凍して、中のexeを実行します。

いきなり、コントローラに手が追従しなくてビビりますが、映っている人とぴったり重なるように手と頭と足を合わせます（現実の人もTポーズをすることになります）

Tポーズのまま両手のViveコントローラのグリップボタン(両再度のボタン)を二回握ると、トラッキングが始まります。

トラッカーの数が2個や1個の場合は、手や足など、別の部位が追従しなくなります。

## Unityプロジェクト
Final IKをインポートしないと動きません。

これもサンプルシーンで、Tポーズを重なるようにして実行しないといけません。


-- 以下思いついたら追記します --
ArchLinux の pacman で、うる覚えの導入済みパッケージを楽に探したい

## 概要

例えば、ネットワーク関係の、とある機能に問題が生じ

「えーと、あの、ネットワーク関連のパッケージ... 何を使っていたっけ?」

という状況下で当該パッケージを探し当てたい。

- とある機能を実現するには選択肢が複数存在する
- 自分が何を選択したのか完全に失念
- 当然、パッケージ名は不明

## 目標

- 曖昧なワードから、インストール済みのパッケージを検索したい
- 問題解決の為に当該パッケージの詳細も表示したい
- 割とよくあるので手軽に済ませたい

## 今まで

### 検索

インストール済みのパッケージ名と、その説明文を対象に `network` で検索する。

```console
$ pacman -Qs network
local/パッケージ名 バージョン
    説明文
local/パッケージ名 バージョン
    説明文
local/パッケージ名 バージョン
    説明文
```

オプション等

```console
$ pacman <オペレーション> [オプション] ...
```

- `-Q, --query` (オペレーション): ローカルデータベースに問い合わせる
- `-s, --search <正規表現>` (オプション): インストール済みパッケージの部分一致検索

### 詳細表示

先ほどのリストからパッケージ名を手入力で

```console
$ pacman -Qii networkmanager
名前                   : networkmanager
バージョン             : 1.6.2-3
説明                   : Network connection manager and user applications
アーキテクチャ         : x86_64
URL                    : https://wiki.gnome.org/Projects/NetworkManager
ライセンス             : GPL2  LGPL2.1
グループ               : なし
提供                   : なし
... 以下略 ...
```

- `-i, --info <パッケージ名>`: パッケージ情報の表示
    - `-ii` でバックアップファイル (`/etc` 以下に置かれる設定ファイルの類?)も表示。

### 問題点

- 「検索」と「詳細表示」間の手入力が面倒
- 「詳細表示」の結果、目当てのパッケージでは無かった場合に、やり直すのがストレスフル

## 解決策

- 検索
- 絞り込み&選択 (今回は [peco](https://github.com/peco/peco) を使う)
- 詳細表示

をループさせる。

```sh
#! /bin/sh

set -eu

query="${1:-}"

while :; do
  # 検索及び選択

  # 端末上部に peco を表示
  # pkg_name="$(pacman -Qs "${query}" | peco --layout 'top-down')"

  # 端末下部に peco を表示
  pkg_name="$(pacman -Qs "${query}" | tac | peco --layout 'bottom-up')"

  # 空選択 -> 終了
  if [ -z "${pkg_name}" ]; then
    break
  fi

  # 選択した文字列が半角スペース4つで始まる場合は説明文
  # -> やり直し
  if [ -z "${pkg_name##    *}" ]; then
    continue
  fi

  # バージョン部分を削る
  pkg_name="${pkg_name%% *}"
  # ローカルデータベースの接頭辞を削る
  pkg_name="${pkg_name##local/}"

  # 詳細表示
  pacman -Qii "${pkg_name}" | less
done
```

これに適当なコマンド名を付けて、パスの通った場所に置く。

```console
$ コマンド名 '適当なワード (正規表現可)'
```

検索結果を `peco` で選択すると `less` でパッケージの詳細が表示される。`less` を閉じると `peco` での選択に戻る。`peco` を閉じると終了。

※ パッケージ名と説明文で、2行を 1要素として扱いたいが `peco` では 1行に付き 1要素なので無理やり解決している。

※ `query` 未指定の場合、`peco` に「検索」部分も任せる事になるが、検索文字列によっては、説明文ばかりがヒットしてしまい使い物にならない。

## 参考

- [pacman - ArchWiki](https://wiki.archlinuxjp.org/index.php/Pacman)
- [Pacman ヒント - ArchWiki](https://wiki.archlinuxjp.org/index.php/Pacman_%E3%83%92%E3%83%B3%E3%83%88)
【ネタ】JavaScript(とTypeScript)でSleep Sort

http://qiita.com/lovee/items/9701151633d61e7ed4e3

カバーです。あくまでネタです。

```js
var data = [5, 3, 6, 3, 6, 3, 1, 4, 7];

var sleepSort = function(arr){
    return new Promise(function(resolve,reject){
        var result = [];
        arr.forEach(function(d){
            setTimeout(function(){
                result.push(d);
                if(result.length === data.length) resolve(result);
            },d);
        });
    });
}

sleepSort(data).then(function(d){console.log(d)});
// [1, 3, 3, 3, 4, 5, 6, 6, 7]

```

...だからネタだってば。

-------

追記。やっぱ素のJSだと気持ち悪いので一応TypeScriptでも書いておく。
コンパイル結果はほぼ同一だけど、慣れてしまうとこっちの方が書いてて安心感ある。

``` ts

let data: number[] = [5, 3, 6, 3, 6, 3, 1, 4, 7];

let sleepSort = (arr: number[]) =>
    new Promise( (resolve, reject) => {
        let result: number[] = [];
        arr.forEach( (d: number) => {
            setTimeout( () => {
                result.push(d);
                if(result.length === data.length) resolve(result);
            },d);
        });
    });

sleepSort(data)
    .then((d) => console.log(d));

```
Dockerのリソース情報をmackerelで蓄積する（CentOS7.3）

前回の記事でmastodonをDockerで動かしました。いつまで運用するかわかりませんが、リソース情報を蓄積します。同じ内容の記事がありますが、自身の備忘録として記載します。

## 事前準備
**mackerelのエージェントを導入する**
以下の公式HP手順に沿って実施する。
[ミドルウェアのメトリック可視化に公式プラグイン集を使う - Mackerel ヘルプ](https://mackerel.io/ja/docs/entry/howto/mackerel-agent-plugins)

**WEBサービスへ登録する**
ブラウザからWebサービスに登録する

**監視対象に追加する**
登録後、APIキー付きのコマンドを実行
![aa.png](https://qiita-image-store.s3.amazonaws.com/0/110457/f6b07a61-2aae-0115-b600-3474eebd5524.png)

コマンド実行後、以下のログに出力されます

```shell-session:/var/log/mackerel-agent.log
# tail -f /var/log/mackerel-agent.log
2017/04/24 18:42:25 INFO <main> Starting mackerel-agent version:0.42.2, rev:d556389, apibase:https://mackerel.io
2017/04/24 18:42:25 INFO <command> Start: apibase = https://mackerel.io, hostName = vetelgius, hostID = 2ZiEEC2SgV3
```

**結果**
取得できています
![bb.png](https://qiita-image-store.s3.amazonaws.com/0/110457/193a4347-5fdd-d80b-0b9d-f78f7e1d1185.png)
"Spring Boot" + "EXT JS"を使用したRESTアプリにおけるCSRF対策方針と実装例

上記組み合わせでの情報が少なかったのでまとめました。

## 対策方針
CSRF（クロスサイトリクエスト偽造）対策としては、一般的なトークン発行方式としています。
サーバ→クライアントへのトークン情報の通知はSet-Cookieを利用するのが楽ですね。Spring Bootがやってくれるので。[^1]
クライアント→サーバへのトークン送信はJavaScriptで独自に書いて、GETリクエスト以外[^2]にCookie情報をhttpヘッダに書かせます。

[^1]: （最初勘違いして）Cookieでトークン渡しても、セッションIDをCookieで持たせてる場合と同じでブラウザが勝手に送信してしまうので、CSRF対策として意味ないのでは？と思ったのですが、Spring BootでのCSRFトークンのチェックはCookie値を見ているのではなく、「formデータの_csrf」または「httpヘッダのX-XSRF-TOKEN」を見ているのがミソでした。トークンをCookieからformデータかhttpヘッダに置き換える必要がありますが、これをクロスオリジンなJSではできない(正規ドメインのCookieを見れない)ので対策となっているわけです。

[^2]: CSRF攻撃の特性を考えるとGETリクエストでは検証する必要ないですね。Spring Bootではサーバサイドチェックをしていません。

1. Spring Boot  
1.1. CSRFのトークンの保存先をCookieとする。  
1.2. JSからのアクセスを可能とするためにHttpOnlyとしない。  
2. Ext JS  
2.1. GETリクエストは対象外とする。  
2.1. ExtでのAjaxリクエスト送信時にCookie値からトークン情報を取得し、Httpヘッダに付与する。

## 実装例

### Spring Boot  
デフォルトでCSRF対策は有効ですが、トークンの保存先指定と、httpOnlyの無効化の定義をしています。

```java:SecurityConfig.java  

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .and()
            ...// 後略。適宜必要な定義を。
    }
}
```  

### Ext JS  
Ajaxで飛ばす全てのリクエストにトークン付与が必要なので、上位に呼ばれる箇所で定義をしています。
"beforerequest"として定義することで、Ajaxリクエスト発行前に処理が行われるようにして、個別に実装しなくて良いようにしています。

```javascript:app.js  
Ext.Ajax.on('beforerequest', function (conn, request, eOpts) {
    // GETリクエスト以外の場合にCSRFトークンを付与する。
    if (request.method === 'GET') {
        return;
    }
    // CookieのXSRF-TOKEN項目値を、任意httpヘッダX-XSRF-TOKENとして付与する。
    if (document.cookie) {
        var cookies = document.cookie.split(";");
        for (var i = 0; i < cookies.length; i++) {
            var str = cookies[i].split("=");
            if (str[0] == 'XSRF-TOKEN') {
                conn.setDefaultHeaders({ 'X-XSRF-TOKEN': unescape(str[1]) });
                break;
            }
        }
    }
});
```
Google DFPでのAPIアクセス許可の方法

Google DFPをつかって広告管理をしていると単純な作業を自動化したい時があります。
そういうときはDFPのAPIを使うと非常に便利なのですが、APIアクセスを許可する方法が普通に分かりません。

# 公式ドキュメントでは

* 本番環境 API へのアクセスを有効にします。
  * DFP 管理画面で DFP アカウントにログインします。これには管理者権限が必要です。
  * [管理] タブをクリックします。
  * [ネットワーク設定] タブで、API アクセスの右側のアイコンをクリックします。
  * API の利用規約が表示されたら、[同意する] ボタンをクリックします。
  * API アクセスを有効にするには、[保存] をクリックします。

[スタートガイド  |  Doubleclick for Publishers  |  Google Developers](https://developers.google.com/doubleclick-publishers/docs/start?hl=ja#enable_api)

しかし、実際には・・・・

<img width="800" alt="ネットワーク設定jp.png" src="https://qiita-image-store.s3.amazonaws.com/0/107013/c775d5a1-ff9b-e635-0166-b33ffa8cf252.png">

**そんな項目自体存在しない！**


# 解決方法

右上の設定から

<img width="328" alt="ネットワーク設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/107013/d0d8de4c-0d1a-ad86-e2e8-b7365830a001.png">

表示言語を英語にします。リロードすると英語表記に変わります。

<img width="619" alt="ユーザーの詳細.png" src="https://qiita-image-store.s3.amazonaws.com/0/107013/99e445d8-97dc-8962-eebd-d33296b1d403.png">

英語表記に変わったので、さっきのネットワーク設定のところへ言ってください。

<img width="645" alt="ネットワーク設定en.png" src="https://qiita-image-store.s3.amazonaws.com/0/107013/040e3fdd-30b6-ecd3-fd05-93c2dfc71c26.png">

英語表記ならAPIアクセスの項目が出てきます。
ここからアクセス許可をすることが出来ます。

許可した後日本語に戻しても、問題ありません。


# 2018/09/14　追記

DFPはGoogle　アドマネージャーに変わりました
APIアクセスの項目が日本でも表示されるようになりました
LaravelのMiddlewareでルートパラメータを取得

ルートパラメータで取得したIDがマスタに存在しない場合はエラーで落としたい。
そんなときのメモ。

例えば以下のようなルーティングを設定していた場合、

```php
Route::get('/example/{masterId}', 'ExampleController@index')->middleware('hoge');
```

ミドルウェア内で以下のように記述すれば、ルートパラメータが取得できる。

```php
$masterId = $request->route()->parameter('masterId');
```

あとは存在をチェックして`404`で落とすなり、前の画面に戻すなりすれば良い。

```php
// Hoge という Eloquent がある想定
abort_unless(Hoge::where('id', $masterId)->exists(), 404);

// 以下でも同じ
if (! Hoge::where('id', $masterId)->exists()) {
    abort(404);
}
```

取得したモデルをそのままviewで使いたい場合、`view()`ヘルパの`share`メソッドが使える。

```php
abort_unless($hoge = Hoge::find($masterId), 404);

view()->share('hoge', $hoge);
```

なお、単にフォーマットだけチェックできれば良いってことであれば、
ルーティング設定時に正規表現で制御できる。

```php
Route::get('/example/{masterId}', 'ExampleController@index')->where(['masterId' => '[0-9]+']);
```

上記の場合masterIdが1文字以上の数値の場合のみこのルートに該当する。
（他に概要するルートがあればそれが実行され、無ければ`404`になる）