OmniAICreator/Qiita-1.07M huggingface dataset:
SVGの綺麗なプログレスバーを簡単に実装する

<img width="319" alt="スクリーンショット 2017-04-09 21.16.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/175015/6eafc1ad-2baf-ddc4-5ed1-67c08eec8a3d.png">

アプリケーション開発していると、必ず必要になるプログレスバーですが
SVGで滑らかで綺麗なプログレスバーを簡単に実装する方法を紹介します。

## ProgressBar.js

<a href="https://github.com/kimmobrunfeldt/progressbar.js">kimmobrunfeldt/progressbar.js</a>

ProgressBar.jsを使うと、簡単に滑らかなプログレスバーを実装できます。

色々な形のプログレスバーに対応していて、カスタム次第ではハート形のプログレスバーも作れます。

## 実装

一番シンプルな実装は以下の通りです。
プログレスバーの色をForm,Toで指定して進捗によって色を変えることも可能です。

引用： https://kimmobrunfeldt.github.io/progressbar.js/

```
var ProgressBar = require('progressbar.js');

// Assuming we have an empty <div id="container"></div> in
// HTML
var bar = new ProgressBar.Line('#container', {easing: 'easeInOut'});
bar.animate(1);  // Value from 0.0 to 1.0
```

---

<a href="http://xn--ecktcwe6e.co/">http://タイマー.co</a>

KPTなど、チームで時間を決めてMTGする際、
スクリーンに映すと便利なタイマーアプリです。

本記事の技術を使って、開発しています。
1分で終わるモダンなフロントエンド開発環境構築

モダンな開発環境でフロントエンドを開発したいけど、
gulpfileとか用意するのが面倒っていうのはよくあると思います。
そこで一番簡単な環境構築手順を示します。

## boilerplateを使う

プロジェクトの雛形(boilerplate)がGithubで公開されているので、
それをそのまま使用すると、一瞬で開発環境が構築できます。

Githubで、 `boilerplate` を検索すると、大抵の環境はヒットします。

今回は `ES6+Sass`がビルドできる環境があればよかったので以下を使用しました。

https://github.com/pteich/h5web-es6-boilerplate

あとは、 `git clone` してくれば開発環境構築終わりです。

---

<a href="http://xn--ecktcwe6e.co/">http://タイマー.co</a>

KPTなど、チームで時間を決めてMTGする際、
スクリーンに映すと便利なタイマーアプリです。

本記事の技術を使って、開発しています。
Railsでmysqlにパスワードなしでアクセスできるように変更する

## はじめに
mysqlの再インストールをしたら、database.ymlにパスワードを書き込まないとDB作成ができなくなった。ローカルで開発している時は不便なので、パスワード不要に変更した。いずれまたハマりそうな気がするのでメモを残しておく。

## 手順

```
$ mysql -uroot -p
```

```
mysql> use mysql
mysql> update user set authentication_string=password("") where user='root'; 
mysql> flush privileges;
Unityでタグから複数のゲームオブジェクトの数を取得するメモ

`FindTag`で良いかと思っていたけど、これだと1件しか取得できないぽい。
複数件取得するには`FindGameObjectsWithTag`を使う

全ゲームオブジェクトを読み込んでから、ゲームがスタートする時に数を初期化したいのでこんな感じで書くと良い。

```csharp
int targetCount;

void Start() {
  targetCount = GameObject.FindGameObjectsWithTag ("TargetObject").Length;
}
```
IntelliJ IDEAでProcessingを書く

Qiita初投稿です。
何かありましたらぜひ指摘していただけると助かります。
##IntelliJで書く理由
Processingのアプリでは、コード補完の機能がなくコードエディタとしては非常に使いづらいです。その他、普通のIDEでは提供されているような機能がありません。IntelliJを使えばPDEという特殊なファイルではなく、普通のJavaファイルとして書くことができます。その他、VCS(Gitなど)でプロジェクトを容易に管理したりなど、IntelliJにはきりがないほど優秀な機能があります。ラムダ式で書くことだって可能です。

JavaのIDEとしてはEclipseなど他にも有名なものがありますが今回はIntelliJ IDEAを使います。（自分が気に入っているという理由もあります。基本無料で使えるのでぜひ試してみてください。）

##方法
###1. プロジェクトの作成
**Create New Project**をクリック。

![](http://i.imgur.com/G5jk78H.png)

フレームワークの選択画面が出ますが何もせず**Next**をクリック。

![](https://i.imgur.com/9uPeMRZ.png)

テンプレートも選択せず**Next**をクリック。

![](https://i.imgur.com/tfXVEzE.png)

プロジェクト名とディレクトリを決める。今回は以下のように作成。
入力したら**Finish**をクリック。

![](https://i.imgur.com/jSdq67v.png)

このような画面になったらプロジェクト作成は終わりです。

![](https://i.imgur.com/A2pYRff.png)

###2. Processingをライブラリとして追加
Processingをライブラリとして追加することでProcessingを書けるようにします。
core.jarを追加する方法もありますが今回は**Maven**を使います。
Mavenというものについては以下を参照してください。
[Mavenについてまとめてみました](http://qiita.com/tikuase/items/8546357f4e67357fe730)

**File > Project Structure...**をクリック。

![](https://i.imgur.com/IhlUGyN.png)

左のメニューより**Libraries**を選択。

![](https://i.imgur.com/d7Ubbt2.png)

**+ > From Maven...**をクリック。

![](https://i.imgur.com/dTarFmi.png)

**org.processing**と入力し検索します。
**org.processing:core**を選択します。
最新のバージョンは[こちら](https://mvnrepository.com/artifact/org.processing/core)から確認してください。(今回は3.2.3)

![](https://i.imgur.com/Q87yN4m.png)

**Download to**のところにチェックを入れると任意のディレクトリにダウンロードしライブラリとして追加されます。
**OK**をクリック。

![](https://i.imgur.com/m4RevjO.png)

このように表示されれば大丈夫です。**OK**をクリック。

![](https://i.imgur.com/P2xfNB3.png)

先ほどDownload toで選択したディレクトリにダウンロードされていることを確認してください。

![](https://i.imgur.com/T6SQV4C.png)

以上でライブラリの追加は終了です。

###3. Javaファイルを作成
ProcessingをJavaファイルで書くためにまず対象となるJavaファイルを作成します。

**src**を右クリックし**New > Package**を選択。
Package名を入力し作成します。

![](https://i.imgur.com/FCxIbCa.png)

今回は、Qiitaという名前のPackageを作成しました。

![](https://i.imgur.com/sWl39Ou.png)

次に先ほど作成したPackageを右クリックし**New > Java Class**を選択。
Class名を入力し作成します。

![](https://i.imgur.com/iiDzR8j.png)

今回は、Mainという名前のClassを作成しました。

![](https://i.imgur.com/3mD2Elk.png)

最後にProcessingをJavaファイルで書きます。

###4. ProcessingをJavaファイルで書く
先ほど作成したクラスにProcessingの大元を書いていきます。
以下に基本となる例を示します。

```Main.java
import processing.core.*;

public class Main extends PApplet {

    @Override
    public void settings() {
    }

    @Override
    public void setup() {

    }

    @Override
    public void draw() {

    }

    public static void main(String[] args){
        PApplet.main("Qiita.Main");
    }
}
```

基本的にはPAppletを継承し、mainメソッドで起動してあげるという流れです。
実行すると次のような画面になります。

![](https://i.imgur.com/aYUnl8l.png)

あとは、普通にProcessing、Javaを書くことができます。
これによりさらに表現や開発の幅が広がると思いますのでぜひ試してみてください。
質問や修正など気軽にどうぞ。
u-bootのtftp

u-bootにはflashイメージや実行ファイルをネットワークからメモリに読み込むためのtftpの機能があります。この機能は二種類の方式があり、u-bootがクライアントになるタイプと、u-boot自体がサーバになるタイプです。

* u-bootがクライアントでサーバに取りにいくパターン

```
2: System Load Linux Kernel then write to Flash via TFTP. 
 Warning!! Erase Linux in Flash then burn new one. Are you sure?(Y/N)
 Please Input new ones /or Ctrl-C to discard
      Input device IP (10.10.10.200) ==:10.10.10.200
      Input server IP (10.10.10.3) ==:10.10.10.3
      Input Linux Kernel filename (fonita.img) ==:Fon_FON2305E_FDT.zimage

 netboot_common, argc= 3 

 NetTxPacket = 0x81FE4DC0 
Trying Eth0 (10/100-M)

 ETH_STATE_ACTIVE!! 
Using Eth0 (10/100-M) device
TFTP from server 10.10.10.3; our IP address is 10.10.10.200
Filename 'Fon_FON2305E_FDT.zimage'.

 TIMEOUT_COUNT=10,Load address: 0x80100000
```

* u-bootがサーバになりクライアントからputされるパターン

```
2: System Load Linux Kernel then write to Flash via TFTP. 
 Warning!! Erase Linux in Flash then burn new one. Are you sure?(Y/N)
 Please Input new ones /or Ctrl-C to discard
      Input device IP (10.10.10.123) ==:

      Input server IP (10.10.10.3) ==:

      Input Linux Kernel filename () ==:


 netboot_common, argc= 3 
略
 ETH_STATE_ACTIVE!! 
Select server or client model: 1/2
SERVER IP address : 10.10.10.123 port:69
Load address: 0x8a100000
Loading: Peer IP:10.10.10.3
```

このパターンではファイルがあるホストで以下のようなスクリプトを実行してファイルを渡します。

```
#!/bin/sh

FILE="Planex_MZK-W04N-XX.zimage"

echo "bin
put ${FILE}
quit
" | tftp 10.10.10.123
```

コマンドモードのtftpboot(tftp)についても二つのタイプがあります。詳しく調べてないのですが、これはu-bootビルド時に設定されているのではないかと思います。

外付けのSwitchなどが入っている場合に、tftpの転送が始まるのが遅いモジュールがあります。早かったり遅かったりの場合もあります。理由はよくわかりません。
ローカル環境のMariaDBにユーザ作成と権限を付与する時

##ユーザ作成
create user 'ここにユーザ名'@'localhost' identified by 'ここにパスワード';
EX)↓

```example.sql
create user 'yamada'@'localhost' identified by 'tarou';
```

##権限付与
###基本的な構文
grant 与える権限 on DB名.テーブル名 to user名;
EX)↓レベル別に置き換えると以下のイメージ(一部記載

```グローバルレベル.sql
全DBの全テーブルに対して、与える権限を与える
grant 与える権限 on *.* to user名;
```

```データベースレベル.sql
指定したDB名の全テーブルに与える権限を与える
grant 与える権限 on DB名.* to user名;
```

```テーブルレベル.sql
指定したDB名の指定したテーブル名に与える権限を与える
grant 与える権限 on DB名.テーブル名 to user名;
```

よく使う権限一覧：

|    与える権限        |   意味       |     
|:------------------:|:------------------:|
|       ALL          |全ての権限を付与する   |
|       SELECT       |SELECT使用権限付与   |
|       ALTER       |ALTER TABLE使用権限付与   |
|        INSERT      |INSERT使用権限付与   |
|         UPDATE     |UPDATE使用権限付与   |
|       DELETE       |DELETE使用権限付与   |
|      CREATE        |CREATE使用権限付与   |
|      DROP          |DROP TABLE使用権限付与   |
詳しくは、こちらのサイトに一覧がございます：
https://www.dbonline.jp/mysql/user/index5.html

すべての権限を付与する（だいたいこれで、、、）
grant all on DB名を指定する.権限を与えたいテーブル名 to 'ここにユーザ名'@'localhost'; 
EX)↓

```example.sql
grant all on `testdb`.* to 'yamada'@'localhost';
```
railsサーバー起動時にA server is already runningと怒られたときの解決法とコマンドの意味


# 解決法

解決法は
http://qiita.com/Masaaki/items/6b29c2bb1a49107f2b73
を参考にしました。ありがとうございます。

railsサーバーを止めるときに Ctrl + c を使わないと、次に起動したときに怒られがちです。
基本的には参考のように

```command.
ps aux | grep rails
```
でプロセス番号(PID)を指定してkill


```example.
kill 60897
```

これでも解決しないときは**ターミナルを再起動**してます。


# コマンドの意味

```command.
ps aux | grep rails
```

大前提として【 | 】は二つのコマンドを組み合わせることを意味する。( | はパイプという)

コマンドとしては

**まず、ps aux (i) を実行し、その結果に対して、 grep rails (ii) を実行**

という流れになってます

## (i) ps aux について
ps は**「実行中のプロセスを表示する」**コマンド

a, u, x はコマンドのオプションで、それぞれの意味は下記

|オプション|意味|
|:----------------:|:-----------------:|
|a|自分以外のユーザーのプロセスを表示|  
|u|ユーザー名と開始時刻を表示| 
|x|制御端末のないプロセスの情報を表示|  


## (ii) grep rails について
grep は**「文字列を検索する」**コマンド
引数に渡された「rails」という文字列を検索し、文字列「rails」を含む行のみ表示する。

## ps aux | grep rails をまとめると　
コマンド(ii)は、(i)の結果に対して実行されるため、(i), (ii)の組み合わせより

(i) ps aux の結果で表示される「すべての実行中のプロセス一覧」の中から
(ii)「rails」を含む行を抜き出して表示

つまり

**すべてのユーザによる実行中のプロセスのうち、
「rails」という文字を含むものの一覧を表示する**

という意味になります。


# (おまけ) ps auxで表示される項目の意味
ps auxで表示される項目の意味についてはこれを参照

|解説|項目|
|:----------------:|:-----------------:|
| User             |プロセスの所有ユーザー |  
| PID           |プロセス番号| 
| &CPU             |CPUの占有率|   
| &MEM             |実メモリでの占有率|  
| SIZE             |仮想分も含めた使用サイズ(Kバイト)|
| RSS         |実メモリ上の使用サイズ(Kバイト)|
| TTY         |端末名|
| STAT         |プロセスの状態|
| R        |稼働中|
| S         |一時停止中|
| D         |停止不可能で一時停止|
| T         |終了処理中|
| Z         |ゾンビプロセス（すでに実体は無い）|
| W         |実メモリ上に無くて，スワップアウトしている|
| N         |nice値|
| START         |プロセスの開始時刻|
| TIME         |プロセスの総実行時間|
| COMMAND         |実行コマンド名と引数（シェル表記の場合もあり）|
Bitbucket.orgをSSH鍵で操作する方法

環境: Windows

## SSH鍵の作成
Git Bashを開き、以下を実行
```
$ ssh-keygen -f ~/.ssh/<personalid> -C "<personalid>"
```
※personalidは任意の名前

```
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/<username>/.ssh/<personalid>.
Your public key has been saved in /c/Users/<username>/.ssh/<personalid>.pub.
The key fingerprint is:
SHA256:vmLliyNTonIWQIHI7yXfLb1MUe/Zz7qwoSc5H+iL6eM <username>
The key's randomart image is:
+---[RSA 2048]----+
|+..              |
|oo         .     |
|. .       . .    |
|.  o .   .   .   |
| .. + . S . . o  |
|  .....+.+ . o . |
|   o o o= o.+  ..|
|. + o +.oB+..=  o|
| +   +.=Eo+*o oo |
+----[SHA256]-----+
```

## 公開鍵の追加
作成された公開鍵を、Bitbucket.orgの[セキュリティ]-[SSH鍵]-[鍵を追加]から、追加する

## 秘密鍵の配置
任意のディレクトリに配置する

例:

```
~/.ssh/bitbucket-org_<personalid>/<personalid>
```

## ~/.ssh/configの作成
```~/.ssh/config
Host bitbucket
    Hostname bitbucket.org
    IdentityFile ~/.ssh/bitbucket-org_<personalid>/<personalid>
    User git
    Port 22
# Following may not be necessary
    TCPKeepAlive yes
    IdentitiesOnly yes
```
※Hostはalias
※IdentityFileに秘密鍵の場所を指定

## ssh接続確認

```
$ ssh -T bitbucket
```

実行結果:

```
logged in as ..
```

と出れば、成功

## gitのリモートURLの設定
gitのディレクトリで、リモートURLを設定する

```
$ git remote set-url origin <.ssh/configで設定する"Host"（つまり、bitbucket）>:<Bitbucketのユーザ名>/<リポジトリ名>.git
```

git pushが出来れば成功
swift3.0 tableview セルの高さ自動設定


セルの高さの自動計算

``` hoge.swift
    override func viewDidLoad() {
        super.viewDidLoad()
        // delegateとdataSourceを設定
        recommendTableView.delegate = self
        recommendTableView.dataSource = self

        // tableの高さを自動
        self.recommendTableView.estimatedRowHeight = 60 // 初期値なんでもいい
        self.recommendTableView.rowHeight = UITableViewAutomaticDimension; // 高さ自動設定
```

オートレイアウトの場合、一番したの要素（部品）にbottomの設定をいれることが必要。
bottomを入れないとセルの高さが低いままになる。
Docker for mac でのコマンドがユーザ権限だととても遅い

似たような件が見つからなかったので、メモ。
※ホスト、ゲスト間の同期速度等ではなくて、単純なコマンド実行の話です。

|項目|version|
|:------|:------|
|OS|macOS Sierra|
|docker for mac|17.03.1-ce-mac5 (16048) Channel: stable b18e2a50cc|
|docker|17.03.1-ce, build c6d412e|
|docker-compose|1.11.2, build dfed245|
|docker-machine| 0.10.0, build 76ed2a6|


管理者権限だと1秒もかからない

```bash
$ docker ps 
```
や

```bash
$ docker --version
```
などのコマンドが、ユーザ権限だと30秒以上かかる。

~~一旦管理者権限やsudoでなんとかするしかないか。
原因がわかったら記事を更新します。~~
※2017/04/09　22:26追記

原因がわかりました。
もともとboot2dockerを使っていた環境で、docker for macを導入したため、　　
DOCKER_HOSTの設定が残ったままでした。

```
$ env | grep DOCKER
DOCKER_HOST=tcp://192.168.59.105:2375
```
Docker for Mac EngineがVMを管理するそうなので、

```
$ unset DOCKER_HOST
```

こちらを実行。

```
$ env | grep DOCKER
```
コレで出力が何もない状態でもう一度

```
$ docker ps 
```

１秒もかからない！

ちゃんとリファレンス読めという教訓でした。
https://docs.docker.com/docker-for-mac/docker-toolbox/#setting-up-to-run-docker-for-mac

ホスト、ゲスト間のファイルの共有に関しては
以下の記事が参考になりそうでした。

Docker for Macが遅い問題をdocker-syncで解決する
http://cluex-developers.hateblo.jp/entry/2016/11/02/122633
docker-syncでDocker-for-Macの遅い問題が解決した
http://furodrive.com/2017/03/docker-sync/
[備忘]pyenvインストール後の.bash_profileの設定

#はじめに
ググっても解になかなかたどり着けなかっったので、備忘として残す
同じことで止まってしまった人の助けになれば幸い

#事象
pyenvをインストールし、一緒にインストールしたanacondaなどにpyenvからバージョンの切り替えをしたが、pythonのバージョンが変わっていなかった

#対処
.bash_profileに以下の設定が必要だった

参考
[python入門 - python3系からのまとめ](http://coderoid.hatenablog.com/entry/2016/02/08/083000)

before

```
$ python --version
Python 2.7.10
```

.bash_profileの設定

```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source .bash_profile
```

after

```
$ python --version
Python 3.5.2 :: Anaconda 4.2.0 (x86_64)
```
AWSユーザがGCPを使い始めてみた①

GCPのアカウントを取得して早数ヶ月。
実は全然使ってませんでした。

だって、分かんないんだもん。

ということで、久々にGCPを触ることにしたので、AWS利用者がGCPを触るときの方法を触りながらまとめます。
とりあえず①にしましたが、②以降があるかは不明です。

ここを見ればいいという説もある
[AWS プロフェッショナル向け Google Cloud Platform](https://cloud.google.com/docs/compare/aws/)

## 開設
* Googleアカウントを持っていればすぐに開設可能
  * もちろんG Suiteアカウントでも可能
* 無料で利用するにもクレジットカードの登録→請求アカウントの作成が必要
  * 請求アカウントは自身のGoogleアカウントに紐づくGCP請求用のアカウント
* プロジェクトと呼ばれる単位で権限分離などが可能
  * プロジェクトの単位＝AWSのRootアカウント 
  * １つの請求アカウントにはいくつもプロジェクトを紐付け可能
  * 請求情報はプロジェクトと呼ばれる単位で決められる
  * G Suiteなどを使っていると、「組織」というのがあるが、これは必ず使う
    * 使うことで色々捗る
* アカウント開設方法は以下（多分今でも変わってないはず）
  * [日本リージョンが来る前にGoogleCloudPlatformを使える状態にしてみた](http://qiita.com/kazu23pole/items/057c8495c22f20e25000)
* プロジェクトを作成すると３つのIDが作られる
  * プロジェクト名：アカウント内で一意
  * プロジェクトID：GCP内で一意。ときたまプロジェクト名と一致することもあるが、大抵は適当な数字が追加される
  * プロジェクト番号：GCP内で一意。12桁の数字で表され、プロジェクト間の権限管理などで使用する。

|  | AWS | GCP |
|:--|:--|:--|
| 請求 | AWSアカウント単位 | プロジェクト単位 |
| 一括請求 | Consolidated Billing | 請求アカウントに一緒に紐付け |

## ユーザ管理
* IAM(AWSと名前一緒)で管理
* 個人で使う分にはあまり気にしなくていい
* 複数人で使う場合は、各プロジェクトのIAMにユーザを追加していく
  * G Suiteだとこれがすごく楽
* AWSと異なり、現状(2017/4現在）、権限設定が雑
  * アクションごとに設定できない
  * 大まかに「オーナー」「閲覧者」「編集者」の３つで構成される
  * まだ指定できないAPIもあるので、それについてはプロジェクトに対して権限付与しないといけない

|  | AWS | GCP |
|:--|:--|:--|
| プロジェクトのユーザ管理 | IAM | IAMと管理 |
| 権限付与 | ロール&ポリシー(アクション単位) | 「オーナー」「編集者」「閲覧者」から選ぶ |
| エリア | リージョン | リージョン |
| エリア内 | アベイラビリティゾーン | ゾーン |


## ネットワーキング
* プライベートのネットワークは「ネットワーキング」から設定可能

|  | AWS | GCP |
|:--|:--|:--|
| プライベートネットワーク | VPC | ネットワーク |
| サブネット | サブネット | サブネットワーク |
| ファイヤーウォール | セキュリティグループ | ファイアウォールルール |
| ルーティング | ルートテーブル | ルート |

* だいたい対応するものが存在する
* ただし、すべて考え方が異なるので、頭の切り替えが必要

### ネットワーク
* VPCとほぼ同じ
* 使いたいCIDRを指定し、設定する

### サブネットワーク
* 複数のゾーンを跨いで構築することが可能
  * ちなみに、リージョン跨ぎの通信はGCP内の専用線を通って通信される(インターネットを経由しない)
* 後述するが、FWやルートはサブネットワーク単位には紐付かない
  * AWSでよくやる、「Public Subnet」「Private Subnet」構成はそもそもしない
* というか、サブネットワーク使わなくていい（と個人的には思っている）
  * 1ネットワーク1サブネットワークでいい(と個人的には思っている)
  * ドキュメントにはレガシーモードって書かれてるけど
* 昔は存在しなかったので、古いネットワークではそもそも利用できない
* IGWはサブネット単位で自動で作られる
  * AWSはわざわざ作成&ルーティングの設定が必要

### ファイヤーウォールルール
* AWSと異なり、基本的にはインスタンス単位で記述する
  * ただし、タグと呼ばれるグループにアタッチするので、該当インスタンスが複数にすることも可能
* ポート、ソース、ターゲットの３つをセットで記述する
  * ポート:「tcp:80;」「tcp:22;」「udp:123;」のような感じ
  * ソース：どこからのアクセスか、IPアドレス(CIDR)，タグなどが指定可能
  * ターゲット：どれに対してのルールか、基本的にはタグを指定する
* (AWSと異なり)インスタンスからリンクが貼られてないので、どれが許可されてるかを追うのが大変かも
* デフォルトのネットワークを使用すると、デフォルトでtcp:22;が全開けなので注意

### ルート
* ネットワークが作られると以下2つは自動で作成される
  * 同一ネットワーク内の通信
  * インターネットゲートウェイへの通信
* 優先度とタグを利用することが可能
  * 優先度：どれくらい優先してネットワーク通信を許可するか
      * デフォルトでは1000が使われるので、だいたい1000でいいと思われる
      * 優先度を変える場面が現状不明
  * タグ：どのインスタンスにそのルートを適用するか
      * 自動で作られる２つはネットワーク内すべてのインスタンスに適用される

### その他（追記済み）
* AWSとGCPの通信はVPNを利用する
* ネットワーク間の通信は2パターン
  * 同一プロジェクト内の別ネットワーク
      * Cloud VPNを設定
  * 別プロジェクトのネットワーク
      * クロスプロジェクトネットワーク(XPN)を使う
      * G Suiteと連携してないと使えない？（個人アカウントで出てこない・・・）
          * G SuiteのAdminアカウントからしか設定できない
          * 誰かを任命して権限委譲することは可能
      * 個人では複数プロジェクトの連携はできなさそう
          * まぁ使わないか
【Max/MSP】MacでMax7の音声つき画面撮影をする時の設定メモ

先日Max7からはじめて音声つきで画面を撮影してみたので、こちらにその時のメモを貼っておきます。

こちらの記事を参考に設定したのでこちらを見ればほとんどわかるのですが本記事ではMaxのAudio設定もキャプチャーに加えてあります。

[【無料で出来る！】Macでパソコン画面を音声入りで動画録音する方法] (http://k-tsubo.com/mac/4582/)


###使用するツール

* GitHub : [soundflower] (https://github.com/mattingalls/Soundflower/releases/)　※下の方にスクロールするとダウンロードのリンクがあります

* Mac App Store : [LadioCast] (https://itunes.apple.com/jp/app/ladiocast/id411213048?mt=12)

###各ツールの設定画面
* Macの環境設定
<img width="668" alt="mac.png" src="https://qiita-image-store.s3.amazonaws.com/0/147344/7bb8a730-131f-368b-e1d1-2a5643615f59.png">

* QuickTimeの新規画面収録待機状態
<img width="356" alt="quicktime.png" src="https://qiita-image-store.s3.amazonaws.com/0/147344/85f7ea63-24d8-436a-1a5f-5aacb4face3a.png">

* LadioCast
<img width="629" alt="ladiocast.png" src="https://qiita-image-store.s3.amazonaws.com/0/147344/9d12d181-88f4-e628-c33a-f3915cba89ab.png">



* Max7
<img width="369" alt="Max7.png" src="https://qiita-image-store.s3.amazonaws.com/0/147344/3f46097b-9f94-22fd-8007-fd042c18c99d.png">


上記のような設定をし、QuickTimeから ファイル > 新規画面収録 を行った所、Max7からでている音声が入った画面収録ができました。

ごく簡単なパッチの実行中画面ですが、実際撮影した動画はこちらにアップしました。
* o.nigiri [YouTube](https://www.youtube.com/channel/UCc_po0LAm71w8qM6c1_D9xQ)

簡単ですが、以上です！
読んでいただきありがとうございます。
”Duplicate entry ’0’ for key 1” エラーは？

「Duplicate entry '1' for key 'PRIMARY'」エラーは、データベース（テーブル）に入力しようとしたデータの主キー（idフィールドなど）がすでに使われていることを示していた（重複不可のため）。

参考
http://d.hatena.ne.jp/puchiban/20110524
SourceTreeでGit Blame(プログラム内の行毎の修正コミット表示)する

# [Git Blameとは](http://qiita.com/rosylilly/items/9648ad2c8aa53465372b#git-blame)
バグがいつから発生していたか、を調査するときに便利です。

# [SourceTree](http://ja.atlassian.com/software/sourcetree)上でのGit　Blameのやり方
1. ワークスペース>履歴で、調べたいファイルを含むコミットを選択
2. コミット内の修正ファイル一覧が下部に表示されるので、調べたいファイルを選んで右クリック
3. 「選択したファイルの担当者…」をクリック

※1.に関してですが、別に履歴から辿らなくてもOKです。該当ファイルが見つかれば良いので、ファイルステータス欄や検索からファイルを表示しても良いです。
ESP32でテトリスを作ってみた

![0b7a4f85-3aa7-7ef4-1444-3140b4769880.jpg](https://qiita-image-store.s3.amazonaws.com/0/174906/a77bb357-cb38-bafe-e663-dfb2b0a57a8c.jpeg)
表示はAitendoの液晶モジュール（950円）を使用しました。操作はAndroidケータイからWiFiを通じて無線で行う、またはUSBからSerial Portを通じて行います。esp32については自分の動画 [【ゆっくり解説】 WiFiの使い方2 【電子工作】](http://www.nicovideo.jp/watch/sm31250966)で紹介しています。
#準備
以下のものを用意します。

- [ESP32-DevKitC] (http://akizukidenshi.com/catalog/g/gM-11819/) ESP32 1480円：秋月
- [M-Z18SPI-2PB] (http://www.aitendo.com/product/15420) TFTカラー液晶 950円：Aitendo

#配線
ESP32と液晶を以下のように配線します。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/174906/c248ea0c-f297-5888-64e1-c41cff28ecb4.png)
![DSC_0007.JPG](https://qiita-image-store.s3.amazonaws.com/0/174906/51230667-e937-243a-a4d8-668c32533b79.jpeg)


# プログラム
開発環境は[Arduino-esp32](https://github.com/espressif/arduino-esp32)を使います。
プログラムは[esp32_ST7735_Tetris](https://github.com/MhageGH/esp32_ST7735_Tetris)になります。自分の動画[【ゆっくり解説】 テトリスの作り方 【ゲームプログラミング】](http://www.nicovideo.jp/watch/sm17983957)を参考にしました。

# コントローラの設定
Serial Portを使うときはテンキーの8(↑ボタン), 6(→ボタン), 2(↓ボタン), 4(←ボタン) と zキー(Aボタン), xキー(Bボタン)を使います。

Androidケータイでは[WiFi TCP/UDP Controller](https://play.google.com/store/apps/details?id=udpcontroller.nomal&hl=ja)でボタンにSerial Portのときと同じASCIIコードを充てます。TCP/UDPはUDP、IPは192.168.4.1、Portは10000に設定します。これらの設定は手動でも行えますが、プログラムのフォルダにあるWiFi_UDP_Controller_config.txtをAndroidのフォルダマネジャーでホームフォルダ/Controller Backup に置き、WiFi TCP/UDP Controllerでロードすることでも行えます。
![C83Ln76U0AAS8wr.jpg](https://qiita-image-store.s3.amazonaws.com/0/174906/2ffbd2b4-76d9-7c82-12b6-974a678a7f3a.jpeg)

# ゲーム開始
esp32に電源を入れるとテトリスの画面が現れます。AndroidケータイでWiFiをESP32につなげてWiFi TCP/UDP Controllerを立ち上げ、Aボタンを押すと開始します。
CygwinでWindowsのフォルダにさくっと移動する方法


(1)Cygwinで次のコマンドを打ちます

```bash
 alias clipcd='cd "$(cat /dev/clipboard | cygpath -u -f -)"'
```

(2) Windowsでパスを右クリックでコピーします。


(3)Cygwinで`clipcd`と打つと、コピーしたパスに移動します。



#永続化

Cygwinを立ち上げるたびにエイリアスを張るのは面倒なので永続化しましょう。
bashが起動するとき実行される`.bashrc`ファイルに(1)のコマンドを追記します。

```bash
cd ~
vi .bashrc
```

ついでに次の関数も`.bashrc`に書いておくと、`wincd "ウィンドウズのパス"`で移動できて便利です。

```bash
function wincd(){
  cd `cygpath -u $1`
}
```


※Babunを使っている場合は、zsh環境なので`.bashrc`でなく`.zshrc`に書いて下さい。
マイナンバーのチェックデジットを計算する　Fortran 2003

#
Fortran タグで下記記事が流れてきたので、遅ればせながら日曜午後の暇つぶしにと参加してみました。
[色々な言語でマイナンバーのチェックデジットを計算したかった](http://qiita.com/h_oki/items/358979d21bf7fe460816)

計算方法などは、以下を参照しました。
[マイナンバーのチェックデジットを計算する - Qiita](http://qiita.com/yumetodo/items/600ca0df422010cbc4c1)


マイナンバー イメージ画像
![50b2c511.png](https://qiita-image-store.s3.amazonaws.com/0/44522/3557c2ff-b1b9-e9ad-7410-f248d1322641.png)


### ソース・プログラム
Fortran 2003 なのはコマンドライン引数を取るところだけで、残りは Fortran90/95 水準です。

````fortran
    module m_mynum
      implicit none
    contains
      pure integer function ichk_sum(ip)
        integer, intent(in) :: ip(11)
        integer :: i, iq(11)
        forall (i = 1:11) iq(i) = mod(i - 1, 6) + 2 
        ichk_sum = 11 - mod(sum(ip * iq), 11)
        if (ichk_sum >= 10) ichk_sum = 0
      end function ichk_sum  
    
      subroutine chk_mynumber(c)
        character, intent(in) :: c(12)
        integer :: m(12)
        m = iachar(c) - iachar('0') ! change to ascii code
        if (m(12) == ichk_sum( m(11:1:-1) )) then ! reverse order
          print *, 'check matched!'
        else
          print *, 'check failed!'
        end if
      end subroutine chk_mynumber   
    end module m_mynum
    
    program mynum
      use m_mynum
      implicit none
      character (len = 80) :: buff
      call get_command_argument(1, buff) ! F2003
      if (len_trim(buff) == 12) then
        call chk_mynumber(transfer(buff, ' ', size = 12))  ! string to chr-array
      else
        print *, 'input must be 12 digits long'  
      end if    
    end program mynum
````
チェックサム関数の pure プレフィックスは、今の場合ただの飾りです。

Transfer 関数で文字列を、文字配列に直しています。文字配列にすると、関数の elemental な性質が使えるのでループ変数で回す必要がなくなります。intel 拡張の [1:11] での数列生成を用いれば、forall ループもいらなくなるのですが、ここは標準に敬意を払って･･･

ichar と iachar の違いは、処理系の文字コードか ASCII コードかの違いです。Fortran 界では長年 IBM の EBCDIC が正字だったので二通りの関数が用意してあります。現在では ASCII に一統された感があるので、あまり気にしなくても問題ありません。EBCDIC では文字が連続して並んでいないので、文字コードの連続性を仮定した ASCII コードでのテクニックがしばしば破綻します。

###実行結果
````
E:\Projects\Console4\mynum\Debug>mynum 12345678901
 input must be 12 digits long

E:\Projects\Console4\mynum\Debug>mynum 123456789010
 check failed!

E:\Projects\Console4\mynum\Debug>mynum 123456789011
 check failed!

E:\Projects\Console4\mynum\Debug>mynum 123456789012
 check failed!

E:\Projects\Console4\mynum\Debug>mynum 123456789013
 check failed!

E:\Projects\Console4\mynum\Debug>mynum 123456789014
 check failed!

E:\Projects\Console4\mynum\Debug>mynum 123456789015
 check failed!

E:\Projects\Console4\mynum\Debug>mynum 123456789016
 check failed!

E:\Projects\Console4\mynum\Debug>mynum 123456789017
 check failed!

E:\Projects\Console4\mynum\Debug>mynum 123456789018
 check matched!

E:\Projects\Console4\mynum\Debug>mynum 123456789019
 check failed!
````
Powershellにおける無効日付(2月31日など)の扱い

[こちらの記事](http://qiita.com/miyazato_te/items/23a86a2b6bc737e82d4d)のPowerShell版をやってみる。

```.ps1
$BaseDate = Get-Date -Year 2017 -Month 1 -Day 31

@(0..5) | %{$BaseDate.AddMonths($_).ToString("yyyy-MM-dd")}
```



```:Result
2017-01-31
2017-02-28
2017-03-31
2017-04-30
2017-05-31
2017-06-30
```

1/31に対して`.AddMonths()`していくと、各月末日が表示される。
が、これはｎヶ月足したら、その月は31日がなかったので繰り上げている様子。

ので、1ヶ月づつ加算していくと、

```.ps1
$BaseDate = Get-Date -Year 2017 -Month 1 -Day 31
$tmpDate = $BaseDate

@(0..5) | %{
    $tmpDate.ToString("yyyy-MM-dd")
    $tmpDate = $tmpDate.AddMonths(1)
}
```

```:Result
2017-01-31
2017-02-28
2017-03-28
2017-04-28
2017-05-28
2017-06-28
```

2/28の翌月以降は各月28日になる。

各月末日が取りたい場合はこんな感じ？

```.ps1
$BaseDate = Get-Date -Year 2017 -Month 2 -Day 1

@(0..5) | %{($BaseDate.AddMonths($_)).AddDays(-1).ToString("yyyy-MM-dd")}
```

```:Result
2017-01-31
2017-02-28
2017-03-31
2017-04-30
2017-05-31
2017-06-30
```


## 参考

- [各言語における無効日付(2月31日など)の扱い](http://qiita.com/miyazato_te/items/23a86a2b6bc737e82d4d)
- [Go 言語における無効日付(2月31日など)の扱い](http://qiita.com/spiegel-im-spiegel/items/42d115471cf2b5a80437)
ローカル環境のファイルをリモートデスクトップを通してWindows Serverに送信する

 #はじめに
例えば、Public Networkを使わずにローカル環境のファイルをクラウド環境のWindows Serverに送りたいなんていうことはありませんか？
そんなとき1つの手としてWindows Remote Desktopを利用して送信することができます。

この記事ではその方法について解説します。

#送信側のRemote Desktopで送信したいフォルダを選択
・リモートデスクトップのTop画面のNewを選択して設定画面を開きます。
　（別途Generalでサーバーの設定をする必要があります）
・あるいは、Top画面の接続先一覧から該当するものを選びEditをクリックします。

その後、フォルダアイコンのついたRedirectionをクリックし、その左下の"＋"ボタンをクリックし該当するファイルの入ったフォルダを選択します。
![Redirection.png](https://qiita-image-store.s3.amazonaws.com/0/141025/ea9c9680-93fd-4bb0-21dd-39abdbcdcc40.png)

#受信したフォルダを確認
Windows Serverを開き、エクスプローラーを開くと、ネットワーク共有欄にフォルダが届いているはずです。
（送信する前にすでに開いている際は再起動するといいでしょう）
届いたフォルダをWindows Server（受信側）のローカル環境にコピーしましょう！

以上です。
お疲れ様でした。
Excel VBA:Select 文の中身を作り出すマクロ

##VBAの作成支援
今回のVBAはEXCEL用ですが、VBAではすべて使えます。
プロパティの値は数値で帰ってきますが、これが定数の名前でわかる方法は文字列に変えなければなりません。
これをユーザー定義関数で定義するときに、間違いなく定義するためのものです。

##Msのページからコピペする
列挙体のHPは表形式になっていることが多く、
A　　B　　C
定数 数値 解説
のようになっています。
この表をコピーしてEXCELに貼り付け次のプロシージャを実行します。

```vbnet:MakeCaseSentenceForExcel
Sub MakeCaseSentenceForExcel()
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet: Set ws = ActiveSheet
Dim LastRow As Long, iRow As Long, iCol As Long
LastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
For iRow = 1 To LastRow
ws.Cells(iRow, 4).Value = "Case Is = " & ws.Cells(iRow, 2).Value & vbCrLf & "fnType=" & ws.Cells(iRow, 1).Value & " '" & ws.Cells(iRow, 3)
Next iRow
End Sub
```

##関数名の生成
個人的な命名方法ですが・・・

 -  最初はfnかIs、Hasから始める
 -  Is,HasはBooleadnでfnはそれ以外
 - 次にどのアプリケーションで使うか
    - Word wd
    - Excel xl
    - Outlook ol
    - Visio   vo
    - Onenote ot
    - Publisher pb
    - PowerPoint pp
 - この次は列挙体 Enumulation 定数の名前にします。

今回はPublisherのShapeのTypeをつくるということで
fnPbShapeType
という名前になりました。

##関数のひながた（Form）
次に
関数のひな型を示します。
Word wd
Excel xl
Outlook ol
Visio   vo
Onenote ot
Publisher pb
PowerPoint pp
という感じで、この次は列挙体 Enumulation 定数の名前にします。

```vbnet
Public Function fnPbShpeTypeEnum(inumber as long) as string
Select Case inumber

Case Else
fnPbShpeTypeEnum ="UnKnown Enumulation Error?"
End Select
End Function
```

ここにできたCase分を貼りつけて出来上がりです。
Case Elseはエラー回避用です
返り値は文字列です。
Fluentd with Docker で知っておきたいこと

# 前振り

Docker、Docker-compose、Fluentd力が無さ過ぎて苦労したので、苦労したことのまとめ。

## その1　プラグインのインストール

1. プラグインのインストールをするのなら、docker-compose.ymlとDockerfileの両方を使用する
    * docker-compose.yml で build オプションを指定すると使用するDockerfileを指定できる
    * [公式の説明](http://docs.fluentd.org/v0.12/articles/docker-logging-efk-compose)でも使用されている
    * docker-compose.ymlからみた相対パスでfluentdディレクトリを指定するには`build: ./fluentd`とする
2. プラグインのインストールは、`gem install fluent-plugin-datacounter`でOK。
    * `td-agent-gem install`もあるけど、Dockerでやるときに若干困った。
    * `RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri", "--version", "1.9.2"]`てのもあるが、ヘッダーファイルのインストールと削除してとなると困った。
3. Fluentd with Docker では、イメージサイズを小さく保つためにbuild-baseとruby-devが消してある
    * プラグインのインストール時に、「mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h」というエラーが出ることがある。
    * これは[意図した仕様](https://github.com/fluent/fluentd-docker-image/issues/22)。
    * 自分でインストールして使ってね。

## その2 UDPの疎通ミスによる死活監視エラー

1. Docker環境で使用していると、` [warn]: detached forwarding server '172.27.***.***:24224' host="172.27.***.***" port=24224`というエラーがでる。
2. Docker、EC2環境でUDPのハートビート死活監視がこけていることが原因
    * ハートビートの死活監視をTCPに制限するのが一番楽そう
    * `heartbeat_type tcp`を指定して対応
    * [公式の解説](http://docs.fluentd.org/v0.12/articles/out_forward#heartbeattype)

* Amazon Linux でポートListenしてるか確認するコマンド
    * telnetで生きてきたので、インストールされてなくて困った
    * TCP : `nc -zv 172.27.16.170 24224`
    * UDP : `nc -zvu 172.27.16.170 24224`
    * 参考：[【初心者向け】各OSのTCP通信チェックコマンド入門](http://dev.classmethod.jp/cloud/aws/ec2-tcp-port-check-command/)
Baculaでバックアップを試す

# Baculaでバックアップを試す

以下の記事を参考にさせていただきながら環境を構築してみました。

構築環境のOSは、CentOS 7 です。

---

[オープンソースソフトウェア「Bacula」で安心・安全なバックアップシステムを構築しよう](http://gihyo.jp/admin/serial/01/bacula)



- [x] [第2回　Baculaでバックアップをしてみよう](http://gihyo.jp/admin/serial/01/bacula/0002)
- [ ] [第3回　GUIツールBaculumを使ってバックアップを簡単にする](http://gihyo.jp/admin/serial/01/bacula/0003)

---

現在の構築状況として、第３回のところで躓いて先に進むことができません。

具体的には、以下のtestを実行すると「Invalidate Connection error」 エラーとなってしまいます。
原因としては権限の問題が考えられるようで回避手順も記載されていますが、この回避手順を実施してもエラーは解消されません。

> 次にCUIツールであるbconsoleとの連携設定をします。設定はデフォルトのままで画面中央の「Bconsole connection test」を実施します。
「test」ボタンをクリックします。
![](http://image.gihyo.co.jp/assets/images/admin/serial/01/bacula/0003/thumb/TH400_005.png)
「OK」と表示されることを確認してください。OKと表示されたら画面中央下の「Next」をクリックしてください。
もし，NGとなる場合はbconsoleの設定ファイルbconsole.confのファイルの権限が正しくない可能性があります。sshで管理サーバにログインして以下のコマンドを実行します。
 chmod 644 /etc/bacula/bconsole.conf
権限変更後に再び「test」ボタンをクリックして「OK」となることを確認してください。


以下のとおり、権限を変更したことで権限まわりの問題は解消されたと思いますが、他に何が原因なのか調査中。。。

```shell-session
# chmod 644 /etc/bacula/bconsole.conf
# ls -la /etc/bacula/
total 44
drwxr-xr-x.  2 root root    111 Apr  9 06:41 .
drwxr-xr-x. 93 root root   8192 Apr  9 08:11 ..
-rw-r-----.  1 root bacula 9507 Apr  9 06:39 bacula-dir.conf
-rw-r-----.  1 root root   1046 Apr  9 06:12 bacula-fd.conf
-rw-r-----.  1 root root   7943 Apr  9 06:09 bacula-sd.conf
-rw-r--r--.  1 root root    241 Apr  9 06:14 bconsole.conf
-rw-r-----.  1 root bacula  312 Mar 16 13:24 query.sql
```

エラーの原因が以下のログから判明しました。
なんともお粗末な（自戒）。。。

```shell-session
Apr 09 09:04:41 CentOS73Base bconsole[1674]: bsock.c:113 Unable to connect to Director d...ed
Hint: Some lines were ellipsized, use -l to show in full.
```

**ディレクターデーモン（bacula-dir）** のサービスを開始することで test が OK になりました。

が、先に進むと今度は、
「Save」ボタン押下後に以下の画面が表示されてしまいました。

![](https://i.imgur.com/wFmMGMc.png)


気分を変えて、今日は店じまい。。。
Oracleでカラムの存在チェック＆追加

システムのバージョンアップで、必要なカラムが存在している環境と存在していない環境が混在している状況に直面しました。
バージョンアップの手順を１パターンにしたかったため、カラムが存在したら追加するスクリプトで対応しました。
##対応方法
- データベースはOracle
- OracleのPL/SQL使用

1.スクリプトファイル

```
SET SERVEROUTPUT ON;
DECLARE
    V_COUNT NUMBER(2) := 0;
    V_OWNER VARCHAR(128);
    V_TBLNAME VARCHAR(128);
    V_COLUMN VARCHAR(128);
BEGIN
    ------------------------------------------------
    -- カラムの存在チェック
    ------------------------------------------------
    V_OWNER := 'TESTUSER';
    V_TBLNAME := 'TESTTABLE';
    V_COLUMN := 'TESTCOLUMN';
    select count(COLUMN_NAME) into V_COUNT from ALL_TAB_COLUMNS where owner = V_OWNER and Table_Name = V_TBLNAME and COLUMN_NAME = V_COLUMN;
    IF (V_COUNT = 0) THEN
	-- 存在していなかった場合追加
        DBMS_OUTPUT.PUT_LINE(V_OWNER || '.' || V_TBLNAME || '.' || V_COLUMN || 'カラムを追加します。');
        execute immediate 'ALTER TABLE TESTUSER.TESTTABLE ADD ( TESTCOLUMN VARCHAR2(XXX))';
    ELSE
        DBMS_OUTPUT.PUT_LINE(V_OWNER || '.' || V_TBLNAME || '.' || V_COLUMN || 'カラムはすでに存在します。');
    END IF;
END;
/
quit;

```

2.実行

```
$sqlplus user/pass @ xxx.sql
```
Mac に SentencePiece をインストール

Mac に SentencePiece を入れる際にちょっとした工夫が必要だったのでメモとして記します。

## ビルドに必要なものを入れる
```
brew install autoconf automake libtool protobuf
```
## autogen.shを書き換える
```bash
perl -i -pe 's/libtoolize/glibtoolize/' autogen.sh
```
Homebrew の libtool では libtoolize が glibtoolize となっているので書き換えます。

## まとめるとこうなります

```bash
brew install autoconf automake libtool protobuf

pushd .
git clone --depth=1 https://github.com/google/sentencepiece.git /tmp/
cd /tmp/sentencepiece
perl -i -pe 's/libtoolize/glibtoolize/' autogen.sh
./autogen.sh
./configure
make
make check
sudo make install
popd

rm -rf /tmp/sentencepiece
```


# 一発で入れたいときはこれ
```
curl -L https://gist.githubusercontent.com/ikegami-yukino/a71956799866b77e53b553fbd1ca4431/raw/c4e1b6a7efb63db4bf5f1b8800cb2250ee83cc95/install_sentencepiece_on_mac.sh | bash
```
戻るキーでEditTextのフォーカスをはずす

IMEが表示されている状態では`Activity#onBackPressed()`は呼ばれないのでここで`EditText`のフォーカスを外すことはできません。
`EditText`のフォーカスをはずすには`EditText`を拡張します:

```java:MyEditText.java
package com.example.android.sampleapp;

import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;

public class MyEditText extends EditText {
    public MyEditText(Context context) {
        super(context);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
            View parent = (View) getParent();
            parent.setFocusable(true);
            parent.setFocusableInTouchMode(true);
            parent.requestFocus();
        }
        return super.onKeyPreIme(keyCode, event);
    }
}
```

注) Support Libraryを利用している場合は、`AppCompat`系のクラスを親クラスにすることが推奨されていたりします。例えば`EditText`は`AppCompatEditText`です。

あとは適当にレイアウトxmlに追加すればokです。


ポイントは、

```java
parent.setFocusable(true);
parent.setFocusableInTouchMode(true);
```

でparentにフォーカスを当てられる状態にしてから`requestFocus()`を呼ぶことです。こうしなければparentにフォーカスが移動しないので`EditText`にフォーカスが残ったままになります。

また、`onKeyPreIme`の名のごとく、このメソッドはIMEが閉じるよりも前に呼ばれますので、superクラスの`onKeyPreIme(int, KeyEvent)`を呼んであげなければ、IMEは開いたままになります（`InputMethodManager`を通して自分で閉じてやればいいですが）。
AWS ElasticCacheの料金について

ElasticCacheに関する基本的な内容をまとめてみたものです。ElasticCacheに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[ElasticCacheの料金について] (https://www.techcrowd.jp/elasticcache/price-2/)

# [料金について] (https://www.techcrowd.jp/elasticcache/price-2/)

### オンデマンド キャッシュノードとリザーブドキャッシュノード
Amazon ElastiCacheには、キャッシュノードを使用する時間によって料金を支払うオンデマンド キャッシュノードと、予約金を支払うことで、キャッシュノードの予約ができるリザーブドキャッシュノードがあります。

### バックアップ機能
Amazon ElastiCacheのバックアップ機能については、クラスターごとに1つのスナップショット用の容量を無料で使えますが、追加のバックアップストレージには毎月料金が発生します。

### データ転送
同一のアベイラビリティーゾーンのAmazon EC2とAmazon ElastiCacheのデータ転送については無料です。
同じリージョンで異なるアベイラビリティーゾーンのAmazon EC2とAmazon ElastiCacheのデータ転送には課金されます。


# [オンデマンド キャッシュノード] (https://www.techcrowd.jp/elasticcache/price-2/)

オンデマンドキャッシュノードは、使用したキャッシュのタイプ・容量・時間から料金が計算されます。
長期的な契約を結ぶ必要がないので、固定費を削減することができる料金プランです。
時間単位で料金が計算されますから、1時間未満の使用については１時間分の料金となります。


# [リザーブドキャッシュノード] (https://www.techcrowd.jp/elasticcache/price-2/)

予約金を先払いすることで、1年間または3年間希望のキャッシュノードを予約できるのがリザーブドキャッシュノードの特徴です。
予約金を事前に一括で支払う必要がありますが、オンデマンドキャッシュを利用する場合よりも大幅な料金の割引があります。
AWS ElasticCache Redisエンジン

ElasticCacheに関する基本的な内容をまとめてみたものです。ElasticCacheに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[Redisエンジン] (https://www.techcrowd.jp/elasticcache/redis/)

# [redis用のAmazon ElastiCache] (https://www.techcrowd.jp/elasticcache/redis/)

redis用Amazon ElastiCacheは、redisプロトコルに準拠するWEBサービスです。
メモリ上にデータを格納するKVSで、ハッシュ・リスト型・集合型などのさまざまなデータ構造をサポートし、マスター・スレーブによるレプリケーションにも対応しています。
さらに、メモリ上のデータをディスクに書き出したり、スケールアウトが容易であるなどの特徴を持つ高性能KVSです。

memcachedはメモリキャッシュとしの動作が主となりますが、redisはデータストアとしても動作することができます。


# [文字列やハッシュ以外のデータ構造にも対応] (https://www.techcrowd.jp/elasticcache/redis/)

Redisは文字列やハッシュ以外の構造のデータも、キーに関連付けて格納することが可能です。
そのため、Redisはデータストラクチャストアとも呼ばれることがあります。

Redisで扱えるデータ構造
・文字列
・ハッシュ
・セット
・リスト
・ソート済みのセット


# [レプリケーション(リードレプリカ)とマルチAZ] (https://www.techcrowd.jp/elasticcache/redis/)

Redis用Amazon ElastiCacheは、リードレプリカとマルチAZが利用できます。

### リードレプリカ
リードレプリカは、読み込みのスケーリングと障害発生時の対応のために使用されます。

・データの読み込み量が多いとキャッシュに負荷がかかりますが、リードレプリカを利用することで1つのキャッシュノードの容量を気にすることなく、自由にスケールアウトすることが可能です。
・フェイルオーバーが発生すると、スタンバイとして機能していたリードレプリカがプライマリとなって、システムを正常に動作させます。

### マルチAZ
マルチAZは、Redisがプライマリからリードレプリカへデータのコピーをすることです。
非同期にデータのコピーが行われ、ノード障害やアベイラビリティーゾーンの障害が発生した時に、Amazon ElastiCacheが自動的にリードレプリカを選択して新しいプライマリとします。
マルチAZが有効の場合は、フェイルオーバーが発生しても、手動で復旧作業する必要がありません。


# [非同期のディスクへの書き出し] (https://www.techcrowd.jp/elasticcache/redis/)

Redisはデータ上にメモリを格納するKVSですが、データの更新量が一定以上となるとディスクに非同期でデータを書き込む機能も持っています。
この機能を利用することで、障害に強いシステムを構築することが可能です。
しかし、ディスクにデータを書き込むことでデータの永続性を維持しますが、ディスクにバックアップしていないデータについては消失してしまいます。


# [バックアップと復元] (https://www.techcrowd.jp/elasticcache/redis/)

ユーザーがRedis用ElastiCacheクラスター全体のコピーであるスナップショットを作るための機能が、バックアップと復元です。
Redisクラスター全体のコピーを作成することで、ノードに障害が発生してもデータを復元することができます。

バックアップと復元機能は、AWSマネジメントコンソール・ElastiCache API・ CLI で設定できます。
何度でも、アクティブにしたり無効にすることができます。

バックアップを行う時期はユーザーが決めることもできますし、毎日作成するように設定することも可能です。
バックアップ作業が始まると指定したRedisクラスターのスナップショットの作成が行われ、S3に保存されます。
Visual Studio 2017 による ASP.NET Core MVC 開発

Visual Studio 2017 が、2017/03/07 に、リリースされて、約 1 カ月が経ちます。

その間に、すでに、4 回の更新がリリースされています。

Visual Studio 2017 リリース ノート
https://www.visualstudio.com/en-us/news/releasenotes/vs2017-relnotes

この Visual Studio 2017 のリリースで良いところは、色々ありますが、特に良いなと思っているのが、"ASP.NET Core Web アプリケーション" が標準で開発できること。
この Visual Studio 2017 では、標準で "ASP.NET Core Web アプリケーション" のプロジェクト テンプレートが選択できます。 

![image](https://qiita-image-store.s3.amazonaws.com/0/172205/069bcf87-25c3-d7dd-29ac-972d7b3bedcd.png)

現状では、今までの .NET Framework のすべての API をサポートしているわけではないものの、Linux でも動作可能な ASP.NET Web アプリケーションを開発できるというのは、大きなメリットです。
積極的に "ASP.NET Core Web アプリケーション" を選択し、開発していきましょう！

![image](https://qiita-image-store.s3.amazonaws.com/0/172205/cdf1d881-d828-66d3-8b09-196d169d3d7f.png)

プロジェクトの新規作成で、"ASP.NET Core Web アプリケーション(.NET Core)" を選択すると、 さらに、ASP.NET MVC のテンプレートが選択可能なダイアログが表示されます。
ネイティブ アプリのバックエンドとして、RESTful な Web サービスを開発する場合は、[Web API] を Web アプリケーションを開発する場合は、[Web アプリケーション] を選択ください。

![image](https://qiita-image-store.s3.amazonaws.com/0/172205/1beed948-b4e7-ccda-7d2a-89a33f46ecf5.png)

[Web アプリケーション] を選択した場合、テンプレートが生成され、実行すると、今までの ASP.NET MVC のテンプレートと同様の Web アプリケーションが生成されていることが分かります。

![image](https://qiita-image-store.s3.amazonaws.com/0/172205/1441d9cd-06e7-2799-525b-7c85fb5db204.png)

ただ、クロスプラットフォーム対応のための変更点もいくつかあります。
"web.config" がありません。"appsettings.json" に置き換えられています。
XML ベースから、jSON ベースのフォーマットに変更されています。
また、IIS 固有の機能である URL リライトのルール設定等が、構成ファイルベースで定義できないことも注意点です。

![image](https://qiita-image-store.s3.amazonaws.com/0/172205/e1d877de-e2bd-c806-4e96-29da9393c1d1.png)

この構成情報ですが、コード上でロードの処理が定義されています。

```csharp:Startup.cs

public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }
```

上記のコードは、テンプレートで生成されたコードの Startup クラスの Startup メソッドですが、ここに構成情報のロードの処理が定義されています。

後に定義されている方の構成情報でオーバーライトされます。
以下の順の優先順位となります。

appsettings.json < appsettings.%ASPNETCORE_ENVIRONMENT%.json < 環境変数

環境変数で構成情報の設定を行う場合、":" をセパレーターにして環境変数の名前を定義します。

例) "Logging:IncludeScopes"

この環境変数の定義は、本番環境利用時、Azure App Services や Linux 環境での利用が考えられます。

.NET Core への移行は、IIS 固有の機能を利用している場合には、検討が必要となりますが、それ以外の場合では、いよいよ実用レベルに各機能が充実してきたと感じています。
Gradle で Integration Test

自動化されたテストにデータベースなどが絡んでいると、実行に時間がかかるようになってしまいます。単体テストと結合テストに分けて、単体テストを気軽に実行できるようにしておきましょう。毎回結合された状態でテストできる方がテストの精度が上がりそうですが、時間がかかってテストを行わなくなると本末転倒です。

Gradle を使う場合は、 https://www.petrikainulainen.net/programming/gradle/getting-started-with-gradle-integration-testing/ の記事が良かったので結論だけメモしておきます。

```
sourceSets {
    integrationTest {
        java {
            compileClasspath += main.output + test.output
            runtimeClasspath += main.output + test.output
            srcDir file('src/integration-test/java')
        }
        resources.srcDir file('src/integration-test/resources')
    }
}

configurations {
    integrationTestCompile.extendsFrom testCompile
    integrationTestRuntime.extendsFrom testRuntime
}

task integrationTest(type: Test) {
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath = sourceSets.integrationTest.runtimeClasspath
    outputs.upToDateWhen { false }
}
```

単体テストと同様に書いて、 `src/integration-test/java` に配置し、 `gradle integrationTest` で実行します。 integrationTest のみで利用するライブラリは、 `dependencies` に `integrationTestCompile` で指定します。
AWS ElasticCache Memcachedエンジン

ElasticCacheに関する基本的な内容をまとめてみたものです。ElasticCacheに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[Memcachedエンジン] (https://www.techcrowd.jp/elasticcache/memcached/)

# [汎用の分散型メモリキャッシュシステム] (https://www.techcrowd.jp/elasticcache/memcached/)

memcachedは、オープンソースのメモリキャッシュシステムです。
保存・検索・削除しかできませんが、レスポンスが高速で大量のデータを操作しても性能が劣化しません。
そのため、高速のレスポンスが要求される大規模なWEBサイトなど複数利用されて、システムの負荷を抑えるために使われています。

Memcached用Amazon ElastiCacheはmemcachedのプロトコルに準拠していますので、既存のMemcachedのデプロイと同じように標準的な Memcached 操作が可能です。
ただし、Amazon ElastiCacheにアクセスするにはAmazon EC2 ネットワークが必要となるので、Amazon EC2 にアプリケーションサーバーを用意する必要があります。


# [キャッシュの設定およびスケジューリング] (https://www.techcrowd.jp/elasticcache/memcached/)

Memcached用Amazon ElastiCacheのキャッシュノードタイプの初期設定は、以下の2種類から選ぶことができます。

・キャッシュに必要となる合計メモリ
必要となる合計メモリは、データセットやアプリケーションによって異なります。
障害発生時の対応やシステムへの負荷を考慮して、適切な値に設定することが重要です。

・キャッシュノードの数
1リージョンにつき最大50のキャッシュノードが使用できますが、それ以上の数のキャッシュノードを使う場合はElastiCacheの制限増加申請フォームにて連絡する必要があります。


# [Amazon ElastiCacheの自動検出] (https://www.techcrowd.jp/elasticcache/memcached/)

Memcached用Amazon ElastiCacheの自動検出機能によって、クラスターのキャッシュノードが追加・削除された時にクライアントが自動的に検出できます。
クラスターのメンバーシップが変更された場合に手動で対応するとアプリケーションを再起動する必要が生じますが、自動検出機能を使ってクライアントにクラスターのメンバーシップを連絡することで、クライアントが再設定を行い初期化する必要がなくなります。

Memcached用Amazon ElastiCacheの自動検出機能を使うためには、自動検出に対応しているクライアントを使用してAmazon ElastiCachのクラスターに接続しなくてはなりません。
現在は、JavaとPHPのための自動検出クライアントが用意されています。
その他の開発言語を使用する場合は、一般的なmemcached クライアントで自動検出機能を構築する必要があります。


# [キャッシュエンジンバージョン管理] (https://www.techcrowd.jp/elasticcache/memcached/)

Memcached用Amazon ElastiCacheは、キャッシュクラスターを動かしているmemcachedプロトコル準拠のソフトウェのバージョン管理を行うことができます。
ユーザーに意志によって新しいバージョンにアップグレードしたり、アップグレードする時期を設定することが可能です。
しかし、Memcachedのバージョンを変更すると、さまざまな障害が発生する可能性もありますので、Memcached用Amazon ElastiCacheが自動的にバージョンをアップグレードすることはありません。
ユーザーがテストを行ってから、アップグレードしたいバージョンを指定するようになっています。
基本的にはバージョン管理はユーザーによって行われますが、システムやキャッシュソフトウェア上にセキュリティの脆弱性がある場合は、システムがキャッシュクラスターにバッチを適用することもあります。
ElasticCache2種類のエンジン

ElasticCacheに関する基本的な内容をまとめてみたものです。ElasticCachedに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[ElasticCache 2種類のエンジン] (https://www.techcrowd.jp/elasticcache/engines/)

# [ElasticCacheを利用する際のエンジンの選択基準] (https://www.techcrowd.jp/elasticcache/engines/)

ElasticCacheではmemcachedとredisの2つのエンジンをサポートしていますが、エンジンの機能に大きな違いがあるので、用途に応じたものを選ぶ必要があります。

### memcachedを選択した方が良い場合
・モデルを簡素にしたい
・複数のコア・スレッドのあるノードを実行する
・スケールアウトまたはスケールインする予定がある
・データベースなどをキャッシュする

### redisを選択した方が良い場合
・文字列・ハッシュ・リストなどの複雑なデータを用いる
・プライマリーノードに障害が発生した時に、自動的にフェイルオーバーが行われる必要がある
・読み取るデータ量が多いので、プライマリから複数のリードレプリカにレプリケートする
・キーストアに永続性を求める


# [揮発性と永続性] (https://www.techcrowd.jp/elasticcache/engines/)


KVSは揮発性・永続性によっても、分類できます。

揮発性KVSは、メモリ上にデータを格納します。
メモリを使いために高速でデータを操作できますが扱えるデータ量が限られるために、古いデータや使用頻度の低いデータは消去されてしまいます。

永続性KVSは、ディスク上にデータを格納します。
処理速度は遅くなりますが扱えるデータ量が大きくなるために、いつまでもデータを保存することが可能です。

memcachedとredisは揮発性KVSに分類されますが、redisはディスクにバックアップする機能がありますので永続性もあります。


# [memcachedとredisの特徴] (https://www.techcrowd.jp/elasticcache/engines/)

###memcachedの特徴
・データをメモリ上に格納することで、データベースの負荷を軽くする
・一時的なキャッシュとして使われる
・ノード間の複製は行わない
・障害が発生するとデータは消える

### redisの特徴
・データをメモリ上に格納して、高速で読み書きを行う
・マスタ・スレーブ型
・edis自体でデータストアとしても利用可能


# [Memcached・Redis間の移行について] (ttps://www.techcrowd.jp/elasticcache/engines/)

MemcachedからRedisまたはMemcachedからRedisへの自動移行は、Amazon ElastiCacheでは現在サポートされていません。

しかし、Memcachedクライアントを使ってMemcachedクラスターから読み込んだデータをRedisクライアントを使ってRedisクラスターに書き込むことは可能です。
また、Redisクライアントを使ってRedisクラスターから読み込んだものを、MemcachedクライアントでMemcached クラスターに書き込むこともできます。
Ubuntuでgulp実行すると、events.js:163       throw er; // Unhandled 'error' event       ^  Error: spawn java ENOENT

# 環境
* 仮想環境 vagrant
* Ubuntu 16.04
* node v7.8.0

# エラーメッセージ
```
events.js:163
      throw er; // Unhandled 'error' event
      ^

Error: spawn java ENOENT
    at exports._errnoException (util.js:1034:11)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:193:32)
    at onErrorNT (internal/child_process.js:367:16)
    at _combinedTickCallback (internal/process/next_tick.js:80:11)
    at process._tickCallback (internal/process/next_tick.js:104:9)
```

このエラーメッセージの中でそれっぽい部分をググっても全くヒットせず。。。

# 解決方法
それでもメッセージの通り、*Java*をインストールすればよかっただけでした。

```
$ sudo apt-get -y install python-software-properties software-properties-common
$ sudo sh -c "echo 'oracle-java8-installer shared/accepted-oracle-license-v1-1 select true' | debconf-set-selections"
$ sudo add-apt-repository -y ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get -y install oracle-java8-installer
$ sudo apt-get -y install oracle-java8-set-default

# インストール直後
echo $JAVA_HOME
(空文字)

# 一度exitして、vagrant reloadした後
echo $JAVA_HOME
/usr/lib/jvm/java-8-oracle

```

# 反省
エラーメッセージ→ググる
という習慣が染み付きすぎてしまい、メッセージをちゃんと読むということを怠っていました。。。
そして仮想環境は最初まっさらであることを再認識。ってきりjavaはあるだろーという勘違いが祟りました。

# Special Thanks
コマンドはまるっきり参考にさせていただきましたm(_ _)m
[Ubuntu 16.04 で Oracle Java を apt-get でインストールする件](https://hirooka.pro/?p=8444)
find, xargs, sed(gsed) でファイルの一部を置換して保存する

1024 番煎じくらいですが毎度忘れるので。

```bash 
# sed -i は上書き更新オプション
find ./path/do/dir -name '*.js' | xargs sed -i "s/foo/bar/g"

# Mac だと sed -i が使えないので、事前に brew install gnu-sed などして gsed を使えるようにする
find ./path/do/dir -name '*.js' | xargs gsed -i "s/foo/bar/g"
```
Azureのポータル上でBashが使える！

[Azureのポータル]((https://portal.azure.com))で、コンソールを開くボタンが！

![image](https://qiita-image-store.s3.amazonaws.com/0/120192/07d2c6b8-33e1-37a8-0022-2410a4c22e6a.png)

Build2017で公開されましたね。

(参考)
[Sneak peek: A new Azure Cloud Console](https://azure.microsoft.com/en-us/blog/sneak-peek-a-new-azure-cloud-console/)
[Get early access to the newest Azure portal features](https://azure.microsoft.com/en-us/updates/get-early-access-to-new-portal-features-2/)

動画ではコンソールのDocker環境でVMを作ったり、git使ったりしてるね。
Resque::Server を使おうとしたら LoadError: cannot load such file -- rack/showexceptions とか言われる件

## TL;DR

Resque 自体の問題ではなく、依存している Sinatra の問題だった。
`Gemfile` に以下を加えると良い。
ただし、正式リリースではないので注意。

```rb
gem 'sinatra', '~> 2.0.0.rc2'
```

## 背景

Rails (5.0.2) で Resque::Server を使おうと Gemfile に以下を加えた。

```rb
gem 'resque', require: 'resque/server'
```

その状態で `./bin/setup` をすると以下のようなエラーが。

```
$ ./bin/setup
== Installing dependencies ==
The Gemfile's dependencies are satisfied

== Preparing database ==
rails aborted!
LoadError: cannot load such file -- rack/showexceptions
/Users/yuya/src/github.com/yuya-takeyama/resque-test/config/application.rb:7:in `<top (required)>'
/Users/yuya/src/github.com/yuya-takeyama/resque-test/Rakefile:4:in `require_relative'
/Users/yuya/src/github.com/yuya-takeyama/resque-test/Rakefile:4:in `<top (required)>'
/Users/yuya/src/github.com/yuya-takeyama/resque-test/bin/rails:9:in `require'
/Users/yuya/src/github.com/yuya-takeyama/resque-test/bin/rails:9:in `<top (required)>'
/Users/yuya/src/github.com/yuya-takeyama/resque-test/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
(See full trace by running task with --trace)

== Command ["bin/rails db:setup"] failed ==
```

`rack/showexceptions` を読み込もうとしてエラーになるらしい。

どこで読み込もうとしているのか調べたら `Resque::Server` が依存する `Sinatra` だった。
`Gemfile.lock` を確認するとバージョンは `1.0` だった。

さらに調べてみると以下の Sinatra の issue にたどり着く。

[Incorrect rack requirement for showexceptions file](https://github.com/sinatra/sinatra/issues/1055)

どうも Rack 2.0 以降は `rack/showexceptions` が `rack/show_exceptions` にリネームされているらしい。

Sinatra 2.0 以降はこの変更に追従しているものの、未だ正式リリースはされていないため、特に指定がなければ `1.0` がインストールされてしまい問題になる。
SQLのMINUS演算子を使って、2つのテーブル間のデータを一致化する方法

# 概要

同一構造のテーブルが２個あり、一方のテーブルへの更新を他方のテーブルへも反映したい。そんな時に使えそう。

# 前提条件

* 同一構造のテーブル TBL_A, TBL_B があり、主キーが KEY1, KEY2 とする。

* TBL_Aに対して書き込み（INSERT, UPDATE, DELETE）があり、それをTBL_Bへ反映する想定。

* 全レコード削除＆全レコード挿入、というワイルドなことはしたくない。

* KEY1, KEY2が同じで、それ以外の列が更新されている場合にも対応すること。

# TBL_B にあって TBL_A にない行を削除

以下のSQLを実行すると、TBL_Bにのみ存在する行を抽出し、TBL_Bから削除する。
TBL_AとTBL_Bで完全に一致する行以外をMINUS演算子が抽出するので、KEY1, KEY2が同じでそれ以外の列が違う値の場合も削除される。

```sql
delete from TBL_B where (KEY1, KEY2) in (
  select KEY1, KEY2 from (
    select * from TBL_B
      MINUS
    select * from TBL_A
  )
);
```

この時点で、TBL_BにはTBL_Aに存在する行（内容が完全に一致する行）が残っている。

# TBL_A にあって TBL_B にない行を挿入

以下のSQLを実行すると、TBL_Aにのみ存在する行を抽出し、TBL_Bに挿入する。

```sql
insert into TBL_B (
  select * from TBL_A
    MINUS
  select * from TBL_B
);
```

# 使ってみた感想

主キー以外の列を * で指定できるので、列数が多いテーブルのときに楽（笑）

2個のテーブルが異なるDBインスタンスの場合、データベースリンクやシノニムを使って両方のテーブルを同時に操作できるようにしておく。

実行速度はレコード数によって変わってくるはずなので、本番環境に近い状態で試してみないと何とも言えない。

以上。
ElasticCache典型的な利用構成

AWSのElasticCacheに関する基本的な内容をまとめてみたものです。ElasticCacheに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[ElasticCache 典型的な利用構成] (https://www.techcrowd.jp/elasticcache/configurations/)

# [Stateシェアリングパターン] (https://www.techcrowd.jp/elasticcache/configurations/)

ロードバランサーを使って複数のWebサーバーやAPサーバーを動かしている場合は、障害発生時にステート情報が消失してしまうことがある。
このようなステート情報の消失を防ぐためには、個々のサーバーに情報を格納するのではなく、共有のデータストアにステート情報を持たせるState Sharingパターンが有効です。

AWSではElasticCacheを使って、ステート情報を保持することができます。
個々のサーバーに障害が起きても、ElasticCacheにあるステート情報を参照すれば、正常な状態に復帰することが可能です。


# [DB Cacheパターン] (https://www.techcrowd.jp/elasticcache/configurations/)

データベースのパフォーマンス悪化の原因は、ほとんどがデータの読み込みに関することです。
そのため、使用頻度の高いデータをメモリにキャッシュして、ディスクへのアクセス数を減らすことで、データベースの読み込み負荷を軽減できます。
このメモリにキャッシュを利用して、データベースのパフォーマンスを向上させる方法をDB Cacheパターンと呼びますが、AWSではElasticCacheを利用して実現することが可能です。

ElasticCacheは障害対策も施されていますので、効率的が良く障害に強いデータベースを構築できます。


# [ElasticCacheのMulti-AZを構成] (https://www.techcrowd.jp/elasticcache/configurations/)

・ElasticCacheのMulti-AZの内容

ElasticCacheには複数のAZ(アベイラビリティゾーン)を使って、障害に対応する機能が備わっています。
キャッシュノードの障害を検知する機能と、プライマリーノードの自動フェイルオーバーを行う機能がありますので、障害が発生しても手動で操作する必要がありません。
ElasticCacheが障害を検知すると、自動的に対応します。
ただし、ElastiCacheでmemcachedを利用する場合は、ノード間のレプリケーションが使えないためにMulti-AZが使えません。

・ElasticCacheのMulti-AZの料金

レプリカノードがフェイルオーバー先のノードとなるためMulti-AZを利用するためには、1ノード構成にかかる費用の2倍以上の費用が必要となります。