OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxでパケット受信障害のエミュレーション

# 概要
Linuxでネットワーク障害のエミュレーションをしたいときはtcコマンドを使うが、普通に使うと外向き（egress）のパケットにしかエミュレーションがかからない。内向き（ingress）に対してエミュレーションをかける場合の設定方法について。

# 手順
## IFBモジュールをロードする（IFB: Intermediate Functional Block pseudo-device）
`# modprobe ifb`

## IFB疑似デバイスをリンクアップする
`# ip link set dev ifb0 up`

## tcコマンドでingressを設定
`# tc qdisc add dev eth0 ingress`

## tcコマンドでingressパケットをIFBに飛ばす
`# tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0`

## IFBにエミュレーションをかける（例:1%ロス）
`# tc qdisc add dev ifb0 root netem loss 1%`

# 参考
https://wiki.linuxfoundation.org/networking/netem
[android] 複数のflavor(フレーバー)を一気にビルドする

# ○すべてのパターンのflavor(フレーバー)を一気にビルドするコマンド
1.android studioの下部のTerminalタブから
<img width="1106" alt="スクリーンショット 2017-07-04 17.32.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/50917/048d793b-6c44-f100-1447-be9417c73335.png">

2.以下のコマンドを入力する

```
(macの場合)./gradlew assemble
or
(windowsの場合)gradlew assemble
```

3.flavor x buildType分のapkが app/build/output フォルダに生成されます。

# ○デバッグモードのすべてのflavor(フレーバー)を一気にビルドするコマンド

```
(macの場合)./gradlew assembleDebug
or
(windowsの場合)gradlew assembleDebug
```
flavor x debugビルドのapkが生成されます。

# ○その他色々なタスクコマンドの確認
```
(macの場合)./gradlew tasks
or
(windowsの場合)gradlew tasks
```
今のflavorとbuildTypeの状態でうてるコマンドを確認できます。

<参考>
android studio 公式HP 「コマンドラインからのアプリ作成」
https://developer.android.com/studio/build/building-cmdline.html?hl=ja
AWS BatchのジョブがRUNNABLEのまま進まない


こんにちはsekitakaです。
AWS BatchでLambdaで実行しきれない大きめのタスクを任せようと検討中です。

試しに簡単なジョブを作成してみたのですが、ステータスがRUNNABLEのまま進まなくてハマったので、調査方法と解決策を共有します。

# 調査
## コンテナインスタンスのログを確認
エラーも何もでないのでコンテナインスタンスに接続して、何かヒントが無いか探りました。
コンテナインスタンスはVPC内に作成されるので、踏み台インスタンスを経由してSSH接続しました。

`/var/log/ecs/ecs-agent.log*`を確認すると以下のようなログが出力されていた。

```
2017-07-04T03:14:27Z [INFO] Starting Agent: Amazon ECS Agent - v1.14.1 (467c3d7)
2017-07-04T03:14:27Z [INFO] Loading configuration
2017-07-04T03:14:27Z [INFO] Checkpointing is enabled. Attempting to load state
2017-07-04T03:14:27Z [INFO] Loading state! module="statemanager"
2017-07-04T03:14:27Z [INFO] Event stream ContainerChange start listening...
2017-07-04T03:14:27Z [INFO] Detected Docker versions [1.17 1.18 1.19 1.20 1.21 1.22 1.23]
2017-07-04T03:14:27Z [INFO] Registering Instance with ECS
2017-07-04T03:14:47Z [ERROR] Could not register: RequestError: send request failed
caused by: Post https://ecs.us-east-1.amazonaws.com/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
2017-07-04T03:14:47Z [ERROR] Error registering: RequestError: send request failed
caused by: Post https://ecs.us-east-1.amazonaws.com/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
```
どうやら`https://ecs.us-east-1.amazonaws.com`に接続できない模様。
試しにこのインスタンスで`curl https://ecs.us-east-1.amazonaws.com`を実行すると、予想どおり接続できない。
というかECSを使ってAWS Batchが動いていたのですね。

## VPC内の他のインスタンスと比較
VPC内の同じサブネットの他のインスタンスでどうなるか試してみました。
作成していた踏み台インスタンスでは `curl https://ecs.us-east-1.amazonaws.com` は成功します。

違いはElasticIPを設定しているか/いないかなので、試しにコンテナインスタンスにElasticIPを付与してみるとジョブが動いた！！

## 疑問
インターネットゲートウェイをアタッチされたVPC内のEC2インスタンスはインターネット接続できると思ってたけど間違い？
→ [ここ](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Internet_Gateway.html)を読むと間違いっぽい。
サブネットのインスタンスもグローバルに一意なIPを持たないとインターネット接続できない。

# グローバルに一意なIPを持つインスタンスを自動生成するには？
VPC -> サブネット -> Batchを所属させるサブネットを選択する -> サブネットのアクション -> パブリックIPの自動割当を有効にする

# 最終確認
パブリックIPの自動割当を有効にしたサブネットを選択しComputing Environmentを作成し、ジョブを登録したところスムーズにジョブがSUCCESSすることを確認

# まとめ
AWS BatchというよりVPCの知識不足によってハマっていたようです。
フォーラムでも疑問が出ていたので、同じハマりする人多いような気がするので誰かの役に立てればいいな。

# 2017/07/12 追記
VPCのDNS解決も有効にしていないとインターネット接続できなかった。
【jQuery】.animateでscrollTopを指定する際、2回コールバックが呼ばれてしまう問題を何とかする

jQueryでアニメーションを伴ったスクロール処理をする際、
Webkit系と非Webkit系どちらも対応させる為に以下のような記述をするかと思います。

```js
$('html, body').animate({
  scrollTop: 0
}, 500);
```

スクロール終了時に何らかの処理を入れたい場合、
以下のようにコールバックを指定するのですが、
下記のように書くとhtml、bodyそれぞれで2回コールバックが呼ばれてしまいます・・・。

```js
$('html, body').animate({
  scrollTop: 0
}, 500, function() {
  // do something...
  // ここが2回呼ばれてしまう
});
```

こんな場合は.promise()を使うとうまくいきます。
全てのアニメーションが終了した際にresolve()が呼ばれる模様。
超便利！

```js
$('html, body').animate({
  scrollTop: 0
}, 500)
.promise()
.done(function() {
  // do something...
  // 1回しか呼ばれない！
});
```
ffmpegでMP4ファイルを結合する

あるファイルAと別のファイルBを連続で再生する動画ファイルCを作りたかったので、やり方を調べてみました。

まず、以下のように結合したいファイルを各行に記述したテキストファイルを作ります。

```:mylist.txt
file /path/to/fileA.mp4
file /path/to/fileB.mp4
```

次に、このテキストファイルと同じディレクトリで以下のコマンドを実行します。

```
ffmpeg -f concat -i mylist.txt -c copy output.mp4
```

※mylist.txt は先ほど作成したテキストファイルのファイル名です。
※ffmpegにパスが通っている必要があります。

`-c copy`はオリジナルファイルのコーデックを再エンコードすることなく処理するオプションです。
とても高速に処理できますが、fileA.mp4、fileB.mp4のコーデックが異なる場合はこの方法では結合できません。
異なるコーデックの動画を結合したい場合は、`-c copy`を外す（デフォルトのコーデックが使われる）かコーデックを指定してエンコードしてください。
Ubuntu で Syncthing を使えるようになるまで

## 検証環境

```shell-session
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
```

## インストール
公式の [Debian/Ubuntu Packages](https://apt.syncthing.net/) の手順に沿って下記のコマンドを実行。

```shell-session
$ curl -s https://syncthing.net/release-key.txt | sudo apt-key add -
$ echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list
$ sudo apt update && sudo apt install -y syncthing
```
ターミナルで `syncthing` コマンドを実行して起動できれば OK 。

## スタートアップの設定
Dash で「自動起動」と検索して「自動起動するアプリケーション」を開く。
自動起動するアプリケーションを下記の通り入力して追加。

#### コマンド
`syncthing の場所 -no-browser -home="/home/アカウント名/.config/syncthing"`
syncthing の場所はターミナルで `$ which syncthing` とすれば表示される。

これでログイン時に Syncthing が起動するようになる。

ブラウザで「127.0.0.1:8384」にアクセスすると Web UI が表示されます。
（アドレスは `~/.config/syncthing/config.xml` の `configulation > gui > address` に記載）
kotlin で custom view

constructor の定義メモ

```kotlin
class CustomView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {

  init {
    init()
  }

  private fun init() {
    // do something
  }
}
```
Dockerfileで複数行を改行付きでechoする


Dockefile内でyumリポジトリ設定のような複数行をechoしてリダイレクトしてファイルを作成する方法です。

次に示すように`$`付きの文字列としてechoします。 改行は`\n`と記述します。

```
RUN echo $'[centos]\n\
name=CentOS-6 - Base\n\
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os\n\
enabled=0\n\
gpgcheck=1\n\
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6' > /etc/yum.repos.d/CentOS-Base.repo
```

イメージのOS次第かもしれません。
centos7のreboot時にネットワークがつながらなくてハマった話

## network is unreachable
つい先ほど、研究室のサーバーをrebootしたらネットワークにつながらなくなって3時間ほど時間をとられたので書く。まじで不毛だった。

## サーバー情報
CentOS Linux release 7.3.1611 (Core)

## 状態

- pingはローカルホスト以外つながらない。 
- しかしながらnetwork.serviceもNetworkMnager.serviceもどちらもactiveになっている。  
- とりあえずネットワーク確認系のコマンド実行するとnetwork is unreachableというエラーを吐く。  

## 原因
` nmcli device status`を実行してみると

```
#nmcli device status
device       type      state          connection
enp0s2f1u3   ehternet  disconnected   --
lo           loopback  unmanaged      --
``` 
なんとイーサネットのネットワークインターフェースが停止状態。
これをとりあえず接続状態にする。
ちなみにenp0s2f1u3の部分は人によって変わる。

## 解決方法

` nmcli connection up enp0s2f1u3`を実行。
再度` nmcli device status`を実行すると。

```
#nmcli device status
device       type      state          connection
enp0s2f1u3   ethernet  connectied     enp0s2f1u3
lo           loopback  unmanaged      --
``` 
とりあえずこれで一時的に解決はできる。
しかしながら、` nmcli con show enp0s2f1u3`を実行して詳細情報を見てみると
connection.autoconnectの欄がnoになっている。
このままではまた再起動をしたときに自動接続してくれず
もう一度この手順を踏まなくてはならない。

そこで` nmcli con mod enp0s2f1u3 connection.autoconnect "yes" `を実行。
もう一度` nmcli con show enp0s2f1u3`を実行して詳細情報を見てみると
connection.autoconnectの欄がyesになっている。
これだけでは設定が反映されないらしいので一度ネットワークインターフェースを再起動する。

``` 
#nmcli device disconnect enp0s2f1u3
Device 'enp0s2f1u3' successfully disconnected.
#nmcli device connect enp0s2f1u3
Device 'enp0s2f1u3' successfully active with '0ebb3f65-6a53-4c90-7b518c982ee7'
```

これで完了。
もう一度rebootして後もネットワークに接続できていた。
良かった。
## 参考文献
[CentOS7が出たので、最小インストールからSSHが接続できるまで](http://qiita.com/tamamius/items/a27fa04a4c978479b395)
オフライン環境でReact

ReactというよりもNode.jsの、いやnpmの話なのかもしれない。

npmが入っていないところにnpmをインストールするというのは、
昔のzipファイルをunzipの入っていない環境で展開するのと
同じような問題だけど、事は昔ほど簡単ではなくて、そのnpmの
インストールにネットワークが必要という、ちょっと困った状況に
なっている。

かつては、タマゴをもってくるなりニワトリをもってくれば
何とかなったけど、際限なく広がるニワトリのコミュニティが必要となると
話は別だ。

そんなときは、npmboxを使えば良いらしい。

本家:
 https://github.com/arei/npmbox

手順通りに従って操作すると、
1. グローバル環境にインストール(要root)
    `npm install -g npmbox`
2. パッケージング
    `npmbox npmbox`
   すると、カレントディレクトリにnpmbox.npmboxというファイルができる。

  何だろう？ということで `file npmbox.npmbox`で確認すると
    `npmbox.npmbox: gzip compressed data, from Unix`
   だそうで。
3. そのnpmbox.npmboxをインストール先にコピー
    容量は9MBくらい。
4. 仮のディレクトリを作成して、そこで展開
   `tar xvzf npmbox.npmnox`
  すると .npmbox.cacheができる。
5. npmboxをインストール(要root)
    `npm install --global --cache ./.npmbox.cache --optional --cache-min 99999999999 --shrinkwrap false npmbox`
  このとき、npmがないと実行できないので、あらかじめダウンロードしてあったNodeパッケージ内のbinディレクトリにパスを通しておいた。
  今回の私の環境の場合はこれ: 
     https://nodejs.org/dist/v6.11.0/node-v6.11.0-linux-x64.tar.xz
  npmboxの実行プログラムは、このnodeのbinに入った。
6. インターネットに接続されている方でnpmのパッケージを作成
    `npmbox npm`
 するとnpm.npmboxができる
7. npm.npmboxをインストールしたいホストにコピーして、以下のコマンドでインストール
    `npmunbox npm`

 npmboxじゃなくて、npmunboxね

8. インターネットに接続しているマシンで、reactをインストール
   npm install -g react
9. npmboxでパッケージング
   npmbox react
10. 9でできたreact.npmboxをインストール先の環境にコピー
11. npmunbox react.npmbox (.npmboxの拡張子はあってもなくてもいいらしい)
Laravelで、チェックボックスをPOSTした後の old() 問題

これで3時間くらいハマった。

# 前提

Laravel 5.1

# 問題

下記のようなチェックボックスを含む値をPOSTする状況でデフォルト値の設定に悩む。

- `users` の編集画面
- `users.is_active = 1` から `users.is_active = 0` に変更する
- `users.is_active` 用のチェックボックスをONからOFFに変更してPOST
- 別の項目でバリデーションに引っかかり、入力画面に戻る
- `users.is_active` 用のチェックボックスはOFFになっていてほしい

残念ながら、チェックボックスはONになっている。

`<input type="checkbox" {{ (old('is_active', $user->is_active) ? 'checked' : '' }}>`

としても、 `old('is_active', $user->is_active)` は、チェックボックスをOFFにしていると `old('is_active')` が `null` のため、デフォルトの `$user->is_active` が呼ばれてチェックが付いてしまう。

これと同じ問題。

https://stackoverflow.com/questions/16884032/unchecked-checkbox-with-inputold/44899036#44899036

# 解決策

Laravel Collective とか使えばいいのだろうか。試していないが同じ問題が起きそうなのでやめた。

ちょっとださいが、仕方がないので下記ヘルパーを作って解決した。

```php:app/helpers.php
function is_checked(string $name, $value, $default) : string
{
    $current_defaults = Input::old() ? old($name, 0) : $default;
    return ($value == $current_defaults) ? 'checked' : '';
}
```

```php:resources/views/user/edit.blade.php
<input type="checkbox" name="is_acrive" value="1" 
       {{ is_checked('is_active', 1, $user->is_active) }}>
```

Multiple checkbox version:

```php:app/helpers.php
function is_checked_multiple(string $name, $value, $defaults) : string
{
    $current_defaults = Input::old() ? old($name, []) : (array)$defaults;
    return in_array($value, $current_defaults) ? 'checked' : '';
}
```

```php:resources/views/user/plans/edit.blade.php
@foreach ($plans as $plan)
    <input type="checkbox" name="plans[]" value="{{ $plan->id }}" 
           {{ is_checked_multiple('plans', $plan->id, $user->plans->pluck('id') }}>
@endforeach
```

`==` の曖昧比較なのは、 `old()` の値は文字列になるから。


# 追記

@nunulk さんのご指摘の通り、 `laravelcollective/html` では問題なく動作することを確認できました。
記述も短くなるしこれ使った方がいいな・・・
AnacondaでインストールしたOpenCV3の動作チェックをする

#動作チェック、その前に

haarcascadesファイルが無いよ！　エラーを起こすことがあるので、pyファイルと同じ階層に haarcascades ディレクトリを作成して、カスケードファイルをまるごとコピーしておくといいんじゃないかと思います。

haarcascade_eye.xml
haarcascade_frontalface_default.xml

の2つを拾ってきてコピペしても動きます。

```checkcv.py
import cv2

face_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml')


img = cv2.imread('./images/img.jpg')
gray_scale = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray_scale)
for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    r_gray = gray_scale[y:y+h, x:x+w]
    r_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(r_gray)
    for (ex,ey,ew,eh) in eyes:
        cv2.rectangle(r_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

cv2.imshow('img',img)


cv2.waitKey(0)
```

#実行結果

![スクリーンショット 2017-07-04 15.53.18.jpg](https://qiita-image-store.s3.amazonaws.com/0/71585/3ea30de3-b5d3-7574-2033-2caa72646d12.jpeg)


もっと勉強しないと駄目ですねこれは。
マルチプロセスなプログラムのメモリ使用量を測る



マルチプロセスなウェブブラウザのメモリ使用量の測り方を調べている。

Chromium については、過去 about:memory という URL でメモリ使用量を取得出来たらしいが、最近この機能は削除された https://bugs.chromium.org/p/chromium/issues/detail?id=588790 。代わりのツールを探し中だがまだ見つからないので、必要な情報を調べている。https://www.chromium.org/developers/memory-usage-backgrounder によれば、一言でメモリ使用量と言っても大まかに二つの部分に分かれている。

* Private memory: あるプロセスだけで使われるメモリ。
* Shared memory: 他のプロセスと共有しているメモリ。共有ライブラリ等。

という事で、あるウェブブラウザが使用中のメモリを求めるには次のようにする。

* ブラウザに関連する全てのプロセスの Private memory を足す。
* ブラウザに関連する全ての Shared memory を重複しないように適切に足す。

ここで、Shared memory をどのように足せば良いかというのが問題になる。共有メモリはブラウザだけでなく、他のアプリも使っているので、それぞれのプロセスが使っている Shared memory を単純に足し合わせただけでは重複が多すぎて、本当に使っているメモリを示している事にならない。そこで、Linux では Proportional set size という考え方が生まれたらしい。

https://lwn.net/Articles/230975/ によれば、あるプロセスの Proportional set size とは、割り当てたメモリのそれぞれのページごとに、他に使ってるプロセスの数を調べて割って求めた値らしい。例えばあるプロセスが 1000 ページを専有していて、1000 ページを二つのプロセスで共有していた場合、その PSS は 1000 + 1000 / 2 = 1500 となる。このような統計情報を計算するのは比較的重い作業なので、カーネルは必要な情報だけを提供し、実際の計算は http://manpages.ubuntu.com/manpages/precise/en/man8/smem.8.html などユーザランドで行う。

例えば chromium-browser という名前のプロセスを計測すると

```
$ smem -k -P [c]hromium-browser -t
  PID User     Command                         Swap      USS      PSS      RSS 
15352 tyamamiya /usr/lib/chromium-browser/c        0   148.0K     3.8M    12.8M 
15350 tyamamiya /usr/lib/chromium-browser/c        0   328.0K    27.2M    71.8M 
15342 tyamamiya /usr/lib/chromium-browser/c        0   103.3M   137.4M   192.0M 
15437 tyamamiya /usr/lib/chromium-browser/c        0   138.0M   153.9M   183.0M 
-------------------------------------------------------------------------------
    4 1                                           0   241.7M   322.4M   459.6M 
```

ということで、カーネルが報告した RSS 459.6M に対して、もっともらしい結果である PSS は 322.4M という事になった。ここで項目の意味は

* USS: Unique  Set  Size: あるプロセスだけで使われるメモリ (Private memory)
* PSS: Proportional set size: USS + Shared memory を共有しているプロセスの数で割ったもの。
* RSS: Resident set size: 物理メモリ

となる。

## 参考情報

* proportional set size とは何か? https://lwn.net/Articles/230975/
* Proportional set size: https://en.wikipedia.org/wiki/Proportional_set_size
* USS, PSS, RSS: https://stackoverflow.com/questions/131303/how-to-measure-actual-memory-usage-of-an-application-or-process/13754307#13754307
* Get chrome's total memory usage: https://unix.stackexchange.com/questions/288589/get-chromes-total-memory-usage
* cgroup で制限する: https://gist.github.com/juanje/9861623
* --single-process で単一プロセスで動かす
* chrome://system/ にも mem_usage がある (詳細不明)
    * https://chromium.googlesource.com/chromium/src/+/master/docs/memory-infra/probe-gpu.md
    * https://chromium.googlesource.com/chromium/src/+/master/docs/memory-infra/probe-cc.md
AWS 認定ソリューションアーキテクト - プロフェッショナル を受験した感想

先日、AWS 認定ソリューションアーキテクト – プロフェッショナル　を受験してきました。

結果は残念ながらの不合格ですが、今後受験する人の参考になればと簡単に試験の内容と対策などをまとめられたらと思います。

# 試験概要
詳細な内容は [公式サイト](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)にあるのですが、簡単にまとめると、AWS の各サービスを使って、高い可用性・耐障害性なアーキテクチャを与えられた要件に基づいて選択・設計できるかを確認する試験です。

# 勉強期間
1ヶ月ぐらいです。
だいたい仕事の前と終わり、土日は気が向いたら喫茶店とかで勉強するスタイルでした。

# 勉強法
この資格の一番辛いところは参考書がないとこです。
そのため、AWSが提供している、ホワイトペーパーだったり、BlackBelt、各サービスのドキュメントを中心に読み込みつつ、デザインパターン周りの本を読んで各サービスの仕様と使い所を覚えていきました。

その他にサンプル問題と模擬試験も合わせて受験し、実際にどういった問題や時間配分で問題を解いていけばいいかも確認。


- [AWS ホワイトペーパー](https://aws.amazon.com/jp/whitepapers/)
- [AWS クラウドサービス活用資料集](https://aws.amazon.com/jp/aws-jp-introduction/)
- [AWS ドキュメント](https://aws.amazon.com/jp/documentation/)
- [Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版](https://www.amazon.co.jp/dp/4822237443)
- [Amazon Web Services クラウドデザインパターン実装ガイド 改訂版](https://www.amazon.co.jp/dp/4822277364)
- [Amazon Web Services クラウドデザインパターン設計ガイド 改訂版](https://www.amazon.co.jp/dp/4822277372)

# 試験当日
当日は早めに試験会場付近の喫茶店に到着して、軽く復習してからのレッドブルで頭をキレキレにして試験に臨みました。


# 試験結果
```
総合スコア: 53% 

トピックレベルのスコア: 

1.0 High Availability and Business Continuity: 58% 

2.0 Costing: 50% 

3.0 Deployment Management: 62% 

4.0 Network Design: 50% 

5.0 Data Storage: 58% 

6.0 Security: 43% 

7.0 Scalability & Elasticity: 53% 

8.0 Cloud Migration & Hybrid Architecture: 57% 
```
どの分野も平均的に 50% ですが、よく見るとデプロイ周りが他より少しできているのは、実際に業務でデプロイ関連のサービスを使ったことがあるのが要因の一つかもしれません。

ちなみに、合格ラインに関してはAWS側からは特別公表していないようなので正確な合格ラインはわからないのですが、いろんな人の受験したブログや記事を読むとどうやら 65% あたりが合格ラインのようです。

# 試験の振り返り
試験内容は模擬試験とほぼ変わらず（似た問題もチラホラ）、択一選択問題、複数選択問題、状況把握問題となっていて、内容も各AWSサービスの詳細な仕様を問うのではなく、その仕様を理解した上で、求められている課題をどうやって解決できるのかを問う問題ばかりでした。そこは、やはりアソシエイトの試験とは大きく違うところだと思います。

その他に試験全体の傾向として、オンプレとAWSの連携が絡む問題が多く (VPNやダイレクトコネクトなど)、ネットワークの知識が弱いと少し苦戦する印象でした。- 自分がそう(悲)

# まとめ
なんでもそうですが、結果ではなくそこに到達する過程が大事だと思っています。(言い聞かせてます)
不合格になってしまったのは気持ち的にも金銭的にもかなり辛いですが、また機会があればリベンジして合格を勝ち取りたいと思います。
rubyxlで作成したエクセルシートに2枚目のシートを追加する

忘れる度にググっているので時短と備忘録のために書き残しておく。

```save_items_into_xlsx.ruby
item_book = RubyXL::Workbook.new
item_sheet = item_book[0]
item_sheet2 = item_book.add_worksheet("Sheet2")
```

`item_book.addworksheet("sheet_name")`で追加可能。
社会人1年目がJavaBronze受験の仕方をまとめてみた

__2017/06/01 時点の情報です。__

# はじめに(読み飛ばしてもいいよ)
* Qiita初投稿です。

* これはJavaBronzeをはじめて受けた人(ベンダー系の試験初めてオンラインで受けたのも初めて)が受験の仕方をてきとーに書いてるやつです。(受験の仕方が一番難しかったので)

* 受ける前にコケるとモチベががっつり減るので落ち着いてやろう！

* 基本的に、参考サイトを参考にまとめただけなので参考サイトに飛んだほうが時間の節約になるかもね。

* パスワードとユーザIDは何回も入力するから、ちゃんと管理しようね！

* かかった費用は1万7000円くらい(参考書1冊、チケット1枚)

# 参考サイト
参考にしたサイトは上のほうに書いたほうが個人的に見やすいので上に書いてます。

[全体の参考になるサイト](http://zze128.blog9.fc2.com/blog-entry-359.html)
[オラクルのキャンペーン情報 割引とか再試験無料とか](http://www.oracle.com/jp/education/campaign-1898205-ja.html#20161122)

# 全体の流れ
受験日より前にやるのが1~4
受験にやるのが5~6
受ける気があるならとりあえず1~4は今すぐやってしまうと良いです。

1. Oracleのユーザ登録を行う
[オラクル](http://www.oracle.com/jp/index.html)
30分以内に登録しないとセッションが切れて最初からの入力になる
英語で入力しろとか言われるけどグーグル翻訳に任せよう！

2. ピアソンのユーザ登録を行う
[ピアソン](http://www.pearsonvue.com/japan/IT/oracle_index.html)
30分以内に…

3. オラクル認定システム(CertView)の初回認証を行う
[CertViewの初回認証](https://education.oracle.com/pls/eval-eddap-dcd/ocp_interface.ocp_candidate_login?p_include=Y&p_org_id=70&p_lang=JA)
3回失敗すると電話しないとダメとかなんとか
友人は電話した挙句、3営業日待つはめに…
1回間違えたら、一日待ちましょう。

4. 受験用チケット(バウチャー)を購入する
[楽天](http://item.rakuten.co.jp/it-test/137325/?scid=af_pc_etc&sc2id=af_103_0_10000991)で買いました。
オラクルより安かったです。

5. 試験予約・受験
[ここ](http://www.pearsonvue.com/japan/IT/oracle_index.html)で受験できます。
[オラクルのキャンペーン情報](http://www.oracle.com/jp/education/campaign-1898205-ja.html#20161122)確認をした方が良いです。
途中のバウチャー入力のところで、楽天で買ったコードとキャンペーンのバウチャーコードを入れます。

6. オラクル認定システム(CertView)で合否確認
10分ほどでメールがくるのでメールの下のほうの__こちら__から飛ぶ
(メールもごちゃごちゃしてて見にくい)
オラクルのサイトに飛ばされるのでログインして合否確認する。

# 参考書
買いましょう。2回受けるより安いです。

## 参考書の種類
[黒本](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-Java-Bronze-%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-814/dp/4844338293/ref=pd_sim_14_3?_encoding=UTF8&psc=1&refRID=V8YXD8Q31KWWAG4XC40A)で間違いないです。
黒本を買いました。

[白本](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Bronze-SE-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86/dp/4798142727/ref=pd_sim_14_4?_encoding=UTF8&psc=1&refRID=BCD86DY02J9FFD813N1C)と[紫本](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Bronze-SE-%E5%B1%B1%E6%9C%AC/dp/4798142719/ref=pd_sim_14_1?_encoding=UTF8&psc=1&refRID=DAJZYFCHEE5V9QV23RXR)は、内容は網羅しているが書いてることが難しいです。
Bronzeなら安定の黒本を買うことをおすすめします。

## Bronzeなら古本利用で節約可能
Bronzeなら古本でも別に良いと思います。
実は現行の試験であるJava SE 7/8 Bronze(1z0-814)は内容的には、
前バージョンのJava SE 7(1z0-802)と全く同じなので、SE 7対応で安くなっている古本が使えます！
(Silver以上は内容が変わっているので最新版が必要)

# 受けた感想
問題が意地悪で好きではなかったのですが、資格は大事だと思います。
これを見た人が受かってくれたら嬉しいです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/182357/ff97d15b-74c7-e4d5-f9c8-ff4a4266aa5c.jpeg" width="70%">
【小ネタ】Docker17.06以上からAmazon ECRへのdockerログインコマンドが変わった


AWSから案内が来ているが、Dockerエンジンの17.06以降からECR(Amazon EC2 Container Registry)へのdocker loginのコマンドが変わったので簡単なメモ

docker for macのstableが17.06になったのでそこそこ需要ありそう。

## 要約

- Emailのオプション(-e)が必須になったので、つけない場合は明示的に[--no-include-email]をつけてねって話

## dockerバージョンの確認

```
$ docker --version
Docker version 17.06.0-ce, build 02c1d87
```

## ECRへのログイン

```
##17.05以下のコマンド $は式展開なので必要です
##これまでのコマンドだとemailフラグないと怒られます
$(aws ecr get-login --region ap-northeast-1)
unknown shorthand flag: 'e' in -e
See 'docker login --help'.


##17.06以上
##これでOK --no-include-emailが必要
$(aws ecr get-login --region ap-northeast-1 --no-include-email)

```
Raspberry Pi でボタンを押したら静止画を撮る

ラズパイはModel B+ V1.2を使用。
USBカメラはELECOM UCAM-C0220FBWHを用いましたが、~~基本的に何でも良さそう。~~
（追記：UVC対応である必要があるそうです）

「ラズパイのGPIOピンを用いて、外部ボタンが押されたら、写真を撮る」ということを目指します。

USBカメラの設定＆とりあえず撮ってみる
--
まずはUSBカメラをつなぎ、ちゃんと認識されているか確かめます。
```$ lsusb```
このコマンドでUSBポートの一覧が表示されます。
続いて、fswebcamのインポートをします。
```$ sudo apt-get install fswebcam```
そして、静止画を取ってみましょう。
```$ fswebcam image.jpg```
![image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/184212/93e30caa-a835-1e21-028b-c8effa100e27.jpeg)

下の赤いバナーを消したいときは以下のようにします。
```$ fswebcam --no-banner image.img```


シャッターボタンを押したら写真撮影
--
まず前準備。外部ボタンをラズパイのGPIOピンに接続します。
プルダウンをして、普段は０(0V)押されると１(3V)を返すようにします。
今回はGPIO17ピンを用いました。

そしてシェルスクリプト(下に全文載せてあるのでそれも参考におねがいします)
まずはデジタル入力設定。これにより、このピンは0か1どちらの電圧になっているのか読み取ることができるようになります。
```gpio -g mode 17 in```
実際の読み取りは以下のコマンドでできます。
```gpio -g read 17```
これが１となった時、任意のディレクトリを指定して、以下のコマンドを実行すれば写真を撮ることができます
```sudo fswebcam /home/photo/image.jpg```

実行
--
プログラムを実行可能なパーミッションにする必要があります。
```$ chmod 755 hoge.sh```
その後実行です。
```$ ./hoge.sh```
これでボタンを押せば写真が撮れます！


プログラム全文
--
```sh:hoge.sh
#!/bin/sh
port=17

SAVEDIR="/home/pi/Photo"
gpio -g mode $port in

name="/image.jpg"
mkdir -p $SAVEDIR
echo "はじめ"

while true ; do
 btn=`gpio -g read $port`
 if [ $btn -eq 1 ] ; then
  echo "ok"
  sudo fswebcam --no-banner $SAVEDIR$name
  sleep 2
 fi

done
```
【JavaScript】getElementsByClassName() メソッドでハマった件


###なぜ？
何気なく``getElementsByClassName()``メソッドを利用して、
任意のクラス名を含む全ての要素を取得した後に、反復処理を行おうと思ったのですが、、、
あれ？動かない？

```js:動作しなかったコード
var checkBoxes = document.getElementsByClassName("checkBox");
for(var key in checkBoxes){
	if(checkBoxes[key].classList.contains("checked")){
		checkBoxes[key].checked = true;
	}
}

```

盛大に勘違いしていたのですが、
``getElementsByClassName()``メソッドが返す値は配列だと思っていたら、実は違った！
``getElementsByClassName()``は、配列に似ていますが実際には配列ではない**HTMLcollection**オブジェクトを返します。
配列ではないので、例えばforEachみたいな便利な配列メソッドを呼び出すことはできません。
また、 for/inを使用して**HTMLCollection**を反復処理することはできません。
(※現在のブラウザ環境では動作するみたいです。)

自分の環境では、for/inを使用した反復処理は動作したのですが、
**HTMLCollection**はclassListプロパティを持たないので、要素に紐付いたclass属性のリストを返す``element.classList``が使用できませんでした。

###解決策
Array.prototypeを利用する

```js:配列に変換
var checkBoxes = document.getElementsByClassName("checkBox");
var array = Array.prototype.slice.call(checkBoxes);//配列に変換

```

上記のようにArray.prototypeを使い配列に変換することで、解決しました。

ちなみに
``getElementsByClassName()``は、Internet Explorer8以下、Firefox2以下のブラウザでは使えないそうです。



###まとめ
- ``getElementsByClassName()``メソッドが返す値は配列ではなく、HTMLCollection
- HTMLCollectionは配列系のメソッドが使用できない


普段、jQueryを使い慣れているせいなのか、
JavaScriptでDOM操作するとつまづくことが多い...
目指せ！脱jQuery化！
openCV3 をインストールしてシンボリックリンク張ったのに "import cv2" すると "No module named 'cv2'" って出たときの対処

## 背景

[こちら](http://qiita.com/aidy91614/items/d58af61c77746d529c78)に書いたように、openCV3 をインストールできたのはいいんですが、シンボリックリンクを愚直に貼ると `import cv2` できなかったので、その解決方法をメモとして残します。

## エラーが出た方法

```
ln -s /usr/local/Cellar/opencv3/3.2.0/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so ~/.pyenv/versions/3.5.3/lib/python3.5/site-packages
```

これをしてから `import cv2` すると...

```python
> ipython
In [1]: import cv2
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-72fbbcfe2587> in <module>()
----> 1 import cv2

ImportError: No module named 'cv2'
```

こうなります。

## 解決方法

```
ln -s /usr/local/Cellar/opencv3/3.2.0/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so ~/.pyenv/versions/3.5.3/lib/python3.5/site-packages/cv2.so
```

リンク先の名前をちゃんと `cv2.so` にしたら解決しました。
markdown-modeで折りたたみ


# はじめに

[markdown-mode](http://jblevins.org/projects/markdown-mode/)には、org-modeのような、セクションごとの折りたたみ機能がついています。

しかし、折りたたみに使用する関数(`markdown-cycle`)は、デフォルトではタブキーにバインドされており、グローバルなキーバインドと重複していて気が付きませんでした。
（私の場合、タブキーは`indent-according-to-mode`に割り当てていました）

そのせいで、markdown-modeってorg-modeよりだいぶ使いにくなーと思ってしまっていました。それでちょっと調べた結果を記しておきます。

# 折りたたみの関数とキーバインド

|関数|説明|デフォルトキーバインド|
|----|---|---|
|markdown-cycle|Visibility cycling for Markdown mode.|<kbd>Tab</kbd>|
|markdown-shifttab|Global visibility cycling.Calls ‘markdown-cycle’ with argument t.|<kbd>Shift-Tab</kbd>|

# 設定

最終的に、`markdown-mode-map`に明示的に割り当てるようにしました。ついでに、次の見出しに飛ぶ設定もいれました。

```el
(use-package markdown-mode
  :init
  (bind-keys :map markdown-mode-map
             ("<Tab>" . markdown-cycle)
             ("<S-tab>" . markdown-shifttab)
             ("C-M-n" . outline-next-visible-heading)
             ("C-M-p" . outline-previous-visible-heading)))
```
openCV 3 のインストールで "Error: opencv3: Does not support building both Python 2 and 3 wrappers" というエラーが出たときの対処

## 背景

[PaintsChainer](https://github.com/pfnet/PaintsChainer) を動かすために opneCV3 を Mac にインストールしようとしたときにエラーが出て、調べても日本語記事がなかったのでメモとして残します。

## バージョン

- macOS Sierra 10.12.5
- Homebrew 1.2.4

## エラーが出るコマンド

```
brew install opencv3 --with-python3

...

Error: opencv3: Does not support building both Python 2 and 3 wrappers
```

## 解決方法

詳細: [install opencv3 on mac for python 3.6](https://stackoverflow.com/questions/43666806/install-opencv3-on-mac-for-python-3-6)

```
brew install opencv3 --with-python3 --without-python
```

`--without-python` が必要でした。

エラー内容からわかるように、python と python3 のどちらか用にしかインストール出来ないよとのことでしょう。
今回は python3 で使うためにインストールしたかったので、 `--without-python` を付けて解決しました。
AndroidでNativeScriptアプリがデバッグ起動できないときに確認すること

NativeScriptのpackage.jsonでアプリIDを変えたら、
```tns run android``` しても、Android端末上で開発中アプリが起動しなくなった。

```json:package.json
  "nativescript": {
    "id": "org.nativescript.Groceries",
```

対処方法は、 app.gradleの applicationId を新しいIDに変更すること。↓

```groovy:app/App_Resources/Android/app.gradle
android {  
  defaultConfig {  
    generatedDensities = []
    applicationId = "org.nativescript.Groceries" 
    
```

参考
https://github.com/NativeScript/nativescript-cli/issues/2092
運用をAgileでやってみる

# 運用作業を楽しく(アジャイルで)やる仕組みを考えてみた

まず開発手法の特徴について簡単に書いておきます。

- Agile
    - 予定は、開発サイクル単位で状況に応じて見直す(スプリント) 
    - スプリント単位でサイクルを回して開発
    - スプリントで区切ることで、チームの開発速度が分かったり、振り返りのタイミングがセットしやすい

- ウォーターフォール
    - 予定は、要件定義〜リリースまですべて最初にたてる
    - 先行き不透明な部分があっても、見積もり担当や現場技術者の経験を元に計画を立てる
    - スケジュールから遅れるとすぐに分かる。

##  運用をAgileでやってみた感想

・使用したツール
- メッセンジャー(HipChat)
- タスク管理(JIRA)

*※ここでの運用作業は、社内システム関連プロジェクトでの運用例になります。toCなどのプロジェクトではちょっとまた違ってくると思います。
運用タスク例
システム障害調査、機能拡張見積もり、データパッチ、データ抽出、データ一括更新、ライブラリ等のバージョンアップ など*

1. 事前準備(タスク発生を検知できる仕組みづくり)
    1. ユーザが自分で起票できるJIRA(カンバン)を作成
    2. ユーザがカンバンに起票したらHipchatに通知が行くように設定
     
2. 以下を随時タスクがきたタイミングで行う
    1. 運用タスクに完了日を設定
    2. スプリントにタスクをいれていく
    3. 突発作業などがはいって消化できなさそうなときは、チームメンバやあるいは運用作業の完了日の調整を行う。
 
**運用をなぜAgile？**
タスクが少ないうちはカンバンでの管理で十分。タスク量が多くなってくると以下の問題が生じる。

- 管理できなくなる:anguished:  
タスクが埋もれたり、何からやればいいのか、同じタスクがある etc..  
- 運用担当者の精神的負担:anguished:  
タスクが山ほどあるとそのタスク全てを消化できる気がしない・・・・

上記問題の対策として、カンバンでの管理も行いつつ、それとは別でスプリント単位に落として対応していくことで、目先のターゲットを明確にできる:grinning: 
運用作業は終わりが見えなかったりするのでしんどいこともありましたが、
Agileで回すようにしてからは、チーム内のモチベーションもあがり効率的にタスクを消化できるようになりました。根本解決は、運用が発生しないシステムづくりですが、そこに向かうための入り口としてこういうやり方もあるという参考になればいいと思います。
UbuntuをUSBメモリからブートさせる

結構苦戦したのでメモ程度にまとめておく．
後述の通り，MBRが破壊されることがある．全てのケースでこの方法で修復できるのかは知らないので，やるときは注意．

#USBメモリにUbuntuをインストール
・USBメモリが二つ必要　最終的にUbuntuを入れたいUSBと，インストール用に一時的に必要なUSB

・Rufusを使ってUbuntuのイメージをUSBメモリに入れる
　https://www.glamenv-septzen.net/view/1411

・BIOSの設定をいじって，USBから優先起動するようにする

・USBさしてPC起動し，Ubuntuを試すを選択．

・パーティション一つ作る
　https://kledgeb.blogspot.jp/2016/04/ubuntu-1604-43-uefihddubuntu.html

・Ubuntuを指示通りインストール．ただしアクセス数が多くなるらしいのでswap領域は作らなかった．
　https://eng-entrance.com/ubuntu-install


#grubを入れる
・Ubuntuを入れたこのUSBはブートできるPCとできないPCがあった．grubを入れると確実にブートできるようになる．

・UEFIはwindows用．PCによってはBIOSでUEFIでの起動を無効にしないといけない場合がある．

・gdiskコマンドでbios-bootパーティション作る
　https://www.miraclelinux.com/tech-blog/qwi8ni
　gdiskコマンドの使い方．fdiskコマンドと大体同じ？
　https://www.express.nec.co.jp/linux/distributions/knowledge/system/fdisk.html
　w押さないと保存されないこと，codeをLコマンドで確認する必要があることに注意

・boot-repairコマンドでgrub入れる
　http://tylerhandstone.hateblo.jp/entry/2014/05/06/182839


#MBR修復
・grubをUSBに入れるとき，なぜかHDDのMBRが破壊された．
　意味わからんがUbuntuによってこうなる報告が他にもあるようだ．

・RufusでUSBにwindowsのイメージを入れて，そのUSBからブート．
　「It looks like you started an upgrade and booted from installation media.
　　If you want to continue with the upgrade,remove the media from your PC and click Yes.
　　If you want to perform a clean installation instead,click No.」
　とか
　「アップグレードを開始し、インストールメディアから起動したようです。
　　アップグレードを続行する場合は、PCからメディアを取り出し、[はい]をク
　　リックします。クリーンインストールを実行する場合は、[いいえ]をクリックします。」
　とか表示されるが，ここでEscを押す．(ここで詰まった．)
　あとはこのサイト通りやるとMBRが修復されて正しく動くようになる．
　http://blog.ii-tripod.com/?eid=1181776


雑なまとめになりました
間違い等あればお願いします


#追記 (2017/07/10)
boot-repairで，grubを入れるデバイスを設定できるらしい．
それを正しく設定すればMBRは破壊されなかったかも．
composerを使ったcakephpのバージョンアップ 

# 環境

ローカル開発で、vagrant。
本番環境で別のサーバーがあり、githubを利用しているケース

# 使うコマンド

`composer install`
`composer update`

# 流れ

composer.jsonのバージョンを書き換える。現在のcakephpの最新バージョンに合わせて下記部分を変えれば良い。

` "cakephp/cakephp": "3.3.*"`

そのあと、

__vagrantにおいて `composer update`__

composer.lockを更新する。

jsonとlockのファイルをgithubでコミットする。

__本番環境において `composer install`__

コミットされたcomposer.lockとcomposer.jsonに基づき、
パッケージをインストールする。
本番ではバージョン固定のため、コマンドはupdateではなくinstallが良い。
updateだと、composer.lockの内容が変わってしまうため、composer.lockは、バージョンアップする時だけ変更するのが良いと思います。
circleCI等の自動ツールで、デプロイするたびに、installしているケースも多いので基本はこの流れです。

自動ツールがないケースなら、バージョンアップしたい時だけ、コマンド使いupdateして、一発でlockファイルも変更するのもありですが。安全に事を運ぶなら、.jsonと.lockファイルをgitでコミットしたあとに、それらのファイルに基づき、本番ではinstallをした方が無難かもしれません。

# 参考サイト

http://qiita.com/notona/items/c5a087d8dd446d315e6e
以下参考サイトより抜粋

### コマンドcomposer install

composer.lock があればそれに基づいてパッケージをインストールし
なければ composer.json に基づいてパッケージをインストールした後に composer.lock を作成

###コマンドcomposer update

パッケージのインストールと composer.lock の更新

書き方の逆を取ると、jsonなくてもいいように見受けられますが、
jsonがないってことはそもそもありえなく。オートロードとかもできないし、初期状態でないっていうことがおそらくないのかなと思います。
【Rails】カラムの組み合わせに一意性を持たせる

# 対象者
複数カラムをセットにして複合的にuniquenessバリデーションをかけたい人
# 環境
Ruby 2.4.1
Rails 5.0.2
#実装

```user.rb
class User < ActiveRecord::Base
  validates :name,  uniquness: { scope: [:email, :pass]  }
end
```


```name: 'tanaka',email: 't.com', pass: 'tktk'```
というユーザーが既にいる場合Validation結果は以下になる

OK
```name: 'tanaka',email: 't.com', pass: 'aaaa'```
NG
```name: 'tanaka',email: 't.com', pass: 'tktk'```
webpackとかKarmaとかの設定ファイルをTypeScriptでかく

## 構成

こんな感じの環境を作っています。

+ TypeScript
+ webpack
+ Jasmine
+ Karma

あと **karma-coverage** とかものせてます。

## 設定ファイルもTSで書きたい

設定ファイルだけJavaScriptで書くのもなんとなく癪なので、TypeScriptで型チェックしていきます。

## webpack.config.ts

[公式](https://webpack.js.org/configuration/configuration-languages/#typescript)で、ちゃんとできるよ！っていうガイドを用意してくれています。
[Qiitaの記事](http://qiita.com/sathoshi-metal/items/b9ce118cca9b75b2e0a9)を書いてる方もいました。

ということで割愛します。実際に行った作業は以下の３つです。

+ ts-nodeのインストール
+ ＠types/webpackのインストール
+ webpack.config.tsの作成

## karma.conf.ts

こちらも公式で触れられています。  
https://karma-runner.github.io/1.0/config/configuration-file.html

しかし、この公式のサンプルだと型チェックがちゃんとされていない（configがany型）
ので、その辺きちんとしていきたいところです。

### configの型を明示してみる

＠types経由でkarmaの型情報を取得して、指定してみます。

```sh
npm install --save-dev @types/karma
```

```karma.conf.ts
import { Config } from "karma";

function setConfig(config: Config): void {
    config.set({
        // 各種設定
    });
}

export default setConfig;
```

これで型チェックが利くようになったわけですが、
karma-webpackの `webpack` プロパティや、karma-coverage用の `coverageReporter` プロパティなどを記述すると、コンパイルエラー吐いて死にます。
これらはプラグインをインストールした状態でのみ有効になるオプションなので、まあ当たり前ですね。

### config用のinterfaceを調整する

karma-coverageの方の型情報はDTにあるのでもらってきます。

```sh
npm install --save-dev @types/karma-coverage
```

karma-webpackの方は、DTになかったので適当に定義します。

```karma.conf.ts
import * as karma from "karma";
import * as webpack from "webpack";
import * as karmaCoverage from "karma-coverage";

namespace karmaWebpack {
    export interface ConfigOptions extends karma.ConfigOptions {
        // webpack.config用の型だいたいそのまんま
        webpack: webpack.Configuration;
    }
}
```

これらを利用して、当プロジェクト用の設定ファイルの型を明らかにします。

```karma.conf.ts
/**
 * karma-coverageとkarma-webpackを有効にした状態での設定用の型
 */
interface PluggedConfig extends karma.Config {
    set: (config: karmaCoverage.ConfigOptions & karmaWebpack.ConfigOptions);
}
```

configの型として指定してやります。

```karma.conf.ts
function setConfig(config: PluggedConfig): void {
    config.set({
        // 各種設定
    });
}

export default setConfig;
```

これでオッケーなはず！

## ソース

[Gist](https://gist.github.com/Huruikagi/0eaf20bf348422ec8d7aa8f10ecee956)に上げました。

TSLintとかの設定も入ってるので、ごちゃごちゃしていますが。

## まとめ

webpackの方はかなりお手軽なので、TSで書いちゃえばいいんじゃないかと思います。

karmaは、これ、型定義をもうちょっと使いやすい感じにできる気がしますね。
そもそもkarma-webpackの定義がないのが、ひと手間増えてる理由ですし。
DefinitelyTypedにこんとりびゅーとせねば……。
学習リスト

######学習言語リスト
 - Grunt
 - karma
   - http://iti.hatenablog.jp/entry/2014/08/11/163955
   - http://qiita.com/howdy39/items/b9d704e7f84053924da3
 - Frameworks: *AngularJS, SproutCore, Jasmine, Laravel*
perl - 変数宣言がループ内とループ外での実行時間の違い

原則ループ外宣言を使う派でしたが、実際の実行時間測ったこと無かったのでメモ
思っていたよりは実行時間に差が出た。

# 結論
ループ内で変数宣言する場合はループ外の場合の 1.5〜2倍 ぐらい時間がかかっていた。

# perl version
```
perl -v

This is perl 5, version 24, subversion 1 (v5.24.1) built for darwin-2level
(with 1 registered patch, see perl -V for more detail)
```

# 使用したコード
```pl:test.pl
use strict;
use warnings;
use Time::HiRes;

my $NUM = 10000000;
my @array;
foreach (0...$NUM) {
    push @array, int(rand(100));
}

my $start_time = Time::HiRes::time;
# declare out of loop
my $count1;
for (@array) {
    $count1 = $_ * 10;
}
printf("declare out of loop \t: %0.5f\n", Time::HiRes::time - $start_time);

# declare in loop
$start_time = Time::HiRes::time;
for (@array) {
    my $count2 = $_ * 10;
}
printf("declare in loop \t: %0.5f\n", Time::HiRes::time - $start_time);
```

# 結果(3回ずつ)
```text:$NUM=10000
perl test.pl
declare out of loop : 0.00037
declare in loop 	: 0.00080

perl test.pl
declare out of loop : 0.00045
declare in loop 	: 0.00075

perl test.pl
declare out of loop : 0.00046
declare in loop 	: 0.00083
```

```text:$NUM=10000000
perl test.pl
declare out of loop : 0.38353
declare in loop 	: 0.68609

perl test.pl
declare out of loop : 0.45468
declare in loop 	: 0.65201

perl test.pl
declare out of loop : 0.40082
declare in loop 	: 0.64218
```
VirtualBoxをheadless起動する

# 環境
Windows 7
VirtualBox 5.1.22 r115126 (Qt5.6.2)

# TL;DR
VMnameは `list vms` サブコマンドで確認できます。

```bat:run
VBoxManage startvm VMName --type headless
```

```bat:stop
VBoxManage controlvm VMName poweroff
```

# PATHを通す
```
C:\Program Files\Oracle\VirtualBox
```

# VM名を確認する方法
```bat
VBoxManage list vms
```

# 参照
https://schier.co/blog/2013/03/13/start-virtualbox-vm-in-headless-mode.html
RubyからXMLファイルを動的に編集する

# はじめに
ベストプラクティスでない可能性があるので、ご指摘あればコメントお願いします。

# 環境
- Ruby 2.4.1

# 編集
## 編集前XMLファイル
```test.xml
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope>
   <SOAP-ENV:Body>
      <ns1:part>
       ここを変えたい
      </ns1:part>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```
## rubyファイル
```test.rb
require 'rexml/document'

file = File.open('test.xml')
doc = REXML::Document.new(file)

element = document.elements['SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:part'] #要素を取得

element.text = nil #テキスト削除
element.add_text("編集成功！")

File.write('test.xml', document)
```
## 編集後XMLファイル
```test.xml
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope>
   <SOAP-ENV:Body>
      <ns1:part>
       編集成功！
      </ns1:part>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```
MongoDBのデータダンプとリストア

本番データでローカルテストする際によく使っているので忘れぬようにまとめました。他にも色々とオプションがあるので気になる方はhelpで確認してください

#### データダンプ

```bash
mongodump --port #{port} -d {database} -c #{collection} --out #{out} --query #{query}
```

特定のデータベースまたはコレクションのみを抽出するということでなければdオプションとcオプションは必要ありません。outオプションは出力先のディレクトリパスです。データベース/コレクション.(bson|json)が生成されます

データ量が多い場合は--queryでクエリが使えますが、extended json形式なのでISODateを直接条件にはできません

#### リストア

```bash
mongorestore --port #{port} -d #{database} -c {collection} --dir #{(dir|bson)}
```

コレクションレベルまで指定してリストアする場合はdirオプションで指定するものはディレクトリではなくbsonファイルになります(データベースも然り)

---

リストア時とダンプ時のコレクションのインデックスや設定値が異なる場合はnoIndexRestoreオプションやnoOptionsRestoreオプションを付けることでリストア時のコレクションの状態をベースにテストできますφ(..)....
macOSでIE環境を構築する

IEはmacOSで利用できないためIEに依存した不具合があった場合、不具合確認ができないため不便です。今回はVagrantを利用してmacOSでもIEを使える環境を作るための手順をまとめました。

もとネタは[ブログ](http://tackeyy.com/)の[記事](http://tackeyy.com/blog/ie11-on-macOS-with-vagrant)です。

こんな感じでIEを使えるようになります。

[![https://gyazo.com/d39bed9e08814bf81addd086bc994853](https://i.gyazo.com/d39bed9e08814bf81addd086bc994853.png)](https://gyazo.com/d39bed9e08814bf81addd086bc994853)

# こんな人におすすめ

- macOSでIE環境をサクッとつくりたい

5,10分だけとりあえずIEを触りたいという場合は、[ディスク容量と時間の無駄を防ぐ。BrowserStackでVMなしでクロスプラットフォームテスト](http://qiita.com/toruta39/items/b49f34455125f77b7f39)を試してみるのが良さそうです。
（先輩にこちらの記事を教えていただきました :pray: ）

# 確認環境

```
macOS Sierra 10.12.5
$ vagrant -v 
Vagrant 1.9.5
```

# Vagrantインストール

Vagrantをインストールしていない場合はインストールしてください。

```
$ brew cask install virtualbox
$ brew cask install vagrant
```

# Windows81のVagrant Box追加 & 初期化

```
$ vagrant box add win81 http://aka.ms/vagrant-win81-ie11
```

http://www.vagrantbox.es/

* ネット環境にもよると思いますが、私の環境ではだいたい1.5h程度かかりました・・・


```
$ vagrant init app_name
```

複数のバージョンのIEを使うこともあるともうので ` app_name ` は ` wi81 ` とかにしとくのが良さそうです。

` Vagrantfile ` が作成されるので以下を追記してください。

```
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
+  config.vm.provider "virtualbox" do |vb|
+    vb.gui = true
+  end
+
+  config.vm.guest = :windows
+  config.vm.communicator = "winrm"
+  config.vm.network :forwarded_port, guest: 3389, host: 3389
end
```

# Windows81を起動

` $ vagrant up `

こんな感じで起動できればOKです。

[![https://gyazo.com/7a42a9c3ce3b48577ba5efc03c1e4dae](https://i.gyazo.com/7a42a9c3ce3b48577ba5efc03c1e4dae.png)](https://gyazo.com/7a42a9c3ce3b48577ba5efc03c1e4dae)

# 参考にしたサイト

http://www.vagrantbox.es/
http://dackdive.hateblo.jp/entry/2016/03/11/094501
VMware Workstation Playerをheadless起動する

# 環境
Windows 7
VMware Workstation Player 12.5.5

# TL;DR
以下のbatファイルを作ればよい

```bat:run
vmrun -T player start X:\path\to\foo.vmx nogui
```

```bat:stop
vmrun -T player stop X:\path\to\foo.vmx nogui
```

# PATHを通す
`;` 区切りなのでスペースが合っても大丈夫みたいです。

```
C:\Program Files (x86)\VMware\VMware Workstation
```

# 起動中のVMリスト確認方法
```
vmrun list
```

# 参照
http://xmodulo.com/how-to-launch-vmware-player-vms-without-gui.html
【SourceTree】一度pushしてしまったファイルをリモートリポジトリから削除してgitignoreする方法

wordpressのwp-config.phpやuploadsフォルダなどpushした後にやっぱりリモートリポジトリから外したい場合があると思います。
しかし、一度pushしてしまった後、.gitignoreして再度pushしてもリモートリポジトリ上には残ってしまいます。

SourceTree上でリモートリポジトリから対象ファイルを削除しつつ、ローカルリポジトリ上からコミット対象外にする方法を紹介します。

#ファイルステータスを表示後、プルダウンから「全て表示」を選択
![SourceTree_fig2.png](https://qiita-image-store.s3.amazonaws.com/0/190456/84c5ecae-0499-e245-7720-b3e810597079.png)


#対象のファイルを右クリックで「追跡を停止する」を選択
![SourceTree_fig1.png](https://qiita-image-store.s3.amazonaws.com/0/190456/9c03d453-792f-7800-1537-aeca38413c2b.png)


変更内容をpushするとリモートリポジトリ上から削除対象ファイルが削除されます
あとは.gitignoreに対象ファイルを記載して完了です
docker内のnginxのログにクライアントのIPv6アドレスを記録させる

# はじめに

ホストOSのLinux上にdockerで構築したサービスがあります。フロントで待ち受けているのはnginx。ネットワークモードはbridgeで80番と443番ポートをexposeしています。

このnginxをIPv6化すなわちネイティブのIPv6で接続できるようにしようと思い、以下の作業を行いました。

- OS側にプロバイダからもらったIPv6アドレスを設定。debianなので/etc/network/interfacesに設定しました。
- DNSのAAAAレコードに上記アドレスを設定
- nginxの設定ファイルで `::` でもlistenするようにする。

```nginx
listen       443;
listen       [::]:443 ipv6only=on;
```

実はこれだけでIPv6でふつうに接続できるようになります。確認するには以下のように curl に '-6' オプションをつけます。

```shell-session
curl -6 https://some_url/
```

しかしひとつ大きな問題があります。IPv6で通信した時はクライアントのIPv6アドレスが記録されるかわりにこのネットワークのIPv4アドレスが固定で記録されてしまうのです。もちろんIPv4では正常にクライアントのアドレスが記録されます。

これは実運用を考えると致命的です。この問題を解決するためにいろいろ調べてみました。

# dockerの設定

上記の状態ではdockerのネットワークもコンテナもIPv4オンリーで動作しています。実は、docker-proxyというエージェントがホストで動いてIPv6の接続を待ち受け、IPv4に変換してコンテナに転送してくれているからIPv6でもつながるのです。だからアドレスが変わってしまうわけです。docker-proxyを介さずダイレクトにつながるようにすればこの問題は解決します。

調べた範囲で方法は2つあります。

1. dockerのネットワークとコンテナをIPv6に対応させ、そこにforwardしてあげる。
2. nginxのネットワークモードをbridgeではなくhostにしてダイレクトに接続を待ち受けるようにする。

2が圧倒的に簡単ですが、dockerの流儀から若干はずれる気がして1でがんばろうとしてみました。結論をいうと最終的には2を採用しました。

ただ、1も可能なことは確認しました。せっかくなので1の手順を簡単に示しておきます。

## dockerネットワークのIPv6対応

公式サイトの[IPv6 with Docker](https://docs.docker.com/engine/userguide/networking/default_network/ipv6/)を参照しました。dockerd の起動時に以下のようにオプションを指定するといいと書いてあります。

```shell-session
dockerd --ipv6 --fixed-cidr-v6="2001:db8:1::/64"
```

2つ注意点があります。

- `--fixed-cidr-v6`は省略可能と書いてありますが現時点では必須です。しかも`fe80:...`のリンクローカルアドレスは指定できません。また、2001:db8 というのはドキュメントの例示用なのでプロバイダから賦与されたグローバルユニキャストアドレスかユニークローカルアドレスを指定する必要があります 。[^1]
- この設定はデフォルトのbridgeネットワーク docker0 をIPv6化する設定なので、他のネットワークを使っている場合は以下のように作成時にIPv6の設定をする必要があります（逆に上記のオプションは不要）。

```shell-session
docker network create some_network --ipv6 --subnet="2001:db8:1::/64"
```

これでIPv6の通信ができるようになりました。

## 転送設定

ホストにきたパケットをコンテナに転送するようにします。dockerのIPv4側はiptablesを使って転送の設定をしています。IPv6も同様にしてみましょう。転送先のコンテナのIPv6アドレスを`2001:db8:1::4`とします。

```shell-session
sudo /sbin/ip6tables -t nat -I PREROUTING -p tcp  -m multiport --dport 80,443  -j DNAT --to-destination 2001:db8:1::4
sudo /sbin/ip6tables -t nat -I OUTPUT -p tcp  -m multiport --dport 80,443  -j DNAT --to-destination 2001:db8:1::4
sudo /sbin/ip6tables -t nat -I POSTROUTING -s 2001:db8:1::/64 -o eth0 -j MASQUERADE
```

# まとめ

これで一応クライアントのIPv6アドレスが記録できるようになりました [^2] 。ただ、デフォルトだとコンテナのアドレスは起動時に動的に変わる可能性があるので、固定するか、あるいはdockerの再起動ごとに毎回なんらかの方法で取得してip6tablesを設定する必要が出てきます。

docker非標準の方法でそこまでがんばることに嫌気がさしてきて、結局hostネットワークを使う方法を採用してしまいました。dockerがいつの日か標準で対応してくれるのを待ちたいと思います。

# 脚注

[^1]: ぼくの場合はSakuraのVPSというサービスを利用していて、付与されているグローバルユニークアドレスはひとつだけでした。必然的にグローバルユニークアドレスを使うことになりました。

[^2]: これは最低限必要な設定を抜き出しただけなので、ip6tables全体でちゃんとセキュリティや整合性を考慮した設定をしてあげる必要があります。
three.js(r69)で線の太さがWindowsで効かないってば！

[直方体 (5) | three.js](http://labo.project-nya.jp/threejs/cuboid5/)

|Chrome(Mac)で見たLine|Chrome(Windows)で見たLine|
|:---------------------|:----------------------|
|![threejs_cuboid6_line5_mac.png](https://qiita-image-store.s3.amazonaws.com/0/2549/202ec18a-865d-a87c-a0f3-8516733bfe19.png)|![threejs_cuboid6_line5_win.png](https://qiita-image-store.s3.amazonaws.com/0/2549/7627bef7-8b12-4ee8-25c2-7f0ea021b334.png)|
```js

var _geometry = new THREE.BoxGeometry(200, 150, 250, 1, 1, 1);
var geometry = new THREE.Geometry();
geometry.vertices.push(_geometry.vertices[0]);
geometry.vertices.push(_geometry.vertices[1]);
var material = new THREE.LineBasicMaterial({color: 0x000000});
material.linewidth = 2;
var line = new THREE.Line(geometry, material);
scene.add(line);

```
Windowsでは、LineBasicMaterialのlinewidthが効かないらしい。:umbrella:



[直方体 (6) | three.js](http://labo.project-nya.jp/threejs/cuboid6/)

|Chrome(Mac)で見たCylinder|Chrome(Windows)で見たCylinder|
|:---------------------|:----------------------|
|![threejs_cuboid6_line6_mac.png](https://qiita-image-store.s3.amazonaws.com/0/2549/c5cf74d2-0a91-0486-4b26-5d81d60e5a05.png)|![threejs_cuboid6_line6_win.png](https://qiita-image-store.s3.amazonaws.com/0/2549/c2e32095-cbea-1798-c923-c5e9d0b1687f.png)|
```js

var _geometry = new THREE.BoxGeometry(200, 150, 250, 1, 1, 1);
var vertices = _geometry.vertices;
var material = new THREE.MeshBasicMaterial({side: THREE.BackSide, color: 0x000000});
var line = createLine(vertices[0], vertices[1], material);
scene.add(line);

function createLine(vector0, vector1, material) {
	var line3D, center, vector, height;
	var geometry, line;
	line3D = new THREE.Line3(vector0, vector1);
	center = line3D.center();
	vector = vector0.clone().sub(vector1);
	height = vector.length();
	geometry = new THREE.CylinderGeometry(1, 1, height, 4);
	line = new THREE.Mesh(geometry, material.clone());
	line.position.set(center.x, center.y, center.z);
	var axis, direction, rad, quaternion;
	var y_up = new THREE.Vector3(0, 1, 0);
	axis = vector.normalize();
	direction = new THREE.Vector3();
	direction.crossVectors(y_up, axis).normalize();
	rad = Math.acos(y_up.dot(axis));
	quaternion = new THREE.Quaternion();
	quaternion.setFromAxisAngle(direction, rad);
	line.rotation.setFromQuaternion(quaternion);
	return line;
}

```
AutoHotKeyでキーボードを使いやすくする

#概要
AutoHotKeyを導入してキーの割り当てを変更し、キーボードの入力スピードアップを図る
#インストール
- インストーラーのダウンロード
 - https://autohotkey.com/
- インストーラーを起動

#スクリプトの作成
- テキストエディタにて○○○.ahkファイルを新規作成
- スクリプトを記述
- 任意の場所に保存

#スクリプトの設定
```
;「無変換」でエンターキーの動作をさせる
vk1D::Send,{Blind}{Enter}
;無変換+JIKLで矢印キーの動作
vk1D & I::Send,{Blind}{Up}
vk1D & J::Send,{Blind}{Left}
vk1D & K::Send,{Blind}{Down}
vk1D & L::Send,{Blind}{Right}
vk1D & A::Send,{Blind}{Home}
vk1D & E::Send,{Blind}{End}
```
※ver.1.1.27から無変換キーが「vk1Dsc07B」→「vk1D」になったようです。
#参考サイト
- http://sato001.com/high-speed-input-keyboard

便利なスクリプトがあれば教えて下さい。
今すぐ使えるMySQLのコマンド集 - INDEXの作成

# はじめに

- [前回](http://qiita.com/neriai/items/586a8f100a7b3308c8d1)に続いて、メモとして残します。

# 参考

https://dev.mysql.com/doc/refman/5.6/ja/mysql-indexes.html

# INDEXとは

- MySQLのINDEXは、カラムが特定の値をもつレコードの迅速な検索に使用されます。
- インデックスを使用すれば、数百とか数億ものレコードが入っているテーブルから、一組のレコードを迅速に見つけて取り出すことが可能になります。
- しかし、上手く作成しないと、逆に挿入の邪魔になって遅くなることもあります。
- イメージとしては、本の索引のように用語や概念などを元に効率よく探すことのできるものです。

# 注意点

- テーブルのすべてのカラムにINDEXを作成すると書き込みの速度が低下や、データを保存するために必要な容量が増えてしまいます。
- INDEXを使用すると、検索などの性能は基本的に向上するが、容量が犠牲になります。

# 種類

## 部分的INDEX

- 性能を向上させたいが、容量もあまり犠牲にしたくないときは部分的INDEXが使えます。
- 例えば、最初の４バイトだけにINDEXを付けることができます。

```sql
ALTER TABLE books ADD INDEX (name(4))
```
## マルチカラムINDEX

- MySQLでは１つのクエリを実行するとき、１つのテーブルにつき１つのINDEXしか使用できません。
- 推測ではありますが、どちらのINDEXの方が少ない行に一致するかを判断するようです。

```sql
ALTER TABLE books ADD INDEX (last_name, first_name)
```

## ユニークINDEX

- ユニークINDEXを使用すると、クエリで一致する行を見つけるために存在するだけでなく、特定のカラムで特定の値が一度しか出現しなくなります(NULLは除く)。
- レコードを挿入または更新しようとするとき、すべての値を調べて、同じ値が既に存在しないことを確認します。

```sql
ALTER TABLE books ADD UNIQUE(name)
```

# INDEXの効果

## INDEXが使用される場合
- フィールド値を定数と比較するとき(WHERE name = "hogehoge")
- フィールド値全体でJOINするとき(WHERE a.name = b.name)
- フィールド値の範囲を求める時（「>」など）
- LIKEで文字列の先頭が固定な時
- MIN(), MAX() (複数要素INDEXの同一first fieldでsecond fieldのmin,max でも有効)
- 文字列のプレフィックスをもとにしたORDER BY, GROUP BY
- WHEREのすべてのフィールドがINDEXの一部の場合 (DBまったく参照されず)

## INDEXが使用されない場合
- LIKEがワイルドカードで始まる時
- DB全体を読んだ方が早いとMySQLが判断した時
- 通常はINDEXはORDER BYには使われない
- WHEREとORDER BYのフィールドが違う時にはどちらかしか使われない

# 全ページリンク
- [今すぐ使えるMySQLのコマンド集 - スロークエリの調査](http://qiita.com/neriai/items/586a8f100a7b3308c8d1)
- [今すぐ使えるMySQLのコマンド集 - INDEXの作成](http://qiita.com/neriai/items/63c6042da429cca881d2)
BEMの命名規則に関する注意点メモ

# はじめに
BEMについては概念が曖昧という方は、以下のリンク先がわかりやすいかもしれません。
[BEMについて少し](http://qiita.com/t-kusakabe/items/2dbffc6f583b15517633)
[BEMについてメモ](http://qiita.com/masterkey1009/items/a24fb936a5e8143fb6f4)

# 命名規則に関する注意点
BEM初心者は特に、今までどおり自己流で名前つけて、後からBEM方式で名前変えればいいやーと思っていても、後々の修正過程でエラーが出たり、HTMLそのもの構造を変えなかければならないという事態になりうるので、非常にめんどくさいので、注意すべき点を一点だけメモしておきます。


| Block            |　　　　　　　　　　　　　　　　           |
|:---------------- |:----------------- |
|                  |Element1           |
|                  |Element2           |
|                  |Element3           |
|                  |・・・           |
この形が基本形だと思います(modifirierは今回関係なかったので、省略)。

つまり、
**Block\_\_Element\_\_Element**というようにElementの下にさらにElementが来てしまうと、
**親ー子ー孫**の関係になってしまうので、これはBEMの命名規則を無視した書き方になってしまうのかと思います。

実際に書いていても階層が深くなるため、可読性が下がる気がします。

また、＆（アンパサド）を使う際にもBlock__Element__Elementの構造では、
&\_\_Element\_\_Element
と書くことになり、読みやすくした意味がなさそうな感じなってしまいます。

以上のことをふまえながら、目コピなどする際は名前の付け方を意識してはいかがでしょうか。
以上です。
今後ともご指導ご鞭撻よろしくお願いいたします。





p.s. ＆（アンパサド）ってアンドの本名みたいなものなのでしょうか。
XcodeバージョンごとのSwiftバージョンを調べる

## Xcode別に知りたい
Xcode.app配下の`usr/bin/swift`にswiftがあるので、ターミナルから`--version`をつけて呼び出せばよい。

### 調べ方
`$ /Applications/[任意のXcode.app]/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift --version`

#### 例
- Xcode
  `/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift --version`
- Xcode 7.3.1とかをインストールしてる場合
  `/Applications/Xcode 7.3.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift --version`


## Current Versionをサクッと調べる

### Swiftバージョンを調べる
`$ xcrun swift -version`

### Swiftの場所がわからなくなったら
`$ xcrun --find swift`
rxjs5.xはtypescript2.4.1だとfailする

### 0. どんなエラーか

- `ng serve`実行するとコンパイルエラー

```
Class 'Subject<T>' incorrectly extends base class 'Observable<T>'.
  Types of property 'lift' are incompatible.
    Type '<R>(operator: Operator<T, R>) => Observable<T>' is not assignable to type '<R>(operator: Operator<T, R>) => Observable<R>'.
      Type 'Observable<T>' is not assignable to type 'Observable<R>'.
        Type 'T' is not assignable to type 'R'.
```

こんな感じです。

### 1. 解決策

- typescriptをlatestから2.4.0に戻す
- `yarn add typescript@2.4.0`など。

### 2. その他

- githubのissueは多分[これ](https://github.com/ReactiveX/rxjs/issues/2539)