OmniAICreator/Qiita-1.07M huggingface dataset:
Vue.js + axiosを使ってaxiosのレスポンスから動的に画像を生成する方法

タイトルの通りですが、Vue + axiosを使って開発していた所、axiosのレスポンスから動的に画像を生成するという事で少し詰まったので共有します。


まず、axiosで返ってきた値を使ってdataで定義したimageDataをにセットします。

```
  data () {
    return {
      imageData = null
    }
  },
  mounted: function () {
    axios.get('APIのエンドポイント')
      .then(function (res) {
      　  this.imageData = res.data.image_id
      })
　 }  
```

そして次にmethodsで関数 ` create_image ` を定義します。

```
methods: {
  create_image: function () {
    return require('画像ファイルのあるPATH' + this.imageData + '.png')
  }
}
```

そして最後にtemplate側で

```
<template>
  <div>
    <img :src="create_image()">
  </div>
</template>
```
とします。

まとめると

```
<template>
  <div>
    <img :src="create_image()">
  </div>
</template>

<script>
export default {
  data () {
    return  {
      imageData = null
    }
  },
  mounted: function () {
    axios.get('APIのエンドポイント')
      .then(function (res) {
      　　　this.imageData = res.data.image_id
      })
　 },
  methods: {
    create_image: function () {
      return require('画像ファイルのあるPATH' + this.imageData + '.png')
    }
  }
}
```
となります。

また生成する画像が複数の場合は下記のようにします。

```
<template>
  <div>
    <p v-for="i in imageData" :key="image.id"><img :src="create_image(i)"></p>
  </div>
</template>

<script>
export default {
  data () {
    return  {
      imageData = []
    }
  },
  mounted: function () {
    axios.get('APIのエンドポイント')
      .then(function (res) {
      　　　this.imageData = res.data.image_id
      })
　 },
  methods: {
    create_image: function (i) {
      return require('画像ファイルのあるPATH' + i + '.png')
    }
  }
}
```

ここで１つ注意点なのですが、おそらくこのままだと正常に動作はするのですがコンソールに ` Error: Cannot find module './undefined.png' `というエラーが出ると思うので、その時は ` create_image `関数で

```
return n ? require('画像ファイルのあるPATH' + i + '.png') : ''
```
とnullチェックをすれば回避できます。

間違えてる所やもっといい書き方等があったらコメントを頂けると嬉しいです!
機械学習論文読みメモ_141

[Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentiaton](https://arxiv.org/abs/1801.04381)
本論では様々なモデルサイズのmobile modelにおいて複数のタスクでSOTAを達成可能なモデルとして
MobileNetV2を提案する。
またこの構造をobject detectionに適用したフレームワークとしてSSDLiteを提案する。
また同様にDeepLabv3へ適用したフレームワークとしてMobile DeepLabv3も提案する。
従来resnetで用いられるchannel方向がexpandedされたrepresentationによる入出力ではなく、
よりthinなbottleneck structureを入出力に持つinverted residual structureをMobileNetV2は採用する事で
Residual connection時に少ないchannel数を維持できる。
またlight weightであるdepth wise convolutionを採用している。
さらにnarrow layerにおいて非線形性をなくした事でその表現力を損なう事を防げる事を
発見した。

[Learning Deep Features for One-Classe Classification](https://arxiv.org/abs/1801.05365)
One class classificationにおけるdeep learningベースの特徴学習手法を提案する。
提案モデルはCNNに基づき既知クラス間の距離を最大化するような表現力の高い特徴空間を学習させつつ、
さらに学習時にクラス内におけるサンプルの分散を低く抑えるようにする。
本論ではこの２つの目的に対応した２つの損失関数を提案する。

[Self-Supervised Intrinsic Image Decomposition](https://arxiv.org/abs/1711.03678)
画像をいくつかの影や色合いといったinstrinsicに基づいて分解する
Intrinsic image decompositionを扱う。
この問題は曖昧性が強いため困難なタスクである。
本論では入力画像を説明する事を目的においた学習をする事で
intrinsicを抽出する手法を提案する。
提案するモデルは、画像の反射、形状、影などの予測を行う事ができる。
再構成誤差を用いた目的関数を設定する事でself-supervisedな学習を可能にする。
オレオレ流 Google Colaboratory チートシート ※随時更新※

完全な備忘録です。
ある程度まとまったら見やすい形に編集しますが、それまでは殴り書きです。
ご容赦ください。

# 知っていると便利なコマンド

## メモリの空き容量確認
```sh
!free -th #メモリ空き
```

## GPUメモリの空き確認
1. py3/GPUで１つノートブックaを開く
2. 同条件で別のノートブックbを開く
3. ノートaでpytorch実行を進めながら、ノートb下記コマンドを実行

```sh
!nvidia-smi
```

## GoogleDriveへのマウント方法
```py
from google.colab import drive
drive.mount('/content/gdrive')

# データ分析に必要なファイルを移動（対象フォルダにあるCSVを全て）
!cp ./gdrive/'My Drive'/'機械学習'/'kaggle'/'PUBG Finish Placement Prediction (Kernels Only)'/*.csv .
```

## 起動しているプロセスを削除する
```sh
!ps aux
!kill -9 591
# 591の部分は該当のプロセスIDを設定する
```
inventoryに書かれたホスト名を渡す

inventory に書かれたホスト名を使ってシェルを実行したいときに。

```inventory.
[group1]
g1-1
g1-2

[group2]
g2-1
g2-2

[group3]
g3-1
g3-2
g3-3

[servers:children]
group1

[nw:children]
group2
group3
```

```site.yml
---
- hosts: 127.0.0.1
  tasks:
  - name: execute touch
    shell: touch /var/tmp/{{ item }}
    with_items:
      - "{{ groups['all'] }}"                                                                                                 
```
PyData.tokyo One-day Conference 2018 発表資料まとめ


2018年10月20日(土)に開催された[PyData.tokyo One-day Conference 2018](https://pydatatokyo.connpass.com/event/87511/)のスライド一覧のリンクをまとめます。

# Time Table
## データ分析のための Python パフォーマンスチューニングテクニック
- [スライド](https://www.slideshare.net/atsuoishimoto/numpypython)
- [記事](https://atsuoishimoto.hatenablog.com/entry/2018/10/20/123939)

## PythonによるWikipediaを活用した自然言語処理
- [スライド](https://www.slideshare.net/ikuyamada/pythonwikipedia-120034699)
- [サンプルコード](https://github.com/ikuyamada/wikipedia-nlp)

## Pythonでマテリアルズ・インフォマティクス ～機械学習と物性・材料の融合領域～
- [スライド](https://www.slideshare.net/sfchaos/materials-informatics-and-python)

## ソニーが提供するディープラーニングの開発環境の最新情報とソニー不動産におけるビジネス現場での活用と運用
- [紹介ページ](https://sony-fudosan.com/tech/ret1.html)

## データサイエンスのワークフローを加速する為のNVIDIA GPU
## 競馬予測の苦楽
- [スライド](https://alphaimpact.jp/downloads/pydata20181020.pdf)

## Daskによる並列分散処理
- [スライド](https://speakerdeck.com/sinhrks/da-gui-mo-tetafalseji-jie-xue-xi-niokerudaskfalsehuo-yong)

## あとがき
現状ある情報のみで構成しています。
追加・訂正等が必要があるものはこちらで修正しますので
編集リクエストかコメントで教えて頂けると幸いです。
MQL5 ファイル読み書き

本記事は個人的な備忘録としての記録が主目的です。


#ファイル読み込み
```
#include <Files\File.mqh>
#include <Files\FileTxt.mqh>

CFile cfile;
CFileTxt ctxt;

// MQL5\\Files\\ 以下のフォルダ名
string wordFolder = "foldername\\";
//開くファイル名
string filename = "filename.txt";

void OnStart()
  {
//---
      
      //ファイル存在チェック
      bool exist = cfile.IsExist(wordFolder + filename, false);
      //ファイルが存在するなら
      if(exist)
      {
          //ファイル開く
          int fhandle = ctxt.Open(wordFolder + filename, FILE_READ|FILE_WRITE);
          //ファイルを開くことができたなら
          if(fhandle >= 0)
          {
              Print(filename+" : FileOpened");
              while(!ctxt.IsEnding())
              {
                  string contents = "";
                  //contentsに読み込んだ各行のデータが入る
                  contents = ctxt.ReadString();
              }
          }else
          {
              Print("File Not Opened");
          }    
      }else{
         Print("File Not Exist");
      }
          //開いたファイルを閉じる
          ctxt.Close();
          Print("File Closed");
  }
//+------------------------------------------------------------------+

```

#ファイル書き込み
```
#include <Files\File.mqh>
#include <Files\FileTxt.mqh>

CFile cfile;
CFileTxt ctxt;

void OnStart()
  {
//---
      // MQL5\\Files\\ 以下のフォルダ名
      string wordFolder = "foldername\\";
      //開くファイル名
      string filename = "filename.txt";
      
      //ファイル存在チェック
      bool exist = cfile.IsExist(wordFolder + filename, false);
      //ファイルが存在するなら
      if(exist)
      {
          //ファイル開く
          int fhandle = ctxt.Open(wordFolder + filename, FILE_READ|FILE_WRITE);
          //ファイルを開くことができたなら
          if(fhandle >= 0)
          {
              Print(filename+" : FileOpened");
              //書き出したい内容
              string text = "test";
      
              //行の終わりまで回す
              while(!ctxt.IsEnding())
              {
                  //読み込み
                  ctxt.ReadString();
              }
              //最終行なら追記
              if(ctxt.IsEnding()){
                 //File書き出し
                 string byte = ctxt.WriteString("\n"+text);
              }
          }else
          {
              Print("File Not Opened");
          }    
      }else{
   　     Print("File Not Exist");
      }
          //開いたファイルを閉じる
          ctxt.Close();
          Print("File Closed");
  }
//+------------------------------------------------------------------+

```
listのappend・extendと参照・値渡し

10/21　
shiracamusよりコメントをいただき語句を修正し、情報を追加。
コメント欄に大変わかりやすい図をいただいたので是非合わせてご覧ください。
#結論からいうと

リストのメソッドであろうと関係ない。pythonは参照が代入される。

#### list.append(x)
引数として渡した参照が追加される。
appendがやっているのは要素を一つ増やして、引数の参照を代入。
a[len(a):] = [x] と等価

####list.extend(iterable)
引数の配列の要素の参照が追加される。
extendがやっているのは、引数の配列長分の要素を追加し、引数の配列の要素を順番に代入。
a[len(a):] = iterable と等価

####参照先の値に依らない配列が欲しいとき
これらは新しいオブジェクトを生成する操作なので、値は同じでも参照先が異なる。

```python
b[:]#浅いコピー
[i for i in b]#浅いコピー
import copy
copy.copy(b)#浅いコピー
copy.deepcopy(b)#深いコピー
```

#検証

まずはこれを見てほしい。

```python
a = [0,1,2]
b = [3,4,5]
a.append(b)
b[1] = 'omg'
>>>[0, 1, 2, [3, 'omg', 5]]
```

bの要素が変更されるとaの対応する要素も変更される。
上には示していないが、逆もまた然りである。
appendがやっているのは要素を一つ増やして、引数の参照を代入しているだけなので、
ミュータブルであれば、互いの変更が反映される。

###list.extend()は浅いコピーのような振る舞い
```python:
a = [0,1,2]
b = [3,4,[5]]
a.extend(b)
b[1] = 'omg'
a
>>>[0, 1, 2, 3, 4, [5]]
#だがしかし
b[2][0] = 'omg'
a
>>>[0, 1, 2, 3, 4, ['omg']]
```

引数の配列の要素の参照が追加される。
extendがやっているのは、引数の配列長分の要素を追加し、順番に参照を代入。
引数の要素がイミュータブルであれば、互いの変更が反映される。

#IDを見るとわかりやすい
下記の例を見ると、参照しか渡されていないことがわかりやすい。
つまり要素がミュータブルであれば、参照先が変更されれば、listの中身も変わってしまう。
###list.append()
```python:
a = [0,1,2,3]
b = 4
print(*[id(i) for i in a])
print(id(b))
a.append(b)
print(*[id(i) for i in a])
>>>1773300720 1773300752 1773300784 1773300816
>>>1773300848
>>>1773300720 1773300752 1773300784 1773300816 1773300848
```
###list.extend()

```python:
a = [0,1,2]
b = [3,4,5]
print(*[id(i) for i in a])
print(*[id(i) for i in b])
a.extend(b)
print(*[id(i) for i in a])
>>>1773300720 1773300752 1773300784
>>>1773300816 1773300848 1773300880
>>>1773300720 1773300752 1773300784 1773300816 1773300848 1773300880
```

###ドキュメント

>####list.append(x)
>リストの末尾に要素を一つ追加します。
a[len(a):] = [x] と等価です。
>####list.extend(iterable)
>イテラブルのすべての要素を対象のリストに追加し、リストを拡張します。
>a[len(a):] = iterable と等価です。
>[5. データ構造 — Python 3.6.5 ドキュメント](https://docs.python.jp/3/tutorial/datastructures.html#using-lists-as-stacks)

#ひとこと
考えてみるとこの仕様以外しっくりこないことはわかるし、
この仕様でないとできないプログラムもある。
だが、直観とは違う気もする。

クラスのプライベート変数などいじられたくないところは参照を切る意味でコピーして代入しよう。

そして、コーディングをするときはミュータブルかどうか常に気を遣おう。

そして、初投稿。みなさんよろしくね。

#出典・ソース
[5. データ構造 — Python 3.6.5 ドキュメント](https://docs.python.jp/3/tutorial/datastructures.html#using-lists-as-stacks)
【要約】リーダーになる前に20代でインストールしておきたい大切な70のこと

## 1. はじめに

以下書籍の要約。

- 題名：[リーダーになる前に20代でインストールしておきたい大切な70のこと](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B%E5%89%8D%E3%81%AB20%E4%BB%A3%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E5%A4%A7%E5%88%87%E3%81%AA70%E3%81%AE%E3%81%93%E3%81%A8-%E5%8D%83%E7%94%B0-%E7%90%A2%E5%93%89/dp/4413038142) 

- 著者：千田 琢哉
- 出版：青春出版社


## 2. 報連相をされやすい人になる
- 自分が部下なら「うるさい！」言われるくらいに常に情報提供を心掛けるべき。(なんでもかんでも質問すればいいというわけではない)
- 「情報提供しない部下が悪い」と部下の責任にしていては仕事にならない。報連相をされやすい人になるために、「ありがとう」「助かった」の一言を伝える。

## 3. 部下を説得するときは、部下の1000倍納得していること
- 1000倍の内訳は、広さ10倍×深さ10倍×情熱10倍。
- 自分が納得できていないことを納得させようとするのは犯罪レベル。

## 4. はじめの一歩が猛烈に早い
- フライングスタートをすべき。
- 一歩は踏み出しにく。しかしいざ一歩を踏み出してみて分かるのは、自分が恐れていたほどのことにはならない。

## 5. 間違いと分かったら徹底が猛烈に早い
- 決断が間違いと気づいたのに、それにいつまでもこだわって徹底しないと取り返しのつかないことになる。

## 6. 雑用のスピードがどの部下よりも早い
- こんなに美しく後片付けがされているのはアイツがいるからだと思わせる。
- 仕事を楽しんでいる人は、雑用を雑に終わらせない。

## 7. 部下全員のフルネームを漢字でスラスラ書ける
- 「そんな些細なこと」を馬鹿にする人ほどマネジメントで苦労する。
- 「些細なこと」に気づいていくことがその人の観察力であり、そのまま組織のポジションに比例していく。

## 8. オンでいくら考えたかより、オフでどれだけ気づけたか
- オンよりもオフで人との差がつく。
- オンとオフの境目をなくすには、好きなことを仕事にするか仕事を好きになるか。
- 「好き」の基準は、放っておいてもついついやってしまうレベル。

## 9. 人より1回多く「なぜ？」と考える癖をつける
- 自分から積極的に考えようとしなければ「なぜ？」とは思わない。
- 1回多く「なぜ？」と考えるだけで、脳が鍛えられる。

## 10. 「悔しさ」の記憶力とその人の思考力は比例する
- 他人より不器用で物覚えが悪くても、「悔しい」という感情を爆発させた回数が「思考力」を磨き上げる。
- 悔しさの対象は常に自分自身である。
- 他人との勝ち負けは表面上でしかない。本質的には自分自身に勝ったか負けたか。

## 11. タメになると感じたことは死ぬまで続け、ダメになると感じたことは今すぐやめる
- その基準は世間の常識や情報にあるわけではない。すべて自分にある。
データの送信 form button

## データを送る方法

 form 　　button


## 共通で必要なもの

action属性　url
method
name値
submit ※inputタグ

## formタグの役割

```
name = カラムの値達を
form　で一括りにする

form 
input name: "name"
input name: "email"
input type ="submit"

```

## form tag form for　違い
EC2よりGCE（ちょっとVMが欲しいとき）

# 概要
ちょっとした検証などで、クラウド上に仮想マシンを起動したい時があります。そんな時はEC2もいいけどGCEの方がお手軽かもしれませんよ、という話。

# 私とAWSとGCP
しばらく仕事でもプライベートでもAWSを使っていましたが、一年くらい前から仕事でGCPを使い始めて、ここ最近はプライベートでもGCPを触っています。

（私の知っているAWSは１年前で止まっているので、その点はご了承ください。）

# GCEの素晴らしさ
### GCPの認証が楽
Googleアカウントの認証になるので、ログイン済みであれば追加の認証は不要です。

### シンプルなWebコンソール
GCEのUIはシンプルで、「１台インスタンスをさっと立てたい」という要望に応えてくれます。
GCEの画面を開き、「インスタンスを作成」、「作成」の２クリックで設定が完了します。

EC2では、新規インスタンス作成時にいくつも画面が遷移していくところに辛さを感じます。


### 無料枠

利用開始時に、300ドル分のクーポンがもらえます。（１２ヶ月の制限あり）それが終了しても、マイクロインスタンス1台分の無料枠が設定されています。（米国リージョン限定）

詳細は[こちら](https://cloud.google.com/free/?hl=ja)から。

### プリエンプティブインスタンス

[プリエンティブインスタンス](https://cloud.google.com/compute/docs/instances/preemptible?hl=ja)は、GCPの余剰リソースで実行されるインスタンスで、勝手に終了される可能性がある分安く利用することができます。役割としては、AWSのスポットインスタンスに近いですね。違いは多々ありますが。
インスタンス作成時に、チェックボックスにチェックを入れるだけで使えるところが気に入っています。

実際の料金は、vCPU１つ、メモリ3.75GBのインスタンスで、通常料金が\$0.0610のところ、プリエンティブインスタンスは\$0.01325です。（どちらも１時間あたり）
https://cloud.google.com/compute/pricing?hl=ja


### SSHの認証鍵の登録が簡単

WebUIから登録が可能で、指定したユーザの`~/.ssh/authorized_keys`に自動でコピーされます。


### 作成、起動が早い

というのを聞いたことがあります。実際に試したところ、新規作成のリクエストから40秒で起動が完了しました。


# まとめ

GCE（GCP）も悪くないですよ。
Amazon Rekognitionを使って画像のAV女優検索を作成しました

#このサイトを作ろうと思った動機
[このサイトは閉鎖しましたが、経緯とコードの解説はこちらの記事で行っています。](https://programming-dojo.com/rekognition%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E7%94%BB%E5%83%8F%E6%A4%9C%E7%B4%A2%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90%E6%96%B9%E6%B3%95/)
画像を使ったAV女優の検索を提供しているサイトは、いくつかあります。
しかしながら、２つの問題がありました。
1. 精度があまり高くない。
2. 検索にヒットしたAV女優のどういった表情が、自分の持っている画像と似ているのかわからない。
そのため、自分で自分の要求を満たすアプリを作成することに決めました。
#作るべき機能の一覧
* 画像の収集
* Rekognition APIの実装
* DMM APIの実装
* サーバーとインフラの構築
* Web画面の作り込み
* レスポンシブデザイン

##画像の収集
すみません、ここに関しては手作業でやりました。
今後はクローリングとOpen CVを使って自動化するかもしれません。
もしくは、Open CVの代わりにRekognitionの顔認識サービスを使って自動化するかもしれません。
今回は、Amazon Rekognitionの精度を知りたくて、綺麗な顔写真が欲しかったので手作業で始めました。

## Rekognition APIの実装
主な機能は2つです。
#### collectionの作成
これは、例えば、aragaki-yuiというcollectionを作成して、そこに画像を登録していく作業です。
新垣結衣の写真を登録すればするほど、新垣結衣を顔写真で判別するスキルが向上していきます。
#### 顔写真の検索
作成した後に、顔写真を登録したcollectionに対して、検索したい顔写真を渡して類似度を知ることができます。
検索したい顔写真の人が、どれだけ新垣結衣に似ているかを判断してくれます。
今回は100人以上のcollectionを作成しました。
100人分のcollectionがあれば、それらに対して100回のAPIリクエストを送信して結果を知る必要があります。
Threadを使って一気に大量のAPIリクエストを送信しようとしましたが、Rekognitionから過負荷のエラーが返ってきました。
今のところ、このエラーがサービスにおける一番のボトルネックです。
これに関しては、現在、Amazonのサポートに問い合わせて、上限を引き上げてもらうように交渉中です。
### DMM APIの実装
検索したAV女優の様々な個人情報は、みんなが気になるところです。
DMM APIを使ってAV女優の個人情報とアフィリエイトリンクを取得するようにしました。

## サーバーとインフラの構築
サーバーの作成は一般的な技術を使って行いました。
AWSは本当に便利です。

* Elastic Load Balancing（ロードバランサ）
* EC2（Apache + Flaskのサーバー）
* S3（ファイルストレージ）
* Route 53（ドメインの取得）

## Web画面の作り込み
今回は、PythonのFlaskフレームワークを作成しました。
ここでは、大して難しいことはやっていません。
しいて言うならば、アップロードした画像の圧縮ぐらいでしょうか。

##レスポンシブデザイン
Bootstrapを作ってレスポンシブデザインを試みました。
拙いデザインですが、それでも時間がかかりました。
デザインスキルは向上させたいですね。。。

##まとめ
思ったより満足ゆくサイトができました。
FacebookやTwitterから顔写真をダウンロードして、それを検索してみると、確かに似たAV女優がヒットしてきます。
Amazonさん、流石です！
男（俺）の夢を叶えてくれて、本当にありがとう。
サーバーサイドエンジニアになってわからなかったこと(一週間目)

# お勉強の経緯
- 最近転職しました。
- 転職前はSESでミドルソフトを作ってました。
- Webに関わる仕事はやったことはない。
- PHPとPythonとJavaScript、C・C++がﾁｮｯﾄﾜｶﾙ。

# わかんなかったこと
- macのコマンドいろいろ
- dockerのいろいろ
- AWSのこと全部


# macのコマンドとか
##ssh
### sshって何？
- sshの意味は何となく分かる。なんか安全に通信するやつでしょ？
- コマンドのやり方とかはわからん。

### sshの勉強
以下のこととかやった。

1. コマンドの勉強と鍵(秘密鍵/公開鍵)とか
2. chmodのお勉強(秘密鍵をもらって、利用する際にパーミッション関連の設定が必要だった)。ちなみに秘密鍵をもらった際はchmodは **「chmod 600 ファイル名」** ですね。
3. 「ssh-keygen -t rsa」で鍵作れる。

## git
### gitって何？
たしかなんかソース管理のなんか。（前職はVSSとかいう化石を使ってたのでよくわかんない）
git addとかgit commitとか最低限のものしか知らないのです。

### gitでやったの
- ↑のsshでの鍵生成
- git cloneでソースを取得するの。

# dockerのこととか
## dockerって何？

- なんか箱らしい？？
- なんかすごいらしい？？？？
- なんかサーバーエンジニアの必須品らしい？？？？？
- わからんがいっぱい過ぎてなんだこれ？？？？？？

## dockerやったこと
- とりあえずdockerを使ってみる。コマンドは覚えてないけどdocker --helpを叩き続けてる。
- 環境作るためのDockerfileとDocker-composeのお勉強。
**→DockerFileは一つの箱の組立書、Docker-composeは複数の箱の組立書**(たぶん)
- なんかmysqlの箱に/bin/bashがあるんだけど何でなんだろ？mysqlしか入れた記憶ないんだけど？？？
**→baseにLinuxが入ってるらしい。**取得元の箱にもDockerfileがあるので見るとわかるらしい。

# AWS
## AWSのこととか
- クラウドらしい。いろいろあるんだって。
- いっぱい使ってるんだって。
- なんかよくわからんなぁ？？？？

## AWSのやったこと
実はほとんどやってない。

- EC2→クラウドのサーバさんらしいね
- lambda→なんかスクリプトを実行してくれるらしいよ
- Aurora→えらいDB。なんか早いらしい

# 終わりに
なんかわからんこと多すぎて必死に勉強している。
できるだけ毎週まとめたいなーと思う。
Go v1.11 + Docker + fresh でホットリロード開発環境を作って愉快なGo言語生活

Go言語 + Docker で開発することが多くなってきました。ファイル更新の度にローカルでサーバー動作確認して、コンテナで動作確認してーなんてのはめんどくさいので、
Dockerコンテナ内とローカルで volume を貼ってホットリロードできる開発環境を試したので記事にします。

GitHub にも 試したプロジェクトは置いてあります。
https://github.com/po3rin/go-playground/tree/master/hot_reload_docker



## 構成
とりあえずローカルでの構成を参考に書いときます。プロジェクト名などは柔軟に。

```
hot_reload_docker
├── Dockerfile
├── docker-compose.yml
├── go.mod
└── main.go
```

## ローカルでの作業

go1.11 から出た modules を使っています。go　のバージョンが1.11以上になっているか確認してください。

```bash
$ go version
go version go1.11.1 darwin/amd64
```

modules を使う手順もさらっと紹介していきますが、さらっとなので、くわしくは下記のサイトなどを参考に！Wantedlyさんの記事です。
> Go 1.11 の modules・vgo を試す - 実際に使っていく上で考えないといけないこと #golang
> https://www.wantedly.com/companies/wantedly/post_articles/132270

まず環境変数 GO111MODULE=on を設定します。

```bash
export GO111MODULE=on
```

これで module が有効になります。
go のプロジェクト内で下記を打ち込み、```go.mod```を作ります。

```
$ go mod init
```

これで適当に main.go を作ります。

```go:main.go
package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "ping",
		})
	})
	r.Run(":8083")
}
```

ここで

```bash
$ go run main.go
```

をすると サーバー軌道の前にパッケージの読み込みが行われます。modules では```go test```や```go build```などのタイミングで
必要なパッケージの読み込みを自動で行ってくれます。便利！とりあえず動作確認しておきましょう。

```bash
$ curl localhost:8083
{"message":"ping"}
```

いいですね。

## Docker化 と ホットリロード

まずは Dockerfile です。

```docker:Dockerfile

FROM golang:1.11.1

WORKDIR /go/src/hot_reload_docker
COPY . .
ENV GO111MODULE=on

RUN go get github.com/pilu/fresh
CMD ["fresh"]
```

ポイントは環境変数　GO111MODULE=on　の設定ですね。いままで　Dockerfile 内で　```go get```とか```dep ensure```とかやっていたのはもういりません。```go test```や```go build```などのタイミングで必要なパッケージの読み込みを自動で行ってくれるからです。

そして今回は```github.com/pilu/fresh``` を導入しています。これはファイルを監視し、更新されたらホットリロードしてくれます。ゆえに今回は```fresh```コマンドでサーバーを起動します。

あとはローカルでのファイル更新とコンテナ内のファイル更新を連打させるだけです。これは Docker の volumes という昨日を使います。
管理しやすいように　docker-compose を採用します。```docker-compose.yml``` を作りましょう。

```yaml:docker-compose.yml
version: '3'
services:
  app:
    build: .
    volumes:
      - ./:/go/src/hot_reload_docker
    ports:
      - "8083:8083"
```

ポイントは volumes です。```<<ローカルのディレクトリパス>>:<<コンテナのディレクトリパス>>```でvolumeをはり、ローカルのファイル更新でコンテナ内のファイルを更新するようにします。これでローカルでファイルを編集すれば、コンテナ内で起動しているサーバーがホットリロードされます。

## 動作確認

さっそく動作確認してみましょう。

Dockerコンテナ起動

```
$ docker-compose up -d
```

動作確認

```
$ curl localhost:8083
{"message":"ping"}
```

動いてますね。ではローカルでファイルを更新してみましょう。ping を pong に変えました。

```go:main.go
// ...

func main() {
	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run(":8083")
}
```
ファイルを更新したらホットリロードされます。数秒更新に時間がかかるので少し待ったのち、動作確認しましょう。

```bash
curl localhost:8083
{"message":"pong"}
```

ping が pong になりました。これで愉快なGo言語生活を送れます。

GitHub にも 試したプロジェクトは置いてあります。
https://github.com/po3rin/go-playground/tree/master/hot_reload_docker
Elixir/Phoenix+Angularで環境構築

最近 angular に触る機会があり、Phoenixで一緒に開発できないかなーと思って少し試してみました。

# 環境

- Elixir :  1.6.4 (compiled with OTP 20)
- phoenix : 1.3.4
- Node : v8.9.3
- Angular CLI: 7.0.2

# Phoenixプロジェクトの作成

```
$ mix phx.new ng_phx --no-brunch --no-html
```

JSのビルドツールであるbrunchとhtmlは作成しないようにします

# Angular-CLIでプロジェクト作成

```
$ cd ng_phx
$ ng new web
```

Phoenixプロジェクトの中にangularのプロジェクトを作成します
angular-cliに聞かれる内容はお好みで。

# config/dev.exsを編集

watchersのところを以下のようにします

```diff:config/dev.exs
   debug_errors: true,
   code_reloader: true,
   check_origin: false,
-  watchers: []
+  watchers: [
+    ng: ["build", "--watch", "--output-path=../priv/static/web", "--base-href=/web/", cd: Path.expand("../web/", __DIR__)]
+  ]

 # ## SSL Support
 #

```

ビルドの出力先を `priv/static/web` にしています。
`ng build`はビルド前にビルド対象のディレクトリをクリーンしてしまうので
サブディレクトリを一つ追加しています。
またそれに併せて base href の設定も追加しています

ついでに `.gitignore` に `/priv/static/web` を追加しておきます

```diff:.gitignore
 # secrets files as long as you replace their contents by environment
 # variables.
 /config/*.secret.exs
+
+ # ng build output directory
+/priv/static/web
```

# endpointを編集

angularはSPAとして動くため、 `/web/index.html` にアクセスしても `/web/` に飛ばれされてしまいます。
そのため `/web/` でアクセスしても `/web/index.html`にリダイレクトされるように設定を追加します

また `priv/static/web` 以下に静的ファイルとしてアクセスするために
plug, Plug.Static の only に web を追加します

```diff:lib/ng_phx_web/endpoint.ex
 defmodule NgPhxWeb.Endpoint do
   use Phoenix.Endpoint, otp_app: :ng_phx

+  def redirect_index(conn = %Plug.Conn{path_info: ["web"]}, _opts) do
+    %Plug.Conn{conn | path_info: ["web", "index.html"]}
+  end
+
+  def redirect_index(conn, _opts) do
+    conn
+  end
+
+  plug :redirect_index
+
   socket "/socket", NgPhxWeb.UserSocket

...

   # when deploying your static files in production.
   plug Plug.Static,
     at: "/", from: :ng_phx, gzip: false,
-    only: ~w(css fonts images js favicon.ico robots.txt)
+    only: ~w(web css fonts images js favicon.ico robots.txt)
```

# サーバーを起動

ここまで設定すればあとは以下のコマンドを実行すれば、Phoenix上でangularを動かすことができます

```
$ mix phx.new
```

`ng build` に時間がかかるので少し待ちましょう。

`http://localhost:4000/web/` にアクセスして angular のロゴが表示されれば成功です :tada: 

同一ドメインで起動するので、CORSの問題などはないと思います。
ただし、 ng build の生成物を表示しているだけなので、 browser sync がないのが少しつらいですね・・・
(あと ng build が微妙に遅い)

他にいい方法などありましたら、教えていただけると嬉しいです！

今回のサンプルはいかにあげてあります
https://github.com/tamanugi/ng_phx
SSH Agent Hijacking（SSHエージェントハイジャッキング）を試す

# 概要
ssh-agentは便利ですが、第三者に悪用されるリスクもあります。この時の動きを実際に試してみましょう。
具体的には、他のユーザになりすましてSSHログインしてみます。


# ssh-agentとは？

主にローカルホストにて、秘密鍵の情報を保持するプログラムです。Mac環境ではデフォルトで起動している思いますし、Windows環境では同じ用途でPageantがよく使われます。GitBashならssh-agentも使えます。

ssh-agentを利用する主なメリットは、下記の２点です。

### パスフレーズの入力の手間を省く

ssh-agentは秘密鍵のパスフレーズを記憶します。初回SSHログイン時にパスフレーズを入力し、それ以降はログインするホストが異なっても、パスフレーズを再度入力する必要はありません。ssh-agentが記憶しているためです。

特に、「スクリプトから大量のホストにSSH接続をしてコマンドを実行したい」というケースにおいて、ssh-agentは有用です。

### 多段SSHを楽かつ安全に

「目的のサーバにログインするために踏み台サーバを経由する」というのは、よくある構成だと思います。

```
[ローカルホスト]---[踏み台サーバ]---[リモートサーバ]
```

ローカルホストでssh-agentを実行することで、ローカルホストにある秘密鍵の情報を使い、踏み台サーバとリモートサーバにログインすることができます。（踏み台サーバとリモートサーバに公開鍵を設定する必要はあります。）

ここでポイントになるのは、踏み台サーバに秘密鍵を置く必要が無いという点です。これはもちろん、セキュリティ的な観点で優れています。

この時のSSHクライアント、SSHデーモン、ssh-agentの動作については、[こちらの記事](http://www.unixwiz.net/techtips/ssh-agent-forwarding.html)が分かりやすかったです。（英語になりますが）


# SSHエージェントハイジャックを試す

説明がやや長くなりましたが、本題です。まず実際にやってみましょう。

## 準備

先ほどの例の構成を用意します。（ローカルホスト、踏み台サーバ、リモートサーバ）
その上で、下記を行います。

* ローカルホストでssh-agentを起動し（起動していなければ）、秘密鍵を登録
    * `$ ssh-add /path/to/id_rsa`
* ペアとなる公開鍵を踏み台サーバへ設置
    * `~/.ssh/authorized_keys`
* 同じ公開鍵をリモートサーバにも設置
    * `~/.ssh/authorized_keys`

## 試す

```
### ローカルホストで実行 ###
$ whoami
mokrai

## 秘密鍵が登録されていることを確認
$ ssh-add -l
（出力は省略）

## "-A"で秘密鍵の情報を引き継ぎ、踏み台へログイン
$ ssh -A fumidai


### ここからは踏み台サーバ ###

## ssh-agentとの通信で使われるUnixドメインソケットを表示
$ echo $SSH_AUTH_SOCK
/tmp/ssh-cL74qUAjib/agent.1086

## rootユーザへスイッチ
$ sudo su -

## 先ほどのUnixドメインソケットを環境変数に設定
# export SSH_AUTH_SOCK=/tmp/ssh-cL74qUAjib/agent.1086

## mokraiユーザとしてリモートサーバへログイン(成功してしまう)
# ssh mokrai@remote-server
```

## 何が起きた？
rootユーザがmokraiユーザになりすまし、remote-serverへのログインに成功しました。これは、rootユーザがUnixドメインソケット経由で、ローカルホストのmokraiユーザの秘密鍵の情報にアクセスできたからです。

もちろん、このソケットファイルは厳しいパーミッションが設定されていて、誰でも読み書きができるわけではありません。しかし、rootユーザであれば自由な操作が可能です。

「rootユーザだけなら問題ないのでは？」と考える方もいるかもしれませんが、常にrootユーザを信頼できる環境ばかりではないでしょう。


## SSH Agent Hijackingを防ぐ

ssh-agentを使わない、という話になってしまいます。
したがって、「信頼できるホストへのログインでは使う、そうでないなら使わない」というのが、現実的かもしれません。

やや余談ですが、`~/.ssh/config`の各ホストの設定で`ForwardAgent yes`もしくは`ForwardAgent　no`を設定することができます。これによって、SSHログイン対象のホスト単位で、ssh-agentを使うかどうかを設定できます。

# まとめ
ssh-agentは便利。ただしリスクもあるので、理解した上で適切に使いましょう。

# 参考
* http://www.unixwiz.net/techtips/ssh-agent-forwarding.html
* https://www.clockwork.com/news/2012/09/28/602/ssh_agent_hijacking/
Gitのリモート先の修正について

#はじめに
railsチュートリアル（第４版）を進めていくに当たり、gitのリモート先をGitHubに設定してしまいBitbucketへプッシュが出来ずに躓いてしまいました。備忘録をかねて記述します。

#環境
* AWS Cloud9
* ruby 2.4.1p111
* Rails 5.2.1

#現象
![スクリーンショット 2018-10-20 23.35.57.png](https://qiita-image-store.s3.amazonaws.com/0/304135/559f8552-6529-497f-59f0-02eb3c86188f.png)

#対処法
リモート先を確認
![スクリーンショット 2018-10-20 23.41.18.png](https://qiita-image-store.s3.amazonaws.com/0/304135/3cc5d554-f6a5-f7a9-54a2-ae66d2d5d8dc.png)
削除
![スクリーンショット 2018-10-20 23.46.33.png](https://qiita-image-store.s3.amazonaws.com/0/304135/915a2584-77c8-6dc0-b817-ab2e0aa7ad52.png)
追加
![スクリーンショット 2018-10-20 23.51.26.png](https://qiita-image-store.s3.amazonaws.com/0/304135/f01ffd6b-dc92-e2b1-ef66-03679273fe17.png)
Active Directory の信頼関係先のドメインユーザーでログオンするときの認証について

今回、タイトルのネタで話題になり調べてみたので、残しておこうと思います。

## Kerberos 認証の場合

[こちら](https://technet.microsoft.com/pt-pt/library/cc773178(v=ws.10).aspx)のドキュメントにあるように、

1. ログオン先端末の所属するドメインのドメインコントローラ (DC) で認証を試行する
2. 当該 DC には、該当のユーザーはいないので、信頼関係先のドメインの DC の情報を得る
3. ログオン先端末から、信頼関係先のドメインの DC へ認証を行う
4. 認証が成功し、ログオンができる

という流れになります。
まったく同じケースではないですが、[こちら](https://technet.microsoft.com/pt-pt/library/cc773178(v=ws.10).aspx)の一番下の図が分かりやすいと思います。


## NTLM 認証の場合

話題になったのはこちらでした。一例としては、`xxx\user01` といった形でログオンする場合です。

結論から行くと、下記のような流れになります。

1. ログオン先端末の所属するドメインの DC で認証を試行する
2. 当該 DC には、該当のユーザーはいないので、当該 DC から信頼関係先のドメインの DC へ
認証を転送する (パススルー認証)
3. 認証が成功し、当該 DC からログオン先端末へレスポンスを返す
4. ログオンができる

参考情報ですが、Windows Server 2000 のリソースキット (No.4, P.27) に下記の記載がありました。

```text

クライアントが NTLM 認証プロトコルを使用している場合、認証のための最初の要求は、
クライアントからターゲットドメインのリソースサーバーに直接渡されます。このサーバーは
そのコンピュータアカウントドメインのドメインコントローラにユーザーのセキュリティ
赤生と情報を送信します。ドメインコントローラは、そのセキュリティアカウントデータべースに
クライアントのユーザーアカウントを照会します。アカウントが存在しない場合は、ドメインコントローラは
次のロジックを使ってパススルー認証を実行し、その要求を転送するか、その要求を拒否します。

　■現在のドメインはそのユーザーのドメインと直接的な信頼関係がありますか。

　・「はい」の場合、ドメインコントローラは、パススルー認証のためにユーザーの
　　ドメインのドメインコントローラにクライアントの認証情報を送信します。
　・「いいえ」の場合は、次の手順に進みます。

　■現在のドメインはそのユーザーのドメインと推移的な信頼関係がありますか。
　・「はい」の場合は、信頼パスの次のドメインに認証要求を渡します。このドメイン
　　コントローラは、そのセキュリティアカウントデータベースにユーザーの認証情報を
　　照会し、再び処理を開始します。
　・「いいえ」の場合は、ログオン拒否メッセージをクライアントに送信します。
```

また、こちらの MS ドキュメントも参考になると思います。
https://technet.microsoft.com/pt-pt/library/cc773178(v=ws.10).aspx
https://msdn.microsoft.com/en-us/library/cc237016.aspx

今回、実際うろ覚えなものも多く、あらためて勉強になりました。
Google colaboratoryでOSSをビルドする

Googleがクラウド開発環境Colaboratoryを公開しているので、この仮想環境でOSSをビルドしてみます。

この仮想環境にはUbuntu 18.04と、深層学習するためのPython,　Tensorflowなどが用意されていますが。それだけで足りない機能はOSSからビルドすることになります。

Ubuntuのコマンドは頭に!をつけることで使えますが、なぜかcdだけは%でないと動作しません。これを踏まえてOpenCVをビルドしましょう。（OpenCVはpipでバイナリをインストールできますが、OpenCVはとりあえず実装した関数も多く、独自に最適化を施すのが普通です。私は）


 OpenCVをクローンします
```
!git clone https://github.com/opencv/opencv
```
 ビルドに必要なライブラリを適宜インストール
```
!apt-get install cmake clinfo ffmpeg cuda-toolkit-9-2
!apt-get install libavcodec-dev libavdevice-dev libavformat-dev libavfilter-dev libavutil-dev libswscale-dev libavresample-dev
```
 ここではバージョン3.4.3をbuildフォルダーにビルドします
```
%cd opencv
!git checkout 3.4.3
!mkdir ../build
%cd ../build
!cmake ../opencv
!make
```
 ビルドしたバイナリーデータは、このままではColaboratoryの12時間制限で仮想環境ごと消えてしまうため。Google Driveにzipで保存します。
```
from google.colab import drive
drive.mount('/content/drive')
!zip -r /content/drive/'My Drive'/OpenCV-3.4.3.zip bin lib
```
次回から、このライブラリを死闘する場合は、Google Driveから仮想環境に解凍して利用します。
[Metamask]DApps開発中にぶつかった問題と解決策

# 概要
ハッカソンに向けて、web3.jsとMetamaskを使ってコントラクトと繋げようとしたときに、ぶち当たった問題とその自分なりの解決策を書いていこうと思う。
なお、当方プログラミング初心者なのでおかしな点があるかもしれないが、コメントいただけると助かる。

## 環境
geth 1.8.14
web3.js@0.20.0
metamask 4.16.0

## Metamask経由であればrequire("web3")は必要ない
Metamaskでは自動的にWeb3インスタンスをインストールしてくれるので、下記のコード

```
var Web3 = require('web3');
var web3 = new Web3();
```

は必要ない。(Metamaskを使わない場合は必要)
Metamask前提であればこれを入れると、競合して動かなくなってしまう。

なので、このように置き換えれば動作する。

```
if (typeof web3 !== "undefined") {
	web3js = new Web3(web3.currentProvider);
	console.log("injecting web3js success");
	} else {
	console.log("Can NOT access to provider...");
	window.alert("MetaMaskにアクセスできません");
	return;
}
```


## ローカル上ではMetamaskが動かない
`file://` で始まってる場合はセキュリティーの問題でMetamaskは動作しない。
`localhost`上でテストすべし。


## CryptoZombieのサンプルコードでは動かない
該当するコードを示す。

```
cryptoZombies = new web3js.eth.Contract(cryptoZombiesABI, cryptoZombiesAddress);
```

これだとweb3のバージョンが原因で動かない。これはweb３@1.0.0で動作する。

現状、Metamaskが用意するwb3のバージョンは0.20.0なのでそれに合ったコードである必要があり、下記のコードで動作する。

```
contract = web3js.eth.contract(abi).at(address);
```

## Metamask経由ではcallbackが必須
Metamask使わない場合ではこの限りではないが、callbackを使う必要がある。

主に2パターン、callとsendTransaction、についてそれぞれサンプルを乗せる

### call
```
contract.MyMethods.call((err,res) => {
	if(!err){
	//成功
	}else{
	//失敗
	}
});
```

### sendTransaction
```
contract.MyMethods.sendTransaction(
	params,
	{from: hostAddress, gas:3000000, value:web3.toWei(_amount, "ether")},
	(err,res) => {
	if(!err){
	//成功
	}else{
	//失敗
	}}
);
```


## その他
あと、プライベートネットの構築においても一つ絶対に守らなければいけない決まり事が存在する。
それは、`genesis.json`のchainIdの値と、`geth --networkId ~` の値を一致させる必要があるということだ。(考えてみれば当たり前)

これらの決まりごとがしっかりとは明記されていないので、注意してほしい。
HGST製JBODの設定方法

# はじめに
HGST製のJBOD(第３世代）を購入したので、セットアップ！
[Ultrastar Data60](https://www.hgst.com/ja/node/2594)というものです→ちょっと下に解説
というか、計画上ではシングルゾーンとして可動させる予定だったのですが、３ゾーンに分けるかもしれないという地獄。
マニュアルもすべて英語でしかも、どんどん書き足されていくという。。。（この３ヶ月で３個も項目増えたし、別冊のマニュアルも増えるというｗ）
なかなかに茨の道を歩んでる感じです。。。

##Ultrastar Data60って良いの？
まだ試しにつかっているだけなのですが、
とりあえず問題として
・サーバルームが比較的温度が高くなりがち（おい
・HDDの稼働率が高い（ストリームデータが多い）
という他にはない突出した問題があって、
エアフローと特にHDDへの振動に対して特に心配事が山積み。
検証もしたけど、アクセス速度にしても、特に普通のJBODと変わらないが、
・温度が上がりづらい（ただうるさい）のと、
・特にHDDもHGST製だから価格的にも良い
・他のJBOD会社にはない、HDDのためを思った工夫の数々
があったから、まぁよいのでは？ということで決定。

候補的にNetAppやDell、Supermicro、Quantumも検討しましたが、価格ともろもろ、HDDのこだわりで決めました。


##　JBODの設定の方法
実は設定方法は二種類あることがわかってきた。
・　sg系のコマンド方式
・　Redfishを使ったAPI更新

sg系のコマンドは、[SG3 Utils](http://sg.danny.cz/sg/sg3_utils.html)　からインストールするという方法
もう一つはCurlコマンド（Macでbrewインストールしてるなら、　brew install curl　で入る）で、POSTかGETで、JSONを介して設定を確認したり見たりという方法。どちらかというと新しい方法のようであれですが、自分がWEBにもタッチしているので、こっちのほうが結構ありだなぁと。

## とりあえず設定するためのインスコとかをやってみた
結果として、sgコマンドはできませんでした。。。
CentOS系OSを入れた、SASカードありのPCを用意する必要があること、ですね。（普通あるだろ！というところは現代っ子ゆえry)
ということで、POSTでやることに。
Chromeの拡張である[Restlet Client](https://chrome.google.com/webstore/detail/restlet-client-rest-api-t/aejoelaoggembcahagimdiliamlcdmfm/related?hl=ja)を利用することに。

## ゾーン設定
ゾーンとはJBODの中のHDDとその接続口（SAS)を分けていくために使うものとのこと。
このJBODは４種類の設定があって
・全部使いモード
・６分割モード
・３分割モード
・２分割モード
がある。このモードは、おそらく指し口が６ポート✕２の関係だからだと思われる。

で、とりあえず３分割にしようと思う。
1. https://IPアドレス/redfish/v1/Systems/Self/Storage/ をGETで取得する
![１の参考](https://qiita-image-store.s3.amazonaws.com/0/166400/b1eaab02-9e85-c5b6-1acd-2d77f755f313.png)
2. １で取得したデータのMembers@odata.idでさらにGETをかける
3. Actions内にある、targetの記載（"https://IPアドレス/redfish/v1/Systems/Self/Storage/<Enclosure Logical ID>/Actions/Storage.Zoning"）の記載方法に従ってPOSTURLを作る
4. {"ZoningConfig":"0-3のいずれか"}をjson情報として４のURLでPOST
![２の参考](https://qiita-image-store.s3.amazonaws.com/0/166400/18597305-4a18-a0d6-e5d6-e0218e83e7bb.png)
5. リターンが "200"で返ってくることを確認する

## 今後について
分割がHDDごとに振れるようなので、そこを探してセットアップしようと思う。
【要約】世界のエリートがやっている 最高の休息法

## 1. はじめに

以下書籍の要約。

- 題名：[世界のエリートがやっている 最高の休息法](https://www.amazon.co.jp/%E8%84%B3%E7%96%B2%E5%8A%B4%E3%81%8C%E6%B6%88%E3%81%88%E3%82%8B-%E6%9C%80%E9%AB%98%E3%81%AE%E4%BC%91%E6%81%AF%E6%B3%95-CD%E3%83%96%E3%83%83%E3%82%AF-%E8%84%B3%E7%A7%91%E5%AD%A6%C3%97%E7%9E%91%E6%83%B3-%E8%81%9E%E3%81%8F%E3%81%A0%E3%81%91%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%89%E3%83%95%E3%83%AB%E3%83%8D%E3%82%B9%E5%85%A5%E9%96%80/dp/4478101914/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=BHXVPTQRK9KJTBBG8G5J) 

- 著者：久賀谷 亮
- 出版：ダイヤモンド社


## 2. マインドフルネス
- **マインドフルネスとは、瞑想などを通じた脳の休息法の総称**。
- 瞑想と聞くと怪しげなイメージがあるが、スティーブ・ジョブズはマインドフルネスの実践者である。またグーグルやフェイスブックでもマインドフルネス研修が取り入れられている。マインドフルネスは世界的に流行している。

## 3. マインドフルネス呼吸法
- 脳は何もしないでも勝手に疲れていく。
- 注意散漫、無気力、イライラは**脳疲労のサイン**。
- その根本的原因は意識が**未来**や**過去**にばかり向かい、**現在**にないため。
- **現在**に意識を向ける**心の練習**をすることで、疲れづらい脳を作るのが**マインドフルネス呼吸法**である。

#### マインドフルネス呼吸法のやり方
##### ①基本姿勢をとる
- 椅子に座る。(背筋を軽く伸ばし、背もたれから離す)
- お腹はゆったり、手は太ももの上、脚は組まない。
- 目は閉じる。

##### ②身体の感覚に意識を向ける
- 接触の感覚を意識する。(足の裏と床、お尻と椅子、手と太ももなど)

##### ③呼吸に注意を向ける
- 呼吸に関わる感覚を意識する。(鼻を通る空気、呼吸による胸・お腹の動き、呼吸の深さなど)
- 呼吸のコントロールは不要。自然と呼吸をする感覚。

##### ④雑念が浮かんだら
- 雑念がうかんだら、注意を呼吸にもどす。
- 雑念が浮かぶのは仕方ない。(自分を責めない)

##### ★ポイント
- 1日5分でも10分でもいいので、毎日続けることが大切。
- 同じ時間、同じ場所でやれるとよい。(脳は習慣が大好き)
IronRubyで起動中のExcelのシートに書き込みをする

# 概要
IronRubyを使い、起動中のExcelのプロセスにアタッチする方法の紹介です。
起動中のExcelのシートに乱数を書き込むサンプルコードを掲載します。

# 前提
RubyとExcelのマクロについてある程度知っている方向け。
本記事のテーマはRubyやExcelマクロの文法やコーディング作法ではなく、Ruby(IronRuby)とExcelを連携させるときのテクニックです。

# 環境
Windows 8.1（64ビット）
IronRuby 1.1
Excel 2010

# コード
コードは次の通りです。

```excel_set_random.rb
# coding: utf-8

# 起動中のExcelのプロセスにアタッチする
begin
	excel = System::Runtime::InteropServices::Marshal::GetActiveObject("Excel.Application")
rescue
	abort "No Excel process."
end

# カーソルが当たっているセルに1～100の乱数を書き込む
excel.ActiveCell.Value = rand(100) + 1
```

# 実行方法

[1] Excelを起動します

[2] DOS窓を開き、`excel_set_random.rb`を実行します

```
> "C:\Program Files (x86)\IronRuby 1.1\bin\ir.exe" excel_set_random.rb
```

[3] 実行するとA1のセルに1～100の乱数が入力されます（カーソルがA1のセルにあるため）
![exec_result_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/304851/8465c7e8-a282-ec43-015d-c3b888ec6ff5.png)

[4] `excel_set_random.rb`を何回も実行してみてください。A1のセルの値が次々と変化するはずです


# 解説

## GetActiveObject

起動中のExcelのプロセスにアタッチするにはGetActiveObjectを使います。

```
excel = System::Runtime::InteropServices::Marshal::GetActiveObject("Excel.Application")
```

起動中のExcelのプロセスがないと例外が発生しますので、サンプルコードではrescueを併用しています。

また、このようにするとWordのプロセスにアタッチすることもできます。

```
word = System::Runtime::InteropServices::Marshal::GetActiveObject("Word.Application")
```

# 何が嬉しいの？

この記事の手法は手作業でファイルを編集中に、一部の作業だけをスクリプトにやらせることができます。
手作業と複数のスクリプトを組み合わせることができます。

ほかに、Excelのファイルを自動的に開いて作業を実行し、最後にファイルを保存してExcelを終了してしまう手法があります。
この場合は全自動で動いてくれる代わりに柔軟性がなく、小回りが利きません。
Faviconを取得するブックマークレットを作った

## 概要

とあるサイトのリニューアルの際、ブックマークレットは既存のものを使ってくださいと言われた。

どれどれと思って既存のサイトのソースからfaviconの記載を探してみると・・・ない。。。

ルートに直接faviconを置いてるパターンのようだ。

とはいえ、げんさーばーへのFTP情報は持ってないし、さてどうしよう。と思って調べたので、そのことを。


## まずは作ったものから

[ファビコンゲッター](javascript:(function(){var google='http://www.google.com/s2/favicons?domain=';var url=location.href;var redirectUrl=google+url;window.open(redirectUrl);})();)

手順としては、
1. 上記のリンクをドラッグしてブックマークバーにドラッグ
2. ファビコンをゲットしたいサイトを開く
3. 1で作成したブックマークレットをクリック
4. 別タブが開いてファビコンが表示されるので、あとはダウンロードなりしてください。

以下説明。

## Google の API に便利なものがあるらしい。

「既存サイト ファビコン ダウンロード」で検索すると、以下のページが見つかった。
http://blog.livedoor.jp/suguniwasurechau/archives/31961831.html　

記事によると、`http://www.google.com/s2/favicons?domain=xxxxx` のxxxxxの箇所にURLを指定してやれば、取得できる。


## ブックマークレットにしてみた

これで目的は達成なのだが、ちょっと使いやすいように改良してみた。

ソースはこちら

```Javascript
javascript:(function(){
  var google='http://www.google.com/s2/favicons?domain=';
  var url=location.href;
  var redirectUrl=google+url;
  window.open(redirectUrl);
})();
```

あとは以前の記事で紹介した[作り方](https://qiita.com/kmurae/items/5fd93ec96917a52a77a2)でブックマークレットにしてやればおK.

使う機会いはそんなんないかもしれませんが、いざというときのためにブックマークに入れて置いてもいいのではないでしょうか？
最近よくQiitaの記事が検索結果に出てくるので自分も書いてみる

#なるほど
そういうことですか。

```c:hello_qiita_world.c
#include <stdio.h>

int main(void)
{
    printf("Hello Qiita World!\n");
}
```

~~###あとでこの記事消そう。~~
＜18/10/23（火）追記＞
・・・と思ったけど親切にコードを修正して下さった方がいたのでこのままにしておこう。
次からは[paiza.io](https://paiza.io/ja)などで動作確認をしてから上げようと思います。
TwitterのタイムラインをWebサイトに埋め込む手順

# 手順
1. [Twitter Publish](https://publish.twitter.com/#)というサイトにアクセスする
<img width="1112" alt="16738B96-9878-4977-AFA6-CD56B1C7A524.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/287741/9edd7f69-3a84-675e-feb5-681c6fedf2a9.jpeg">
2. 【Enter a Twitter URL】に埋め込みたいTwitterのURLを入力する。「@アカウント名」だけ入力しても可能
<img width="1112" alt="979C8C1F-AEEB-46DE-859C-1F97AABBA715.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/287741/b582ed74-9ba0-a80d-09d4-e0c3d8aab191.jpeg">
3. スクロールすると入力したURL用のタイムラインのコードが表示されているので、【Copy Code】を押してコードをコピーする
<img width="1101" alt="21CB8E99-36AD-484C-ABE3-DDB1DD696B0F.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/287741/ad3ff018-b48c-ad18-44eb-9d240e20a55a.jpeg">
3-1. もし、タイムラインの表示サイズ・背景色・リンク文字色・表示言語を変更したい場合、【set customization options.】にアクセスする
<img width="1112" alt="27E3B6B0-074B-46B0-8C30-10B037707513.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/287741/fd4ddfc9-79f2-0ad0-fbb6-e243d2376df4.jpeg">
3-2. 表示された各種設定を入力し【Update】ボタンを押す
<img width="1112" alt="84D7BAA1-5729-4C3B-9C61-0D0A9D1681BC.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/287741/c2c0671c-2c6c-c20c-8456-70205139f347.jpeg">
    - What size would you like your timeline to be?
        - Height(タイムライン表示の高さ)
        - Width（タイムライン表示の幅）
    - How would you like this to look?
        - Light or Dark(背景色を明るくするか暗くするか)
        - Defalut link color(文章内のリンク文字の色指定)
    - What language would you like to display this in?
        - タイムライン上に表示されるTwitterの日付などをどの言語に合わせるか設定する
    - Opt-out of tailoring Twitter
        - twitter のフォローボタンを設置するかどうか


4. 埋め込みたいWebページのHTMLにコピーしたコードを貼り付ける

終わり:tada:

# 参考文献
[Twitterヘルプセンター：タイムラインを埋め込む方法](https://help.twitter.com/ja/using-twitter/embed-twitter-feed)

# 前提
SpartaCampに参加したメンバーで行う勉強会用資料として取りまとめたものです
- [八幡平市主催：株式会社NEXT REVOLUTION運営](http://hachimantai.spartacamp.jp/)
- [株式会社NEXT REVOLUTION主催・運営](http://hachimantai.spartacamp.jp/)
焼いてみた

#DVD-R DL
6GBのisoファイルどうやってDVDに焼くんだって思ってたら
DVD-R DLってのがあるんだね
片面二層で8GB以上大丈夫！

#isoファイルじゃなくてディスクイメージを焼きたいのに
Windows10のパソコンで
isoファイルからDVDにイメージを焼きたいのに
なぜかisoファイルをDVDに焼いちゃう

isoファイルのプロパティから
isoの既定アプリをエクスプローラにしたら
うまくいったよ
iPhoneでyoutubeをダウンロードするアプリ作ってみた【pythonista3】

pythonista3というiPhone上でpythonができるアプリがあります。
Pythonista3:https://itunes.apple.com/jp/app/pythonista-3/id1085978097?mt=8
エディタとしても優秀でなぜappleが許可したかわからないすごい代物です。
今回はこのpythonista単体でyoutubeからmp4とm4aをダウンロードするアプリを作ってみたいと思います。

#環境
pythonista3 == 3.2
のみ

#StaShとyoutube_dlのダウンロード
このアプリではyoutube_dlというものをダウンロードするためにpipコマンドを使いますが、pythonista3を入れたばかりでは使うことができません。
そこでStashというシェルを追加します。
名前はPythoni__sta Sh__ellを略したそうです。
まずはpythonistaのコンソールで以下を入力します。

```
import requests as r; exec(r.get('http://bit.ly/get-stash').text)
```

すると`launch_stash.py`が作成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246279/d2ba3952-743d-70cf-bbfa-48bf383caaf3.png)
そして右上のRUNボタン▶を押すとシェルが開始されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246279/e4630431-f4ba-9d7c-8ff7-ffb963c742ab.png)

ここで`pip install youtube_dl`と打つとモジュールにyoutube_dlのダウンロードが開始されます。

#スクリプト作成
アプリのプログラムを作成します。
ここではファイル名を`youtube_dler.py`、UIファイル名を`youtube_dler.pyui`とします。

```python:youtube_dler.py
import youtube_dl,os
import ui


curdir = os.getcwd() + '/'

def dl(sender, path, format):
	global curdir
	if not os.path.isdir(curdir + path):
		os.mkdir(curdir + path)
	os.chdir(curdir + path)
	urlform = sender.superview['url']
	url = urlform.text
	if format == 'm4a' :
		dlformat = 'bestaudio[ext=m4a]'
	elif format == 'mp4' :
		dlformat = 'bestvideo[ext=mp4]'
	ydl_opts = {'format':dlformat}
	with youtube_dl.YoutubeDL(ydl_opts) as ydl:
		ydl.download([url])

def music_dl(sender):
	dl(sender, 'music', 'm4a')

def movie_dl(sender):
	dl(sender, 'video', 'mp4')

v = ui.load_view('youtube_dler.pyui')
v.present('sheet')
```
つぎはUIを作成します。
UIは基本的に自由です。もっとかっこよくしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246279/912de552-ba54-de31-52a1-7fc136412844.png)
ただしURLフォームのnameをurl、2つのボタンのactionをそれぞれmusic_dl,movie_dlにする必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246279/6a0fb3d5-9b8d-c143-e9fa-f7f45302ac39.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246279/9e94c09d-14f1-ca0b-aadd-a2fd69855a8a.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246279/020afaa2-63b4-4800-87cf-2d313ce52c0a.png)



#使い方
URLフォームにyoutubeのURLをいれてボタンを押すと、m4aはmusic、mp4はvideoファイルに保存されます。

#参考
iPhone単体で動画をダウンロードする【pythonista】
https://qiita.com/0x0/items/91fef12fa8e231bc49e9
Pythonista 3 にStaSh をインストールする。
https://qiita.com/maboy/items/cef5dee13d5b2e9ac843
iPhoneでiPhoneアプリを作ろう
https://qiita.com/ttsutchi/items/34fb3395f085e5e11f6e
React-NativeでSFCがHMRしてくれない問題を解決する

そもそもの前提問題としてReact-NativeではHMRを有効化してもStateless Functional Component(以下SFC)に対してhot module replacement(以下HMR)してくれない問題がある。
https://github.com/facebook/react-native/issues/10991

上記のissueに記載あるが `babel-plugin-functional-hmr` を入れることでSFCに対してもHMRを有効化出来る。これで全て解決！と行けば良いのだが、、、

## babel-plugin-functional-hmrを有効化した状態でjestのsnapshotテストをするとテストケースが失敗することがある

どういうケースで失敗するのか？
普段僕は業務でもプライベートでも [styled-components](https://github.com/styled-components/styled-components) を使用しています。
今回の場合、こういったエラーが発生しました。

```
locals[0] does not appear to be a `module` object with Hot Module replacement API enabled. You should disable react-transform-hmr in production by using `env` section in Babel configuration. See the example in README: https://github.com/gaearon/react-transform-hmr

      2 |
      3 | import React from 'react';
    > 4 | import { Container, BadgeText } from './style';
```

これは react-transform-hmr が有効化されているので発生しているので、 `babel-plugin-functional-hmr` を developmentだけで有効化すれば良いのがわかります。
しかし、 `.babelrc` に記述するだけだと 例えば `NODE_ENV=test jest` してもこのエラーを回避できませんでした。

## 解決方法
.babelrcではなく babel.config.jsにし、下記のように記述する

```js
module.exports = api => {
  const env = api.cache(() => process.env.NODE_ENV);
  return {
    presets: ['module:metro-react-native-babel-preset'],
    plugins: [
      [
        'module-resolver',
        {
          root: ['./'],
          alias: {
            '@': './src'
          }
        }
      ]
    ],
    env: {
      development: {
        plugins: env === 'test' ? [] : ['functional-hmr']
      }
    }
  };
};
```
`plugins` 内は設定してなかったら特に何も記述しなくて良いと思います。
またこの書き方は自分の環境内で使っている形なので、 `babel.config.js` はfunctionにする、`引数.cache` を使う、 development以外では `babel-plugin-functional-hmr` を有効化しない。
これらを守るとSFCにHMRを有効化させつつ、 `babel-plugin-functional-hmr` によってjestでエラーが吐かなくなります。

汎用的なベストプラクティスがあれば編集リクエストください。

現場からは以上です。
Heroku上で気軽にcron実行したい

# はじめに
herokuにデプロイしたアプリをいい感じに定期実行したいな
↪︎HerokuSchedulerで対応できるのか🤔
↪︎~~クレカの登録面倒だし~~cronチックに設定できないかな

Node.js上で定期的にLINE通知を送ってくるアプリに組み込みました。

## 結論

```
const nodeCron = require('node-cron');

var task = nodeCron.schedule('0 */12 * * *', function() {
  // 定期実行する処理
});
task.start(); // タスクの実行 task.stop()を呼び出すまで定期実行してくれる

```

### Cronの時刻フォーマット
```
┌──────────── 分（0〜59）
| ┌────────── 時（0〜23）
| | ┌──────── 日（1〜31）
| | | ┌────── 月（1〜12）
| | | | ┌──── 曜日（0〜7  0も7も日曜日 Calendarクラスは滅びるべき）
| | | | |
* * * * *
```

[参考リンク：node-cron](https://www.npmjs.com/package/node-cron#cron-syntax)

### Herokuがアイドル状態になるのを防ぐ
30分アクセスが無いとアプリがアイドル状態になってしまい、task.start()でエラーが起きるため、
アイドル状態にならないように叩き起こす必要がある。
そこで[Uptime Robot](https://uptimerobot.com)を使う

参考記事：[Herokuでアイドルさせないようにした際のメモ](https://qiita.com/udon242/items/b8efd594e380aaf830b3)
サクラエディタからDB接続する

# 内容

サクラエディタからDB接続をしたい。
基本的には現場で推奨されているエディタ・開発環境を使うのだが
重くてストレスがたまることがある。
自由にソフトウェアをインストールすることも
できないので、簡単に作ってみようということ(ただの暇つぶしだったり)

# 方法
サクラエディタにはマクロ機能があり
vbs,jsを使用することができるので
vbsでDB接続する


# ■以下コード

```vb:
max = GetLineCount(0)

' 0 否選択 1 選択中 2 矩形選択
selectFlg = IsTextSelected()

' 未選択の場合、
if selectFlg = 0 then

	strSql = ""
	for i = 1 to max
	
		strSql = strSql & getLineStr(i)
		
		if instr(strSql, ";") > 0 then
			
			dbConnect(strSql)
			strSql = ""
		end if
	
	next 

' 選択中の文字列からSQLを取り出す
else

	strSql = GetSelectedString()
	
	strSql = split(strSql, ";")
	
	for i = 0 to Ubound(strSql) -1
		GoFileEnd	
		Down
		insText(vbcr) 
		dbConnect(strSql(i))
	next

end if

msgbox "finish", vbInfomation

'-----------------------------------------
' DB接続
'-----------------------------------------
sub dbConnect(strSql)

	' ここではODBCに登録しているものを使用
	strConn = "DSN=test"

	Set oConn = CreateObject("ADODB.Connection")
	Set rs = CreateObject("ADODB.Recordset")

	oConn.ConnectionString = strConn
	oConn.Open

	rs.Open strSql, oConn
	
	' 検索の場合、エディタに出力
	if instr(strSql, "select") > 0 or instr(strSql, "SELECT") > 0 then
		
		outputCol = ""
		colCount = rs.Fields.Count
		
		for j = 0 to colCount -1
			outputCol = outputCol & rs.Fields(j).Name & vbtab
		next

		insText(outputCol & vbcr)

		do while rs.EOF <> True
			output = ""
			for j = 0 to colCount -1
				output = output & rs.Fields(j).Value & vbtab 
			next
			
			insText(output & vbcr)
			
			rs.moveNext
		
		loop
		
	end if
	
	' 解放
	rs.Close
	set rs = Nothing
	oConn.Close
	set oConn = Nothing
	
End sub
```

実行するとこんな感じ
![サクラエディタ.JPG](https://qiita-image-store.s3.amazonaws.com/0/253940/6c810c10-e249-00db-a58b-37aa72c629b6.jpeg)



# ■作成後

サクラエディタでSQlを編集してすぐに実行したいときは
使う機会もあるけどやっぱり無理がある

# ■コマンドライン経由で
「外部コマンドを実行」というコマンドがあるので
サクラエディタからコマンドラインで実行してみる。
DBはmysql

```vb:

connect = "mysql -u[userName] -p[password] -D[test] -e "
 
max = GetLineCount(0)

' 0 否選択 1 選択中 2 矩形選択
selectFlg = IsTextSelected()

' 未選択の場合、
if selectFlg = 0 then

	strSql = ""
	for i = 1 to max
	
		strSql = strSql & getLineStr(i)
		
		if instr(strSql, ";") > 0 then
　　　　　　　　　　　　　' コマンド作成
			exeStr = connect & """" & strSql & """"
			' コマンド実行
			ExecCommand exeStr, 1
			strSql = ""
		end if
	
	next 

' 選択中の文字列からSQLを取り出す
else

	strSql = GetSelectedString()
	
	strSql = split(strSql, ";")
	
	for i = 0 to Ubound(strSql) -1
		GoFileEnd	
		Down
		insText(vbcr) 
		dbConnect(strSql(i))
	next

end if

msgbox "finish", vbInfomation
```

以下のコマンド・SQLを実行してみる

```
show global variables like '%wait%';
select * from historycal where code = '3900' and date = current_date() -5;
```

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/253940/c9c5cd4b-1470-2720-1c1c-fa38d1f9530c.jpeg)
RailsでJSファイルが読み込まれない！と困った話

## 前提
AWSのcloud9を利用して、Railsを使った簡単なMAP表示アプリを製作していた時の話です。
Rails初心者のため、「アセットパイプラインって何？」レベルの知識しかありません。
そんな時に、思わず嵌ってしまって解決するのに時間が掛かった経験をしたため、同じ様な事象に悩む方々いたら参考になればと思い投稿しました。
## 概要
①勉強を兼ねて、Google Maps APIを利用したMAP表示アプリを制作。
②「rails g controller maps index」でmapsコントローラを新規に作成。
③index.html.erbにmap表示用の"divタグ"とmap描画用の"scriptタグ"及び”JSコード”を埋め込んで、動作を確認。
④上記の方法で無事動作したため、新規に作成したmap.jsファイルにJSコードを記載し、jsファイルを読み込んでmapを描画させようとした。
⑤map.jsファイルだけが呼び出し出来ず、mapが描画されない事態になった。

```html:aplication.html.erb
<head>
  //下記の記述により、jsファイルが自動で読み込まれるはずだが、map.jsファイルだけが呼び出し出来ず
  <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
```
```html:aplication.js
//下記の記述により、assets以下のフォルダに保存した自動で読み込まれるはずだが、map.jsファイルだけが呼び出し出来ず
//= require_tree .
//試しにconsole.logで動作を確認したら、application.jsは正常に読み込まれていた。
console.log("hogehoge")
```
##原因と結論
結論を言ってしまうと、`assets/javascriptファイル`に`map.coffee`が生成されていたことが原因でした。
このcoffeeファイルというのが初心者には曲者で、「rails g controller コントローラー名」で`任意のコントローラーを作成した際に、自動で「コントローラー名.coffee」という名前で生成されます`。このcoffeeファイルがあると、同じ名前で作ったjsファイルがあっても、coffeeファイルが優先的にRailsから呼び出されるため、jsファイルが呼び出されないという状態になります。

今回の事象では、`map.jsをassets/javascriptファイルに作成`したが、`同じフォルダ内にmap.coffeeファイルが自動で生成`されていたため、`Railsではmap.coffeeファイルを呼び出ししていた`ということです。
##終わりに
結果だけ見てしまうと、なんて事のない初心者ミスなのですが、特にエラー文などが出るわけではないので解決するのに時間を掛けてしまいました。Railsが自動で、jsファイルやcssファイルを読み込んでくれる仕組みを正しく理解出来ていないと、この様な問題が発生してしまうので、皆さんも注意して下さい。
リモートサーバ上で効率的にAnsibleを書くためにvimをカスタマイズする ( NERDTreeとvim-ansible-vault導入 )

- vimのプラグイン管理ツールをインストールする(NEOBUNDLE)

```
$ curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh | sh
```

- Githubのプラグインも利用する(`vim-ansible-yaml`)
  - https://github.com/chase/vim-ansible-yaml
     - `NeoBundle 'chase/vim-ansible-yaml'` 

- vimrcを編集する


```.vimrc
if has('vim_starting')
  set nocompatible
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

set number
imap <C-j> <esc>
nnoremap <silent><C-e> :NERDTreeToggle<CR>

call neobundle#begin(expand('~/.vim/bundle/'))

NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'tpope/vim-fugitive'
NeoBundle 'kien/ctrlp.vim'
NeoBundle 'flazz/vim-colorschemes'
NeoBundle 'scrooloose/nerdtree'
NeoBundle 'Shougo/vimshell', { 'rev' : '3787e5' }
NeoBundle 'chase/vim-ansible-yaml'
NeoBundle 'vim-ansible-vault'

call neobundle#end()

filetype plugin indent on
NeoBundleCheck
```

- `vim .vimrc`を開くと下記のようにインストールが始まるので `y`と入力

```
Not installed bundles:  ['vimshell', 'ctrlp.vim', 'vim-..., 'vim-fugitive', 'neosnippet.vim', 'neosnippet-snippets']
Install bundles now?
(y)es, [N]o:
```

- `NeoBundle 'vim-ansible-vault'`でインストールに失敗するとき
- `~/.vim/bundle/` に以下を配置する
  - `git clone https://github.com/b4b4r07/vim-ansible-vault`


# ansible-vaultをvimコマンドで利用する
秘密情報を暗号化するには
`$ ansible-vault encrypt --vault-password-file=~/.vault_password vault.yaml `
のコマンドが必要で打つのが結構しんどい..

めっちゃ便利ツールがあった..!ので導入。

- `vim-ansible-vault`を利用
  - https://github.com/b4b4r07/vim-ansible-vault 
- `.vimrc` に以下を追加
  - `NeoBundle 'vim-ansible-vault'`
  - ※ 上記の`.vimrc`ファイルには定義済み 
- vaultパスワードを記載したファイルを作成
  - `~/.vault_password` 

- 暗号化するvimコマンド
  - `:AnsibleVaultEncrypt`


![ansible-vault-before.png](https://qiita-image-store.s3.amazonaws.com/0/63395/341b4ed1-ca7a-41f5-a135-2c7b13d91009.png)

- 結果

![ansible-vault-encrypt-result.png](https://qiita-image-store.s3.amazonaws.com/0/63395/818dceb3-c945-3a49-df6b-9a8386cf7663.png)

- 復号するvimコマンド
  - `:AnsibleVaultDecrypt`

![ansible-vault-decrypt1.png](https://qiita-image-store.s3.amazonaws.com/0/63395/410b0710-02a1-2606-8da9-052e7f91aec9.png)

- 結果

![ansible-vault-decrypt2.png](https://qiita-image-store.s3.amazonaws.com/0/63395/fad8033b-3af6-48e5-cef2-fe4e62a72225.png)





# ショートカット

|コマンド  |説明  |
|---|---|
|Ctr+ww|タブを移動する|
|Ctr+e|NEDRTreeモードにする|
|Ctr+j| ESCボタン|
|Ctr+wh|カーソルを左のウィンドウに移動する|
|Ctr+wj|カーソルを下のウィンドウに移動する|
|Ctr+wk|カーソルを上のウィンドウに移動する|
|Ctr+wl|カーソルを右のウィンドウに移動する|


# ファイル操作
|コマンド  |説明  |
|---|---|
|o|ファイルオープンする|
|t|タブでオープンする|
|i|水平分割でファイルをオープン|
|s|垂直分割でオープンする|
|gt|画面タブを移動する|


# コマンドモード
|コマンド  |説明  |
|---|---|
|:sh|シェルを実行してから戻ってこれる(vimが開いている状態になる)|


※ vimのショートカットメモは適宜更新します