OmniAICreator/Qiita-1.07M huggingface dataset:
【NAT64】[Jool] Linuxだけで実装するNAT64(概要編)

# 1. はじめに
去る2016.08.20に開催されました[iOSDC(iOS Developers conference)](https://iosdc.jp/2016/)にて、
このカンファレンスで使えるWi-Fiネットワークの構築に[CONBU](https://conbu.net/)メンバーとして参画し、
ありがたくもNAT64の実装に携わってきました。
聞くところによりますと、iOSアプリの審査は2016/06以降「[IPv6 Ready](http://togetter.com/li/1014169)」でなければpassできないそうで、アプリレイヤの方々が否応なくIPv6を意識しなければならないというある種そこそこ酷な状況かと思います。

参考: [Supporting IPv6-only Networks](https://developer.apple.com/news/?id=05042016a)
参考: [Supporting IPv6 DNS64/NAT64 Networks](https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1)

そのような中、IPv6-only Networkってどう作ればええねん！
ネットワーク上での挙動の試験なんて環境がががが
などという方もいらっしゃると思い、実装例を投稿したいと思います。

いや、単に自分がやったから残しとこうというだけなんですけどね。

なお、iOSとIPv6とのトピックはiOSDC関連まとめの中では
結構なヒット作となっておられます、以下もご覧いただけるとより楽しめるかと思います。
 # IPv6に関するプログラミングアンチパターンが面白いんじゃよ。

[■IPv6 Readyって何?NAT64/DNS64徹底解説](http://togetter.com/li/1014169)
[■上記の発表資料はこちら](http://www.slideshare.net/smadako/ipv6-ready-nat64dns64-iosdc-b)


# 2. DNS64/NAT64の概要
IPv6-only Networkとか言ってるものの、Internetの大半のWebsiteはIPv4のみ対応というのが実のところです。
IPv4とv6は全く別のプロトコルですんで、お互いに疎通性を持ちませんから
IPv6のみの世界からIPv４の世界へ通信するには一工夫必要になります。

その手段のひとつがDNS64/NAT64というものです。

その実態を簡単に言うと、
DNS64で行き先のIPv4アドレスの頭に決まった値を入れてIPv6アドレスを生成し
NAT64で先ほど生成したIPv6アドレス行き通信をProxyしてIPv4通信として本来の行き先へ到達させる
というものになります。
[図: 上述のApple developer siteより抜粋](https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/art/NAT64-DNS64-ResolutionOfIPv4_2x.png)

本記事ではこのうちNAT64部分を実装してくれる、
[Jool](https://jool.mx/en/index.html)について書きます。

# 3. Joolの概要
JoolはLinuxのkernel moduleの一つです。
使ってみたところ、結果的にkernelのリビルドは行わなくてよく、
まず気軽に安価に構築できるNAT64コンポーネントと言えましょう。

ちなみにMac OSX単体でもNAT64環境を作ることはできるようです([上述の記事](https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1)下の方)。

JoolはクライアントのIPv6通信を受けつけて、
IPv4通信をクライアントの代わりにProxy的に行います。
なので、Joolが挙動するLinuxにはInternet Reachabilityのある
IPv4アドレスを割り当てます。

クライアントが乗るIPv6 onlyネットワークは、
クライアントが投げるv6通信をJoolまでroutingしてやるように設定します。

Joolが稼働するマシンはIPv4でインターネットアクセスができればよいです。

# 4. つづく
文字ばっかりしかも長文になったので
設計・構築編は[次の記事](http://qiita.com/onifinger/items/b3262e0ce9febb776d41)とさせてください。
Google Container Registry概要

Google Container RegistryはGoogleが提供するPrivateなDockerのリポジトリ。
アップロードしたイメージはGCSに保存されるようで、コストは容量課金となる。(GCSとして課金）。
イメージはGCSにアップロードされる。
ex) GCSには以下のようなバケット、パスでコンテナイメージが格納されるようである。
/artifacts.｛PJ Name｝.appspot.com/containers/

## アクセスコントロール
デフォルトではプロジェクトのオーナーとエディターがバケットに対してpushとpullが可能であり、Viewerはpullだけが可能である。
ContainerRegistryへ適切なACLを設定したいときはGCSに対して適切なACLを設定すればよい。

## Container RegistryへのPush
Pushする前にイメージへTagを付ける必要がある。
その際にPush先のホスト名をTagに含める必要がある。Push先のホスト名は以下から選択する。
*us.gcr.io：USにイメージが保管される
*eu.gcr.io：EUにイメージが保管される
*asia.gcr.io：ASIAにイメージが保管される
*gcr.io:USにイメージが保管されるが、将来的には変更される可能性あり。
*b.gcr.io:既に存在するGCSバケットにイメージが保管される。

ホスト名が決まったらGCPプロジェクト名を含めて以下のようにTagを生成する。

```
gcr.io/your-project-id/...
```

##### RegistryへイメージをPush
1. イメージへタグを付ける

```
docker tag user/example-image gcr.io/your-project-id/example-image
```

2. gcloudを使用してCloud Registryへpushする。
```
gcloud docker push gcr.io/your-project-id/example-image
```

##### Container RegistryからイメージをPull
以下のコマンドでイメージをPullできる。

```
gcloud docker pull gcr.io/your-project-id/example-image
```

参考ページ）　https://cloud.google.com/container-registry/
JustPDF3によるPDFファイルの日付変更

#JUSTPDF3(高度編集)画面からの変更


自分のパソコンの日付を変更します。

JustPDF3にて、PDFファイルを開きます。

「**ドキュメント**」 → 「**ドキュメントの検査**」を選択します。

![JustPDF001.png](https://qiita-image-store.s3.amazonaws.com/0/132069/5fca678d-7641-e72f-3fe4-fbfbf5102680.png)

「文書の検査」の画面が表示されるので、「**メタデータ**」のみチェックを入れて、「**削除**」 ボタンをクリックします。

![JustPDF002.png](https://qiita-image-store.s3.amazonaws.com/0/132069/3aa47f93-e620-4d10-de2d-5fc1e8b5488e.png)

「削除」後、Ctrlキー + Sキー にて「**上書き保存**」を行って下さい。


#バッチ処理による日付変更

「**ドキュメント**」 → 「**高度な処理**」 → 「**バッチ処理**」 を選択します。

![JustPDF003.png](https://qiita-image-store.s3.amazonaws.com/0/132069/1f5aa839-2b4f-385b-de4a-4f50656d7846.png)

「**バッチ シーケンス**」という画面が表示されるので、「**新規シーケンス**」ボタンをクリックします。

![JustPDF004.png](https://qiita-image-store.s3.amazonaws.com/0/132069/952c18ba-f0a9-6483-749a-fcef462e8631.png)

「**コマンド選択**」をクリックし、「**文書の検査**」を選択し、「**追加**」ボタンをクリックし、シーケンスを追加します。

「**編集**」をボタンをクリックします。

**文書の検査**画面が表示されるので、「**メタデータ**」のみチェックを入れて、OKボタンをクリックします。

![JustPDF006.png](https://qiita-image-store.s3.amazonaws.com/0/132069/6881c850-2f0b-97ef-c511-ae78239a63c1.png)
複数ページあるサイトのコーディングで学んだこと


- Sass
- LaravelのBlade

の２つを使ったサイトのコーディングをしたときに思ったことをまとめてメモ。
HTML、CSS、テンプレートエンジンを使う場合にもしかすると参考になるかもしれません。

##注意

この記事に書いてある事柄はあくまで私なりのやり方です。
**「みんながこうするべきだ！」** という訳ではありません。

#コーディング全般について

##一度作ったHTMLはできるだけいじらない

デザインどおりのコーディングがなかなか上手くいかないときに **CSS、HTMLのどちらもいじってなんとかしようとするとめちゃくちゃに** なりやすい。

- 基本CSSで修正
- どうしてもむりならHTMLを足す

詳細度の高いCSSにしてしまうとHTMLを足したところで解決できないので、やはりCSSはできるだけ詳細度の低いものを合わせワザで使うほうがよさそう。

##レイアウトはDOMに大きく依存する

１つ目とも関連すること。
レスポンシブサイトをつくるときに、CSSのメディアクエリだけでやろうとすると難しかったりする。
PCとスマホで大きくレイアウトが変わる時は **思い切ってDOMを２つ作り `display: none` 非表示にしたりして乗り切る** のもアリ。


##コメントを上手く使うべき

あとでコードを見返したときにわかるように。

- なぜこのコードを書いたのか？
- このコードはあとで消したほうが良い

というようなことを書いておくと、未来の自分にも他の人にも読みやすいコードとなる。
すなわち **破滅しない、読むのに無駄な時間のかからないコード** となる。

#テンプレートエンジン、部品化について

##「使い回す」には２種類ある

###1. どこにでも使い回す「部品」

例えばボタンとか。汎用的に使えるようパーツとしたいもの。
この場合に大事なのは **CSSを上手に使う** こと。

- OOCSS等を使ってできるだけCSSを細かくわける（スキンと構造とか）
- CSSのクラス名は汎用的にする(`confirm-button`より`button-red`+`button-container`で対応)

細かく分けてCSSを作ることでバリエーションが増えても対応できる。（sassの`@mixin`がおすすめ）
また、CSSのクラス名を汎用的にしておくと **想定外のところにボタンを設置することになっても変な感じにならない。**

###注意点

ボタン部分はDOMもbladeで部品化したことがある。
でもそうすると **「ここはaタグじゃなくbuttonタグなんだ・・・」** というようにDOMが違った場合に対応できない。
なので、 **DOMは部品化せず、CSSだけを使い回す** のが良いかと思う。

###2. プロジェクト内でのみ使い回す「範囲」

「利用規約」+ 「規約に同意するボタン」部分なんかは「入力画面」と「確認画面」の２ページで使ったりする。
この場合は **同じデザインになるようにするのが大事** なので `agreement-area` のようにもっと **具体的で、どのページにあっても内容の予想がつくような名前** をつけるのが良いと思う。

##やたらめったらDOMを部品化しない

数ページコーディングしてみて **「もういい加減コピペめんどくさいわぁ」** となったぐらいで部品化するのが良いかもしれない。
コンテンツ量の多いページを「部品化したほうが見やすいかな？」と思って全部部品化したことがあるが、全体レイアウトを調整するときに **部品化のし過ぎで全体のコードの見通しが悪くなる** ということがあった。
なんでも分けたほうがいいってものでもない。
部品化は基本的に **使い回すときのコピペの手間を省くため** ためだと考えるようにする。

#納期はかならずやってくる、ということについて

コーディング初日なんかは時間があるせいでスケジュール感を意識せず進めてしまうことがある。
だけど **必ず納期はやってくる。**
なので焦りすぎることはないが、次のようなことは頭の片隅において以後進めようと思う。

##「概ね完成」の「概ね」を具体的に設定しておく

ある程度形になってくると **「細かいんだけど、できていないこと」** にとらわれるようになる。
そうなってくるといつがゴールなのかや **優先順位がわからなくなったり** する。
「コーディングはレイアウト以外だけ終わらせる」など具体的に決めておくと、仮に終わらなくとも最初のスケジュールとのズレが把握しやすいので **プロジェクト全体の遅れ** には至らないような気がする。

##完璧は目指さない、でも最低ラインは超える

もちろん完璧に越したことはない。
でも完璧を目指しすぎて **納期に間に合わないなら、いい仕事の仕方ではない。** 

##恐れずに「何が遅れているのか」を書き出す

スケジュール通りにいかないこともある。
でも大きな遅れではなく、後でちゃんと対応できるのであればOK。
そこで大事なのは **きちんと書き出し、他のプロジェクトメンバーとの共有** かなと思う。
「遅れ」に目を向けるのは少し勇気がいるけど、きちんと向きあえば「なんだ、これ来週にはフォローできるやん」と案外小さな問題であることに気づけたり、他のメンバーに手伝ってもらえる可能性も。
そして、仮に自分が体調を崩したとしても迷惑を最小限に抑えられるかなと。
特殊フォルダパスの列挙

■ サンプルコード

```csharp:
foreach(System.Environment.SpecialFolder n in Enum.GetValues(typeof(System.Environment.SpecialFolder)))
{
    Console.WriteLine("{0}: {1}", Enum.GetName(typeof(System.Environment.SpecialFolder), n), System.Environment.GetFolderPath(n));
}
```

■ 結果

Desktop: /data/data/[PACKAGE_NAME]/files/Desktop
Programs: 
MyDocuments: /data/data/[PACKAGE_NAME]/files
Personal: /data/data/[PACKAGE_NAME]/files
Favorites: 
Startup: 
Recent: 
SendTo: 
StartMenu: 
MyMusic: /data/data/[PACKAGE_NAME]/files/Music
MyVideos: /data/data/[PACKAGE_NAME]/files/Videos
DesktopDirectory: /data/data/[PACKAGE_NAME]/files/Desktop
MyComputer: 
NetworkShortcuts: 
Fonts: /data/data/[PACKAGE_NAME]/files/.fonts
Templates: /data/data/[PACKAGE_NAME]/files/Templates
CommonStartMenu: 
CommonPrograms: 
CommonStartup: 
CommonDesktopDirectory: 
ApplicationData: /data/data/[PACKAGE_NAME]/files/.config
PrinterShortcuts: 
LocalApplicationData: /data/data/[PACKAGE_NAME]/files/.local/share
InternetCache: 
Cookies: 
History: 
CommonApplicationData: /usr/share
Windows: 
System: 
ProgramFiles: 
MyPictures: /data/data/[PACKAGE_NAME]/files/Pictures
UserProfile: /data/data/[PACKAGE_NAME]/files
SystemX86: 
ProgramFilesX86: 
CommonProgramFiles: 
CommonProgramFilesX86: 
CommonTemplates: /usr/share/templates
CommonDocuments: 
CommonAdminTools: 
AdminTools: 
CommonMusic: 
CommonPictures: 
CommonVideos: 
Resources: 
LocalizedResources: 
CommonOemLinks: 
CDBurning:
naming > getDatedMessage() / getTimedMessage()

あるメッセージ取得関数getMessage()があったとする。それに対して、「時刻付きのメッセージ取得関数」の名前は何かを考えていた。

> getDatedMessage(String msg): 日付付きメッセージ

上記は文法的に合ってそうで([参考](http://www.programcreek.com/java-api-examples/index.php?source_dir=perfly-android-master/perfly-app/src/main/java/com/perfly/android/core/net/DatedMessage.java))、それに類似性を見て

> getTimedMessage(String msg): 時刻付きメッセージ

を考えたが、timedの意味は「指定時刻に作動する」という意味になりそうだ。
関連 http://qiita.com/7of9/items/1e98f7c1677ab2d2c083

getMessageWithTime()が素直そうだが、getMessage()と名前が部分的にかぶるのが将来のソースリーディングに対して気になる。
OSXでKarmaからChromeが起動できなくなったときの対処法

`CHROME_BIN`のパスがおかしくなってるぽい・・・

[karma-chrome-launcher](https://github.com/karma-runner/karma-chrome-launcher) は`CHROME_BIN`という環境変数を使ってChromeを起動してる。

```shell-session
$ echo $CHROME_BIN

/opt/homebrew-cask/Caskroom/google-chrome/latest/Google Chrome.app/Contents/MacOS/Google Chrome
```

古いbrew caskで入れたパスになってたのが原因。

```shell-session
$ export CHROME_BIN=/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
```

と言った感じで、Google Chrome.appの中にあるバイナリを指定してあげることで、`CHROME_BIN`経由で`karma`がChromeを見つけられるようになり、起動するようになる。


`PHANTOMJS_BIN`もあるそう

```shell-session
$ export PHANTOMJS_BIN=$HOME/local/bin/phantomjs
```

みたいな感じで、お好みのパスを指定する。
Docker Remote APIでSwarmのServiceの情報を取ってくる


*docker_remote_api_v1.24を前提にしています。

Docker Remote APIの`services/`だと、`DESIRED STATE`の様な取れない情報がある。

```
$ docker service ps SERVICE_NAME
ID            NAME            IMAGE      NODE  DESIRED STATE  CURRENT STATE               ERROR
CONTAINER_ID  CONTAINER_NAME  IMAGE:TAG  NODE  Running        Running about a minute ago
```

`DESIRED STATE`は`tasks`から取れるので、`SERVICE_NAME`で検索して取得する。

```
$ curl "http://YOUR_DOCKER_REMOTE_API.ENDPOINT/tasks?filters=\{%22service%22:\[%22SERVICE_NAME%22\]\}"
 | jq ".[].DesiredState"
```

`SERVICE_NAME`を検索したいサービス名に検索すれば動くはず。

filtersクエリは基本的にJSONをurlエンコードして渡さないとダメなので要注意。

##その他の検索方法
同じ要領でこういう引き方もできる様子（未検証）

|QUERY|DESCRIPTION|
|:--|:--|
|filters=\{%22id%22:\[%22TASK_ID%22\]\}|タスクのIDで検索|
|filters=\{%22name%22:\[%22TASK_NAME%22\]\}|タスクの名前で検索|
|filters=\{%22service%22:\[%22SERVICE_NAME%22\]\}|Swarmのサービス名で検索|
|filters=\{%22node%22:\[%22NODE_ID%22\]\}|node IDで検索|
|filters=\{%22label%22:\[%22LABEL_NAME%22\]\}|Label名で検索(`key=value`形式でも検索できるらしい)|
|filters=\{%22desired-state%22:\[%22DESIRED_STATE%22\]\}|`running``shutdown``accepted`の３種類から検索|

##参考
https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#3-10-tasks
[メモ] Jupyter - Kernel追加(C, nodejs)

##　ちょいメモ 
- [前々](http://qiita.com/mt08/items/edb9bcaeaa416d3e5319)、[前回](http://qiita.com/mt08/items/301f9fb93d01e78bda47)からの続き
- Rは、v3.1(Raspbian jessieのパッケージのやつ)だとうごかない。3.2か、3.3にしないといけない。
- ホントに必要になったら、検証して、更新する。


### C

-  https://github.com/brendan-rius/jupyter-c-kernel

```
sudo pip install jupyter-c-kernel
git clone https://github.com/brendan-rius/jupyter-c-kernel.git
cd jupyter-c-kernel
sudo jupyter-kernelspec install c_spec/
```

### nodejs
- https://github.com/notablemind/jupyter-nodejs

`sudo apt-get install npm nodejs-legacy libzmq-dev`

```
git clone https://github.com/notablemind/jupyter-nodejs.git
cd jupyter-nodejs
mkdir -p ~/.ipython/kernels/nodejs/
npm install && node install.js
make
ipython console --kernel nodejs
```

#### `REPLACE_INVALID_UTF8`がないとかいうエラーの回避
\# Raspbianのパッケージのような古いnodejs(v0.10?)の場合。

- `REPLACE_INVALID_UTF8 = 0`を追加(一行前に `,` 入れる)

```c:/usr/include/nodejs/deps/v8/include/v8.h
...
  enum WriteOptions {
    NO_OPTIONS = 0,
    HINT_MANY_WRITES_EXPECTED = 1,
    NO_NULL_TERMINATION = 2,
    PRESERVE_ASCII_NULL = 4,
    REPLACE_INVALID_UTF8 = 0
  };
...
astah でクラスをインタフェースに変更する

# クラスをインタフェースに変更する
クラスをつくったけどインタフェースだったので変更したいとき。
![image](https://qiita-image-store.s3.amazonaws.com/0/89172/9ca9f317-9c50-5eb2-cd3d-99cfda7888d9.png)
　　↓
![image](https://qiita-image-store.s3.amazonaws.com/0/89172/888c7054-7040-2866-2b0a-d0cb6dbfed80.png)


# 手順
1. クラスを選択して左ペインの設定で「ステレオタイプ」を選ぶ
![image](https://qiita-image-store.s3.amazonaws.com/0/89172/5b66daba-0e2a-e237-a41e-20451ea0f610.png)

2. 追加して「interface」を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/89172/ef3beb66-cb53-7de0-b6f3-6fe2ef6e5465.png)

# 最初からインタフェースを作成する
1. 上部ツールバーの丸いボタンから作成したいタイプを選択
![image](https://qiita-image-store.s3.amazonaws.com/0/89172/101736a1-6b85-f5dd-a58d-60725f61898d.png)
2. アイテム作成でインタフェースが作成される
![image](https://qiita-image-store.s3.amazonaws.com/0/89172/be9455a3-b95f-3006-fff0-b5a41b6f5800.png)

# 環境
astah* community 6.9.0/b4c6e9
モデルバージョン: 37
Swiftで学ぶ英文法: 現在分詞と過去分詞

Objective-Cの時代から、コードを読んだり命名したりするときに、そこそこの英語力、英文法力を要求される場面が多いと思います。（かつて[Objective-Cで学ぶ英文法](http://www.slideshare.net/gonsee/i-os-lt5objcenglish)というのを社内LT会で発表しました。）Swiftの[API Design Guidelines](https://swift.org/documentation/api-design-guidelines/)を読んでみて、一層英文法力の必要性を感じたので、自分の理解のためにも「Swiftで学ぶ英文法」というテーマで書いてみようと思います。

Swiftのメソッドにはインンスタンス自身に変更を加えるもの(**mutating**)と、自身には変更を加えずに新しいインスタンスを作って返すもの(**nonmutating**)が対になって存在するものがあります。その場合、演算が動詞で表されるならば、mutatingなメソッドに**命令形**を使い、nonmutatingなメソッドに**過去分詞形**(〜ed)または**現在分詞系**(〜ing)を使います。

例えば配列のソート `sort()` と、要素追加 `append(_:)` は以下のようになっています。

| Mutating | Nonmutating |
|---|---|
| `x.sort()` | `x.sorted()` |
| `x.append(y)` | `x.appending(y)` |

では過去分詞と現在分詞の使い分けはどうすればいいかというと、動詞に**直接目的語**をとるかどうかで決まります。`sort`は直接目的語を取らないので過去分詞にして`sorted`、`append`は引数`y`という直接目的語を取るので現在分詞にして`appending`となります。

英文として読めるようにしてみるとこんな感じでしょうか。

```swift
x.sort()
// x, sort (yourself).
// x、自分をソートして。
```
```swift
x.sorted()
// x, (return your copy which is) sorted.
// x、ソートされた自分のコピーを返して。
```
```swift
x.append(y)
// x, append y (to yourself).
// x、自分にyを追加して。
```
```swift
x.appending(y)
// x, (return your copy) appending y.
// x、yを追加した自分のコピーを返して。
```
8/31　今日の学習内容～引き続き正規表現について学習～

###今日の学習内容
***
今日は正規表現を用いた文字列中のパターンの置換について学習していきました(-ω-)/


####gsubメソッドによる文字列中のパーターンの置換
***
Stringクラスのgsubメソッドを使うことで、文字列中のパターンを置換できます。

試しに、文字列中の``yamada``を``tanaka``に置換してみたいと思います。

 ![paiza_io_5.png](https://qiita-image-store.s3.amazonaws.com/0/137880/876cd819-0ca1-bb0f-8215-a4373796f3bb.png)

**gsubメソッド**は第一引数のパターンを第二引数の文字列に置換して、新しい文字列を返すものになります。

####gsub!メソッドでも置換
***
``gsub!``メソッドを使うことで、その文字列自体の内容を変更出来ます。

例として、変数``name``の中の``yamada``と``sakamoto``を、``yamada``の時には``tanaka``に、それ以外の時には``satou``に置換してみました。

![paiza_io_6.png](https://qiita-image-store.s3.amazonaws.com/0/137880/23e38c45-31dc-7bd9-f6cc-b85b1ed6e549.png)

``/yamada|sakamoto/``は``yamada``または``sakamoto``を表していますね。
　
そのすぐ下の``"yamada"?"tanaka":"satou"``はちょっと前に学習した**三項演算子**を使っています。
``exchange``が``yamada``なら``tanaka``、そうでないなら``satou``という、``if else``文のようになっています。
>[8/29　今日の学習内容～Rubyの基礎を復習～](http://qiita.com/shouxuohs/items/423479a7d7c499d4f77c)

###あとがき
***
今日は昨日に引き続き、Rubyでの正規表現について[改訂３版基礎Ruby on Rails](https://www.amazon.co.jp/dp/4844338153)で学習していきました。
私はわりとゆったりと進めておりますが、ある程度時間が取れる方であれば一か月ほどで読み切れるかもしれないですね。
私も毎日時間を見つけて進めておりますが、なかなか進めやすいと思います。
Rubyのインストールから（私はすっ飛ばしてcloud9を使いましたけども(笑)）RubyとRuby on Railsを学習する一冊目としてもいいのではないでしょうか？(-ω-)/

###参考にさせていただいたサイトなど
***
[改訂３版基礎Ruby on Rails](https://www.amazon.co.jp/dp/4844338153)
[paiza.IO](https://paiza.io/)
ShadowverseのAIレポート


CEDEC 2016の[ShadowverseのゲームデザインにおけるAIの活用事例、 及び、モバイルTCGのための高速柔軟な思考エンジンについて](http://cedec.cesa.or.jp/2016/session/ENG/15387.html)が分かりやすく面白かったのでレポートを書きます。



## どのような目的でShadowverseのAIが誕生したか
Q: 対人戦がメインのゲームでAIって必要？その立ち位置は？
A: 練習台

初心者には「不利な局面でのみ好手を打つ（進化させるとか）」など拮抗するバランスとなるようAIを提供する。

上級者には「相手のクラスの苦手な局面」に持ち込みプレイスタイルの差を体感してもらう。この時、カードの種類をプレイヤーの初期資産と合わせ、カードは同じなのになぜ負けたかを考えてもらう機会を提供する。

こうしてAIがプレイヤーに気づきを促せる。
またユーザがオリジナルのデッキを構築した際、バリエーションに富んだデッキと勝負する事で多角的にデッキを検証できる。



## AIにとって大事なこと
この３つが大事。

- 限定合理性
- 遅延評価
- 定量化



## 限定合理性
カードゲームで遊ぶ場合、相手や自分が捨てたカードを全て覚えている訳ではありませんよね？AIも人が覚えていられる範囲に限定して捨てカードや手札の記憶力を抑える限定合理性が大事。そうする事でユーザから見てより違和感がない振る舞いとなるそうです。

手加減も同様です。あからさまに手を抜かれるとユーザのやる気が大きく削がれるため、相手から見て自然な順でカードをプレイできるよう、AIの手札がユーザから見えない事を利用して次善の手を打つなどして手加減しているそうです。

また考慮する事項が減る事でシミュレーション負荷の低下も見込めます。



## 遅延評価
AIで終局までの全ての手を読み切るためには膨大な計算量が必要で、スマホで計算しきるには無理があります。
そこで遅延評価が大事。

最初から全てを計算するのではなく、段階に応じて少しずつ盤面を評価していきます。

1. プロット作成、行動計画の粗筋を列挙
2. 計画の詳細化、各プロットの効用を概算し有力な候補を絞り込み
    ここで選外のプロットは予備プランとして残す
3. 実行タイミングの選定、ターン中にプレイ可能なカード組み合わせを全て列挙し評価の高いものを抽出

最初は概算して詳細な評価を後回しにすることでプランニング負荷の軽減ができ、負荷の軽減が精度向上に繋がるという事でした。



## 定量化
プレイングの良し悪し、好手と悪手をどう評価するか。これは形勢判断を数値化することが大事。

以下のような情報から盤面を数値化します。

- 生存している敵ユニットの評価値合計
- 相手番のアドバンテージ（敵視点で更にシミュレーション）
- 敵陣営の残りリソース

またShadowverseではAI操作キャラの台詞が形勢に応じて変化し、またユーザが好手を打った場合には感嘆した台詞をしゃべりますが、これにも定量化の数値が使われています。



## 所感
講演はAIの実装に携わってない人でも楽しめるよう甘口な内容で、具体的な例も豊富で大変分かりやすいものでした。

参考URL
[Cygames Engineers' Blog](http://tech.cygames.co.jp/archives/2853/)
[Social Game Info 記事](http://gamebiz.jp/?p=168152)
WerckerでAndroid lintを実行した際に'LintError: Lint Failure'が発生する場合の対処方法


# 概要

WerckerでAndroid lintを実行した際に'LintError: Lint Failure'が発生する場合の対処方法のメモです。

![](http://gyazo.vasily.jp/v2/b4e4ec33a37d93d9ddbebfb6e6fdd551.png)

# 対処方法

Android SDKの`tools`と`platform-tools`をアップデートすること回避できます。したがって、Dockerfileにtoolsとplatform-toolsのアップデートを追加しイメージを再ビルドしました。

```bash
RUN echo y | android update sdk --no-ui --all --filter "tools" \
  && echo y | android update sdk --no-ui --all --filter "platform-tools" \
  && echo y | android update sdk --no-ui --all --filter "android-24,build-tools-24.0.2" \
  && echo y | android update sdk --no-ui --all --filter "extra-google-m2repository,extra-android-m2repository"
```
naming > TimedMessage() > 指定時刻が来たら消えるメッセージ

timedというキーワードを使った関数名の例。
https://www.indigorose.com/webhelp/tu/Program_Reference/Actions/Dialog.TimedMessage.htm

> Time
> (number) The amount of time to make the dialog visible, in milliseconds.

http://eow.alc.co.jp/search?q=timed&ref=sa
> 1. 指定時刻に作動する、時限の
2. タイミングが～の

上記のTimedMessage()に関しては、指定時刻が来たらMessageが消える、ということのようだ。
ログアウトしてもコマンド実行し続ける方法_メモ

ログアウトする（orネットワーク切れる）とき、
コマンドを実行し続けたいとき、以下の方法で、コマンドを実行する。
**` $ nohup コマンド & `**

>nohupでコマンドを実行した場合は，ログアウトしてもプログラムを実行し続ける。
長い処理を行っており，席を外したいときなどに使用すると便利である。
**ログアウトした後は，ジョブではなくプロセスとして管理することになる。**
また，処理中に出力されたメッセージは"nohup.out"に保存される。"
※[参考: ITpro記事_nohup](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230850/?rt=nocnt)


プロセスの確認方法
`$ ps ax`

ジョブスの確認方法
`$ jobs`

nohup実行中のプログラムを終了する方法：
プロセスIDを調べて、kill コマンドで強制終了(kill -KILL)します。


※nohupなしで、コマンドの後ろに 「&」 をつけるだけでも、バックグラウンドで実行できますが、ターミナルが閉じたら、プロセスが殺されるようです。



:cyclone: ちなみに
「&」の読み方は「[アンパサンド (ampersand)](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%91%E3%82%B5%E3%83%B3%E3%83%89
)」であること、今回初めて知りました...
~~ちょっと異国風のサンドイッチのイメージがあります～~~
Sparkで集計し終わったファイルをひとまとめにする


この問題が解決しなくて、

`spark part files merge`

なんてググっていたんですが解決したので共有

Hadoopはパーティションごとに処理をさせるため、最終的な結果は

```
part-00000
part-00001
・
・
・
・
・
part-00015
```

と複数のファイルに出力されてしまう。

パーティション数を1とかにすることで、一つのファイルに出力されると思うが、そもそも分散処理する際にはパーティション毎に並列に処理されるためパーティション１は分散処理する意味がなさそう。また元ファイルが馬鹿でかい場合、扱いきれるのか？という疑問もわいてくる。

今回の環境
---

* EMR(Hadoop, Spark)
* S3


どうやってひとまとめにするか
---

<font color="red" size="6"> Hadoopのmerge機能を使う </font>


具体的にはsparkがS3に出力した複数の集計ファイルをHadoopのmerge機能を使うことによって連結させ、それをS3に配置する

実際のコード
---

```
import java.net.URI

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.s3.S3FileSystem
import org.apache.hadoop.fs.{FileSystem, FileUtil, Path}

object FileMerger {
  
  
  (例）srcPath = "s3n://バケット名/sparkでsaveしたディレクトリ"
    outFile = "s3n://バケット名/sparkでsaveしたディレクトリ/result.csv"
    
  def merge(srcPath : String, outFile : String) : Unit = {
    val config = new Configuration()
    config.set("fs.s3.impl", "org.apache.hadoop.fs.s3.S3FileSystem")
    val dstFile : String = "%s/result.csv".format(srcPath)
    val fs = FileSystem.get(URI.create(srcPath), config)

    FileUtil.copyMerge(fs, new Path(srcPath), fs, new Path(outFile), false, config, null)
  }
}

```
Rails generate command


scaffold

```:bash
rails g scaffold User name:string score:integer
```

Controller. controller name is plural.

```:bash
rails g controller Projects
```

Model. Model name is singular.

```:bash
rails g model Task title done:boolean project:references
```

カラムの型

|データ | 説明 |
|:-----------|:------------|
| string |文字列|
| text |長い文字列|
| integer |整数|
| float |浮動小数|
| decimal |精度の高い小数|
| datetime |日時|
| timestamp |より細かい日時|
|time|時間|
| date |日付|
| binary |バイナリデータ|
| boolean |Boolean型|

You can see here.

http://railsdoc.com/rails
Swift Utilities 

# CGRectMake2
```swift:
func CGRectMake2(point:CGPoint,_ size:CGSize)->CGRect{
    return CGRectMake(point.x,point.y,size.width,size.height)
}
```

# UIViewの相対座標系
```swift:
public extension UIView{
    func relativeWidthGetterBasedOnRatio(ratio:CGFloat)->CGFloat->CGFloat{
        return { self.bounds.size.width * $0 / ratio }
    }
    
    func relativeHeightGetterBasedOnRatio(ratio:CGFloat)->CGFloat->CGFloat{
        return { self.bounds.size.height * $0 / ratio }
    }
    
    func relativePointGetterBasedOnRatio(ratio:CGSize)->(x:CGFloat->CGFloat,y:CGFloat->CGFloat){
        return (relativeWidthGetterBasedOnRatio(ratio.width),relativeHeightGetterBasedOnRatio(ratio.height))
    }
}
```

## 例
```swift:
    //サイズ1:1.168のUIViewのメンバメソッド内で   
    backgroundColor = UIColor.greenColor()
    let relsize = CGSizeMake(1,1.618)
    let rel = relativePointGetterBasedOnRatio(relsize)
    let point = CGPointMake(0, rel.y(0.618))
    let size = CGSizeMake(rel.x(1.0),rel.y(1.0))
    let frame = CGRectMake2(point,size)
    let fixedframe = CGRectInset(frame, rel.x(0.1), rel.y(0.1))
    let view = UIView(frame: fixedframe)
    view.backgroundColor = UIColor.blueColor()
    addSubview(view)    
```

![Simulator Screen Shot 2016.08.31 16.40.30.png](https://qiita-image-store.s3.amazonaws.com/0/19971/22feb453-e380-8385-bbaf-489206635a2c.png)


# 1~nのランダムな重複なし数列生成
```swift:
func shuffledIntegers(size:Int)->[Int]{
    var tmp = [Int](0 ..< size)
    for i in 0..<size{
        let c = arc4random_uniform_Int(size-i)
        if c != n-i-1 {
            swap(&tmp[c], &tmp[n-i-1])
        }
    }
    return tmp
}

func arc4random_uniform_Int(a:Int)->Int{
    return Int(arc4random_uniform(UInt32(a)))
}
```
Dockerトラブルシューティング

私が問題にぶち当たる度に更新

# `docker build` 編

## 'docker0' がネットワークに繋がっていないというエラーメッセージが出る

```log
# Errorメッセージ
docker: Error response from daemon: 
failed to create endpoint [コンテナ名] on network bridge: 
adding interface vethb2ed418 to bridge docker0 failed: 
could not find bridge docker0: 
route ip+net: no such network interface.
```

Dockerで立てたWebサーバが反応しなくなったときはこれ
また, `docker start`なり`docker run`を実行時に, このエラーが吐かれる場合がある
原因不明 (Vagrant で仮想マシンを立てて実行しているのが原因?)
_原因を知っている方がいたら教えて下さい..._

 `sudo service docker restart`で, docker を起動すると解決する

## build で作成した image の REPOSITORY と TAG が \<NONE\> になる

Dockerfileがあるディレクトリで
`docker build -t [レポジトリ]:[タグ] .`
を実行することで, 解決。

Dockerfileがあるディレクトリ外から, `docker build`を実行すると遭遇するが,
\<NONE>になる理由は不明

`docker tag [イメージID] [レポジトリ]:[タグ]`で, image にタグを付けられるが run 時に失敗する


# `docker run` 編

## 指定した image を run できない

run するとコマンドは正しいにも関わらずエラーを吐かれる
`docker tag` でタグをつけた image を run しようとした時に遭遇
`docker build` でタグ付けられた image を run するようにすればOK

タグ付けに失敗したimageをrunさせようと頑張るより, build時にタグ付けられるように努力したほうが, 後々のためになる

> imageID を指定して run する方法があるが, 入力がめんどくさいのと, うまく実行できなかったのでオススメしない

## イメージを `run` したときに `: no such command` というメッセージとともに停止する

`Dockerfile` の ENTRYPOINT に Bash や Python ファイルを指定している場合は改行コードを確認する.
改行コードが CRLF `\n\r` になっている可能性がある. なっていた場合には LF `\n` に変更する.
Animate CC備忘録

初心者なりに気づいたことまとめ

* 読み込める画像の最大サイズは8000*8000pxまで。 それ以上のサイズは読み込めても、はみ出した分が縮小されてしまう
* ~~シンボルにドロップシャドウ等のフィルターはかけられるが、フィルターをかけた状態でモーショントゥイーンはできない。~~→テキストにしかかけられない
* ~~メインタイムライン上のインスタンスに対してstop();やgotoAndStop(n);が効かない。（なんでだ？）子インスタンスの1フレーム目でthis.stop();を書いたら効いた。~~ → 外部HTMLに、パブリッシュしたcanvasを埋め込んでJSで操作する際、メインタイムラインはthis.stageではなくexportRootとなる。 exportRoot.hoge.stop();
* Animate CCのフレーム上にスクリプトを書く際、jQueryが使える
Nutanixを触ってみた／Acropolis Hypervisor編

[予告](http://qiita.com/hmatsu47/items/1dbbd4e414beb120fd69)通り、NutanixをAcropolis Hyperviserで試用してみました。
但し、先にことわっておきますが、VMware ESXiからのコンバートに失敗したため、細かいところまでは試用できていません。

# VMware ESXiからのコンバート（クラスタから）
上で触れたとおり、失敗しました。
Prismの設定（歯車アイコン）メニューで、クラスタごとコンバートする場合、
・vCenter Applianceがある場合は、クラスタから除外しておく
・RHEL／CentOS 6.4以前の仮想マシンは（標準でvirtioが入っておらず）コンバートできないので、クラスタから除外しておく
・余分なNIC設定等は外しておく（今のところは）
・残したNIC（N/W）については冗長化しておく
などの制約があるようなので、この条件に合わせてからコンバートしたものの、途中で止まってしまい、失敗しました。

# ディスクイメージの変換
その後、ハイパーバイザとしてAcropolis（AHV）をクリーンインストールし、Prismの設定メニューの「Image Configuration」から、あらかじめOVF形式でエクスポートしておいた仮想マシンの.vmdkファイルをUploadしました。
![acro_img_cfg.png](https://qiita-image-store.s3.amazonaws.com/0/123899/f1e57e59-a1dc-cb1e-e08d-f8c1ba3600e4.png)
![acro_img_cfg2.png](https://qiita-image-store.s3.amazonaws.com/0/123899/bdae1f41-cd2d-4cbe-2ca0-b64dcc711db2.png)
Upload完了後、ファイルの変換が始まりました。
![acro_img_cvt.png](https://qiita-image-store.s3.amazonaws.com/0/123899/9245efa1-6f29-0de3-7801-1eeecbd9252e.png)
変換終了後、仮想マシンを作成し、変換したディスクを付加しました。
![acro_cre_vm.png](https://qiita-image-store.s3.amazonaws.com/0/123899/56ebc01d-4997-d210-bd64-1cb0b1c7e188.png)
この状態で仮想マシンを起動したところ、ディスクイメージが見つからない、ということで起動失敗。ちょうど[こちら](https://www.reddit.com/r/linuxadmin/comments/3y0ce4/dracutinitqueue555_warning_dracutinitqueue/)の方と同じような状況になりました。
色々試したところ、CentOS 6.6・6.7で立てたマシンはコンバートが成功し、何の問題なく起動する一方、CentOS 7.2で立てたマシンは全てコンバートに失敗し、ディスクが読めない状態になりました。

# 仕方がないので仮想マシンを新規インストール
CentOS 7.2で使用できることを確認すべく、新規インストールでCentOS 7.2の仮想マシンを立ててみましたが、こちらはスムーズに完了しました。

# Prismの見た目は
VMware ESXiクラスタのときと、特に変わりはありません。画面左上で、AHVであることを主張している程度の違いです。
![acro_home.png](https://qiita-image-store.s3.amazonaws.com/0/123899/e757d8df-dda6-bce5-44ba-e2c64c0ae649.png)
VM（仮想マシン）の画面で新規仮想マシンの追加やネットワーク設定などができるようになっている点は違いますが、このあたりも、今後VMware ESXiへの対応が進むらしいです。

# VMware ESXiと、どちらが良い？
Prismでの仮想マシンの新規作成等、操作が（vSphere Web Clientとは比べ物にならないほど）軽快でいいのですが、先に記したとおり、VMware環境からの仮想マシンのインポートが、一部うまくいかないことがあるようです。
すでにVMware環境で利用している組織がNutanixを導入するのなら、PrismのVMware対応が今以上に進むことを期待しつつ、VMware ESXiとの組み合わせで使うのが無難でしょう。
ただ、Webでサービスを提供するような企業で（あえてNutanixのようなオンプレ環境を）導入する場合、仮想マシン／コンテナは継続利用せず新規に立てていくと思いますので、あまり気にする必要もないだろう、と思います。

…というわけで、まともな試用記にならなくて、すみません。
リーダブルコード勉強メモ

*Work in Progress*

# はじめに
## 1章
メモ割愛


# 1部
## 2章
- ループイテレータに明確なインデックスネームを。ci.ui.mi
- 単位を使う変数には単位
- 名前のフォーマット
          idの区切り…アンスコ
          classの区切り…ハイフン
- 明確な単語
- 汎用名避ける
- 具体的な名前
- 変数名に情報
- スコープに応じ、変数の長さ
- 大文字、アンスコに意味


## 3章
- 誤解されない名前 filter length limit
- max_ min_ などで限界値
- 包含的 first last かつ排他ならbegin end
- ブール is has


## 4章
- シルエット、列、意味のある順番
- 論理的な段落を空行を用いる


## 5章
- TODO:,FIXME:既知の不具合,HACK:妥協
- コメントしないこと
    - コードからすぐわかること
    - ひどいコードを補う
- 監督コメント、定数の背景
- 読み手の立場


## 6章
- 代名詞を避ける
- 実例をコメント
- わからない引数にはインライン
- 簡潔に
Ubuntu16.04でヘッドレスブラウザであるPhantomJS2.1をインストールする

# ヘッドレスブラウザとは

GUIが無いブラウザのことです。GUIが無いブラウザを何に使うのか？といえば、開発やスクレピングになるわけですが、ようするにHTMLデータやJavascriptデータの生データをGETやPOSTしてきて、色々プログラムで操作できますよ！　というものです。

# PhantomJSをインストールする目的

Javascriptを含むWebページからデータを取得して、加工したいと考えて、インストールをしました。

# 環境
OS: Ubuntu16.04(さくらVPS)
ブラウザ: PhantomJS 2.1.1

# インストール手順を示す前に・・・
実際にインストールを行うために、方法をネットで調べてみると、自身の環境ではエラーとなることが多かったです。
例えば、[Ubuntu 14.04にPhantomJS 2.1をインストール](Ubuntu 14.04にPhantomJS 2.1をインストール)などを参考にしていましたが、ダメでした。
Ubuntuの環境のせいか、メモリが弱いからか色々考えてみましたが、まだ本当の原因は不明です。
色々試行錯誤した上で、以下の手順に落ち着きました。

# インストール手順

```
$ wget -O /tmp/phantomjs-2.1.1-linux-x86_64.tar.bz2 https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
$ cd /tmp
$ bzip2 -dc /tmp/phantomjs-2.1.1-linux-x86_64.tar.bz2 | tar xvf -
$ sudo mv /tmp/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/
$ phantomjs --version
> 2.1.1
```

最後のバージョン確認でダウンロードしたバージョンが表示されればインストール完了です。
Rails | Spring を無効化して rails console を起動する

環境変数に `DISABLE_SPRING=1` を指定する。

# 例


## 有効

```bash
$ bundle exec rails console

Running via Spring preloader in process 98849
Loading development environment (Rails 4.2.6)

[1] pry(main)> 
```

## 無効


```bash
$ DISABLE_SPRING=1 bundle exec rails console

Loading development environment (Rails 4.2.6)

[1] pry(main)> 
```

# 環境

- Rails 4.2.6
-  spring (1.7.1) 








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【さくらVPS】カスタムOSインストールでCentOS7をインストール

# さくらVPSで用意されているCentOS7をインストールする手順

## 前提
「さくらのVPS」 http://vps.sakura.ad.jp/
メモリ:2G SSD:50G CPU:仮想3コアのプランでの検証資料です。

## カスタムOSインストール選択
さくらVPSのコンソール右上の「OSインストール」→「カスタムOSインストール」
![customos.JPG](https://qiita-image-store.s3.amazonaws.com/0/138460/a824d412-50bf-b2e3-d390-37317f1ea16f.jpeg)
インストールOSの選択です。
今回は「CentOS 7 x86_64」を選択します。
![SelectCustomOS.JPG](https://qiita-image-store.s3.amazonaws.com/0/138460/a593335d-71ae-17c2-0a20-9bdcb661dbc6.jpeg)
「インストールを実行する」を押します。
![DoInstallCustomIS.JPG](https://qiita-image-store.s3.amazonaws.com/0/138460/5c08597e-c652-0c65-bfe7-c1d796d9af7b.jpeg)
しばらくお待ちください・・・
![wait.JPG](https://qiita-image-store.s3.amazonaws.com/0/138460/05b7232b-7878-7ab4-8cbc-44c1f40ace91.jpeg)
VNCコンソールを開いてインストール作業を行います。
![StartConsole.JPG](https://qiita-image-store.s3.amazonaws.com/0/138460/28154e08-67c1-b997-a6ce-9e01f94795d9.jpeg)

## CentOS7 インストール
素直に[Install CentOS 7]でエンター。
![CentOS7Start.JPG](https://qiita-image-store.s3.amazonaws.com/0/138460/20a6e1cc-75af-67fb-4c5e-385fe44db9c4.jpeg)
「インストール先が設定されていないよ」ということで[INSTALLATION DESTINATION]をクリック。
![notConfigured.JPG](https://qiita-image-store.s3.amazonaws.com/0/138460/28ad5970-0b38-f16d-ae05-bd68d992de00.jpeg)
とりあえず使いたいだけなのでパーティションは自動設定[Automatically configure partitioning.]
使いたいディスク（１個だけですが・・・）をクリックして選択して[Done]クリック。
![InstallDest.JPG](https://qiita-image-store.s3.amazonaws.com/0/138460/ae3a00c3-d622-7f48-ae8d-6fa57ddacc50.jpeg)
元々インストールされているものは消してインストール（※なので元々大事なものをインストールしていた方はご注意を）するので[Reclaim Space]を選択します。
![ReclaimSpace.JPG](https://qiita-image-store.s3.amazonaws.com/0/138460/27b79c94-2de9-eed9-a7d8-edeb1be438a6.jpeg)
[Delete All]を押すと全てが削除対象になります。[Reclaim space]を押すと設定完了です。
![DeleteAll.JPG](https://qiita-image-store.s3.amazonaws.com/0/138460/53983e4c-dd34-8d30-3de9-52997fe813c2.jpeg)
[Installation Destination]がこれで設定済になったので[Begin Installation]を押してインストールを開始します。
![BeginInstallation.JPG](https://qiita-image-store.s3.amazonaws.com/0/138460/88b9241f-127f-de5a-20e5-e09caf4ae38c.jpeg)
インストール中にルートのパスワード設定、ユーザー作成を任意に行います。
![CreateRoot.JPG](https://qiita-image-store.s3.amazonaws.com/0/138460/df5cb251-5e54-f8be-5f6c-027242347f87.jpeg)

## 謝辞
こちらを参考にさせていただきました。ありがとうございます。

さくらのVPSにCentOS7を導入する方法
http://vdeep.net/sakura-vps-centos7
Kibanaでデータを視覚化してみる

みなさまはセンサーやBeaconなどから集めたデータをどのようにして、視覚化・分析しているでしょうか。
今回は、Kibanaというデータ視覚化ツールについて、ご紹介します。

## Kibanaって何？
Elastic社より提供されているフリーのデータ視覚化・分析ツールです。

ダウンロードの仕方はこちらから
・[公式ドキュメント](https://www.elastic.co/guide/en/kibana/current/setup.html)(英語)
・[Fluentd + Elasticsearch + Kibanaで遊んでみた(その1) 〜環境構築から簡単な動作確認まで〜](http://totech.hateblo.jp/entry/2016/01/06/214218)
・[elasticsearch+Kibanaのセットアップ](http://qiita.com/ysk_1031/items/bdb1a5219cd773aae3a9)


Kibanaを使うと普段Excelで作成しているような図が簡単な操作でかっこいい見た目で作成できます。
棒グラフ、折れ線グラフ、円グラフ、面グラフに加えて、位置情報であれば地図上へのマッピング図、また、テーブルの作成も行えます。
作成した図は保存して、ダッシュボードで一覧表示し、簡単にデータ分析に用いることができます。

## 作図までの手順
ここでは、折れ線グラフを例にします。
Kibanaのバージョンは4.5.1を使用しています。
![visualization.PNG](https://qiita-image-store.s3.amazonaws.com/0/130138/10429bbe-3521-38cc-7f90-191e38330431.png)
##### ①	Visualizationボタンをクリックします。
##### ②	Y-AxisのAggregationからY軸の設定を行います。今回はCount（データ数）を選択します。
##### ③	同様に、X-AxisのAggregationからX軸を行います。今回はDate Histogramを選択し、データ数の時間推移を表示します。
必要に応じて、軸のラベル名などを追加します。
##### ④	作成したVisualizationは右上のボタンから保存します。

単純な図でしたら、これだけの作業で作成が可能です。
さらに、系列ごとに分けたい場合は、
##### ⑤ X-Axisの下のAdd sub-bucketsのSplit Linesを選択し、Sub Aggregationで系列化したい項目を選択します。

![visualization2.PNG](https://qiita-image-store.s3.amazonaws.com/0/130138/a93b0434-64bd-5e3e-24f7-aa728f33afd7.png)


また、今回はY軸にはCountを選びましたが、Count以外に平均値、合計値、中央値、最小値、最大値、標準偏差、ユニーク数、パーセンタイル、パーセンタイルランクが選択できます。
X軸のAggregationを変えることで、任意の項目ごとの図や、ヒストグラムを作成することもできます。

保存にしたVisualizationはダッシュボードに配置することでそれぞれのデータの比較・分析に利用できます。
![dashboard2.PNG](https://qiita-image-store.s3.amazonaws.com/0/130138/ec5d8d8e-9c39-eccc-c35f-5eaaa246bcbf.png)



こちらは弊社で行ったBeaconを検知して、車両の走行距離を算出したグラフになります。
![beacon_distance2.PNG](https://qiita-image-store.s3.amazonaws.com/0/130138/1e2a050f-62ce-5b64-0800-10c374aef51e.png)



## プラグインの利用
簡単に素早く、データを視覚化できるという点でKibanaは非常に優れたツールですが、表現できることに限界はあります。

そうした不満点を解消できるものとして、[プラグイン](https://www.elastic.co/guide/en/kibana/current/kibana-plugins.html)があります。

プラグインを入れることで、デフォルト以外の図に加えて、swimlaneや複数種類のグラフを同時に表示できるようになります。
![plugin.PNG](https://qiita-image-store.s3.amazonaws.com/0/130138/1b517b07-f452-fae0-ba1d-e061e76ea4ef.png)

Beacon検知状況の視覚化を、例としてお示しします。
![beacon_detection.PNG](https://qiita-image-store.s3.amazonaws.com/0/130138/bb2a1fcb-fb46-bd22-720e-0ee33fd1b3bf.png)

いかがでしょうか。このようにKibanaを利用して、簡単にbeacon検知状況の視覚化を行うことができました。

既存のプラグインで表現できる幅は増えますが、他にも機能が必要な場合もあると思います。
kibanaのプラグインは自由に作成可能なので、自作することでその点は補うことができます。
S3バケットでWebコンテンツをホスティング


## バケット作成

* バケット名は ドメイン名 とする

## バケットポリシー

以下のように全てのアクセスに対して読み取り権限を与える

```
{
  "Version":"2012-10-17",
  "Statement":[{
	"Sid":"PublicReadGetObject",
        "Effect":"Allow",
	  "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::example-bucket/*"
      ]
    }
  ]
}
```

## 参考

* [ウェブサイトアクセスに必要なアクセス許可 - Amazon Simple Storage Service](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteAccessPermissionsReqd.html)
Golang dbrでのトランザクション


実装時に、どうしてもトランザクションがうまく動作しない。
調べたところ、よく目にする以下の形

```
sess := conn.NewSession(nil)
tx, _ := sess.Begin()
_, err := sess.InsertInto など
if (err != nil) {
  tx.Rollback()
}

tx.Commit()
```

よく見かける形

でも、試したところ、rollbackされなかった。。。

dbrのversionかもしれ無いけど、dbrのドキュメントを見ると
[dbr.Tx](https://gowalker.org/github.com/gocraft/dbr#Tx)

tx.InsertInto
とある。

以下のようにしてみる

```
sess := conn.NewSession(nil)
tx, _ := sess.Begin()
_, err := tx.InsertInto など
if (err != nil) {
  tx.Rollback()
}

tx.Commit()
```

無事トランザクションがききました。
***
###追記(2016/09/20)
dbrのgithubのテストコードでも同様になっていました。
参考URL：https://github.com/gocraft/dbr/blob/master/transaction_test.go
ansibleで利用するpythonを指定する方法

複数のpythonが入ってる時(例えばMacに入ってるやつとbrewのやつ)に使う。 
ansibleで使ってるpythonが違くて、extramodule使うときに
そんなmoduleないよ！って言われてたみたい。ありがち。  
  
```
ansible_python_interpreter=/usr/local/bin/python
```



#### リンク 
[http://docs.ansible.com/ansible/intro_inventory.html](http://docs.ansible.com/ansible/intro_inventory.html)
ansibleで2重ループ


ansible2.0から2重ループができるようになってました。  
playbookを書いてるとたまに2重ループしたくなる時があって、それのメモ  
  
```
#loop.yml
- hosts: localhost
  connection: local
  vars: 
     hosts:
       - ip: 192.168.33.99
       - ip: 192.168.33.100
     attributes:
       - web
       - db
  tasks:
    - name: test double loop
      include: ./inner_loop.yml
      with_items: "{{ hosts }}" 
      loop_control:
        loop_var: outer_item

#inner_loop.yml
- debug: msg="{{ outer_item.ip }}  {{ item }}"
  with_items: "{{ attributes }}" 
```

<!--more-->
    
これで、  
  
```

TASK [debug] *******************************************************************
ok: [localhost] => (item=web) => {
    "item": "web",
    "msg": "192.168.33.99  web"
}
ok: [localhost] => (item=db) => {
    "item": "db",
    "msg": "192.168.33.99  db"
}

TASK [debug] *******************************************************************
ok: [localhost] => (item=web) => {
    "item": "web",
    "msg": "192.168.33.100  web"
}
ok: [localhost] => (item=db) => {
    "item": "db",
    "msg": "192.168.33.100  db"
}

PLAY RECAP *********************************************************************
localhost                  : ok=5    changed=0    unreachable=0    failed=0

```
こんな結果が取得できるようになる。  
2重ループが必要なplaybookは極力ないような方がいいな。  


#### リンク
[playbooks_loops - loop-control](http://docs.ansible.com/ansible/playbooks_loops.html#loop-control)
Vuforia for UnityのAR/VRサンプルを動作させる

Vuforiaのサンプルに、スマホ用VRゴーグル（Google Cardboard及びその互換デバイス）で2眼表示をするものが含まれています。それを実機で動かすまでの手順です。
<img width="667" src="https://qiita-image-store.s3.amazonaws.com/0/42051/fc93c635-b38e-fe4c-2886-3615ea29399f.png">

# 環境
- MacBook Pro（OS X 10.11.5）
- iPhone 6s / Galaxy S6
- Unity: v5.4.0f3 / v5.3.5f1 （どちらでも同様に動作しました）
- Xcode: v7.3.1
- Vuforia: v6
- VRゴーグル: Milbox, Wearity Sky （スマホの背面カメラを利用するため、カメラ部分はゴーグルで隠れないようにする）

# Vuforiaサンプルの入手
0. [Vuforia Developer Portal](https://developer.vuforia.com/)でアカウント作成、ログインする
0. [Download Samples | Vuforia Developer Portal](
https://developer.vuforia.com/downloads/samples)の中から"Digital Eyewear"の"Download for Unity"をダウンロード、展開する。サンプルプロジェクトにSDKも含まれているため、このファイルのみで実行可能です。

# Unityプロジェクトの作成と設定
0. Unityを起動し、3Dプロジェクトを新規作成する
0. サンプルの"ARVR-6-XXX.unitypackage"を全てimportする。Finder上でダブルクリック、またはUnityの"Assets"メニュー→"Import Package"→"Custom Package"から選択する。
0. Fileメニュー→"Build Settings"で、iOSもしくはAndroidに"Switch Platform"する（他のプラットフォームでは確認していません）
0. "Player Settings"→"Bundle Identifier"を適宜書き換える（初期値のままだとXcodeのビルド時に通常エラーになると思います）
0. Scenes/Vuforia-3-AR-VR シーンを開く
0. HierarchyからUserHead/ARCameraを選択してInspectorを開く

0. Vuforiaのライセンスキーを発行
	1. [License Manager | Vuforia Developer Portal](
https://developer.vuforia.com/targetmanager/licenseManager/licenseListing) を開き、"Add License Key"をクリック
	2. "Development"を選択→任意のApp Name、Deviceは"Mobile"でキーを作成する
	3. 戻ったLicense Manager画面から、作成したキーをクリック
	4. "Please copy the license key below into your app"の下に表示されている文字列をコピーする
	<img width="617" src="https://qiita-image-store.s3.amazonaws.com/0/42051/b2fc9f2f-00c4-ac94-86e5-5ec7e6bba705.png">


0. "Vuforia Behaviour"コンポーネントの"App License Key"欄に、キー文字列をペーストする
<img width="824" src="https://qiita-image-store.s3.amazonaws.com/0/42051/10309cec-22f6-83a0-85f4-4c86d678cb9b.png">

# 実行まで
0. マーカー画像を印刷する。
<Unityプロジェクトディレクトリ>/Assets/Editor/Vuforia/ForPrint/
にあるPDFのいずれか。印刷せずPCの画面で表示して使う事も可能です。
0. Unityでbuild実行。プロジェクト名は任意
0. Xcodeプロジェクトディレクトリの Unity-iPhone.xcodeproj をダブルクリックして開く
0. そのまま実機で実行する（通常のiOSプロジェクトと同じなので省略）

# サンプルの内容
- 起動するとARモード（スマホの背面カメラの映像が画面に常に反映される状態）で始まる
- 視界にマーカーを入れると、3Dの山が表示される
<img src="https://qiita-image-store.s3.amazonaws.com/0/42051/fc93c635-b38e-fe4c-2886-3615ea29399f.png">
なお、カメラ映像は視差無し、3Dオブジェクトは視差がある描画になります。
- "VR"というパネルに視線カーソルを向けて少し待つと、VRモードに切り替わる
<img src="https://qiita-image-store.s3.amazonaws.com/0/42051/46edad40-8058-8394-308c-e9f212edffab.png">
- VR世界中にある"AR"というパネルに視線カーソルを向けて少し待つと、ARモードに戻る
- 参考動画（私がアップロードしたものではありません）: [Vuforia AR/VR sample for Unity](https://youtu.be/rLIVKO3YFos)
STS(Spring Tool Suite)™をインストールする(Windows10)

# STSとは
(引用：http://spring.io/)
The Spring Tool Suite is an Eclipse-based development environment that is customized for developing Spring applications. It provides a ready-to-use environment to implement, debug, run, and deploy your Spring applications, including integrations for Pivotal tc Server, Pivotal Cloud Foundry, Git, Maven, AspectJ, and comes on top of the latest Eclipse releases.
Included with the Spring Tool Suite is the developer edition of Pivotal tc Server, the drop-in replacement for Apache Tomcat that's optimized for Spring. With its Spring Insight console, tc Server Developer Edition provides a graphical real-time view of application performance metrics that lets developers identify and diagnose problems from their desktops.

The Spring Tool suite supports application targeting to local, virtual and cloud-based servers. It is freely available for development and internal business operations use with no time limits, fully open-source and licensed under the terms of the Eclipse Public License.

STS(Spring Tool Suite)とは、Springアプリケーションの開発用にカスタマイズされた、**Eclipseベース**の開発環境です。とのこと。

Eclipseのプラグインとしてインストールすることもできますが、単独起動のほうがいくらかサクサクらしいので、今回はこっちで試してみます。
標準でもいろいろなプラグインが入っていて、Spring開発にはかなり便利なようです。
Eclipse同様、日本語化が可能ですが、どうせサイトは英語ばっかりなので英語慣れしましょう。


# インストール手順

## 環境

- OS : Windows10(64bit)
- Java8
- C:\から近いところを開発ディレクトリとします

## 手順
【ステップ①】
以下より、STSのスタンドアロン版をダウンロードします。

http://spring.io/tools/sts
![image](https://qiita-image-store.s3.amazonaws.com/0/130367/550f4bb6-77dd-8b4d-a7de-ab5fb3c6aebc.png)

上記のボタンでは32bit環境版がダウンロードされますので、
64bit環境を使っている場合、下の"See All Versions"をクリックして、
64bit対応版をダウンロードする必要があるみたいです。
![image](https://qiita-image-store.s3.amazonaws.com/0/130367/1ce53944-4d94-10ea-9e33-f7eefe5e062f.png)


【ステップ②】
ダウンロードしたzipを解凍します。
このとき、パスが長すぎると怒られるので、名前変更をしておきましょう!
(解凍場所も注意すること!!)
![image](https://qiita-image-store.s3.amazonaws.com/0/130367/43971462-d20d-5a0d-adbb-f15d33b22a9b.png)


【ステップ③】
解凍したフォルダ内の「STS.exe」で起動します。
![image](https://qiita-image-store.s3.amazonaws.com/0/130367/081f24e3-1f6d-966d-cd46-a95dd6113085.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/130367/533be094-e52e-e6cb-74e2-3018d40b7613.png)

あとは、Eclipseと同じです。ベースはEclipseなので使い慣れている人には問題ないでしょう＾＾
jqでhash操作(追加と削除)メモ

##0. やりたいこと
1. json形式のデータをスクリプトで処理するときに、`key:value`のペアを追加する
2. json形式のデータをスクリプトで処理するときに、`key:value`のペアを削除する

##1. jsonのサンプルデータ

```json:sample.json
{
  "ginza": {
    "foods": {
      "maindish": "sushi",
      "dessert": "warabimochi",
      "antipast": "anpan",
      "drink": "champagne"
    }
  }
}
```

##2. 追加

`"aperitif":"soda"`というkey valueペアを`foods`のハッシュに追加したいとき

```bash
cat sample.json | jq '.ginza.foods | .+ {"aperitif":"soda"}' 
```

```json
{
  "maindish": "sushi",
  "dessert" : "warabimochi",
  "antipast": "anpan",
  "drink"   : "champagne",
  "aperitif": "soda"
}
```

##3. 削除

`"drink"   : "champagne"`を削除してみる
keyが`drink`じゃない要素だけ表示する、みたいなロジック。

```bash
cat sample.json | jq '.ginza.foods | with_entries(select( .key != "drink"))'
```

```json
{
  "maindish": "sushi",
  "dessert": "warabimochi",
  "antipast": "anpan"
}
```


こんな感じで使ってみた。
ただし、もっと良い方法あるかもです。
[gusuku] 帳票：カンマ区切りで数字を出力する方法

# 課題

kintone上の数値のフィールドを、Excel帳票で出力するときに桁区切り（カンマ区切りで）で出力したい場合があります。

（Excel帳票プラグインはgusukuのオプションサービスです。詳しい情報は以下の公式サイトよりご確認ください。）

[![gusuku_logo.jpg](https://qiita-image-store.s3.amazonaws.com/0/133500/3a0f4bec-1475-e349-43c0-cd88056ea91b.jpeg "gusuku_logo.jpg")](https://gusuku.io)

[kintoneアプリケーション開発をサポートするプラットフォーム gusuku（グスク）](https://gusuku.io)

# 解決方法

```
$NUM(フィールドコード)
```

を使って、指定したフィールドコードを数値として扱い出力します。そのうえで、セルの書式設定で「桁区切り(,)」を使用することで、桁区切りで出力することができるようになります。

同様に通貨の書式設定をすることで、円記号を前につけたりすることも可能です。

**指定するフィールドコードは数値のフィールドが最適ですが、文字列フィールドに対してもNUM指定をすることは可能です。数値が含まれていれば、数値として出力されます。**

ただし、数値が含まれていない場合には空白で出力されてしまうのでご注意ください。


# まとめ

置換マクロの型指定とセルの書式設定で、狙い通りの帳票出力を実現しましょう。
Ubuntu 16.04にPostgreSQL9.5をインストール

```
sudo apt-get install postgresql
sudo dropcluster 9.5 main
sudo createcluster 9.5 main --locale=C -e UTF-8
```

DBを作り直すのは、デフォルト値ではそのときのlocaleが使われてしまうため。

設定はデータベースディレクトリではなく`/etc/postgresql/9.5/main/`にある。

デフォルトでpeer認証になっている。
odhcp configuration


Supplement to [OpenWRT wiki](https://wiki.openwrt.org/doc/techref/odhcpd) and [README](https://github.com/sbyx/odhcpd) as of current master HEAD `e63a283`.

`odhcp` configuration file is `/etc/config/dhcp` in UCI format.

Section `odhcp` options:

- `maindhcp`
    - renamed from `legacy` option
- `leasefile`
- `leasetrigger`

Section `dhcp` options:

- `interface`
    - UCI logical name, not netdev name.
- `ifname`
    - netdev name.
    - Using this sets "M" flag in Router Advertisement message will be set
- `networkid`
- `dynamicdhcp`
    - value "no" disables dynamic assignment, and use only static lease setting of `host` section
- `ignore`
- `leasetime`
- `start`
- `limit`
- `master`
- `upstream`
    - list
- `ra`
- `dhcpv4`
- `dhcpv6`
- `ndp`
- `router`
    - list
- `dns`
    - list
- `domain`
    - list
- `filter_class`
- `dhcpv6_raw`
    - additional DHCPv6 options in HEX format
- `pd_manager`
- `pd_cer`
- `ra_default`
    - explicitly announce default route (ex. off-link)
    - value will be Router Lifetime in Router Advertisement message
- `ra_management`
    - defaults to 0
    - value non-0 sets "M" flag in Router Advertisement message.
    - value "1" sets "A" flag in Prefix Information.
- `ra_offlink`
    - value non-0 unsets "L" flag in Prefix Information.
- `ra_preference`
- `ra_advrouter`
    - value non-0 sets "R" flag in Prefix Information (RFC3775 mobile IPv6)
- `ra_maxinterval`
- `ndproxy_routing`
- `ndproxy_slave`


Section `host` options:

- `ip`
- `mac`
- `duid`
- `hostid`
- `leasetime`
- `name`

Hybrid
------
If the interface was `master`, then `hybrid` means `relay` or `disabled`. If there was no slave `relay` in the other interfaces, then it will be configured to `disabled`.

If the interface was not `master`, then `hybrid` means `relay` or `server`. If there was no `master`, then the interface will be configured to `server`.
dockerを使ってLAMP環境を構築し、Sambaも入れる

# 前提
docker環境が既に用意されていること。
docker環境はVirtualBox（OS：Redhat 64bit）で作りました。

# 構築手順
##### 1.OSイメージを入手
`docker pull centos:centos6`

##### 2.イメージを起動
`docker run -it -p 80:80 -p 137:137 -p 138:138 -p 139:139 -p 445:445 --name [イメージ名] centos:centos6 /bin/bash`

- イメージ名は適当でOK。「lamp_test」など
- `-p 80:80`・・・ブラウザからアクセスするのに必要なオプション。
- `-p 137:137 -p 138:138 -p 139:139 -p 445:445`・・・Sambaでエクスプローラからアクセスするのに必要なオプション。

##### 3.起動したイメージのサーバー内に入り、各種インストール
`yum install httpd-devel php-devel php-pear mysql-server phpmyadmin php php-mbstring php-mysql samba -y`

##### 4.Sambaを設定
`useradd [ユーザ名]`
`smbpasswd -a [ユーザ名]`

- Sambaに接続するためのユーザを作成し、パスワードを付与する。

`vi /etc/samba/smb.conf`

```smb.conf
[www]
comment = /var/www
browseable = yes
writable = yes
path = /var/www
```

- 上記を、一番下に追記する。
- `/var/www`はsambaで管理したい場所。必要に応じて変える。

# 各ミドルウェア起動
##### Apache
`/etc/init.d/httpd start`
##### Samba
`/etc/rc.d/init.d/smb start`
##### Mysql
`service mysqld start`

# 動作確認
##### Apache
テストページを用意
`echo 'docker test' > /var/www/html/index.html`

- ブラウザで、VirtualBoxのサーバーのIPを指定して実行。例：http://192.168.56.102/

##### Samba
エクスプローラーを開き、VirtualBoxのサーバーのIPを指定。例：\\\\192.168.56.102
ログインを促すダイアログが表示されるので、先ほど作成したアカウント名、パスワードでログインする。
【CakePHP】ModelのbeforeSave()では引数を指定する（備忘録）

#beforeSave()では引数を指定しよう

ModelのbeforeSave()でpasswordの暗号化とか、よくやりますよね。

```User.php
    public function beforeSave(){
        /* 処理 */
        return true;
    }
```

そしたらこんなエラーが。

```
Strict (2048): Declaration of MODEL::beforeSave() should be compatible with Model::beforeSave($options = Array)[APP/Model/User.php, line 4]
```

$options = array()
を引数に指定してあげるとエラー直ります。

```User.php
    public function beforeSave($options = array()){
        /* 処理 */
        return true;
    }
```

はい備忘録。
MissingViewExceptionのときにHTTPステータスコード404を返す

## 必要環境

- CakePHP 2.x

## 何をするの？

以下のような `routes.php` の形でリクエストを `PagesController` で一挙に引き受けたい場合があるとします（本来は１つづつ Router に追加していくものだと思います）。

```Config/routes.php
Router::connect('*', array('controller' => 'pages', 'action' => 'display'));
```

ただ、このような形だと `View` の該当ファイルが存在しない場合、`MissingViewException` が発生し、HTTPステータスコード `500` として扱われます。
これを `404` として扱うよう変更します。

## それでは変更

`View#_getViewFileName()` で扱う `View` を決定し、なければ `MissingViewException` が投げられます。
なので、ここを変更すればおｋですね。

```Config/bootstrap.php
/**
 * Used when a view file cannot be found on PagesController#display().
 *
 * @package       Cake.Error
 */
class MyMissingViewException extends CakeException {

    protected $_messageTemplate = 'View file "%s" is missing.';

//@codingStandardsIgnoreStart
    public function __construct($message, $code = 404) {
        parent::__construct($message, $code);
    }
//@codingStandardsIgnoreEnd

}
```

```View/MyView.php
<?php
App::uses('View', 'View');

/**
 * MyView
 *
 */
class MyView extends View {

/**
 * Returns filename of given action's template file (.ctp) as a string.
 * CamelCased action names will be under_scored! This means that you can have
 * LongActionNames that refer to long_action_names.ctp views.
 *
 * @param string $name Controller action to find template filename for
 * @return string Template filename
 * @throws MyMissingViewException when a view file could not be found.
 */
	public function _getViewFileName($name = null) {
		try {
			return parent::_getViewFileName($name);
		} catch (MissingViewException $e) {
			throw new MyMissingViewException(array('file' => $name . $this->ext));
		}
	}
}
```

```Controller/PagesController.php
/**
 * Displays a view
 *
 * @param mixed What page to display
 * @return void
 */
	public function display() {
		$this->viewClass = 'My';

		// Do something
	}
```


以上、小ネタでした！
Mampp でお手軽に古いPHPの環境構築 



ざっと試した感じなので、あくまで参考程度に。

ダウンロードはこちらから

https://www.mamp.info/en/downloads/

Mampp　Proを起動すると設定とかがProベースになる。

課金する予定がなければ　Applications からMampp Proを削除しておくほうが良さそう。

## 設定とか

Ports番号が独特な感じになっているので適宜直すのが良い。

一般的には　Web/MySQL 8080/3306 あたりではないだろうか？

Web Server nginx がお好みならそちらを選択

Database Passwordなどの設定は

http://localhost:8080/MAMP/?language=Japanese

を確認すると良い(ポート番号は適宜修正)

### Mac 標準 Apacheの停止

````
sudo apachectl stop
````

## 古いPHP環境のインストール

ダウンロードページの右側にAdditional PHP Version のリンクがあるので必要なPHPバージョンをダウンロード

展開したフォルダを `Applications/MAMP/bin/php/` の中に放り込む

この中にある２つだけが、設定画面から選択できるPHPバージョンになるので、

最初から入っているphp5.6や5.5等のフォルダを、頭に`.`をつけるなどして無効化すれば、任意のバージョンが設定画面から選択できるように！

## アンインストール

Applications のMamppフォルダを消すだけで良いらしい。

http://documentation-4.mamp.info/en/MAMP-Mac/Installation/

## その他

SSLの対応
http://qiita.com/mm-git/items/cd4196fb5728b3aecb27


## エラー：Apacheが起動しない時

````
$ sudo /Applications/MAMP/bin/startApache.sh 
````

エラーの状況は上記のコマンドで確認可能

sslの証明書でパスフレーズとか入ってるとGUIからの起動ムリっぽい