OmniAICreator/Qiita-1.07M huggingface dataset:
Google Cloud SQL for PostgreSQLの技術制約などをまとめた

## 本記事の目的
- 導入検討における調査作業備忘のため
- GCPでPostgreSQLを使おうと考えている方、特にGoogle Cloud SQL for PostgreSQLの導入を検討している方への知識の横展開のため

## Google Cloud SQL for PostgreSQLとは
- Google Cloud SQL for PostgreSQL(以下、Cloud SQLと表記)は、Google Cloud Platform(GCP)の提供するフルマネージドのPostgreSQLサービス
    - 公式サイト
        - https://cloud.google.com/sql/?hl=ja
    - フルマネージドのサービスとは
        - Cloudサービスにおいて、Cloudベンダーによってサービスより下層のシステムレイヤーが保守・運用されるサービス、ということ。本サービスの場合は、PostgreSQLのSWレイヤー以下（OS、Hypervisor、HW、NW、DCなど）がGoogleによって管理される
        - DC配置(AZ配置)や、OS設定などの下層レイヤーの管理可否はCloudベンダーのSLAに委ねられるが、大抵、ベンダーが用意する管理用のGUIによってある程度の管理ができるようになっている。本サービスでもGCPコンソールにて管理用のGUIが用意されている

## 一般的なマネージドRDBサービスのメリットとデメリット
- メリット
    - インスタンスの構築〜DBMSの導入までの作業が不要
    - 保守・運用がGUI経由で行えるため簡素化される
    - Cloudベンダーの定めるベストプラクティスのDB設定が適用される
- デメリット
    - VMインスタンスをオーダーしPostgreSQLを手動で導入＆保守運用する場合に比べるとコストはかかる（ただし手動での導入＆保守運用にかかる人件費などの費用は考慮していないのでそこがポイントとなる）
    - データサイズが大きくなるとコストメリットが得づらくなる
        - データサイズ、およびコストを試算する
            - （参考）コスト試算のためのツール：Google Cloud Platform Pricing Calculator
                - https://cloud.google.com/products/calculator/
        - NoSQLやBigQueryなども選択肢に入れ、本当にRDBが必要か検討する
    - チューニング項目が限られているため、パフォーマンスチューニングなどの対応範囲が限られる

## Google Cloud SQL for PostgreSQLの利用イメージ
- サービスのオーダーはGCPコンソールから行う。（要GCPアカウント）
    - GCPアカウント取得手順、GCPコンソールログイン手順は割愛
- オーダー時には、使用するリソースタイプ（インスタンスタイプ、ストレージサイズなど）やネットワーク設定、セキュリティ設定などを指定する
    - 設定によって、パブリックIPかプライベートIP、またはその両方がアタッチされる
    - DBの定期バックアップ、リードレプリカ（ReadAccessの負荷分散用）の利用可否設定もできる
    - 通信データや、保管データの暗号化実施有無も設定可能
    - SSLは独自サーバー証明書が利用可能
- オーダーすると、ミドルウェアの導入された状態のVMインスタンスがデプロイされ、インターフェース情報（IPアドレス、ポート、DB、DBユーザー、PWなど）がGUI上から閲覧可能となる。
- オーダー後は、GCPの提供するGUIから保守・運用する

## Google Cloud SQL for PostgreSQLの技術制約
- ネットワーク設定制約
    - プライベートIPはBeta版であり、今後仕様変更の可能性があるため注意が必要
        - パブリックIPを利用する場合は、以下のような方法でセキュリティを担保する必要がある
            - 接続元IPレンジを指定した接続許可
            - IAM認証と連携したユーザー制限
            - Cloud SQL Proxy Clientを活用した利用制限
                - Cloud SQL Proxy Clientを利用する場合はコンポーネントが増えるので注意
- PostgreSQLバージョン制約
    - デプロイ時にはPostgreSQLのメジャーバージョンを指定するが、選択肢が限られる
    - 2018/11/3時点での最新は9.6、それ以降（10.xなど）は利用不可
    - 構築時にはマイナーバージョンの指定は不可
    - 構築後のマイナーバージョンアップデートは適用タイミングを制御可能（自動アップデートも可）
    - メジャーバージョンのアップグレードは手作業によるデータエクスポート、インポートが必要
- チューニング項目の制約
    - チューニングに関係する設定項目は限られる
        - マシンタイプ（vCPU、メモリ）はオーダー後に変更可能
        - ディスクタイプ（SSD、Magneticなど）はオーダー後の変更不可
        - DBMS CLI（psqlコマンド）の範囲での設定変更は可能
            - インデックスを貼るなど
                - パーティショニングはバージョン制約により利用できない
        - `postgresql.conf` の設定内容は変更できない
ViveFocus+Unity

#ViveFocusとは
ViveFocusはスタンドアロンで動作するVRHMDです。
PC等の機器を必要とせず単体で動かす事が可能になっています。

中国では先行して販売されていたのですが、先日国内でも販売されました。
[ViveFocus](https://enterprise.vive.com/jp/vivefocus/)
公式では法人向けにしか販売していないのですが[こちら](http://www.akiba-eshop.jp/shopdetail/000000007823/)から個人でも購入出来るようです。

## 特徴

既にOculusGoやMirageSoloなどのスタンドアロン型のHMDが出ており、性能や機能も大体似たような物になっています。
スタンドアロン機種ごとの特徴をまとめてみました。

|          |トラッキング|モーションコントローラ|シースルー(カメラ画像の表示)|値段(税込み)|CPU|
|:--------:|:--:|:--:|:--:|:--:|:--------------:|
|ViveFocus| 6DoF | 3DoF|白黒|72090円|Snapdragon 835|
|ViveFocusPlus| 6DoF | 6DoF*2(超音波)|白黒||Snapdragon 835|
|MirageSolor| 6DoF | 3DoF|o(白黒？)|48,660円|Snapdragon 835|
|OculusGo| 3DoF | 3DoF |x|23,800円(送料込み)|Snapdragon 821|
|OculusQuest| 6DoF | 6DoF*2 |輪郭|399ドル|Snapdragon 835?|

OculusQuestは最後発というのもあり全ての機能が揃っているようです。
またOculusGoは機能を絞ることで廉価に抑えられています。
MirageSoloがアップデートでシースルーが使えるようになったようです。動画を見ている限りリフレッシュレートもそれなりに出ています。

## セットアップ

https://qiita.com/Hirai0827/items/8cf92ea9ea42b62e178e
上記の記事ではUnity5.6.3かUnity2017でしか動かないとの事ですが、現在の[WaveSDK-2.1.0](https://hub.vive.com/en-US/profile/material-download)では[Unity2018.1までサポートされている](https://community.viveport.com/t5/Vive-Wave-SDK/Unity-2018-2-support/td-p/23508?__woopraid=QWlga5oMnXrt
)ようです。
ですのでAndroidSDKだけ必要なバージョンを入れれば通常のAndroidのアプリとしてビルドするだけでも動作しました。

具体的にどのバージョンを入れたら良いのか分かってませんが、自分が動作確認した時に追加したのはAPIレベル28と26でした。

# Unity2018.2.x対応

2018年10月末までには2018.2にも対応するとの事なのですが、今の所更新はありません。
現在のWaveSDK-2.1.0でもUnity2018.2.xでも動作はしますが、アプリ起動時に画面が真っ黒になります。
一旦HMDを外してスリープさせてHMDを被るとアプリが正常に動作します。

## 黒い画面が出る
上記の症状ですが、WaveVR_Render.csのOnApplicationPauseメソッドの中身をPause()としてくくり出してpublicにしてアプリケーションの起動時に無理やりPause(true)/Pause(false)を呼び出すことで解決出来るようです。
https://community.viveport.com/t5/Vive-Wave-SDK/Getting-around-the-black-screen-on-WaveSDK-2-1-0-on-Unity-2018-2/td-p/25092?__woopraid=QWlga5oMnXrt

外から呼び出さなくても
WaveVR_Render.Start内部でPause(true)/Pause(false)と呼べば解決しました。
Pause(true)とPause(false)を同一フレームで呼び出すと問題があるようなので以下のようにすることで解決しました。

```cs:WaveVR_Render.cs
    IEnumerator Start()
    {
        Log.d(LOG_TAG, "Start()+");
        var camera = GetComponent<Camera>();
        camera.cullingMask = CameraGaze ? camera.cullingMask : 0;
        camera.backgroundColor = Color.black;
        camera.clearFlags = CameraClearFlags.Nothing;
        // Camera.main need this camera to enabled
        camera.enabled = true;
        camera.rect = new Rect (0.5f - 0.01f, 0.5f - 0.01f, 0.02f, 0.02f);
        camera.tag = "MainCamera";

        WaveVR_Render.Expand(this);
        configurationChanged = false;
        Log.d(LOG_TAG, "Start()-");
		yield return null;
		Pause(true);
		yield return null;
		Pause(false);
		yield return null;
	}
```
これでOculusQuestが出るまではFocusで我慢出来るようになりますね。良かった。

カメラの画像も白黒かつ20fpsくらいでよければWaveVR_CameraTextureで取れるようですし、頑張って深度値を計算すればARも実現可能です（めちゃくちゃ重たいですが）。

Let's ViveFocus!
JSONのdiffを取る簡単なシェルスクリプト

JSONのdiffを取るために、簡単なシェルスクリプトを書いた。
node.jsで引数のjsonを出力形式を整えてdiffに渡してる。
外部モジュールのインストール不要なのがメリット。

macOS High Sierraとmojaveで動作確認したがnode.jsとshellが動けば動くと思われる。
なお、引数のファイルパスは拡張子を.json(大文字でもOK)にする必要があります。

参考：https://qiita.com/bsdhack/items/55d5eced2fb3e6625d74


```jsondiff.sh
#!/bin/sh

if [ $# -ne 2 ]; then
  echo "Usage:"
  echo "./jsondiff.sh a.json b.json"
  exit 1
fi

node -e "console.log(JSON.stringify(require('$1'),null,2))" | (node -e "console.log(JSON.stringify(require('$2'),null,2))" | diff -U 3 /dev/fd/3 -) 3<&0 
```

## 使い方
```
$ ./jsondiff.sh jsonのパス1 jsonのパス2
```
Visual Studio Code で pylint のメッセージを抑制する

Visual Studio Code、軽くてデバッグ機能が充実しています。PEP8、美しいです。
pylint、私の汚いコードをびしびし指導してくれます。でもメッセージの量が多すぎだ。

### pylint のメッセージを抑制するための設定ファイル
pylint のメッセージを抑制するには、設定ファイル "settings.json" の "python.linting.pylintArgs" セクションを編集します。
Visual Studio Code のメニューからたどる場合は、"ファイル"-"基本設定"-"設定" で Settings タブを開き、右上の "..."-"settings.jsonを開く" でエディタを開いて設定をしていきます。
settings.json は、

    {"設定名1": 設定内容1,
     "設定名2": 設定内容2,

     "設定名n": 設定内容n }
という書式で書かれているので、このファイルの適当な場所に、
    "python.linting.pylintArgs": [*設定内容*],
というセクションを追加して設定を記述していきます。
ctrl+s でファイルを保存したら、Visual Studio Codeを再起動することなく設定が反映されます。

### 乱暴なメッセージ抑制方法

    "python.linting.pylintArgs": ["--disable=Exxxx,Wyyyy"],
Exxxx とか Wyyyy とかいうメッセージは気に入らん！ 俺は俺のスタイルで書くんだ！ という場合、上のように書けばそのメッセージは金輪際出なくなります。カギカッコの部分は["--disable","Exxxx,Wyyyy"] と書いてもOKです。

### メッセージ抑制方法　ケーススタディ
#### インデントの警告
    "python.linting.pylintArgs":["--indent-string=\"  \"", "--indent-after-paren=\"  \""],
インデントをどう書くかは、しばしば宗教論争を引き起こします。pylint はスペース4個以外のインデントを異端とみなして警告 W0311 を発生させますが、上のような設定を書くとインデントはスペース2個派に改宗します。
"--indent-string=\" &nbsp;\"" はインデントはスペース2個だという意味、"--indent-after-paren=\" &nbsp;\"" は改行を含むカッコの中でもインデントのスペースが2個だという意味です。\" &nbsp;\" を \t とすればタブがインデントだとみなされます。
["--disable=W0311"] と書いてインデントの記法に関する警告を出さないようにもできますが、それはスペース3個派や1個派のような邪教徒を容認することになります。
　
#### E1101 エラー
    "python.linting.pylintArgs": ["--extension-pkg-whitelist=numpy"],
E1101 は、オブジェクトにそのようなメンバーはないよ、というエラーです。
動的に変数にオブジェクトを割り当てる場合、変数がどのようなメンバーを持つのかはpylintは判らないのでE1101を出します。しかし、pythonでは変数に動的にオブジェクトを割り当てるのは当たり前なのでメッセージが山ほど出ます。上のようにエラーメッセージを出したくないライブラリ(ここではnumpy) を--extension-pkg-whitelist に指定すると、numpyオブジェクトにそんなメンバーはないよ、というエラーを動的な変数に対して出さなくなります。numpyオブジェクトであることが明確な所では正しくE1101エラーを発生させます。
　

    "python.linting.pylintArgs": ["--generated-members=torch.*"],
pytorch というライブラリは恐らくpytorch側の問題によって不適切なE1101エラーを発生させます(バージョン0.4.1)。上のように書くと メンバーのチェックをしなくなるので、torchに対しては一切のE1101エラーが発生しなくなります。

#### W0612 警告
    "python.linting.pylintArgs": ["--dummy-variables-rgx","^_$|^dummy$|^tmp.*$"],
W0612 は、変数が未使用だよ、という警告です。
あえて未使用の変数を使うシチュエーションは時々あると思います。例えば count 回のループを次のように書くと、変数 i が使われていないとして W0612 が発生します。
    
    for i in range(count):
      何らかの処理、でも変数 i は使わない
pylint ではこのような場合、変数に i ではなく、 _ (アンダースコア) もしくは dummy を使えば警告を出しません。
しかし、諸般の事情で未使用変数にこれ以外の名前をつけたい場合は、上のように --dummy-variables-rgx に許可する未使用変数名を正規表現で与えれば W0612 を抑制できます。上は _, dummy に加えて tmp で始まる変数名を、許可する未使用変数名に追加する例です。


### 複数の設定の記述方法

    "python.linting.pylintArgs": [
        "--disable","W0621,C0111,C0103",
        "--indent-string=\"  \"",
        "--indent-after-paren=\"  \"",
        "--extension-pkg-whitelist", "numpy",
        "--generated-members","torch.*"
    ],

私は上のように設定を書いてます
Raspberry Pi で Full HD 動画を再生してみたメモ

#はじめに

展示会で動画再生する際、ＰＣを置く場所が無さそうだったので、余っていた RasPi に再生させることにしました。
結果的に成功しまして、本文書はそのセットアップ手順のメモです。


#概略

##諸元あれこれ

###Raspberry Pi モデル
Raspberry Pi 3 Model B

###SD Card
8G ※刺さってたヤツ、転送速度不明さーせん

###OS
Ubuntu MATE 16.04.2 armhf

###動画
MP4 H.264 30fps 3067kbps
音声なし

###プレーヤ
omxplayer


##ざっくり手順

- OS イメージ書き込み
- Ubuntu セットアップ
- GUI モードをオフ
- 画面サイズ設定
- 再生


#手順詳細

##Ubuntu MATE セットアップ

###イメージを SD Card 上に作成

作業は Linux PC で実施しました。

まず下記よりイメージをダウンロードして展開します。
https://ubuntu-mate.org/raspberry-pi/

すごい、ピッタリ 5GB (5 * 1000^3) です。`dd` で書き込みます。

```
-rw-rw-r-- 1 ubuntu ubuntu 5000000000 Nov  1 00:34 ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img
```

###初回セットアップ

Ubuntu MATE 16.04.2 は初回ブート時に自身で roofs サイズを拡張する機能があるそうです。いたれりつくせりですね。
（今回それに気付かず手動で拡張しました。あーあ。まぁ毒にはならないでしょう。）

その他、初回セットアップで、言語設定とかユーザー作成とか出来ます。

###GUI モードのオフ

Ubuntu MATE イメージを使っていますが自動で MATE が動かないようにします（グラフィカルログインを止めます）。
`omxplayer` には MATE (X Window) が要らないのです。

`raspi-config` でテキストログインモードに切り替えます。

###画面モードを Full HD に

Raspberry Pi は 8bit PC 的というかノスタルジックな要素が残っていて、デフォルトではオーバースキャン表示になっているようです。強制的に Full HD でドットバイドット表示されるように設定します。

```:/boot/config.txt
disable_overscan=1
hdmi_force_hotplug=1
hdmi_group=1
hdmi_mode=16
```

パラメータはドキュメントに掲載されています。
https://www.raspberrypi.org/documentation/configuration/config-txt/video.md

試していないんですが、もしかしたら下記の方が画質調整がしっくりくるかもしれません。

```:/boot/config.txt
disable_overscan=1
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=82
hdmi_pixel_encoding=2
```

###リブート

再起動します。


##再生

一般ユーザーでログインして `omxplayer` で動画を再生します。
単一動画を無限ループ再生する場合は下記のようになります。

```
$ omxplayer --loop --no-osd filename.mp4
```

ループ再生時、先頭に戻る時にメッセージが表示されます。この辺は `VLC` と同じですね。望む動作ではないので `--no-osd` で非表示にします。


#おわりに

最初は Ubuntu 18.04 Server に MATE Desktop さらに `omxplayer` を追加しようとしていたのです。やってみて Bionic リポジトリに `omxplayer` が入っていないと判明、更に Ubuntu 16.04 MATE でやってみて `omxplayer` には X が不要だと判明。

また途中で `VLC` でもやってみました。`VLC` で快適に再生されるなら、そのほうがＰＣとして応用が利きます。というか当初は `omxplayer` を知らなかったんですがｗ　結果としては残念ながら満足な再生品質ではなかったので、アクセラレーションの効く再生アプリを探して `omxplayer` に行き着き・・・

最終的には快適な再生環境が得られました。設置面積は液晶ディスプレイ１台分です♪
E: パッケージ libcudnn7-dev を再インストールする必要がありますが、そのためのアーカイブを見つけることができませんでした対処

## E: パッケージ libcudnn7-dev を再インストールする必要がありますが、そのためのアーカイブを見つけることができませんでした

久々にGPUを積んだUbuntu16.04でupgradeしたら以下のようなエラーが出てきた。。。

```
$ sudo apt upgrade -y
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
E: パッケージ libcudnn7-dev を再インストールする必要がありますが、そのためのアーカイブを見つけることができませんでした
```

なんじゃらほい？と思っていたら、libcudnn7のバージョンが低かったようです。
どうやってチェックしたかを忘れてしまったのですが、以下みたいになっているんじゃないですかね？

```
$ sudo apt list --installed | grep cudnn

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

libcudnn7/不明,now 7.0.5.15-1+cuda9.0 amd64 [インストール済み、7.3.1.20-1+cuda10.0 にアップグレード可]
libcudnn7-dev/不明,now 7.0.5.15-1+cuda9.0 amd64 [インストール済み、7.3.1.20-1+cuda10.0 にアップグレード可]
libcudnn7-doc/now 7.1.4.18-1
```

バージョンが低ければバージョンの高いものを入れればいいのです。

## cuDNNの再インストール

というわけで、現在(2018/11/02)の最新の`cuDNN v7.3.1 (Sept 28, 2018), for CUDA 9.0`を入れたいと思います。([cuDNN Download | NVIDIA Developer](https://developer.nvidia.com/rdp/cudnn-download))
※CUDA9.0がすでに入っていることを前提にしています

入れ方がわからない人は以下のコードをパクってください。

まず以下の３つを[cuDNN Download | NVIDIA Developer](https://developer.nvidia.com/rdp/cudnn-download)からダウンロードします。

- cuDNN v7.3.1 Runtime Library for Ubuntu16.04 (Deb) (libcudnn7-dev_7.3.1.20-1+cuda9.0_amd64.deb)
- cuDNN v7.3.1 Developer Library for Ubuntu16.04 (Deb) (libcudnn7-doc_7.3.1.20-1+cuda9.0_amd64.deb)
- cuDNN v7.3.1 Code Samples and User Guide for Ubuntu16.04 (Deb) (libcudnn7_7.3.1.20-1+cuda9.0_amd64.deb)

ダウンロードしたディレクトリで以下の３行をこの順番で実行です。

```
$ sudo dpkg -i libcudnn7_7.3.1.20-1+cuda9.0_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.3.1.20-1+cuda9.0_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.3.1.20-1+cuda9.0_amd64.deb
```

そして最後に

```
$ sudo apt upgrade -y
```

うまくupgradeされました。

## 最後に
よければいいねください(@'ω'@)
未経験者は語るenebularとは何か

# 1. はじめに

---

## 参考文献
今回の『未経験者は語るenebularとは何か』は、以下のサイトを参考にenebular未経験者がenebularとは何か考え、まとめてみたものとなります。
本スライドには、未経験者なりの勘違いが含まれているかもしれません。、ベテランの皆さまは『あー初心者かんちがいあるあるやー。』と、お気付きの点がございましたら、コメント欄にて、ご指導、ご鞭撻のほど、よろしくお願い申し上げます。

- [Node-REDをビジネスで使い倒してenebularを作った話](https://www.slideshare.net/joeartsea/noderedenebular)

---

## このスライドを見てできること
- enebularとは何なのか、理解できるようになる。

---

# 2. enebularとは

---

## 2-1. Node-REDなのか？説

- おそらく多くの未経験者が感じる、enebularとは『Node-RED』なのか？という疑問。
- Node-REDは、フロー図を駆使することであらゆるモノ（サーバ/クライアント/IoT/クラウド）をノンプログラミングの制御下に制することが可能です。
- サービス名が違うため、Node-RED ＝ enebular と断言するのは、早合点かと思われます。

---

## 2-2. Node-REDの問題点

- ノンプログラマーの期待の星であるNode-REDは、自身の強みである、あらゆるモノ（サーバ/クライアント/IoT/クラウド）を制御する力を有している一方、システム環境が『分散』してしまい、システム環境の管理がしづらくなる問題点を抱えていると思われます。

---

## 2-3. enebularとは

- 管理しづらいらい分散環境に陥ったシステムを救うべく登場するものこそ、『enebular』であると思われます。
- 『enebular』があればこれらの問題をうまく解決、『Deploy Flow』を用いることで、あらゆる分散状況の『Node-RED』を一瞬のうちに掌握下に制することができるのです。
- 『 <font color="Red">**enebularとは、分散したNode-RED環境を管理するプラットホーム**</font>』なのです。

---

# 3. おわりに

---

## おわりに
みなさん、クリスマス前にすみません。お時間をとらせてしまいました。
『enebular』を導入・活用することで、みなさんの開発生産性が向上いたしますことを、心より願っております。
メリークリスマス！（Qiita Advent Calendar 2018）

2018/12/3 TAKAHIRO NISHIZONO
ロリポップからAWSへWordpressのサイトを移行してみる①

![AWS ロリポップ.png](https://qiita-image-store.s3.amazonaws.com/0/265573/c552c32e-3a79-780d-aad7-109aa8af79e8.png)

#ゴール

* ①ロリポップのDBの中身をRDSに移動
* ②ロリポップのFTPに置いてあるファイルをEC2のインスタンスに移動

____


###①でやるべきこと

⑴ロリポップのDBにログインしてdumpファイルを取得

⑵AWSのVPCの構築

⑶RDSを作成して設定を行う

⑷MysqlWorkbenchでdumpファイルをインポート
____



###②でやるべきこと

⑴ロリポップにFTPでアクセスしファイルを取得してローカルに保存

⑵EC2インスタンスを立てる

⑶ELBの設定

⑷Route53の設定
____


##前提条件

* AWSのアカウントを持っている

* MySQLWorkbenchがインストールされている




##①の実装

####⑴ロリポップのDBにログインしてdumpファイルを取得

ロリポップのデータベースにログインしてエクスポートを押してdumpファイルをローカルで取得(ex: hoge.sql)
____

####⑵VPCの設定

今回はデフォルト(AWS作成時に作られる)のVPCを使用します。


<img width="710" alt="aws簡略図.png" src="https://qiita-image-store.s3.amazonaws.com/0/265573/c17a06a3-725e-335d-f7ec-b3c2a86e683e.png">

#####フロー

* デフォルトVPCを確認

デフォルトVPCはAWSのVPCのコンソールのVPC一覧の中身の"デフォルトVPC"の欄で確認できます。
____

* プライベートサブネットを作成

VPCの作成時にパブリックのサブネットが作成されているので、プライベートのサブネットを作成していきます。

具体的にはデフォルトVPCでサブネットを作成します。
![nat-gateway簡略図.png](https://qiita-image-store.s3.amazonaws.com/0/265573/e705327f-74af-9c4e-064a-12d7665ef792.png)

このサブネットにはDBサーバーを配置します。

DBサーバーはインターネットからアクセスされたくないですが、 データ取得やデータ書き込みの際にEC2からのアクセスを許可して、インターネットへのアウトバウンドを行わなければならないのでここではNATゲートウェイを使います。

NATゲートウェイではパブリックサブネットとElastic IPを入力(割り当てるElastic IPがない場合は作成)して、プライベートサブネットからインターネットへの通信を可能にします。

Natゲートウェイを作成したらサブネットを作り、そのルートテーブルのターゲットにNatゲートウェイIDを追加します。

インターネットゲートウェイの作成は既にパブリックサブネットのルートテーブルに書かれているので必要ないです。
____



####[豆知識]

プライベートのサブネットとパブリックサブネットの違いはルートテーブルのルールにインターネットゲートウェイとの接続の有無で決まります。明示的な違いはないです。


####⑶RDSを作成して設定を行う

#####フロー

* サブネットグループを作成

DBインスタンスを配置するサブネットを指定します。

RDS作成時に指定することになるので先に作っておきましょう。
____

* セキュリティグループの作成

RDS用のセキュリティグループ を作成します。

今回はEC2からのアクセスしかないので、インバウンドをMySQL/Aurora 3306ポートに設定します。 
____

* RDSでデータベースを作成 

データベースを作成します。

エンジンはMySQLと互換性があるAuroraエンジンを選択し、マスタユーザー名、マスターパスワードを入力します。

パブリックアクセス可能はしたくないですがMySQLWorkbenchからのアクセスを簡略化するために一時的に、許可する設定にします。

これを許可していれば、EC2を踏み台にせずにMySQLにログインすることが可能です。
____

* MysqlWorkbenchでdumpファイルをインポート

フロー

* MySQLWorkbenchでRDSのDB(writer)とコネクトを始める

MySQLでDB名、マスターユーザ、マスターパスワードを入力してアクセスします。
____

* dumpファイルをエクスポート

エクスポートが終わったらRDSの設定でパブリックアクセスを無効にしましょう。

____

これで①の実装が終わりました。

次回は②(ロリポップのFTPに置いてあるファイルをEC2のインスタンスに移動)をやっていきます！
Raspberry Piをマウス・キーボード・ディスプレイなしで操作する(Mac)

# Raspberry Piを手元のPCで操作したいとき
・SSHで操作する
・VNCで操作する
の二通りが選択肢に入ってきます

ターミナルで操作するだけならsshで十分ですが、
グラフィカルなアプリケーションを利用したいときはVNCが便利です

それぞれの方法を具体的に書いていきます

# SSHでコマンド操作する
以下の手順で行います

1. Raspberry Pi側でSSHサーバの設定
2. Raspberry PiのIPアドレスを調べる
3. PCからSSHログイン

ちなみに、SSH(Secure Shell)だそうです
### SSHサーバーを起動する
```
#SSHサーバーの起動
$ sudo /etc/init.d/ssh start

#SSHサーバーの自動起動(再起動した際にSSHが自動で起動)を設定
$ sudo update-rc.d ssh defaults
```

###IPアドレスを調べる
Raspberry PiのIPアドレスを調べます


```
% ifconfig
```
inetの次にIPアドレスが表示されます
### sshログインする
piは初期設定されているユーザ名です

```
% slogin pi@***.***.***.***
```

# VNCでGUI操作する

VNC(Virtual Network Computing)でリモート接続するとデスクトップ環境が利用できます

### Raspberry PiにVNCサーバーを導入する

```
# TightVNCのインストール
$ sudo apt-get install tightvncserver

#VNCサーバーの設定
$ tightvncserver :1 -geometry 1280x800 -depth 24

# VNCサーバーを終了する
$ tightvncserver -kill :1
```
### PC側の設定
VNC Viewerのダウンロード
https://www.realvnc.com/en/connect/download/viewer/macos/

# まとめ

今回はRaspberry Piにリモートアクセスする二つの方法についてまとめました
手元のPCが使えるとやはり便利です
これからRaspberry Piで色々なことにチャレンジしていきたいと思います
オフラインリアルタイムどう書く E28 の問題

オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/81346 )を行っています。

問題は「増築の果ての隣室」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde28sqst/
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。

次回は 12/8(土) 
https://yhpg.doorkeeper.jp/events/82699
です。
Illustratorで変数を削除するスクリプト

Illstratorで変数をまとめ削除したくてスクリプトを組んだが、その際に詰まったことの備忘録。

# Illstratorで変数とは？
Illustratorはベクター画像を作るアプリだが、処理の自動化する機構も備わっている。
その代表的なものが「変数」機能で、特定のオブジェクトに対して動的にデータを書き換えることができる。（詳細は[ここ](https://helpx.adobe.com/jp/illustrator/using/data-driven-graphics-templates-variables.html)）。

# Illstratorをscriptで自動化
この機能は似たスタイルの画像を大量に作る際は非常に便利なのだが、そのまま相手に渡してしまうとマウス操作を少しミスるだけで大惨事になる。
なので、校正や納品をする際には変数データを削除した状態のファイルで渡したほうが確実である。
手で削除してもいいのだが、面倒だし、ほかの自動化スクリプトに組み込んでしまうのが一番楽だ。
スクリプトを組む場合は以下を参照。
[Adobe Illustrator CC Scripting Reference: JavaScript](https://www.adobe.com/content/dam/acom/en/devnet/illustrator/pdf/Illustrator_Scriptin_Reference_JavaScript_cc.pdf)


# 変数をscriptで操作しよう
変数のデータはvariablesクラスにまとめて格納されている。
そして、クラス内に各変数データがvariableオブジェクトとして保管されている。
各オブジェクトへのアクセスはindexを指定する。

```
activeDocument.variables[0]; //変数1のオブジェクトにアクセス
```

全要素を先頭から削除するfor文を書くと...

```
var variableObj = activeDocument.variables;
for (i=0; i<variableObj.length; i++){
    tmp = variableObj[i];
    tmp.remove();
}
```
これだと一個飛ばしで削除されて、半分の変数データが残ってしまう。


# variableオブジェクトはリスト構造で格納されている
C言語に慣れた身としてはindex指定するので配列のように操作してしまうが、リスト構造で格納されている。
一つ削除すると次要素へのポインタが更新されて、indexの数値が詰まる。なので、先頭から順次削除すると歯抜け状態になってしまう。

全要素をきれいに削除したい場合は後ろから削除していくのが吉。

```変数情報削除.js
try{
    removeVariables(activeDocument); //変数情報を削除
}
catch(someError){
    alert( "JavaScript error occurred. Message = " +someError.description)
}    

// 変数情報の削除
function removeVariables(docObj)
{
    var variableObj = docObj.variables;
    var tmp;
    //  variablesクラスのvariableオブジェクトはリスト構造で格納されているので
    //  variablesクラスの中にあるvariableオブジェクトを後ろから順に削除
    for (i=variableObj.length-1; i>=0; i--){
        tmp = variableObj[i];
        tmp.remove();
    }
}
```

調べてみると、元々JavaScriptでは配列の要素操作はリスト構造でやっているらしい。
てへぺろ☆(・ω<)
Bootstrapのグリッドシステムについて学んだ

## bootstrapのグリッドシステムとは？
### グリッドシステムとは
- 画面の横幅を12本のガイドライン（グリッド）に分ける 

### グリッドシステムのメリット
- レスポンシブデザインとの相性が良い
- 情報が整理されやすい

### グリッドシステムの要素
- container
    - 要素全体を囲むクラス。
    - containerの中にrow、colを格納する。
    - サイズが5段階ある。(詳細はリンク参照)
    - container-fluidは画面幅に応じて変化する

- row
    - 行を表すクラス。
    - rowの中にcolを記載する。

- col
    - 列を表すクラス。
    - colのあとに-（ハイフン）で文字列をつなぐことで、「この画面では、この個数のグリッド」ということを指定します。

### 参考記事
http://websae.net/twitter-bootstrap-grid-system-21060224/

## container-fluid・row・colでページを囲んでみる

### col-12で2つ囲んだパターン
- コード
 
```erb
## /views/big/new.html.erb
<div class="container-fluid">
    <div class="row">
        <div class="col-12">
            <h1>Bootstrap　使ってみた</h1>
        </div>
        <div class="col-12">
            <h1>Bootstrap　使ってみた</h1>
        </div>
    </div>
</div>
```

- 画面

![image.png](https://qiita-image-store.s3.amazonaws.com/0/310166/ecec98ab-5905-6016-5040-00b109c472ce.png)

### col-6で2つ囲んだパターン
- コード

```erb
<div class="container-fluid">
    <div class="row">
        <div class="col-6">
            <h1>Bootstrap　使ってみた</h1>
        </div>
        <div class="col-6">
            <h1>Bootstrap　使ってみた</h1>
        </div>
    </div>
</div>
```
- 画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/310166/ea1c58a8-e6aa-7bd5-f7a2-7a1a94a9c3b0.png)

### 解説
- col12 ✕ 2の場合、12をオーバーするため、自動で2行となる。
- col6 ✕ 2の場合、12以内のため、自動で1行となる
Android StudioをXMonad環境で起動する

XMonad(Awesome)上でAndroid Studioがうまく起動せず、以下のキャプチャ画像のようになって困っている人が対象です。
![2018-11-03-14:54:09-screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/304979/01578346-dd91-4872-0b32-d9a4cd78be5f.png)
・・・悲しいですね。

しかし何とか解決に至ることができたので、方法を共有します。


## 環境
この悲しい現象が起きてしまった環境は以下の通り。

- Gentoo Linux
- XMonad

## 原因
XMonadを使っていることのようです。

KDEやGNOMEなどのメジャーなウインドウマネージャ以外では、JavaのGUIアプリケーションが正常に動かないことがあるようで、Awesomeでも同様の現象が起きるとの噂もあります。

マイナーなWMを使うコア層に降りかかる災いのようです。~~「出る杭は打たれる」ということなのでしょうか~~

ちなみに、Gentooを使っていることはあまり関係なさそうです。
後にArchでも同様の問題に遭遇しました。


## 解決方法
wmnameというコマンドを使います。
入っていない場合は各ディストリビューションの方法でインストールしましょう。

Gentooの場合は

```:bash
emerge -av wmname
```

です。

コマンドが使えるようになったら、以下を実行。

```:bash
wmname LG3D
```

これでAndroid Studioが正常に起動するようになります。


![2018-11-03-15:52:30-screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/304979/e5247223-377f-c32d-3702-fb281d44c1e9.png)

うれしい！













## 補足
上の解決方法で無事に起動するようになるはずですが、ログアウトや再起動によって再び起動できなくなります。
また同じコマンドを入力すれば元に戻りますが、面倒なので、起動時に設定されるようにしておきましょう。


```haskell:xmonad.hs
import XMonad.Hooks.SetWMName

myStartupHook = do
   setWMName "LG3D"

main = do
   xmonad =<< ... myConfig

myConfig = def
   {
    ...
   ,startupHook        = myStartupHook
   ,...
   } `additionalKeysP` myKeysP
```
上記のようにstartupHookを使います。


[追記 2019-03-02]
JavaのGUIアプリケーションのために、[BorderWidthを1以上にする必要がある](https://stackoverflow.com/questions/41832881/java-gui-xmonad-not-working)ようです。私はボーダーなしが好みですが、nobordersやlessBorderを使いこなせなかったので、Android-Studioの健康を犠牲に、BorderWidthを0に設定しました。
面倒かつその場しのぎ的ですが、Android-Studioを一度フルスクリーンにトグルすると、正しく表示されるようになります。











## まとめ
Amazonセールで漫画が安く買えてうれしかった












## 参考ページ
- https://qiita.com/roberbnd/items/e205747cbf96bd65ee11
- https://www.xmisao.com/2014/03/31/awesome-java-gui-probrem.html
MySql2でソケットエラーというものが出たので、対処法まとめた

##普通にrailsでサーバーにアクセスしようとしたら、下記のようなエラーが出た。


```ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)```

何らかの理由でsocketファイルがなくなったことが原因のようだ。

##対処法

```$ sudo /etc/init.d/mysqld restart```

上記のコマンドで解消できた。

mysqlを再起動すると、/var/lib/mysql/mysql.sockが自動的に作成されるらしい。
1列のcsvファイルを列方向に連結する

1列のcsvファイルを列方向に連結します。
読み込んだままの1次元の形式では、concatenateさせると行方向の連結になるため、2次元に形式を変換してから処理をしてみました。
行数はそろえておく必要があります。


```ruby:qiita.rb

import os
import numpy as np

# n行1列のcsv同士を連結させる

data3 = np.genfromtxt("./csv/data_03.csv", delimiter=",", dtype='float')
data4 = np.genfromtxt("./csv/data_04.csv", delimiter=",", dtype='float')

print(data3)
print(data4)

# 今回読み込ませた csvは、10行1列のデータ。1次元で読み込まれる。
#data3
#[ 11.  21.  31.  41.  51.  61.  71.  81.  91. 101.]
#data4
#[ 101.  201.  301.  401.  501.  601.  701.  801.  901. 1001.]

data3_plus_data4_0 = np.concatenate([data3, data4], axis=0)

print(data3_plus_data4_0)

# axis=0 この場合、1次元のままなので、2n行1列になる。
# data3_plus_data4_0
#[  11.   21.   31.   41.   51.   61.   71.   81.   91.  101.  101.  201.
#  301.  401.  501.  601.  701.  801.  901. 1001.]

reshape_data3 = np.reshape(data3, (10, 1))  # 10行1列の2次元に変換
reshape_data4 = np.reshape(data4, (10, 1))  # 10行1列の2次元に変換

print(reshape_data3)
print(reshape_data4)

# 2次元に変換される。
#[[ 11.]
# [ 21.]
# [ 31.]
#  ...
# [ 81.]
# [ 91.]
# [101.]]

data3_plus_data4_1 = np.concatenate([reshape_data3, reshape_data4], axis=1)

print(data3_plus_data4_1)

# n行2列で連結
#[[  11.  101.]
# [  21.  201.]
# [  31.  301.]
#  ...
# [  81.  801.]
# [  91.  901.]
# [ 101. 1001.]]

# 結果をcsvファイルに出力
np.savetxt("./out/data3_plus_data4.csv", data3_plus_data4_1, delimiter=",")




```
メールのなりすましを防ぐSPFとDKIMについてまとめてみた

メールの送信には、SMTP（Simple Mail Transfer Protocol）というプロトコルが使われている。

そこで今回はSMTPに関する用語について整理し、またメールの偽装防止に使われているSPF、DKIMについてまとめてみる。

## エンベロープとヘッダ
メールにはヘッダFromとヘッダTo、エンベロープFromとエンベロープToがある。

**ヘッダFrom/Toは、メールクライアント側で表示されるアドレス**であり、**エンベロープFrom/Toは、実際に送受信を行う際に使われるアドレス**である。

例えばあなたの開発したアプリケーション（myapp.com）でメール送信機能があり、メールの送信にはAmazon SESを使うとする。
その際にはヘッダFromは「mail.myapp.com」のような好きなアドレスを指定できるが、エンベロープFrom/Toには「amazonses.com (またはそのサブドメイン) 」がAmazon SES側により指定される。

このように**ヘッダFromやエンベロープFromは送信者や転送者が好きなアドレスを自由に指定できる**ため、メール送信者の偽装防止の仕組みが必要になる。この仕組みにはSPFやDKIMがある。

## SPF（Sender Policy Framework）
https://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/

SPFとは、**メール送信元のIPアドレスを元に送信者を認証する**技術のことである。

このSPF認証の仕組みは、送信する側があらかじめ、メール送信元ドメインのDNSにメール送信側のIPアドレスを登録しておく（SPFレコード）。そして受信側は、DNSサーバーへ送信元のIPアドレスとメールアドレスドメインが登録されているかを確認し、正当性を確認する。
このSPFはIPアドレスの偽装は不可能だよね、という前提の元に策定されている。

## DKIM（Domainkeys Identified Mail）
http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/dkim/

DKIMとは、**電子署名を使って送信者を認証する**技術のことである。

送信側で電子メールに電子署名を付加し、受信側でその電子署名を照合するという方法で送信者のドメインの認証を行う。
電子署名は公開鍵暗号方式などを利用した署名である。（内容がそれるため今回は説明を省略）

## DMARC（Domain-based Message Authentication,Reporting and Conformance）
DMARCは、SPFとDKIMを使った認証方法に失敗した際の挙動を、ドメイン保持者が決めることのできる仕組みである。

これにより保持ドメインからの送信に関するレポートを受け取れたり、メールの認証失敗時の動作を柔軟に指定できる。
Pythonで競プロに挑む日誌 vol.16 ~要素が一種類のリストを作る~

# 現在の目標
* 2018年内に茶色になる**←イマココ**
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の A, B 問題を全部解く
* 2018年度内に緑色を取得する
* 水色になったら, [APG4b](https://beta.atcoder.jp/contests/apg4b) で C++ にも手を出す

# 今日のおはなし
### 結論
要素が一種類のリストは, for 文を使うことなくカンタンに作れる.

**解いた問題**
[B-編集](https://beta.atcoder.jp/contests/abc037/tasks/abc037_b)

**私の解答**

```my_answer.py
# coding: utf-8
N, Q = map(int, input().split())
an = [0 for _ in range(N)]
#print(an)
 
for _ in range(Q):
    l, r, t = map(int, input().split())
    l -= 1
    r -= 1
    for i in range(r-l+1):
        an[l + i] = t
 
for x in an:
    print(x)
```
**カンタンな方法**

```list_answer.py
# coding: utf-8
N, Q = map(int, input().split())
an = [0]*N    #<-ココと, 
 
for _ in range(Q):
    l, r, t = map(int, input().split())
    an[l-1:r] = [t]*(r-l+1)    #<- ココ
 
for x in an:
    print(x)
```
for 文や内包表記使わなくてもカンタンに作れるんですね.  基本は大事です.

**参考**
http://nekoyukimmm.hatenablog.com/entry/2016/02/26/091217
https://pycarnival.com/one_asterisk/


**追記**
この方法には, 下記のような罠がありました.  列が全部更新されてしまうようです.

```trap.py
a = [[0]*5]*3
print(a)    #-> [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
a[1][1]=1
print(a)    #-> [[0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0]]

```
【WEBエンジニアとASVS 零】

現在、「[ASVS](https://www.jpcert.or.jp/securecoding/materials-owaspasvs.html)」について勉強しております。
まず、ASVSとは

と、その前に！
「ASVS」を提唱している
# 「OWASP」について

> OWASPは【The Open Web Application Security Project】の略
> ウェブアプリケーションセキュリティをとりまく課題を解決することを目的とする、
> 国際的なオープンなコミュニティです。

「[OWASP TOP10](http://www.atmarkit.co.jp/ait/articles/1801/17/news013.html)」を聞いたことあるでしょうか？
それも提唱しているところです。
（ざっくりと）

# 「ASVS」について

> ASVSは【Application Security Verification Standard】の略
> アプリケーションセキュリティ検証標準という意味で、
> 様々なアプリケーションの設計、開発、脆弱性診断などにおいて
> 必要となるセキュリティ要件の標準を確立することを目指して活動しています。

分かりやすく言うと「アプリケーションのJISマーク」のような感じです。

ASVSでは各アプリケーション毎に満たすべき項目が変わっています。
段階としてレベル１～３まで。
そのなかでも**レベル１は「全てのアプリケーションが満たすべきもの」**
となっているため、アプリケーションを作るうえで必ずは押さえておきたい項目になります。

現在のバージョン（3.0.1）が以下のURLにすべて記載してあるので
「自分でアプリケーションを作ってみたい」「自分の現場はどれくらいの項目ができているんだろう」など
興味があれば見てみてください。
https://www.jpcert.or.jp/securecoding/OWASP_ASVS_20160623.pdf

これがある程度（というかレベル１はすべて）出来ていれば
後々に大きなインシデントを起こすようなアプリケーションは生まれることはないでしょう。
ただ、セキュリティについては「セキュリティの技術」「クラッカーの技術」がともに進歩しているので、
メンテナンスなどは必要になっていきます。
今の「ASVS 3.0.1」は2106/6/23が公開日となっているためかなり古いのかなと個人的には思っています。
（それでも見ておいて損はない）

そして、
 今回はその資料を個人的に見やすく作ってみたので共有します！
 「***我こそはWEBエンジニア也***」
とちょっとでも思った方は是非御覧ください。

  ▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽
  [ASVS 3.0.1まとめ - Google スプレッドシート](https://docs.google.com/spreadsheets/d/1wGC9sF2gZoHnGKJt2mIJrb_Cr0bqETl9r07s_YQFWK8/edit?usp=sharing)
  ▲△▲△▲△▲△▲△▲△▲△▲△▲△▲△▲△

  ※まだ資料が未完成の部分があったりなかったりなので
  思ったこと、もっとこうして欲しい
などの意見をお願いいたします！！
Vue.js童貞がネコ本読んで得たもの②

## はじめに
本稿はフロントエンド領域から逃げてきたバックエンドエンジニアが追い詰められて0から勉強した軌跡である。詳細は[前回](https://qiita.com/naotoshin72/items/6496d2f061bd6ce1ec3a)をご参照ください＾＾

### ネコ本とは？

みんな大好きMio様の名著「基礎から学ぶ Vue.js」です。
https://www.amazon.co.jp/dp/B07D9BYHMZ

## 童貞卒業までの道程
- （済）基本 
- （済）データバインディング、条件分岐、繰り返し
- ハンドラ、双方向バインディング
- 算出プロパティ // ←今日はここまで
- ウォッチャ、フィルタ
- コンポーネント、VueCLI、単一ファイルコンポーネント
- Vuex
- Vue Router

それでは道程卒業を目指してやっていきましょう。

## ハンドラ

ハンドラとは「イベントハンドラ」の略
クリックやタップ、スクロールなどのイベントに紐づいて実行される処理のことを指す
※イベントと処理（ハンドラ）を紐づけることを「ハンドル」と呼ぶらしい。分かりにくいですね。

ハンドラはVueインスタンスのmethodsオプション内に記載します。

```javascript
Vue.new({
  el: "#app",
  data: {
    message: "Hello Vue.js"
    count: 0
  },
  methods: {
    handleClick: function(){
      alert("clickButton!")
    } 
  }
})
```

イベントと紐づける場合は`v-on`か`@`を利用します。
どうでもいいですが、`v-〇〇`←これのことを「ディレクティブ」と呼ぶらしいですね。今後その表現に統一するようにします。

```html
<div id="app">
  // これで動く
  <button v-on:click="handleClick">クリックミー！</button>
  // これでも動く
  <button @click="handleClick">クリックミー！</button>
</div>
```

こうですね。クリックイベントに紐づけています。
対象となるイベントはDOMのイベントに依存するようです。つまりブラウザ依存ですね。

### 双方向バインディング

フォームで何かを入力する時に、描画している情報とリアクティブなデータが双方向に同期している必要がありますね。
`v-model`ディレクティブを使って双方向にバインディングしましょう。

```javascript
Vue.new({
  el: "#app",
  data: {
    message: "Hello View.js"
  }
})
```

上記のようなVueインスタンスが存在する場合

```html
<div id="app">
  <input type="text" v-model="message">
  <p>{{ message }}</p>
</div>
```

こうすると、フォームで入力した内容と描画している情報が双方向にバインディングされます。

`v-model`はデータバインディングだけでなく、イベントハンドリングをして入力値を元にデータを更新している。
**データバインディング**と**入力値を反映するイベントハンドリング**の2つを同時に行う。

大事なことなのでわざわざ２回書きました。これで忘れなさそうですね。

`v-model`でバインディングするデータの型はフォームのタイプと一致させなければならない。
（複数選択できるチェックボックスなら配列型にしなければならないとか）


##　算出プロパティ

算出してくれるプロパティ？笑
事前に処理を**名前付きで**記載しておくことで、可読性を上げることができそうです。

```javascript
Vue.new({
  el: "#app",
  data: {
    message: "hello"
  },
  computed: {
    fullMessage: function() {
      return this.message + "Vue.js"
    }
  }
})

```

上記のようなVueインスタンスが存在する場合

```html
<div id="app">
  <p>{{ message }}</p>
  <p>{{ fullMessage }}</p>
</div>
```

こうすることで、算出プロパティで処理された結果を表示できますね。

メソッドとの違いは、結果をキャッシュするところらしい。
キャッシュが更新されるのは関連するリアクティブデータが更新された時だけだとか。
つまり、上記の例で言えば、`message`というリアクティブデータが更新されなければ、ずっと結果をキャッシュしてくれるので、何度も使う場合は表示速度が向上しそうですね。

## おわりに
今日はここまで。
次回のウォッチャまで書いたらネコ本に記載の簡単なサンプルアプリでも実装するかなぁ( ˘ω˘ )
プログラムで出力したCSVファイルがExcelで正しく表示できないときの対応

プログラムでCSVファイルを出力し、Excelで見たときに、文字化けしたり、意図しないセル分割が行われたりして正しく表示されないことがあります。

#対応方法

Excelで表示されるフォーマットでCSV出力します。

### 文字コード、区切り文字

Excelに合った文字コード、区切り文字の組み合わせにします。

| 文字コード   | BOM     | 区切り文字   |
|:------------|:--------|:------------|
| UTF-8       | あり    | カンマ       |
| UTF-16      | あり    | タブ         |
| Shift_JIS   | なし    | カンマ       |

### エスケープ

エスケープを正しく行います。

| 文字    | エスケープ方法  |
|:--------|:--------------|
| ,       | 要素を""で囲む |
| "       | ""            |

エスケープの例）
前）
William,"Red",Garland
後）
"William,""Red"",Garland"

#C#でCSVファイルを出力する例

```csharp
    /* CSVに出力するリスト */
    var list = new List<string[]>();
    list.Add(new string[3] { "山田太郎", "やまだたろう", "Taro Yamada" });
    list.Add(new string[3] { "渡辺 \"レッド\" 花子", "わたなべ,れっど,はなこ", "Watanabe \"Red\" Hanako" });

    /* ファイルオープン (上書き、UTF-8、BOMあり) */
    var sw = new StreamWriter("test.csv", false, Encoding.GetEncoding("utf-8"));

    foreach (string[] valueArray in list)
    {
        var sb = new StringBuilder();
        foreach (string value in valueArray)
        {
            /* エスケープ処理 */
            string tmp = value.Replace("\"", "\"\"");
            sb.Append("\"");
            sb.Append(tmp);
            sb.Append("\"");

            /* カンマ区切り */
            sb.Append(",");
        
        }
        /* 余分なカンマを消してから書き込み */
        sb.Remove(sb.Length - 1, 1);
        sw.WriteLine(sb.ToString());

    }
    sw.Close();
```
【厳選】Python実務データ分析でよく使う手法（前処理編）

### はじめに
- データ分析実務で頻繁に利用するPythonのデータ分析手法まとめです
- ここでいう「実務」とは機械学習やソリューション開発ではなく、アドホックなデータ分析や機械学習の適用に向けた検証（いわゆるPoC）を指します
- 領域によっては頻繁に使う手法は異なるかと思うので、自分と近しい領域のデータ分析をしている方の参考になればと思います
- 今回は前処理でよく使うコードをまとめましたが、今後、データ集計編とデータ可視化編もまとめてみようと思います

---
### 前処理
#### Datetime型への変換：pd.to_datetime()
- pd.read_csvでデータを読み込むと日付がobject型となるので、datetime型へ変換する必要がある
- 日付データを入れると基本的に自動で年・月・日等を判断して変換してくれる
- 特殊なフォーマットの際はformat='%Y年%m月%d日 %H時%M分'といった形で指定する（なぜかmとdだけ小文字）

```python
data['Month'] = pd.to_datetime(data['Month'])
# pd.to_datetime(data['Month'], format='%Y-%m')
```
#### 数値データのカテゴリ化：pd.cut()
- 数値データからカテゴリデータ化に変換する（例：年齢を年代に変換）
- 数値データを入れて、bins=np.arange(0, 100, 10)でカテゴリのインターバルを指定する
- デフォルトだと右端がビンに含まれて、左端がビンに含まれないので、right=Falseとすると反転する
- 特に年齢を年代に変換する際は、right=Falseとしてないと、60才は50代になってしまうので注意が必要

```python
data['n_interval'] = pd.cut(data['n'], bins=np.arange(0, 1000, 10), right=False)
```
#### 定義した関数のデータフレームへの適用:Dataframe.apply()
- 定義した関数をデータフレームに適用して、データを変換する
- def~で処理用の関数を定義した後、Dataframe.apply(定義した関数)で処理する

```python
def trans(x):
    if x >= 300:
        return True
    elif x < 300:
        return False

data['n_tf'] = data['n'].apply(trans)
```
#### Bool型をint型（1/0）、float型(1.0/0.0)へ変換
- 掛け算をするだけで変換されます
- int型に変換する場合は *1、float型へ変換する場合は*1.0

```python
data['n_tf_int'] = data['n_tf']*1
data['n_tf_float'] = data['n_tf']* 1.0
```

#### フォルダ内のCSVデータを一括読込：globとpd.read_csv()
- 前処理かは微妙ですが、データ一式を複数csvファイルで受領した際に、一括して読み込む際の方法
- globモジュールを利用し、csvファイルを正規表現で指定し、pd.read_csvで読み込んだ後、pd.concatで結合

```python
import glob
files = glob.glob('*.csv')#フォルダ内のCSVファイルを取得
print(files)
```
['airline4.csv', 'airline3.csv', 'airline2.csv', 'airline.csv']

```python
# リストで取得したファイル名をfor文で一つづつ読込み、縦方向へ結合していく
df = pd.DataFrame()
for file in files:
    t = pd.read_csv(file)
    df = pd.concat([df, t], axis=0)#縦方向への結合なのでaxis=0を指定
```
---
### 最後に
- 実際のビジネスでデータ分析をす際によく使う手法をまとめてみました
- 今後、頻出するコードがあれば随時アップデートします
- 冒頭にも書いた通り、今後、集計編とデータ可視化編もまとめてみようと思います
- 他にもよく使う手法あればフィードバック頂けますと幸いです
GPSの研究　その49

#概要

gpsを理解したかった。
アグリナビで、遊んでみた。
arduinoで、gpsシュミレータ作って、動かしてみた。
アグリナビからは、serial　gpsに見える。
ヘッドアップしない。履歴消せない。

#写真

![DSC_00011.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/7701de28-f9d8-5511-d6ed-01d07241a66c.jpeg)

#動画

https://www.youtube.com/watch?v=ErDQsbuFV8s

以上。
zabbixのインストール方法

忘れそうなので、リンクをメモっておく。

なかなか探しても一発でたどり着けないので…。

[zabbix 公式の手順](https://www.zabbix.com/jp/download?zabbix=4.0&os_distribution=ubuntu&os_version=bionic&db=MySQL)

mysqlのInnoDBでやるのはあんまし良くないかもしれないっすね。
たしか自動で最適化とかしてくれなくて
DBがひたすら肥大化して…
昔苦しんだイメージがつよくて、改善されたのかもしれませんが…。
Eclipse 小技メモ

# デバックのとき
## 変数の値を変えたい
ブレークポイントを設定後、デバック起動しておく
### 変数
「ウィンドウ」⇒「ビューの表示」⇒「変数」
### 表示
「ウィンドウ」⇒「ビューの表示」⇒「表示」
Docker Tool BoxによるJupyter環境の作成 ～1.Windowsへの導入～

#目的
機械学習について勉強を始めてみたものの、実際にやってみないとわからない。
というわけで環境無しの状態からkaggle投稿に挑戦するまでをやってみたいと思う。

## 1.環境構築

新しいプログラミング言語とかを学ぼうとする際にまずハードルとなるのが、

**環境構築**

筆者自身も幾度となく挫折してきたので、この投稿が少しでもデータサイエンスを
志す人が増えるきっかけになればと思っている。

使うのはデータサイエンティストの必須アイテムである[jupyter-notebook](http://jupyter.org/)
※ジュパイターノートブックと読んだり、ジュピターノートブックと読んだり。どっちでも良いらしい

対話式のpython実行環境で、コードを書きつつ実行、結果確認、メモをMarkdownで記述するなど、
それがブラウザベースでできるのですごく便利。まずはこの環境を作ってみるところから
始めてみたいと思う。

ちなみに環境構築せずにjupyterのような対話式の分析環境を使いたい場合は以下のような
サービスがあるので、そちらから入ってみてもよいと思う

 - [Kaggle](https://www.kaggle.com/) ⇒Googleに近年買われたデータ分析のコンペティションサイト。kernelという機能を使うと上記のjupyterとほぼ同様のことができる。筆者はここで賞金獲得を目指すのが当面の目標
 - [google colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb)　⇒Googleが無料で開放しているjupyter的なサービス。
 
ちなみにどちらもGPUを使用することができるので、DeepLerningを試したい人には上記サービスがおすすめ

# 2.windowsでdocker環境を作る

## 前提

対象環境
Windows 10 home 64bit

Windows上にdockerを作ってそこからjupyterのイメージをコピーし、
それを起動するやり方を行いたいと思う。

jupyterをWindowsで使いたい場合は[annaconda](https://www.anaconda.com/)をインストール
すれば使えるのですが、dockerを使用しようと思った理由は以下の通り。

 - 自身のwindows環境を汚したくない⇒データ分析を行う上でpythonのライブラリとかを入れる機会がかなり多いので、競合とか発生してしまうと目も当てられないので
 - docker以降の手順はどんな環境でも応用が利く⇒仕事でLinuxサーバに建てる際の参考になるので。実際ここでまとめた手順はかなり活躍した
 
dockerの仕組みをわかっていないと嵌ってしまう落とし穴もありますが、
それについては別の記事で書きます
※筆者はdockerのライフサイクルを理解していなかったため分析用に作ったファイルが全て消し飛んだことが何回もありました泣


# 3.docker tool boxの導入

[docker for windows](https://docs.docker.com/docker-for-windows/)を使いたかったが、windows10  proしか対応していないということで断念。代わりに[docker tool box](https://docs.docker.com/toolbox/toolbox_install_windows/)を利用することとした

まずdockerを導入するうえでは下記のページを参考にした
https://qiita.com/idani/items/fb7681d79eeb48c05144

この記事だけで行けるかなと思っていたが、インストール後に`$ docker run hello-world`を実行したが、
↓のようなエラーが表示され、うまくいかない。

    C:\Program Files\Docker Toolbox\docker.exe: error during connect: Post http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.37/containers/create: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.
    See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.

# 4.Docker Toolboxでエラーが発生した際の対処
そのため、以下の記事を参照にした
[手順はこっち](https://qiita.com/Y-Kanoh/items/180e73c47970ea9bf5bc)

[原因とかはこちら](http://acchi-muite-hoi.hatenablog.com/entry/2016/04/26/223559)

## 4.1．Dockerマシンの再作成

docker tool boxのターミナル画面で以下を実施することで解消した

`$ docker-machine rm default`

`$ docker-machine create default --driver virtualbox`

windowsなのでDocker Toolboxがセットされているところを加味して環境変数を設定
`$ eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env default)`

これでなんとか環境設定まで完了することができた。docker起動とその準備は次の記事で書こうと思います
【Python】ツールを作ろうとしたらエラーが出たのでAnaconda+Pycharmで環境を再構築した話

#**◆経緯**
最近新しいタブレットが欲しいのだけど、新商品で手頃なのがなくて中古でどのくらいだろうという疑問から新しくツールを作ることにした。ヤフオクで落札されている相場がいくらかというのをピックアップするツールを作ることに。

そんなこんなでツールを作ってpyinstallerを使ってexeファイルを作ろうとするとなぜかエラーがでるΣ(ﾟдﾟlll)ｶﾞｰﾝ（開発環境では問題なく動作してるのに…）

#**◆経過**
こういうことは珍しいことではないので対応を調査することに。

出ているエラーは「**module not found matplotlib**」というもの。どうやら「**matplotlib**」というグラフ描画に使っているモジュールがないらしい。

ちゃんとプログラム上ではimportしてるんだけど、exeファイルを作る時に上手くいかないっぽい。結局理由は良く分からないがexeファイルを作る時にオプションで「**--hidden-import matplotlib**」をつけることで問題ないらしい。

意外とあっさり解決方法が見つかり、早速実行して終了だと意気込んでpyinstallerを実行したが結果は同じで「**module not found matplotlib**」が出る始末orz

何故だ！？

( ﾟдﾟ)ﾊｯ!

「**--hidden-import matplotlib**」じゃなくて実際importしている「**--hidden-import matplotlib.pyplot**」なのか？と考えたので変更して再実行。

が、やはり同じorz

この時点で既に数時間経過・・・

色々調べたが結局対応が分からず、次の日に

「もしかして、環境が古いのか、おかしいのかどっちかなのか？」と思い確認。

すると「Anaconda 3.6.3」、「Anaconda3.6.4」、「Python3.6.6」の3種類が同居している状況に「もしかしてこのせいか？？」と思い環境を再構築することに・・・

一旦、2種類のAnacondaとPython、開発環境のPycharmを全てアンインストールして１から再インストールすることに。

最新版のAnacondaとPycharmをダウンロードしてそれぞれインストール。この時点で半日以上経過ww

更に既に作っていたPycharmのプロジェクトも新しいのを作り直して、再びPyinstallerでexeファイルを作成・・・・・

やはり「module notfound matplotlib」は出るので「--hidden-import matplotlib.pyplot」で再度実行。

・

・

・

今度は違うエラーが発生「**UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 129: invalid start byte**」どうやらutf-8のエンコーディングが指定されていないっぽい。

あれ？他のツールを作ったときはそんなの必要なかった気がするぞ・・・まぁ必要らしいので先頭行に

```# coding: utf-8```
を追加。再々pyinstaller実行。

・

・

・

またエラー発生（そろそろ勘弁してww）

「**RuntimeError: maximum recursion depth exceeded while calling a Python**」

正確にこのメッセージだったか覚えていないがこんな感じのエラーが発生。

今回はpyinstaller実行時のspecファイルを修正

2行を先頭に追加

```import sys
sys.setrecursionlimit(5000)```
またpyinstallerを実行。

・

・

・

やっとエラーがなく処理終了(≧▽≦)

よし、動作確認だ！

キーワードを入力して、検索Go！！

・

・

・

あれ、なんだこれ、こんなメッセージはだしてないぞ、エラー！？

「**This application failed to start because it could not find or load the Qt platform plugin "windows" in "".**」

もういい、今日はこれで終わり！！(ノД`)・゜・。



次の日・・・

pluginがないとかなんとからしいがよくわからんのでググると

>とりあえず必要なdllをexeと同じフォルダに入れることで解決しました。
- \platformsをexeの入ったフォルダの/dist以下にコピーする。
- C:\Users\{YOUR_USERNAME}\Anaconda2\lib\site-packages\PyQt5内のlibEGL.dllを/dist以下にコピーする。

との事なのでコピーして、何度目か分からないpyinstaller実行。

問題なくexeファイルは出来たので検索Go！！

・

・

・

「検索　終了！！」

おし！やった。

正直、一難去ってまた一難、ぶっちゃけありえないって感じでしたww



#**◆結果**
完成したツールはこんな感じです。

検索キーワードと遡る日数を入れて検索するとヤフオクの落札履歴から該当する物のみを一覧表示させます。
該当件数、最高値、最安値、中央値、平均値、最頻値、各商品の詳細、ヒストグラム、折れ線グラフを出力します。
![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/307312/1e758ab4-754c-777d-8d9d-05c5e54361c2.jpeg)

ヒストグラム、折れ線グラフで金額帯での落札数と折れ線グラフで日時での落札額のグラフを表示し、落札時の参考になるはずw
![WS000020.JPG](https://qiita-image-store.s3.amazonaws.com/0/307312/e753fba4-c284-ed75-b34b-97f385eb2e06.jpeg)
商品の詳細をCSV出力出来るので、Excelで何かしようとする事も可能です！！

という事で「ツールを作ろうとしたらエラーが出たので環境を再構築した話」でした。

気になったらここで販売もしているので見てみてください。購入してもらえると感謝します。

 [ヤフオク落札履歴を抽出するツールが使えます 販売、落札したい商品の適正価格がいくらか事前に知りたい方に](https://coconala.com/services/656035)
周期を揃えてアイコンを点滅させる【Unity】【C#】

#背景
ソシャゲなどでよくある、キャラクター一覧画面でアイコンが点滅するやつを何も考えず実装しました。すると点滅周期が一致せず一工夫が必要でしたので、解決した方法を紹介します。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">アイコンの点滅周期を同期させるやつできた<br>Manager的なScriptを別途用意して、そこの値を変動させて全部それを参照してる。 <a href="https://t.co/b09oKWYp08">pic.twitter.com/b09oKWYp08</a></p>&mdash; アズマゴロ―@デジゲー博C-02a (@azumagoro) <a href="https://twitter.com/azumagoro/status/1058569725343522816?ref_src=twsrc%5Etfw">2018年11月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#概要
####点滅方法
CanvasGroup Componentのalphaの値を変更して点滅させます。
####用意するもの
・周期をクロッキングするためのComponentをEmptyなGameObjectにアタッチ。複数Sceneで使用するならGameManagerなどのManager系Scriptと一緒にしておくといいと思います。
・CanvasGroup.alphaを変動させるためのComponentを点滅させるGameObject分。

#コード

```C#:BlinkerClock.cs
using UnityEngine;

public class BlinkerClock : MonoBehaviour
{
    public static BlinkerClock Instance;
    //参照する値
    public float ClockingAlpha = 0;
    //変動する値
    float time = 0.0f;
    //設定する値
    [SerializeField] private float angularFrequency = 3.5f;

    private void Awake()
    {
        Instance = this;
    }

    void Update()
    {
        Blink();
    }

    void Blink()
    {
        time += angularFrequency * Time.deltaTime;
        ClockingAlpha = Mathf.Sin(time) * 0.5f + 0.5f;
    }
}
```
```C#:SynchronizedBlinker.cs
using UnityEngine;

public class SynchronizedBlinker : MonoBehaviour
{
    //エディタでアタッチしてもしてなくても動く
    [SerializeField] private CanvasGroup canvasGroup;
    private CanvasGroup _CanvasGroup
    {
        get{
            if (canvasGroup == null)
            {
                canvasGroup = GetComponent<CanvasGroup>();
            }
            return canvasGroup;
        }
    }
    private BlinkerClock BC;
    private BlinkerClock _BlinkerClock
    {
        get{
            if (BC == null)
            {
                BC = BlinkerClock.Instance;
            }
            return BC;
        }
    }

	void Update ()
	{
        _CanvasGroup.alpha = _BlinkerClock.ClockingAlpha;
	}
}
```

やり方は他にもありそうなので、こっちのがいいよ！とかあれば教えてください。
Quimat DSO Shell(ミニオシロスコープ) チートシート



この記事は[Quimat DSO Shell](http://amzn.asia/d/dDQCIGW)の日本語チートシートです。

#各ボタン
###V/DIV
V感度の調整
垂直位置の調整

###SEC/DIV
時間単位の設定
水平位置の調整

###TRIGGER
閾値を上回るor下回るとトリガーされる。
AUTO(常時更新), NORM(トリガーされている間更新), (トリガーされた瞬間のみ更新)

###OK
更新されていない(=HOLD)の時に押すと復帰

###ADJ(ダイヤル & ボタン)
値の調整
一回押すことでダイヤルを回した時のスピード切り替えができる 

#できること
##垂直位置の調整
1. 上部のスイッチをGNDに
2. V/DIVボタンを3秒長押し
3. ADJダイヤルを回して値を調整
※ダイヤルを早く回しすぎると変わらない場合があるのでゆっくりめに回す

##水平位置の調整
1. SEC/DIVボタンを3秒長押し
2. ADJダイヤルを回して値を調整

##文字表示ON/OFF
OKボタンを3秒長押し

##波形の保存と呼びだし
1. ADJダイヤルとSEC/DIVボタンを同時押しで保存
2. ADJダイヤルとTRIGGERボタンを同時押しで読み込み

##デフォルト設定に戻す
SEC/DIVボタンとTRIGGERボタンを同時に3秒長押し

##閾値の調整
TRIGGERボタンを3秒長押し。すると信号の中間が閾値としてセットされる
shared element transition / reenterアニメーションの無効化


# きっかけ
A画面からB画面に遷移したタイミングのアニメーションは再生したいが、A画面に戻るときのアニメーションを無効にしたかった。

イメージとしては、下のアニメーションのような一覧画面から詳細画面に遷移した時は拡大アニメーションを再生します。詳細画面から一覧画面に戻る時はアニメーションを再生させないようにしたかったです。（下のアニメーションでは戻る時のアニメーションが再生されていますがこれをキャンセルさせる）

# Shared Element Transitions
![intro.gif](https://qiita-image-store.s3.amazonaws.com/0/36517/b7e65a9c-9214-e981-143e-0bb3c19af5a9.gif)

# 環境
Android Studio 3.1
compileSdkVersion 28
buildToolsVersion 27.0.3

# 実装
バックボタンを押したタイミングで遷移アニメーションを無効化する

```kotlin:Hoge.Activity
override fun onBackPressed() {
  Intent().flags = Intent.FLAG_ACTIVITY_NO_ANIMATION
  super.onBackPressed()
}
```

# 終わりに
調べるのに苦労したので記述しました。誰かの役に立てば良いですね。
この方法以外の実装がありましたら教えていただけるとうれしいです。
Visual Studio CodeでJava

会社が休みだったので、最近ずっと進化し続けているVisual Stuido Code(以下VSCode)でJavaの環境を整えてみた。
プラットフォームはUbuntu18.04。Gradleも使ってみる。

# VSCodeインストール
公式からダウンロードしてもいいが、UbuntuならばUbuntu Makeが使えるので、これで入れてもいい。今だとバージョン1.28.2がインストールされた。

    umake ide visual-studio-code
    umake --version
    > 16.11.1

## Java Extension Packプラグイン
プラグイン検索に"java"って入力するとたくさん出てくるが、「Java Extension Pack」を入れると以下のプラグインがまとめて入っているらしいので、これを入れることにする。

- Language Support for Java™ by Red Hat
- Debugger for Java
- Java Test Runner
- Maven Project Explorer

再読み込みのために再起動すれば完了。

# Javaの準備
最新はJava11だけど今回は元々入っていたJava8で代用。
インストール手順は、ググればいくらでもヒットするのでここでは割愛。
`$JAVA_HOME`くらいは確認しておく。

    echo $JAVA_HOME
    > /usr/lib/jvm/java-8-oracle

# Gradleの準備
[公式](https://gradle.org/install/)には現在最新は4.10.2と書いてあるが、aptでインストールされた3.4.1を使った。

    apt install gradle

## プロジェクトディレクトリ生成
gradleがあれば簡単に作れるので全てお任せした。
`--type java-application`を指定するのがポイント。

    mkdir project_name_dir
    cd project_name_dir
    gradle init --type java-application
    tree
	.
	├── build.gradle
	├── gradle
	│   └── wrapper
	│       ├── gradle-wrapper.jar
	│       └── gradle-wrapper.properties
	├── gradlew
	├── gradlew.bat
	├── settings.gradle
	└── src
	    ├── main
	    │   └── java
	    │       └── App.java
	    └── test
		└── java
		    └── AppTest.java

ちなみに、build.gradleの中身はこんな感じ（コメント行は削除）

```groovy:build.gradle
apply plugin: 'java'
apply plugin: 'application'
repositories {
    jcenter()
}
dependencies {
    compile 'com.google.guava:guava:20.0'
    testCompile 'junit:junit:4.12'
}
mainClassName = 'App'
```

## 動作確認
gradleを使って一通り使いそうなタスクを実行してみる。
雛形のままなので全部問題なく動くはず。

    gradle build
    gradle run
    gradle check
    gradle clean

# VSCodeの設定
作成したプロジェクトディレクトリを選択して作業する。

## JAVA_HOMEの設定
`settings.json`の"java.home"に`$JAVA_HOME`の値を設定する。
直接ファイルを編集してもいいし、GUIで設定してもいい。

    grep java.home ~/.config/Code/User/settings.json
    > "java.home": "/usr/lib/jvm/java-8-oracle"

## タスクの設定
`.vscode/tasks.json`にgradleコマンドを実行するように設定する。

```json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "./gradlew build"
        },
        {
            "label": "run",
            "type": "shell",
            "command": "./gradlew run",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "clean",
            "type": "shell",
            "command": "./gradlew clean"
        },
        {
            "label": "check",
            "type": "shell",
            "command": "./gradlew check"
        }
    ]
}
```

## タスクの実行
`F1`キー → "run task" → tasks.jsonに設定したタスクを選択。
デフォルトタスク`run`を実行するときは`Ctrl` + `Shift` + `B`でいい。
ブレークポイントを設定していると、その場所で止まってくれるので特に意識せずデバッグできた。

# 所感
ちょっと触っただけなのでまだなんとも言えないが、

- パッケージ名などディレクトリ名まで含めたリファクタリングはできなかった
- コードジャンプなどのショートカットキーがVisual Studioに似ている（eclipseユーザは戸惑うかも）
- ドキュメンテーションコメントアウトの補完をもう少し頑張って欲しい

今後の成長に期待したい。
HeartcoreRobo(RPA)導入から１ヵ月経過したので作成したロボのまとめ

　私の職場でRPA、HeartCoroRoboを導入してから１ヵ月（お試し期間を含めれば２ヵ月）が経過しました。区切りもよいので、使用状況などをまとめてみます。
　現時点では、まだロボの完全自動化まではできていませんが、必要なタイミングでロボを動かし処理を実行する半自動化という意味では、いろんな作業を自動化できています。ロボが操作している間は、自分のパソコンは使えませんが、その間に書類のチェック作業をしたり、次の作業の準備をしたりと、時間を有効活用できていると思います。

#活躍している主な業務
１．ネットバンキングからのデータダウンロード、入金処理、会計システムへの連携データ出力
２．社内システムＡからデータ出力し社内システムＢでデータ取込。内容ごとに設定変更をしながら請求書印刷
３．予算管理システム上のデータ承認（IE、Chrome両方に対応。番号にしたがって別画面で操作）
４．月次で行う確認作業のため各システムからのデータ出力
５．十数社から集まってくる資料請求データを、各社のWEBページにアクセスし、新規請求者のデータを検索してダウンロード。

以下、それぞれの処理についてコメントしてみます。

##１．ネットバンキングからのデータダウンロード、入金処理、会計システムへの連携データ出力

　私は経理の仕事をしているので毎日夕方に預金口座の入出金明細をダウンロードし、入金処理をしていました。他の人にお願いするとしてもその人の業務時間が割かれることとなるため、結局自分で作業していました。しかし、ロボに操作を覚えさせることで、口座の入出金明細を開き、PDFとCSVデータをダウンロードする処理を自動化できましたし、入金処理の際にスクリーンショットを保存することで、後で確認することもしやすくなりました。自分ではわざわざ一つひとつスクリーンショットを撮るのは難しいですが、ロボは設定した通りに動いてくれるため、ありがたいです。

##２．社内システムＡからデータ出力し社内システムＢでデータ取込。内容ごとに設定変更をしながら請求書印刷

　社内システムが整備されていても、システム間のファイルのやり取りは手動で行っているケースがあると思います。また、クラウドサービスを活用することで、クラウドサービスからのデータを社内システムに取り込む作業も生じますが、そのようなデータの出力、別システムでの取込作業も、自動化できました。
　また、内容に応じて印刷範囲を指定したり、入金期日を設定しながら請求書印刷を行うため、同じ印刷画面で何パターンもの条件変更をしながら手動で印刷していたものを、前回ご紹介した[プロシージャ](https://qiita.com/y_WAT/items/c71043af2b4284f7a3ad)を使って、印刷条件を変数として受け渡すことで、一つのロボで実現できています。

##３．予算管理システム上のデータ承認（IE、Chrome両方に対応。番号にしたがって別画面で操作）
　各部署から出された書類の番号をもとに、クラウド上のシステムでデータを検索・承認し、会計システムに連携するのですが、各部署の担当者がデータ送信し忘れている場合、別画面を開いてデータ送信してから、再度承認作業をする必要があり、ストレスを感じていました。
　今ではEXCEL上に処理したい書類の番号を一列に入力し、ロボを実行するバッチファイルへのハイパーリンクをEXCEL上に張り付けておくことで、EXCELからロボを起動して、処理を実行する仕組みが実現できています。
　このロボは私よりも同じ部署の２人に使ってもらっていますが、一人はIE、もう一人はChromeで作業しています。IEとChromeでは同じクラウドサービスでもボタンの形が微妙に異なり、他のRPAでは処理が止まってしまうことがあるのですが、HeartCoreRoboでは一つのロボにIEのボタンとChromeのボタンを覚えさせておけば、どちらも処理することができるため、両人に活用してもらえています。
　また、HeartCoreRoboは一つの実行ライセンスで複数人が操作できる（同時実行は１ライセンスにつき１台のみ）というのもありがたいです。

##４．月次で行う確認作業のための社内システムからのデータ出力
　社内システムと会計システムの数値や、預金残高と会計システムとが一致していることを確認する作業が毎月生じるのですが、システムからデータ出力し、EXCEL上でデータを比較し、過不足があればデータを修正して再度システムからデータを出力し、というように、同じ画面からデータを何度も出力する必要があります。こちらもロボに操作を覚えさせることで、少しは気持ちが楽になりました。

##５．十数社から集まってくる資料請求データを、各社のWEBページにアクセスし、新規請求者のデータを検索してダウンロード。
　業種の都合上、色んな業者を通じて資料請求を受け付けているため、各社からそれぞれのサイトにデータがアップされ、通知メールを受信したらサイトにアクセスしてデータをダウンロードしていました。しかも、１社につき複数のIDがあるため、IDを変えてログインしなおして、ダウンロードして………。他の部署の仕事とはいえ、RPA化したい作業の一つと考えていました。
　こちらもロボを作成することで、メール受信の有無にかかわらず、サイトにアクセスして条件検索し、新たなデータがあればダウンロード、無ければダウンロードしないでログアウト、という処理が実現できました。こちらは朝、出勤前にロボを実行させるようにバッチ処理を設定しており、出勤した時にはその日のデータがダウンロードされている、という状況ができています。

#今後実現したいこと
１．今は自分がロボを実行しているものを、自動化したり、もう少し使いやすくして他の人に使ってもらう
２．定例の報告書類へのデータ反映
３．上記４のシステム間の差異の発見や修正データの作成

　もう少しいろんな人にロボの有用性を実感してもらえたら、今は一つしかない実行ライセンスを増やしたいと思っています。とりあえず、現時点のまとめでした。