OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeとAndroid StudioとXcodeの便利ショートカットキーまとめ

最近タイトルに記載したエディタを交互に利用しており、ショートカットキーが各エディタで異なり混乱するため、一旦整理してみる

# 表記方法
各操作に対して、以下の順でショートカットを記す

1. VSCode（Windows版、v1.34.0時点のデフォルト）
2. Android Studio（Windows版、v3.4時点のデフォルト）
3. Xcode（Mac、v10.2.1時点のデフォルト）

VSCodeのMac版は、Windows版のものを

- <kbd>Ctrl</kbd> → <kbd>Command</kbd>
- <kbd>Alt</kbd> → <kbd>Option</kbd>

と読み替えることで、基本的には同様の操作が行える

# 操作ごとのショートカットキー
## 移動
### 定義へ移動
1. <kbd>Ctrl</kbd>+左クリック ／ <kbd>Ctrl</kbd>+<kbd>B</kbd>
2. <kbd>Ctrl</kbd>+左クリック
3. <kbd>Command</kbd>+<kbd>Ctrl</kbd>+左クリック

### 前の場所に戻る／進む
1. <kbd>Alt</kbd>+<kbd>←</kbd> ／ <kbd>Alt</kbd>+<kbd>→</kbd> *
2. <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>←</kbd> ／ <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>→</kbd>
3. <kbd>Command</kbd>+<kbd>Ctrl</kbd>+<kbd>←</kbd> ／ <kbd>Command</kbd>+<kbd>Ctrl</kbd>+<kbd>→</kbd>

_*: Macは <kbd>Ctrl</kbd>+<kbd>-</kbd> ／ <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>-</kbd>_

### ファイル名を入力して開く
1. <kbd>Ctrl</kbd>+<kbd>P</kbd> → ファイル名入力 → <kbd>Enter</kbd>
2. <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>N</kbd> → ファイル名入力 → <kbd>Enter</kbd>
3. <kbd>Command</kbd>+<kbd>Shift</kbd>+<kbd>O</kbd> → ファイル名入力 → <kbd>Enter</kbd>

### 特定の行に移動
1. <kbd>Ctrl</kbd>+<kbd>G</kbd> → 行番号を入力 → <kbd>Enter</kbd> *
2. <kbd>Ctrl</kbd>+<kbd>G</kbd> → 行番号を入力 → <kbd>Enter</kbd>
3. <kbd>Command</kbd>+<kbd>L</kbd> → 行番号を入力 → <kbd>Enter</kbd>

_*: Macも同様（Commandへの読み替え不要）_

## 検索・置換
### ファイル内を置換
1. <kbd>Ctrl</kbd>+<kbd>H</kbd> *
2. <kbd>Ctrl</kbd>+<kbd>R</kbd>
3. <kbd>Option</kbd>+<kbd>Command</kbd>+<kbd>F</kbd>

_*: Macでは <kbd>Option</kbd>+<kbd>Command</kbd>+<kbd>F</kbd>_

### プロジェクト内（フォルダ内）検索
1. <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>F</kbd>
2. <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>F</kbd>
3. <kbd>Command</kbd>+<kbd>Shift</kbd>+<kbd>F</kbd>

### プロジェクト内（フォルダ内）置換
1. <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>H</kbd>
2. <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>R</kbd>
3. <kbd>Option</kbd>+<kbd>Command</kbd>+<kbd>Shift</kbd>+<kbd>F</kbd>

## 編集
### シンボルの名前を変更
1. <kbd>F2</kbd>
2. <kbd>Shift</kbd>+<kbd>F6</kbd>
3. 右クリック > [Refactor] > [Rename...] *

_*: MacBook ProのTouch Bar付きモデルであれば、デフォルトで専用のキーが表示されている_

### 1行全体のコピー＆ペースト
1. 選択範囲を作らず <kbd>Ctrl</kbd>+<kbd>C</kbd> → ペーストしたい行にカーソルを合わせて <kbd>Ctrl</kbd>+<kbd>V</kbd>
2. 選択範囲を作らず <kbd>Ctrl</kbd>+<kbd>C</kbd> → ペーストしたい行の__先頭に__カーソルを合わせて <kbd>Ctrl</kbd>+<kbd>V</kbd>
3. （なし）

### 行を上に移動／下に移動
1. <kbd>Alt</kbd>+<kbd>↑</kbd> ／ <kbd>Alt</kbd>+<kbd>↓</kbd>
2. <kbd>Alt</kbd>+<kbd>Shift</kbd>+<kbd>↑</kbd> ／ <kbd>Alt</kbd>+<kbd>Shift</kbd>+<kbd>↓</kbd>
3. <kbd>Option</kbd>+<kbd>Command</kbd>+<kbd>[</kbd> ／ <kbd>Option</kbd>+<kbd>Command</kbd>+<kbd>]</kbd>

### フォーマットを整える
1. <kbd>Alt</kbd>+<kbd>Shift</kbd>+<kbd>F</kbd>
2. <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>L</kbd>
3. 選択して <kbd>Ctrl</kbd>+<kbd>I</kbd>

### 大文字変換／小文字変換
1. <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> → 「upper」と入力 → <kbd>Enter</kbd> ／ <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> → 「lower」と入力 → <kbd>Enter</kbd>
2. <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>U</kbd>
3. メニュー[Edit] > [Format] > [Transformations] > [Make Upper Case] ／ メニュー[Edit] > [Format] > [Transformations] > [Make Lower Case]
.NET Core版WPFでもEdgeのWebViewが使いたい！

# EdgeベースWebViewとは
[Microsoft.Toolkit.Wpf.UI.Controls.WebView](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.Controls.WebView/)のこと。  
IEベースではなく、Windows10で追加されたEdgeレンダリングのWebViewを、アプリに追加できる。  

# 落とし穴
Edge版WebViewの現在の正式リリース版は .NET Frameworkのみ対応の__バージョン５__です。  
.NET Core版WPF対応のver 6は現在previewなので、VisualStudioからいつものように入れることができません。(バージョン５が入る。)  
# どうすればいいのか
とっても簡単。パッケージマネージャーからコマンド叩いて入れます。  
## 手順
1. VisualStudioでツール -> NuGetパッケージマネージャ -> パッケージマネージャコンソール を起動。  
1. 以下のコマンドを入力(執筆時点2019/05/21での最新版です)  
    ``` Install-Package Microsoft.Toolkit.Wpf.UI.Controls.WebView -Version 6.0.0-preview5 ```  
1. Enterをたたく。

__とっても簡単。__  

## 余談
[Chromium Edge版](https://www.nuget.org/packages/Microsoft.Web.WebView2/)が開発されてるっぽい！  
現在はWin32 C++のみ対応のようです。
[Vue.js]Phpstorm 絶対パスでcomponentのパスを指定


## やりたいこと

絶対パスでcomponentのパスを指定する。
プログラムのエラーは出ないが、エディタ（私が使用しているものはPhpstormです）で
「文法違いますよ」というエラー（黄色の破線）が出る。
紛らわしいので、なんとかしたい。

### 修正前

 ```html
<script>
// @ is an alias to /src

import TheClientHeader from '../../components/object/project/TheClientHeader'　//←★修正前コレ
export default {
  name: 'Home',
  components: { TheClientFooter },
}
</script>
```

### 修正後

 ```html
<script>
// @ is an alias to /src

import TheClientHeader from '@/components/object/project/TheClientHeader'　//←★修正後コレ（文法エラーの表記は出ていない）
export default {
  name: 'Home',
  components: { TheClientFooter },
}
</script>
```

## 解決方法

**import-resolver.js**というファイルをドキュメントルート直下に作成し、
以下を記述

```javascript
/* eslint-disable no-undef */
System.config({
  paths: {
    '@/*': 'src/*',
  },
})
```
packer + ansibleでUNREACHABLE!

packerからansibleでprovisioningするときに、こういうエラーでた。

```
    googlecompute: PLAY [all] *********************************************************************
    googlecompute:
    googlecompute: TASK [Gathering Facts] *********************************************************
==> googlecompute: failed to handshake
    googlecompute: fatal: [default]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Warning: Permanently added '[127.0.0.1]:53116' (RSA) to the list of known hosts.\r\nReceived disconnect from 127.0.0.1 port 53116:2: too many authentication failures\r\nDisconnected from 127.0.0.1 port 53116", "unreachable": true}
    googlecompute:      to retry, use: --limit @/xxx
    googlecompute:
```

色々探して、ここにたどり着く。
https://github.com/hashicorp/packer/issues/5329

```
  "provisioners": [
    {
      "type": "ansible",
      "playbook_file": "../ansible/master-image-playbook.yml",
      "extra_arguments": [
        "--ssh-extra-args",
        "-o IdentitiesOnly=yes"
      ]
    }
  ]
```

解決。
Photoshopでmp4にすると、最後に黒い画面が出てしまう

#出来るだけ早く動画をmp4にしたい
メディアエンコーダーさんが言うことを聞いてくれない。
なのでmovでレンダリングしてPhotoshopでmp4にする。
しかし最後のフレームが真っ黒になる現象が！
なぜだ〜

#しょうがないのでiMovieを使う
動画を取り込んで右上の**ファイル**から書き出す。

<img width="237" alt="スクリーンショット 2019-05-21 19.11.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168611/9ac9d227-95dd-c0ef-c066-6a176b9e7b6f.png">
CodeCommitメモ

### 概要
* CodeCommitを使いはじめるメモ
* 既存のリポジトリからの移行も記載
* 会社は開発費用を圧縮するためGithubが使えなくGitLabで頑張る現状(涙)
* GitLabも社内の意思統一が難しいため最新バージョンに移行できず古いGitLabがメインで使用されている(涙)
* 苦肉の策としてプロジェクト毎に発行されるAWSアカウント上でほぼ無料のCodeCommitを使いモダン？な環境を手に入れる
* ついでにCodeBuild、CodeDeployとも連携しCIを構築しちゃう

### アクセス権限登録

CodeCommitへのアクセスはIAM単位で管理されている為、個人のIAMにCodeCommitへのアクセス権と公開鍵の追加等の作業が必要となる
下記の通り、アクセス権限に「AWSCodeCommitFullAccess」を追加

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/18012a78-9149-c67e-3ecf-73387a6e3317.png)

#### SSH接続設定

CodeCommitにSSH接続する際には下記の公開鍵の登録と.ssh/configファイルの追加が必要となる

##### 公開鍵登録

認証情報から「AWS CodeCommitへのSSHキー」を追加

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/196f7679-34c4-3b0f-360d-71c9898268f4.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/b7422d99-4526-69cf-f933-0c8a7fceba35.png)

※登録する公開鍵ですが生成する鍵のビット数が2048bit未満だとアップロードできない

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/f873c261-b753-bc86-f8b8-85fc27b9ee94.png)



##### .ssh/config編集

.ssh/configにCodeCommitのアドレス・ユーザ・秘密鍵の場所を記載

```
Host git-codecommit.*.amazonaws.com
    User xxxxxxxxxxxxxxxxxxxx
    IdentityFile ~/.ssh/id_rsa
```

Userは、上記、公開鍵登録後、「SSHキーID」に表示されている値

IdentityFileは、秘密鍵ファイル


#### HTTPS接続設定

CodeCommitにHTTPS接続する際には下記のGit認証情報の登録が必要

##### Git認証情報生成

認証情報から「AWS CodeCommit の HTTPS Git認証情報」を生成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/2c42d75e-dda4-64b7-e1b4-b2bd2b781036.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/2e02301b-ef71-ea96-27e4-810a217f2c0d.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/372090b1-0b77-5fdc-3da5-ddf8b4c4b3da.png)

証明書をダウンロードして閉じる

ダウンロードしたCSVファイルにユーザ名とパスワードが記載されていますので、こちらを使用してHTTPS接続を行う

### CodeCommit
#### リポジトリ作成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/dc8fab50-a220-f7ba-4194-07e218a9c5fa.png)

リポジトリ作成後、以下の画面が表示されるが「スキップ」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/0cb6ac3a-ccfe-e312-0a52-b96775804194.png)

既存のGitからリポジトリを移行する手順を以下に記載

※既存のGitへの接続が確立されていることを前提として記載

### Git移行
既存のGitからリポジトリを移行する手順を以下に記載

※既存のGitへの接続が確立されていることを前提として記載

#### 既存Gitからリポジトリのclone

以下のコマンドにて既存Gitからリポジトリ情報を取得

```
git clone --mirror hoge-ip:huga/web-application.git original_repo
```

※上記例既存リポジトリとなる


#### CodeCommitリポジトリへpush

上記で作成した「original_repo」フォルダに移動し、以下のコマンドでpush

```
git push ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/example-repository --all
```

コマンドではリポジトリにある全てのブランチをpushしますがタグのような他の参照はpushしない。タグをpushする場合、上記pushが完了後、以下のコマンドでpush

```
git push ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/example-repository --tags
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/96597ccc-add0-76e3-3b84-f2f9db0d1a6d.png)
Nodeで対話型プログラム（readlineモジュールのasync iterator対応について）

NodeでCLIなソフトを作るとき、標準モジュールの `readline` を使うのだけれど「ユーザからの入力を同期的に待ち、それに応じた処理する」という一見楽勝な操作でさえ、煩雑な形の実装になってしまう。JavaScript/Nodeが非同期なAPIを提供することに起因する。

そのため、これまでは`readline-sync`というサードパーティ製のライブラリを使うことが多かったのだけれど Promise, await, async iterator を手に入れた今、（単純な要件なら）readline-sync を使わなくても 簡単に実現できる。

最近整理したところ (Node v11 から?) `readline.createInterface` が async iterable を[返すようになっていたという公式ドキュメントの記載](https://nodejs.org/dist/latest-v12.x/docs/api/readline.html#readline_rl_symbol_asynciterator)を見つけたので、スッキリ書けるようになっていることに気づいた。

以下 **Node v12で動作確認しており、たぶんv11以降じゃないと動作しない**

## レシピ1: 2数を行ごとに受け取って和を表示
イテレータを手動管理するパターン

```js
const readline = require('readline');

async function main () {
  const rl = readline.createInterface({ input: process.stdin });
  const ait = rl[Symbol.asyncIterator]();
  const n1 = parseInt((await ait.next()).value, 10);
  const n2 = parseInt((await ait.next()).value, 10);
  rl.close();
  console.log(`answer is ${n1 + n2}`);
}

main();
```

ユーザからの入力が2行であるとわかっている場合、`rl[Symbol.asyncIterator]()`のように明示的にイテレータを取得して`next`を呼び出すことで値を取得する。`rl.close()`は明示的に呼び出さないといつまでも入力を待ち続けることになる（Ctrl+Dを押さないとプログラムが終了しなくなる）。

## レシピ2: 可変個の数を行ごとに受け取り総和を表示
イテレータ管理は `for-await-of` に任せるパターン

```js
const readline = require('readline');

async function main () {
  const rl = readline.createInterface({ input: process.stdin });
  let sum = 0;
  for await (const val of rl) {
    sum += parseInt(val, 10);
    console.log(`accumulated: ${sum}`);
  }
  console.log(`answer is ${sum}`);
}

main();
```

入力の終わりを知らせるために Ctrl+D を押下する必要がある。その代わりイテレータの管理をしなくてもよい。forループの内部で何らかの脱出条件の判定をして明示的に `rl.close()` を呼び出すのもよいアイディアだと思う。
[Ruby] Excel の行番号と列番号を番地 (A1 など) に変換する

# 仕様

例えば (1, 1) を A1 に、(2, 26) を Z2 に変換する。

```rb
require 'minitest/autorun'

class CellAddressTest < Minitest::Test
  def test_to_s
    assert_equal('A1', CellAddress.new(row: 1, column: 1).to_s)
    assert_equal('Z2', CellAddress.new(row: 2, column: 26).to_s)
    assert_equal('AA3', CellAddress.new(row: 3, column: 27).to_s)
    assert_equal('AAA100', CellAddress.new(row: 100, column: 703).to_s)
  end
end
```

# 実装

```rb
class CellAddress
  ALPHABETS = [*'A'..'Z'].freeze

  attr_reader :row_number, :column_number

  def initialize(row:, column:)
    @row_number = row
    @column_number = column
  end

  def to_s
    "#{column_letter}#{row_number}"
  end

  private

  def column_letter
    return nil unless column_number > 0

    q = column_number
    letters = []

    until q.zero?
      # 商は英語で quotient、余りは remainder というらしい。
      q, r = (q - 1).divmod(ALPHABETS.length)
      letters.push(ALPHABETS[r])
    end

    letters.reverse.join
  end
end
```
Illustratorのパスデータをafterでシェイプとして使う

#複雑なパスの境界線をアニメーションさせたい
Illustratorからパスをコピーして貼り付けただけだと、
マスクになってまう!!

#該当パーツのみをaiファイルに
この時、ファイル名に日本語が入っていると
after上で**オリジナルを編集（⌘＋E）**ができないっぽい。

パスが複数にわたるものは**複合パス化して別レイヤー**にしておく。

#afterに入れて右クリック
作成＞ベクトルレイヤーからシェイプを作成
<img width="685" alt="スクリーンショット 2019-05-21 18.47.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168611/b3e07a18-b56e-cfde-9695-9ac1aa04ee26.png">


↓参考
[リンク]https://www.wgn.co.jp/store/blog/item-1259.html

↓これができなかったのはなぜなのやら。時間あるとき調べる。
[リンク]http://oldrookie.info/2018/12/29/%E3%80%90ai_ae%E3%80%91%E3%82%A4%E3%83%A9%E3%83%AC%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%9F%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%82%92ae%E3%81%A7%E3%83%91%E3%82%B9%E3%83%9E%E3%82%B9%E3%82%AF%E3%81%A7/
Raspberry pi に k3s と helm 入れるのに四苦八苦

### 2019/05/24 追記

Helm インストール後にエラー(後述)。
そもそも、k3sに対応していないのではないか？等、色々調査しました。

結局、[こちらの記事](https://sky-joker.tech/2019/05/04/%E3%83%A9%E3%82%B9%E3%82%99%E3%83%98%E3%82%99%E3%83%AA%E3%83%BC%E3%83%8F%E3%82%9A%E3%82%A4%E3%81%A6%E3%82%99k3s%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF/)に行き着いて、なんとか解決しました。

> export KUBECONFIG=/etc/rancher/k3s/k3s.yaml

Helm導入後に、↓の感じで config を教えてあげる必要があるみたいです。

```shell
$ export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
$ helm version
Client: &version.Version{SemVer:"v2.14.0", GitCommit:"05811b84a3f93603dd6c2fcfe57944dfa7ab7fd0", GitTreeState:"clean"}
Error: could not find tiller
```

この後、tillerの設定をして完了。

```shell
$ kubectl create serviceaccount --namespace kube-system tiller
$ kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
$ helm init --service-account tiller --history-max 200 --tiller-image jessestuart/tiller
$ kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
```
※ 正しい順番が曖昧です。ミソは arm 対応の tiller-image を指定してあげること。

もし参考にしてくださった方がいるならば、ご迷惑をおかけしました。
kubernetesの道のりは長い・・・

## インストール行程

### k3s

余計なことは考えず、[公式](https://k3s.io/)のコマンドを叩く。

> curl -sfL https://get.k3s.io | sh -

### Helm

普通にぐぐったら、[Stack Overflowで先人の知恵](https://stackoverflow.com/questions/49859391/install-helm-on-raspberry-pi-3)。

> wget https://kubernetes-helm.storage.googleapis.com/helm-$HELM_VERSION-linux-arm.tar.gz

wget で公式から落とすコマンド・・・

[githubのRelease](https://github.com/helm/helm/releases)に arm バイナリも提供されてました。

arm バイナリは無いだろう（だろう運転）。悲しき習慣

### 先人の知恵(スクリプト)を改修して、最新バージョン対応にしてみた。

```bash
HELM_VERSION=v2.14.0 ; HELM_INSTALL_DIR=/usr/local/bin/ ; wget https://kubernetes-helm.storage.googleapis.com/helm-${HELM_VERSION}-linux-arm.tar.gz -O - | tar --strip=1 -C ${HELM_INSTALL_DIR} --no-same-owner --no-same-permissions -xzvf - linux-arm/helm ; chmod +x ${HELM_INSTALL_DIR}/helm
```

怒涛のワンライナー

tar コマンドで参考にしたところは[こちら](https://qiita.com/kawaz/items/46217733da8050132ce1)

("-" の置き場所で小一時間ハマったのは内緒)

```bash
$ helm version
Client: &version.Version{SemVer:"v2.14.0", GitCommit:"05811b84a3f93603dd6c2fcfe57944dfa7ab7fd0", GitTreeState:"clean"}
Error: Get http://localhost:8080/api/v1/namespaces/kube-system/pods?labelSelector=app%3Dhelm%2Cname%3Dtiller: dial tcp [::1]:8080: connect: connection refused
```
手抜きアロケータ

# 概要
PICやマイコンのプログラミングでmalloc使いたいけど使えない時に使っていたアロケータのソースです、ソースも短く開放の必要もなく簡単に使えますがチェック機構をなにも備えていないのでメモリの使用状況を把握していないとバグの原因になります。
１スコープ内で使い終わるように等気を使って使う必要があります。

## ソース
```C

#include <stdio.h>

char* myMalloc(size_t size) {
    static char buffer[8192];
    static int nextPosition = 0;
    int pos;
    pos = nextPosition;
    if ((pos + size) >= sizeof(buffer)) {
        pos = 0;
    }
    nextPosition = pos + size;
    return &buffer[pos];
}

int main(int argc, char** argv) {
    int i;
    char* p;
    for(i = 0; i < 10; i++) {
        p = myMalloc(16);
        sprintf(p, "i=%d\n", i);
        printf(p);
    }
    return 0;
}
// gcc main.c -o a.out

```

## 仕組み
確保した長さだけインデックスを進めて次の呼び出しではそのインデックスのアドレスを返します、サイズを超えるとインデックスは０に戻ります。
ソース見たほうが早いと思います。
「ラーニング・ピラミッド」というまのせかいを再構築

ラーニング・ピラミッド

講義
読書
視聴覚
デモンストレーション
グループ討論
自ら体験する
他の人に教える

という順番があるらしい。

#妥当そうなのは
##1
読書
＜
視聴覚
の順番

文字だけより、映像の方がわかりやすいという経験則。

##2
自ら体験する
＜
他の人に教える

教えてみると、理解が深まるのは経験則。

#明らかにおかしいのは

##1
グループ討論
＜
自ら体験する

グループ討論って、自ら体験してからするもので、体験せずに討論しているのはデモンストレーションや、視聴覚よりだめだめ。

なんで、こういう発想がでるかと調べてみた。

自ら体験する前にグループ討論をする人たちがいるらしい。
無駄だと思う人がいるとかんがえないのだろうか。

世界一周旅行、宇宙旅行のような、準備に期間が要り、事前に議論が必要な場合もある。
グループ討論が事前に必要な場合は、大規模な場合と限定するとよいかも。


##2
講義
<
読書

読書より内容のない講義を受けたらだめでしょう。

読書してわからないところを講義で知る。

#不明確

デモンストレーションと視聴覚がわけてあるのがわからない。

デモンストレーションは視聴覚の１種だし、視聴覚ってなに。

#再構築
読書
視聴覚・デモンストレーション
講義
自ら体験する
グループ討論
他の人に教える

講義が、視聴覚よりかちがなければだめだめ

#文書履歴(document history)
ver. 0.01 初稿 20190521
ver. 0.02 説明追記 20190522
FtDのLuaのindexの扱い

* この記事は「From The Depths」というゲーム（以下FtD）で使用できるLuaに関する記事です。
* Luaに関心のあるFtDプレイヤーを対象としています。

## Luaを触り始めた頃にはまった事

### indexのオリジン
FtDはC#製なので、`I:GetTargetInfo(mainframeIndex, targetIndex)`などで指定する〇〇Indexは0オリジン（0以上の整数）です。

```lua
function Update(I)
  I:ClearLogs()
  local mainframe_count = I:GetNumberOfMainframes()
  for mainframeIndex = 0, mainframe_count - 1 do
    local target_count = I:GetNumberOfTargets(mainframeIndex)
    for targetIndex = 0, target_count - 1 do
      local info = I:GetTargetInfo(mainframeIndex, targetIndex)
    end
  end
end
```

が、Luaのテーブルは1オリジンです。

```lua
function Update(I)
  I:ClearLogs()
  local id_table = I:GetAllSubConstructs() -- IDのテーブルを返す
  for i = 1, #id_table do -- #の後ろにテーブル名で、要素数を得る
    local id = id_table[i]
    local info = I:GetSubConstructInfo(id)
  end
end
```

これに気付かずエラーを連発しては頭を捻るということを繰り返しておりました。

以上。
FtdのLuaでweaponIndexからタレットのIDを得る

* この記事は「From The Depths」というゲーム（以下FtD）で使用できるLuaに関する記事です。
* Luaに関心のあるFtDプレイヤーを対象としています。

`I:AimWeaponInDirection(weaponIndex, x,y,z, weaponSlot)`や`I:GetWeaponBlockInfo(weaponIndex)`などでタレットを操作する際、weaponIndexが必要ですが、被弾などでタレットを喪失するとweaponIndexはズレるので、決め打ちでは使いにくい。
せっかくタレットにIDが振られているのでID指定でアクセスしたい。
そんな時がたまにあります。

というわけで、IDをキーにweaponIndexを値にもつテーブルを用意すれば後が楽になります。
コードは以下。

```lua
-- subconstIdをキーに、weaponIndexを要素にもつテーブルを返す
function get_weapon_index_map(I)
  local map = {}
  local subs = I:GetAllSubConstructs();
  local wc = I:GetWeaponCount()
  for weaponIndex = 0, wc - 1 do
    local wp_info = I:GetWeaponBlockInfo(weaponIndex)
    for i = 1, #subs do
      local id = subs[i]
      local sub_info = I:GetSubConstructInfo(id)

      if sub_info.Position.x == wp_info.Position.x 
      and sub_info.Position.y == wp_info.Position.y 
      and sub_info.Position.z == wp_info.Position.z then
        map[id] = weaponIndex
        break
      end
    end
  end
  return map
end
```

使い方はこのように。

```lua
  local id = 1
  local map = get_weapon_index_map(I)
  local blockInfo = I:GetWeaponBlockInfo(map[id])
  local last_pos = blockInfo.Position
```

タレット直接操作することはあまりないとは思いますが。

以上。
React.Fragmentの使いどころ

## はじめに
Reactを触ることになって、初めて知ることだらけ。
技術用語がまだスッと入って来ず、先輩から何度か説明してもらい、手を動かし、記事を読んでやっとふわっと理解したので一応記事にしておく。
ほぼほぼ自分用のメモなので、説明が足りないところがあったり間違ってるところがあったらごめんなさい。


## React.Fragmentってなに
Reactではrenderメソッドのreturnの中身は一つの要素でないといけないらしい。
要素が並列で並んでしまう場合に **`<React.Fragment>`** を使うとHTMLタグとして生成されずに親要素として機能してくれる。

## 使い所と使い方

```jsx
return (
  <ul>
    <li>hoge</li>
    <li>hoge</li>
  </ul>
)
```

これは`<ul>`の1要素だから `<React.Fragment>` は不要！ 
`<ul>` のなかに `<li>` がたくさんあるけどまとめなくて平気なの？と思ったが、`<li>` は `<ul>` の子要素だから `<ul>` 1つの要素として見られる。

---
```jsx
return (
  hogeリスト
  <ul>
    <li>hoge</li>
    <li>hoge</li>
  </ul>
)
```


続いてこちらは `"hogeリスト"` という文字列要素と、 `<ul>`要素が並列で存在しているのでエラーとなってしまう。

Reactでは、そんな時に **`<React.Fragment>`** を使って1つの要素としてまとめることができる。

2つになっちゃたのを1つのものとするためにサ○ンラップで包んであげるイメージ。
早速やってみる。


```jsx
return (
  <React.Fragment>
    hogeリスト
    <ul>
      <li>hoge</li>
      <li>hoge</li>
    </ul>
  </React.Fragment>
)
```

これで、<React.Fragment> という1要素に収まった。

ん？ 待てよ。それなら `<div>` で囲んであげても同じように親要素としてまとめてあげることはできるぞ...と思ったが、それだとHTMLに不要な `<div>`タグが生成されてしまった。  
そこで `<React.Fragment>` を使うことで、親要素としての役目を果たしつつ、HTMLタグは生成されなくなった。 便利！

Reactのお作法を守るためだけに使うことができるから、`<React.Fragment>` を使うと良い。
+44 203 880 7918 Outlook Technical Support Phone Number

What Makes Us Better Than the Official Perspective Support: 

We give different one of a kind and alluring capacities that settle on us a superior decision for the clients. Beneath correlation can furnish you with a superior understanding that why you should choose us over the formal Perspective mechanical help: 

Is your MS Perspective framework not reacting? Or then again is it getting caught at "Handling" screen? Or on the other hand has it promptly quit working? Or then again is it promptly solidifying or hanging? 

There can be various purposes behind your Perspective thought appearing. To help you to beat these issues, we have offered underneath a record of measures that can help fix the issue. 

Measures to Fix MS Perspective Not Responding Errors: 

Fix "Preparing" Error by Booting Perspective in Protected Mode 
When you will locate your Perspective getting ceased at "Preparing", you take a stab at unraveling the issue by shutting the Perspective, beginning it in Protected Mode and after that end it and beginning it regularly to settle the issue. 

Near Perspective on your pc and dispatch it in Protected Mode by choosing any of the accompanying alternatives: 
•	In your Windows 10 pc, go to "Begin" and kind "Outlook/safe".Press "Enter". 
•	In Windows seven, go to "Begin", and in the case – "Pursuit applications and records", kind "Standpoint/safe" and hit "Enter". 
•	In Windows 8, go to "Run" and kind "Standpoint/safe", and after that select OK.

https://www.advisorexpert.co.uk/outlook-support-phone-number/
FtDのLuaにおけるVector3の基礎

## はじめに
* この記事は「From The Depths」というゲーム（以下FtD）で使用できるLuaに関する記事です。
* Luaに関心のあるFtDプレイヤーを対象としています。

## ベクトルと座標
ベクトルは高校物理でやるかと思いますが、3次元空間での方向を表すのにx,y,zの3つの数字で方向を示します。
また、x,y,zで位置（＝座標）を示すこともできます。
座標には、グローバル座標（ワールド座標とも）とローカル座標があります。

### ローカル座標
ローカル座標はビークルの最初のブロックを基準として表されます。
右がx、上がy、前がzです。
![20190521174711_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379954/9291a0ce-8112-4ad9-c5de-0d364ad78c3b.jpeg)

上図にて青い棒の先のスピブロは、x=7, y=5, z=6の座標にあることになります。
LuaBoxで表示させると、以下のようになります。
![20190521174331_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379954/ec1155fb-e0bb-7ed0-b93b-67f20eafef3e.jpeg)

```lua
function Update(I)
  I:ClearLogs()
  local id = 1 -- スピブロのID
  local info = I:GetSubConstructInfo(id) -- スピブロのブロック情報を取得
  I:LogToHud(info.Position:ToString()) -- ローカル座標をログ出力
end
```

### グローバル座標
グローバル座標は世界の中のある点を基準としてどこにあるかを示します。
基準点は、現状では初期拠点のあるマスの中心の海抜0m地点です。
FtDのグローバル座標は、東がx、上がy、北がzとなっています。

ローカル座標の例と同様に、スピブロの位置をLuaBoxで表示させると、以下のようになります。
![20190521173534_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379954/88fdf628-1771-567c-1dc2-92b9ff56e689.jpeg)

![20190521173544_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379954/9047f2c8-563e-b932-0118-78f297c0e08b.jpeg)

マップで見ると、1マスの1片は5000mなので、マスのど真ん中から東に692m、南に511mくらいですね。

コードは以下。

```lua
function Update(I)
  I:ClearLogs()
  local id = 1 -- スピブロのID
  local info = I:GetSubConstructInfo(id) -- スピブロのブロック情報を取得
  I:Log(info.Position:ToString()) -- グローバル座標をログ出力
end
```

## Vector3について
FtDのLuaでは、UnityのVector3を使用できます。3は多分3次元の3。
Vector3はベクトルや座標を扱いやすいように作られており、x,y,zなどの必要な数値と、これらを操作する関数が用意されています。
リファレンスは[こちら](https://docs.unity3d.com/jp/540/ScriptReference/Vector3.html)。

例えば、とある座標（x=1, y=2, z=0）から別の座標（x=3, y=5, z=10）へ向かうベクトルを算出するには、

```lua
  local vector1 = I:Maths_CreateVector3(1, 2, 0)
  local vector2 = I:Maths_CreateVector3(3, 5, 10)
  local vector3 = vector2 - vector1 -- vector2が先
```

と書きます。すると、内部で3 - 1と5 - 2と10 - 0が計算され、vector3には（x=2, y=3, z=10）が格納されます。
以下は実行結果。
![20190521175456_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379954/9bb4df77-6f36-dd15-56dc-24cf9df3d943.jpeg)
自機から敵の方向をローカル座標で知るにはこれを使います。

なお、Vector3は`I:Maths_CreateVector3(x,y,z)`だけでなく`Vector3(x,y,z)`でも作れます。
![20190521180256_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379954/c2380217-3a08-7d01-dd0b-8c325d746e5d.jpeg)

とりあえず以上。
A5:SQL Mk-2（A5SQL）のアップデート方法

A5:SQL Mk-2のアップデート方法の覚書きです。
A5:SQL Mk-2（Version 2.13.3）→ A5:SQL Mk-2（Version 2.14.1）への
アップデートを以下の手順で行いました。

##対象ツール
A5:SQL Mk-2

##手順
1. A5:SQL Mk-2のサイトより、A5:SQL Mk-2の最新版のzipファイルを取得します。
https://a5m2.mmatsubara.com/

2. 任意の場所で展開します。

3. 古いバージョンのA5:SQL Mk-2をzip化します（※万が一のことがあった時のバックアップ用です。）

4. 古いバージョンのA5:SQL Mk-2一式を破棄し、新しいバージョンのA5:SQL Mk-2一式を配置します。（自分はProgram Files配下に置いています。）

5. 起動用の「A5M2.exe」のショートカットを作成している場合は、古いものを破棄し、
新しいショートカットを作成しておきましょう。

##備考
新しいバージョンに切り替え後、接続設定しなおさなくても、
これまで通り使えました。
よく使うpythonの日付変換まとめ

これだけ知りたかったんで。。

```python:time.py
# unixタイム
s = time.time()
# →1558429052.4563782

# unixタイムの整数のみ
ss = int(s)
# →1558429052

# unixタイム→datetime型
sss = datetime.datetime.fromtimestamp(ss)
# → datetime.datetime(2019, 5, 21, 17, 57, 32)

# unixタイム→日付文字(YYYY-MM-DD H:i:s)
date_str = "{0:%Y-%m-%d %H:%M:%S}".format(sss)
# → '2019-05-21 17:57:32'

# 日付文字→datetime型
date_datetime = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
# → datetime.datetime(2019, 5, 21, 17, 57, 32)

# datetime型→unixタイム
date_datetime.timestamp()
# → 1558429052.0
```

#  追記（unixタイム <-> 日付文字）

```python:unix.py

# unixタイム→日付文字(YYYY-MM-DD H:i:s)
unix = time.time()
"{0:%Y-%m-%d %H:%M:%S}".format(datetime.datetime.fromtimestamp(unix))
# '2019-05-22 16:59:38'

# 日付文字(YYYY-MM-DD H:i:s)→unixタイム
datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').timestamp()
# 1558511978.0
網際村物語(internet village story)。仮説 (61)

インタネットを村社会に対比して、課題を検討する。

村社会でなくなれば、良くなるのであれば、村社会でなくなるのは良い事。
村社会でなくなっても、悪いことがもっと増えるのであれば、村社会でなくなるのは悪いことかもしれない。

どうしたらいいかの解があるかどうかわかっていない。
その時点、その時点でなんらかの決定をする場合がある。

# 村社会のよいところ
1. 共通の利益を守る
水利権
入会権
漁業権

2. 災害や敵に立ち向かう
消防団

3. 季節の行事がある
村祭り

# 村社会の課題
1. 村八分
特定の立場、特性の人を排除しようとする

2. 封建制
古い制度、権力に依存している

3. 習慣的な規則がある
文書のある規則もあるかもしれないが、文書のない規則もあるかもしれない。

# internetにあてはめている
## 利点
### 共同意識
インタネットの中にも、村のような共同体もしくは共同意識を持って集まる人たちがいる。
個人が孤立しているよりはよいことがあるかもしれない。

### 暗黙の前提
いくつかの規則に基づいて成立していると、意思疎通に無駄がなくなる。
### 相互扶助
困ったことがあったら、相互に助け合うかもしれない。
## 課題
### 支配構造
法的な根拠のない規則で支配しようとするかもしれない。
### 慣習優先
新しい事を排除するかもしれない。
### 誤解・デマの増幅
間違った情報が爆発的に広がるかもしれない。
# 一覧

Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48)
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

OSEK OS設計の基礎　OSEK(100)
https://qiita.com/kaizen_nagoya/items/7528a22a14242d2d58a3

AUTOSAR(0)Qiita記事一覧, OSEK(75) https://qiita.com/kaizen_nagoya/items/89c07961b59a8754c869

なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2

言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4

プログラムちょい替え（0）一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394

TOPPERSまとめ　名古屋のIoTは名古屋のOSで
https://qiita.com/kaizen_nagoya/items/9026c049cb0309b9d451

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

官公庁・学校・公的団体（NPOを含む）システムの課題、官（０）
https://qiita.com/kaizen_nagoya/items/04ee6eaf7ec13d3af4c3

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

LaTeX(0) 一覧　
https://qiita.com/kaizen_nagoya/items/e3f7dafacab58c499792

自動制御、制御工学一覧（０）
https://qiita.com/kaizen_nagoya/items/7767a4e19a6ae1479e6b

Rust(0) 一覧　
https://qiita.com/kaizen_nagoya/items/5e8bb080ba6ca0281927

小川清最終講義、最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
### 文書履歴(document history)
ver. 0.01 初稿 20190521
ver. 0.02 標題追記 20190524
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
復活の呪文を実装してみた

# 復活の呪文とは

データを64種類のひらがなから成る文字列に変換し、紙などに記録する保存方式である。主に記録用電子媒体が存在しない環境で用いられた。

## 使用する文字

ぴったり64種類[^ぴったり]なので、6ビットの情報を表現できる。

> あいうえお　まみむめも　やゆ
> かきくけこ　らりるれろ　よわ
> さしすせそ　がぎぐげご
> たちつてと　ざじずぜぞ
> なにぬねの　ばびぶべぼ
> はひふへほ　ぱぴぷぺぽ

## 変換形式

* 元データを6ビットずつに分割（6ビットに満たない分は0を追加して6ビットにする）
* 変換表を使って各6ビットの値を変換

↓これが

```
abc
```

↓こうなって

```
01100001 01100010 01100011
011000 010110 001001 100011
```

↓こうなる

```
のぬこら
```


## って、これまんまBase64じゃん

> Base64は、データを64種類の印字可能な英数字のみを用いて、それ以外の文字を扱うことの出来ない通信環境にてマルチバイト文字やバイナリデータを扱うためのエンコード方式である。

単なる偶然ではなさそうですね？[^Base64]

# 実装してみる

## 使用する文字

理解も兼ねてクラス化してみた。復活エンコーダー。

```python:fukkatsu.py
class FukkatsuEncoder:
    __USABLE_CHARS = \
        'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほ' \
        'まみむめもらりるれろがぎぐげござじずぜぞばびぶべぼぱぴぷぺぽ' \
        'やゆよわ'
```

## 復活の呪文に変換する

内部で2進数を表現する「文字列」に変換しているので、わかりやすい代わりに効率は悪い。

```python:fukkatsu.py
def encode(self, raw: bytes) -> str:
    b = ''.join(map(lambda c: format(c, '08b'), raw))
    # ６の倍数になるようゼロ埋めする
    b += '00000'
    b = b[0:-(len(b)%6)]
    # 連番が偶数となる要素は空文字なので除外する
    encoded = ''.join(map(lambda c: self.__USABLE_CHARS[int(c, 2)], \
                          re.split('(.{6})', b)[1::2] \
    ))
    return encoded
```

## 復活の呪文から元データを復元する

### なんか動かない

```python:fukkatsu.py
def decode(self, encoded: str) -> bytes:
    b = ''.join(map(lambda c: format(self.__USABLE_CHARS.find(c), '06b'), \
                    encoded))
    # ８の倍数に満たない場合、末尾は捨てられてしまうので問題なし
    raw = ''.join(map(lambda i: chr(int(i, 2)), \
                  re.split('(.{8})', b)[1::2]))
    return raw
```

`decode()`の引数に「あいう」を渡すと以下のエラー。

> UnicodeEncodeError: 'cp932' codec can't encode character '\xe3' in position 0: illegal multibyte sequence

### 文字列とバイト列は別物

バイトを文字に変換`chr()`してから結合`join()`しているので、マルチバイト文字の場合がダメでした。ここはバイト列`bytes()`を作ってから、必要に応じて文字列に変換するのが正解。

```python:fukkatsu.py
    raw = bytes(map(lambda i: int(i, 2), \
                re.split('(.{8})', b)[1::2]))
```

# ソースコード

Gistに置いておきました。`decode()`のバグっていたリビジョンも残してあります。
https://gist.github.com/cress-cc/985dc5923686e21f19ee14a57129ade4

# これは何の役に立つのか

何の役にも立ちません。

[^ぴったり]: 一般人には伝わらない感覚
[^Base64]: [Base64 - Wikipedia](https://ja.wikipedia.org/wiki/Base64)
[現在非推奨] Unityでオンラインゲームを作るためのライブラリ、UniP2Pの紹介

# 現在開発中止につき非推奨です
(追記 2020/01/24)
UniP2Pは開発を中止します。リアルタイム通信ライブラリとしてUniQUICを今後制作します。

(追記 2021/04/23)
今のところ、この記事の用途を求めている場合は、Mirrorのwebrtcパッケージが割と有効ではないかと考えています。
Steamにリリースする場合ですと、MirrorのSteam Networkingを使うパッケージがあるので、その使用を推奨します。

# [UniP2P](https://github.com/unip2p/unip2p)とは
UniP2PはUnityにおけるリアルタイムネットワーク通信をもっとラクに実現し、民主化しようという試みから始まったプロジェクトです。マッチング以外の処理をP2P(サーバーを使わない端末間の通信)で行うことで、低遅延かつ、サーバーに負担がかからない仕組みになっています。

MITライセンスで公開しておりマッチングサーバーに対しての同時接続数にライセンス的な制限もありません。
現在確認している対応プラットフォームは、Windows,Mac,Linux,Androidとなっており、クロスプラットフォームでの通信が可能になっています。
iOSは動くとは思うんですがストアの審査の関係で今はまだ通るかは怪しいです。（人柱募集中）
将来的にはWebGLでも使えるようにWebRTCでの実装もする予定です。
小規模オンラインゲーム開発の民主化を行うことを目標に掲げています。

# 機能一覧
- オブジェクトの同期
- NetworkInstantiate
- NetworkDestroy
- RPC -Remote Procedure Call-
- ルーム作成、参加
- パケットの暗号化(AES128)
- 鍵交換　(RSA PBKDF2) 
- NAT Traversal　(STUN)
- デバッグするためのエディタ拡張

# 注意点
P2P通信の性質上ネットワーク環境、特にファイアウォールやNAPTによって通信出来ない場合があります。
リレーサーバーを実装されるまでは、通信可能環境を100%に近づけることが難しいです。その点をご留意ください。
通信出来ない環境のときにエラーを出すPrefabがあるので、それをゲームに組み込むことを推奨します。

#チュートリアル
##UniP2Pの導入方法
https://qiita.com/ChujoHiroto/items/53a7a99a6aa32b5c8b64

##マッチングサーバーの建て方
https://qiita.com/ChujoHiroto/items/8f09d65add2d521204c2

##準備中...

##導入方法
Githubよりダウンロードできます。いくつか依存しているライブラリもあるので、READMEを読んでダウンロードしてください。
https://github.com/unip2p/unip2p

UPM(Unity Package Manager)による依存ライブラリも含めたインストール方法も準備中です。

##マッチングサーバーの建て方
自身でマッチングサーバーを建てる必要がありますが、
サーバーに関する知識がなくてもクラウド上で導入、管理できるようなものを用意しています。

https://github.com/unip2p/SimpleMatchingServer-Node

## チュートリアル
準備中...
## 完成品プロジェクト
###P2P Tanks
UNET Tanks DemoのUniP2P移植版です。
完全な移植が完了次第別リポジトリに分離します。
UniP2Pのパッケージに同梱されています。
https://github.com/unip2p/unip2p

# 実装予定
おおよそ上から順番に実装していきます。

- パケットの再送処理、順序制御
- SyncComponentの追加 (Animator etc...)
- Roomの検索
- LAN Only P2P Matching
- Large Packet Transfer
- STUN IPv6対応
- Relay Matching Server
- Template Game Project
- Voice and Video Chat
- WebGL(WebRTC and Skyway)
- WebGL over UniP2P

# まとめ
個人でUnityでリアルタイムネットワーク通信をする際にどうにもベストプラクティスがないように思えて製作しました。

UNETは公式がグッバイ、ConnectedGamesは一年経っても暗号化されない...、Photonはリレーサーバ経由が必須でバズった時とかLAN内環境に非対応、Mirrorはイケてる。その辺のライブラリのいいとこ取りをしたものが欲しかったのです。
サーバーレスでNAT越えする時はちゃんとやって、LAN内だと外を経由せずに通信する。後は自分でソースコードが弄れればどうとでもなる設計。その辺を目指して作りました。
今後急務なのは、再送処理とチュートリアル。他の機能は最悪各自で実装してくれ！
ついでにPullRequestを投げてくれれば、Good Job！
後はLAN内探索があればマッチングサーバーを建てることなく閉じた環境で使えます。

このライブラリは現在(2019/05/21時点)α版です。そのため不具合や機能不備等があります。
玄人の方はぜひIssueやPullRequestを送っていただけると有難いです。
51歳からのプログラム　備忘　eloquent データ登録 save()

$model->fill($param)->save();
--
で、よくしてしまう`save();`の用法ミス。

何度も迷走するところ
試行錯誤して時間をかけてしまうので備忘メモ。

間違コード
--
```php:
$param[1]=['氏名'=>'山田','住所'=>'北海道','職業'=>'会社員'];
$param[2]=['氏名'=>'佐藤','住所'=>'佐賀','職業'=>'主婦'];
$param[3]=['氏名'=>'三田','住所'=>'千葉','職業'=>'会社員'];
$param[4]=['氏名'=>'井上','住所'=>'長野','職業'=>'自営業'];
$param[5]=['氏名'=>'田中','住所'=>'山口','職業'=>'会社員'];

$model=new Model;// Modelのインスタンス生成　<-　ここが間違い箇所
foreach($param as $key => $value)
{
$model->fill($value)->save();
}
```
結果は、models（DBテーブル）に一行追加されただけ。
<br>
$modelインスタンスは、
models（DBテーブル）の一行分のデータフィールドを操作するインスタンス。
newすることで、新しいデータフィールドを作成して、それをインスタンスで操作する。
<font color="red">newが一度だと、新規に作成する一行しか操作できない</font>。
（一行分のインスタンスしか生成されてない）

<br>
上記のコードでは、newは一回だから、
foreachで配列を5回まわしても、
一行のmodels（DBテーブル）に対してしか操作できてない
<br>
5行分のmodels（DBテーブル）フィールドを操作するには
5回newしないとね！

修正
--
```php
foreach($param as $key =>$value)
{
  $model=new Model;
  $model->fill($value)->save();
}
```
自分用勉強メモ10日目

# tips

## ブラウザでUser Agentを変更したいとき

CTFの問題を解いていて，User AgentをGooglebotに偽装したかった．
Firefoxだとアドオンを入れる必要があるらしい．
Chromeで変更する手順を見つけたので参考にした．

参考：[Google ChromeでUserAgentを変更する](https://qiita.com/pepo/items/565f0a8b9bd277cfb4ec)

1. Developer Toolsを開く (右クリックで「検証」)
2. More ToolsからNetwork conditionsを開く
3. select automaticallyのチェックを外す
4. 好きなUserAgentに変える

## Ubuntu19.04でvimのシンタックスハイライトが機能しなかった

Ubuntuが最小構成でインストールされていた場合，Vimも最小構成になっていた．
自分の場合はaptでVimをインストールし直したらシンタックスハイライトが使えるようになった．

```bash
# apt install vim
```

# 調べた知識

## バイナリ解析で役に立つツール

### pwntools

CTF用のPythonライブラリ．
`pip install pwn`でインストールできる．
p32という関数を使えば，数値を32bitのリトルエンディアンに変換してくれる．
例：p32(0x11223344)

### checksec

実行ファイルのセキュリティ機構を表示してくれるシェルスクリプト．
以下からダウンロードできる．
[slimm609/checksec.sh](https://github.com/slimm609/checksec.sh)

### gdb-peda

gdbの拡張版．
以下からインストールできる．
[longld/peda](https://github.com/longld/peda)

### readelf

Linuxのコマンド．
ELFの情報を表示する．

### rp++

実行ファイル中のROP Gadgetを表示する．
以下からダウンロードできる．
[0vercl0k/rp](https://github.com/0vercl0k/rp)

## ELFのセキュリティ機構

### RELRO(RELocation Read-Only)

ELFのセクションを読み込み専用にする．
以下の2つがある．

- Partial RELRO
- Full RELRO

GCCのデフォルトではpartialになっている．
partialであればGOT上書き攻撃が可能．

### カナリア

SSP(Stack Smashing Protector)というものがある．
ローカル変数とリターンアドレスの間にカナリア(canary)と呼ばれる値を設定し，関数終了時にそれが変更されているかどうかをチェックする．
これにより，スタックオーバーフローが発生していないか確認できる．

### NXビット(No eXecute)

メモリをコード領域とデータ領域に分け，後者に特別なビットを付与し，実行されることを防ぐ．
WindowsではDEP(Data Execution Prevention)という．

### PIE(Position-Independent Executable)

実行コード内のアドレス参照をすべて相対アドレスで行う．
これにより，実行ファイルがメモリ上のどこに展開されても正常に実行できる．

#### ASLRとの違い

ランダム化する部分が異なる．

- ASLR: 共有ライブラリやスタック
- PIE: 実行ファイル
RPAでやれることを増やしていく　「RPAって何？」

#新卒がRPAエンジニアを目指す話

新卒でRPAエンジニアになってしまったyusukeです。
ちまたで有名なRPAのエンジニアとして、５月から頑張ってねと
配属が決まったので、せっせとRPAについて勉強してます。

でもまて、RPAって日本語の資料すくなくない？ということで、
IT未経験の僕がRPAエンジニアになって、ロボを書く話をupしていきます。

##RPAって何？

「あーRPAってよく聞くけど、要はあれでしょ自動化できるやつでしょ？」

そんな感じのやつですね、結構いろいろな情報がたくさんでてますが、
PCの操作を代替してくれるやつみたいな認識でいいのかなと思います。

##UiPathacademy　Foundation
RPAエンジニアが避けては通れない鬼門が、これですね。
このコースだけで１３レッスンあり１つ１つの内容が結構濃いです。

実際に、いろいろな演習があるのでRPAエンジニアを目指す人はぜひ、


##UiPath Studio

さて、実際にRPAを作っていくわけですが、その時に使うのがUiPath Studioです。
ほかにもありますが、これが結構メジャーではないかなと思います。

実際にRPAはエンジニアじゃなくても使えるというのが、謳い文句ですが、どうなのでしょうか？

こんな感じです。
　　　　　　　　　　　　　　<img width="171" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416305/e47a7931-ac72-8628-84a1-d297a0d3bd26.png">


なんか変な図形がいっぱい並んでますね。

まあエンジニアでないとかけないというのは、個人的には間違ってないですね。
ただ、変数の知識とかエンジニアの要素が完全に０ではないです。

##まとめ
RPAってこんな感じなんやなみたいなのがメインでしたが、正直まだよくわかってないのが感想です。まだまだ日本語の資料も少ないのでこれから増やしていけるようにしていきたいと思います。
【SigV4対応】AWS CLI アップグレード方法

# はじめに

AWS S3署名バージョン２が廃止される予定です。
そこで実際に行った対応について、簡単に残しておきます。

具体的にいうと、あるEC2インスタンス内で利用している
AWS CLIのバージョンが古かったため、最新版にアップグレードしました。

# どんな対応が必要？

まず、AWSドキュメントを読んでみます。

[Amazon S3 の AWS 署名バージョン 2 がオフ (廃止)](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingAWSSDK.html#UsingAWSSDK-move-to-Sig4)

このうち、AWS CLIに限った部分を抜粋します。

| この SDK または製品を使用する場合 | この SDK バージョンにアップグレード |Sigv4 を使用するために、クライアントでコード変更が必要ですか。 |
|-----------------:|------------------:|------------------:|
| AWS CLI       | 1.11.108 にアップグレード |  はい |

これを要約すると、下記のようになります。

**AWS CLIが【1.11.108】より古いバージョンの場合、
S3へのAPIリクエストが「署名バージョン2」になっているため、アップデートが必要になる。**

-----

ちなみに、現在のS3署名バージョンを確認する方法は、
下記の記事を参考にさせていただきました。

[Athena で S3 署名バージョン２の利用状況レポートを作成する](https://blog.jicoman.info/2019/03/s3-sigv2-research-using-athena/)


# 対応（pip install --upgrade awscli）

OS別に対応を記載します。

## Amazon Linux
[Amazon Linux に AWS CLI をインストールする](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-linux-al2017.html)

```
# aws --version
# pip install --upgrade awscli
```

Amazon Linuxの場合、これだけで済みます。とっても簡単。

## CentOS
[Linux に AWS CLI をインストールする](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-linux.html)

CentOSの場合、ひと手間かかってしまいます。

```
# aws --version
# pip install awscli --upgrade --user
```

ここまでは、Amazon Linuxとあまり変わらず。

```
# export PATH=~/.local/bin:$PATH
# source ~/.bash_profile
```
環境変数を設定すると、awsコマンドが使えるようになります。

```
# vi ~/.bash_profile
# source ~/.bash_profile
```
**.bash_profile** を直接変更しても問題ありません。

# 他の方法（シンボリックリンク設定）

「環境変数を変更するのは嫌だ」という方は
元々の場所に新規ファイルのシンボリックリンクを設定することで、解決します。

実際に`/usr/bin/`に **aws** が置かれているEC2インスタンスで、下記を実施しました。

#### 前提
- aws-cliは、pipではなくzipファイルでインストール済み。
- OSは、CentOS 6.8。

```
# which aws
/usr/bin/aws
```

`/usr/bin/`に **aws** があります。

```
# pip install awscli --upgrade --user
```

pipコマンドで、**AWS CLI**をアップグレードします。

```
# find / -name aws
/root/.local/bin/aws
/usr/bin/aws
```

`/root/.local/bin/` に新しい **aws** が作られます。

```
# mv /usr/bin/aws /usr/bin/aws.bak
# ln -s /root/.local/bin/aws /usr/bin/aws

# ls -la /usr/bin/aws
lrwxrwxrwx 1 root root 20  5月  8 15:00 2019 /usr/bin/aws -> /root/.local/bin/aws
```

古い **aws** をバックアップ用として残しておき、
シンボリックリンクを設定して、新しい **aws** に置き替えます。

この方法だと環境変数を変えることなく、新しいAWS CLIを利用することができます。

# 参考
- [Amazon S3 の AWS 署名バージョン 2 がオフ (廃止)](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingAWSSDK.html#UsingAWSSDK-move-to-Sig4)
- [Athena で S3 署名バージョン２の利用状況レポートを作成する](https://blog.jicoman.info/2019/03/s3-sigv2-research-using-athena/)
Udacity: ES6 JavaScript Improved メモ③-2

UdacityのES6 - JavaScript Improvedコースを、受講しながらメモしていきます。
<font color="PaleVioletRed">*Lesson3 Built-ins*</font>

長くなったので分割しました。

##Map
Mapはキーと値のペアで構成される点で、オブジェクトに似ている。
（Setはどちらかというと配列に似ている。）
`set()`メソッドを使用して、キーと値のペアを格納できる。

```example.js
const employees = new Map();

employees.set('james.parkes@udacity.com', { 
    firstName: 'James',
    lastName: 'Parkes',
    role: 'Content Developer' 
});
```

1つ目の引数にキーを、2つ目の引数に値を渡す。
変数employeesには、james.parkes@udacity.comというキーで、オブジェクトを格納している。
またSetと同じく、`delete()`メソッドや`clear()`メソッドを備えている。

値の取得には`get()`メソッドを使用する。引数にはキーを渡す。

ループにはSetで使える方法に加えて`forEach()`メソッドが使える。

##Promises
非同期処理を操作できる。
`new Promise()`とすることで書き始められる。
引数には非同期で行いたいfunctionを渡す。
このfunctionは`executor`と呼ばれ、引数に`resolve`関数と`reject`関数を受け取る。
executor関数はresolveとrejectを受け取り、Promiseが実装されるとすぐに実行される。

```example.js
new Promise(/* executor */function (resolve, reject) {
    window.setTimeout(function createSundae(flavor = 'chocolate') {
        const sundae = {};
        // request ice cream
        // get cone
        // warm up ice cream scoop
        // scoop generous portion into cone!
        resolve(sundae);
    }, Math.random() * 2000);
});
```
executor は非同期の作業を開始して、完了した際にresolveもしくはrejectのいずれか一方を呼び出す。
`resolve`は、成功した場合。
`reject`は失敗した場合。

詳しくは[JavaScript Promises](https://www.udacity.com/course/javascript-promises--ud898)コースで。非同期通信を使ったアプリを作れるらしい。

##Generators
通常、functionは一度呼ばれると、処理が終了するまで止めることはできない。
これを可能にする新しいfunctionが`generator functions`である。

```example.js
function* getEmployee() { //functionの後ろに * をつける
    console.log('the function has started');

    const names = ['Amanda', 'Diego', 'Farrin', 'James', 'Kagure', 'Kavita', 'Orit', 'Richard'];

    for (const name of names) {
        console.log( name );
    }

    console.log('the function has ended');
}
```

ジェネレータ関数が呼ばれると、処理は実行されずに、iteratorを返す。
getEmployee関数で見ると…

```example.js
const generatorIterator = getEmployee(); // 処理は実行されずにiteratorを変数に格納している
generatorIterator.next(); // 処理を実行
```

`.next()`メソッドを使うことで関数の処理を実行できる。
next()で実行されているジェネレータ関数の中で処理を一時停止させるには、`yield`キーワードを使う。

```example.js
function* getEmployee() {
    console.log('the function has started');

    const names = ['Amanda', 'Diego', 'Farrin', 'James', 'Kagure', 'Kavita', 'Orit', 'Richard'];

    for (const name of names) {
        console.log(name);
        yield; // yieldを追加
    }

    console.log('the function has ended');
}
```

getEmployee関数を実行すると（generatorIterator.next()）、Amandaが表示されて処理が一度終了する。
再度実行すると、今度はDiegoが表示されて処理が一度終了する。
このようにジェネレータ関数は、**前回停止した箇所を覚えておける**。

next()に引数を渡すと、ジェネレータ関数内のyieldにセットされる。

yieldキーワードは関数の一時停止と、ジェネレータ関数へデータを渡す２つの役割を持つ。
日本の働き方改革とICT企業について

※このサイトの掲載内容は私個人の見解であり、必ずしも私が所属する会社、組織、団体の立場、戦略、意見を代表するものではありません。

現在、働き方改革が叫ばれる中で、不夜城などと呼ばれてガムシャラに働くことで日本企業の強みを考える暇も無く突っ走ってきた日本ICT企業・技術者は、日本企業の強みを改めて考える必要があるのではないでしょうか？

高齢化が進む日本において、外国籍の方・身体障害者・女性が活躍できる社会を作ることが必要で、不当な過重労働を強いられていた仕事現場の改善も必要と思います。
しかし、日本のICT企業、特にソフトウェア企業にとっては、色々と考えるべき事があると思っています。

# 技術革新スピード
自動車などのモノを扱う世界では、アイデアがあっても材料の調達、流通方法の確保などビジネス展開は容易ではありませんが、ソフトウェアの世界では原資は開発者の工数のみであり、一度作ってしまえば後は展開するだけです。インターネットが発達した現代では流通方法の確保も容易で、開発費が回収できればその後は利益になります(修正の作成など保守費用は必要ですが)。

また、自動車などの機械の故障は、人身事故・火災など目に見える重大問題につながるリスクが高く、故障に対する備え(スペアの用意など)も限界があります。
一方でソフトウェアの故障は、活用範囲が広がりつつある現代では自動車の自動運転など人身事故などの重大問題につながるリスクも高まりつつありますが、リスクは低く目にも見え難いと言えます。ソフトウェアはコピーが容易なので、コピーを複数用意して冗長化して異常に備えることも容易です。
このため、品質の善し悪しも見え難く、これが技術発展の加速を後押ししていると言えます。

# 海外ICT企業との違い
ICT産業において日本と米国では、ICT技術者の所属に大きな違いがあると言われます。
日本はICTベンダが抱える技術者が多く、米国はユーザ企業が抱える技術者が多いと言われます。例えば、銀行システムを想定すると、日本ではICTベンダにSIを依頼してシステムを構築します。米国では銀行側が雇用する技術者がシステムの構築を行うということです。

この違いが働き方改革にどのような影響があるでしょうか？

# ソフト業界が抱える課題
ソフト業界では、日々変わる技術の習得に追われています。技術習得が次のシステム構築に向けた事前技術リサーチとも言えるし、今後の業務に備えた自己啓発とも言えます。
働き方改革が始まる前は、自己啓発と業務の境目を考えることはなく、技術の習得は業務に必要なこととして残業時間に実施すれば良く、その努力は残業手当として報われたのです。
しかし、働き方改革で残業規制が始まると、この技術習得は業務に必須なのか自己啓発なのか厳密に考える必要があります。緊急の顧客対応でなければスケジュールを調整し残業時間を削減するように指導されるため、残業時間に技術習得に時間をかけるのが難しいのです。
また、日本企業は給料の差が大きくなく、技術力を高めてもそれが給料の差に表れ難く、残業手当という形に表れなくなると、技術力を上げるモチベーションの維持が難しい状況にあります。

更に海外ではユーザ企業に技術者がいるため、ユーザ企業がプロジェクトの必要に応じて技術者を集め、プロジェクトが終われば技術者は別企業に活躍の場を求めるようです。
このような状況では、技術者は自分の価値を高めるためには、どの企業でも通用する標準技術で、新技術を習得していることが求められます。このため、新たな技術習得に対するモチベーションが元々高い世界ということになります。
一方でICTベンダの技術者が多い日本では、終身雇用が基本で、新たな技術習得よりも、ICT企業の慣習を学ぶことの方が重要視される傾向にあります。
このため、日本ICT企業ではもともと新技術習得の優先度が下がる傾向があるのです。

日本人独特の特徴も影響すると思います。
日本の良さは周囲への気遣いやチーム力、最近では悪い意味で言われる忖度や空気を読むことも、そういった日本独特の美徳の裏返しであり、必ずしも悪いことではないと思います。
周囲が頑張っているから自分も頑張ろう、あの人が忙しいから代わりにこの作業をやってあげよう、特に指示されたわけではないけどこの作業をやっておこうなど、明確に言葉や文章に示されていないことでも周囲の状況を察して作業を実施します。周囲に頑張っている人がいれば、自分を犠牲にして頑張っている人をサポートすることがチーム力につながっていると思っています。
しかし、働き方により、残業時間が削減され、仕事仲間と一緒に活動する時間が少なくなるとどうなるでしょうか？

このように考えた場合、日本ICT企業における働き方改革は、教育現場の失敗として語れる**ゆとり教育**に通じる部分があると考えてしまいます。
義務教育での詰め込み教育を改善し、教育時間を削減したり、総合という科目を用意し生徒の自主性を重視するような取り組みが行われました。
しかし、現在ではその教育は見直され、ゆとり教育を受けた世代は**ゆとり世代**と呼ばれたりしています。現在の働き方改革を日本ICT業界にこのまま推し進めれば、日本のICT現場の技術力は低下し、ゆとり教育の二の舞にならないでしょうか。

それでは、日本ICT企業における働き方改革はどう進めれば良いでしょうか？

上述のように高齢化が進む日本において働き方改革は必要だと思います。
高齢化が進まなくても多様な人が活躍できる環境作りは必要です。
残業を苦にしない人にとっては、残業したい人は残業すれば良く、早く帰りたい人は早く帰れば良いと思ってしまいます。しかし、上述の日本人の特徴から、残業している人がいれば空気を読んで早く帰れる人も帰らなくなってしまうのです。このため、残業規制は必要だと思います。（ただ、ジタハラという言葉もあるので、上司は注意が必要です。）
ただ、それに合わせて、以下のような技術力を高めた人・技術力を活用したい人を企業が認めてあげる取り組みが必要と思われます。

*複業の許可
ちなみに従来の本業に対する副業ではなく、本業を複数持つ複業という言葉が注目されているのはご存じでしょうか？空いた時間を有効活用して小遣い稼ぎをするイメージが大きい副業に対し、本業と同様に自分の能力を生かしてプロ意識が必要となる仕事を複数持つのです。残業時間に仕事をしたければ、別の仕事で活用すれば良いという考えです。書籍の執筆活動やYouTubeでの技術の動画配信などもそれに該当するでしょうか。
その別の仕事で得た知見が、別の本業にもプロジェクトに新たな視点のアイデアを与えて役に立つことも多々あるでしょう。

*教育機会の提供とサポート
教育を受ける機会を与え、その教育を受けることを積極的にサポートします。

*各種認定を受けた技術者の推奨
教育を受けて認定を受けた技術者を奨励金などによりサポートすることも有効だと思います。

また、ICTベンダの技術者が多いということは、ICTベンダに技術が集中しているとも言えます。ただ、縦割り組織で企業内のチーム間・部署間の交流が少ないと宝の持ち腐れです。企業内での技術交流を活性化する取り組みも合わせて実施が必要だと思われます。

#最後に
ICT技術の現場もスポーツで例えるならば日本は個々のフィジカルの差を、チーム力で賄うことが重要だと思っています。そのためには残業規制で個々の生活を尊重するだけでなく、個々の能力を積極的に認めて、その能力を発揮する機会を与えることが必要だと思います。
Dockerはコンテナ内プログラムの終了ステータスもホスト側に渡してくれるよというお話

タイトルの通りです。実際に確認してみましょう。
Pythonのコンテナを立ち上げて、終了ステータスを`114`に設定して終了させてみます。

```sh
$ docker run -it python  # pythonコンテナを起動
Python 3.7.3 (default, May  8 2019, 05:28:42) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit(114)  # 終了ステータスを114に設定してPythonを終了させる


$ echo $?  # 終了ステータスを見てみる
114
```

無事にホスト側で終了させるを確認してみると、`114`となっていますね。
MacでHumanEva Datasetを解凍する


## 概要
[HumanEva Dataset](http://humaneva.is.tue.mpg.de/datasets_human_1)を解凍するとき詰まったので備忘録に
なお環境はMacOS

## 手順
まず[HumanEva Dataset](http://humaneva.is.tue.mpg.de/datasets_human_1)からOSに合ったものをダウンロード(MacOSならLinux)
なぜかPart15のリンク先がPart25になってるので注意

README通り次のコマンドで解凍しようとすると失敗する

```sh
$ tar -x -M --file=HumanEvaI_Data_CD1.tar
```

次のコマンドでバージョンチェックするとbsdtar(FreeBSDのtar)がインストールされている

```sh
$ tar --version                                                                                                                                                  
bsdtar 2.8.3 - libarchive 2.8.3
```

どうもbsdtarが分割アーカイブをサポートしてないらしいので、代わりにgnutarを使う
次のコマンドでインストール

```sh
$ brew install gnu-tar
```

あとは次のコマンドで解凍

```sh
$ gtar -x -M --file=HumanEvaI_Data_CD1.tar
n HumanEvaI_Data_CD2.tar
n HumanEvaI_Data_CD3.tar
n HumanEvaI_Data_CD4.tar
n HumanEvaI_Data_CD5.tar
n HumanEvaI_Data_CD6.tar
n HumanEvaI_Data_CD7.tar
n HumanEvaI_Data_CD8.tar
n HumanEvaI_Data_CD9.tar
n HumanEvaI_Data_CD10.tar
n HumanEvaI_Data_CD11.tar
n HumanEvaI_Data_CD12.tar
n HumanEvaI_Data_CD13.tar
n HumanEvaI_Data_CD14.tar
n HumanEvaI_Data_CD15.tar
n HumanEvaI_Data_CD16.tar
n HumanEvaI_Data_CD17.tar
n HumanEvaI_Data_CD18.tar
n HumanEvaI_Data_CD19.tar
```

無事に解凍ができた
Desktop : OpenCV Merge Two Images In Any Shape

<h5>Goal</h5>
Test OpenCV merge two image with ROI.

```OpenCV_MergeTwoImgAnyShape.java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import java.util.ArrayList;
import java.util.List;

public class OpenCV_MergeTwoImgAnyShape {

    public static void main( String[] args )
    {
        try{
            System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
            //大圖(母圖)
            Mat source = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\ncku.jpg",Imgcodecs.CV_LOAD_IMAGE_COLOR);

            //小圖(子圖)
            Mat source1 = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\jelly_studio_logo.jpg",Imgcodecs.CV_LOAD_IMAGE_COLOR);
            Mat destination=source.clone();


            // to make the white region transparent
            Mat mask2=new Mat();
            Mat dst=new Mat();


            Imgproc.cvtColor(source1,mask2,Imgproc.COLOR_BGR2GRAY);
            Imgproc.threshold(mask2,mask2,230,255, Imgproc.THRESH_BINARY_INV);
            List<Mat> planes = new ArrayList<Mat>() ;
            List<Mat> result = new ArrayList<Mat>() ;
            Mat result1=new Mat();
            Mat result2=new Mat();
            Mat result3=new Mat();


            Core.split(source1, planes);

            Core.bitwise_and(planes.get(0), mask2, result1);
            Core.bitwise_and(planes.get(1), mask2, result2);
            Core.bitwise_and(planes.get(2), mask2, result3);

            result.add(result1);
            result.add(result2);
            result.add(result3);
            Core.merge(result, dst);
            //以上白色變透明


            //再把小圖copy到大圖
            Rect roi=new Rect(50,50,90,62);//不能比原圖大,及小
            Mat destinationROI = source.submat( roi );
            dst.copyTo( destinationROI , dst);


            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\merge3.jpg", source);
        }catch (Exception e) {
            System.out.println("error: " + e.getMessage());
        }
    }
}
```
<h5>Result</h5>
![merge3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/e53a6c2a-c152-a26b-4dce-9aab9230c576.jpeg)