OmniAICreator/Qiita-1.07M huggingface dataset:
シェルでtry～catchをやろうとしたら、それっぽい書き方になった

模擬的にエラーを起こすスクリプトを用意する

```error.sh
#!/bin/bash
exit 1
```

例外処理を呼びたいスクリプト

```like_try_catch.sh
set -e
function if_trap
{
    # エラーになった時の処理
    echo "TRAP ERROR" !
}
trap if_trap ERR
{
    # メインの処理
    /bin/bash error.sh
    echo "正常終了"
}
unset if_trap
```

```trap if_trap ERR```の後の```{ }```には特に意味は無い。
try～catchのある言語の```try{}```の中括弧にように見えるだけ。
（変数のスコープとかに影響しちゃう？）
SAP ERPの販売管理(SD)でよく使うトランザクションコード一覧

# 販売業務の流れ

受注　→　受注伝票の作成　→　出荷指示の作成　→　出庫

# トランザクションコード一覧

- VA01 受注伝票登録
- VA02 受注伝票変更
- VA03 受注伝票照会
- VL01N 出荷伝票登録
- VL02N 出荷伝票変更
- VL03N 出荷伝票照会
- VF01 請求伝票登録
- VF02 請求伝票変更
- VF03 請求伝票照会
- MD81 得意先独立所要量登録
- MD82 得意先独立所要量変更
- MD83 得意先独立所要量照会
- XD01 得意先登録
- XD02 得意先変更
- XD03 得意先照会
- VD06 得意先 削除フラグ設定
- FD32 得意先与信管理変更
- FD33 得意先与信管理照会
- VK31 条件レコード登録
- VK32 条件レコード変更
- VK33 条件レコード照会

# 終わりに

実際の業務ではEDIで連携されるためバッチ処理化して自動化している企業が多い。
過不足あれば、コメントください。
yarn.lockのconflict解消方法

[yarn](https://yarnpkg.com/lang/ja/)でJSライブラリのパッケージ管理を行っている場合、
しばしばbranch間でconflictする場合があると思います。

[dependabot](https://dependabot.com/)などでライブラリのバージョンアップをしたり、githubの脆弱性チェックなどで
yarn.lockを直接書き換えたりした場合などに発生したりします。

ただし、その場合でも手動でyarn.lockを編集することは[非推奨](https://yarnpkg.com/lang/ja/docs/yarn-lock/
)となっています。
（yarn.lock自体に正確なパッケージの依存関係が記載されているため、直接編集すると簡単に壊れる）

# yarn.lockのconflictを解消する

詳細は下記記事を参考にしてください
https://www.jakewiesler.com/blog/merge-conflicts-in-yarn-lock/

作業前にmasterを最新にしている前提です。
masterから派生したコンフリクトしているブランチで次のような作業を行うことで解消できます。

```sh
$ git rebase master
# ①masterブランチのyarn.lockにあわせる
$ git checkout master -- yarn.lock
# ②その後そのブランチの依存関係を解決（パッケージの再インストール）
$ yarn install
# ③rebaseを続ける
$ git add yarn.lock
$ git rebase --continue
# 再度conflictした場合は上の①②を行い、③を行う
FIN
```

# yarn.lockを直接編集する（脆弱性などの暫定対応）
ライブラリが参照している内部ライブラリが脆弱性があり、それに対してバージョンを上げたい場合があります。
その場合は手動でyarn.lock内の該当の依存ライブラリ部分を削除して再度`yarn install`します。

参考：
https://github.com/yarnpkg/yarn/issues/4986#issuecomment-395036563

例えば、package.jsonに記載されているjsonwebtoken（明示的な依存）が暗黙的に内部依存しているjws^3.0.0を脆弱なjws=3.1.4で解決している場合、代わりにパッチを適用したjws=3.1.5にアップグレードする必要があります。

yarn.lock内の下記のようなjwsのエントリを削除して再度`yarn`し直します。
そうすると間接的な依存関係と影響を受けるパッケージは、他のものに触れることなく更新されます（yarn v1.3以降で動作）

```
jws@^3.0.0, jws@^3.1.4:
  version "3.1.4"
  resolved "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2"
  dependencies:
    base64url "^2.0.0"
    jwa "^1.1.4"
    safe-buffer "^5.0.1"
```
VRChatで弾が打てる銃を作る

ワールド作成の話になります。
VRC SDKは準備しておいてください。
(SpawnObjectでどんどんオブジェクトを生成するこの方式では、DestroyObjectしていても重くなっていくので注意)

まずは適当にVRC_SceneDescriptorを配置
![0キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398685/bbae13a9-83a4-14d0-7702-46f99704358b.png)

##銃作成
次にGunという名前の空のGameObjectの子に、Cubeを2つ置いて銃を作成します。
このときX方向が銃の先、Z方向が銃の上となるようにします。
![1キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398685/70d5fb4b-9637-797b-b96b-3d94809a5980.png)

空のGameObjecyで銃口の位置を設定
![2キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398685/9640cb0e-c187-bda3-175a-dcea1fb75ec6.png)

空のGameObjecyでGripの位置を設定
![3キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398685/a862bcb6-9fcd-a291-8a56-b84404ff5780.png)

GunにVRC_PickupをAdd Componentします。
RigidBodyは勝手に付与されます。
設定は以下の通り。
![4キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398685/c5229d3e-5135-821f-c323-eb4207e67a3d.png)
VRC_Pickupについてはこちらのブログの方が詳しく書いてありました。
http://vrcprog.hatenablog.jp/entry/component-Pickup

GunにCollisionも追加します。
![5キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398685/0e2ca9be-2949-b23d-9643-ccac86ac6563.png)

##銃弾

次に銃弾を作成します。
単なるSphereです。
![6キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398685/30714e09-675b-7d4c-bfbd-2ec6350686b4.png)

RigedBodyとVPC_Triggerを追加します。
設定は以下の通り。
![8キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398685/62b97214-40e9-96e9-1eee-5e1c1c7b6506.png)

もし弾を一定時間後に消したければ、
以下のように同じOnSpawnを追加し、5秒後とかでDestroyObjectを発生させるようにします。
![9キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398685/fd02eddd-a394-13bb-f43f-b5cfee6c6133.png)

終わったらこれをPrefab化します。

##発射

発射できるようにするために、Gunの方に戻って、VPC_Triggerを追加します。
設定は以下の通り、Sphereは先程作ったPrefabです。Muzzleは銃口です。
![7キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398685/67627905-01a0-3888-2741-2417f9b96fa8.png)

これでいったん弾が撃てる銃は完成です。
この銃を使った、VRC_CombatSystemでプレイヤーにダメージを与えられるシステムについては、別で書こうと思っています。
次回は[こちら](https://qiita.com/void_vtuber/items/57143a59cbdf6e1bda0e)


## 環境
Unity 2017 4.2.8f1
VRC SDK 2019.2.5 (31 July 2019)
色に関する基本の'キ'


# 対象とする人
- デザイナー初心者
- 色使いに関する勉強を始めたいと思っている人
- デザインの基本に立ち返って考えてみようと思っている人

# 色には「3属性」がある

## 色相
![色相.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124751/a9cd6c4a-c2e4-5e8b-c729-0c0cba541591.png)
赤・黄・緑・青などの「色み」のこと

## 彩度
![彩度.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124751/2b8bc7a4-6192-33e0-0b8b-669ea4b06a0d.png)
　色の「鮮やかさ」のこと

## 明度
 ![明度.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124751/2747084d-e146-16d2-37fd-f4a055ac43ac.png)
　色の「明るさ」のこと

# 上手く使いこなしたい「有彩色・無彩色」

## 無彩色
![無彩色.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124751/63886f6f-091a-4a67-4659-d8dce09b8ce7.png)
　彩度が無い色（白・黒・灰色）

## 有彩色

![有彩色1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124751/c67c2672-d838-846a-a9f0-83260062b793.png)![有彩色2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124751/0df11939-ae4c-edaf-0880-1c5df5698f48.png)![有彩色3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124751/a0c08e68-78b6-0268-81a6-a9e2eef26740.png)
　彩度が***少しでも***ある色

# イメージを左右する「トーン」
## トーン
「トーン」＝ 明度 × 彩度
　明度と彩度からなる同じ「色の調子」の群
![トーン表.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124751/d5eb8a29-d286-5a4e-3670-fe3f83c43ca4.png)

## トーンが与えるイメージ
|略字|トーン名|読み方|イメージ|
|:--:|:--:|:--:|:--:|
|p|pale|ペール|楽しい、爽やかな|
|lt|light|ライト|明るい、陽気な|
|sf|soft|ソフト|やわらかい、優しい、穏やか|
|d|dull|ダル|鈍い、くすんだ、中間的|
|dk|dark|ダーク|暗い、大人っぽい、円熟した|
|s|srtong|ストロング|強い、情熱的な、動的な|
|dp|deep|ディープ|深い、伝統的な、和風な|
|v|vivid|ビビット|鮮やかな、派手な、目立つ|
Rails ActiveRecordの結合時のクエリの内容について

## 参考
以下のページを参考にさせていただきました。ありがとうございます。
[ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い](https://qiita.com/k0kubun/items/80c5a5494f53bb88dc58)
[【Rails】テーブル結合](http://cloudcafe.tech/?p=1471)

## データ構造

companiesテーブル

|id|name|
|:-- |:-- |
|1|A社|
|2|B社|

servicesテーブル

|id|company_id|name|
|:--|:--|:--|
|1|1|Aアプリ１|
|2|1|Aアプリ２|
|3|1|Aアプリ３|
|4|2|Bの野望|

## パターン１ all(pluckなし)

```ruby
companies = Company.all
companies.each do |company|
    company.services
end
```

```sql
SELECT `companies`.* FROM `companies`
SELECT `services`.* FROM `services` WHERE `services`.`company_id` IN (1,2)
```

## パターン2 : all

```ruby
companies = Company.all
companies.each do |company|
    model.services.pluck(:name).join(',')
end
```

```sql
SELECT `companies`.* FROM `companies`
SELECT `services`.`name` FROM `services` WHERE `services`.`company_id` = 1
SELECT `services`.`name` FROM `services` WHERE `services`.`company_id` = 2
```

## パターン3 : join

```ruby
companies = Company.joins(:services)
companies.each do |company|
    model.services.pluck(:name).join(',')
end
```

```sql
SELECT `companies`.* FROM `companies` INNER JOIN `services` ON `services`.`company_id` = `companies`.`id`
SELECT `services`.`name` FROM `services` WHERE `services`.`company_id` = 1
SELECT `services`.`name` FROM `services` WHERE `services`.`company_id` = 1
SELECT `services`.`name` FROM `services` WHERE `services`.`company_id` = 1
SELECT `services`.`name` FROM `services` WHERE `services`.`company_id` = 2
```

## パターン4 : preload

```ruby
companies = Company.preload(:services)
companies.each do |company|
    model.services.pluck(:name).join(',')
end
```

```sql
SELECT `companies`.* FROM `companies`
SELECT `services`.* FROM `services` WHERE `services`.`company_id` IN (1,2)
```

## パターン5 : includes

```ruby
companies = Company.includes(:services)
companies.each do |company|
    model.services.pluck(:name).join(',')
end
```

```sql
SELECT `companies`.* FROM `companies`
SELECT `services`.* FROM `services` WHERE `services`.`company_id` IN (1,2)
```

## パターン6 : eager_load

```ruby
companies = Company.includes(:services)
companies.each do |company|
    model.services.pluck(:name).join(',')
end
```

```sql
SELECT **省略** FROM `companies` LEFT OUTER JOIN `services` ON `services`.`company_id` = `companies`.`id`
```
docker,docker-composeでちょっと使うコマンド

## dockerで今あるやつみる

```sh
docker ps -a
docker images
```

## docker-compose buildが反映されてないっぽいとき

```rb
docker-compose build --no-cache
```

## 全部消したいとき

### container全削除
-fをつけたら強制的になる

```sh
docker rm `docker ps -a -q`
```

### image全削除
-fをつけたら強制的になる

```sh
docker rmi `docker images -q`
```

## 全部は消したくない系
例えば、今日の作業分全部いらないなってときに

### dockerで今日のcontainer全部消す
-fをつけたら強制的になる

```sh
docker rm `docker ps -a | grep -E "minutes?|hours?" | awk '{print $1}'`
```

### dockerで今日のimage全部消す
-fをつけたら強制的になる

```sh
docker rmi `docker images | grep -E "minutes?|hours?" | awk '{print $3}'`
```
メモ：住所から番地以下を除去する

この記事は
===

* 住所文字列から番地以下を除去して都道府県市区町村のみにしたメモです

コード
===

* いきなりですが結論です

```shrink_address.js
  function shrinkAddress(address){
    // nullは空文字で返却
    if(!address) return ""

    // 番地っぽい文字列を抽出する正規表現
    let pattern = /([0-9０-９]+|[一二三四五六七八九十百千万]+)*(([0-9０-９]+|[一二三四五六七八九十百千万]+)|(丁目|丁|番地|番|号|-|‐|ー|−|の|東|西|南|北){1,2})*(([0-9０-９]+|[一二三四五六七八九十百千万]}+)|(丁目|丁|番地|番|号){1,2})/
    let result = address.match(pattern)

    // マッチしたら番地よりも前の文字列を返却
    if(!!result){
      return address.substring(0, result['index'])
    } else {
      return address
    }
  }
```

テスト
===

* 半角、全角、漢数字、ハイフン、丁目などに耐久しています
* 地名に漢数字が混じっていても大丈夫でした

```js
shrinkAddress("東京都中央区銀座1-2-3")
"東京都中央区銀座"
shrinkAddress("東京都中央区銀座１−２−３")
"東京都中央区銀座"
shrinkAddress("東京都中央区銀座１の２の３")
"東京都中央区銀座"
shrinkAddress("東京都中央区銀座一丁目二番三号")
"東京都中央区銀座"
shrinkAddress("東京都北区十条1-2-3")
"東京都北区十条"
shrinkAddress("高知県四万十市中村1-2-3ハイツ高知102")
"高知県四万十市中村"
```

参照
===

* 下記記事をものすごく参考にしましたので、正規表現の詳細はこちらの解説をご参照していただければと
  * Rubyの埋め込み変数は今回は全て展開しています
* https://qiita.com/YSRKEN/items/5371e67950425ace6a73
Vue.jsでチェス盤を作ってみたら7行だった。

###チェス盤はなぜ白黒なのか
あの違い互いの白黒盤のせいでちょっと苦戦した話です。

一応チェスを後々作る前提でボードを作ってみました。

###今回のゴール
**1.見た目的にチェス盤と認識できるものを作る**
**2.今後チェスを作る前提の構造になっていないとダメ**

###†考察†
実際チェスを作るとなると必須となるのが、
64マスそれぞれに**座標**が備わっていること。

つまりこういうこと。

```js
[1-1, 1-2, 1-3, 1-4, 1-5, 1-6, 1-7, 1-8, 
 2-1, 2-2, 2-3, 2-4, 2-5, 2-6, 2-7, 2-8, 
 3-1, 3-2, 3-3, 3-4, 3-5, 3-6, 3-7, 3-8, 
 4-1, 4-2, 4-3, 4-4, 4-5, 4-6, 4-7, 4-8, 
 5-1, 5-2, 5-3, 5-4, 5-5, 5-6, 5-7, 5-8, 
 6-1, 6-2, 6-3, 6-4, 6-5, 6-6, 6-7, 6-8,
 7-1, 7-2, 7-3, 7-4, 7-5, 7-6, 7-7, 7-8,
 8-1, 8-2, 8-3, 8-4, 8-5, 8-6, 8-7, 8-8]
```
X軸とY軸の数値を合わせてるような感じ。

この配列を作るだけであれば簡単。

```js
    let board = [];
    for(let x = 1; x < 9; x++) {
      for(let y = 1; y < 9; y++) {
        board.push(x + "-" + y)
      }
    }
```

8×8のループを行えば一瞬でできてしまうので、
Vue.jsでレンダリングするとしても、v-for="n in 8"を二回やればいいだけ。

将棋であればここで完成。
だがしかし、チェス盤となると少しやっかい。

白**黒**白**黒**白**黒**白**黒**
ときて、
今度は
**黒**白**黒**白**黒**白**黒**白

**！**

まあ冒頭でも言ってますが、
つまり、1行目と2行目だと、1列目の色が**反転**しているということです。

えらいこっちゃ～～～となっていろいろ考えて
しばらくしてやっとこちらの文系エンジニアも気づきました。

**「奇数行と偶数行で出し分けすればいいんだ」**

つまりはこういうこと。

```vuejs
  <div class="board">
    <div v-for="x in 8">
      <div v-for="y in 8">
        <div 
         v-bind:class="(x + y) % 2 == 0 ? 'square-black' : 'square-white'" 
         :id='`${x}-${y}`'
        >
        </div>
      </div>
    </div>
  </div>
```

![FireShot Capture 010 - chess_board - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469924/73130ad2-d6f3-6592-b28a-50b47d7c148d.png)


おぉ～～～できた！

ちゃんとそれぞれidも1-1から8-8まで振れている。
そしてなによりコードがかなり短く収まった！！

###一応解説
8回ループを二回するまでは同じ、
そしてそこからは、一回目のループxと二回目のループyそれぞれの値でv-if使って出し分け。

xの一回目とyの一回目であれば1と1になるので、
合計が**2**、**偶数**なので黒スタート。

xの二回目とyの一回目であれば2と1になるので、
合計が**3**、**奇数**なので白スタート。


###最後に
座標もしっかり入っているので、
チェス作りの道も開けたといった感じですね。

筆者はこういう閃きみたいなのが圧倒的に**欠如**している
文系エンジニアなので時間はかかったものの、
法則を見つけて何かをスッキリ書くのはよだれが出てくるぐらい好きです。

いつになるかわからないですが、
次はチェスの動きの部分を投稿したいです。

スタイルも含めたコードを載せておきます。

```vue:Board.vue
<template>
  <div class="board">
    <div v-for="x in 8">
      <div v-for="y in 8">
        <div 
         v-bind:class="(x + y) % 2 == 0 ? 'square-black' : 'square-white'" 
         :id='`${x}-${y}`'
        >
        </div>
      </div>
    </div>
  </div>
</template>

<style scoped>
.board {
  width: 640px;
  height: 640px;
  border: 4px solid black;
}

.square-black {
  width: 80px;
  height: 80px;
  background-color: black;
  float: left;
}

.square-white {
  width: 80px;
  height: 80px;
  background-color: white;
  float: left;
}
</style>

```

**追記：**
もともと、v-ifとv-else使ってdomを出し分けしようと書いていたのですが、v-bind:classを使えばDOMが一つにまとまると思い、修正しました。
なので、

**＼8行から7行に変わりました／**

そもそも、出し分けするとはいえ、全く同じidを両方に振っていたのもなんだが危なっかしいので、
classの切り替え処理のほうが正しい気がします。

元のコード：

```vue
<template>
  <div class="board">
    <div v-for="x in 8">
      <div v-for="y in 8">
        <div class="square-black" :id='`${x}-${y}`' v-if="(x + y) % 2 == 0"></div>
        <div class="square-white" :id='`${x}-${y}`' v-else></div>
      </div>
    </div>
  </div>
</div>
</template>
```
Talend ETLの構成をまとめてみた。


# ETL構成まとめ

|項目|詳細|
|---|---|
|ソース本体|ジョブ.zip\ジョブ名\src\test\ジョブ_0_1\ジョブ.java|
|参照ソース|ジョブ.zip\ジョブ名\src\test\src\routines|
|workspace内のソース本体|\.Java\src\test\ジョブ_0_1\ジョブ.java|

## ジョブ.zipの構成
- ジョブ名
 - items
     - test
         - code(参照されているjavaファイルのプロパティ等が格納されている)
         - metadata(メタデータのプロパティが格納されている)
         - process(ジョブのプロパティ等が格納されている)
         - talend.project
  - src
      - routines(ジョブ.javaで参照されているjavaファイルが格納されている)
      - test
         - ジョブ_0_1
             - ジョブ.java(ジョブのソース本体)
  - test
       - context(Default.properties)
  - ジョブ_0_1.jar
  - ジョブ_run.bat
  - ジョブ_run.sh
- lib
- jobInfo.properties(ジョブの名前更新日等)

## スキーマ情報を変更した際に更新されるファイル

### プロパティファイル系
- item/test/metadata/connections/DB接続名.properties
  - ジョブの更新日時が変更されている
- item/test/metadata/connections/DB接続名.item
  - スキーマ名が変更され、変更後のスキーマ情報が追加されている。(変更前のスキーマ情報も残っている)
- item/test/process/フォルダ名/ジョブ.properties 
  - エラーが起きている状態でエクスポートするとエラー情報が追記される
- item/test/process/フォルダ名/ジョブ.item
  - スキーマ名とパスワードの値が書き換わっている
- item/test/talend.project
  - IDなどが色々と書き換わっているが規則性がわからない。
- test/ジョブ_0_1/context/Default.properties
  - ジョブをエクスポートした時間が変更されている
- jobInfo.properties
  - ジョブをエクスポートした時間が変更されている

### ソース系
- ジョブ.java
  - スキーマ名が変更されている
- ジョブ_0_1.jar
- lib/systemRoutines.jar
- lib/userRoutines.jar
Jetson Nanoのセットアップメモ

####イメージのダウンロード
https://github.com/NVIDIA-AI-IOT/jetcard
内にあるリンクから　jetcard_v0p0p0.zip　をダウンロード
※7GB

####Etcherのインストール
https://www.balena.io/etcher/
からインストーラーをダウンロード
※インストーラーを起動し同意するだけで完了

####SDカードへイメージの書き込み
インストールが終わるとEtcherが起動するので、
左：jetcard_v0p0p0.zip(jetcard_v0p0p0.img)
中：書き込むSDカード
を選択したら、右のFlashで書き込み

####Jetsonの起動
・SDカードを挿入
・J48に2pinジャンパを取り付けショート(USB⇒ACアダプタ給電)
・ACアダプタ接続
・PCとJetsonをUSB-microUSBで接続
・PCからブラウザで　http://192.168.55.1:8888
・パスワードに「jetson」

####ネットワークの接続
ルータとEtherケーブルで接続
ping google.com　で応答があればネットにつながっています

####wifiの場合
wifi ssidの確認
sudo nmcli device wifi list

wifiの設定
sudo nmcli device wifi connect <ssid_name> password <password>

※wifiが表示されない場合
https://qiita.com/hina2211/items/e90ae9810588adc053bb

####システムアップデート
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade

####vnc
sudo apt install tigervnc-standalone-server tigervnc-scraping-server
vncpasswd
x0vncserver -display :0 -passwordfile ~/.vnc/passwd

####PC側VNC
https://www.realvnc.com/en/connect/download/viewer/
or
https://chrome.google.com/webstore/detail/vnc%C2%AE-viewer-for-google-ch/iabmpiboiopbgfabjmgeedhcmjenhbla/related?hl=en

####VNC接続
192.168.55.1:5900

####VNC自動起動
sudo vi /etc/systemd/system/x0vncserver.service

以下コピペ
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target
After=network.target remote-fs.target nss-lookup.target
After=x11-common.service

[Service]
Type=forking
User=jetson
Group=jetson
WorkingDirectory=/home/jetson
ExecStart=/bin/sh -c 'sleep 10 && /usr/bin/x0vncserver -display :0  -rfbport 5900 -passwordfile /home/jetson/.vnc/passwd &'

[Install]
WantedBy=multi-user.target

####手動起動でテスト
sudo systemctl start x0vncserver.service
sudo systemctl status x0vncserver.service

####自動起動の有効化
sudo systemctl enable x0vncserver.service 
sudo reboot yes

####swapの設定
$ git clone https://github.com/JetsonHacksNano/installSwapfile
cd installSwapfile
./installSwapfile.sh

####確認
free -h

####時刻設定
設定⇒Time & Dataを選択⇒Locationから【Tokyo】

####日本語キーボード
sudo vi .bashrc
setxkbmap -model jp106 -layout jp -option ctrl:nocaps

bashrcの再読み込み
source ~/.bashrc

日本語キーボードの設定
設定⇒キーボード⇒Text Entryの順に選択してキーボードの設定画面を開く
「＋」から【Japanese(OADG 109A)】を選択する
Switch to next source using:で好きなキーでのキーボード切り替えを選択する
※初期の「Super + Space」ではSuperに該当するキーがないため認識してくれない

####ターミナルに色を付ける
sed -i -e "s/#force_color_prompt/force_color_prompt/g" .bashrc

#bashrcの再読み込み
source ~/.bashrc
AWSのUbuntu-18.04にsshできない

こんなエラーが出るとき

```
$ ssh -i key.pem ec2-user@ip-address
Connection closed by ip-address port 22 
```

原因は単純で，デフォルトのユーザー名が`ec2-user`じゃなくて`ubuntu`.
なので，

```
$ ssh -i key.pem ubuntu@ip-address
```
でつながる．
mongo-go-driverがうまく入らなかったので、手動でいれた。

## 概要

mongo-go-driverをDockerfileなり、自動で入れようとしたら上手くいかず、手動でいれるとうまくいったので、その共有。
誰かが同じ轍を踏まないように。

## mongo-go-driver
- https://github.com/mongodb/mongo-go-driver

## Go Runtimeコンテナ

```bash
base image => golang:1.12.8 ※2019/08/15時点でのstable version
```

アタッチして下記を実行

### パッケージ管理ツール： depのインストール
```bash
$ curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
```

### Projectの初期化
```bash
$ dep init ※project rootで
```

### Mongo Driverのインストール
```bash
$ dep ensure --add go.mongodb.org/mongo-driver/mongo go.mongodb.org/mongo-driver/bson go.mongodb.org/mongo-driver/mongo/options
```

※goファイルでimportしていない場合、「これはまだ仮のインストールでっせ」という警告が出るかもしれませんが、
importすれば、消えるので無視でOK

あとはdocker commitなりなんなり。

## 参考
- Github: mongo-go-driver
    - https://github.com/mongodb/mongo-go-driver
- MongoDB公式ドキュメント
    - https://www.mongodb.com/blog/post/mongodb-go-driver-tutorial
AmazonSQSAsyncの呼び出し方

AmazonSQSAsync の呼び出し方です。



```
    AmazonSQSAsync sqs = SQS.getAsyncClient();
    try {
      CreateQueueResult queue =
        sqs.createQueue(
          new CreateQueueRequest().withQueueName(QUEUE_NAME));
      HashMap<String, MessageAttributeValue> map =
        new HashMap<String, MessageAttributeValue>();
      map.put(
        "foo",
        new MessageAttributeValue().withDataType("String").withStringValue(
          "aaa"));
      Future<SendMessageResult> result =
        sqs.sendMessageAsync(
          new SendMessageRequest(queue.getQueueUrl(), "Message")
            .withMessageAttributes(map));
      while (!result.isDone()) {
        Thread.sleep(10);
      }
    } catch (Exception e) {
      logger.error(e);
    } finally {
      sqs.shutdown();
    }
```

sqs.sendMessageAsync の返り値として  Future<SendMessageResult> が返ってきます。 isDone() メソッドが呼ばれるとSQSの送信が完了した判定になるので、それまでループで待って最後shutdownするのがお作法のようです。
netmikoを使ってNW機器へSSHアクセス

#概要
　netmikoを使ってNW機器にSSHアクセスしてみました。NW機器はどこのご家庭にでもあるCisco891を利用しています。
　netmikoのインストールからshow runコマンドを実行するところまでを、流れに沿って記載していきます。
　
#実行環境
###バージョン
　Pythonバージョン：3.6
　VSCodeバージョン：1.37.0
![VSCodeバージョン_1.37.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455652/260ad987-ca41-1f46-7fed-7bbb59a6d797.png)

###フォルダ構成
>C:
>┗ Python36Project
> 　┗ ParamikoTest
> 　　┣ <font color='purple'>.vscode\ </font> 
> 　　┃　┣ launch.json
> 　　┃　┗ settings.json
> 　　┣ <font color='purple'> netmikoTest\(仮想環境フォルダ) </font>
> 　　┃　┣色々…　
> 　　┗ <font color='purple'>SourceFiles\ </font>
> 　　 　┣ netmikoTest.py
> 　　 　┗ netmikoTest2.py 

※仮想咸鏡配下にPythonファイルを置いていないのは、[Pythonファイルを仮想環境配下に置くとデバッグがうまく動かない](https://qiita.com/EngineerShiba/items/6c7d2b97829a4c4092d7)ことがあるからです。（2019年8月現在）
　ちなみにプロジェクト名がParamikoTestなのは、もともとParamikoでいろいろやろうとしていたからです。


#netmikoのインストール
　まずは以下の通りpipでnetmikoをインストールします。
 `pip install netmiko`
　※Ctrl+@でターミナルを立ち上げると自動で仮想環境をアクティベートしてくれるので便利ですよね。

#SSHでアクセスしてみる
　以下の通り記載して実行すると、SSHでアクセスしてshow run結果を取得できます。

```Python:netmikoTest.py
import netmiko

#デバイス情報の記載
device = {
    'device_type':'cisco_ios',
    'ip':'IPアドレス',
    'username':'アカウント',
    'password':'ログインパスワード',
    'secret':'特権パスワード',
}

#コマンドの実行
with netmiko.ConnectHandler(**device) as con:
    con.enable()
    output = con.send_command("show run")
    print(output)
```

　初めに、SSHするNW機器の情報を辞書形式で記載します。`device_type`を指定してあげることで、そのNW機器に適したSSHコネクションのオブジェクトを生成するようです。Cisco891は当然IOSなので`cisco_ios`を指定してあげます。
※NW機器の種別を自動で判別してくれるdevice_typeもあるみたいですね。

　そのほかに対応している（対応していそうな）NW機器は[utilities.py](https://github.com/ktbyers/netmiko/blob/develop/netmiko/utilities.py)に記載されています。netmikoで実装を考える前に一度こちらを確認したほうがよさそうです。

　その後、`netmiko.ConnectHandler()`にデバイス情報を渡すとSSHコネクションのオブジェクトを取得できます。
　コネクションを`enable()`で有効化し、`send_command()`でNW機器にコマンドを送信すると、戻り値としてコマンドの実行結果が手に入ります。

　コネクションは最後に`disconnect()`だか`cleanup()`だかで解放してあげないといけないみたいですが、GitHubから[base_connectionクラス](https://github.com/ktbyers/netmiko/blob/develop/netmiko/base_connection.py)を見ると、withが使える実装だったのでwithを使ってみました。`__exit__()`内で`disconnect()`が呼ばれ、その中で`cleanup()`が呼ばれているので、withを使えば事後処理は問題なさそうです。

#おまけ（Teratermライクにしてみた）
```Python:netmikoTest2.py
import netmiko

device = {
    'device_type':'cisco_ios',
    'ip':'IPアドレス',
    'username':'アカウント',
    'password':'ログインパスワード',
    'secret':'特権パスワード',
}

with netmiko.ConnectHandler(**device) as con:
    con.enable()
    while True:
        prompt = con.find_prompt()
        command = input(prompt)
        if(command == ''):
            continue
        elif (command == 'exit'):
            break
        else:
            output = con.send_command(command)
            print(output)
```

　簡易的なターミナルみたいにしてみました。
　whileの無限ループでコマンドを受け付けます。`find_prompt()`でプロンプトの文字列を取得できるようなので、その値を`input()`に渡してあげています。`exit`と打ち込むと、コネクションを切断します。
　なぜか`exit`コマンドをそのまま渡すと、結果が返ってこないため、無理やり分岐させています。（本来なら省略コマンドも考慮すべきですが今回は無視します）
　同様に`conf t`等でモードを切り替えると`send_command()`から結果が返ってきません。おそらくプロンプトが変わるからなのではないかと思っていますが、ターミナルを作成することが目的ではないので詳細は調べていません。

#終わりに
　一度paramikoで同様のプログラムを組もうと試みましたが、うまくログインすらできませんでした。netmikoを使えばわずか数行でSSHアクセスするプログラムが作成できてかなり便利です。対応するNW機器も多く、その気になれば自分で拡張もできそうなので、今後の期待も大ですね。
　次回は、netmikoとTextFSMを連携させて、NW機器の情報をフォーマットして出力みようと思います。
AWS S3 のJava SDKで転送完了時にshutdownNowを呼ばないとスレッドが残り続ける

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/HLuploadFileJava.html
にS3へのファイルアップの方法が記載されています。

ただここの処理の最後で shutdownNow を呼ばないと、s3Clientのスレッドが残り続けてしまうことがあるようです。（SDKのバージョンによるかも知れません。）


            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(clientRegion)
                    .withCredentials(new ProfileCredentialsProvider())
                    .build();
            TransferManager tm = TransferManagerBuilder.standard()
                    .withS3Client(s3Client)
                    .build();

            // TransferManager processes all transfers asynchronously,
            // so this call returns immediately.
            Upload upload = tm.upload(bucketName, keyName, new File(filePath));
            System.out.println("Object upload started");

            // Optionally, wait for the upload to finish before continuing.
            upload.waitForCompletion();
            System.out.println("Object upload complete");

            // 以下のようにして転送マネージャーを終了させる必要があります。
            tm.shutdownNow();


参考

https://www.tcmobile.jp/dev_blog/programming/%E3%80%90java%E3%80%91cse%E3%83%9E%E3%83%AB%E3%83%81%E3%83%91%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%80%81s3%E3%81%B8/
Go言語のバージョンを切り替える方法  macOS HomeBrew

## モチベーション

go言語でビルドしていて、バージョンがマッチしていないとエラーになった。macOSのコンパイル環境で、go言語のバージョンを簡単に変更する方法は無いだろうか？

~~~
# math/bits
compile: version "go1.12.8" does not match go tool version "go1.12.9"
# errors
compile: version "go1.12.8" does not match go tool version "go1.12.9"
# runtime/internal/sys
compile: version "go1.12.8" does not match go tool version "go1.12.9"
# unicode/utf8
compile: version "go1.12.8" does not match go tool version "go1.12.9"
# internal/cpu
compile: version "go1.12.8" does not match go tool version "go1.12.9"
~~~

## HomeBrew を使ってバージョンを確認

go言語のパッケージの詳細を見ると、どうも、切り替えられそうだ... 

~~~
$ brew info go
go: stable 1.12.9 (bottled), HEAD
Open source programming language to build simple/reliable/efficient software
https://golang.org
/usr/local/Cellar/go/1.12.8 (9,816 files, 452.7MB)
  Poured from bottle on 2019-08-15 at 22:49:03
/usr/local/Cellar/go/1.12.9 (9,819 files, 452.8MB) *
  Poured from bottle on 2019-08-16 at 16:23:19
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/go.rb
==> Requirements
Required: macOS >= 10.10 ✔
==> Options
--HEAD
	Install HEAD version
==> Analytics
install: 84,842 (30 days), 275,543 (90 days), 1,163,983 (365 days)
install_on_request: 65,340 (30 days), 211,527 (90 days), 863,599 (365 days)
build_error: 0 (30 days)
~~~

## brew switch で切り替え

調べたところ、brew switch という機能があるらしい。
そこで、先ほど、リストされていたバージョンを指定してみる。

~~~
$ brew switch go 1.12.8
Cleaning /usr/local/Cellar/go/1.12.8
Cleaning /usr/local/Cellar/go/1.12.9
3 links created for /usr/local/Cellar/go/1.12.8
~~~

どうやら、切り替わったみたいだ

~~~
$ brew info go
go: stable 1.12.9 (bottled), HEAD
Open source programming language to build simple/reliable/efficient software
https://golang.org
/usr/local/Cellar/go/1.12.8 (9,816 files, 452.7MB) *
  Poured from bottle on 2019-08-15 at 22:49:03
/usr/local/Cellar/go/1.12.9 (9,819 files, 452.8MB)
  Poured from bottle on 2019-08-16 at 16:23:19
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/go.rb
==> Requirements
Required: macOS >= 10.10 ✔
==> Options
--HEAD
	Install HEAD version
==> Analytics
install: 84,842 (30 days), 275,543 (90 days), 1,163,983 (365 days)
install_on_request: 65,340 (30 days), 211,527 (90 days), 863,599 (365 days)
build_error: 0 (30 days)
~~~

## 確認結果

確かに、go言語のバージョンが切り替わった

~~~
$ go version
go version go1.12.8 darwin/amd64
~~~
[Python] AtCoderで使えるPythonのversionは3.4.3

# はじめに
皆さんはAtCoderで使用できる言語のversionは意識したことがあるでしょうか？
AtCoderに慣れるために過去問を解いていたところ、思わぬ落とし穴に落ちました。
今回は、version違いによるミスを書いていきます。

# 問題
今回の問題を以下に載せます。
[C - Anti-Division](https://atcoder.jp/contests/abc131/tasks/abc131_c)

# 考え方
問題内容はシンプルで、整数$A～D$のうち、$A$以上$B$以下で、$C$でも$D$でも割り切れないものの個数を求めるという問題。

$A$以上$B$以下で、$C$でも$D$でも割り切れないものの個数を直接求めるよりは、$C$または$D$で割り切れる個数を、$A$以上$B$以下の個数から引くほうが簡単そうなのでその方法で行きます。

$C$または$D$で割り切れる個数は、$C$で割り切れる個数と$D$で割り切れる個数の合計から、$C$かつ$D$で割り切れる個数を引けば求められます。そのため、$C$と$D$の最小公倍数を求める必要があります。

# 実際に書いたコード
最小公倍数を求めるには、最大公約数を求める必要があります。調べてみると、Pythonには便利なことにmathモジュールにあるgcd()関数で最大公約数を求めることが出来ます。
書いたコードが以下になります。

```python:C_Anti_Division
from sys import stdin
import math


def lcm(x, y):
    return (x * y) // math.gcd(x, y)


def main():
    A, B, C, D = [int(x) for x in stdin.readline().rstrip().split()]

    C_D_lcm = lcm(C, D)

    z = B//C_D_lcm - A//C_D_lcm

    if A % C == 0:
        x = (B//C) + 1 - (A//C)
    else:
        x = (B//C) - A//C

    y = B//D - A//D

    print((B-A+1)-(x+y-z))


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

# 結果
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443032/4682cabc-ec78-4c71-bf6c-869dc7e2086c.png)

実際に提出してみると結果はRE。
おかしい。自分の環境では確かに動いたはず。
もう一度自分の環境で動かしてみると、

```console
$ python3 C_Anti_Division.py
314159265358979323 846264338327950288 419716939 937510582
532105071133627368
```
正しく動きました。

# REの原因はversion違い！
[リファレンス](https://docs.python.org/ja/3/library/math.html#math.gcd)で調べてみると、math.gcd()は**version3.5**に追加されたみたいです。AtCoderのPythonは**version3.4.3**なので、使用できないのです。

さらに調べていくと、version3.4以前はmathモジュールではなくfractionsモジュールにgcd()関数があるみたいです。
mathモジュールではなくfractionsモジュールに変更したところ、無事に通りました。

ちなみに、fractionsモジュールのgcd()はversion3.5から非推奨らしく、version3.7.3で使用するとmath.gcd()を薦めてきます。

```console
$ python3 -V
Python 3.7.3
$ python3 C_Anti_Division.py                                                   
314159265358979323 846264338327950288 419716939 937510582
C_Anti_Division.py:6: DeprecationWarning: fractions.gcd() is deprecated. Use math.gcd() instead.
  return (x * y) // fractions.gcd(x, y)
532105071133627368
```

#AtCoderで使用できる言語のversion
AtCoderで使用できる言語のversionはコンテストごとのルールに記載されています。
言語によっては使用できるライブラリ(Python3ではnumpy,scipy,scipy,C++ではBoostなど)があります。
また、コンテストによっては使えないものもあるので、参加する前にルールを確認したほうがいいかもしれません。

今回のコンテストで使用できる言語のversion一覧は以下になります。
https://atcoder.jp/contests/abc131/rules


# まとめ
AtCoderと自分の環境を同じversionにしましょう。そうすればこのようなミスは起きません。


もし、今までversionを気にしずに解いていたのなら、このようなことが起こりえることを意識していただきたいです。
Windows 10 上で IIS + classic asp を動かす

#環境
Windows10 Pro

#IIS と classic asp の設定
[コントロールパネル] - [プログラムのアンインストール] - [Windows の機能の有効化または無効化] 
asp と ISAPI 拡張 をチェック(asp をチェックすると ISAPI 拡張もチェックされるはず、、)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/e0fe00f6-a823-3305-e0de-4f2729367296.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/400b0995-eeaf-f88e-f022-bead2e3d4be4.png)

#IIS マネージャで新しく登録します
IIS には最初から Default Web Site というサイト(URL, port と表示するディレクトリの組み合わせ)が用意されている。
まずはそのDefault Web Site で classic ASP を動かします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/a4ecaaa3-08ae-494a-0147-219a180b6657.png)
<img width="971" alt="iismanage1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/2daa5300-908b-ccab-912f-c3ffab8cb15c.png">
<img width="959" alt="iismanage2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/87f02771-85cf-eb86-2640-ba7e9d3a9103.png">
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/5516fd48-4280-3931-6289-81e7c04ee00f.png)

「%SystemDrive%\inetpub\wwwroot」が Default Web Site のディレクトリだとわかります。
%SystemDrive% は環境変数で、通常は「C:」が入っていると思われます。

#Default Web Site のディレクトリに classic asp のファイルを設置
「%SystemDrive%\inetpub\wwwroot」(= C:\inetpub\wwwroot)のディレクトリ下を見てみます。
デフォルトで表示されるhtml ファイルが置かれているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/04ea1a3f-2d1f-1972-d60f-a0c796488511.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/3ee49bdb-af5f-8029-a247-547554c36836.png)


##localhost でも表示されます
これは Default Web Site が 「http:*:80」、つまり、http プロトコルでポート 80 へ来たアクセスを担当しているからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/1a4cfaf9-59db-b240-5130-c56226c82f5f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/f9853bbd-323c-3f95-612e-6565455bde1b.png)


##classic asp ファイルを設置

```html:test.asp
<html>
<body>
<%
Response.Write "IIS + classic asp on windows 10 "
%>
<p><%= Now() %></p>
</body>
</html>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/c24771ee-f43f-fffa-4f4e-e9d5d2b96a36.png)

localhost/test.asp に直接アクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275553/6021016f-700f-586b-e371-530cba65c68f.png)
MCH+のAPIを試してみるの覚書

#はじめに

My Crypto Heoresのキャラクターのアセットデータを自分のゲームの中でも
使えるというMCH+という試みがstartしたそうです。

以前調べたCryptKittyにおける「KittyVerse」のような取り組みだと思えば良さそうです。
https://qiita.com/oggata/items/97a795fb116594be88a4

週末に、MCH+のハッカソンに参加するために、提供されているAPIをちょっとだけ試してみたので覚書です。
(あくまで、ハッカソン前後の情報をまとめただけなのので、最新については、下記をご参考にすると良さそうです。)

My Crypto Heroes
website : https://www.mycryptoheroes.net/
discord : https://discord.gg/C66hByB
twitter(JP) : @mycryptoheroes
twitter(EN) : @mycryptoheroes_


#APIドキュメントは

https://my-crypto-heroes.gitbook.io/mch-api/

です。

#開発の流れ

1.基本的には、自分が保有しているwalletのアドレスからHeroIdを取得する

https://www.mycryptoheroes.net
/api/proxy/HeroAsset/heroes/:address


2.metadataを取得して、自分のゲームにあうように作り変える
https://www.mycryptoheroes.net
/metadata/hero/:heroId


3.自分のゲームデータをmetadataに加える
(...ことができるとどこかでみた記憶が...調査中)

という流れで良いかなと思われます。

#その他

画像の権利周り
https://medium.com/mycryptoheroes/mch-design-guideline-ja-99ff0970ccdc

MCHExplorer
https://explorer.mch.plus/

ハッカソン01の資料
https://speakerdeck.com/rmanzoku/mch-plus-hackathon-number-1
Gistの豆知識

今回、転職活動中に企業様から提示された課題をGistで提出しました。
初めて利用したのですが、簡単なコードの管理ならGistは有用性は高いです。
知見を以下にまとめておきますので、是非、使ってみてください。

# Gistでできること
- ファイルは１つだけでなく、複数まとめて扱える
- zipとしてダウンロードできる
- privateに管理できる（URL知られちゃったらダメだけど）
- 履歴管理できる
- (履歴管理できるとかぶるけど)Gitのリポジトリとして使える(私は使ったことないけど、記事見つけました「[日々常々 - Gistで遊んでみる](http://irof.hateblo.jp/entry/20120814/p1)」)

# Gistツールのおすすめリンク
使ったことあるの2つしかなかったけど、便利なので共有です。

- Gist管理ツール。検索やタグ付けができる - [GistBox](http://www.gistboxapp.com/)

- Sublime Textプラグイン - [SUBLIME TEXT 2からGITHUB:GISTへ投稿できるプラグインの使い方](http://offsidenow.phpapps.jp/archives/898)
references

 add_reference するときカラムネームを指定する際に_id接尾子をつけない
外部キーが欲しいときはforeign_key: true

references型ではなくinteger型等の時はadd_foreign_key 〜
この際indexは自動付与のため　index:trueは書かなくて良い




参考・引用
https://qiita.com/ryouzi/items/2682e7e8a86fd2b1ae47

https://qiita.com/sinagaki58/items/7edea51ef00e393834ca
インストール時のPeer依存パッケージに関する警告の対処法

時折 `yarn` を使ってると警告が出て具体的にどう対処すればいいか忘れることがあるのでメモ.

今回は依存関係でパッケージ間で共通して使われているパッケージが解決できないときの警告の対処法です.

> `warning "${MODULE_A}" has unmet peer dependency "${MODULE_B}".`

## TL;DR

警告なので無視するのも一つの手です.

どうしても警告が気になる場合は依存関係で共通して使われるパッケージを `package.json` に追加することで解決はします.
間接的な依存パッケージとして`package.json`に含むことになります.

```sh
yarn add ${MODULE_B}

# 開発用であればオプションを指定
yarn add -D ${MODULE_B}
```

## 警告メッセージの説明 

具体的には以下の様な警告が出ます.

```sh
warning "@mypkg/mod1 > firebase-admin > @firebase/database@0.4.12" has unmet peer dependency "@firebase/app@0.x".
warning "@mypkg/mod1 > firebase-admin > @firebase/database@0.4.12" has unmet peer dependency "@firebase/app-types@0.x".
warning "@mypkg/mod1 > firebase-admin > @firebase/database > @firebase/database-types@0.4.2" has unmet peer dependency "@firebase/app-types@0.x".
```

この警告をわかりやすく図解すると以下の様になります.

```text
@mypkg/mod1
  ┗ firebase-admin
      ┗ @firebase/database@0.4.12
        ┣ @firebase/app@0.x (peer)
        ┣ @firebase/app-types@0.x (peer)
        ┗ @firebase/database-types@0.4.2
            ┗ @firebase/app-types@0.x (peer)
```

`(peer)` となっているところは具体的には、 `peerDependencies` で指定されているものです.
これらの依存を解決させるために `@mypkg/mod1` の `package.json` の依存関係に `@firebase/app` と `@firebase/app-types` を指定することで警告が無くなります.

- [package.json at @firebase/database]

```json
"peerDependencies": {
  "@firebase/app": "0.x",
  "@firebase/app-types": "0.x"
}
```
- [package.json at @firebase/database-types]

```json
"peerDependencies": {
  "@firebase/app-types": "0.x"
}
```



[package.json at @firebase/database]: https://github.com/firebase/firebase-js-sdk/blob/2907439fd81637b4da8f1eaa3ef2842fec05f17b/packages/database/package.json#L24-L27
[package.json at @firebase/database-types]: https://github.com/firebase/firebase-js-sdk/blob/2907439fd81637b4da8f1eaa3ef2842fec05f17b/packages/database-types/package.json#L13-L15

## 無視しても大丈夫
そもそも警告なので対応しなくても良い.
`yarn.lock`で間接的なバージョンも固定されるので環境依存も問題ありません.

プロジェクトや人によっては無視してることもある様です.

対処したらしたで間接的な依存パッケージなので、依存していたパッケージ等を削除したりすると何処からも利用されない依存パッケージとして`package.json`に残ってしまうのも危惧されます.

- [よく見る XXX has unmet peer dependency 〇〇 はみんなちゃんと対応してるの？ | Mission-Street.](https://hakozaru.com/posts/yarn-npm-warning)
m5cameraのesp_camera_fb_get()がうまく動かなかった

# 現象
https://www.mgo-tec.com/blog-entry-m5camera-arduino.html
こちらを参考に設定も同じでやってみましたが，esp_camera_fb_get()関数でエラーも出ずに応答ない状態です

<img width="673" alt="スクリーンショット 2019-08-15 12.43.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76572/b8f56faa-8b00-ac5d-0099-efc099b59efb.png">

<img width="1199" alt="スクリーンショット 2019-08-15 12.46.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76572/0bfb1a3b-5fc6-8cfd-2119-0b1e841ae722.png">

Serial.printで「fb_get_start」だけが返ってきています
ブラウザでの画面も表示されないです
captureでもstreamでも同じような状態です

https://qiita.com/n0bisuke/items/354dce451d26cb5e196a
こちらの記事はサンプルが表示されない現象ですが，同じことを行いましたが解決できませんでした

## 環境
* m5camera(モデルB) https://docs.m5stack.com/#/ja/unit/m5camera
* mac os10.14.6
* Arduino IDE 1.8.9
* esp ボードライブラリ1.0.2 (1.0.1でも試した)

## 試したこと
* arduino-esp32のボードライブラリの最新化(1.0.2)
* arduino-esp32のボードライブラリを1.0.1に(もちもんサンプルも変更)
* Arduino/libraries/ESP32を削除してからもう一回インストール
* chrome以外のブラウザで試す
* 違うMacBookを借りて最初から設定

これらを行っても「CameraWebServer」のサンプルは動かなかったでした

# サンプルコードを変更
ここまでやってやっとこさコードをもっとシンプル化しようとしました

https://www.mgo-tec.com/blog-entry-m5camera-serial-monitor.html
こちらの記事を参考にwebではなくシリアルで簡単な情報をわたすものです
同じesp_camera_fb_get()関数を利用しているのですが，ちゃんと動きました

<img width="514" alt="スクリーンショット 2019-08-15 12.49.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76572/a36d856a-d0f9-7ee5-65e8-5f5cfe390662.png">

## 原因は？
動いたサンプルコードと動かないサンプルコードを見比べて，怪しいところを見ていくと．．．
cameraのconfigの設定でpixel_formatをPIXFORMAT_JPGとPIXFORMAT_RBG888で違いがありました

試しに動かないコードの方でフォーマットをRGB888にしたところesp_camera_fb_get()がうまくとおりました
むむむ．．．

他のフォーマットも試してみます！

## 他のフォーマットは？
https://github.com/m5stack/m5stack-cam-psram/tree/master
この公式ページのExampleのところでコメントアウトで書いてありました

```c
.pixel_format = PIXFORMAT_JPEG,//YUV422,GRAYSCALE,RGB565,JPEG
```

書き方は自分も間違いましたが，

```c
.pixel_format = PIXFORMAT_GRAYSCALE,//YUV422,GRAYSCALE,RGB565,JPEG
```

にします
PIXFORMAT_も接頭辞を忘れずに．．．

## コード保管で
今回他のフォーマットを探すのがウェブを検索しなければいけなくて，他のIDEとかであればコード保管できるのになぁ
っと思ってVSCodeのArduinoプラグインを導入してみました！

参考URL
https://qiita.com/varlal/items/052d08d0e34c570a6f3b

そしたら，

<img width="528" alt="スクリーンショット 2019-08-16 11.46.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76572/7fa5a6ac-3720-e0c4-337f-32edb5567bd0.png">


候補がありません？
ですが．ボードを選択してさらっとコード補完ができました

<img width="410" alt="スクリーンショット 2019-08-16 12.32.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76572/722523d7-f442-622e-32ba-27971e00dce2.png">

ん？
公式Exampleにコメントアウトしてある以外のフォーマットもありますね．．．
試してみるぞ！
では，ボードに書き込もうとしたら

<img width="451" alt="スクリーンショット 2019-08-16 13.22.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76572/289dca37-88da-923f-7c98-6680ce6077d4.png">

まだ対応していないとのこと
待ちましょう．．．

ということで今回はVSCodeｂのコード補完で確認した定数をArduinoIDEに書き込んでいくようにします
もしくはArduinoの環境設定から「外部エディタの利用」があるのでそちらでもいいと思います
参考記事
https://qiita.com/7of9/items/b9612b2073a978bdfbe9

## 自分のm5cameraで動いたフォーマット動かないフォーマット
* GRAYSCALE 動く
* JPG esp_camera_fb_get()が返ってこない
* RAW esp_camera_fb_get()でもらってきた値がない if(!fb)の条件に入ってしまう
* RGB888 動いた（その他444とかも動くでしょう．．．）
* YUV422 動いた
* t ビルド時にエラー，ここに設定すべきでないものかな

という状態でした
根本的な解決はできてはいないですが，最悪動かないことはないっぽいので他のフォーマットでやっていきます

次にbase64変換したいなぁ〜
#Rspec でタグを指定しないテストの before after の挙動を設定する

Set the before and after behavior of tests that do not specify tags with #Rspec


some_tag が無指定の場合の after の挙動を設定する例

```rb
  config.after :each do |example|
    unless example.metadata[:some_tag]
      some_thing
    end
  end
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2294








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
テストコードを書く理由を調べたのでざっくりとまとめた

## なぜ書くの？

- 望んだ動きをしているかどうかを確認する手段
- 機能追加の時に楽ができる。既存部分への影響の有無を確認できる
- 修正する時の事を意識してコードを書くようになる（読む人・触れる人に優しくなれる）
- テストコードの内容から機能の理解度が高まる
- 外部から呼び出される機能のテストコードを書くと、呼び出し側の観点からの気付きが得られる
- あとでコードを綺麗に書き直す時に楽ができる。振る舞いが変わっていないかの確認手段。
- システムのリプレースの時に楽ができる
- フレームワークの載せ替えの時に楽ができる
- 言語のバージョン変更の時に楽ができる

## イケてないことは？

- テストコードの用意に、開発と同じくらいの時間が必要となる
- 継続的なメンテナンスが無くなるとゴミ化する

もっとありそうだけど、ざっくりとこんな感じでした。

## おわりに

一番刺さった言葉は「10行の変更を加えるために、全てのソースコードを読みたいか」でした。

実際のテストコードの書き方や、テストの美味しいやり方、テスト自動化ツール、
といった具体的な内容は後々調べます。
今回は、テストコードの必要性や、それがあることでどう楽ができるの？を調べてました。

以下のページを参考にまとめていたのですが、めちゃくちゃ深い内容まで書かれているので
すごい価値があると思います。もう学びしかない。

[仕様変更に弱いからテストは書かない……？(´・ω・`)＜仕様変更を想定するならテストを書いてくれ頼む](https://qiita.com/aimof/items/849ded1293495d3bbb50)
[スピード感重視なのでテストは書かない。テストはなぜ開発を遅くするか](https://qiita.com/aimof/items/d68bdb347283ee2dbccf)
[ユニットテストを書こう！](https://qiita.com/kompiro/items/78f2c8d2022a685baa83)
[テストコード入門](https://www.slideshare.net/sh-ogawa/ss-72206317)
EtherCalc APIの使い方

#はじめに
Googleスプレッドシートのように同時に多人数で編集可能なオフラインツールが業務で必要になり、[こちら](https://qiita.com/y_hokkey/items/406b5a8c4bc15354d069)を参考にdockerで環境を整えました。

[本家](https://github.com/audreyt/ethercalc/blob/master/API.md)のAPI解説ページもあるのですが、実際に使うことができるまで時間がかかったので、備忘録も兼ねて掲載します。

外部アプリケーションと連携させる際にEthercalcのAPIが役に立ちました。

この記事ではcurlコマンドを利用してHTTP GET/POSTを行っています。

#GET
```
curl --include 'http://IPアドレスor名前:ポート番号/_/ページID/cells/セル番号(例:B2)'
```

##GETレスポンス
```
HTTP/1.1 200 OK
X-Powered-By: Zappa 0.5.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With,Content-Type,If-Modified-Since
Access-Control-Allow-Methods: GET,POST,PUT
Content-Type: application/json; charset=utf-8
Content-Length: 112
ETag: W/"70-330663501"
Date: Tue, 06 Aug 2019 01:53:55 GMT
Connection: keep-alive

{"coord":"B2","datavalue":"O","datatype":"t","formula":"","valuetype":"t","readonly":false,"font":1,"bgcolor":2}
```

#POST
```
curl -X POST -H "Content-Type: application/json; charset=utf-8" -d '{"command":"set セル番号 text t お好きな文章"}' http://IPアドレスor名前:ポート番号/_/ページID
```

##POSTレスポンス
```
{
  "command": [
    "set D14 text t How are you?"
  ]
}
```

#commandの調べ方
EtherCalcページ内のAuditタブにGUIで操作した際のコマンドが記述される
これを参考にすればよい

#command例
##文字入力
```
set セル番号 text t 文字列
```

##セルへコメント
```
set セル番号 comment 文字列その1\r文字列その2
```
「\r」で改行できる模様

##フォント
```
set セル番号 font * 値pt *
```

##文字色
```
set セル番号 color rgb(赤値, 緑値, 青値)
```

##セル背景色
```
set セル番号 bgcolor rgb(赤値, 緑値, 青値)
```

##文字位置
```
set セル番号 cellformat center
set セル番号 layout padding:* * * *;vertical-align:middle;
```
上記だと文字がセルの中央になります
SfMの説明と環境構築（Mac）

#SfMとは
###定義
SfM：Structure from Motion
ある対象を撮影した複数枚の写真から、対象の形状を復元する技術の総称。
SfMソフトウェアを使用して、複数の写真を入力することで、３次元のモデルを容易に作成可能。

###特徴点
写真内に写り込んだ建物の角などは、明るさが変わっているため特徴的な点である。
このような点を特徴点と呼ぶ。
特徴点は、写真内の位置（座標）として特定することができ、別の場所から撮影した写真からも同じ特徴点を特定することで、
全ての特徴点と写真を撮影した位置・姿勢の関係を求めることができる。

###ハンドル調整
複数枚の撮影した画像から、撮影した位置、姿勢を求めること。
空中写真測量の分野で長く使われてきましたが、コンピュータビジョンの分野でも使われるようになった。
コンピュータビジョンでは自動で誤った点も含めて多くの特徴点を抽出し、誤った特徴点は後から除外していく方法を取ることで自動化を実現している。

###SfMのソフトウェア
####OSS
・Bundler：2016年からあまり更新されていない？？
・openSfM：2018年2月にv0.2.0、python3のサポートができている
・openMVG
・Theia
・COLMAP
・MVE
####市販ソフト
・ContextCapture
・Pix4D
・PhotoScan

###OpenSfMの事前知識
OpenSfMは、Pythonで記述されたMotionライブラリ。
外部センサ（GPS、加速度計）の測定を統合する。
JavaScriptビューワーが提供されている。

pythonのバージョンは2.7か3.6以降

以下のライブラリと依存関係にある
・OpenCV
・OpenGV
・Ceres Solver
・NumPy, SciPy, Networkx, PyYAML, exifread


#OpenSfMの環境構築
初めにOpenSfMのGitHubをクローンする。

```
git clone --recursive https://github.com/mapillary/OpenSfM
```

サブモジュールの更新

```
cd OpenSfM
git submodule update --init --recursive
```

OpenCV, Ceres Solverのインストール

```
brew tap homebrew/science
brew install opencv
brew install ceres-solver
sudo pip install -r requirements.txt
```

OpenGVのインストール、ビルド

```
brew install eigen
git clone --recurse-submodules -j8 https://github.com/paulinus/opengv.git
cd opengv/build
cmake .. -DBUILD_TESTS=OFF -DBUILD_PYTHON=ON
make install
```

Pythonのパスを設定していなかったら以下を実行

```
export PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH
```

最後にOpenSfMのビルド

```
python setup.py build
```

#参考文献
[dockerでOpenSfMを動かす](https://qiita.com/takahi/items/c0b21714a62935f67606)
[OpenSfMのGitHub](https://github.com/mapillary/OpenSfM/releases)
Firebase Cloud Firestoreの制限まとめ

公式ドキュメントに書いてある内容ですが、設計を考える上でよく確認したくなるものだけすぐ見れるようにピックアップしました。
他にも出てきたら追記します。

#書き込みとトランザクションの制限

| 制限 | 詳細 |
|:--|:--|
| データベースあたりの最大書き込み回数 | 10,000 / 秒 |
| ドキュメントへの最大書き込み速度 | 1 / 秒 |
| コレクションへの最大書き込み速度 | 500 / 秒 |
| Commit オペレーションに渡すか、トランザクションで実行することができる書き込みの最大数 | 500 |
| Commit オペレーションまたはトランザクションで 1 件のドキュメントで実行できるフィールド変換の最大数 | 500 |
| トランザクションの時間制限 | 270 秒 + 60 秒のアイドル時間 |
Linux デスクトップ Ctrl+;（セミコロン） で起動するクリップボードヒストリ

```Ctrl+;``` をカスタムショートカットキーとして割り当てたかったのですが、よくわからないクリップボードヒストリに横取りされてしまいます。
特に有効にしているクリップボードマネージャはなく、無効にする方法がわからず苦労しました。

## 結論

* Fcitx の Clipboard アドオン有効になっているのが原因でした。これに気づくのに時間がかかった。
  * Manjaro MATE ではおそらくデフォルト有効でした。ディストリビューションによって違うかもしれません。
* Fcitx 設定アプリ → アドオン → Clipboard を開き、「クリップボード履歴リストのトリガーキー」を除去することで、機能を無効化できました。

![Screenshot at 2019-08-16 16-00-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32297/624a392a-36f5-4c86-998f-2eebaec1ed2d.png)
LAP-CをWindows10で使う

LAP-CがWindows10で動くようになりました･･･って、数年前から動いてたみたい(^^;
パソコンオシロ[PA-S2000](https://www.amazon.co.jp/%E3%83%94%E3%83%BC%E3%82%A2%E3%83%B3%E3%83%89%E3%82%A8%E3%83%BC%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC%E3%82%BA-PA-S2000-E-USB%E6%8E%A5%E7%B6%9A%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%82%AA%E3%82%B7%E3%83%AD%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97-%E3%83%A1%E3%83%A2%E3%83%AA%EF%BC%91%EF%BC%AD%E6%90%AD%E8%BC%89%E3%83%A2%E3%83%87%E3%83%AB/dp/B004X9YODI/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=PA-S2000&qid=1565938551&s=gateway&sr=8-2)を校正に出してるんで、信号を見るのに久しぶりにLAP-Cを引っ張りだし、ネットで検索したら「Windows10でも動く」との記事を発見。
早速インストしてみました。

動きました。
たまにタスクマネージャーで強制終了させないとならないけど、大体動いてるから文句ナシ。

昔からプロトコル・アナライザとかスペクトラム・アナライザとかグリッド・ディップ・メーターが好きなんで、久しぶりに動いたLAP-Cに改めて感動しちゃった。

この手のアナライザって、なんちゅうか気持ち良い。
アナログとデジタルの融合とでも言うか、はっきり見えて気持ちが良い。

[__こちらにアップ__](https://yokaton.com/mcu-nxp/#i-4)しました。
Rails5版 外部キーを設定する5つのやり方

# 環境

- Rails 5.2.3

# 外部キーの追加方法 （5パターン）

1. `references` (1' はオプション付与したバージョン）
2. `belongs_to` ( [belongs_to は references の alias です](https://github.com/rails/rails/blob/88aa2efd692619e87eee88dfc48d608bea9bcdb4/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb#L429) )
3. `<xxx>_id`
4. `add_reference` (`create_table`外）
5. `add_foreign_key` (`create_table`外）

```ruby
  def change
    create_table :transactions do |t|
      # 1. (index も作成してくれます)
      t.references :order, foreign_key: true

      # 1'.
      t.references :order,
        index:       { name: '<index_name>' },
        foreign_key: { to_table: '<actual_table_name>', name: '<foreign_key_name>' },
        null:        false

      # 2. (belongs_to は references の alias です) 
      t.belongs_to :order, foreign_key: true

      # 3.
      t.integer :order_id, index: true
      # `index: true` を付けない場合は、 `create_table` 外で `add_index :transactions, :order_id` とする。
    end

    # 4. 
    add_reference :transactions, :user, foreign_key: true, null: false

    # 5.
    # https://api.rubyonrails.org/?q=add_foreign_key
    # add_foreign_key(from_table, to_table, options = {})
    add_foreign_key :transactions, :orders
  end
```
OwnCloudアップデートメモ

# 概要

* OwnCloudを久々にアップデートする
* しかしエラーに遭遇
* 解決方法をメモ


# 詳細


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/2b5404ed-79b2-7f03-2b6a-1a7ef116857f.png)


```
● occのあるディレクトリに移動
# cd /var/www/html/owncloud/
```

* アップデートコマンドを実行

```
# sudo -u apache php71 occ upgrade
ownCloud or one of the apps require upgrade - only a limited number of commands are available
You may use your browser or the occ upgrade command to do the upgrade
:
2019-08-16T03:57:09+00:00 Repair warning: You have incompatible or missing apps enabled that could not be found or updated via the marketplace.
2019-08-16T03:57:09+00:00 Repair warning: Please install or update the following apps manually or disable them with:
occ app:disable onlyoffice ★　←エラー：アドオンを無効にしないとアップデートできないとのこと
occ app:disable ownbackup ★　←エラー：アドオンを無効にしないとアップデートできないとのこと
2019-08-16T03:57:09+00:00 Repair warning: For manually updating, see https://doc.owncloud.org/server/10.2/go.php?to=admin-marketplace-apps
2019-08-16T03:57:09+00:00 OC\RepairException: Upgrade is not possible
2019-08-16T03:57:09+00:00 Update failed
:

```


```
・アドオンの「onlyoffice」を無効化
# sudo -u apache php71 occ app:disable onlyoffice
ownCloud or one of the apps require upgrade - only a limited number of commands are available
You may use your browser or the occ upgrade command to do the upgrade
onlyoffice disabled

・アドオンの「ownbackup」を無効化
# sudo -u apache php71 occ app:disable ownbackup
ownCloud or one of the apps require upgrade - only a limited number of commands are available
You may use your browser or the occ upgrade command to do the upgrade

# sudo -u apache php71 occ upgrade
ownCloud or one of the apps require upgrade - only a limited number of commands are available
You may use your browser or the occ upgrade command to do the upgrade
：
2019-08-16T04:04:00+00:00 Starting code integrity check...
2019-08-16T04:04:14+00:00 Finished code integrity check
2019-08-16T04:04:14+00:00 Update successful
2019-08-16T04:04:14+00:00 Maintenance mode is kept active
2019-08-16T04:04:14+00:00 Reset log level

```

* 再度アクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/a815d1e4-7fea-4eff-bae5-9d18fae4e1d6.png)

* 再起動が必要らしい

```
# sudo reboot
```

* 再度アクセス。。変わらない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/a136999b-855c-457a-efdd-eb4eb13d4fbb.png)

```
* どうやらメンテナンスモードになっているとのこと。設定ファイルにて解除、再起動

# vi /var/www/html/owncloud/config/config.php
：
'maintenance' => false,　★trueからfalseに変更

# sudo reboot
```
* 治った！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/09ca8048-1514-a364-0c4d-70905a4419ff.png)