OmniAICreator/Qiita-1.07M huggingface dataset:
PHP 値渡し

## 値渡し

値をコピーして渡しているため、元の変数に影響を与えない。

## 関数

```php:関数値渡し
<?php

$tar = 1;
function plusOne($tar){
    $tar++;
}

plusOne($tar);

var_dump($tar);  //int(1)
```

関数は引数を受け取ったあと、**そのコピーを作って処理をする**


## foreach

### 基本


- ループ回数
    - 要素の数と一致する。
    - 下記の**ループ回数=$valueの数**
- 値渡し
    - \$keyと$valueはループごとに値が変わる。
    - **値をコピーしているため、元の変数($arr)に影響を与えない**

```php:foreach基本
<?php

foreach ($arr as $key => $value) {
  //...code
}
```
### 値渡し

```php:foreach値渡し
<?php

$arr = [
    0 => [
        'a' => 'あ',
        'b' => 'あ',
        'c' => 'あ',
    ],
    1 => [
        'd' => 'う',
        'e' => 'う',
        'f' => 'う',
    ],
];

foreach ($arr as $key => $value) {//2回ループ

    foreach ($value as $k => $v) {//6回ループ
        //$v = str_replace('あ','い',$v);
        //var_dump
        $value[$k] = str_replace('あ','い',$v);//※1 $vは'「あ」のまま'
        //var_dump
        $value[$k] = $v;//ここで元の配列を操作
        //var_dump
    }
    //var_dump
    $arr[$key] = $value;//ここで元の配列を操作
    //var_dump
}
```

- var_dumpと書いてあるとこでvar_dumpしてみると理解が深まる
- ※1:この記事上部の関数の値渡しをおさらい
    - 関数(ここではstr_replace)に値を渡して処理した後は、**返り値に処理後の内容が反映される**
- ある変数に処理をし、その変数を上書くときは、左辺と右辺に記載する変数を同じにするとバグが防げる
    - × \$value[\$k] = str_replace('あ','い',\$v);
    - 〇 \$value[\$k] = str_replace('あ','い',\$value[$k]);
CreateMLでスポーツビデオのAction Classifierをつくる(書きかけ）

## １、データセットをつくる。 
####動画に要求されること。

・各パターンごとに６０動画（train50,test5,validation5)ぐらい必要。
・画面の中心に一人の全身がおさまっている。
・１クリップに１動作。前後の余分な動きはカットで収録されている。
・動画のフレームレート（１秒間に何コマか）は統一すべき。
・休憩や関係ない運動など、分類したい動作以外の「他の動作」動画も１分類として用意。


####分類したい動作ごとにフォルダに入れ、フォルダの名前を動作名にする。
（このフォルダの名前が、分類結果の名前として出てくる）。

<img width="326" alt="スクリーンショット 2020-06-25 20.00.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/b53c749e-c5ee-3068-5e07-0d285c2b13e1.png">
↓
<img width="333" alt="スクリーンショット 2020-06-25 20.00.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3f435a2b-bd26-4772-c1e4-4c06b7cf7818.png">


## ２、CreateMLでAction Clasifierモデルをトレーニングする。
XcodeのDeveloper ToolsからCreateMLをひらく。
<img width="428" alt="スクリーンショット 2020-06-25 19.31.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/31ed32e6-d5fa-a4d1-c8d5-f6b87d9ab274.png">

VideoセクションのAction Classificationを選択。
<img width="889" alt="スクリーンショット 2020-06-25 19.32.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/dd069b7c-bf2e-e05e-23b9-5fe38c9e28d6.png">

Training Dataで、用意したデータセットフォルダを指定する。
<img width="1402" alt="スクリーンショット 2020-06-25 19.37.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/cc27bb01-5b29-ce50-1f78-6852ccc38ce7.png">

Twitterフォローしてくださいお願いします！
https://twitter.com/JackdeS11
【Salesforce】機能設計／機能検討時の注意事項

機能設計／機能検討時の注意事項を徐々に追加していきます。

＜難易度高＞
・他システムとの連携
　⇒なんといっても、文字コードは要注意（Shift-JISのシステムが多い）
・WebToCase
　⇒Shift-JISをサポートするように変更可能か
　⇒エラー発生時、どんなレスポンス返してくるか
    →SF社の回答をまとめたものはこちらとなる。
　　　https://qiita.com/zhtomoki/items/fbe1b8c2b117ecb1abbb


＜難易度中＞
・CSVダウンロード／アップロード関する注意事項
　⇒文字コードUTF-8にすべき　→Apexでは文字列をUTF-8として処理される
　⇒ダブルコーテーションの有無は決定済みか
　　⇒ダブルコーテーションがなしになると、改行項目は取り扱えなくなります。
　　　※ダブルコーテーションを考慮すると、アップロードのロジックは非常に複雑になります。
　⇒ヘッダー、行ごとにの項目数、項目ごとのチェックはしっかり定義してやる必要がある。
　⇒1トランザクションが処理できる文字数は制限されている
　⇒1トランザクションの処理時間の制限等もあり
　　⇒１回に取り込める件数は慎重に検証し、定義すべき
Ruby on Rails　MVC周りのリファクタリング方法例まとめ

何も考えずにやりたいように記述していると増えていくコード量、下がる可読性……
なるべく簡潔に纏められるよう、MVCそれぞれで使える手段を初学者なりにまとめました。

## MVCの役割をおさらい
|MVC|役割|
|---|---|
|Model|アプリケーションで扱うデータの操作/加工|
|View |ユーザへの情報表示、ユーザからの入力の受け取り|
|Controller|ModelやViewとの情報のやり取りをする|
この役割を理解し、それぞれの役割に相応しい処理を記述していく。
役割を考えず好きに各ファイルに記述していると、メンテナンスも難しくなってきてしまう。
例えば、Modelに記述すべき処理をControllerに記述してしまうとFat Controller
(コードが大量に書かれて膨れ上がったController)になるなどの問題が発生しやすくなる。

## Controllerのコード量を減らす方法
### Modelに記述する。
上記のMVCの各役割を考えて、データの処理・加工を担うメソッドはModelに記述する。
#### 訂正前
```ruby:app/controllers/posts_controller.rb
class PostsController < ApplicationController
  def index
    @posts = Post.order(created_at: :desc).limit(10)
  end
end
```
#### 訂正後（Modelに移動）
Modelクラスに対して直接呼び出せるようクラスメソッドとして定義。

```ruby:app/models/post.rb
class Post < ApplicationRecord
  def self.latest(number)
    order(created_at: :desc).limit(number)
  end
end
````
Controllerでメソッドを呼び出す

```ruby:app/controllers/posts_controller.rb
class PostsController < ApplicationController
  def index
    @posts = Post.latest(10)
  end
end
````
クラスメソッドでなく、scopeを使うことも出来る。

```ruby:app/models/post.rb
class Post < ApplicationRecord
  scope :latest, -> (number = 10){order(created_at: :desc).limit(number)}
end
````
```ruby:app/controllers/posts_controller.rb
class PostsController < ApplicationController
  def index
    @posts = Post.latest
  end
end
````

## Modelのコード量を減らす方法
### Concernを使う
複数のModelに同じ処理が繰り返し記述されている場合などに、Concernを使って共通処理を切り出すことが出来る。

```ruby:app/models/post.rb
scope :latest, -> (number = 10){order(created_at: :desc).limit(number)}
def hoge
  puts "hogehoge"
end
```
```ruby:app/models/comment.rb
scope :latest, -> (number = 10){order(created_at: :desc).limit(number)}
def hoge
  puts "hogehoge"
end
```
app/models/concernsにファイルを作成・共通処理を記述。

```ruby:app/models/concerns/common_module.rb
module CommonModule
  extend ActiveSupport::Concern
  included do
    scope :latest, -> (number = 10){order(created_at: :desc).limit(number)}
    def self.hoge
      puts "hogehoge"
    end
  end
end
```
各Modelでincludeすることで共通処理が使用できる。

```ruby:app/models/post.rb
include CommonModule
```
```ruby:app/models/comment.rb
include CommonModule
```
### バリデーションを切り出す
長くなりがちなバリデーションの記述をvalidatorに切り出すことが出来る。
appディレクトリ下にvalidatorsディレクトリを作成し、バリデーション用のファイルを作成する。

```ruby:app/validators/post_validator.rb
class PostValidator < ActiveModel::Validator
  def validate(record)
    prohibited_words = ["baka","aho"]
    if prohibited_words.any?{ |word| record.content.include?(word) }
      record.errors.add(:content, "禁止ワードが含まれています。")
    end
  end
end
```
Model側に追加で記述する。

```ruby:app/models/post.rb
validates_with PostValidator
```
### コールバックを切り出す
コールバックもModelから切り出すことが出来る。
app/callbacksディレクトリを作成し、コールバック用のファイルを作成する。
（クラス名はコールバック名と同じにすること）

```ruby:app/callbacks/post_callback.rb
class PostCallback
  def before_create(post)
    post.title = "No Title" if post.title.blank?
  end
end
```
Model側に追加で記述する。

```ruby:app/models/post.rb
before_create PostCallback.new
```
jupyter notebookのkernelが接続できなくなった

## jupyterの再インストール
```terminal:terminal
$ pip install pip-autoremove
$ pip-autoremove -y jupyter
```

pip-autoremoveが非常に有能でした。
依存関係全部消した後に

```terminal:terminal
$ pip install jupyter
```

これで全部うまくいった。

参考
https://www.it-swarm.dev/ja/python/jupyter%E3%82%92%E3%82%A2%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/1055200356/
【PHP】DateTimeクラスで 2020/06/31 が通っちゃった！？

# 環境

ＯＳ：CentOS 7.7
ＰＨＰ： 7.1.26

#現象

[DateTimeクラス](https://www.php.net/manual/ja/class.datetime.php) のコンストラクタで、日にちが３１までなら、
存在しない年月日でも、正常に受け付けるようです（ただし翌月に繰り上がる。）

ＰＨＰ歴は長いのに知らなかった。じつは常識なのか？

```php
$date = new DateTime( '2020-02-28' ); // OK
$date = new DateTime( '2020-02-29' ); // OK
$date = new DateTime( '2020-02-30' ); // OK
$date = new DateTime( '2020-02-31' ); // OK
$date = new DateTime( '2020-02-32' ); // Error!

$date = new DateTime( '2020-06-30' ); // OK
$date = new DateTime( '2020-06-31' ); // OK
$date = new DateTime( '2020-06-32' ); // Error!
```

たしかに [マニュアル](https://www.php.net/manual/ja/datetime.construct.php) には こっそり下記の説明があります。

```php
// 存在しない値は繰り上がります
$date = new DateTime('2000-02-30');
echo $date->format('Y-m-d H:i:sP') . "\n";
    ：
2000-03-01 00:00:00-05:00
```

# 対策

日付チェックには [checkdate()](https://www.php.net/manual/ja/function.checkdate) を併用したほうがよさそうです。
elasticsearch 基本用語編

#elasticsearchとは
全文検索データベース,保存するデータをインデックスとして保存する

##ノードとは
elasticsearchを構成している端末のこと

##ノードの種類
マスターノード: インデックスの作成と削除、ノードの割り当てなどを行う

##クラスターとは
ノード全てを使って構成している枠組み
elasticsearchは１台以上のノードでクラスターを構成する

##インデックスとは
保存するデータの一つの名目
例えば毎日の天気を登録するインデックスがあったとして
その時に使用するインデックス名は"every_weather"みたいな感じです

##ドキュメントとは
上記の例だと一日の天気を登録しているものです。

##シャーディングとは
インデックス細かく分けて設定したノードに振り分ける動作
そうすることによって検索する際に効率良く検索することができる。検索クエリ実行時には登録しているノード全てに並列的に検索を行う。
件数が少ないのにシャーディングを行うと非効率になってしまう。
設定するシャードは最初や後からでも変更することができるがはじめにやったほうがいい。

##データのスケーリングとは
能力を向上させること
スケールアップ: 各サーバーそのものの性能を向上させる。
スケールアウト: サーバーを増やすことによって処理能力を向上させる。

##レプリケーションとは
インデックスに含まれる各シャードのコピーを作成する機能、いくつコピーを作成するかは設定できる

##プライマリーシャードとは
インデックスをノードに振り分けた一つの破片

##レプリカシャードとは
プライマリーシャードのコピー
インデックスを作成するときに、必要なプライマリーシャードのレプリカの数を選択できます。
インデックスにはシャードが含まれており、シャードにはレプリカシャードが含まれている可能性があります。
レプリカシャードはコピー元のプライマリーシャードがいるノードにはコピーされずに違うノードに保存される。
こうすることによって一部のノードが死んでも他のノードにコピーされているから大丈夫になる。

##ルーティングとは
例えば検索する時にidを指定したとしてそのidがどこにあるかを膨大なデータから探さないといけません。基本インデックスはシャードに登録されています。まず探したいドキュメントがあるシャードを見つけないといけません。その探し方がルーティングです。
elasticsearchは最初にドキュメントをインデックスに登録する時に下記の関数を利用してどのシャードに登録するかを決める。ドキュメントを更新、削除する時も同様。
shard_num = hash(_routing) % num_primary_shards
_routingとは_idのことである。
実際のルーティンング動作
①POST /products/_update/100でアクセスする。idは100
②関数を利用し登録するシャードを導き出し、登録する。
この結果からいきなりシャードを追加してもIDで検索した場合に見つからない可能性がある。
また、通常運用しながらシャードを追加する場合は今まで登録されていたシャードのドキュメントの数が不均等になり、エラーが起こる場合がある。その時はインデックスの再作成をしないといけない。

##elasticsearchがデータを読み取る方法
①クエリを実施
GET /products/_doc/100
②coorginating node(調整ノード)と呼ばれるノードがクエリを受け取る。
③探しているドキュメントが格納されている場所を探す(ルーティング)
④ARSという方法を使用しドキュメントがあるプライマリーシャードのレプリカシャードを選択する
⑤選択したレプリカシャードに調整ノードから読み取り依頼が出され、読み取り帰ってくる。

##elasticsearchがデータを書き込む方法
①クエリを実施
POST /products/_doc/100
②リクエストはプライマリーシャードにルーティングされる。
③プライマリーシャードはリクエストのフィールドが変な値ではないか確認する。
④プライマリーシャード自身にリクエストを書き込む。
⑤レプリカシャード全てに書き込むようにリクエストを配布する。

###書き込み時の問題発生
書き込みの際にプライマリーシャードが死んでしまった場合は回復プロセスが実行されレプリカシャードがプライマリーシャードに昇格する。その際様々なエラーが予想される。
そのエラーを改善するためにprimary termsとseqence numbersという名目がある。
primary terms: これはelasticsearchが古いプライマリと新しいプライマリを区別する方法。既存のプライマリが死ぬと新しいプライマリができますがこの二つのプライマリはoldとnewに区別されます。この区別がクラスターが管理しています。区別することによってたくさんのエラーを改善することができる。

seqence number: 操作ごとにカウンタが上がっていく仕組みです。プライマリーシャードは書き込み要求を処理する時にこの数を増やさないといけません。シーケンス番号によりelasticsearchは指定された操作がどの順序で行われたかしることができるため多くのエラーを改善することができる。

check point: チェックポイントにはグローバルチェックポイントとローカルチェックポイントがある。
グローバルチェックポイント: 各レプリケーショングループに存在しレプリケーション内の全てのアクティブなシャードのシーケンス番号です。グローバルチェックポイントよりも小さいシーケンス番号を含む全ての操作がレプリケーショングループ内の全てのシャードで実行されています。つまりグローバルチェックポイントを利用し何らかの不具合があった場合でもそれを検知し修正することができる。

ローカルチェックポイント: 各レプリカシャードに存在する。最後に行なった動作を記録する。

##REST APIとは
webシステムに対するクエリのようなもの
viエディタのコピーと削除、貼り付け

viエディタについて


### viエディタとはなにか
・読み方：ヴィーアイ
・Emacsと共にUNIX環境で人気があるテキストエディタ
※Emacs（イーマックス）:拡張性を特徴としたテキストエディタ
※UNIX環境：OS環境（WindowsやMacと同様）
※テキストエディタ：テキストファイルを編集するソフトウェア
・マウスやカーソルを使わない


### 代表的なviコマンド（コピーと削除、貼り付け）
コピー
・yl：1文字のコピー
・yy（Y）：1行のコピー

削除
・x：1文字の削除
・dd：1行の削除

貼り付け
・p：カーソルの右側に貼り付け
・P：カーソルの左側に貼り付け


###参考文献
http://www.gi.ce.t.kyoto-u.ac.jp/user/susaki/command/vi.html

前回課題だった目次とかできた、よかった
次は表を用いたい。
elasticsearch 検索クエリ編

elasticsearchの検索には```DSL```,```リクエストUI```というものを使用する。
レスポンスは検索結果を含むドキュメントが返ってくる。

#DSL
###使用例
```json
GET /indexname/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  }
}
```

###インデックス全てを検索
```json
GET /indexname/_search
{
  "query": {
    "match_all": {}
  }
}

#用語クエリ
```json
GET /indexname/id/_search
{
  "query":{
    "term":{
      "name": "fagag"
    }
  }
}
```
用語クエリとはtermを使用した検索のことで検索した際に用語がアナライザーによって分析されず検索されることです。文字列などを完全に一致させたい場合に用語クエリを実施します。

###複数の用語を検索
```json
GET /indexname/_search
{
  "query": {
    "terms": {
      "tags.keyword": [
        "Soup",
        "Cake"
      ]
    }
  }
}
```
ドキュメントはtagsというリストのフィールドがあり、そこにSoupやCakeという文字列がヒットするかという検索をかけている。

###IDをいくつか指定し検索する
```json
GET /indexname/_search
{
  "query": {
    "ids": {
      "values": [
        1,2,3]
    }
  }
}
```
IDが１、２、３であるドキュメントを検索している

###値の範囲で検索
```json
 GET /indexname/_search
{
  "query": {
    "range": {
      "in_stock": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}
```
in_stockというフィールドの値が10以上、２０以下のものを検索する。
日付けなども検索することができる。
###全文検索クエリ
```json
```
全文検索クエリとはmatchを使用した検索のことで検索した際にアナライザーによって分析され、逆インデックスを探し始めます。



レスポンス
{
  "took" : 18,
  "timed_out" : false,
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1004,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "dKQQz3IBimm59hFUskBJ",
```
レスポンスの詳細
"took": 検索にかかった秒数
"timed_out": タイムアウトしたかどうか
"_shards": 検索する際にアクセスしたシャードの数と成功した数
"total": 検索に一致したドキュメントの数
"hits": 一致したテキストを含むドキュメントが配列で入っている。デフォルトで表示されるのは最初の１０件である。
"_score": ドキュメントが検索クエリにどの程度一致したか



#リクエストUI
###使用例
```bash
GET /indexname/_search?q=FIELD:TEXT
```

###インデックス内の全てを検索
```bash
GET /indexname/_search?q=*
```

###nameフィールドの"tennis"が含まれているドキュメントを検索する場合
```bash
GET /indexname/_search?q=name:tennis
```

###nameフィールドの"tennis"と"baseball"が含まれているドキュメントを検索する場合
```bash
GET /indexname/_search?q=name:tennis AND name:baseball
```

###検索機能のデバッグ
```json
GET /indexname/id/_explain
{
  "query":{
    "term":{
      "name": "lobster"
    }
  }
}
```
explain api を実行することによりヒットしてもしなくてもレスポンスを返してくれる
声質の主観評価結果を考慮した話者表現の学習

#はじめに
声優さんは世に大勢いらっしゃいますが、声質がどの程度似ているのかを自動的に数値化・可視化できると面白いのではないかと唐突に思い立ちました。 
100名の日本人のプロ声優さんの音声データであるJVSコーパスを以前使ったことがあるのですが、そこにsimilarity_matrix.csvなるデータを発見。 
コーパスに付属している論文を調べてみたところ、こちらの論文にたどり着きました。  
「**DNN音声合成に向けた主観的話者間類似度を考慮したDNN話者埋め込み**」
◎齋藤佑樹，高道慎之介，猿渡洋（東大院・情報理工）
http://sython.org/papers/ASJ/saito2019asjs.pdf

![コメント 2020-06-25 182844.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442000/302fea7b-a886-613a-bc21-509e26d38c18.png)

#論文の概要
まず、複数話者の音響特徴量を入力したニューラルネットワークに、各話者の類似度を収めた行列を出力させます。そして、この出力が人間が評価した類似度と近づくように学習をすすめていくと、ニューラルネットワークの中間表現が主観評価を反映したベクトルとなるということのようです。

#モデルの学習
元論文ではJNASコーパスを学習させていましたが、こちらは有料でしたので今回はJVSコーパスを用いて類似度出力モデルを学習させました。 
学習にはnonpara30（発話内容がそれぞれの声優さんでバラバラ）を使用しています。これは、テキスト非依存で類似度がだせるようにという意図からです。

#テストデータでの評価
知人からいただいたミリシタのタイトルコール50数人分（抜けあり）で類似度行列を出してみました。下の画像はPCA（主成分分析）を用いて各話者を2次元でプロットしてみた結果です。
**感想**
うーん...全然一致してない気がする(笑) 
パラメータ探索等はこれからなので、いろいろ試していこうと思います。
![simmat_actors.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442000/628d728d-a96f-3164-a135-9887f3deca27.png)

#実装
https://github.com/hirarinNakalab/Speaker-Embeddings
wordpress学習(2020/06/25)

###テーマの追加
外観のテーマからテーマのzip形式のテーマのアップロードを行う

###Googleアナリティクスの導入
GoogleアナリティクスはGoogleが提供している無料で高機能なアクセス解析ツール。
All In One SEO Pack プラグインを使っての導入。
プラグインをインストールし有効化したあとAll In One SEOの一般設定を開く。
そこのGoogleアおおｚんナリティクス IDにgoogleアナリティクスのトラッキングコードを入力し設定を保存して完了。

###ロゴ作成
LOGASTERというサイトで会社名を入力してそれが書かれたロゴを作成することができる。
外観のカスタマイズのサイト基本情報のロゴ選択からロゴを設定することができる。

サイト基本情報ではサイトアイコンも設定できる。サイトアイコンはブラウザーのタブやブックマークバー、WordPress モバイルアプリで表示される

###ヘッダー画像
サイトのメイン画像となるヘッダー画像は、外観のカスタマイズのヘッダー画像から設定することができる。

###SLL暗号化
SLL暗号化はwordpressを使っているサーバーで行う。
RaspberryPi に Tomcat をインストール

RaspberryPi に Tomcat をインストールする方法です。

```bash
sudo apt install tomcat9
```

インストールが完了すると既に、Tomcat が動いています。

```text
$ sudo systemctl status tomcat9
● tomcat9.service - Apache Tomcat 9 Web Application Server
   Loaded: loaded (/lib/systemd/system/tomcat9.service; enabled; vendor preset: 
   Active: active (running) since Thu 2020-06-25 18:32:44 JST; 3min 30s ago
     Docs: https://tomcat.apache.org/tomcat-9.0-doc/index.html
 Main PID: 2799 (java)
    Tasks: 35 (limit: 4915)
   Memory: 78.7M
   CGroup: /system.slice/tomcat9.service
           └─2799 /usr/lib/jvm/default-java/bin/java -Djava.util.logging.config.
```

ブラウザーから　8080 ポートにアクセスします。
![tomcat_jun25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c2c76665-40f2-b2cb-bccb-968b9e4c5b19.png)

/var/lib/tomcat9/webapps/ROOT/index.html を編集すれば、表示が変わります。

バージョンの確認方法

```text
$ /usr/share/tomcat9/bin/version.sh
Using CATALINA_BASE:   /usr/share/tomcat9
Using CATALINA_HOME:   /usr/share/tomcat9
Using CATALINA_TMPDIR: /usr/share/tomcat9/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/share/tomcat9/bin/bootstrap.jar:/usr/share/tomcat9/bin/tomcat-juli.jar
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
Server version: Apache Tomcat/9.0.31 (Debian)
Server built:   Apr 25 2020 12:24:56 UTC
Server number:  9.0.31.0
OS Name:        Linux
OS Version:     4.19.118-v7l+
Architecture:   arm
JVM Version:    11.0.7+10-post-Raspbian-3deb10u1
JVM Vendor:     Raspbian
```
AWSでデプロイしちゃおうってわけ(AWS登録編)

こんばんはですね。
お久しぶりになってしまい非常に私反省しております。
昨日は地震が酷かったですね。
寝ていて若干起きたけど、眠気に負けてすぐ寝ましたが。

気になったのはニュースで
「余震には気をつけましょう！」
っていってるけど

####気をつけようがないだろ！！！予測できないんだし！！！

と思ってしまう私は悪い子でしょうか。

さて今回はデプロイに関してAWSを使ってデプロイしていくわよっ！！

#1 まずはAWSのHPへアクセスっ！！

こちらから飛んで頂戴
[AWS](https://aws.amazon.com/jp/)

開くとへいっ<img width="1413" alt="B4F43F82-6C2A-4F66-969D-8DC7AC4671EC.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596765/20ef45dc-8ce6-a30c-23e7-3e7ba32bf7b8.png">

そんで右上への無料サインアップから登録して頂戴!!

###※住所、電話番号を登録するページで一番下でアーグリメント〜って聞かれるからそれはチェックしておく様に！！

#2 クレジットカート登録＋電話番号認証

###若いアンタ達なら画像無しでも出来るハズダワ。。。。

その次にプランを選ぶところがあるから

###有無を言わさずベーシック無料プラン！！！！！！

そんで登録するとへいっ<img width="1434" alt="スクリーンショット 2020-06-25 18.32.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596765/516cd4c0-62db-61dc-4157-39d73d4a4f78.png">

これで準備完了よ。

次はインスタンスとかなんちゃらとかやっていくわよ！！！！
[CloudWatch]各サービスのメトリクス

# 概要
EC2のメトリクスしか知らなかったが、
あるとき保守しているシステムのELBで異常を検知し、そのときに初めてELBのメトリクスを見て色々知った。
いい機会なので、ELBをはじめとし、今後知ったものをここへまとめていく。

# ELB(Classic Load Balancer)
AWSの名前空間 > ELBで確認できる。

さらに、以下に分類した結果が表示される。
- LB・AZ別
- AZ別
- LB別
- 名前空間別
- サービス別
- すべてのLBにわたり


ただ、見た感じだと
- すべてのLBにわたり、名前空間別、サービス別：同じ結果
- LB・AZ別：AZ混合の結果になっていておかしい
- AZ別：こちらもなぜか結果がおかしい

という状態で、実用に足るのは「LB別」のみという感じだった・・・

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/elb-cloudwatch-metrics.html#loadbalancing-metrics-clb

メトリクス名|意味
---|---
HealthyHostCount|ロードバランサー配下の正常なインスタンス数。統計は平均とMaxが有用。
HTTPCode_Backend_2XX(3XX,4XX,5XX)|ELB配下のインスタンスからのレスポンスのステータスコードの数。ロードバランサーのレスポンスのステータスコードは含まれない。**なお、統計はSumで見ないと1固定になってしまうので注意。**
HTTPCode_ELB_5XX|ロードバランサーのレスポンスのステータスコード5XXの数。ELB配下のインスタンスからのレスポンスのステータスコードの数は含まれない。ELBに配下のインスタンスで正常なインスタンスがひとつもない場合や、リクエストレートがインスタンスやロードバランサーの容量を超える場合に発生する。**なお、統計はSumで見ないと1固定になってしまうので注意。**
レイテンシー|ロードバランサーが配下のインスタンスへリクエストを送信〜対象インスタンスがレスポンスヘッダを送信し始めた合計経過時間(秒)。アベレージ、Maxが有用
RequestCount|指定された間隔に完了したリクエストの数。合計が有用。
SurgeQueueLength|ロードバランサー配下の正常なインスタンスへの送信を保留しているリクエスト数。Max1024で、いっぱいになると拒否される。統計はピークを知るためにMaximumが有用。
UnHealthyHostCount|ロードバランサー配下の異常なインスタンス数。統計は平均とMinが有用


どうやら、RequestはHTTPCode_Backend_XXXの合計で、HTTPCode_ELB_XXXの数は含まれないみたい。
あくまでバックエンドからレスポンスを返せた分だけRequestではカウントしてるってことだね。実際にはユーザーに返ってるレスポンス数はHTTPCode_ELB_XXXの数も含まれるんだけど。

有用な統計の設定がそれぞれのメトリクスでまちまちなので、あらかじめ同じ統計になるものでダッシュボードに登録しておいた方が便利。

- HTTPCode_Backend_5XX:ELB配下のインスタンスでリクエストが裁けなくなってる
- SurgeQueLength:ELBでキューの待ちが発生→そもそもELBがボトルネックになってる
- HTTPCode_ELB_5XX|ELB配下のインスタンスに負荷がかかりすぎて死亡とうとうインスタンスのヘルスチェックOKのインスタンスが0になったのでインスタンスにリクエストすら送れなくなり、ELBくんがユーザーにインスタンス死んでるから無理ｗｗｗと5XXエラー返しだした

って感じでみればいいか。
【Solidity】private、public、internal、externalの違い

Solidityの関数、変数につけることができるアクセス制限。
具体的には以下の４つを設定できる。
・private
・public
・internal
・external

それぞれの違い、使い所が分からなくなってしまう時があるので備忘録として残したいと思う。

# private
定義したコントラクト内でのみ呼び出し可能。
継承した子コントラクトでも呼び出すことはできない。

| 範囲 | 呼び出し可否 |
|:-:|:-:|
| コントラクト外部 | ✖️ |
| コントラクト内部 | ○ |
| 継承先 | ✖️ |


# public
定義したコントラクト、そのコントラクトを継承したコントラクト、及び外部からも呼び出し可能。
関数はデフォルトでpublicになっているため、何も指定しないとpublicなので注意が必要。

| 範囲 | 呼び出し可否 |
|:-:|:-:|
| コントラクト外部 | ○ |
| コントラクト内部 | ○ |
| 継承先 | ○ |


# internal
定義したコントラクト、そのコントラクトを継承したコントラクトから呼び出し可能。
変数はデフォルトでinternalになっているため、何も指定しないとinternalになる。

| 範囲 | 呼び出し可否 |
|:-:|:-:|
| コントラクト外部 | ✖️ |
| コントラクト内部 | ○ |
| 継承先 | ○ |


# external
外部からの呼び出しのみ可能。

但し、thisを使用することで内部から外部的に呼び出すことは可能。
であれば、publicと変わらないように見える。
ところがpublicは引数の値をメモリに保存し、externalはメモリ保存しないため、externalの方がgasの消費が低く済むらしい。

参考：https://ethereum.stackexchange.com/questions/19380/external-vs-public-best-practices

| 範囲 | 呼び出し可否 |
|:-:|:-:|
| コントラクト外部 | ○ |
| コントラクト内部 | ✖️ |
| 継承先 | ✖️ |
リモート開発時のおすすめKPTツール Trello miro CKPTA

### リモート開発時のおすすめKPTツール

#### はじめに
コロナの影響でリモート開発が増えてきた今日この頃。
今までオフラインで行うことが多かったKPTも、デジタルツールを使ってのKPTが当たりまえになってきました。

業務でもいろいろなKPTツールを使う機会が増え、いくつか触る中で入社2年目の僕が3つのKPTツールを使ってみて良かった点、いまいちだった点を簡単に書いてみました。
あくまで個人的な感想ですがご参考までに。

#### 実際に使用したKPTツール

- Trello
- miro
- CKEPTA

#### 1.Trello
いま業務で使っているツールです。
###### 良かった点
- 同一意見の付箋に参加できる
- 書いた付箋にラベルがつけられる 

###### いまいちな点
- 時間前に他の人が書いたものが見える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662048/8abc00ae-52bf-04b0-83ea-63612ff443c6.png)

付箋にラベルを付けられるのでジャンル毎に好きな色に割り振れて、視認性があがりとても便利でした。
その一方で、1つの列に各々が付箋を貼っていくスタイルなので
時間前に他の人の付箋が見えてしまい当事者意識が薄れて、他の人の付箋に参加するだけで自分は1つも付箋を出さずに終わってしまうなんてことも経験しました。

#### 2.miro
オンラインホワイトボードとして使われているmiro。

###### 良かった点
- 絵文字等でリアクションができる
- KPTに限らずいろんな共有事項を1つのボードで一元管理できる

##### いまいちな点
- 操作性が直感的ではない？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662048/ced81678-a51a-c2fe-438d-69b7bbfb3abb.png)

正直これは使い方にもよると思いますが、毎週行うKPTをボードで管理しようと思うと、付箋が少し乱雑になる印象を受けました。とはいえ、1つのボードにまとめられるのは楽ですし使っていて不便に感じることはありませんでした。

いまいちな点として`操作性`と挙げていますが、これも次に紹介するCKPTAと比較した結果で、少し触ればすぐ使えるようになると思います。

#### 3.CKPTA
一番最近使い始めたツールです。

###### 良かった点
- 直感的な操作ができる
- Goodな付箋にスターをつけることができる
- Tryの付箋との紐づけが簡単にできる
- 付箋の関連性が一目でわかる

###### いまいちな点
- 特に見つからなかったです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662048/3d0b9551-3921-d095-1da8-a7cea387b3e3.png)

初見でも簡単に付箋の紐付けが行えたり、付箋もダブルクリック or ドラッグアンドドロップで作成出来たりと、とにかくKPTに必要な機能が備わっていて操作が直感的にわかると感じました。
またKPTシートも日付でフォルダわけができて、見返すのにも便利だと思いました。


#### まとめ
この１年いろんなKPTツールを触れる機会がありましたが、僕が一番使いやすかったのは`CKPTA`でした。
理由としては、先ほどもあげた`直感的な操作ができる`ことが決め手でした。
もちろんまだ僕の知らない機能がそれぞれのツールにはたくさんあると思いますし、チームの使い方によっても良し悪しは変わってくると思います。

便利なツールは積極的に使っていきたいと思っているので、他におすすめのKPTツールや便利な使い方があったら是非教えてください。
ここまで読んでいただきありがとうございました。
Rails + Heroku でメール認証

## 概要
Railsアプリのメール認証をHerokuの本番環境で実装しました。
当初はRailsチュートリアルの通りSendGridを使用していたのですが、すぐにアカウントが凍結されてしまい一歩も先に進めなかったのでGmailに切り替えました。

logを確認したらNet::SMTPAuthenticationErrorの一文があったので、SendGridではなくそもそもGmailでエラーを起こしていた可能性も...?

## SendGridで送信に失敗する場合確認するべきこと
### 存在するメールアドレスへ送信しているか？
開発環境でgemの「letter_opener_web」などを使用している場合、「test@mail.com」のような架空のアドレスでも送信をすることができましたが、本番環境では送信できません。（そもそもアドレスがなきゃ届かない...)
私ほどの間抜けでなければしないミスでしょうが、タイポの確認は最初にしてみても損はないでしょう。

### Net::SMTPAuthenticationErrorが出ていないか？
送信元アドレスにGmailを設定している場合、「2 段階認証プロセス」をオンにしていないとエラーが発生するようです。
（他のメールサービスでも同様のセキュリティがあるのかな？)
次のコマンドから確認ができます。

```zsh
heroku logs --tail
```
正常に送信されていれば次のようにメールの内容が表示されるので、どちらにしてもログは確認しておいたほうがいいでしょう。

```zsh
 From:         please-change-me-at-config-initializers-devise@example.com
 Reply-To:     please-change-me-at-config-initializers-devise@example.com
 To:           test@mail.com
 Message-ID:   <5ef461204d29d_475308ddc-2ec6f04e388a.mail>
 Subject:      =?UTF-8?Q?
 Mime-Version: 1.0
 Content-Type: text/html;
 charset=UTF-8
 Content-Transfer-Encoding: base64
 ~メール本文~
```

### SendGridのアカウントを凍結されていないか？
Railsチュートリアルに倣ってコンソールからSendGridに登録するとほぼ確実に凍結されました。（私は5/5で凍結されました...)
登録後すぐはHerokuのダッシュボード画面にある「Installed add-ons」のSendGridをクリックすると、SendGridへアクセスできるのですが、一度メールの送信に失敗するとクリックしてもアクセスが出来なくなりました。
この状態になるとアカウントが凍結されており、新しくappを作成し直すかSendGrid社へコンタクトを取って凍結を解除してもらうしかないようです。
ちなみに、SendGridで検索してトップに出てくる日本語ページ（構造計画研究所）ではサポート対象外になっているので本社に英語でコンタクトを取らなければならないようです。
[Azure marketplace等のアドオンとしてSendGridを利用していますが、日本語サポートは受けられますか？](https://support.sendgrid.kke.co.jp/hc/ja/articles/202688449?_ga=2.267786318.1594819430.1593075081-740490392.1591318626)

## GmailのSMTPを利用する
### Googleアカウントに2段階認証をオンにする
Googleアカウント管理画面の「セキュリティ」 > 「二段階認証プロセス」から設定をして二段階認証をオンにしてください。

### コードの追加

```ruby:config/environments/production.rb
  # herokuでメールを送信するための設定
  config.action_mailer.delivery_method = :smtp
  host = "#{ENV['HEROKU_APPNAME']}.herokuapp.com"
  config.action_mailer.default_url_options = { host: host, protocol: 'https' }
  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.gmail.com',
    :port           => '587',
    :authentication => :plain,
    :user_name      => ENV['GMAIL_USERNAME'],
    :password       => ENV['GMAIL_PASSWORD'],
    :domain         => 'gmail.com',
    :enable_starttls_auto => true
  }
```

{ENV['HEROKU_APPNAME']}は、変数にせず直接アプリの名前を入力しても問題ありません。

### Herokuの環境変数を設定
バッシュボードの「Settings」 > 「Config Vars」で「Reveal Config Vars」をクリックすると環境変数の設定が出来ます。
コンソールからも出来ますがこちらの方が分かりやすいのでいつもこっちを使っています。

Key             =>  Value
GMAIL_USERNAME  =>  送信元に設定するメールアドレス
GMAIL_PASSWORD  =>  **二段階認証の設定で取得した**パスワード
HEROKU_APPNAME  =>  Herokuで設定しているアプリ名


## 参考
[Heroku Add-onsのSendGridトラブルシューティング](https://kikutaro777.hatenablog.com/entry/2020/04/13/234948)
[Railsでgmailでメールを送ろうとしたけどsmtp認証のエラーが出て詰まった時の解決方法](https://qiita.com/gazayas/items/9fe0cce69c2785e8b1b9)
【AWS CloudFormation デザイナー】VPCを作ろうとしたら、Property CidrBlock cannot be empty.エラーが出た。

#AWS CloudFormation デザイナーとは
GUI形式でAWS CloudFormationテンプレートを作成・参照・変更ができる。
テンプレートリソースで作りたいものを追加していき、統合されたJSONおよびYAMエディタを使用して詳細を編集する。

#VPCを作ろうとするも、「Property CidrBlock cannot be empty.」エラーが出た
リソースタイプでEC2>VPCを選択し、キャンパスペインにドロップすると下記のようになった。
<img width="1036" alt="スクリーンショット 2020-06-25 17.39.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/156710f5-7240-3ebb-db8e-b4048de3b932.png">

チェックボタンを押して有効かを検証し問題ないので、試しに雲のマークを押してスタックの作成をしてみた。

そうするとS3にすでに作ったテンプレートが載っているようだ。
<img width="1279" alt="スクリーンショット 2020-06-25 17.56.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/2520e460-7814-fb6c-5d86-9f70b9780917.png">

そのままスタックの名前や必要な箇所があれば入力し、スタックの作成を押してみた。
<img width="1284" alt="スクリーンショット 2020-06-25 17.59.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/a553eedd-4c22-579e-8e3f-bfb66755d931.png">

<img width="1279" alt="スクリーンショット 2020-06-25 17.59.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/9b953010-a205-21c8-2117-9fe07ff40bec.png">
<img width="1294" alt="スクリーンショット 2020-06-25 18.00.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/8288d57c-0ac4-879b-0f98-e3f621bc2b6f.png">

そうするとROLLBACK_COMPLETEのエラーが起きた。
<img width="1298" alt="スクリーンショット 2020-06-25 18.02.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/0996345a-4a82-31aa-bdbe-208fecf1ca63.png">

状況の理由は「Property CidrBlock cannot be empty.」
サイダーブロックは空にできないとのことだった。

#解決策
CloudFormationのデザイナープロパティのデフォルトでは、VPCのリソースでサイダーブロックが設定されてないので設定する。

デフォルト

```
{
    "Resources": {
        "EC2VPC3FNNL": {
            "Type": "AWS::EC2::VPC",
            "Properties": {}
        }
    }
}
```

下記のように適切なサイダーブロックを追加する。

```
{
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "CidrBlock": "192.168.10.0/24"
      }
    }
  }
}
```

これで作成をするとロールバックせずに、VPCが作成される。

#参考
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/working-with-templates-cfn-designer.html

https://dev.classmethod.jp/articles/cfndesigner/
CronをDocker上で動かす

# 概要
- バージョン: Ruby 2.6.5 Rails 5.2.4
- 開発環境: Docker/docker-compose

# 実現したいこと
- cronを使ってRailsのバッチ処理を実現したい
- Docker環境で動かしたい

# BusyBoxの利用がお勧め
元々、Wheneverを使って設定したcronをDocker上で動かそうとしていました。

Docker環境だとcronが動かないようなので、色々な記事を参考にし各種ファイルの設定を行いました。

しかし、cronが動かない。Dockerコンテナに入りエラーログを調べ、対応しても上手くいきませんでした。

ちなみに、エラーログとその対応は以下になります。

```log/crontab.log
bundler: failed to load command: bin/rails (bin/rails)
```

```log/crontab_error.log
ActiveRecord::AdapterNotSpecified: 'production' database is not configured. Available: ["default", "development", "test"]
```

以下の記事を参考にし、
https://www.cotegg.com/blog/?p=1606
schedule.rbに環境変数を渡す記述をしたり、database.ymlにproductionデータベースを構成する記述を追記したりしました。

cronの再起動を行い、再びlogファイルを確認しましたが、再度同じエラーが吐かれてしまいました。

恐らく、環境変数を上手く渡せていなかったり、Docker 上でのcron の実行環境が、うまく開発環境と認識されていないことが原因だったのではないかと思います。

私の場合は、結局Wheneverを使って設定したcronをDocker上で動かすことができませんでした。

そこで、この問題が比較的簡単に解決してくれたのが、
**BusyBoxという方法**です。

# BubyBoxのメリット

以下のDocker上でcronを使用する際の課題を解決し、シンプルに定期実行をしてくれます。

- cronで実行するプログラムにコンテナに設定した環境変数を渡したい。
  - cronは環境変数が独立している
  - いちいちファイルに書き出し、読み込みが必要
- ログが標準出力・標準エラー出力されない

### BusyBoxのインストール(Debian系)
※AlpineLinuxの場合、crondで使えるようです

```console
apt-get install -y busybox-static
```

### ディレクトリ構成
.
|- Dockerfile
|- crontab
|- docker-compose.yml
|- main.sh

### Dockerfile

```ruby:Dockerfile
FROM ruby:2.6.5

# インストール
RUN apt-get update && apt-get install -y \busybox-static \

# タイムゾーン設定
ENV TZ=Asia/Tokyo

# main.shファイルをコピー
COPY ./main.sh /myapp

CMD ["busybox", "crond", "-l", "8", "-L", "/dev/stderr", "-f"]
```

### crontab
テスト用に1分毎に実行します

```
* * * * * /app/main.sh
```

### docker-compose.yml
crontabファイルをマウントすることで、外部から実行時間を指定できるようになります。

```ruby:docker-compose.yml
version: '3'

services:
  busybox:
    build: .
    volumes:
      - ./crontab:/var/spool/cron/crontabs/root
```

### main.sh
権限エラーを防ぐために、ターミナル上で以下を実行します。

```
chmod +x main.sh
```
テストとして、Dateを出力します。

```ruby:main.sh
date
```

### 実行

docker-composeで実行する場合

```
docker-compose build   # Dockerイメージをビルド
docker-compose up -d   # docker-compose.ymlの変更を反映させる
docker-compose logs -f # ログ出力
```

1分毎に、dateを出力できました！

![787193B8-CC36-469B-909A-0AD8ED1DF701_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613801/e1876b81-ca9a-4bfb-9179-2900e23c7be4.jpeg)



## 参考にした記事
- https://shimoju.org/2017/10/09/busybox-crond/
- https://ngyuki.hatenablog.com/entry/2017/04/18/195254
- https://qiita.com/nanamen/items/5c4ef45e2ee84bafdd1d
- https://ja.stackoverflow.com/questions/67124/docker-compose-yml%E3%81%A7cron%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%84
Heroku×Rails環境でSSL化したときhttp->httpsにリダイレクトさせる方法


```config/environments/production.rb
  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  config.force_ssl = true # ←ここがコメントアウトされてるので解除するだけ
```

公式ドキュメント
https://help.heroku.com/J2R1S4T8/can-heroku-force-an-application-to-use-ssl-tls
IonicのAngularでWebRTCなカメラ取得して画像を切り出しQR読み取り

カメラ取得してQR読み取りを目標にカメラ画像を切り出してQRへ投げたかったので自作で用意を思案。。
要所のみ記載なので流れメモになってます

###Videoタグ設定

``` html
<video #video autoplay muted playsinline"></video>
```

###Videoタグにカメラデータを流し込み
videoの設定でいろいろ変えられます
https://developer.mozilla.org/ja/docs/Web/API/Media_Streams_API/Constraints

deviceIdは無くても動作確認はできそう「facingMode: 'environment'」設定すればスマホは背面カメラ指定

```ts

const elmVideo = this.video.nativeElement;
navigator.mediaDevices
  .getUserMedia({
    video: {
      width: { min: 160, ideal: 320, max: 640 },
      height: { min: 120, ideal: 240 },
      aspectRatio: 1.777777778,
      frameRate: { max: 30 },
      facingMode: 'environment',
      deviceId: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    },
  })
  .then((stream: MediaStream) => {
    elmVideo.srcObject = stream;
    // elmVideo.setAttribute('playsinline', true);
    elmVideo.play();
  })
  .catch((err: MediaStreamError) => {
    console.log(err);
  });
```

###VideoタグのデータをCanvasへ書き込み
videoタグはwidthやheight指定してないで、ロードした映像のサイズを取得でCanvasサイズを指定

``` ts
const elmVideo = this.video.nativeElement;
const elmCanvas = this.canvas.nativeElement;
elmCanvas.width = elmVideo.videoWidth;
elmCanvas.height = elmVideo.videoHeight;

const context2d = elmCanvas.getContext('2d');
context2d.drawImage(elmVideo, 0, 0, elmCanvas.width, elmCanvas.height);
```

###画像の切り出しとQR読みと入へ譲渡

```ts
const elmCanvas = this.canvas.nativeElement;
const context2d = elmCanvas.getContext('2d');
const imageData = context2d.getImageData(x, y, width, height);

const code = jsQR(imageData.data, imageData.width, imageData.height, {
 inversionAttempts: 'dontInvert',
});
```



###参考サイト
JavaScriptで自動再生のvideoを埋め込む時の注意点
http://cly7796.net/wp/javascript/precautions-for-embedding-autoplay-video-with-javascript/
★video要素、audio要素をJavaScriptから操作する
http://www.htmq.com/video/
開発者向けのウェブ技術See Web APISee Media Capture and Streams API (Media Streams)能力、制約、そして設定
https://developer.mozilla.org/ja/docs/Web/API/Media_Streams_API/Constraints
私のための忘備録③viを使った基本的なファイル編集/正規表現を使用してのテキストファイル検索

##viコマンド
:e!【ファイル名】　→viを終了せずに現在開いているファイルを閉じて、別ファイルを開く
:e!ファイル名なしなら、現在開いているファイルを最後に保存した時の状態に戻す

:e viを終了せずに現在開いているファイルを閉じて別のファイルを開く
:q →viを終了する。内容が変更されておる時警告が出て終了できない
:q!→viの強制終了
:w　編集内容を保存する
:wq,:x,ZZ　編集内容を保存して、viを終了する
:wq! viを保存し、強制終了する
x カーソルの位置の文字を削除
:! viエディタを終了することなくLinuxコマンドを実行させるのはこれ
→カレントディレクトリをエディタ保存しないで確認する方法は　：！ls　です。
X カーソルの位置の左の文字を削除しバッファにコピー

※viでパラメータなしで起動した際
パラメータとはファイル名を指定しないこと
①空のファイルで起動する
②ファイル名は保存する際に指定する

![名称未設定.５png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620109/3763f0bf-5761-d0b1-e927-3d26b9787e25.png)

![名称未設定.pngさ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620109/01d345cd-b8c5-1336-8cd1-e113c9eb39a3.png)

![名称未設定.pngqwqw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620109/6c9dc0cb-4d98-3ae3-a983-c7a64ede4407.png)


![1213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620109/9f219db0-39c3-ee5f-2630-1c42fe5373d7.png)


##:%s/文字列1/文字列2/g
ファイル全体の文字列を置換するにはコマンドモードでこれをうつ！
→:%s/ping-t/hoge/g　pingーtという文字を全てhogeにする。

##行番号
:set nu　と number　行番号を表示する。
:set nonu　と　nonumber 行番号は表示しない
:set ts=タブ幅　tabstop=タブ幅　でタブ幅を数値で指定する。

##sedコマンド
ファイルの標準入力の内容を編集して表示するにはsedコマンドを使用する。
sed [オプション] 編集コマンド [ファイル名]
sed [オプション] -e 編集コマンド1 [-e 編集コマンド2 ...] [ファイル名]
sed [オプション] -f スクリプト [ファイル名]

編集コマンドを複数指定する際には-eコマンドを使用する。

-e 編集コマンド指定
-f 編集コマンドを記述したファイルを指定
![名称未設定.png1234 .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620109/b19c03cc-eabe-d6c5-95a4-80337d5c5cb5.png)

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620109/745b0167-c133-c4c4-406f-2368349a15bd.png)

##grepコマンド
![名称未設定.png1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620109/f982d0d1-bec0-c629-8a4f-a056633df59e.png)

「|」は拡張正規表現ですので、grepコマンドで「-E」オプションを併用、またはegrepコマンドを使用します。
パイプを使う時には、grep -E　もしくは、egrepコマンドを使用・

##dpkg
![名称未設定.png1212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620109/f95f44e9-b3f5-7a8a-ff5f-69b1a5dfbe3b.png)
dpkgツールにおいてインストール済みのパッケージを再設定するコマンドはdpkg-reconfigureです。



##apt-get
![名称未設定.png3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620109/7b4b387d-73fd-836e-abbc-13aa19e951c9.png)

##upgradeとupdate
updateはパッケージのデータベースを最新版に更新する
upgradeはインストール済の全パッケージのアップグレードを行う

dpkgツールの設定ファイルは「/etc/dpkg/dpkg.cfg

##apt-chache
![名称未設定.png122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620109/134115b8-5380-6f4f-047d-232488c2dec7.png)
Rails6〜の環境構築にて、データベースにMySQLを使いたいそんなあなたに。



##そもそもMySQLとmysql2は、別物##

MySQLは皆さんご存知、データベースなんですが、
mysql2ってのは**Rails専用のgem**のことで、データベースとRailsを繋いでくれる架け橋と解釈しています。


##mysql2のエラーについて##

```
$ bundle install --path vendor/bundle

An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.

$ gem install mysql2 -v '0.5.3'

ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
```

そして、さらにbundle installしても、、、という「お、俺のそばに近寄るなァァァ！！」と無限ループの住民になってしまったあなた。

私もそこの住人でしたが、安心してください、脱出できます笑



###解決方法###


**結論、mysql2をインストールしたことを無かったことにすれば良いのです。**


ここで、出てくるのがおなじみGemfileと、Gemfile.lockです。

Gemfileはいうならば、ゲームソフトを買いに行く時の「**買うものリスト**」で、
Gemfile.lockは、「**領収書**」です。

bundle installするときは、この買う物リストにあるソフトを見てgemをインストールするのですが、
今エラーの原因になってるのは、「**領収書にあるゲームソフトをまた買いに行くの？**」ってなってる状態なんです。

ゲームソフトを遊ぶ用、観賞用、保存用としている方なら別ですが笑
それは、おいときまして。

ということで、買ったことを無かったことにてして、新シリーズ版を買いなおしましょう。という話です。
とはいってもやることは、2つ。

```
$ gem uninstall mysql2
```


```Gemfile.lock
mysql2と名のつくものを削除
```

そして、買いなおしましう！

```
$ bundle install --path vendor/bundle
```
モダンな言語のバイナリサイズとコンパイル時間について調べてみた

モダンなコンパイル言語のバイナリサイズとコンパイル時間を計測してみました。
比較のために C と C++ も含まれています。

| 言語    | バイナリサイズ | コンパイル時間 | 依存ライブラリ |
|---------|---------------:|---------------:|----------------|
| Nim     |         61,908 |       0m0.720s | /usr/lib/libSystem.B.dylib |
| V       |         27,276 |       0m1.526s | /usr/lib/libSystem.B.dylib |
| Go      |      1,691,864 |       0m0.295s | /usr/lib/libSystem.B.dylib |
| Rust    |         14,440 |       0m1.284s | @rpath/libstd-91fba10bbd33db69.dylib<br>/usr/lib/libSystem.B.dylib<br>/usr/lib/libresolv.9.dylib |
| Haskell |         18,332 |       0m1.915s | /usr/lib/libSystem.B.dylib<br>@rpath/libHSbase-4.12.0.0-ghc8.6.5.dylib<br>@rpath/libHSghc-prim-0.5.3-ghc8.6.5.dylib<br>@rpath/libHSrts-ghc8.6.5.dylib |
| C       |         12,816 |       0m0.083s | /usr/lib/libSystem.B.dylib |
| C++     |         29,836 |       0m0.694s | /usr/lib/libc++.1.dylib<br>/usr/lib/libSystem.B.dylib |

確認に使用したプラットフォームは macOS Catalina です。

比較に使用したのは自分自身のソースコードをファイルから読み取り、標準出力に表示するプログラムです。まったく同等の処理ではないかも知れないので、参考程度に見てください。各言語のコンパイルは速度優先で最適化しています。

## 感想

C のコンパイル時間の速さは圧巻です。

C++ のコンパイルは遅いとよく言われるのですが、今回のケースでは V、Rust、Haskell はそれよりもかなり遅いです。ただし、Rust と Haskell は動的リンクオプションをやめて静的リンクにすると、Rust は Go ぐらいまで、Haskell は C++ ぐらいまで速くなります（なぜ静的リンクは動的リンクよりコンパイルが速いのか、については私はわかっていません）。

Nim と V は C へのトランスパイラで、それぞれの言語のランタイムも C へトランスパイルされてバイナリに含まれます（という理解です）。V はかなり小さなバイナリを出力しています。
Nim は言語機能としてガベージコレクションを持っており、当然ランタイムにもガベージコレクションのコードが含まれるとすると、このサイズは大健闘だと思います。ただ、V（や Rust）はコンパイル時にオブジェクトの開放のタイミングを決定し自動開放してくれるという、GC とはまた違った強みがあります。

Go のバイナリが極端に大きいのは、Go のランタイムを含む外部ライブラリをすべて静的リンクしているためです。本当の意味でのシングルバイナリでポータビリティを担保しているのは Go だけ（という認識）です。

以下、検証したコードと一言コメントです。

## Nim

```cat_nim.nim
let s = readFile("cat_nim.nim")
echo s
```

Nim のコードは本当に簡単です。

## V

```cat_v.v
import os

s := os.read_file('cat_v.v')?
println(s)
```

V も簡単です。`read_file` がちゃんとモジュールの関数になっているのが好みです。

## Go

```cat_go.go
package main

import (
  "fmt"
  "io/ioutil"
)

func main() {
  s, err := ioutil.ReadFile("cat_go.go")
  if err != nil {
    panic(err)
  }
  fmt.Println(string(s))
}
```

ちょっとコード量が多い印象です。

## Rust

```rust:cat_rust.rs
use std::fs;

fn main() {
  let contents = fs::read_to_string("cat_rust.rs").expect("error");
  println!("{}", contents);
}
```

Rust はエラー処理を省略すると結構短く書けます。

## Haskell

```cat_haskell.hs
main = readFile "cat_haskell.hs" >>= putStrLn
```

1 行で書けました！

## C

```cat_c.c
#include <stdio.h>

int main() {
  char str[256];
  FILE *fp = fopen("cat_c.c", "r");
  while (fgets(str, sizeof(str), fp) != NULL) {
    printf("%s", str);
  }
  printf("\n");
  fclose(fp);
  return 0;
}
```

バッファを用意してそこに繰り返し読み込んで、とやっていることは原始的です。が、これが基本にして最速なんですね。

## C++

```cat_cpp.cpp
#include <fstream>
#include <iostream>

int main() {
  std::string s;
  std::ifstream f("cat_cpp.cpp");
  while (std::getline(f, s)) {
    std::cout << s << std::endl;
  }
  std::cout << std::endl;
  f.close();
  return 0;
}
```

C++ のライブラリを使っていますが、やっていることはほとんど C と変わらないです。
競技プログラミング練習記 No.23【ABC136練習】

初回 -> [はじめに](https://qiita.com/easychoco/items/a9ae28aca97cfe47091f)

[ABC136](https://atcoder.jp/contests/abc136)を解きました。
4完です。

|問題|時間|アルゴリズム|実行時間
|:-:|:-:|:-:|:-:|
| A |  1min |-|7ms|
| B | 17min |-|8ms|
| C | 10min |-|26ms|
| D | 40min |貪欲法|16ms|



## A - 	Transfer
```c++
	int a, b, c;
	cin >> a >> b >> c;
	cout << max(0, c - a + b);
```
> 容器 1 には水を A ミリリットルまで入れることができ、水が B ミリリットル入っています。

とあるので、残り`A-B`ミリリットルの水が入ります。

> 容器 2 には水が C ミリリットル入っています。

とあるので、`C`から`A-B`を引いた値が求める答えですね。
容器2の水をすべて移しても容器1がいっぱいにならない場合、答えは0になるので注意です。

## B - 	Uneven Numbers
``` c++
	int ans_num[6] = { 9, 0, 900, 0, 90000, 0 };

	int n;
	cin >> n;

	int digit = 0;
	int log = 1;
	while(n / log > 0)
	{
		digit++;
		log *= 10;
	}
	log /= 10;

	int ans = 0;
	for(int i = 0; i < digit - 1; ++i)
	{
		ans += ans_num[i];
	}
	if (digit & 1)
	{
		ans += n - log + 1;
	}
	cout << ans;
```
桁数が奇数の数字が何個あるかを求める問題です。
桁数が1の数字は9個
桁数が3の数字は900個
桁数が5の数字は90000個ですね。
これらを`ans_num`に置いています。
制約より、桁数が7以上の数字はこないです。

入力が`n`桁の時、`n-1`桁以下の数字で桁数が奇数の数を足します。
そのあと、入力値から`10^(n-1) - 1`を引いた数が答えになります。

例えば、21000の時
5桁なので、4桁以下の数字(1~9999)で桁数が奇数の数字の数を出します。
この数は`ans_num`より求まります。
そのあと、21000以下の5桁の数字の個数を足します。
そのような数は`10000~21000`の11001個ありますね。
これらをすべて足して答えがわかります。

## C - Build Stairs
``` c++
	int n, h;
	cin >> n;
	int post_h = 0;
	for(int i = 0; i < n; ++i)
	{
		cin >> h;
		if (post_h > h)
		{
			cout << "No";
			return;
		}
		post_h = max(post_h, h - 1);
	}
	cout << "Yes";
```
入力を受け取って、とりうる最小の値にします。
`post_h = max(post_h, h - 1);`
の部分です。
その状態で、次の入力で前より小さい値が来るとアウトです。

これを繰り返して、入力をすべて受け取ることができればOKです。

## D - Gathering Children


``` c++
	string s;
	cin >> s;
	s += 'R';

	int r_cnt = 0;
	int l_cnt = 0;
	for (int i = 0; i < s.length(); ++i)
	{
		if (s[i] == 'R')
		{
			r_cnt++;
		}
		else if (s[i] == 'L')
		{
			l_cnt++;
		}
		if (s[i] =='L' && s[i + 1] == 'R')
		{
			for(int i = 0; i < r_cnt - 1; ++i) cout << "0 ";
			cout << (r_cnt + 1) / 2 +  l_cnt      / 2 << " ";
			cout <<  r_cnt      / 2 + (l_cnt + 1) / 2 << " ";
			for(int i = 0; i < l_cnt - 1; ++i) cout << "0 ";

			r_cnt = 0;
			l_cnt = 0;
		}
	}
```
試行回数が10^100なので、十分すぎるほど多い数ですね。
つまり、収束した状態を求める問題だと分かります。

正規表現の`"R+L+"`にマッチする部分文字列ごとに独立していますね。
マッチした文字列ごとに収束した状態を計算します。

部分文字列のRからLに変わる部分のR・L人が集まり、他のRとLは人数が0ですね。
部分文字列に含まれるRの数とLの数がわかれば、それぞれ`r_cnt, l_cnt`として、
`(r_cnt + 1) / 2 +  l_cnt / 2`
`r_cnt / 2 + (l_cnt + 1) / 2`
の式でRからLに変わる部分の人数が分かります。

...という方針でやると、解けたのですが350msほど時間がかかってしまいました。
時間かかりすぎ感があったので、正規表現を使わない方法で書き直しました。
正規表現だと遅くなるのはわかっていたのですが、正規表現の練習ができたので良しとします。



以上です。ありがとうございました。
15 分で作る elastic + filebeat + kibana 環境

# はじめに
最近、[elastic の Github リポジトリ](https://github.com/elastic)に [Elastic 環境を一括で作成するレシピ](https://github.com/elastic/cloud-on-k8s/tree/master/config/recipes)が登録されました。
今回はそのレシピを使って 15 分でelastic + filebeat + kibana 環境を作る手順を紹介します。

本エントリーは[Elastic Cloud on Kubernetes のドキュメント内のQuickstart](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-quickstart.html)を元にしています。
本エントリーを実施した後にでも上記ドキュメントを参照いただくと、作成したリソースについて理解が深まると思います。

# 事前準備

事前準備の内容は次の通りです。


- Linux コマンドを実行できる環境。WSL やCloudShell 等
- k8s 環境。AKS 等
- kubectl コマンドが実行できるようログインを済ませておく

# 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576356/54109043-2d16-e49b-b766-35a3feb63b58.png)

# 構築

さっそく構築です。

## デプロイ

デプロイは次の順序で行います。

1. Elastic Cloud on Kubernetes を デプロイします
2. elastic のリポジトリからマニフェストファイルを clone して、デプロイします

### Elastic Cloud on Kubernetes を デプロイ

次のコマンドを実行します。

```
kubectl apply -f https://download.elastic.co/downloads/eck/1.1.1/all-in-one.yaml
```

### elastic のリポジトリからマニフェストファイルを clone して、デプロイ

次のコマンドを実行します。

```
git clone https://github.com/elastic/cloud-on-k8s.git
cd cloud-on-k8s/config/recipes/beats/
kubectl apply -f 0_ns.yaml
kubectl apply -f 1_monitor.yaml
kubectl apply -f 2_filebeat-kubernetes.yaml
kubectl apply -f 3_metricbeat-kubernetes.yaml
```

### 結果確認
次のコマンドを実行して Pod が Running になっていることを確認した後、次の手順に進みます。

```
kubectl get pod  -n beats
kubectl get svc  -n beats
```

## 設定変更

Kibana の設定を変更を行います。

### ポートフォワードと Kinaba ログインパスワードの確認

次のコマンドを実行して、作業パソコン向けのポートフォワードと Kinaba ログインパスワードの確認を行います。

```
kubectl port-forward service/monitor-kb-http 5601 -n beats &
kubectl get secret monitor-es-elastic-user -n beats -o=jsonpath='{.data.elastic}' | base64 --decode; echo
```

### Kibanaログイン

作業パソコンから `https://localhost:5601/`を開きます。※HTTPS なので注意！
ユーザ名「elastic」パスワードは先ほどのコマンドで確認した値を入力します。

### IndexPattern作成
左下のManagementからKibana - Index Patterns の設定を開き、[Create index pattern]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576356/e2f5a983-d568-6702-e19f-2fa9d6c5b279.png)

[index pattern]に「```filebeat-*```」と入力し[ > Next step]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576356/d0bb9bc3-bc92-7b40-5155-13144eb53f8a.png)

[Time Filter field name Refresh]にて「```@timestamp```」を選択し、[Create index pattern]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576356/7d5d8eb6-2785-3908-97a9-a1548f426740.png)

## 動作確認
画面左のメニューからコンパスアイコン(Discover)をクリックします。
インデックスパターンで```filebeat-*```を選択して、コンテナ名等で検索を行うと、ログが表示されます。
検索キーワードを変更すればNodeのログも確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576356/bcc2adb7-c4a8-12dd-8f15-ea1d7db72575.png)

# 参考URL

https://www.elastic.co/jp/blog/getting-started-with-elastic-cloud-on-kubernetes-deployment

https://qiita.com/tetsuyasodo/items/863de73ef6c1e9226ba2
ITILエキスパートとの問答

## ITILのエキスパートからアジャル開発へ投げかけられた質問への回答
これからお伝えする内容は、ITILのエキスパートとITIL向けのマガジンに連載していたコラムにQ/Aとして掲載していた内容です。

**Q.　改善を繰り返すという反復活動によって品質を上げていくということが言われているが、要件の設定があいまいだったり、テストが不十分な状況で開発を終了させたりしているのではないか？**
**A.**
自律した規律あるアジャイル開発チームでは、品質に拘った行動ができていますので、指摘された状況にはなりません。


**Q.　テストの準備と判断基準が混乱するのではないか？**　
**A.**
全ての作業は開発チーム全員であたります。ゴールイメージを共有しており、開発者個人毎の理解度のギャップが起きないように、様々なフィードバック・サイクルや、スプリント毎に『完了の定義』を開発チーム全員で決めていますので、従来手法より、基準が乱れるという現象を抑制できています。

**Q.　実稼働環境へ実装する回数が増え、間隔も短くなると思う。稼働環境が不安定な状態で使い続けることになるのではないか？
環境が安定しないうちに何度も展開が繰り返されると、運用面での対応が都度変わるということで混乱を招くことにはならないのか？
リリースを構築する段階でパッケージの構成が都度変わるという煩雑さで、混乱しないか？**
**A.**
基幹系や大規模システムではリリースや移行フェーズがあり、問題を起こさないように調整可能です。また、継続的デリバリーとImmutable Infrastructureを採用するとこの問題は解消されます。

**Q.　従来のリリースポリシーだと、変更の実装頻度、間隔の制約があるがこの変更には組織の抵抗がかなりのレベルであるように思われるが実現可能だろうか？**
**A.**
ユーザー部門にこの様な手法は受け入れやすいです。なぜならば、ユーザーは欲する価値をより早く手に入れる事が出来るからです。大規模システムで運用部門との関係が気掛かりであれば、リリースや移行フェーズを通ってリリースすることで容易に受け入れられると思います。組織のポリシーが壁になるようであれば、組織全体のビジネスの永続性を基本に、各セクションの本来のあるべき姿と価値を明確にして各セクションの振舞、調整を行うべきであり、従来のリリースポリシーを守る事が良いこととは思えません。

**Q.　変更の手続きと変更の認可を変えないと現状では困難だと思うだががどうか？**
**A.**
RFC（Request for Change）を変更、改修の要求としてプロダクトバックログに登録し、スプリントレビュー時にリリース承諾を得るように進めれば問題はないです。

**Q.　実装後の顧客の評価はどのタイミングでどのように行うべきなのか？**
**A.**
理想は随時ですが、チームの活動はイテレーションサイクルで行われているので、そのサイクルに同期させて実施してください。
インポートウィザードを利用した感想について

#はじめに
 Salesforceでデータを登録するとなると基本的にData Loaderを使われる方が多いと思います。
 先日、DataLoaderが起動しなくなってしまい仕方なくデータインポートウィザードを利用したため、
「インポートウィザード」について、個人的に良かった点、使いづらいと感じた点を紹介します。
 ※基本的な利用方法については、「参考URL」に記載されておりますので、割愛します。

#参考URL
 [https://help.salesforce.com/articleView?id=import_with_data_import_wizard.htm&type=5](https://help.salesforce.com/articleView?id=import_with_data_import_wizard.htm&type=5)
 
#良かった点
　1.項目のマッピングについてCSVのヘッダーは[API参照名]で記載する必要はなく、「表示ラベル」で紐づけが可能
　　※同一の表示ラベルがヘッダーに存在していると、CSVを画面にドラッグした際にエラーが発生して利用できません。
　　※予め重複するヘッダー名がないように修正してください。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657185/639af9d0-1485-cb31-d717-baca95f751e3.png)

　　
　2.ヘッダー名と完全一致するSF項目があれば、マッピング画面に遷移した瞬間に自動で紐づけを行ってくれます。


　3.紐づけが漏れている項目については目立つように表示されます。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657185/0848943d-c7ca-9926-7d64-ce616ef2d8ae.png)
　　上が紐づけなし、下が紐づけありの状態

　4.登録や更新を予定している対象オブジェクトから参照関係、主従関係を結んでいるオブジェクトに対して、
　「名前」「SalesforceID」「外部ID&ユニーク化した項目」のいずれかを選択して、紐づけることが可能。

　5.標準ユーザでも利用可能

　6.取引先と取引先責任者については、同じCSVから一度に登録が可能。
　　※主従関係が結ばれていることは関係なく特別にこのオブジェクトにだけ許可されています。
　　　カスタムオブジェクト等では主従関係にあっても同時に登録することはできません。
　
　7.登録や更新というデータ操作を受け付けない数式等はマッピングから除外されて表示されない。

　8.過去に利用した履歴をSalesforce画面から確認可能（期限あり）
　

#使いづらいと感じた点
　1.項目のマッピングについて、SF側で重複している名称が存在する場合、どちらが表示されているのか判別できない。
　
　2.複数レコードタイプを管理しているオブジェクトでは、１つのレコードタイプずつしかレコードが登録できない。
　
　3.50000件の制限があるため、大量データ登録には向かない。
　　インポートに利用するファイルサイズにも制限があるため同様に大量データ登録には向かない。

　4.外部ID設定とユニーク設定をしないと、参照・主従関係を設定する項目に表示すらされない。

　5.標準ユーザも利用できる関係上、項目レベルセキュリティの影響を受ける。
　　※なぜか項目は表示されないという原因を調べると項目レベルセキュリティによる制限によるものだった。

　※重要※
　6.登録可能な項目は選択したレコードタイプに紐づくレイアウトに表示されている項目に限る。

　7.データローダであれば取得可能な「xxxxshare」系を含む、オブジェクトへのデータ登録は不可

#所感

　・簡易的なデータの登録などを目的としている場合は、ラベルからAPI名への差し替えなどが必要がないため楽。

　・データローダに比べると、列数、行数、ファイルサイズなどの影響を大きく受けるため
　　大量データの登録や複数レコードタイプの登録には全く向かない。

　・前述したレイアウトに表示していないといけないという制限がかなり煩わしく
　　システム項目として用意したものは、レイアウトに基本表示しないため都度表示するなどの必要があり煩わしい。

　・ファイルをSF上に保存しておいて、定期的にインポートウィザードの時刻起動設定などで登録が行えるなどの
　　機能があれば、もう少し使いようもあった。

　あくまで個人の感想ですが、データローダの劣化版という印象しか受けませんでした。
　こういう時便利に使えますよ！というようなご意見ありましたら頂けると幸いです。