OmniAICreator/Qiita-1.07M huggingface dataset:
Failed to load resource: the server responded with a status of 419 (unknown status)

#環境
* php7.1 
* laravel5.4

#発生状況
ajaxでサーバにPOST送信した

#今回の発生原因
フレームワークによって生成されるCSRFトークンがリクエストヘッダに追加されていなかったため

#今回の解決策
フレームワークによって生成されるCSRFトークンをリクエストヘッダに追加

#参考
https://readouble.com/laravel/5.4/ja/csrf.html

#その他
エラーが解消されたら是非いいねお願いします
kotlinで画像ファイルをリサイズする

Imagemagickなどの外部ツールを使わずにサムネイル画像なんかをリサイズしたかったので、標準ライブラリだけの実装例です。

## 実装
[こちらの記事](http://dotnsf.blog.jp/archives/1062006362.html)で紹介されていたJavaによる例を参考に、kotlinで実装しました。
Intで圧縮後のファイルの幅を指定しています。

```kotlin
    fun resize(): ByteArray {
        // この変数に画像ファイルをByteArrayで読み込んでおく
        val imageFile :ByteArray
　　　　　　　　　　   val width = 200

        // オリジナルのファイルを読み込む
        val original = ImageIO.read(ByteArrayInputStream(imageFile)) ?: throw Exception("File is invalid")
        val originalWidth  = original.width.toDouble()
        val originalHeight = original.height.toDouble()

        // リサイズ後のファイルを作成
        val resizedWidth  = width.toDouble()
        val resizedHeight = width * originalHeight / originalWidth
        val resized = BufferedImage(resizedWidth.roundToInt(), resizedHeight.roundToInt(), original.type)

        // 変換器
        val transformer = AffineTransformOp(
                AffineTransform.getScaleInstance( resizedWidth / originalWidth, resizedHeight / originalHeight)
                , AffineTransformOp.TYPE_BILINEAR
        )

        // 変換
        transformer.filter(original, resized)

        // 変換した結果を書き込む
        val result = ByteArrayOutputStream()
        ImageIO.write(resized, "jpg", result)

        return result.toByteArray()
    }
```

実際に使用するにはもう少し細かい作り込みが必要かもしれませんが、とりあえず動くところまで。


## 参考
[Java で画像サイズを変更する](http://dotnsf.blog.jp/archives/1062006362.html)
[https://docs.oracle.com/javase/tutorial/2d/images/saveimage.html](https://docs.oracle.com/javase/tutorial/2d/images/saveimage.html)
エンジニアの面接をネトゲに例えてみた件

## 動機

私も最近良く採用面接官をしていて、この記事にとても感銘を受けたので早速パクらせていただきました。
http://ledsun.hatenablog.com/archive/2018/02/01

私が面接した中には自分の持ち味を発揮しきれずに落ちてしまっている人もいると思っています。それも実力だと言えばそうなのですが、私が思うにそれはとても残念なことでもあります。だって、良い人材を逃がしてしまっているということですから。
特に初対面の人とのコミュニケーションの苦手なエンジニアの場合はそれは本当にもったいないと思うのです。フィードバックしたいなと思っているのですけど、落ちた面接者の方と会う機会というのはほぼ無く、悶々としていたのです。

というわけで私なりに「面接でこの辺を整理しておいていただけると」と思ったことを自分の経験に基づいて書きます。

一応書いておきますが、この意見、考え方等は所属する組織を代表するものではなく私個人のものです。

## ネトゲでパーティーに入ってクエストに行くつもりで

私は良くマニアックなメタファーを使うのですが、今回はネトゲのメタファーを使います。面接が苦手な人は結構いると思うのですが、こう考えるとちょっと気楽になれませんかね？

### 1. 会社はギルドかパーティーだと思う

就職／転職しようと思っているあなたは、冒険者募集のポスターを見て酒場にやってきたわけで、「僕と契約してパーティーに入れてよ」というのが就活ですよね。

当然入りたいパーティーのことはリサーチするでしょうし、わからなかったらそのパーティーの人に直接聞くでしょう。

* どんなレベルの冒険者で構成されているのか
* どんな職種で構成されているのか
* ガンガン行くタイプなのか、まったり派なのか
* クエスト報酬の分配ルールはどうなっているか

こういう目で相手の会社を見たら良いと思いますし、見てもらいたいです。

### 2. 会社の事業はパーティーが挑もうとしているクエスト

さて、パーティーメンバーの人となりや、パーティーの方針などがわかりました。パーティーが求めているのは戦力です。「僕は戦力になれます」ということをアピールせねばなりません。
効率的にアピールするためにはそのパーティーが直近どんなクエストに挑もうとしているかを知っておく必要があります。

* レッドドラゴン討伐なら火属性のレジスタンスが役に立つ
* クラーケン討伐なら雷属性の魔法が良く効く

こういうことですね。

当然、勝ち目のあるクエストなのか、負けてもなにかそれなりに得られるクエストなのか、楽しめるクエストなのか、などはあなた自身のために知っておく必要があります。あなたがLv10の戦士なのに、スライム狩りに出掛けてもあなたはあまり楽しくないと思います。（パーティーにとっては大助かりでしょうけど）

という目で会社とその事業について調べてみましょう。

クエストそのものではなく「この人と一緒に働きたい」という動機もあると思います。面接としての伝え方の工夫は必要ですがそれも立派な動機ですが、会社は仲良しクラブにはならないのでやはり自分が「何をしたくて、何ができるのか」は持っておく必要はあります。

### 3. 自分は何の装備／スキル／呪文を持っているのか

さて、パーティーの雰囲気や構成と、挑むクエストがわかったら次は自分が具体的に次のクエストでどう役に立てるのかをロジカルに組み立てましょう。

* レッドドラゴン討伐に行くなら火竜の盾を持ってる僕が前衛やります！
* 見たところヒーラー足りてないですよね？ 全員回復魔法使えるですよ私！

会社や事業と自分の強みをマッチさせて話せるようにするのです。一番ココが重要です。

ここで難しいのがゲームと違って現実は装備一覧やスキル一覧を明確に示すことも、見ることも出来ません。面接以外にテストをするという方法で測ることもありますが基本的には過去のエピソードであったり、事象に対する考え方であったりを言葉にして伝える必要があります。ここに注力するために的はずれなことに面接時間を費やすのはやめたほうが良いでしょう。例えばレッドドラゴン討伐に関係ないゴブリン狩り自慢とか。

このスキル一覧を聞き出すところが面接官の手腕なのですが、運が悪いと面接官の質問力がイケてない時があります。面接官はほとんどの場合それが本職ではなく、人事に協力要請されて面接官をするので経験が浅い人が出てくる場合もあります。
その場合は逆に質問をして自分の強みを話せるように誘導しましょう。先に述べた通り関係ない自慢話逆効果なので「先程、レッドドラゴン討伐に行くと伺いましたが長期戦になると想像します。その場合、回復のプランはどのようになっていますか？」などと聞いて「でしたら私の回復魔法がお役に立てると思います」というふうに持っていきます。

## その他

### コミュ力

ウェーイする必要はありません。ただ会話のキャッチボールが出来ないと一緒に冒険することはできません。話が通じないと変なタイミングでファイヤーボール打ち込まれるんじゃないかとかそう思ってしまいます。

### 自己研鑽

パーティーに入って、一緒に戦ってレベルを上げるのはとても良いことですし、会社に入ってそうやってスキルアップをしていくものです。
しかし、おんぶに抱っこでパーティーにレベルを上げてもらおうとしている意図が見え見えなのはげんなりします。教えてもらう気マンマンというか、学生気分というやつです。

呪文の勉強のために魔道書を読んだり、剣の素振りをしたり自主トレは大事です。今はLv1でもクエストをクリアするための一員なんだという気持ちは必要です。

### チームプレイ

自分のレベル上げにしか興味のない、「パーティーはレベル上のための道具です」感が出ていたら一緒には働きたくありませんよね？
前のセクションと同じであなたはクエストをクリアするための一員なのですから仲間とクエストに興味を持ちましょう。持てないなら同じパーティーに入るべきではないのです。

### 身なり、清潔感

一緒に冒険するメンバーですからきついスメルだったり、やばそうな格好の人は敬遠されるでしょう。相手は初対面です。格好は自分のキャラをわかってもらってから徐々に攻めましょう。

## 結び
いかがでしたでしょうか。以上が私の面接観というか就活観です。どうしようもない駄文ですがお役に立てれば幸いです。

最後に、私はネトゲをやったことがありません。ここにあるネトゲ観は全部想像ですw

追記：最近FF14始めましたがまだ若葉マークでソロでしかやったこと無いのでやっぱりまだ妄想です。
デスクトップの動作をGIFで保存。ScreenToGifで、より分かりやすく表現しよう！

パワポで資料を作成する時や、何かの操作手順を作成する時、
もしくはこうして記事を投稿する時に、

<b>「実際に動いている様子を見てもらった方が、
　もっと分かりやすくなるのになぁ」</b>

と思った事ありませんか？

そんな時は「ScreenToGif」を使ってみましょう。

ScreenToGifは、
　・インストール不要（実行ファイルをダウンロードするのみ）で、
　・デスクトップの操作をGIFにすることができて、
　・記録した動画は編集ができます


１．実行ファイルダウンロード
　http://www.screentogif.com/
<img width="672" alt="記事１.png" src="https://qiita-image-store.s3.amazonaws.com/0/215347/3c6f7942-37b9-7373-db14-b790a2067f29.png">
　
２．ファイル起動
　ダウンロードしたファイルを実行します
<img width="374" alt="記事2.png" src="https://qiita-image-store.s3.amazonaws.com/0/215347/0625ab18-8514-3da3-2324-2ba757a9ee26.png">
<img width="368" alt="記事3.png" src="https://qiita-image-store.s3.amazonaws.com/0/215347/a0fc6a29-73fa-c05e-48b4-6ac74550f62a.png">

３．動画キャプチャ
　右下の記録、もしくは「F7」を押下することで記録開始です
　終わる時は停止、もしくは「F8」を押下で停止します
![記事4.gif](https://qiita-image-store.s3.amazonaws.com/0/215347/2ee761d9-8a9e-3725-e026-43de52ef6cdd.gif)
　ボタン①から④までを押していく動作をGIFにしています
　※クリックしたタイミングを図のように色付けすることもできます
　
４．動画編集
　停止をした後に、動画編集画面に切り替わります
　そこで図のように不要な箇所を削除できます
<img width="585" alt="記事5.png" src="https://qiita-image-store.s3.amazonaws.com/0/215347/c0111fb1-6644-da9e-821a-5c1e8bb2319c.png">
　
　タイピングでもたつく時などにも便利です
![記事6.gif](https://qiita-image-store.s3.amazonaws.com/0/215347/e0580171-dd71-e4eb-91a7-83adb74fdfd6.gif)
![記事7-1.gif](https://qiita-image-store.s3.amazonaws.com/0/215347/108bc3c4-eb25-30c0-8956-69d3e392a9db.gif)
　

動作を視覚的に表現することで、
見る側は、より分かりやすくと思います

是非とも、ご活用してみて下さい
AWS CodeBuildでnode_modulesをキャッシュしたらハマった

# はじめに

CodeBuildで`node_modules`をキャッシュしたらバイナリ(実行ファイル？用語がわからない・・・)が使えなくなったので、解決方法のメモ。
バイナリを使わない場合には関係の無い話かもしれません。

# 何がおこったのか

- 一回目は成功するが、二回目以降に実行すると`sh: 1: webpack: not found`とエラーが発生

```json:package.json
{
  "scripts": {
    "build": "webpack --optimize-minimize"
  },
  "dependencies": {
    "webpack": "^3.10.0"
  }
}
```

```yaml:buildspec.yml
version: 0.2

phases:
  install:
    commands:
      - npm install

  build:
    commands:
      - npm run build

artifacts:
  files:
    - '**/*'
  base-directory: dist

cache:
  paths:
    - 'node_modules/**/*'
```

```text:error_log
[Container] 2018/02/02 06:58:40 Running command npm run build

> XXX@0.1.0 build /codebuild/output/src015426277/src/github.com/XXX/XXX
> webpack --optimize-minimize

sh: 1: webpack: not found
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! XXX@0.1.0 build: `webpack --optimize-minimize`
npm ERR! spawn ENOENT
npm ERR! 
npm ERR! Failed at the XXX@0.1.0 build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2018-02-02T06_58_41_015Z-debug.log

[Container] 2018/02/02 06:58:41 Command did not exit successfully npm run build exit status 1
```

# 原因

- `node_modules/.bin`にはsymlinkが配置されているが、相対パスではなく絶対パスに書き換わっていた
- 作業ディレクトリはビルドの度に変わる
- バイナリの宛先を見たところcacheされた時点の絶対パスになっていた

上記が原因でコケていた

# 解決策

- `node_modules`をtarでアーカイブしたところ無事解決

```yaml:buildspec.yml
version: 0.2

phases:
  install:
    commands:
      - if [ -e /tmp/node_modules.tar ]; then tar xf /tmp/node_modules.tar; fi
      - npm install

  build:
    commands:
      - npm run build

  post_build:
    commands:
      - tar cf /tmp/node_modules.tar node_modules

artifacts:
  files:
    - '**/*'
  base-directory: dist

cache:
  paths:
    - /tmp/node_modules.tar
```

# 最後に

ハマって調べたけど類似する情報が見つからなかったので、備忘録として残しました！
お役に立てれば幸いです。
Vagrant upでエラーが出た

環境はLenovoのthinkpad (core i5)です。
 oracle virtual box と vagrant を使用しているときにvagrant up でversionのエラー、timeoutのエラーなどが出ました。
（エラーメッセージのコピーの履歴が別のパソコンで行ったので残っていないのですが、見つけ次第書きます）

順番としては
バージョンがサポートされていないというエラーが出る。
↓
古いvagrant,virtual boxを全てアンインストールし、新しいバージョンをダウンロード
↓
timeout
↓
仮想化支援機能の機能をonにする
↓
またエラーが出る。
↓
？？？？（ここでの解決方法とつまづいた理由が以下）

解決方法としては
仮想化支援機能の機能をonにしてあげる
↓
☆oracle virtual boxの内部の残っているOSを消す。
↓
vagrantの次にvirtual boxを削除
↓
もう一度最新バージョンをダウンロードしなおす。
でした。
これで通りました。

ここでつまづいた理由としては、oracle virtual box内に通っていなかったときのOSが残っていたのが原因です。
2時間くらいつまりました...。
オフラインリアルタイムどう書くF09の C 言語による実装例

問題: http://nabetani.sakura.ne.jp/hena/ordf09rotbox/
実装例へのリンク集: https://qiita.com/Nabetani/items/61e13fa5cf0abe5979be

私も C言語 で書いてみた。

```C:C
#include <stdio.h>
#include <string.h>

struct ans{ char m[12]; };

void swap( char * p, int a, int b )
{
  int tmp = p[a];
  p[a]=p[b];
  p[b]=tmp;
}

struct ans solve( char const * src )
{
  struct ans ans = { "123/456/789" };
  for( char const * cmd=src ; *cmd ; ++cmd ){
    switch( *cmd ){
    case 'a': swap(ans.m, 0, 1); swap(ans.m, 1, 2); break;
    case 'b': swap(ans.m, 4, 5); swap(ans.m, 5, 6); break;
    case 'c': swap(ans.m, 8, 9); swap(ans.m, 9,10); break;
    case 'd': swap(ans.m, 8, 4); swap(ans.m, 4, 0); break;
    case 'e': swap(ans.m, 9, 5); swap(ans.m, 5, 1); break;
    case 'f': swap(ans.m,10, 6); swap(ans.m, 6, 2); break;
    case 'g': swap(ans.m,10, 9); swap(ans.m, 9, 8); break;
    case 'h': swap(ans.m, 6, 5); swap(ans.m, 5, 4); break;
    case 'i': swap(ans.m, 2, 1); swap(ans.m, 1, 0); break;
    case 'j': swap(ans.m, 2, 6); swap(ans.m, 6,10); break;
    case 'k': swap(ans.m, 1, 5); swap(ans.m, 5, 9); break;
    case 'l': swap(ans.m, 0, 4); swap(ans.m, 4, 8); break;
    }
  }
  return ans;
}

void test( char const * src, char const * expected )
{
  struct ans ans = solve( src );
  _Bool okay = 0==strcmp( ans.m, expected );
  printf( "%s %s->%s / %s\n", (okay ? "ok" : "**NG**"), src, ans.m, expected );
}

int main()
{
  /*0*/ test( "aegj", "286/435/971" );
  /*1*/ test( "a", "231/456/789" );
  /*2*/ test( "e", "183/426/759" );
  /*48*/ test( "baciefjhgkdl", "153/482/796" );
  return 0;
}
```

丹精込めた、手のぬくもりの感じられる `switch`〜`case` で解決。

`memcpy` のたぐいは怖いので使わない方向で。

```C:EVIL_MACRO
#define CASE(n,x,y,z)\
     case n: swap(ans.m, x, y); swap(ans.m, y, z); break
```

みたいなマクロを使おうかとも思ったけど、手のぬくもりを優先した。
IEでXMLHttpRequestをローカルサーバーで行う方法

# 前提
ローカルホストのhttpサーバーから
`Access-Control-Allow-Origin: http://localhost:8080`としている
ローカルホストでないhttpサーバーへXMLHttpRequestでアクセス！

**ローカルファイル**
ローカルにサーバーを立てずに、
ローカルのHTMLファイルを直接ブラウザで閲覧した際にも、
XHRが拒否される場合があるのですが、
その場合の回避する方法は分かりません…。すいません…。

# 現象
普通にやると、以下のようなエラーが出る場合があるようです。

`SCRIPT7002: XMLHttpRequest: ネットワーク エラー 0x80070005, アクセスが拒否されました。`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/196806/9a45fa8a-ce97-f8e2-96dc-7cb8dc99b778.png)

# 回避法

ローカルイントラネットのセキュリティレベルを低にすると回避できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196806/4facad37-3929-8edd-3e8a-6528d279a9d4.png)

Chromeの場合は以下方法でできるようです。
[【解説付き】chromeでXMLHttpRequestをローカルのファイルで行う方法 - Qiita](https://qiita.com/growsic/items/a919a7e2a665557d9cf4)
Herokuでのアプリ作成・削除


#この記事でわかること３つ
```
①Herokuにアプリを作成する方法
②Herokuに任意の名前のアプリを作成する方法
③Herokuに作成されたアプリを削除する方法
```

#Herokuにアプリを作成する方法
以下のコマンドでアプリを作成することができます。
```
$ heroku create                                                             
```
これで新しいアプリが作成されます。
作成されたアプリは以下のURLにて確認することができます。
https://dashboard.heroku.com/apps

※heroku createコマンドでは、ランダムな名前でアプリが作成されます。

#Herokuに任意の名前のアプリを作成する方法

以下のコマンドで任意の名前のアプリを作成することができます。
```
$ heroku apps:create アプリ名
```

#Heroku createをしすぎてしまった時の対処法

以下のコマンドで作成したアプリを削除することができます。
```
$ heroku apps:destroy --app アプリ名  --confirm アプリ名
```

※上記の記事内では、「アプリ名」と記している部分に任意のアプリ名を入れるようになっています。
CentOS 7.4でtelnetのアクセス制限できなかった話

新規に構築した社内サーバで、telnet-serverを利用することとなったものの、`/etc/hosts.allow`,`/etc/hosts.deny`が効かず、かなり紆余曲折したので、備忘として残しておきます。

## hosts.allowが効かない
環境は、以下。

```console:centos-release
$ cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)
```
```console:telnet-server
$ rpm -q telnet-server
telnet-server-0.17-64.el7.x86_64
```
```console:telnet-server
$ rpm -q tcp_wrappers
tcp_wrappers-7.6-77.el7.x86_64
```

これまで通り アクセス制御を`/etc/hosts.allow`でやろうと、編集。

```console:/etc/hosts.deny
$ cat /etc/hosts.deny
#
# hosts.deny    This file contains access rules which are used to
#               deny connections to network services that either use
#               the tcp_wrappers library or that have been
#               started through a tcp_wrappers-enabled xinetd.
#
#               The rules in this file can also be set up in
#               /etc/hosts.allow with a 'deny' option instead.
#
#               See 'man 5 hosts_options' and 'man 5 hosts_access'
#               for information on rule syntax.
#               See 'man tcpd' for information on tcp_wrappers
#
in.telnetd:ALL
```

```console:/etc/hosts.allow
$ cat /etc/hosts.allow
#
# hosts.allow   This file contains access rules which are used to
#               allow or deny connections to network services that
#               either use the tcp_wrappers library or that have been
#               started through a tcp_wrappers-enabled xinetd.
#
#               See 'man 5 hosts_options' and 'man 5 hosts_access'
#               for information on rule syntax.
#               See 'man tcpd' for information on tcp_wrappers
#
```

よし。ちゃんとアクセス拒否されるか、確認だ。

```console
Kernel 3.10.0-693.el7.x86_64 on an x86_64
localhost login:
```
はぁ？？

## systemdの仕様変更？

[systemd のバグ修正と機能強化のアップデート](https://access.redhat.com/ja/articles/2623721)
> systemd におけるネイティブの tcpwrap サポートは廃止されました。tcpwrap を使用する必要がある場合は、従来の inetd デーモンの場合と同様に、tcpd デーモンを使用して socket-activated サービスを呼び出すことを検討してください。

マヂか。。。

## で、どう設定すればいいの？？

かなり探しました。答えは[ここ](https://fedoraproject.org/wiki/Changes/Deprecate_TCP_wrappers#Migration_to_tcpd)。
上記を参考に、以下のように`/usr/lib/systemd/system/telnet@.service`を編集

変更前

```
[Unit]
Description=Telnet Server
After=local-fs.target

[Service]
ExecStart=-/usr/sbin/in.telnetd
StandardInput=socket
```

変更後

```
[Unit]
Description=Telnet Server
After=local-fs.target

[Service]
ExecStart=@-/usr/sbin/tcpd /usr/sbin/in.telnetd
StandardInput=socket
```

設定反映

```console
# systemctl daemon-reload
# systemctl restart telnet.socket
```

## 備考
ここではtelnet-serverでしたが、libwrapをリンクしている、sshdやvsftpdでは、tcpdを使わず、そのまま利用できました。

```console
# ldd `which sshd` |grep libwrap
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fa95e93e000)
# ldd `which vsftpd` |grep libwrap
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f89f1a24000)
```
基礎知識

##【１】実行までの流れ
　<dl> 
 <dd><strong>①ソースコード記載</strong></dd>
　　<dd>・人よってコード記載</dd>
　</dl>

<dl> 
 <dd><strong>②コンパイル実行</strong></dd>
　　<dd>・ソースコード→バイトコードへの変換</dd>
 <dd>・コンパイラと呼ばれるソフトウェアが実施</dd>
　</dl>
　<dl> 
 <dd><strong>②バイトコード実行</strong></dd>
　　<dd>・バイトコード→マシン語への変換</dd>
 <dd>・インタプリタと呼ばれるソフトウェアで実行</dd>
 <dd>・インタプリタはJVMという仕組で実行</dd>
　</dl>

<dl>
　<dd><strong>④コンピュータのCPUに指示<strong></dd>
</dl>

##【２】変数について
<dl>
　<dd><strong>変数名の付け方</strong></dd>
　　<dd>・約50個の禁止単語を使わない</dd>
　　<dd>・基本的に小文字で始め、単語を２つ以上組み合わせる場合は、２つ目の単語の頭文字を大文字にする</dd>
　<dd><strong>データ堅<strong></dd>
　<dd>・整数は基本的に"int"</dd>
　<dd>・少数は基本的に"double"</dd>
　<dd>・真偽値は"boolen"</dd>
　<dd>・１文字だけの文字は”char”</dd>
　<dd>・文字列は"String"</dd>
</dl>
##【３】演算子・オペランド
<dl>
　　<dd><strong>演算子</strong>　　計算式を構成する要素[＝、＋、＊、/、%]</dd>
　　<dd><strong>オペランド</strong> 　それ以外の、コード内で使用する値</dd>
　　<dd><strong>リテラル</strong>　　ソースコードに設定されている値</dd>
　</dl>
</dl>
##【４】エスケープシーケンス
<dl>
　　<dd><strong>基本的な考え方</strong></dd>
　　<dd>　通常であれば、”は文字列の開始or終了を意味する。しかし、エスケープシーケンスの１つである ¥ を ” の前に置く事で、” が文字列として認識される。</dd>
</dl>
##【５】演算子の評価の仕組み
　　<dl>
 <dd><strong>計算式の評価順の考え方<strong></dd>
　　<dd>*※数学で習った順序と同じ*</dd>
　　<dd>・優先度１：掛け算・割り算</dd>
　　<dd>・優先度２：足し算・引き算</dd>
　　<dd>・例外：（）で囲んだ場合は（）内の計算が優先</dd>
　　<dd>・ ＋ 演算子は左から評価され、 ＝ 演算子は右から評価される</dd>
  </dl>

##【６】演算子の種類
　 <dl>
 <dd><strong>基本の演算子</strong></dd>
 <dd>[+、ー、＊、/、%]</dd>
 <dd><strong>割り算は以下を注意</strong></dd>
 <dd> <em>[ / ]</em>　整数同士で余りが、出る計算（例：９/２）の場合、商を返す（例：4）。そのため正しい値を求める場合は、どちらかのオペランドを少数にする（例：９．０/２）　</dd>
　　<dd> <em>[ ％ ]</em>　余りを算出</dd>
　　<dd><strong>代入演算子</strong></dd>
　　<dd>・a○＝１　→　a = a○１と同意　　※○には、演算子が入る</dd>
 <dd><strong>インクリメント・デクリメント</strong></dd>
　　　<dd>・a++　→ a =  a＋1と同じ意味（インクリメント）</dd>
　　　<dd>・a--　→  a =  a-1と同じ意味（デクリメント）</dd>
</dl>
##【７】代入時の自動型変換
　<dl>
<dd><strong>・基本的な考え方</strong>
<dd>　「原則ある型で宣言された変数にはその型しか代入出来ない.しかし、各数値型には大小関係があり、小さな型の値→大きな型への代入は自動変換される」</dd>
</dl>
[WordPress] AMP 対応するときのプラグインやカスタマイズ

# お手軽にAMP対応したい

プラグイン「AMP for WordPress」を入れましょう。
https://ja.wordpress.org/plugins/amp/

# AMP for WordPress の標準機能
* AMPページの作成
* 通常ページで `<link rel="amphtml" href="http://example.com/xxxx/amp/">` の追加

* 投稿作成時にAMPでのプレビューボタン追加
![スクリーンショット 2018-02-02 19.19.03.png](https://qiita-image-store.s3.amazonaws.com/0/18348/e097ac83-d4cf-724e-0974-d2f918ddf08a.png)

* 投稿ごとにAMPにするかどうかを選択できる
![スクリーンショット 2018-02-14 13.13.55.png](https://qiita-image-store.s3.amazonaws.com/0/18348/5f9f89b5-3548-7873-ae82-ae933a83c09d.png)

* 外観＞カスタマイズでのAMPでのプレビュー機能
![スクリーンショット 2018-02-02 19.19.57.png](https://qiita-image-store.s3.amazonaws.com/0/18348/6c660031-21c0-bfce-8747-e45db490c184.png)

* テーマカスタマイザーでAMPページのヘッダーテキスト色、ヘッダー背景色とリンク、メイン部分の背景色とテキスト色の変更
* GoogleアナリティクスなどAMP対応のアナリティクスコードの管理と出力

以下、機能やカスタマイズの説明。

# 固定ページやカスタム投稿タイプもAMPにしたい
ダッシュボードのAMP＞Generalで「Post Type Support」にチェック入れるだけ。（ver 0.6〜）
PHPコード不要となりました。
![スクリーンショット 2018-02-02 19.47.06.png](https://qiita-image-store.s3.amazonaws.com/0/18348/2e0c5f0f-3fe3-b0b4-2480-883e402220bf.png)

# ヘッダーやメイン部分の色を変えたい
外観＞カスタマイズ＞AMPである程度は変更可能

* ヘッダーのテキスト色
* ヘッダーの背景色とテキストリンク色（ただしこれはセット）
* メイン部分の背景色とテキスト色（白背景＋黒文字 or 黒背景＋白文字の二択）

なお、WordPressコア機能の「サイトアイコン」を設定して入れば右上に出ます

![スクリーンショット 2018-02-02 19.25.48.png](https://qiita-image-store.s3.amazonaws.com/0/18348/bb043ffc-aa89-24fa-7f5a-3a45d03c23ca.png)

# アナリティクス入れたい
ダッシュボードのAMP＞Analyticsから設定可能。
AMPに対応してるアナリティクスのTypeとJSONコードだけでOK。

https://github.com/Automattic/amp-wp/wiki/Analytics

![スクリーンショット 2018-02-02 19.53.26.png](https://qiita-image-store.s3.amazonaws.com/0/18348/4968ee12-912c-2a7f-f9df-110cf24fb012.png)

Googleアナリティクスの管理画面からトラッキングコードのように自動で発行されるわけではないので、Googleアナリティクスの場合は以下のドキュメントを参考にJSONコードを作りましょう。
https://developers.google.com/analytics/devguides/collection/amp-analytics/

以上、ここまではプラグインのインストールのみで対応できる部分。

# 自前のテンプレートにしたい。

以前書いた[「[ざっくり翻訳] WordPress AMP プラグイン カスタマイズなどの説明」](https://qiita.com/gatespace/items/8087f1e19ffb81aeab15) は多少情報が古くなってるので Wikiを頑張って読みましょう

https://github.com/Automattic/amp-wp/wiki/Customization-and-Templating

プラグイン付属のテンプレートを「ちょっと変えたい」レベルであればアクションフックやフィルターフックで対応できます。
HTML構造からもろもろフルカスタマイズしたい場合はカスタムテンプレートを作りましょう。
筆者のオススメはプラグイン形式でカスタムテンプレートを作る方法です。
これだとテーマの切り替えに依存しないし、プラグインの有効化・停止で切り替えできるので。

現場からは以上です
Ryzenが乗ってるPCにVirtualBoxでLinuxを入れようとしたら32bitしか表示されなかった

#問題
VirtualBoxでubuntuを入れようとした
→なぜか32bitしか表示されない
→困った
![2018-02-02 (8).png](https://qiita-image-store.s3.amazonaws.com/0/214706/c44f493e-7d74-e15c-bd7e-395a85455db3.png)

#環境
OS:windows 10 Home
CPU:AMD Ryzen 5 1600X Six-CoreProcessor 3.60GHz
マザーボード:Asus PRIME B350M-A

#解決法
1.biosに入る
2.Advancedを選ぶ
3.CPU Configuationを選ぶ
4.SVMをdisableからenableにする

#できた
![2018-02-02 (9).png](https://qiita-image-store.s3.amazonaws.com/0/214706/3e622fc5-2d9c-4b77-7242-242dc5342c0f.png)
isaaxで始めるIoT体験

ウェブアプリlikeにIoT開発ができるプラットフォーム、isaaxの勉強会に行ってきました!雪の舞う東京で頑張って（笑）

* [isaaxの勉強会ページ](https://isaaxug.connpass.com/event/77203/)

注）今回の内容はほぼ[こちらの記事](https://qiita.com/xshell/items/e6199c101d1fa497be94)に内包されてます。

## isaaxとは?
一言で言うとIoTのための開発プラットフォームです。

ラズパイとかのシングルボードコンピュータ上にisaaxエージェントを入れてgitレポジトリと紐づけておくと、git pushするだけでデバイスへのデプロイが完了するし、デバイスの死活情報やアプリのエラーログまでweb上のダッシュボードから確認できるので、IoTがとっても捗るというスグレモノです。

## isaaxの使い方

### 作業レポジトリの準備
まずは作業用のgitレポジトリを準備します。
今回使用するサンプルプログラムが勉強会の事務局によって用意されているので、以下のレポジトリを自分のgithubアカウントにforkしておきます。

[https://github.com/xshellinc/study-group](https://github.com/xshellinc/study-group)

### isaaxにログイン
[https://isaax.io/](https://isaax.io/) へアクセスし、isaaxダッシュボードにログインします。githubアカウントでもログインできます。

ダッシュボードにログインできたら、プロジェクト一覧の`＋`ボタンからプロジェクトを作成します。

適当なプロジェクト名を入力し、githubアカウントと連携しているので（githubアカウントでログインしたから？）、レポジトリの欄で`study`とか入力すると先ほどforkしたレポジトリが表示されます。

レポジトリを選択して保存。これでプロジェクトは作成完了です。

### isaax-agentのインストール
isaaxのエージェントはLinuxが入ってれば動くそうです。勉強会ではラズパイを使用しました。

ということで、sshログインまでできるよう設定されたラズパイをご用意ください。


> 勉強会ではSDカードが準備されていました。設定方法は[こちら](https://qiita.com/xshell/items/025f0024e896a189c8c3)。中身はpicameraの設定とサンプルプログラムで使用するopencv周りの環境設定なので、isaaxを使うという観点ではネットワークとsshの設定までで良いのでしょう。

さてそれではisaax-agentをインストールします。

インストールはCLIツールを使って母艦PCから行うこともできるそうですが、今回はデバイス（ラズパイ）にsshログインしてインストールします。

ラズパイにsshログインして

```
curl -fsSL get.isaax.io | sudo bash -s stable <プロジェクトトークン>
```

で完了です。

プロジェクトトークンって？と思っているでしょうからやり方を説明します。

まず、isaaxのダッシュボード上で、クラスター一覧から`default`というのを選び、`ISAAX_AGENT_RELEASE`というトグルをON（右に寄っていればOK）にしておきます。

その後、プロジェクト一覧から今回作成したプロジェクトを選択し、`詳細`タブから`プロジェクトトークン`のボタンを押すとプロジェクトトークンが表示されます。

下の段に`curl -fsSL〜`と上記のコマンドがプロジェクトトークン付きで表示されるのでコピーして、ラズパイ上で実行します。これだけで自動的にエージェントがインストールされ、（おそらく）デーモン化されてバックグラウンドで動作します。

正しく動作すると、ダッシュボード上のデバイスの欄が`オンライン`表示になっていることが確認できます。

### アプリケーションの実行
実はここまで作業した時点で、レポジトリのプログラムが実行されています。いつの間にっ・・！

勉強会用のラズパイ設定とサンプルプログラムを使っている場合、ウェブブラウザから`<ラズパイのIP>:5000`にアクセスするとカメラ画像が確認できるはずです。

> 私は最初カメラのハード的な故障（イベントあるある）で動きませんでしたが、そのエラーログもisaaxのダッシュボード上で確認できました。カメラを取り替えて再起動すると、ラズパイがオフライン→オンラインになる様子や、アプリが正常に起動した様子もisaaxのダッシュボードから確認できました。

### アプリケーションの更新
ここまでできたら、あとは母艦PCでプログラム修正、git commit&pushすると、数秒でラズパイ上のプログラムが更新されて実行されます。

アップデートやアプリ再起動のログは全てisaax上で確認できるので、ホント、ウェブアプリの開発と同じ感覚で作っていけますね。

勉強会ではカメラ画像表示→動体認識→人物認識、とプログラムを更新して様子を体験しました。

## まとめ

実はisaaxを作っているxshellさんとは、isaaxがベータ版になる前からお話ししているのですが、格段に安定して使いやすくなっていますね。

機会があればもうちょいisaaxのhello world的な記事なども書いてみたいですし、普通に普段の開発で使っていきたいです。isaaxの勉強会は今後も[続々と予定](https://isaaxug.connpass.com/)されているようなので、興味がある方は是非！
Hiveで配列に複数の値が入っているものだけ抽出してみる

## 概要
TreasureDataで集計する際、配列型に複数の値が入っているものだけ抽出したくて調べたメモを残します。

## SQLを書いてみる
td_global_idごとにHAVINGでuser_idが２つ以上あるものだけ抽出する。

```sql
SELECT
  td_global_id,
  COUNT(id) as ids
FROM
  dev.hoge
  LATERAL VIEW explode(user_ids) adTable AS id
GROUP BY
  td_global_id
HAVING
  COUNT(id) > 1
;
```

## 参考サイト
* [Hive で配列の集計をするときに使う LATERAL VIEW の構文がなんか頭に入ってこない](http://suzuki.tdiary.net/20140909.html)
[備忘録]Unity で始める C# その3 

**Unityの仕組み**

```:シーン
ゲームの１つ１つの画面を表すもの。キャラやゲームオブジェクトをここに配置する。
```

```:コンポーネント
ゲームオブジェクトに関連付けるもの。機能を追加する。スクリプトもコンポーネントの１種。
「ボタン機能」「物理演算機能」「衝突判定機能」「エフェクト機能」「サウンド機能」などが
コンポーネントにある。つまりコンポーネントにない足りない部分をスクリプトで書いて対応する。
```

```:イベント関数
StartメソッドやUpdateメソッドのこと。Unityのシステムから自動的に呼び出されるもので、
イベント関数と呼ばれる。関数はメソッドとほぼ同じ意味。他にも衝突時に呼び出される
OnCollisionEnterやOncollisionExit、マウス操作で呼び出されるOnMouseDragなどがある。
```

**Unityシステム内部では１秒間に何度も繰り返されるループがあり、その中ですべてのゲームオブジェクトをチェックして、必要に応じてイベント関数を呼び出している。**

**2Dゲームの場合**、ゲームキャラに使う画像をインポートした場合、[Texture Type]が[Sprite(2D and UI)]になっている必要がある。

画像選択したときのInspectorにあるGenerate Mip Mapsは3Dゲームテクスチャ向けの設定で、有効にするとスマホでは画像がぼやける可能性があるので注意。

**コンポーネント**
Transform（トランスフォーム）コンポーネント
→ゲームオブジェクト（以下GO)の位置、角度、サイズを決める。すべてのGOに追加されている。

SpriteRenderer(スプライトレンダラー）コンポーネント
→Sprite(2D and UI)タイプの画像を表示するコンポーネント。[Sprite]に指定した画像がGOの外観として表示される。Flip操作はX軸Y軸を反転させることができた。

**Unity基本操作**
・右クリックで表示範囲を動かせる。
・Rectツール（一番右のツール）でGOを枠で表示し、枠をドラッグ移動、四隅をクリックして拡大縮小、枠の外側をクリックで回転などが可能。2Dゲームではよく使う。


Add Componentで既存のスクリプトを取り付けるとき（＝アタッチ）はScriptsを選択する。

---
**実際にアタッチしてみた**

```:ImageMove.cs[フレームごとにGOの位置をランダムな位置に移動]
// Update is called once per frame
	void Update () {
		Transform tr = this.GetComponent<Transform> ();
		Vector3 pos = tr.position;
		pos.x = Random.Range (-2.0f, 2.0f);
		pos.y = Random.Range (-2.0f, 2.0f);
		tr.position = pos;
		
	}
```
インスペクターのTransformコンポーネント（右クリック）での移動をGOにも付与した。
**GOが持っているコンポーネントを取得するのがGetComponentメソッド**。
メソッド名の後の<>は型パラメーターで、そこに取得したいコンポーネントの型を指定する。

```:GetComponent構文
Componentの派生クラス.GetComponent<コンポーネントの型>()
```
上では**this.GetComponent**と書いた。つまりGCメソッドはImageMoveクラスのメンバーだということ。正確には、ImageMoveクラスの親クラスである、MonoBehaviourクラスから継承したもの。さらにMBクラスもその親から継承しており、最終的にはComponentクラスにたどり着く。

---
**ワールド空間とローカル空間**
GOには親子関係をもたせることができるが、親Oを基準に子Oを動かしたいときにローカル空間の変数やメソッドを利用する。親Oもしくは子を持たないOの場合は、絶対的な原点を基準としたワールド空間の変数やメソッドを利用する。**ワールド空間の位置はpositionというメンバー変数によって記録されている**。

```
pos.x = Random.Range (-2.0f, 2.0f);
```
よってこれは、Random.Rangeメソッドを使用して、引数の範囲内のランダムな値を取り出して、x座標のpositionというメンバー変数に記録している。

---
**Vector3型と座標系**
positionはVector型。Vector３は物体の位置や向きを記録するための構造体。x,y,zのメンバー変数を持っていて、それぞれがワールド空間(0.0.0)原点からの距離を表す。
2Dゲームの場合、**xは横、yは縦方向の位置を表し、zは意味を持たない**

**構造体**
Vextor3はクラスではなく構造体というもの。classキーワードではなくstructキーワードで定義する。MonoDevelopで入力するときに出てくる候補のアイコンがクラスが「C」、構造体が「S」となっている。**構造体とクラスの大きな違いは、構造体は「参照」ではなくintやfloatと同じように「値」として扱われる点。
そのため変数から変数に代入した場合は、同じインスタンスを参照するのではなく、別のものにメンバーヘンスをコピーした状態になる。**

---

**プレハブ（Prefab）**
プレハブは作成したGOをアセットとして登録し、複製を簡単に作れるようにしたもの。主にゲームキャラを複数ださせるときに使う。**GOをProjectウィンドウに突っ込めばよい。**
プレハブアセットは背景が黒色になり、シーンに放り込めば勝手にヒエラルキーに追加されていく。**プロジェクトウィンドウでプレハブアセットを選択してインスペクターで操作すると、すべての複製に反映される**。
【Swift4】カスタムセルクラスを用意しないカスタムセル【iOS】

いまいちなタイトルですが、ユーザ定義のセルクラスを用意しなくても、タグ番号指定でカスタムセルの要素にアクセスできますよという記事です。

Interface Builderにて、セルの上に乗せた要素にタグを設定します。<font color="red">０は設定しないでください。</font>
<img width="1424" alt="Main_storyboard_—_Edited.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/4d8479ac-09fb-9368-b56e-93b8e252eeeb.png">

`viewWithTag()`を用いて設定したTag番号の要素にアクセスできます。要素がUIViewの場合、viewWithTag()の戻り値はもともとUIViewですのでキャスト不要です。

```Swift

    // UITableViewDataSource

    // セル生成
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

        // イメージビューにアクセス
        let imageView = cell.contentView.viewWithTag(1) as! UIImageView
        imageView.image = UIImage(named:"pika.png")
        
        // ビューにアクセス
        let view = cell.contentView.viewWithTag(2)
        view?.backgroundColor = .orange
        
        return cell
    }


```

なお、UICollectionViewでも同様なことができます。
CircleCI2.0でDatabaseを使ったテストをする

Circle2.0ではDatabaseのDocker imageを使ってテストをすることが可能です。

MySQLを使ったテストをやってみます。

# config.yml

```yaml:.circleci/config.yaml
version: 2
jobs:
  build:
    working_directory: ~/repo
    docker:
      - image: circleci/php:7.2-apache-node-browsers
        environment:
        - DB_HOST=127.0.0.1
        - DB_PORT=3306
        - DB_DATABASE=circleci
        - DB_USERNAME=circleci
        - DB_PASSWORD=circleci
      - image: circleci/mysql:5.6.39-ram
        environment:
        - MYSQL_ROOT_PASSWORD=circleci
        - MYSQL_DATABASE=circleci
        - MYSQL_USER=circleci
        - MYSQL_PASSWORD=circleci
    steps:
      - checkout
      - run:
          name: install dependecies
          command: composer install 
      - run:
          name: install dockerize
          command: wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
          environment:
            DOCKERIZE_VERSION: v0.3.0
      - run:
          name: Wait for db
          command: dockerize -wait tcp://localhost:3306 -timeout 1m
      - run:
          name: Test
          command: phpunit
```

## docker imageの指定と環境変数の設定

ひとつめのイメージはアプリケーション、2つめはMySQLのイメージを指定しています。

MySQLはcircleciのしかも`-ram`がついたイメージを使うと高速にテストできます。

また、`DB_HOST`は`127.0.0.1`です。

僕は`localhost`とやってハマりました。

以下はそのときのエラーです。

```
In Connection.php line 664:

  SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables where table_schema = amex and table_name = migrations)


In Connector.php line 67:

  SQLSTATE[HY000] [2002] No such file or directory
```

## dockerize

MySQLが立ち上がる前にテストが開始されてもテストはうまくいきません。
そこで、dockerizeを使って、使用可能になるまで処理を止めておきます。

```yaml:.circleci/config.yaml
      - run:
          name: install dockerize
          command: wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
          environment:
            DOCKERIZE_VERSION: v0.3.0
```

https://circleci.com/docs/2.0/postgres-config/#using-dockerize

# まとめ

* hostは`127.0.0.1`
* dockerizeを使う
naming > xxxEI | yyyDI > Enable Interrupt | Disable Interrupt


- 組込みの実装
- 変数名にEIやDIが付いている
    - 例: xxxEI、yyyDI

EIやDIは何を意味するのか。

### 推測

Enable InterruptとDisable Interrupt

http://www.microchip.com/forums/m741230.aspx
> asm volatile(“di”); // Disable all interrupts
asm volatile(“ie”); // Enable all interrupts

補足: ieはeiの誤記だろう。

### 備考

http://www.microchip.com/forums/m741230.aspx
> On the pic32 you have global interrupt enable/disable and individual interrupt enable/disable capability (it is far more granular than on the pic18 parts).

関数としては以下があると、特定の割込みセットををEnableにしたり、特定の割込みセットをDisableにする時にコードは少なくできそう。

- 全てをEIにする関数
- 全てをDIにする関数
- 個別でEIにする関数
- 個別でDIにする関数


変数名に関しては、xxxEIとyyyDIの両者を定義するよりも、「xxxEIとyyyEIを定義してdisableの時はFALSEにする」という実装案もあるだろう。

どちらがソースメンテ時に有用だろうか。

### MSP430

MSP430ではP1IEやP2IEのようにEnableの設定レジスタがあり、Disableにするには0にする。

https://courses.cs.washington.edu/courses/cse466/11au/calendar/04-Interrupts-posted.pdf
のp19あたり

> P1IE & P2IE (Port 1 & 2 Interrupt Enable reg)
> Bit 0: interrupt disabled
> Bit 1: interrupt enabled
HiveでSELECT結果をARRAYに変換する

## 概要
TreasureDataでデータ加工をしている際に、「GROUP BY」したSELECT結果に、
GROUP BY対象外のカラムを配列で追加したかったので調べた結果を作業メモとして残す。

## GROUP BY対象外のカラムをARRAYにする
COLLECT_SET関数で配列にする

```sql
SELECT 
  td_global_id,
  COLLECT_SET(user_id) AS user_ids 
FROM
  dev.hoge_access  
WHERE 
  td_global_id IS NOT NULL AND td_global_id <> ''
  AND  user_id IS NOT NULL AND user_id <> ''
GROUP BY
  td_global_id
;
```

## GROUP BY対象外のカラムをカンマ区切りで結合する
CONCAT_WS関数を使って結合する

```sql
SELECT 
  td_global_id,
  -- カンマ区切りの文字列に結合して文字列に...
  CONCAT_WS(',', COLLECT_SET(user_id)) AS user_ids 
FROM
  dev.hoge_access  
WHERE 
  td_global_id IS NOT NULL AND td_global_id <> ''
  AND  user_id IS NOT NULL AND user_id <> ''
GROUP BY
  td_global_id
;
```

## 結合したカンマ区切りの文字列を分割する
SPLIT関数を使って分割して配列型にする。

```sql
SELECT 
  td_global_id,
  -- カンマ区切りの文字列を分割して配列化
  SPLIT(CONCAT_WS(',',COLLECT_SET(user_id)), ',') AS user_ids 
FROM
  dev.hoge_access  
WHERE 
  td_global_id IS NOT NULL AND td_global_id <> ''
  AND user_id IS NOT NULL AND user_id <> ''
GROUP BY
  td_global_id
;
```

## 参考サイト
* [How can I convert array to string in hive sql?
](https://stackoverflow.com/questions/38711201/how-can-i-convert-array-to-string-in-hive-sql)
* [HIVEで文字列の配列化と配列の中身を１レコードずつに分ける方法](https://qiita.com/toohsk/items/ee5407d1cb8313f2f5da)
【Xcode】Archiveが選べないときの対処方法

はじめてiTunes Connectにアップしようとしたときにけっこうハマりました。
おなじ悩みをもつひとがいなくなりますように🙏

## なぜかArchiveがグレーアウトしている

開発したアプリをiTunes Connectにアップするために `Archive` を選択しようとすると、なぜかグレーアウトしていることがあります。

<img width="1440" alt="Archive01.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/b2093248-87b6-355a-e28d-7cf9bd36b89f.png">


選びたいのに選べない。この悲しみ。

## Generic iOS Deviceにしましょう

そんなときは、落ち着いてシミュレーターを選択する場所をクリックします。

<img width="1512" alt="Archive02.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/1a9155a7-5efb-08d3-db7b-7f18e4619847.png">


そして、上のほうにある `Generic iOS Device` を選択します。

<img width="316" alt="Archive03.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/6618e246-f3f2-c2e6-913a-cd00318d93f1.png">


そうすれば、Archiveが選択できるようになりました。

<img width="1440" alt="Archive04.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/cb7ef958-65ea-525a-7441-51c837de0427.png">


めでたしめでたし。
PDO　フォームで空が送られた場合NULLをセットする

```php
$stmt->bindValue(':バインド', $params['フォームからの値など']=="" ? NULL:$params['フォームからの値など'], ($params['フォームからの値など']=="") ? PDO::PARAM_NULL : PDO::PARAM_INT);
```

参考
http://www.phppro.jp/qa/4204
即閉じする子画面のログが取りたい


**追記**
以下で実現できるじゃない、というご指摘いただきました。。
ありがとうございます！はずかしい！ありがとうございます！

```javascript
window.opener.console("子供だよ！");
```


----

個人的メモ。
一定時間を置いたら閉じてしまう子画面の動作ログを取得したい場合。

```javascript:oya.js
// infoとlogしか対応しない
function logging(type, mes){
   if (type == "info") {
       console.info(mes);
   }else{
       console.log(mes);
   }
}
```

```javascript:ko.js
window.opener.logging("info","子供だよ！ログは親画面のconsoleに出してね！");
```

* 親画面でコンソールを開いて、子画面を起動すると、親画面のコンソールに子画面のログが出力される
* logging()に時刻入れたり、ログの種類分けたりしたらよいのね
* こんなことにずっと悩んでいたなんてorz
tdにホバーしたら▶を表示する

<p data-height="265" data-theme-id="0" data-slug-hash="gvPpPQ" data-default-tab="css,result" data-user="tomato-man" data-embed-version="2" data-pen-title="tdにホバーしたら▶を表示する" class="codepen">See the Pen <a href="https://codepen.io/tomato-man/pen/gvPpPQ/">tdにホバーしたら▶を表示する</a> by taira (<a href="https://codepen.io/tomato-man">@tomato-man</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
Dependency Injectionについて調べてみた

# DIとは？
Dependencyというのは、依存性のことです。
例えば、以下の例を見てみてください。

```sample.kt
class Car(val name: String) 
class User(val name: String, val car: Car)
```

UserクラスはCarクラスを保持しています。
つまり、UserクラスはCarクラスに依存していますね。
CarはUserの依存性です。

Injectionというのは注入のことです。
上記の例で言えば、UserクラスにCarを渡すことですね。
Userというクラスに必要としている、Carを注入しています。

依存性注入というのは、Userクラスが自分でCarを作るのではなく、外からUserにCarを渡すということです。
そうすることで、UserとCarの結びつきが薄くなります。（Carにはinterfaceを使うことでより結びつきを弱められます）
例えば、Userが他のCarオブジェクトが必要になってもUserクラスを変更する必要はありません。
Userに渡すCarオブジェクトを変更すれば良いだけです。

このおかげで、UserはCarに対する以下のような知識を減らすことができます。
1. Carの生成方法を知る必要がありません。
2. 実際にどのCarを使っているのかを知る必要がありません。（interfaceを使っているという前提で、どの具象クラスを使っているのかを知る必要がないの意）

# Injectionの方法とは？
主に以下の３つの方法があります。
1. constructor
2. setter
3. interface

# Dependency Injectionデザインパターンで解決したいこと
1. 依存性オブジェクトの生成方法とクライアントコードの独立をさせたい（異なるオブジェクトが必要になった時に、クライアントコードを都度変更したくない）
2. オブジェクトの生成方法を別ファイルで管理したい

# Androidチームの現状にはどう役立つのか？
1. テストのカバー率を上げられる？
2. アーキテクチャにより沿った実装にできる？

## 1. テストのカバー率を上げられる？
Androidには、View系のほとんどのリソースを管理しているContextというオブジェクトがいます。
例えば、以下のような処理をする時に、このContextが必要になります。
1. LocalDBの操作をする
2. 画面表示系のほとんどの操作をする

みてもらえれば分かる通り、presentation層のこともやるし、data層のこともやっています。
そのため、本当にアーキテクチャに沿った実装をやろうとすると、presentation/domain/data層全てにおいてContextを参照できる必要があります。
しかし、これはテストをするには不便です。（なぜ不便なのかはわかっていない。とりあえず、Contextがいるとテストできないという認識。）
configurationファイルにオブジェクトの生成処理を書くことができるとすれば、LocalDBを参照するクラスで、Contextを持つ必要がなくなります。
なぜなら、LocalDBを外部から作成して注入することができるからです。
そうなるとdomainとdata層に関してもバッチリテストを書くことができるようになります。


## 2. アーキテクチャに「より」忠実な実装にできる？
現在は上で挙げた理由から、ローカルDBへの操作がViewで行われてしまっています。
ローカルDBへの操作をするためにContextが必要ではなくなれば、ローカルDBが本来あるべきであるdata層に移植できます。

そうすると、viewがentityを触ることも無くすことができるので、新しいアーキテクチャへの展望が見えてくるのだろうと思います。
NanoPi NEOの最初のインストール

NanoPi NEOは小さくて安いARMの評価ボードです。
http://akizukidenshi.com/catalog/g/gM-12301/

#起動SDカードの準備

容量8GB以上のmicro SDカードを使用します。
そのmicro SDカードを挿したデバイスファイルが /dev/sdc とすると

```
wget http://www.mediafire.com/file/yllar5bgc74shwp/nanopi-neo_FriendlyCore-Xenial_4.11.2_20171122.img.zip
sudo unzip -p nanopi-neo_FriendlyCore-Xenial_4.11.2_20171122.img.zip |dd of=/dev/sdc bs=16M conv=fsync
```
unzipしたファイルを置いておくとディスクがもったいないと思ったので、パイプで直接つないでdd しています。

注意！ root権限でddコマンドの使用は危険です。SDカードのデバイス(この例では/dev/sdc)は必ず指差し確認してください。

#シリアルコンソールの接続

UARTの4本のピンが出ています。
RX, TX, 5V, GND の順。
5Vをのぞく3つを接続します。(電源はマイクロUSBからとったほうがON/OFFが楽なので。)

![nanopi.jpg](https://qiita-image-store.s3.amazonaws.com/0/13271/ad8e5c14-d0aa-6ebe-b31d-cbb39feeabae.jpeg)

#Macからシリアルコンソールにつなぐ

```
MAC$ sudo cu -l /dev/tty.usbserial -s 115200
```


#ブートログ

https://gist.github.com/tetsu-koba/a0f82f294fd54a7d9c4aeba250b2f7dc
[UWP] シリアル通信の受信にタイムアウトを適用するには

# 概要
シリアル通信中、相手がいつ送信してくるかわからない場合、受信処理は一定時間で終了してほしい。
しかし、UWPのシリアル通信に用意されているメソッドをそのまま使用するとそれがかなわない。
この問題の回避策を述べる。

# 発生した環境
この問題はRaspberry Pi 3 + Windows IoTの環境でおきた。
環境が異なると状況も違うかもしれない。

# 問題
`SerialDevice`クラスを使用してデータを受信する場合、このオブジェクトの`InputStream`プロパティを使用して、`Windows.Storage.Streams.DataReader`オブジェクトを生成する。
その後、`DataReader`オブジェクトの`LoadAsync`メソッドを呼び出すことになるのだが、このメソッドが返す`Task`オブジェクトは、実際にデータの受信がおこなわれるまで終了しない。
たとえ、

- `SerialDevice`オブジェクトの`ReadTimeout`プロパティをいくつに
- `DataReader`オブジェクトの`InputStreamOptions`の値を`Partial`以外に

したとしても。

以下がタイムアウトが働かないコード。

```csharp:NotWorkingTimeout.cs
SerialDeviceObject.ReadTimeout = TimeSpan.FromMilliseconds(1000);
DataRederObject.InputStreamOptions = InputStreamOptions.None;

uint bytesRead = await DataReaderObject.LoadAsync(256);
```

この`LoadAsync`はデータを1バイト以上受信するまで、いつまでたっても終わらない。

# 解決策
そこで、`CancellationTokenSource`を使用して、`LoadAsync`のタスクを中断するようにする。

```csharp:WorkingTimeout.cs
SerialDeviceObject.ReadTimeout = TimeSpan.FromMilliseconds(1000);

uint bytesRead = 0;
using (var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(1500))
{
    try
    {
        bytesRead = await DataReaderObject.LoadAsync(256).AsTask(cts.Token);
    }
    catch (OperationCanceledException)
    {
        // timeout
    }
}
```

これで受信できなかった場合はタイムアウトするようになる。
`CancellationTokenSource`に与える時間が、`SerialDevice.ReadTimeout`よりも大きいことに注意してほしい。

`DataReader.LoadAsync(uint)`は、

- どれだけデータを受信しようとも、最低限、`SerialDevice.ReadTimeout`の時間だけはデータを待ち続ける
- 1byte以上データを受信するまで終わらない

という動作をする。`ReadTimeout`はタイムアウトというよりも受信固定時間なのだ。

そのため、`CancellationTokenSource`を使用して`LoadAsync`のタスクを終了させる場合、データを受信しつつある`LoadAsync`を中断してしまわないよう、`SerialDevice.ReadTimeout`よりも長い時間で中断するようにしたほうがよい。

# 考察
ここで説明した方法では例外を使用することになる。
ご存知のとおり、例外というものは時間的コストがかかる、非常に重い処理のうちの一つである。

- Raspberry Pi 3 + Windows IoT
- `ReadTimeout`に10ms、`CancellationTokenSource`に設定する例外発生時間を60ms

として実行したところ、何も受信しなかった場合、受信処理に200msから350msを要した。
(何か受信できる場合は、10msで処理が終了する)
単純に考えて、受信開始から例外発生までの60msを除いた140msから290msが例外を処理している時間になる。

常に相手側からの送信を待ちうけてこちらからはその返信しかしない場合を除けば、受信から送信まで100msや200ms程度のレスポンスを保つことは不可能ということになる。
他にタイムアウトを適用した受信を可能とする方法があるのであれば話は変わるのだが。

# 参考にした情報
SerialDevice.ReadTimeout not working
https://social.msdn.microsoft.com/Forums/en-US/7b9fa7b5-55a8-490d-ab71-ea3bcf047826/serialdevicereadtimeout-not-working?forum=WindowsIoT
Unable to use SerialDevice.ReadTimeout in Windows 10 IoT
https://stackoverflow.com/questions/32157918/unable-to-use-serialdevice-readtimeout-in-windows-10-iot
Sigfox Sens'it SDKで簡単IoT組み込み開発(1)

#背景
IoT向け無線ネットワークLPWA(Low Power Wide Area)の技術のひとつ[Sigfox](http://sigfox.com)から[Sens'it](https://sensit.io/)と呼ばれるIoTエントリーキットがリリースされて半年、Sens'it SDKがでてきました。
ここでは、Sens'it SDKを使うと何ができるのか？その使い方を説明します。
※Sigfoxの日本国内サービスについては[京セラコミュニケーションシステム(KCCS)のSigfoxサイト](http://www.kccs.co.jp/sigfox/)を見てください。
#Sens'itとは
Sens'itは、温度・湿度、照度、加速度・磁気センサーを内蔵し、Sigfoxネットワークを通じ、各種データをインターネットにアップロード、sensit.ioクラウドサービスで、センサーデータを確認できるデバイスです。
![sensit.jpg](https://qiita-image-store.s3.amazonaws.com/0/172313/4e23d955-2a73-ef4e-1f79-7ef99c16280f.jpeg)

日本では、ソラコムとスイッチサイエンスから販売されています。
-ソラコム：[https://soracom.jp/products/sigfox/sensit/](https://soracom.jp/products/sigfox/sensit/)
-スイッチサイエンス：[https://www.switch-science.com/catalog/3500/](https://www.switch-science.com/catalog/3500/)
#Sens'it SDK
通常Sens'itは、取得するセンサーをモード（温湿度モード、照度モード、ドア開閉モード、振動検知モード、磁気モード）を切り替え、[規定のフレームフォーマット](https://www.thinxtra.com/wp-content/uploads/2017/07/Sensit-Payload-Decoding-Guide.pdf)でデータ送信することしかできませんが、
Sens'it SDKを使うと、
1. 複数のセンサーから同時にデータを取得可能
2. 送信データフレームを自由定義可能
3. 各センサーの精度設定を変更可能
になります。
#Sens'it SDKのインストール
Sens'it SDKは、Windows, Mac OS, Linuxに対応しています。
必要なことは、
1. Sigfox Sens'it SDK DevelopersサイトからSDKの[ダウンロード](https://build.sigfox.com/sensit-for-developers/#sensit-sdk)
2. ソースコンパイル用にARM Developersサイトから[GNU Arm Embedded Toolchain (gcc-arm-none-eabi)](https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads)のインストール
3. プログラムをSens'itに書き込むために[dfu-util](https://sourceforge.net/projects/dfu-util/)のインストール
です。
各OSによりインストール方法が異なりますので、Sigfox SDKのReadmeから該当部分を抜き出しておきます。
<details><summary>Readme</summary>
To install the above packages, use the following commands:
　* On Ubuntu / Debian, with apt-get
　  - make install
　* On Mac OS, with Homebrew:
　  - brew tap caskroom/cask (if caskroom is not yet installed)
　  - brew cask install gcc-arm-embedded
　  - brew install dfu-util
　* On Windows:
　  - Install arm-gcc for Windows (https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads)
　  - Install MINGW and MSYS (http://www.mingw.org/)
　  - Install dfu-util for Windows (https://sourceforge.net/projects/dfu-util/)
　  - Update your PATH environment variable to add bin/ subdirectories of arm-gcc, mingw, msys and dfuutil
　  - Install zadig for WinUSB driver (http://zadig.akeo.ie/)
　  - Put Sens'it in Bootloader mode, run zadig and install WinUSB driver. This step is required to use dfu-util on Windows.
</details>
これで、Sens'it SDKを使う準備は整いました。
長くなりましたので、SDKを使った開発方法については、後程投稿します。

その間に、まずはSens'itを入手してみてください。

[>Sigfox Sens'it SDKで簡単IoT組み込み開発(2)](https://qiita.com/ghibi/items/89807f69ae41cef084f9)
新しいMacで最初に走らせるコマンドたち

Macを買い替えた時や業務で新しいMacを支給された時などに毎回設定するの面倒なのでターミナルで走らせる系の作業をまとめてみました。

必要な作業を思い出したら随時スクリプトを追記していきます。

# `.bash_profile` を作成

```sh
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```

# エイリアスを登録する

```sh
cat << EOS >> ~/.bashrc
alias ls='ls -G'
alias ll='ls -lha'
alias rmdsstore="find . -name '*.DS_Store' -type f -ls -delete"
alias relogin='exec $SHELL -l'
alias merged_branch='git branch --merged | grep -vE '\''^\*|master$'\'''
alias rmmerged_branch='merged_branch | xargs -I % git branch -d %'
alias rmderived='rm -rf ~/Library/Developer/Xcode/DerivedData/*'
alias gb='git branch'
alias gba='git branch -a'
alias gf='git fetch -p'
alias gp='git pull --rebase -p'
alias grb='SKIP_POST_CHECKOUT=1 git rebase $(gba | grep -v "HEAD" | peco | tr -d '"'"' '"'"' | tr -d '"'"'*'"'"')'
alias grm='SKIP_POST_CHECKOUT=1 gf && git rebase origin/master'
alias gp='git pull --rebase -p'
alias grc='git rebase --continue'
alias gout='git checkout \$(git branch | peco | tr -d '"'"' '"'"' | tr -d '"'"'*'"'"')'
alias glook='ghq look \$(ghq list | peco)'
EOS
```

# ネットワークドライブ(NASとか)で `.DS_Store` を作成しないようにする
```sh
defaults write com.apple.desktopservices DSDontWriteNetworkStores True
killall Finder
```

# 隠しファイルを表示するようにする

```sh
defaults write com.apple.finder AppleShowAllFiles TRUE
killall Finder
```

# Homebrewインストール

```sh
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

# rbenvインストール

```sh
brew install rbenv rbenv-communal-gems
```

※.bashrcに以下を追記

```sh:.bashrc
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

# rbenvでRubyを最新版に

```sh
rbenv install 2.6.0
rbenv global 2.6.0
```

# Node.jsインストール

```sh

brew install nodebrew
mkdir -p ~/.nodebrew/src
nodebrew install-binary latest
echo 'export PATH=$PATH:~/.nodebrew/current/bin' >> ~/.bashrc
```

# Dockerインストール
```sh
brew cask install docker
open /Applications/Docker.app

curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

# ghq & pecoインストール
```sh
brew install ghq
brew install peco
```

# 最後に
↑を全部まとめてやってくれるスクリプトを[GitHub](https://github.com/417-72KI/MacUtilties/blob/master/init_mac.sh)にまとめてみました。

# 参考
- [シェルを再起動させる簡単な方法](https://qiita.com/yusabana/items/c4de582c6f85a42817d8)
- [【Mac】隠しファイル・隠しフォルダを表示する方法](https://qiita.com/TsukasaHasegawa/items/fa8e783a556dc1a08f51)
- [.DS_Storeをネットワークドライブ上で作成しないようにする](http://ftvoid.com/blog/post/642)
- [【2018年版】macにrbenvを入れてrubyを管理できるようにしちゃう](https://qiita.com/Alex_mht_code/items/d2db2eba17830e36a5f1)
- [rbenvでRubyの最新安定版をインストールするワンライナー](https://mawatari.jp/archives/install-latest-stable-version-of-ruby-using-rbenv)
buildrootで作るNanoPi-NEO2用upnpレンダラー（ルートファイルシステム）

# 概要
自分用のメモみたいなものです。markdownの練習でもあります。
書かない部分はデフォルトということです。今回はルートファイルシステムの部分のみ作る場合
についてです。

# make menuconfig
### Target option
```
Target Archtecture (AArch64 (little endian))
Target Archtecture Variant (cortex-A53)
Floating point strategy (FP-ARMv8)
```
### Toolchain
```
Toolchain type (External toolchain)
Toolchain (Linaro AArch64 2017.11)
(-O3 -pipe) Target Optimizations
```
### System configuration
```
(xxxxx) Root password
(Asia/Tokyo) Install timezone info
(/home/takobozu/buildroot/board/NanoPi-NEO2/rootfs-overlay) Root filesystem overlay directories
```
### Target package
```
[*]BusyBox
Audio and video applications --->
  [*]alsa-utils --->[*]alsaconf [*]aplay/arecord
  [*]mpd ---> [*]audiofile [*]dsd [*]flac [*]mad [*]curl [*]alsa
  [*]upmpdcli
Networking applications --->
  [*]ntp
  [*]ntpd
System tools --->
  [*]htop
```
### Filesystem images
```
[*] cpio the root filesystem
    Compression method (gzip)
```

### Bootloaders
```
[*] U-Boot
    Build system (Kconfig)
(nanopi_h5) Board defconfig
    U-Boot binary format --->
       [*]Custom (specify bellow)
    (u-boot.itb) U-Boot binary format: custom names
[*] Install U-Boot SPL binary image
(spl/sunxi-spl.bin) U-Boot SPL/TPL binary image name(s)
```

# make busybox-menuconfig
使いたいコマンドやデーモンをメニュー形式で設定する。ここは人によって違うと思うので省略。

# その他
上記のrootfs-overlayですが、これから作らせるルートファイルシステムに加えたいファイルやディレクトリを/home/takobozu/buildroot/board/NanoPi-NEO2/rootfs-overlay以下にあらかじめ作っておくことで、buildrootが作るルートファイルシステムにそれらを上書きしてもらうためのものです。詳細は、buildrootのマニュアルを確認した方がいいです。

Bootloaderで作らせる　u-boot.itb sunxi-spl.binの使い方は、friendlyarm mainline kernel などと検索してもらえば、wikiが見つかりますのでそこに詳しく書いてあります。私もここで勉強しましたので皆さんもどうぞ。
WebSocket のデータを受信するページ

WebSocket の データを受信するページです。

WebSocket の送信元は、[BitFinex](https://docs.bitfinex.com/docs) です。

次のように表示されます。
![bitcoin_feb0201.png](https://qiita-image-store.s3.amazonaws.com/0/179446/84174188-4caf-5d3b-c05d-88c78d13c126.png)

ページ

```html
<!DOCTYPE html>
<head lang="ja">
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="bitcoin.js"></script>
</head>
<body>
<div id="contents"></div>
<p />
Version: Feb/02/2018 PM 17:16<p />
</body>
```

```js:bitcoin.js
// -----------------------------------------------------------------------
/*
	bitcoin.js

					Feb/02/2018
*/
// -----------------------------------------------------------------------
var ws = new WebSocket('wss://api.bitfinex.com/ws/');

// -----------------------------------------------------------------------
jQuery (function ()
{
	var count = 0

	const params = {
			"event": "subscribe",
			"channel": "trades",
			"pair": "BTCUSD"
			}

	const json_str = JSON.stringify(params)

	ws.onopen = function()
		{
		ws.send (json_str)
		}

	ws.onmessage = function(msg)
		{
		const response = JSON.parse(msg.data)
		if (response[1] === 'te')
			{
			out_proc(response,count)
			count += 1
			}
		}
})

// -----------------------------------------------------------------------
// [4]:
function out_proc(response,count)
{
	var str_out = ""
	str_out += "<table>"
	str_out += "<tr><td>count</td><td>" + count + "</td></tr>"
	str_out += "<tr><td>CHANNEL_ID</td><td>" + response[0] + "</td></tr>"
	str_out += "<tr><td>te</td><td>" + response[1] + "</td></tr>"
	str_out += "<tr><td>SEQ</td><td>" + response[2] + "</td></tr>"
	str_out += "<tr><td>TIMESTAMP</td><td>" + response[3] + "</td></tr>"
	str_out += "<tr><td>PRICE</td><td>" + response[4] + "</td></tr>"
	str_out += "<tr><td>AMOUNT</td><td>" + response[5] + "</td></tr>"

	str_out += "</table>"

	jQuery("#contents").html (str_out)
}

// -----------------------------------------------------------------------
```
MAC＋PhpStormでFuelのプロジェクトをDebugする

###  目的 
　古いPHP5のプロジェクトを調べたるため（擬似S3にアクセス出来ない）色々環境作りに時間を食ったので、メモしておく。
###　環境 
* Mac OS High Seirra 10.13.2
* Preinstalled Php 7.1
* Preinstalled Apache2.4

###　複数PHPのインストール
プロジェクトに必要なのは、PHP5に対して、MacにあるのはPhp7.1。なので、複数のPHPをインストールすることに決めた。

* 大変参考になりましたインストール手順

[複数Phpのインストール](https://getgrav.org/blog/macos-sierra-apache-multiple-php-versions)　　
[Xdebugのインストール](https://getgrav.org/blog/macos-sierra-apache-mysql-vhost-apc)  
下記は手順と違った点、感じた点のメモ。

1. xcode-select --install　はやはり必要、抜けたらその後の作業にエラーがでる。
2. Apacheはサービス化させてくないので、sudo brew services start httpdは実行しなかった
3. User&Group はイマイチ詳しくないので、一旦Chmod a+w にした
4. sphp も入れて切り替えてうまくいったが、なぜか php -v　を実施したらディフォルトのPHP 7.1.7 (cli)　が表示される。which php で調べてもパスに問題ないし、SymboleLinkのリンク先もちゃんとしたし、いまだに原因が理解出来ていない。
5. Mysql ではなくPostgresqlに接続するので、念のため、Phpをインストール時、--with-postgresqlも指定した
6. Mysqlはインストールしなかった。
7. Apache Virtual Hostsは使わなかった。
8. Dnsmasqも使わなかった。
9. APC Cacheなども使わなかった。（第一動かせることなので、セキュリティ、性能などは後回し）
10. Navive Yamlもインストールしなかった。
11. Xdebugの設定ファイルに xdebug.idekey="PHPSTORM" との一行を追加、PhpStormと接続するため。

###　PhpStormでのDebug
1. まず「プロジェクト手順](https://www.jetbrains.com/help/phpstorm/create-new-project-specify-remote-server.html)にしたがってプロジェクトを作成する。LocalServer、LocalSource。
2. [ローカルPhp-interpreterの設定](https://www.jetbrains.com/help/phpstorm/configuring-local-php-interpreters.html)
3. [ディバッグサーバーの設定](https://www.jetbrains.com/help/phpstorm/creating-a-php-debug-server-configuration.html)
4. 若干古いが一応フローを理解するために[これも読んでおいた方が](https://confluence.jetbrains.com/display/PhpStorm/Zero-configuration+Web+Application+Debugging+with+Xdebug+and+PhpStorm)
5. 面倒臭いが[Cookieを設定するため、ブラウザプラグインを導入](https://confluence.jetbrains.com/display/PhpStorm/Browser+Debugging+Extensions)
6. PhpStormのDebug　Toolbarの電話まくを緑にしておく。
7. RunMenuのBreak at firstline in PHP scripts をチエック
8. RunConfigurationでPhp Remote Debugを追加、Serverは先ほど追加したもので、IdeKeyはPHPSTORM


###　残課題
どうやらソースのマッピングがプロジェクト構造かのどこかに問題があるかと思う。PHPStormを使って、ContextMenuでメソッドのDeclartionが見つからないだもの。