OmniAICreator/Qiita-1.07M huggingface dataset:
Why UiPath? - 特徴とイントール方法

#Why UiPath?

UiPathは他のRPAプロダクトと比べて次の特徴があり、RPAを始めるには最適なプラットフォームとなっています。

- 体験版が無償でダウンロードでき、誰でもすぐに始められる。
- 無償の充実したオンライン・トレーニングプログラムや豊富なサンプル実装があり、誰でも理解ができる環境が整っている。
- オープン技術を採用しているため公開情報が多く安心して使うことができる。
- RPAとしてフルスタックの機能をもっており、世界中で使用事例が多い。
- これらの理由により、インターネット上に豊富な情報がある。
 
#ダンロードとインストール

1. ダウンロードサイトで必要事項を入力します。  
公式Webサイト ( https://www.uipath.com/ja/download-free-automation-software-trial ) 2017年9月時点<br>
<img src="https://qiita-image-store.s3.amazonaws.com/0/202992/441e54e2-8fb7-7059-16f6-01a43215177a.png" width=50%>  
<br>
2. 送られてくるメールのリンクからインストーラをダウンロードします。  
<img src="https://qiita-image-store.s3.amazonaws.com/0/202992/d45bb841-e496-9f46-ee59-0b3e72c93481.png" width=50%>  
<br>
3. ダウンロードしたインストーラをダブルクリックします。  
<img src="https://qiita-image-store.s3.amazonaws.com/0/202992/35d109a6-9525-809c-0004-4171cbc6b5b1.png" width=50%>  
<br>
4. Start Freeをクリックします。  
<img src="https://qiita-image-store.s3.amazonaws.com/0/202992/d41c3aea-bc02-b223-8fa4-e131a53c6860.png" width=50%>  
<br>
5. Emailアドレスを入力してActivateボタンをクリックします。  
<img src="https://qiita-image-store.s3.amazonaws.com/0/202992/8badf1c2-56b3-78c5-bc8f-e007199adeee.png" width=50%>  
<br>
6. 完了！  
<img src="https://qiita-image-store.s3.amazonaws.com/0/202992/2ccb9c32-c1dd-af57-19c6-8bc686be30bf.png" width=50%>
DPDKをnativeを使わずにビルドする

概要
====
DPDKを利用したアプリのdockerイメージを別マシンで動かした場合に、変な異常終了が発生したときの覚え書きです。

アプリをnativeオプションでビルドしていたので、それを外せばOKかと思ったのですが、DPDKも標準でnativeビルドされるので、そっちも対応する必要がありました。

手順
====
64bit環境でgccを使ってビルドする場合のやり方です。他の環境でも、コピーするファイルを変えたりすれば対応できると思います。

1. DPDKのソースを展開する。
2. `config`配下の`defconfig_x86_64-native-linuxapp-gcc`を`defconfig_x86_64-default-linuxapp-gcc`としてコピーする。
3. `defconfig_x86_64-default-linuxapp-gcc`の`CONFIG_RTE_MACHINE`を`native`から`default`に変更する。
4. DPDKのビルドの際の`make`コマンドのパラメータを`T=x86_64-default-linuxapp-gcc`とする。

簡単ですが、以上となります。
ちなみに上記の手順でビルドした場合は、`gcc`のオプションが`-march=core2`になるようです。

`defconfig_x86_64-native-linuxapp-gcc` ファイルをコピーせず、直接中身を `CONFIG_RTE_MACHINE=default` に変更してもよさそうです。（ `T=x86_64-native-linuxapp-gcc` になります。）
初のNode.js #2

#前回までは・・

前回まではNode.jsをWindowsにインストールしたり、
jsファイルをコンソールから実行したりしました。
（止まっている蟻がつついたら動くだけか確かめただけみたいな・・）
記事読んでいただいたり、いいねしてくれた方々、ありがとうございます。
[前回記事](https://qiita.com/R_kanbayashi/items/03a43ccc82ca0006c3dd)


今回は初歩の初歩の追加、できればnpmを使う所まで行けたらと思います。

#環境
```
Windows7(64-bit)
```

#対話モード

nodeのコマンドプロンプト状態から、対話モードにするには、

```
C:\Users\(Username)\node   
```
のように、nodeと入力すると、

```
>
```
対話モードになります。

```
> console.log("コンニチワ")
コンニチワ
undefined
>
```
コンニチワが直接表示されました。
何をするにも対話モードでないと始まらなそうなので、
今回記事として書いてみました。

対話モードから抜ける時は下記の通りです。

```
> .exit
```

#npmを使ってパッケージインストール

対話モードもできた所で、今度はパッケージをインストールしてみます。
ここで言うパッケージとは、ライブラリやモジュール（requier)がまとまったもの、、
という認識です。Webアプリケーション開発用やテスト用、
便利なユーティリティなどなど（違っていたらコメントください；；

npmはNode.jsをインストールする際に、すでに入っています。

```
> npm install (パッケージ名）
```

という感じでしょうか。
オプションコマンドの -g など、いろいろ用途に沿って使い方が色々あるようです。
パッケージも数多くあるので、次回はnpmをもっと深く掘り下げようとおもいます。
（インストールまでいかなかった。。）
nvmで同じバージョンのnodeを分けて管理する

# 背景
nvmで異なるバージョンのnodeを管理するのは大変便利だけど、pythonのvenvみたいに、「同じバージョンだけど違うグローバルライブラリ」のセットを管理したい場合があるので、その方法を調査してみた。

# 調査

どうやら、ずっと昔から要望としてはあるものの、「nvmとしては実装する予定がない」らしい。

- [Manage multiple installations of the same Node version](https://github.com/creationix/nvm/issues/58) (2011)

> Since this is a less used feature and it's not that hard to do by hand, I'd rather not bloat the project with it built-in.

- [Support multiple environments for the same version](https://github.com/creationix/nvm/issues/816) (2015)

> Do you mean, installing multiple copies of the same version of node with separate global namespaces and npms?

> If that's what you want, why wouldn't you just have multiple copies of nvm in different $NVM_DIRs?

- [Can nvm be used to completely isolate node environments with same version numbers?](https://github.com/creationix/nvm/issues/1328) (2016)

> The simple solution to needing multiple installs of node that have the same version number is, to use different NVM_DIR folders (and different installations of nvm), each with their own copy of the node version you want.

# 結論

nvmとして相当する機能はない、そしてこれからも実装される可能性はなかったが、`NVM_DIR`環境変数でnvm本体を複数インストールできるので、この方法で同じバージョンのnodeを隔離することは可能。

## 例

### nvmを別のフォルダーにインストール
READMEに記載された通りに、`.nvm-myenv`にnvmをインストールする：

```bash
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.4/install.sh \
| NVM_DIR=~/.nvm-myenv bash
```

### nvmの切り替え

本来`.profile`や`.bashrc`に追加されるnvmのscriptを切替時に手動で叩く：

```bash
export NVM_DIR="$HOME/.nvm-myenv"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
```

### 注意点

- `nvm`コマンドはPATHで参照される実行ファイルではなく、`nvm.sh`が実行されるたびにshellに設定されるので、上記の方法で切り替えた後にもし新しいshell sessionに入ったら、もう一度上記のコマンドを叩かないと、`nvm`コマンドは見つからなくなる。
    - 普段、nvm使うときは`.profile`/`.bashrc`に上記のコマンドを入れてあるはずだけど、複数のnvmがあるときに「新しいshell sessionは常に`.profile`/`.bashrc`に設定されている方を使っしまう」という問題があるので、`.profile`/`.bashrc`からは削除したほうが混乱を防げるだろう。
Cython手抜き実装のモンテカルロ法のスピードを速くする．

# 本日はCython
以前書いた
[Pythonでモンテカルロ法の実装を手抜きで速くする．](http://qiita.com/SatoshiTerasaki/items/8fe51a21590582ee873e)

の　Cython　を用いた実装があまりにも手抜きすぎたので補足しておきます．

## 元々のPythonのコードはこれ

```py3
import random
NUM=100000000
def monte():
    counter = 0
    for i in range(NUM):
        x = random.random()
        y = random.random()
        if x*x+y*y < 1.0:
            counter += 1
    pi = 4.0*counter/NUM
    print(pi)


def main():
    monte()

if __name__ == '__main__':
    main()
```

##　手抜きCythonはこれ

```cython
#monte.pyx
import random

cdef int NUM = 100000000

cdef cmonte():
    cdef :
        int counter = 0
        int i=0
        double x
        double y
    for i in range(NUM):
        x = random.random()
        y = random.random()
        if x*x + y*y < 1.0:
            counter += 1

    cdef double pi = 4.0*counter/NUM
    return pi

def monte():
    pi=cmonte()
    print(pi)
```

100秒ほどから17秒（12inch MacBookで計測）に縮んだのはいいけれどもっと頑張れるはず．
randomの部分はPythonのコードなのでここをCの実装を使えば良さそう．

## Cython 改良版

```cython
from libc.stdlib cimport rand, RAND_MAX

cdef int NUM = 100000000

def monte():
    cdef :
        int counter = 0
        int i=0
        double x
        double y
    for i in range(NUM):
        x = (rand()+1.0)/(RAND_MAX+2.0)
        y = (rand()+1.0)/(RAND_MAX+2.0)
        if x*x + y*y < 1.0:
            counter += 1

    pi = 4.0*counter/NUM
    print(pi)
```

`setup.py` も書きましょう．

```py3
#setup.py
from setuptools import setup, Extension

ext_modules = [
    Extension(
        name='monte',
        sources=['monte.pyx']
        )
]

setup(
    name = 'cymonte',
    ext_modules = ext_modules
)
```

次をターミナルで実行するとモジュールができます．Windowsでもいけると思います．

```shell-session
$ python setup.py build_ext --inplace
```

あとは動かすためのメインスクリプトを書く．

```py3
#main.py
import monte
monte.monte()
```

さあ，動かしましょう．

```shell-session
$ time python main.py
real	0m2.081s
user	0m1.935s
sys 	0m0.070s
```

チューニングをしてかなり速くなりました！
Numbaの実装，　C++の実装に匹敵するほどまで近けることができましたね．

## Reference:

[Monte Carlo Simulation with Cython](http://hplgit.github.io/teamods/MC_cython/sphinx/main_MC_cython.html)
nodejs note

# base64
standard lib.

```javascript
var enc = new Buffer("日本").toString('base64')
var dec = new Buffer(enc, 'base64').toString()
```

# gzip
standard lib.

```javascript
var zlib = require('zlib');
var bin = zlib.gzipSync("imaoka-san");
var dec = zlib.gunzipSync(bin).toString()
```

# Buffer

https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_buffer
- String  = immutable & not byte-array
- Buffer = mutable & byte-array

## from fs / encoding

```javascript:
var ret = fs.readFileSync("./cp932.txt");
// ret is Buffer, raw bin-array
var iconv = require('iconv-lite');

// decord bin-array(cp932) to json strings
var js_str = iconv.decode(ret,'CP932');
// json strings to utf8
js_str = iconv.encode(cp932,'UTF8').toString();

```

## npx ?

- ./node_modules/.bin/(package-name)
- $(npm bin)/(package-name)
- Write npm-scripts @ package.json

`npx` more cool! 

```sh:
npm install pm2
npx pm2

  Usage: pm2 [cmd] app


  Options:

    -V, --version                    output the version number
    -v --version                     get version

```
Perlで、ハッシュをprintデバッグする

#はじめに
Perlは以前業務で他の人から渡されたソースを読む機会があり、その時のコードがあまりに何やってるかよく分からないコードだったもので、それ以来すっかりPerl恐怖症に。
ずーっと敬遠していたのですが、新しく配属されるプロジェクトでPerlを本格的に使うことになり、いよいよ逃げられなくなりました。
それでもまあ、PHPで言うところの`var_dump()`があればどうにかなるだろう、とは思っていたのですが、これが意外と素直に出てこない。
特にハッシュのデバッグがちょっと面倒に感じました。
というわけで、その試行錯誤の果てを自分用に備忘録。

#方法1
Perlでは、PHPと違い`print`でスカラー値、配列、ハッシュ全て表示出来るとのこと。あら便利。

```pl
#!/usr/bin/perl
use strict;
use warnings;

my %members = (
    '西住みほ' => 1023,
    '武部沙織' => 622,
    '五十鈴華' => 1216,
    '秋山優花里' => 66,
    '冷泉麻子' => 91
);

print %members;
```

実行結果

```
秋山優花里66西住みほ1023五十鈴華1216冷泉麻子91武部沙織622
```

**怒涛の横一列。**
表示は確かに出来るけど、これじゃあいくらなんでも、てもの。

#方法2
Perlでは、配列やハッシュを`print`する際に区切り文字が指定出来るとのこと。
`$,`という特殊変数を定義してあげればいいようです。

```pl
#!/usr/bin/perl
use strict;
use warnings;

my %members = (
    '西住みほ' => 1023,
    '武部沙織' => 622,
    '五十鈴華' => 1216,
    '秋山優花里' => 66,
    '冷泉麻子' => 91
);

$, = "\n";
print %members;
```

実行結果

```
西住みほ
1023
冷泉麻子
91
武部沙織
622
秋山優花里
66
五十鈴華
1216
```

さっきよりは見やすくなったものの。。。という感じです。
そもそもこの数字は「数値」なのか「文字列」なのか、そこも不明。
その証拠に、`%members`を

```pl
my %members = (
    '西住みほ' => '1023',
    '武部沙織' => '622',
    '五十鈴華' => '1216',
    '秋山優花里' => '66',
    '冷泉麻子' => '91'
);
```

とvalueを文字列に置き換えてみても、結果はこう。

```
武部沙織
622
秋山優花里
66
冷泉麻子
91
五十鈴華
1216
西住みほ
1023
```

変わってませんね。
ちなみに順番が違うのは、Perlのハッシュが順番を保持しないから。


#方法3
Data::Dumperを使う方法。
Dumperを使う際は、`print`だけでなく、`print Dumper`と書く。

```pl
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my %members = (
    '西住みほ' => 1023,
    '武部沙織' => 622,
    '五十鈴華' => 1216,
    '秋山優花里' => 66,
    '冷泉麻子' => 91
);

print Dumper %members;
```

実行結果

```
$VAR1 = '冷泉麻子';
$VAR2 = 91;
$VAR3 = '秋山優花里';
$VAR4 = 66;
$VAR5 = '武部沙織';
$VAR6 = 622;
$VAR7 = '西住みほ';
$VAR8 = 1023;
$VAR9 = '五十鈴華';
$VAR10 = 1216;
```

さっきよりは良い感じです。
ハッシュのvalueに該当する箇所を文字列に置き換えてみます。

```pl
my %members = (
    '西住みほ' => '1023',
    '武部沙織' => '622',
    '五十鈴華' => '1216',
    '秋山優花里' => '66',
    '冷泉麻子' => '91'
);
```

実行結果

```
$VAR1 = '武部沙織';
$VAR2 = '622';
$VAR3 = '冷泉麻子';
$VAR4 = '91';
$VAR5 = '西住みほ';
$VAR6 = '1023';
$VAR7 = '五十鈴華';
$VAR8 = '1216';
$VAR9 = '秋山優花里';
$VAR10 = '66';
```

ちゃんと文字列と数値が区別されています。
せっかくなので、`key => value`な関係をもう少し見やすく出来ないものかと。

#方法4 (解決策)
Data::Dumperを使い、かつハッシュを無名ハッシュとして一度変数に代入し、それを`print`する方法。

```pl
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my %members = (
    '西住みほ' => 1023,
    '武部沙織' => 622,
    '五十鈴華' => 1216,
    '秋山優花里' => 66,
    '冷泉麻子' => 91
);
my $membersRef = {%members};

print Dumper $membersRef;
```

実行結果

```
$VAR1 = {
          '冷泉麻子' => 91,
          '武部沙織' => 622,
          '秋山優花里' => 66,
          '五十鈴華' => 1216,
          '西住みほ' => 1023
        };
```

これですよこれ！文字列でやってみます。

```
$VAR1 = {
          '秋山優花里' => '66',
          '西住みほ' => '1023',
          '冷泉麻子' => '91',
          '武部沙織' => '622',
          '五十鈴華' => '1216'
        };
```

完璧ですね。これで一件落着。

#結論
1. Data::Dumperを使う。
2. ハッシュは無名ハッシュとして一度変数に代入。
3. 代入しておいた変数を`print Dumper`する。

#おわりに
Perlを触り始めてまだ日が浅いのですが、慣れるまでは時間が掛かりそうな予感。
あとは実際のコードに触れながらやっていくしかありませんね。とほほ。

改めてPHPって便利な言語だったなと。。
ただクイックソートなど、PHPとPerlで同じようなコードを書いてみたら、Perlの方が体感で分かるほど圧倒的に早かったので、使いこなせたらそれはそれで幅が広がりそうです。
あとはPerlの醍醐味は文字列処理にあるらしい？ので、そこも慣れていきたいです。

何か間違いなどあれば、ご指摘頂けると有り難いです。
Python/Numpyのnp.newaxisの考え方のコツ

#はじめに
Pythonは機械学習の研究などで多く用いられているプログラミング言語です。特に基礎研究の分野でも使いたいという場合には、これがかえって使いにくくなってしまうことがよくあります。なぜなら、for文を多く書くと遅くなるからです。そこで、for文を書かずに頑張ろうとすると色々なトラブルに出くわすのですが、その中でも筆者が手こずった`np.newaxis`の使い方を紹介していこうと思います。これは、いろんなパラメータで実験したいときなどに多く出くわすでしょう。

※スライスについて事前知識があるものとして説明します。調べるなどして事前に知識を入れておいてください。


[[Python]Numpyの参照、抽出、結合](http://qiita.com/supersaiakujin/items/d63c73bb7b5aac43898a "Qiita")
[Indexing - docs.scipy.org](https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html "scipy")

#本編

##1. まず用いるデータを把握しましょう
はじめは、どんなデータがあって、どんなゴールへ向かわせたいのかをしっかり整理するとよいです。
どんなデータで、配列の形状はどうなっているか、何次元なのかをしっかり頭に入れておきましょう。

簡単のために次のような状況を考えてみます。

```numpy:init.py
import numpy as np
assert a.shape == (N,)  # ndarray
assert b.shape == (N, K)  # ndarray
```

* `a`、`b`は共にベクトルで、`a+b`をしたい

![a+b_ex.png](https://qiita-image-store.s3.amazonaws.com/0/202772/47827093-0e09-73ba-8c6f-d150dba16320.png)

* `b`は`K`個のサンプルを持っているので実体は`(N, K)`の二次元配列で格納している

![a+b_but.PNG](https://qiita-image-store.s3.amazonaws.com/0/202772/5c0dec3b-e3aa-eaa0-5398-eac0e4944e00.png)


これをfor文でかくと、

```numpy:naive.py
c = np.zeros(N, K)
for k in range(K):
    c[:, k] = a + b[:, k]
```
ですが、for文はできるだけ書きたくありません。
また、`a+b`と単純にやってもできますが、これでは複雑な問題のときに全く対応できなくなります。

##2. ゴールを考える。

今回のゴールは、`K`個の`b`のサンプルごとに`a+b`を行い、サンプルごとの結果を得たいわけです。最終的に得たい結果＝（ゴールの配列）の形状をしっかりと定義しましょう。

```numpy:goal.py
c = np.zeros(N, K)
hogehoge()
assert c.shape == (N, K)
```
こうなります。

##3. np.newaxisの挿入

普通に`a+b`を頭の中でするとこうなるのですが、

![a+b.PNG](https://qiita-image-store.s3.amazonaws.com/0/202772/76558c06-0947-1126-3f23-865db4802f5d.png)

`b`には複数のサンプルがある２次元配列なのでどう計算していいのかわかりません。
※実際は自動的に推測してくれますが、これに任せきるのは今後よくありません。

![a+b_but.PNG](https://qiita-image-store.s3.amazonaws.com/0/202772/b54c92de-b83f-a282-3215-9364eadc88bd.png)

これを、どう計算するべきかの指示をこちらで与えてあげましょう。それが`np.newaxis`です。
実は、`np.newaxis`の実体は`None`ですが、あまり気にせず`np.newaxis`を使いましょう。
配列が同じ形状であることを必要とする演算（ここでは`+`）が来たとき、こちらから「同じ形状にしてください」という指示をします。まず、配列の次元が`a.shape == (N,)`なので、せめて`a.shape == (N, 1)`にしてあげます。そのために、`a[:, np.newaxis]`とします。この操作によって、Numpyが自動的に演算子のもう片方の引数から判断できるようになり、`(N, 1)`から`(N, K)`に引き伸ばして計算を行ってくれます。

![a+b=c.PNG](https://qiita-image-store.s3.amazonaws.com/0/202772/79ed06e5-76c5-437a-124b-0d62359c8bde.png)


```numpy:add_samples.py
import numpy as np
assert a.shape == (N,)  # ndarray
assert b.shape == (N, K)  # ndarray

# a[:, (ここが足りてない)] 
c = a[:, np.newaxis] + b[:, :]
assert c.shape == (N, K)  #エラーチェックとメモの役割を同時に持たせましょう
```

# まとめ
このように、Numpyが自動的にやってくれる処理を冷静に理解してみると、複雑な問題にも簡単に対応できるようになります。

※もっと難しい問題の場合もあとで追記します。

※説明がわかりにくいなと感じることがあれば、ぜひ教えてください。質問などもコメントにて受け付けます。
AWS EC2 の EIP(Elastic IP Addresses) を間違って解放しない様に ENI(Elastic Network Interface) に関連付けさせておく

# ０．はじめに

EIP(Elastic IP Addresses) には、
名前とか、コメントとか、説明とか、タグ付けとか無いみたいですが、

取得後にドメインを割り当てたはいいけど、
すぐには利用しないとか、
利用停止状態で後々利用するとか、

他にも、あるサービスの IP アドレス制限に登録されてるとか、

そういったことがあったので、

利用停止状態でありながらも確保しておきたい EIP(Elastic IP Addresses) を、
間違って解放したり、流用したりしない様に、
ENI(Elastic Network Interface) に関連付けさせておこうと思います。

# １．ENI (Elastic Network Interface) の作成
1. EC2 のマネジメントコンソール画面の左側ペインから、「ネットワーク & セキュリティ」→「ネットワークインターフェース」を選択し、「ネットワークインターフェースの作成」ボタンを押下します。
    * ![0001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/4372fe84-43d1-2dfc-d7af-2a1f8da214df.png)
<br><br>
1. 「ネットワークインターフェースの作成」ダイアログが表示されるので、以下の項目を入力し、「はい、作成する」ボタンを押下します。
    * 説明 : 適当　※後で変更可。
    * サブネット : 適当　※後で変更不可なので、注意!!　
    * プライベート IP : ※自動的に割り当て
    * セキュリティグループ : 適当　※後で変更可。
<br><br>
    * ![0002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/c8d1b091-2da6-ca24-a7ed-7de5f94df42e.png)
<br><br>
1. 元の一覧を参照し作成されているか確認し、管理しやすい様にタグ(Nameとか)を適当に入力します。
    * ![0003.png](https://qiita-image-store.s3.amazonaws.com/0/161939/6ae21da3-6ef9-5011-3eeb-9eb0056f8f01.png)
<br><br>
    * ![0004.png](https://qiita-image-store.s3.amazonaws.com/0/161939/17ab1df7-4535-7e66-28d1-cc2f642db715.png)

# ２．EIP (Elastic IP Addresses) との関連付け
1. EC2 のマネジメントコンソール画面の左側ペインから、「ネットワーク & セキュリティ」→「Elastic IP」を選択後、割り当てたい Elastic IP を選択し、「アクション」→「アドレスの関連付け」を選択します。
    * ![1001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/40e843fe-68d5-e236-8527-551fedc7bb5d.png)
<br><br>
1. 「アドレスの関連付け」画面が表示されるので、以下の項目を入力し、「関連付け」ボタンを押下します。
    * リソースタイプ : ネットワークインターフェイス
    * ネットワークインターフェイス : 作成した ENI
    * プライベート IP : ※上記を選択すると、選択可能になる。
    * 再関連付け : □ チェックしない。
<br><br>
    * ![1002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/c1eb45ff-1bf3-e360-d64e-e95090879e6c.png)
<br><br>
    * ![1003.png](https://qiita-image-store.s3.amazonaws.com/0/161939/27a76300-7fa1-4928-a0fb-56897ee1c98c.png)
<br><br>
    * ![1004.png](https://qiita-image-store.s3.amazonaws.com/0/161939/64de9dd3-5d89-17bb-137c-ec6624e76f0e.png)

# ９９．ハマりポイント

* 今回、ハマりポイントはありませんが、そもそもの観点として、EIP をどの様に管理すべきか、というのがある様に思います。冒頭にも述べましたが、EIP には、名前とか、コメントとか、説明とか、タグ付けとか無いみたいなので、やはり NEI を利用して管理するのが適切なのでしょうか。
<br><br>
* ただ、NEI は EC2 にアタッチされていると、自動的に削除されてしまう様にも思うのですが、その辺はどうなのでしょうか。きちんと確認したわけではないのですが、EC2 インスタンス作成時に自動で付与された ENI は、インスタンス削除時に自動的に削除され、手動で作成した ENI は、削除されない気がします。
<br><br>
* 上記の様な動きをするのであれば、ドメインを割り当てた EIP については、自動で作成された ENI に関連付けするのではなくて、手動で作成した ENI に関連付けさせるのが適切なのかもと思います。
<br><br>
* 一度きちんと確認して、改めて、EIP と ENI を設定し直した方がいいのかもしれません。

# ＸＸ．まとめ

EIP と ENI の最適な管理方法については、また別途投稿出来ればと思います。
カンバンの担当者マグネットの作り方

ちょっと前からチームでカンバンを始めたのですが、担当者の表示がテキストだとやっぱり味気ないということで、プロフィール写真を使ったマグネットをDIYすることにしました。ちょっと技術ネタとずれてしまいますが、新しいメンバーが加わったらまた増産しなければいけないので、自分用のメモとして残しておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/33668/caa8110e-484e-baae-abdc-90cda95f93c7.png)

## はじめに

アバター付きのマグネットを作る方法はおそらく3つ考えられますが、ここで紹介するのは3.の方法です。

1. プリンター印刷可能なマグネットシートに直接印刷する
2. シール付き写真用紙に印刷し、マグネットシートに接着する
3. ただの写真用紙に印刷し、マグネットシートにのりや両面テープで接着する

1.が最も手軽なはずで、[「ぴたえもん 光沢A4 4枚入 MSPG-03-A4-1（マグエックス）」](http://www.amazon.co.jp/exec/obidos/ASIN/B004VZ86Y2/n-oohira-22/ref=nosim/)などが使えると思います。ただ、薄くて磁石が弱そうだったので、今回は採用を見送りました。

そこで、2.のつもりで[「手作りマグネットペーパー(特厚・フォト光沢) JP-MAGP4（サンワサプライ）」](http://www.amazon.co.jp/exec/obidos/ASIN/B000QEIK5C/n-oohira-22/ref=nosim)を購入したのですが、こいつは写真シートに粘着部分がなく、自分で接着する必要があるということが後になって分かりました。というわけで、結果的に 3.になってしまったので、その前提で説明します。

## 準備するもの

何はともあれ必要な材料や道具を準備します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/33668/47d15114-559b-ba14-6146-9447512cb18c.png)

| 準備          | 説明              |
|:-------------|:------------------|
| アバター画像    | 3cm四方のマグネットを作るとして、400px四方ぐらいの画像であれば大丈夫。200px程度だと粗い |
| マグネットシート  | カッターなどで切断可能なシート状のマグネット。先に述べた通り、今回は[「手作りマグネットペーパー(特厚・フォト光沢) JP-MAGP4（サンワサプライ）」](http://www.amazon.co.jp/exec/obidos/ASIN/B000QEIK5C/n-oohira-22/ref=nosim)を使用。ダイソーなどの100均でも入手可能 |
| 光沢紙        | マグネットシート付属の光沢紙にはあまり綺麗に印刷できなかったので、結局プリンターと同じEPSON純正のA4光沢紙を使用 |
| 液体のり      | 光沢紙とマグネットの接着に使用。接着力重視で懐かしのアラビックヤマト |
| カッター       | マグネットシートをカットするのに使用 |
| カッターマット   | 同上 |
| 定規         | 同上 |
| コーナーカッター | カッターで切断後の仕上げに使用。定番の[「かどまるPRO S4765036（サンスター文具）」](http://www.amazon.co.jp/exec/obidos/ASIN/B0076FJ7SS/n-oohira-22/ref=nosim/) |

## 1. アバター画像の印刷

アバター画像をタイル状に並べて、A4サイズの写真用紙にまとめて印刷します。A4用紙は210x297mmなので、例えば400px四方のJPEG画像を3cm四方で印刷したいなら、2800x3960pxの画像に配置してやればよいことになります。

短辺にアバター画像を最大で7枚まで配置できる計算になりますが、端の画像がはみ出して印刷される可能性があるので、私は余白を入れて6枚ずつ並べました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/33668/8100e8a8-c752-4b46-4328-061b759873b0.png)


## 2. マグネットへの貼り付け

次に、印刷した写真用紙をマグネットシートに接着します。接着剤を使わなくても液体のりで十分くっついたので、今回はのりを使いました。

1回でA4用紙を丸ごと貼り付けるのは難しいので、1列ずつ切り取って手順2→3を繰り返すとよいでしょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/33668/d25a5636-092c-0327-dc2b-22cf842bbc1c.png)

## 3. マグネットのカット

最後に、アバター画像ごとにマグネットシートをカットします。定規を当ててカッターを2,3回走らせれば、綺麗に切り取れると思います。

なお、ここでもうひと手間かけて、コーナーカッターで四隅の角を落とすと、格段にクオリティが上がるのでオススメです。私が今回使ったマグネットシートだと厚手なので、少し力が必要な点は注意です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/33668/2a6e7c79-ce70-24e8-044f-e3ae9455b90c.png)


## まとめ

この記事では、市販のマグネットシートを使ってカンバンで使える担当者マグネットを自作する方法を紹介しました。この方法は、写真用紙とマグネットシートを自分で接着しなければならず一手間かかりますが、その分マグネットシートが分厚くて磁力が強いので、ふせんの上から貼っても一切はがれません。むしろ少し強すぎて、マグネットを取って別のふせんに移動させづらいくらいです。

カンバンは、ちょっとした工夫でただのホワイトボードを自分たちのチーム色に染めていけるのが醍醐味ですよね。「ウチはこんなことやってる」「この材料を使うといいよ」といった情報があれば、ぜひコメント欄で教えてもらえるとうれしいです。紹介した方法がどこかのチームのカンバンでお役に立てれば幸いです。
Ubuntu 16.04 LTSでssh.serviceがunrecognized serviceと言われたときの対処法

# 事の始まり

Ubuntu 16.04 LTSが動いているPCに対してSSH接続を試みたところ、以下のようなエラーを吐いて拒否された。

```bash
$ ssh hoge@192.168.2.103
ssh: connect to host 192.168.2.103 port 22: Connection refused
```

# 「どうせsshdが落ちてるんだろｗ」

そう思ってサービスの状態を確認しようとしたところ…

```bash
$ sudo service sshd status
●sshd.service
  Loaded: not-found (Reason: No such file or directory)
  Active: inactive (dead)
```

どうやら認識すらされてないようです。

# 対処法

`openssh-server`を再インストールしましょう。

```bash
$ sudo apt-get purge openssh-server
$ sudo apt-get install openssh-server
```

これで起動できるようになったはずです。それでは、快適なインフラライフを…:+1:

```bash
$ sudo service sshd start
$ sudo service sshd status
●ssh.service - OpenBSD Secure Shell Server
  Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
  Active: active (running) since ...
```

# 参考

https://askubuntu.com/questins/265982/unable-to-start-sshd
kinect(v1)をmacで使えるようにする

#環境
Mac Book Pro
 OS Version: Sierra 10.12.6
Kinect
Version: v1 (参考: http://www.buildinsider.net/small/kinectv2cpp/01)

#手順
基本的にはこちらの手順に従えばうまくいきます。
http://karaage.hatenadiary.jp/entry/2017/05/08/073000
ただ実行してもCannot open kinectとエラーが出てしまう場合はこちらを参考にしてください。
http://hikolab.com/blog/?tag=kinect
こちらのブログにおいて
ln -s /usr/local/Cellar/libfreenect/0.5.1/lib/libfreenect.0.5.0.dylib libfreenect.0.1.2.dylib
ここのコマンドですがlibfreenect(https://github.com/OpenKinect/libfreenect) をあらかじめダウンロードしておく必要があります(Homebrewの場合はbrew install libfreenect)。また、リンク先をダウンロードされたlibfreenectに合わせて変更する必要があります(2017.09.19時点でbrewでlibfreenectをダウンロードした場合は/usr/local/Cellar/libfreenect/0.5.6/lib/libfreenect.0.5.5.dylib)
VS Codeでtextlintを使って文章をチェック グローバル設定メモ

まず基本的な方法は下記記事を参照にしております。

[VS Codeでtextlintを使って文章をチェックする - Qiita](http://qiita.com/azu/items/2c565a38df5ed4c9f4e1 "VS Codeでtextlintを使って文章をチェックする - Qiita")  
[テキストの校正用に textlint を導入してみた - blog.kymmt.com](http://blog.kymmt.com/entry/textlint "テキストの校正用に textlint を導入してみた - blog.kymmt.com")

# 設定方法


VS codeにてtextlintの拡張をインストールする。  

```
ext install vscode-textlint
```

ターミナルを開いて下記コマンドを使用して`C:\Users\【ユーザ名】`のユーザフォルダへ移動する。  
もしCドライブ以外のパスをターミナルで開いていたら下記コマンドの前に`c:`のコマンドの実行が必要。

```
cd %userprofile%
```

移動先で下記コマンドを実行しtextlintとルールをグローバルインストールする。  
**-gは必須**

```
npm i -g textlint textlint textlint-rule-preset-ja-technical-writing
```

下記コマンドを実行することで.textlintrcというファイルがユーザフォルダに作成される。

```
textlint --init
```

作成された.textlintrcの中に下記を入力。

```json
{
  "filters": {},
  "rules": {
    "preset-ja-technical-writing": true
  }
}
```

これで設定の作成は完了  
mdファイルを開くと自動でスペルチェックが動作します。  
他の設定等はユーザフォルダに作成した.textlintrcへ追記するといいでしょう。
Docker コンテナ上で Matplotlib を動かす

# 前提

* 出力結果を PNG 画像として出力する。
* ラベルなどのグラフ内の文字に日本語を使用できる。

# 方法

## ソース

```Dockerfile:Dockerfile
FROM python:3.6.2

RUN apt-get update \
 && apt-get install -y \
      git \
      unzip \
 && rm -rf /var/lib/apt/lists/*

# フォントとして Ricty Diminished をインストールする。
WORKDIR /usr/share/fonts
ENV RICTY_DIMINISHED_VERSION 3.2.4
ADD https://github.com/mzyy94/RictyDiminished-for-Powerline/archive/$RICTY_DIMINISHED_VERSION-powerline-early-2016.zip .
RUN unzip -jo $RICTY_DIMINISHED_VERSION-powerline-early-2016.zip \
 && fc-cache -fv

# Matplotlib 用の設定ファイルを用意する。
WORKDIR /etc
RUN echo "backend : Agg" >> matplotlibrc \
 && echo "font.family : Ricty Diminished" >> matplotlibrc

# Matplotlib をインストールする。
WORKDIR /opt/app
ENV MATPLOTLIB_VERSION 2.0.2
RUN pip install matplotlib==$MATPLOTLIB_VERSION

# Matplotlib を使ったサンプルスクリプトをコピーする。
COPY plot.py .
```
```docker-compose.yml
version: '3.3'
services:
  plot:
    build: .
    environment:
      MPLCONFIGDIR: /etc
    volumes:
      - .:/opt/data-volume
    working_dir: /opt/data-volume
    entrypoint:
      - python
      - /opt/app/plot.py
```
```plot.py
from matplotlib import pyplot as plt


if __name__ == '__main__':
  labels = ['鰯', '鯖', '秋刀魚', 'リュウグウノツカイ']
  x = list(range(1, len(labels) + 1))
  y = [1, 3, 5, 15]

  plt.bar(x, y, align='center')
  plt.xticks(x, labels, rotation='vertical')
  plt.xlabel('魚の種類')
  plt.ylabel('強さ (pt)')
  plt.tight_layout()
  plt.savefig('plot.png')
```

## 実行結果

![plot.png](https://qiita-image-store.s3.amazonaws.com/0/6697/fe99bf00-61c2-2f7f-d3d4-4ec91ed658e5.png)

# 参考

* [Generating matplotlib graphs without a running X server](https://stackoverflow.com/questions/4931376/generating-matplotlib-graphs-without-a-running-x-server/4935945)
* [Matplotlib » FAQ » Environment Variables](https://matplotlib.org/faq/environment_variables_faq.html)
Macbook ProでThunderbolt 2接続の外付けGPUを使う（Netstor NA211TB + GeForce GTX 760）

間も無くHigh Sierraがリリースされるというタイミングなので今さら感がありますが、Netstor製のThunderbolt 2接続PCIe拡張ボックス「NA211TB」を入手したので、GeForceを載せてMacbook Proから外付けGPUとして使えるようにしてみました。

## 環境
- Macbook Pro (Retina, 13-inch, Early 2015) macOS Sierra 10.12.6
- Netstor NA211TB (Thunderbolt 2, 300W)Technologies
- Gainward GeForce GTX 760

## 設定
[automate-eGPU](https://github.com/goalque/automate-eGPU)を使うと、ドライバのインストールから設定まで自動でいい感じにやってくれます。

### macOSのSIPを無効にする

Sierraの場合はリカバリーモードから簡単に無効にできます。一度Macの電源を落とし、Command+Rを押しながら起動してリカバリーモードにします。
上部のメニューから[ユーティリティー]->[ターミナル]と選んでターミナルを立ち上げ、次のコマンドを実行します。

```shell-session
csrutil disable
```

これで、Macを再起動すればSIPが無効化されます。

ちなみに、元に戻すときは同じようにリカバリーモードでターミナルを立ち上げて次のコマンドを実行します。

```shell-session
csrutil enable
```

### automate-eGPU.shのダウンロードと実行

MacとNA211TBをThunderbolt 2ケーブルで接続し、NA211TB側の電源を入れた状態で、ターミナルを立ち上げて以下のようにコマンドを実行します。

```shell-session
curl -o automate-eGPU.sh https://raw.githubusercontent.com/goalque/automate-eGPU/master/automate-eGPU.sh
chmod +x automate-eGPU.sh
sudo ./automate-eGPU.sh
```

途中で何度か質問があります。特に問題がなければ全て「y」で大丈夫だと思います。

### 再起動

Macを再起動します。

### プライマリディスプレイを設定

[このビデオ](https://www.youtube.com/watch?v=lZ19jDGRFBA&feature=youtu.be&t=20s)の20秒くらいからを参考に、eGPUのディスプレイをプライマリに設定します。

以上です。ビデオカードの設定を見ると、GeForceが追加されていることが確認できます。

![170919-0003.png](https://qiita-image-store.s3.amazonaws.com/0/46062/f7e2cdf1-79b6-cccd-4fd9-c49972177499.png)
![170919-0002.png](https://qiita-image-store.s3.amazonaws.com/0/46062/4b9634ce-15e5-157e-3ff8-a9460ef75415.png)
Delphi で Android のスリープ制御 

以前 EDN（Embarcadero Developer Network)に投稿した記事の転記です。

動画を流すようなアプリなどの場合、画面をスリープ状態にしたくないってことありますよね。
Androidでは [PowerManager](https://developer.android.com/reference/android/os/PowerManager.html) を使用するとアプリ側からスリープの On/Offを行なうことができます。

##注意事項
- スリープを解除すると電池の消耗に影響するため、アプリ側では必ず解除のロジックを考慮する必要があります。
- また、この処理を行なうのには、プロジェクトオプションで WakeLock の箇所にチェックをつけてパーミッションを設定する必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164551/35bc858b-a3b1-3899-802d-94371ec9f521.png)

##サンプルコード
フォーム上にボタンを２つおき

- デバイスの設定で設定されているスリープを解除する処理
- 上記を解除する処理

を記述しています。


```delphi
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls
// 以下追加
  , Androidapi.Helpers 
  , Androidapi.Jni.Os
  , Androidapi.Jni.JavaTypes
  , Androidapi.Jni.GraphicsContentViewText
//
  ;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private 宣言 }
    PW: JPowerManager;
    WL: JPowerManager_WakeLock;
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
// wakelock でスリープの解除を行なっています
// getSystemService で powerService を取得
  PW := TJPowerManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.POWER_SERVICE));
  if PW <> nil then begin
    // PowerManager の wakeLock を取得
    WL := PW.newWakeLock
      (TJPowerManager.JavaClass.SCREEN_BRIGHT_WAKE_LOCK
        or TJPowerManager.JavaClass.ACQUIRE_CAUSES_WAKEUP,
      StringToJString('Power Manager Test'));
    if WL <> nil then
      WL.acquire; // acquire を実行し wakeLockを実行
  end else
    Button1.Text := 'Not use Power Manager';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
// releaseで wakelockを解除します
  if WL <> nil then  //wakelockが設定されているか
    WL.release;        // 解除
end;

end.
EC2を稼働させたまま別のアカウントに引っ越す

#概要
稼働中のEC2インスタンスを停止させず＆影響を与えずに別アカウントに引っ越したい時、あると思います。
そんな時のために手順をまとめました。

#移植先(DestinationSide)

### 1.コンソールにログインする
### 2.ダッシュボード右上の[アカウント]を選択する
![ダッシュボード右上の[アカウント]を選択する.png](https://qiita-image-store.s3.amazonaws.com/0/189055/b016ce9f-2543-d98e-ffad-0d4ad37e70b7.png)


### 3.[アカウント設定]のアカウントIDを控える
![[アカウント設定]のアカウントIDを控える.png](https://qiita-image-store.s3.amazonaws.com/0/189055/4e02bc4c-27b0-cfd4-c509-77f1faac337e.png)


#移植元(SourceSide)

### 4.コンソールにログインする
### 5.引っ越したいEC2のAMIを作成する

![引っ越したいEC2のAMIを作成する.png](https://qiita-image-store.s3.amazonaws.com/0/189055/57f9dfaa-8203-06dd-4668-8b0ebc11858a.png)

![引っ越したいEC2のAMIを作成する.png](https://qiita-image-store.s3.amazonaws.com/0/189055/cc409f36-6dfb-1988-ff06-96616fc0227a.png)

**※「再起動しない」を忘れないように**


### 6.イメージパーミッションの変更を選択する

![イメージパーミッションの変更を選択する.png](https://qiita-image-store.s3.amazonaws.com/0/189055/7e4914b4-56dd-9261-f230-f3cbdba8e04b.png)

### 7.アクセス許可の追加に(3)で控えた移植先のIDを記入する

![アクセス許可の追加に(3)で控えた移植先のIDを記入する.png](https://qiita-image-store.s3.amazonaws.com/0/189055/2d06a134-a709-b3fc-ed6a-1fceda52338c.png)

#移植先(DestinationSide)

### 8.事前にアウトバウンドを制限したセキュリティーグループを作成しておく

インバウンドはSSH接続用にマイIPのみ許可しておく
![q8.png](https://qiita-image-store.s3.amazonaws.com/0/189055/99a0aeee-2b65-7def-213e-c9c139ae753f.png)

![q82.png](https://qiita-image-store.s3.amazonaws.com/0/189055/db12643c-27d9-a812-3f00-14111ea83504.png)


### 9.[EC2インスタンスの作成]を選択する

### 10.マイAMIから引っ越したいAMIを指定する

![q10.png](https://qiita-image-store.s3.amazonaws.com/0/189055/bb78a0ae-e39c-74fa-bdc1-e5935ef9818c.png)

### 11.EC2インスタンスを作成する

(余談)AWSアカウントが作成されてから間もない or 利用実績が乏しい
などの条件に引っかかると、EC2インスタンス作成時に「AWS側での認証作業」が必要になる可能性があります。
だいたい1時間くらいで終わるので、気長に待ちましょう。

![q11.png](https://qiita-image-store.s3.amazonaws.com/0/189055/2307c8bd-1275-da02-813e-1fc04a05cfbc.png)


### 12.EC2インスタンスを起動する

![q12.png](https://qiita-image-store.s3.amazonaws.com/0/189055/8d97df07-81e6-6c65-13e6-c1646eb7e31c.png)


### 13.自動処理の停止を行う


#### cron

```
crontab -e
```
で停止したい処理のコメントアウトを行うか、

```
cd /var/spool/cron/
mv root root_bk
```

でcron自体をリネームし、実行されないようにする

#### phpなど

```
ps aux | grep php
```
で検索し、実行中のphpがいたらPKILLする

#### mount

```
cat /etc/mtab
mount -v
```
でmountされているディレクトリがあれば、unmountする

#### rc.local

mountしていたりshellを実行していたら、適宜対処する


### 14.事後処理

- 移植先(DestinationSide)でEC2を作成し終わったので移植元(SourceSide)のAMI共有を解除しましょう
- 自動処理の停止を行ったので、セキュリティーグループを適宜緩和しましょう
- コメントアウトやリネームした自動処理関連を適宜元に戻しましょう


### 15.引っ越し完了

お疲れ様でした!

-
[HTCVIVE](初心者向け)実行後若干ぼやけていろいろ反応しなくなった場合

<h1>起こったこと</h1>
開発中は実際にHMDを被らないで手で持って確認などをしていたが、たまに若干画面がぼやけるようになり、コントローラーは動かすことができるが、オブジェクトを持てなくなったりした。
最初は充電がなくなってきたのかなと勘違いをしたりして解決に少し時間を使ってしまった。

<h1>解決方法</h1>
HMDの横側にあるヘッドセットボタンを押してしまっていたことが原因だった。(VIVEコントローラーのシステムボタンもその対象)

ヘッドセットボタンを押すと、HMDを被ってる状態だとメニューが表示されるがモニターには表示されない。ユーザーはメニューを操作しているはずなので、その状態では他の操作ができない。
なので、もう一度ヘッドセットボタンを押すと元に戻る。

<h1>感想</h1>
HMDを毎回かぶって確認してる人ならすぐ解決できた問題だが、HMDを手でもってモニターを見ながら確認している場合こういう初歩的ミスの原因となるのでこれから気を付けようと思いました(小並感)
Go言語製CLIパスワードマネージャーを使う

# はじめに

コマンドラインでパスワードの管理をしたかったので、Go言語製のCLIパスワードマネージャーのgopassを使います。
Go言語製なので、マルチプラットフォームで使用できます。

gopassでは、暗号化にgpgを使用しており、ファイル管理にgitを使用しています。

# インストール

* gopassのインストール
 * https://www.justwatch.com/gopass/releases/1.3.2/

~~~
export GOPASS_VAR=1.3.2
wget https://www.justwatch.com/gopass/releases/${GOPASS_VAR}/gopass-${GOPASS_VAR}-linux-amd64.deb
sudo dpkg -i gopass-${GOPASS_VAR}-linux-amd64.deb
rm gopass-${GOPASS_VAR}-linux-amd64.deb
~~~

* 必要なツールのインストール

~~~
apt-get install gnupg git xsel
~~~

# セットアップ

## gpgの鍵を作成

* gopassは暗号化にgpgを使用しているのでgpgの鍵を作成します。
 * 実体は~/.gnupg以下

* 鍵作成のために必要な質問に答えます。
　* https://www.justwatch.com/gopass/docs/#setup-gpg

* 鍵作成には十分なエントロピーが必要なので、足りない場合はrng-toolsかhavegedをインストールする必要があります。
 * rng-tools: https://wiki.archlinuxjp.org/index.php/Rng-tools
 * haveged: https://wiki.archlinuxjp.org/index.php/Haveged

~~~
# 鍵作成
gpg2 --full-gen-key
# 公開鍵確認
gpg2 -k
# 秘密鍵確認
gpg2 -K
~~~

## Autocompletion

* gopass用のbash補完の設定をします。
 * タブ補完が効くようになります。

~~~
# .bash_aliasesに追加
source <(gopass completion bash)
~~~

## gopass初期設定

* パスワードの保存先を作成します。
 * 実体は~/.password-store
* 作成したgpg鍵を選択します。

~~~
gopass init

---
# gitで管理する場合
$ which gpg2
/usr/bin/gpg2

gopass config gpg.program "/usr/bin/gpg2"
gopass git config user.signingkey "XXXXXXXX"
gopass git remote add origin git@example.com/pass.git
# 作成した公開鍵をコピーし、githubの自分のアカウントに追加
gpg --armor --export "XXXXXXXX" | xsel --clipboard --input
~~~

# 使い方

* 基本的なコマンド

~~~
# パスワード作成
gopass insert foo/bar
# パスワード自動作成
gopass generate -n foo/bar 16
# パスワード編集
gopass edit foo/bar
# パスワードのリスト表示
gopass
# パスワード表示
gopass foo/bar
# パスワードをクリップボードにコピー
gopass -c foo/bar
# パスワード削除
gopass rm foo/bar
# ファイル検索
gopass search hoge
# ファイルの中身検索
gopass grep hoge
~~~

* パスワードにkey-value形式で付加情報を保存

~~~
gopass insert foo/var baz
gopass edit foo/var baz
gopass foo/var
~~~

* gopass自体の設定
 * https://www.justwatch.com/gopass/docs/#configuration

~~~
# 設定確認
$ gopass config 
askformore: false
autoimport: true
autosync: true
cliptimeout: 45
noconfirm: false
path: /home/mmm/.password-store
safecontent: false
version: 1.3.2
# 設定変更: gopass foo/varでパスワードを表示しない
gopass config safecontent true
~~~

* 別のパスワードマネージャーからのマイグレート
 * 別のパスワードマネージャーからデータをマイグレートできるみたいです。（未検証）
 * https://www.passwordstore.org/#migration

# 既存のパスワードストアを使用する場合

既にパスワードストアがあり、それを使用する方法です。

* githubからcloneする

~~~
gopass clone git@example.com/pass.git
~~~

復号化するために、使用しているgpgの秘密鍵をインポートする必要があります。

* 公開鍵・秘密鍵のエクスポート

~~~
gpg -o pub.key --export <mail address>
gpg -o sec.key --export-secret-keys <mail address>
~~~

* 公開鍵・秘密鍵のインポート

~~~
gpg --import pub.key
gpg --import --allow-secret-key-import sec.key
~~~

# まとめ

Go言語で書かれているので、Windows、Ubuntu両方で利用できます。また、タブ補完が効いたり、クリップボードにコピーなど機能も豊富なので便利です。
ただ、Windowsの使用する場合、タブ補完の設定ができません。

※ gitを使用しているので変更履歴がわかってしまったり、github.comに置くと暗号化されているとはいえ危険なので管理方法には十分気をつける必要があります。

# 参考

他のオプションや詳しい説明はドキュメントを参考に

* GnuPG
 * https://wiki.archlinuxjp.org/index.php/GnuPG

* passgo
 * https://github.com/justwatchcom/gopass
 * https://www.justwatch.com/gopass/docs/
デザインパターンを勉強してみる--第3回 Compositeパターン--

# Compositeパターンとは
Composite パターンを学びます。

みなさん、PC上のフォルダとそのフォルダの中身を消したい時ってどうしますか？

フォルダごと消しますよね？

フォルダ開いてファイル1つずつ消したりしないですよね？



Compositeパターンは、入れ物と中身に対して同じことをしたい時に使うパターンです。

# サンプルケース
以下の4つのソースではCompositeパターンを用いてディレクトリ削除を表現しました。

ソースを追いかけてみてください。どの辺がCompositeパターンなのか分かりますか？

・PCの中のもの(ファイル、ディレクトリetc..)

```java:ThingsInPC.java
public interface ThingsInPC {
  public void remove();
}
```

・ファイル

```java:File.java
public class File implements ThingsInPC {
  private String name = null;
  
  public File(String name){
    this.name = name;
  }
  
  public void remove(){
    System.out.println(name + "を削除しました");
  }
}
```

・ディレクトリ

```java:Directory.java
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

public class Directory implements ThingsInPC {
    private List<ThingsInPC> list = null;
    private String name = null;
    public Directory(String name){
        this.name = name;
        list = new ArrayList<ThingsInPC>();
    }
    public void add(ThingsInPC entry){
        list.add(entry);
    }
    public void remove(){
        Iterator<ThingsInPC> itr = list.iterator();
        while(itr.hasNext()){
            ThingsInPC entry = itr.next();
            entry.remove();
        }
        System.out.println(name + "を削除しました。");
    }
}
```

・メイン処理：ディレクトリごと削除

```java:Main.java
public class Main {
    public static void main(String args[]){
      Directory dir = new Directory("dir");
      File dirFile1 = new File("dirFile1");
      File dirFile2 = new File("dirFile2");
      Directory subDir = new Directory("subDir");
      File subDirFile1 = new File("subDirFile1");
      File subDirFile2 = new File("subDirFile2");
        
      // サブディレクトリへのファイル配置
      subDir.add(subDirFile1);
      subDir.add(subDirFile2);

      // ディレクトリへのファイル＆サブディレクトリ配置
      dir.add(dirFile1);
      dir.add(subDir);
      dir.add(dirFile2);
      
      // ディレクトリを中身ごと削除
      dir.remove();
    }
}
```

FileクラスとDirectoryクラスをみるとThingsInPCインターフェースを実装して
どちらも”PCの中のもの”として**「同一視」**しています。

その上で、Mainクラスの最終行でdir.removeが実行されるとどうなるか。

```
    public void remove(){
        Iterator<ThingsInPC> itr = list.iterator();
        while(itr.hasNext()){
            ThingsInPC entry = itr.next();
            entry.remove();
        }
        System.out.println(name + "を削除しました。");
    }
```

まぁ、while文の中で、itrに格納されたdirFile1やらsubDirやらにremoveをかけていきます。
で、entryにsubDirが入った状態でentry.removeが呼び出されると
subDirのDirectory.removeが呼び出され、subDir内のsubDirFile1、subDirFile2の
File.removeを実行するわけですね。

要するに、ディレクトリとその直下のファイル、およびサブディレクトリとその直下も含めて
マルッと消していくわけです。

これは先程言ったThingsInPCによる**「同一視」**をしていないと実現できません。

# まとめ
Compositeパターンは入れ物と中身を**同一視**します。
その上で入れ物と中身に順繰りに同じ処理をしていきます。
入れ物と中身、中身の中身、中身の中身の・・というように。
このように、**階層構造**をもつものに対して力を発揮するパターンと言えます。

※ちなみに、階層構造を持つものに対し、
どんどん下層に下りながら同じ処理を実行していくことを**「再帰的」**といいます。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1364814303

# 次回
MediatorとObserverのどちらか。

# 参考資料
http://www.techscore.com/tech/DesignPattern/Composite.html/
railsでjQuery/JavaScriptがうまく動かない時の対処法

html内でapplication.jsが呼ばれるように設定しているのに、なかなか動かずハマったので解決策をご紹介します。結論だけ書くと、”assets/javascriptより先にjQueryのソースを読む”です。

##jQueryを読み込ませる→スクリプトを読み込む

問題のHTMLがこちら

```html:application.html.erb
<head>
    <title>SiteTitle</title>
    <%= csrf_meta_tags %>
    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application' %>

  </head>
```
Stack Overflowには、"turbolinksが悪さをしている"、"jQueryを読み込む"という解決策が乗っていましたので、試して見ましたが、なかなかうまくいかず。

```html:application.html.erb
<head>
    <title>SiteTitle</title>
    <%= csrf_meta_tags %>
    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application' %>

<!-- /この部分を追加しました -->
　　<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<!-- /ここまで -->
  </head>
```

しかし、このやり方だとスクリプト読み込み→jQuery読み込みという順番になります。この順番を逆にするだけでうまくいきました。

```html:application.html.erb
<head>
    <title>SiteTitle</title>
    <%= csrf_meta_tags %>
    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>

<!-- /jQueryを読み込む -->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<!-- /スクリプトを読み込む -->
    <%= javascript_include_tag 'application' %>



  </head>
```

試して見てくださいね。
個人的React周りベストプラクティス① - 構成編

Reactを半年ほど触っていく中で、
私の中でこれが一番使いやすいっていうものが確定してきたので、備忘録もかねて残していきます。

まずは構成から

#フロー図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156086/01c84bff-3c0f-8d86-c7ee-5c74c34549da.png)

#React.js(Redux)
フロント側を担当
Reduxを勉強したい場合はこちら　→　[コードで理解するRedux(React使用)](https://qiita.com/enshi/items/19b1924b72f8c2ffd1eb)
#API Gateway
Lambdaを実行するURLを生成
#Lambda
サーバー側で実行したい処理
DBからデータを取得したいときなど
#EC2
mysqlDBを動かすために使用
サーバー管理の手間を考えるとRDSやDynamoDBなどの方がいいと思う

#次の記事
[個人的React周りベストプラクティス② - 準備編](https://qiita.com/enshi/items/ac6da19136a466fe1a9d)
[Django] Macで0から開発環境構築

#Djangoって？
今機械学習で話題のpython製フレームワーク。多分一番メジャー。
詳しくは割愛

# pythonインストール

### pyenv（pythonのバージョン管理ツール）とpython　のインストール
http://qiita.com/gcfuji/items/199f6e8fe76a2f5547d9

*pip install　[pythonのバージョン] でエラーになったら
xcode-select --install
を叩いてもう一度やって見てください

それでも無理なら　
brew install zlib
でもう一度

#Django　インストール
pip install django

そのあとのチュートリアルはこちらを参考にするといいと思います。
https://docs.djangoproject.com/ja/1.11/intro/tutorial01/
Eclipse oxygen に ER Master pluginをインストールする

Eclipse oxygen で、 Help > install new software... から ER Master plugin がインストールできなかった際のメモ。お役に立てれば幸いです。
# jarのダウンロード
https://sourceforge.net/projects/ermaster/
# dropinsに移動
以下のディレクトリにダウンロードしたjarを移動
```YOUR_APP_INSTALL_DIRECTORY/Eclipse.app/Contents/Eclipse/dropins```
#eclipse再起動
eclipseを再起動して、File > New > other で一覧にERMasterがあればOK
[Survey] Kaggle - DSB2017 209位解法まとめ

Kaggle - Data Science Bowl 2017[^1]の209位解法[^2]の調査記事です．

Author: Wojtek Rosinski
Title: My code - 2D & 3D Segmentation U-Net's & Classification CNN's + XGB
Kaggle Discussion: https://www.kaggle.com/c/data-science-bowl-2017/discussion/31608
Code: https://github.com/Wrosinski/Kaggle-DSB

## 流れ

- 肺結節の検出: 2D(3D)U-Netを用いた2D(3D)Segmentation
- 悪性腫瘍の判別: 2D(3D)CNNを用いたクラス分類

## 環境

- GTX1080

## LUNA

- 結節影の検出に利用
- 0〜1になるよう輝度値を255で割った．

### U-Net 2D

- リサイズなどはしていない．
- 大量のfalse positiveが発生．
- dice coefficient: 1.45(私見: 1超えるの？？？)
- 約20時間学習
- 100症例の画像をシャッフルして訓練．

### U-Net 3D

- 136x168x168にリサイズ
- dice coefficient: 0.5
- 約10時間学習

## DSB2017

- LUNAで訓練したモデルで結節影の検出
- 3D(2D) U-Netでの結果に対して3D(2D) CNNで悪性腫瘍か分類
- 最終的にXGBoostで分類
- logloss: 0.55を達成．

## References

[^1]: Kaggle, [Data Science Bowl 2017](https://www.kaggle.com/c/data-science-bowl-2017), 2017
[^2]: Rosinski, [My code - 2D & 3D Segmentation U-Net's & Classification CNN's + XGB](https://www.kaggle.com/c/data-science-bowl-2017/discussion/31608), 2017.
ワークシートを挿入する関数

```vbnet:ExcelVBA

Option Explicit

Function InsertWorkSheet(insertSheetName As String) As Worksheet

'*******************************************************************************
'  ■変数定義
'*******************************************************************************
    
    Dim EachWorkSheet As Variant
    
'*******************************************************************************
'  ■主処理
'*******************************************************************************
    
    '指定された名前のシートの有無をチェックし、ある場合は削除する
    For Each EachWorkSheet In Worksheets
        If EachWorkSheet.Name = insertSheetName Then
            Application.DisplayAlerts = False
                EachWorkSheet.Delete
            Application.DisplayAlerts = True
        End If
    Next EachWorkSheet
    
    '新しいシートの挿入
    Sheets.Add after:=Worksheets(Worksheets.Count)
    ActiveSheet.Name = insertSheetName
    
'*******************************************************************************
'  ■後処理
'*******************************************************************************
    
    Set InsertWorkSheet = Sheets(insertSheetName)
    
End Function
Ubuntu で Digdag サーバを作るまでの手順

Treasure Data が OSS として公開しているワークフローエンジン [Digdag](https://www.digdag.io/) を使う機会があり、とりあえず動かすところまでやったのでその手順のメモ。

## 環境
- Amazon EC2
    - t2.micro
- Ubuntu 16.04

このエントリを書いた時点での Digdag のバージョンは 0.9.16 だった。
新しいバージョンが出たらこのエントリは役に立たないかもしれないので注意。

## Java 8 をインストール
[JDK 8u72 以上が必要](http://docs.digdag.io/getting_started.html#got-error)とのことなのでインストールする。

```
# apt update && apt upgrade
# apt install openjdk-8-jre
```

## Digdag をインストール
curl で最新版の jar ファイルをダウンロードしていきて設置する。
これひとつでサーバにもクライアントにもなるっぽい。

```
# curl -o /usr/local/bin/digdag -L "https://dl.digdag.io/digdag-latest"
# chmod +x /usr/local/bin/digdag
```

パス追加とか面倒なので `/usr/local/bin` に直接ぶっこんでしまった。

## PostgreSQL 設定
digdag を起動するにはデータストレージが必要になる。
インメモリモード `--memory` でも起動できるが、実際に使う場合には PostgreSQL などを指定するのがよいだろう。

``` /etc/digdag.properties
database.type = postgresql
database.user = USER
database.password = PASSWORD
database.host = HOST
database.port = 5432
database.database = digdag
```

今回は RDS で PostgreSQL サーバが立っていたので、そこに `digdag` という名前のデータベースを作って指定した。

## Secret 機能の設定
Digdag Secret 機能を有効にする必要がある場合は、設定ファイルの追記とポリシーファイルの作成が必要になる。

詳しくは： [DigdagのSecret機能を使う - Qiita](https://qiita.com/bwtakacy/items/da1800f007718ed27bb1)

## Systemd 設定
以下のような service ファイルを書いた。

``` /etc/systemd/system/digdag.service
[Unit]
Description=digdag

[Service]
Restart=always
ExecStart=/bin/sh -c "/usr/local/bin/digdag server --bind 0.0.0.0 --config /etc/digdag.properties --task-log /var/log/digdag/ --access-log /var/log/digdag"

[Install]
WantedBy=multi-user.target
```

どうやら `ExecStart=` に指定する実行コマンドには jar ファイルを直接指定することができない[^systemd]らしく、 `/bin/sh -c "..."` で囲むことで解決した。

[^systemd]: http://blog.tmtk.net/post/2017-06-04-vagrantfile-for-digdag/

```
# systemctl enable digdag
```

サーバ起動時に自動起動する設定をしたら、実際に起動させてみる。

```
# systemctl start digdag
```

`http://<IP Address>:65432/` にアクセスすると、Digdag の Web UI を使うことができる。
Fabricによる リモート操作の自動化

IT automation libraryである [fabric](http://www.fabfile.org) (python製)を使います。

fabricは python2.5-2.7で使う必要があります（python3非対応）

fabricの使い方はとても簡単です：
1. fabfile.py 内に実行したい操作の関数func()を作る
2. terminalで、$ fab func を実行する

fabricのインストールは pipでどうぞ

```bash
$ pip install fabric
```

## 1. 実行スクリプトの作成

```
$ sudo nano fabfile.py
```

```python:fabfile.py
# coding: utf-8
from fabric.api import env, run, sudo

env.hosts = ["192.168.11.161",
             "192.168.11.162",
             "192.168.11.163",
             "192.168.11.164"]
env.user = "pi"
env.password = "raspberry"

def hello():
    run("ifconfig wlan0")
    run("ls")

def fix_100m_full():
    sudo("ethtool -s eth0 autoneg off speed 100 duplex full")
    sudo("ethtool eth0")
```

## 2. fabricの実行

実行可能タスクの確認

```
$ fab -l

hello
fix_100m_full
```

タスクの実行（Auto-negotiationをオフにする自動スクリプトを実行してみます）

```bash
#$ fab <タスク名>
$ fab fix_100m_full | grep Auto-nego

[192.168.11.161] out: 	Auto-negotiation: off
[192.168.11.162] out: 	Auto-negotiation: off
[192.168.11.163] out: 	Auto-negotiation: off
[192.168.11.164] out: 	Auto-negotiation: off
```

## 参考

http://fabric-ja.readthedocs.io/ja/latest/tutorial.html
[Unity][Git]open("Temp/UnityLockfile"): Permission deniedというエラー

<h1>エラー内容</h1>
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/179803/225e14c3-3cd4-8241-5ca1-03a5aca2b200.png)

これ、windowsでUnityやってるとあるあるらしいです。
普段Mac使ってるので、Macではこういうの起きたことないです。

あれですね、ゲーム開発以外で、windowsだとそのディレクトリのファイル開いた状態でファイル生成処理とかしようとするとエラー出るのと同じようなパターンですね。

Tempフォルダは一時的に必要になったファイルを格納しておくために存在するので消えても問題がない。

このフォルダはプロジェクトを閉じると同時に消えるので、プロジェクトを閉じてからgitコマンドを入力したらエラーは消えました。

<h1>感想</h1>
Tempフォルダの権限変えた方が早い
Ruby勉強しているので備忘録

継続的にAPIを叩くシステムを作るために
node.jsとかPythonとか悩んだけども、
Wikipediaとか
人気プログラミング言語の記事とか、
処理速度がどーだのって動画を見たりとか、
色々考えたけど、
**書いてて楽しい**って重要だよなと思ってRubyを使うことにしました。
元々Github pagesでJekyll使うためにインストールしてたのもある。

# TL;DR

とりあえず導入は済んでるので
書く→実行→書く→書く→（ループ）
とやってるところもあるので長いです。

# 環境

* XUbuntu 16.04
* ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

# 対象読者 

* Rubyインストールしたけど何するか決めてない方
* Rubyマスターの方の暇つぶしになれば（希望）

# １　安定と安心と信頼の”Hello world”　

- [【Ruby】Ruby入門：hello worldを表示させる](http://qiita.com/Mocacamo/items/9786e9505273fe3cc07b)

> % mkdir work_rb
% cd work_rb
% vi hello.rb

```ruby
# 普通に出力させるだけならこれでいい
print "Hello world"
```
>Hello world

```ruby
# 改行付はputsを使う　通常はこちらが多そう
puts "Hello world"
```

# ２　変数を使う　

- [変数と定数 (Ruby 2.4.0)](https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html)

いくつか種類があるけど
いつものように書けば良さそうでした。

```ruby
msg = "Hello world"
puts msg
```
> Hello world

# ３　条件分岐

```ruby
one = 1
two = 2
if one == 1
    puts "ONE"
elsif two == 2
    puts "TWO"
end
```

>ONE
TWO

本当はthenを記述する方が丁寧なのでしょうが、
十分読めますからね。
あと、評価式のイコール１つにしてしまって5秒くらい思考停止しました。
いつものことです。

# ４　繰り返し文

- [[Ruby入門] 05. 制御構文（条件分岐、繰り返し処理） - Qiita](http://qiita.com/prgseek/items/4140ea928be40f55c68e)

```ruby
month = 1
while month <= 12 do
  puts month.to_s + '月: ' + ( (month <= 3) ? 'まだお年玉ある' : 'もう使っちゃった！' )
  month = month + 1;
end
```

>1月: まだお年玉ある
2月: まだお年玉ある
3月: まだお年玉ある
4月: もう使っちゃった！
5月: もう使っちゃった！
6月: もう使っちゃった！
7月: もう使っちゃった！
8月: もう使っちゃった！
9月: もう使っちゃった！
10月: もう使っちゃった！
11月: もう使っちゃった！
12月: もう使っちゃった！

for文使うこと少ないのかーって読んでて勝手にｆｍｆｍしてました。

#　５　〇秒ごとに実行

今回作りたいものは指定秒数ごとに実行してくれるものなので

- [書籍 Ruby Cookbook | 一定時間ごとに処理を実行 - Tbpgr Blog ](http://tbpgr.hatenablog.com/entry/20120624/1340549187)

```ruby
# 指定したsecごとに処理を実行する
def execute_each_sec(sleep_sec)
  yield
  sleep sleep_sec
end

5.times do
  execute_each_sec(1) do ||
    puts "実行時間:#{Time.now}"
  end
end
```

>実行時間:2012-06-24 23:45:40 +0900
実行時間:2012-06-24 23:45:41 +0900
実行時間:2012-06-24 23:45:42 +0900
実行時間:2012-06-24 23:45:43 +0900
実行時間:2012-06-24 23:45:44 +0900


出力結果そのものはまったく問題無いんですが、
個人的には **yield**というのが謎でした。

- [Ruby の yield って結局なんなの？ - YNote ](http://d.hatena.ne.jp/yoshidaa/20090511/1241967137)

要は可読性を配慮した体の良いevalのようなものと捉えてしまいました。
ブロックそのものを引数にして渡せるってなかなかユニークだなあと、
勉強になりました。



# 今回はここまで

この記事書いてて知ったんですが

- [RubyとRailsの学習ならRubyLife](http://www.rubylife.jp/)

とても読みやすい参考サイトがありました。
良かったらどうぞ。

# これからどうするか

あとはAPIを叩いてそのレスポンスを整形して
定期的に実行させるプログラムを書いていこうと思ってます。
Rubygemという便利なパッケージ管理システムがありますからね、
雰囲気でなんとかなるでしょう。

# あとがき

最近になってクエリパラメータが
http://hoge.fuga **?text=foo**
の太文字の部分のことだと知りました。
そんな私でも元気にやってます。
それでは。