OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Face API と AWS Rekognition 無料の画像認識技術で北朝鮮に向けられた影武者説を突破する

#AzureもAWSも画像認識の一部の機能がデモ（無料）公開されている。
**AzureのFace APIは現時点ではアカウント登録なく誰でも利用可能。「顔検証」を選択する。**
https://azure.microsoft.com/ja-jp/services/cognitive-services/face/#demo
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/da2386ef-67a6-d63e-be3f-6cedbb4d00ed.png)

**AWS Rekognitionはアカウント登録必要。以下のURLでFace comparisonデモが使える。**
https://console.aws.amazon.com/rekognition/home
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/b73f0abe-22a6-c949-0f24-8045a0df2b1e.png)
AWSの場合はCelebrity recognitionで有名人と一致するかの確認もできる。

#健康不安説や影武者論で情報が錯綜している北朝鮮の金正恩委員長

比較対象の動画のソースとして2019年6月30日の板門店会談と2020年10月10日の朝鮮労働党創建75周年のイベントでの動画から静止画をキャプチャし金正恩委員長が同一人物であるか検証を行った。また、AWSの機能で有名人と一致するのかの確認を行った。
板門店会談：https://www.youtube.com/watch?v=pxb2wITegkM
創建75周年：https://www.youtube.com/watch?v=S3rfsnNva9w

#結論　ご本人は健在
AWSとAzureを比較するとAWSの方が同一人物であるとの結果が高くでた。
AWSは99.9%~100%の確率で一致と判断され、Azureの結果では9割程度の確率で同一人物と判断された。

【Azureの結果】
画像比較（～89%一致）：
![結果１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/bf385ced-2abb-fe1b-5239-4926f43871fa.png)
![結果２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/71dcd46b-93fd-03e5-53f8-eacb936f6ed4.png)
![結果３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/09c08f23-d2fb-e7c9-905f-f29132b04fdd.png)

【AWSの結果】
画像比較（～99.9%一致）：
![AWS結果1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/a2f59973-5ea3-fd52-7a5d-3dbf87e883bc.png)
![AWS結果2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/26d10b10-183a-6ac4-efae-876b5daf94ee.png)
有名人検索（100%一致）：
![AWS結果3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/f2dcd55b-bda4-8363-347f-c5571f580b4e.png)

言葉巧みなマスコミ、政治的な話に惑わされるのではなく自分自身で調べて真実が何なのかわかるようになってきているのは大きい気がする。
人はAzure, AWSで特定が容易になっている。
音楽についてはYouTubeでアップロードすれば（著作権管理がされていれば）どういう曲なのか直ぐに判明したりする。
お金をかけずに可能になってきていることは知っておいた方がよさそう。

#(追記)画像認識に弱点はあるのか？
似通った双子写真には弱い。AWS, Azure共に誤判定が相次ぐ。遺伝子が近い一卵性双生児は見抜くのが困難。兄弟姉妹や親子関係では別人扱いでも双子には弱い。逆の言い方をすると双子は機械的には区別できない同じ顔をしているということになる。これは認識しておこう。
【Java】Dateクラスでミリ秒を使って10日後の日付情報を取得する


#Dateクラスの扱いの練習

Dateについて勉強していましたが、
* エポックミリ秒についての理解
* 形式を指定して表示する方法


この2点においてあんまりちゃんと理解できていない部分があった感じがするのでまとめます。

本当はCalendarクラスのフィールドがよくわかっていないことで沼ってたというのもあるし、Java8からは新しい日付APIがありもう少し直感に近い扱いができるらしいですが、それについてもしっかり原始的なDateクラスの理解を始めた方がいいと感じたので、自分なりにいろいろ検証しつつ描いてみました。



__[Calendarクラスを使ったバージョン](https://qiita.com/mako0104/items/885ea7881486e2c67d98)も参考になれば__


#Dateクラスを使って10日後の日付情報を表示してみよう

```java:TenDaysDate.java
import java.text.SimpleDateFormat;
import java.util.Date;

public class TenDaysDate {

	public static void main(String[] args) {
		
		// Date型のlong値を変更して10日後の日付を取得
		Date d = new Date();									// 現在の日時を取得
		long ts = System.currentTimeMillis(); // 現在のエポックミリ秒を取得
		
		// Date型のgetTimeメソッドの返り値とcurrentTimeMillisの値を比較
		System.out.println("d.getTime:\t\t\t" + d.getTime());				// Date.getTimeの値
		System.out.println("currentTimeMillis:\t" + ts);						// currentTimeMillisの値
		if(ts == d.getTime()) System.out.println("いっしょやん");			// long値は一致します
		
		// Date型の日付情報を形式を指定して表示
		SimpleDateFormat f = new SimpleDateFormat("yyyy年MM月dd日"); // 表示形式を指定
		System.out.println("今日の日付:\t" + f.format(d));						// SimpleDateFormat型にDate型の引数を渡す
		
		// Date型のsetTimeメソッドで10日分のミリ秒を加算して10日後の日付情報に変更する
		d.setTime(d.getTime() + (long)(24 * 60 * 60 * 1000) * 10);	// ()が1日のミリ秒
		System.out.println("10日後の日付:\t" + f.format(d));					// SimpleDateFormat型にDate型の引数に渡す
	}

}

```

```:出力結果
d.getTime:			1602415769204
currentTimeMillis:	1602415769204
いっしょやん
今日の日付:	2020年10月11日
10日後の日付:	2020年10月21日
```

#getとset

```java

d.getTime(); // エポックミリ秒が返ってくる
d.setTime(エポックミリ秒); // エポックミリ秒を引数に渡して日付情報をセットする
```

####エポックミリ秒
1970年1月1日0時0分0秒UTCからの経過ミリ秒
Unix　Timeともいう
1日分のミリ秒は`24 * 60 * 60 * 1000`。これに10をかければ10日分のミリ秒になる。

また、`getTime() + 24 * 60 * 60 * 1000 * 10`とすることで、現在時刻よりさらに10日分のミリ秒経過後の日付情報を取得できる。

場合によっては`(long)24 * 60 * 60 * 1000`としてlong型にキャストする必要あり？

#うるい年などによって思った日付にならないこともある
10年後とかそういう中に閏年が出てくると、1年後のミリ秒として`24 * 60 * 60 * 1000 * 365 * 10`という風にしても、10年後の同じ月同じ日にならない。

長いスパンで計算するときは年フィールドなどに加算して計算しないといけませんね。ややこしい。
ピアレビュー(Peer Review)

AP試験学習記録27年秋 午前47

ソフトウェア開発に利用されるピアレビューの説明として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/140ab693-bc99-5ae8-0090-55cc178ab3b4.png)


１、ピアレビュー(Peer Review)
「ピア(peer)」には同僚という意味があり、ドキュメントやコーディング作業が終了したソースコードに対して、作成者の同僚や研究仲間など立場の近いもの同士が実施しあうレビューのことをいいます。

・成果物の品質や
・生産性の向上、及び
・チーム内での知識共有
を促進することを目的として実施され、
・「欠陥の有無」や
・「コーディング規約の遵守」
・「仕様書の内容が反映されているか」
などが検証されます。

代表的な手法として
　インスペクション、
　チームレビュー、
　ウォークスルー、
　パスアラウンド、
　ピアデスクチェック、
　アドホックレビューなど
があります。


・インスペクション(Inspection)は、
事前に役割を決められた参加者が責任のある第三者(モデレータ)の下で成果物を確認する、最も公式なレビュー技法です。通常3人から6人が参加して実施します。

他のレビュー法との違いは、参加者の役割が明確になっていること、チェックリストなど形式的な文書に基づいて実施すること、正式な記録を強調することです。

・ウォークスルーは、
開発者が主体となりエラーの早期発見を目的としてプログラムのステップごとにシミュレーションを行いながら確認をしていくレビュー技法です。

・パスアラウンドは、
電子メールなどを使って、対象の成果物を複数のレビュアに配布・回覧し、フィードバックを求めるレビュー技法です。

・デザインレビュー
成果物の内容を審査して，次の開発工程に進むための関門(審査・承認)として実施する。


・同じ立場の技術者同士でレビュー
早期に成果物から欠陥を取り除くことが目的なので，管理職のメンバの参加が必要である。

・共同レビュー
プロトタイピングで試作したソフトウェアの動作を，発注元の会社と検証する。



参照：
https://www.ap-siken.com/kakomon/27_aki/q47.html

https://qiita.com/lymansouka2017/items/190ec29b91b0a17665d8
「sympyの線積分：line_integrate(field, Curve, variables)」をprint typeしてみた。

(ソース参考)読書ノート>>SymPy 利用ノート
 https://showa-yojyo.github.io/notebook/python-sympy/integrals.html#id4

```fullscript.py
from sympy import *
var('t x y')
f1=[cos(t), sin(t)];print("f1",type(f1),f1)
f2=(t, 0, pi/2)    ;print("f2",type(f2),f2)
C = Curve(f1, f2)  ;print("C ",type(C) ,C )
f3=x*y             ;print("f3",type(f3),f3)
f4=[x, y]          ;print("f4",type(f4),f4)
print(line_integrate(f3, C, f4))

# f1 <class 'list'> [cos(t), sin(t)]
# f2 <class 'tuple'> (t, 0, pi/2)
# C  <class 'sympy.geometry.curve.Curve'> Curve((cos(t), sin(t)), (t, 0, pi/2))
# f3 <class 'sympy.core.mul.Mul'> x*y
# f4 <class 'list'> [x, y]
# 1/2
```

(参考)Curves
http://lidavidm.github.io/sympy/modules/geometry/curves.html
nginx+rbenv+Redmine+unicornをサブディレクトリ付きで動かそうとした際に対応しておきたいこと

# はじめに

もともとは、当方の作業進捗管理をするために、Redmineを導入することにしたのがきっかけです。

Redmine(今回は4.1.1を採用)を当方のVPSサーバー(CentOS7)にインストールするために、[このサイト](https://blog.websandbag.com/entry/2019/05/26/204240)を参考にして構築していました。当方はWebサーバーにnginxを使用しているため、有効活用することにしました。すでにrbenvをインストール済みで、Ruby2.6.4と2.7.2が入っています。

Webアプリのファイルはすべて /usr/share/nginx/html に収めています。

また、当方のサイトはメインサイトが有るため、サブディレクトリ(例：`/hoge`)でアクセスするようにしました。

そのときに発生した色々な問題と解決方法をここにメモすることにしました。

# 1. redmine-unicorn.service内ExecStartの修正

## 1-1. 起動するRubyのパスを指定

当方が`rbenv global`しているRubyは2.7.2。しかし、Redmine(4.1.1)は2.7に非対応…そのため、すでにrbenvを使用してインストールしている2.6.4を直接使用するために、redmine-unicorn.serviceのExecStartを修正する必要があります。

Ruby2.6.4をインストールしているディレクトリを`/usr/local/rbenv/versions/2.6.4`とすると、設定は以下のようになります。

```
[編集前]
ExecStart= bundle exec "unicorn_rails -c config/unicorn.rb -E production"
[編集後]
ExecStart= /usr/local/rbenv/versions/2.6.4/bin/bundle exec "PATH=$PATH:/usr/local/rbenv/versions/2.6.4/bin /usr/local/rbenv/versions/2.6.4/bin/unicorn_rails -c /usr/share/nginx/html/redmine/config/unicorn.rb -E production"

```

## 1-2. Unicornをデーモンで起動する設定を追加

Unicornを使って最新のRedmineを起動する際、Unicornをデーモンとして起動させる必要があります。付けないとエラーになります。
ExecStartに `-D`オプションを付けておきます

```
[変更前]
ExecStart=/usr/local/rbenv/versions/2.6.4/bin/bundle exec "(略) -E production"

[変更後]
ExecStart=/usr/local/rbenv/versions/2.6.4/bin/bundle exec "(略) -E production -D"
```

参考: https://teratail.com/questions/186552

## 1-3. オプションにサブディレクトリを指定

redmine-unicorn.serviceのExecStartに --pathオプションでサブディレクトリを指定します。

```
[変更前]
ExecStart=/usr/local/rbenv/versions/2.6.4/bin/bundle exec "(略) -E production -D"

[変更後]
ExecStart=/usr/local/rbenv/versions/2.6.4/bin/bundle exec "(略) -E production -D --path /hoge"
```

参考: https://qiita.com/61503891/items/732d9c123c39e35e97eb

# 2. ソケットは使わずhttpポートを使用

unicorn_redmine.sockでconnection refusedが起きるときは、unixソケットを使わず、httpポートを使うのも手です

* config/unicorn.rb

```
[変更前]
listen  File.expand_path('tmp/unicorn_redmine.sock', app_path)

[変更後]
listen 3000
```

* nginx/conf.d/(redmine用コンフィグファイル名)

```
[変更前]
upstream unicorn-redmine {
  server unix:/usr/share/nginx/html/redmine/tmp/unicorn_redmine.sock;
}

[変更後]
upstream unicorn-redmine {
  server 127.0.0.1:3000;
}
```

一旦サービスを落とした後、`tmp/unicorn.pid`が残っていればさっさと削除しちゃいましょう。

参考: https://teratail.com/questions/87083

# 3. config.ruをリネーム

ちゃんとここまで設定しているのにエラーが発生してまうので調べてみると、なんとconfig.ruが悪さしているという記事を見つけました。
config.ruが無くてもunicornがなんとかしてくれるそうなので、削除するかリネームしちゃったほうがいいでしょう。

```
mv config.ru config.ru.org
```

参考1: https://higelog.brassworks.jp/1760
参考2: http://im13.hatenablog.com/entry/2016/03/05/221916

# 4. 静的ファイルにアクセスさせるための設定

サブディレクトリ `/hoge` が付いているため、そのまま静的ファイルにアクセスしようとすると404エラーが返ってきます。
そのため、nginxのルーティング設定を使って、サーバー側のディレクトリに正しく誘導する必要があります。

```
        location ~ ^/hoge/.*/.*.(css|js|jpe?g|png|gif|ico|swf|woff2|ttf)$ {
                root    /usr/share/nginx/html/redmine/public;
                try_files $uri @app;
        }
```

# さいごに

これらの設定を経て、無事にRedmineがきれいに起動いたしました。めっちゃ感動…
気持ちえー！

![redmine_succeed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101034/e5df7550-aa6b-f87a-71ca-f3e32aabd512.png)
DFD(Data Flow Diagram)におけるデータストアの性質

AP試験学習記録27年秋 午前46

DFDにおけるデータストアの性質として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/cbf38c25-06ad-0a2c-e20f-ba8be65ddf75.png)


１、DFD(Data Flow Diagram)は、
データの流れに着目して、その対象となる業務のデータの流れと処理の関係をわかりやすく図式化する構造化分析の手法です。
　・「○」処理・プロセス，
　・「□」データの吸収先，
　・「→」データの流れ，
　・「〓」データストア
の4つの記号を用いて対象業務のモデル化を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/1245e733-84a0-d6e4-2a50-f7602290fb47.png)

性質：
・データストア自身がデータの加工を行うことはありません。データの作成や更新はプロセスで行います。
・データの流れは必ずデータフローによって記述されます。データストアに入ったデータが出て行くときは，データフロー以外のものを通ることがありません。
・ほかのデータストアと直接にデータフローで結ばれることはなく，処理が介在する。データストアは要求されたデータをプロセスに渡したり、プロセスから渡されたデータを蓄積する場所です。データストア同士がデータフローで結ばれることはありません。


参照：
https://www.ap-siken.com/kakomon/27_aki/q46.html
Navigator operation requested with a context that does not include a Navigator.の対処法



#修正前

```
import 'package:flutter/material.dart';
import 'package:flutter_location/home.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body:
          Center(
            child: RaisedButton(

              child: Text('次へ'),
              onPressed: (){
                Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => MyHome(),
                    )
                );
              },


            )
          )
      ),
    );
  }
}

```

#エラーコード
```
Navigator operation requested with a context that does not include a Navigator.
```

#原因
flutterの公式ドキュメントでは、画面遷移を行う際に、MaterialApp WidgetとScaffol Widgetを別のクラスに分けて書いていました。しかし、私のコードはそれらをまとめて一つのクラスで書いています。それが原因と考えました。

##修正後
```
import 'package:flutter/material.dart';
import 'package:flutter_location/home.dart';


void main() {
  runApp(MySignUp());
}

class MySignUp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(

      debugShowCheckedModeBanner: false,
      title: 'My Location App',
      home: MySignUpHome(),

    );
  }
}

class MySignUpHome extends StatelessWidget{

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RaisedButton(
          child: Text('Next to Home'),
          onPressed: (){
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => MyHome()),
            );
          },
        )
      ),
    );
  }
}

```

エラーが消え、画面遷移ができました。

#まとめ
公式のチュートリアルではMaterialApp WidgetとScaffold Widgetをまとめて書いてありました。今回なぜ分けなければいけなかったかは、分かっていません、、、
どなたか教えた頂けると助かります。

#参考
[Navigator operation requested with a context that does not include a Navigator.エラーの原因](https://qiita.com/hanach/items/5a1a1133727eb99a10aa)
Dartの配列(List)どうしの比較(忘備録)

DartのListはそのままだと比較できないのでその比較方法です。

```Dart
  List listA = [1, 2, 3];
  List listB = [1, 2, 3];
  print(listA == listB); // false
```

### 方法1：`foundation.dart`を使う

https://api.flutter.dev/flutter/foundation/foundation-library.html

#### import

```Dart
import 'package:flutter/foundation.dart'; 
```

#### listEqualsを使う
https://api.flutter.dev/flutter/foundation/listEquals.html

``` Dart
  List listA = [1, 2, 3];
  List listB = [1, 2, 3];
  print(listEquals(listA, listB)); // true
```

### 方法2：`collection.dart`を使う
https://pub.dev/packages/collection

#### import
```Dart
import 'package:collection/collection.dart'; 
```
※標準packageなのでpubspec.yamlなどへの追加は不要です

#### ListEquality().equalsを使う

``` Dart
  List listA = [1, 2, 3];
  List listB = [1, 2, 3];
  Function isEqual = const ListEquality().equals;
  print(isEqual(listA, listB)); // true
```

[参照](https://stackoverflow.com/questions/10404516/how-can-i-compare-lists-for-equality-in-dart)
【rails】railsを日本語化する

i18nというgemを使ってrailsを日本語化する方法を学習したため、
アウトプットいたします。

この記事を読むと、
・なぜ日本語化が必要なのか？
・i18nを使って日本語化する方法
を理解できます。

#なぜ日本語化が必要なのか？
railsのデフォルト言語は英語です。
（プログラミングのコードは全て英語）
つまり、何も設定を変えなければ、基本的には英語で表示されてしまいます。
そこで日本語化というものが必要になってきます。

ではどうすれば日本語化できるのでしょうか？

#i18nを使って日本語化する方法
①　config/application.rbを開く
config/application.rbはrailsの基本的な環境設定を記述するファイルです。
まずこのファイルを開けます。

②config.i18n.default_locale= :jaと打ち込む
config/application.rbのファイルに、

```
config.i18n.default_locale= :ja 
```

とコードを書いてください。
「:ja」はJapaneseを表しています。（英語は:en）

③日本語化ファイルをダウンロードする
自分で作成することもできますが、工数を減らすために、こちらからダウンロードしましょう。
https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

④ダウンロードしたファイルをconfi/localesに配置する


これで日本語化は完了です。
Developer Roadmapsをみて思ったこと

#プログラミング勉強日記
2020年10月11日
今日はイベントに参加して企業の方からDeveloper Roadmapsを見てみるといいよと教わったので、Frontend Developerをみて思ったことを簡単にまとめる。


#Frontend Developer
　最新のフロントエンドエンジニアになるためのロードマップ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/92de4b2a-82bc-96b9-4613-581a0de9da3f.png)
出典：[Frontend Developer](https://roadmap.sh/frontend)


#感想
　上から見ていくと、HTMLはわかる、CSSもわかる、JavaScriptもわかる(絶賛勉強中)、次のPackage Managersから少しずつ怪しくなっている。今勉強中のNode.jsでやっている内容だが、<b>動くコードを書くのではなく理解してコードを書く</b>ことが何よりも重要であると感じた。
　5月から独学で勉強を始めフロントエンドエンジニアを目指しているが、フロントエンドは奥が深く自分が思っていた以上に難しいことだと感じた。ただ、焦ってもなにもできないので、今勉強しているNext.jsやNode.js(express)など自分にできることを1つ1つ着実と進めていこうと思った。
redirect_toとrenderの違い

#はじめに

処理を書くたびにまだよく混同してしまうので、
パッとすぐ思い出せるようにメモしておきます。

#違い

###redirect_to

```user_controller.rb
def ~
 # 処理

 redirect_to("/app/posts/new")
end
```

指定先：
URL（/URL/〜/〜/)

ルート：
controller　→　URL　→　route　→　controller　→　view

主な用途：
データの更新や削除が必要な場合など　→　**「適切なcontrollerでの処理が必要」なとき**


###render

```user_controller.rb
def ~
 # 処理

 render("user/edit")
end
```

指定先：
ディレクトリ/ビュー

ルート：
controller　→　view

主な用途：
ログインや入力形式に失敗した場合など　→　**「ただエラーを表示させたい」とき**

#参考

[【Rails】renderとredirect_toの違いと使い分け](https://qiita.com/morikuma709/items/e9146465df2d8a094d78)
[【Rails】flashメッセージを使用して簡易メッセージを表示させる詳しい方法と解説](https://qiita.com/dice9494/items/2a0e92aba58a516e42e9)
MIME(Multipurpose Internet Mail Extension)、IMAP4（Internet Message Access Protocol Version 4）、POP3(Post Office Protocol Version 3)、SMTP（Simple Mail Transfer Protocol）

AP試験学習記録27年秋 午前33

電子メールの内容の機密性を高めるために用いられるプロトコルはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/26324b4a-17e6-2e98-597b-a8b5a1533153.png)

１、MIME(Multipurpose Internet Mail Extension)は、
ASCII文字しか使用できないSMTPを利用したメールで、日本語の2バイトコードや画像データを送信するための仕組みです。

S/MIME(Secure MIME)は、MIMEに暗号化とディジタル署名の機能を付け電子メールの機密性と完全性を高めたものです。

２、
・IMAP4
Internet Message Access Protocol Version 4の略。電子メールの受信に使われるプロトコルで、POPと違いメールサーバ内のメールを選択して受信することができます。

・POP3
Post Office Protocol Version 3の略。ユーザがメールサーバから自身の電子メールをとりだす処理において使用するプロトコルです。

・SMTP
Simple Mail Transfer Protocolの略。インターネット環境において、クライアントからサーバにメールを送信したり、サーバ間でメールを転送するのに用いられるプロトコルです。

参照：
https://www.ap-siken.com/kakomon/27_aki/q33.html
Unity ML-Agents で模倣学習やってみた

模倣学習やってみたです。コードは[こちら](https://github.com/machidyo/RollerBall)。

# 模倣学習とは？
人が操作した内容を基に学習することで、難しい内容でも学習を早く進められるというものです。

# やったこと
エージェントが反時計回りにぐるぐるまわれるようにすることです。
![bandicam-2020-10-10-20-24-48-884.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/c3b656b1-c718-b901-c13f-d9e50ad538c3.gif)

## 模倣内容は？
自分自身の操作で、反時計回りに5周ほど回してあげたものをデモとしています。

# 結果
水色：模倣あり
青色：模倣なし

## 学習グラフ
模倣ありのほうが早く学習していることがわかります。
![bandicam 2020-10-11 20-19-25-482.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/73cce530-b0d3-ad38-aac2-27d46d2e2cee.jpeg)

## 模倣ありは効率的
Extrinsic も Curiosity も、両方とも模倣ありのほうが早く良い報酬が得られるようになっていることがわかります。
![bandicam 2020-10-11 20-22-18-812.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/6cd0059c-cafb-d15b-1e50-8e154c8d947a.jpeg)![bandicam 2020-10-11 20-22-13-970.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/e01054bb-102b-a4fe-dc7a-3eaaee73d3a9.jpeg)
Reactの関数コンポーネントでMapbox GL JSを表示するデモ

よりよい実装->https://qiita.com/Kanahiro/items/cddabb26f3faf77dd81d

## はじめに
Vueが好きです（告白）
でもReactの方が流行ってるらしいのでキャッチアップしておかなきゃならんという事でcreate-react-appしてみました
とりあえずMapbox GL JSを表示したかったのですが、関数コンポーネントでちゃんと動く例がネット探してもなかったので備忘録兼ねて記事化しておきます

## 関数コンポーネント？
今まで使ってこなかったのであんまりよくわかってないですがクラスより関数の方が良いらしいです（関数型がトレンドという事でしょう）
ネット上で見つかるReact+Mapbox GL JSの例はほとんどクラスコンポーネントだったので、じゃあよりよいという関数コンポーネントでやってみようとしましたが、hooksがどうとか謎用語連発でちょっと困りました

https://sparkgeo.com/blog/build-a-react-mapboxgl-component-with-hooks/
参考サイト（でもこれをコピペしても動きません）

## コード

```typescript:App.tsx

import React, { CSSProperties, useEffect, useRef, useState } from 'react';
import mapboxgl from 'mapbox-gl';
import 'mapbox-gl/dist/mapbox-gl.css';

const styles: CSSProperties = {
    width: '100vw',
    height: 'calc(100vh - 80px)',
    position: 'absolute',
};

const App = () => {
    const [map, setMap] = useState(null);
    const mapContainer = useRef(null);

    useEffect(() => {
        const initializeMap = ({
            setMap,
            mapContainer,
        }: {
            setMap: any;
            mapContainer: any;
        }) => {
            const map = new mapboxgl.Map({
                container: mapContainer.current,
                style: 'YOUR_MAPBOX_STYLE_URL',
                center: [140, 44.0],
                zoom: 5,
            });

            map.on('load', () => {
                setMap(map);
                map.resize();
            });
        };

        if (!map) initializeMap({ setMap, mapContainer });
    }, [map]);

    return <div ref={mapContainer} style={styles} />;
};

export default App;
```

## メモ
リファレンス読んでないしほぼ語れる事がないのでほとんど推測

- useState()によりコンポーネント内の変数を1箇所で管理する（っぽい、たぶんgetterとsetterを提供してる）
- useRef()でクラス内のhtml的参照を変数で管理する（っぽい）
- CSSProperties、オブジェクト的にCSS書けるの強そう
宛先アドレスに合致するエントリの最長一致(ロンゲストマッチ)検索

AP試験学習記録27年秋 午前32


ルータがルーティングテーブルに①～④のエントリをもつとき，10.1.1.250 宛てのパケットをルーテイングする場合に選択するエントリはどれか。ここで，ルータは最長一致検索及び可変長サブネットマスクをサポートしているものとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e37477a7-ad63-eac6-cf66-03d7bb87ce2a.png)


１、最長一致(ロンゲストマッチ)検索
ルータは、ルーティングテーブル内に宛先アドレスに合致するエントリが複数ある場合には、プレフィックス長が最も長いエントリを選択します。これを最長一致(ロンゲストマッチ)検索といいます。

宛先アドレス「10.1.1.250」と各エントリを比較すると以下のように、①、②、③に合致することがわかります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/fd474405-6c3b-c0bd-6875-786ac91f79d1.png)


最長一致のは、エントリ③ですね。

参照：
https://www.ap-siken.com/kakomon/27_aki/q32.html

サブネット
https://qiita.com/lymansouka2017/items/995206b381493d4b8a65
PHPバージョンアップ時にphp7compatibilityを使ってコード互換性を確認する

PHPバージョンアップ時にphp7compatibilityを使うと互換性を簡単にチェックする事ができます。
php7compatibilityを使う時、環境セットアップに多少準備が必要になるのですが、docker環境なら、すでに作成済みのdockerイメージが公開されているので、だいぶお手軽に環境を構築して確認する事ができます。

例えば以下はPHP7.1に対しての互換性を確認する際のコマンド例。
`--ignore=vendor`でvender配下をチェックから除外する事が出来ます。

```php
docker run --rm -v $(pwd):/app vfac/php7compatibility 7.1 --extensions=php --ignore=vendor .
```

### 参考

[vfalies/php7compatibility](https://github.com/vfalies/php7compatibility)
候補キー(Candidate Key)

AP試験学習記録27年秋 午前28

関係R(A，B，C，D，E，F)において，次の関数従属が成立するとき，候補キーとなるのはどれか。

〔関数従属〕
A→B，A→F，B→C，C→D，{B，C}→E，{C，F}→A

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ebc49842-0675-4727-4581-3589acf83093.png)

１、
候補キー(Candidate Key)は、主キーの候補となるキーのことで、表の中の1つのレコードを特定できる性質を持つ属性、または属性の組合せです。

A→Bは、Aから、Bを決定できること。
質問には、その属性がすべての他の属性を決定できるかのこと。


C,F→A→B、F
B→C→D

B,F→A、C、D、E

なのでｍB,Fが候補キーでいいです。

参照：
https://www.ap-siken.com/kakomon/27_aki/q28.html
【Python】 統計値（特徴量）の種類と計算方法

#インポート
numpyとscipyを使いますので、はじめにインポートしてください。

```python:import

import numpy as np
import scipy.stats
```

#最大値、最小値

```python:max,min
#最大値
np.max(data)

# 最小値
np.min(data)
```
#中央値
```python:median
# 中央値
np.median(data)
```

#平均、分散、標準偏差
Numpyを使って分散、標準偏差を求めた場合、デフォルトで不偏分散・不偏標準偏差が返される。

```python:mean,var,std
# 平均
np.mean(data)

# 分散
np.var(data)

# 標準偏差
np.std(data)
```

#歪度、尖度

```python:skew,kurt
# 歪度
scipy.stats.skew(data)

# 尖度
scipy.stats.kurtosis(data)
```

#自乗平均平方根

```python:rms
# 自乗平均平方根
np.sqrt(np.square(data).mean())
```

#周波数領域エントロピー

```python:ent
# FFT
fft_data = np.fft.fft(data)

# パワースペクトル
power_data = abs(fft_data)**2

# パワースペクトルの割合
p = power_data / sum(power_data)

# 周波数領域エントロピー

ent(data)

def ent(data):
   ent = 0
   for i in range(data_size):
       ent += data[i]*np.log2(data[i])
   return -ent
```
MacBook Pro 13インチ Late 2013 を macOS Mojave + XCode 11.3.1 にバージョンアップするメモ

ハードディスクを整理して、20GBまで空きスペースを作ったので、やっとMojaveとXCodeをバージョンアップしたので、その際のメモです。

# 環境

* MacBook Pro (Retina, 13-inch, Late 2013)

## バージョンアップ前

* macOS 10.13.6（High Sierra)
* XCode Version 10.1


## バージョンアップ後

* macOS 10.14.6(Mojave)
* XCode Version 11.3.1 (11C505)


# バックアップ作成

どんな方法でも良いのでバックアップしましょう。

今回は手持ちの外付けHDDに、ユーザーフォルダのみバックアップしました。

# 電源

ACアダプターから電源を取るようにします。

# macOS のバージョンアップ

こちらから、
macOS Mojave にアップグレードする方法
https://support.apple.com/ja-jp/HT210190

>macOS Mojave をダウンロードする

のあたりから、App Store経由でダウンロードします。

2~3時間かかるので、休みの時に時間をかけてやるのがおすすめです。

OSが更新されて再起動されたら、このMacについてからバージョンを確認します。

![スクリーンショット 2020-10-11 19.36.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/d94e08d3-ea72-4d94-e4cd-2f5b4f15897a.png)

# XCodeのバージョンアップ

MacOSがバージョンアップできたので、バージョンアップした macOS 10.14.6 に対応したXCodeをバージョンアップします。

現時点(2020-10-11)でのmacOS 10.14.6 に対応したXCodeはVersion 11.3.1なので、こちらをダウンロードします。

App Store経由では以前のバージョンのXCodeはダウンロードできないので、下記よりダウンロードします。

More Downloads for Apple Developers
https://developer.apple.com/download/more/

※Developer登録が必要です。

![スクリーンショット 2020-10-11 19.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/531186a2-1159-2d92-7bb0-04e0f1b5438e.png)


Xcode_11.3.1.xip をダウンロードします。
1時間程度かかります。

ダウンロードできたら、ダブルクリックして展開するとXCode.appが展開したフォルダにできるので、それをアプリケーションフォルダに移動します（以前のバージョンは上書きでOK）

XCodeを起動して（初回起動時に処理が走ります）、バージョンを確認します。

![スクリーンショット 2020-10-11 19.04.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/c396fbde-7076-5a4f-4237-eec43461ebfa.png)

# 参考

* [Xcode - インストール可能 対応バージョン macOS 一覧 / Install Support macOS Version Lists 【 2020.06 】](https://qiita.com/thinkalot/items/1dfdba642906c1bf1fd2)
Gitlab CI[編集中]


##　参考記事
[GitLab CIとJenkinsの違いについて](https://qiita.com/namutaka/items/5114e9d9faf953bef6a4)
[GitLabのgitlab-runnerを使えるようにするまでの備忘録](https://qiita.com/sky_jokerxx/items/2a264a0194a5cbc7bd12)
[GitLab RunnerでCI/CDしてみる(前編)](https://dev.classmethod.jp/articles/gitlab-runner-ci-cd-1/)
[GitLab CI で CI 環境構築](https://qiita.com/nejiko96/items/3075b3764770488a8ee8)
[GitLab CIでテスト・ビルド・デプロイを自動化する](https://qiita.com/bremen/items/f47f383b9931a840a25c)
今すぐ追加すべき拡張機能!! 【Wappalyzer】

#【今すぐ追加すべき拡張機能!! 【Wappalyzer】】

独学でプログラミングを学習している時やポートフォリオ作成時に、参考にしたサイトがどのような技術で構成されているのだろう？と思ったことはありませんか？
私はそう思うことがあったので調べてみました。

すると、Wappalyzerという拡張機能があることを知りました。
とても便利なので知ってもらいたくて、記事に投稿しました！

##Wappalyzer

便利な拡張機能です。
これを使うと、閲覧したサイトではどのような技術が使用されているのか確認することができます。

※全てのサイト、サイト内で使用されている全ての技術を１００％確認できるものではありません。

##Wappalyzerの追加手順

１、[Wappalyzer -Chomeウェブ]
(https://chrome.google.com/webstore/detail/wappalyzer/gppongmhjkpfnbhagpmjfkannfbllamg?hl=ja/)を開く。

２、画面右上部に「Choromeに追加」と表示されるので、それを押すことで拡張機能を追加できます。（私は、既に追加しているので「Choromeから削除します」となっています。）

![スクリーンショット 2020-10-11 19.08.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472549/10cb7abc-8642-87e0-f0f7-99855866c5a3.png)

３、完了すると、Chomeの右上に紫色のものが表示されます。
![スクリーンショット 2020-10-11 19.22.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472549/2441a37a-66c4-63d5-d802-95af37e76dd5.png)

##Wappalyzerで、Qiitaのサイトで使用されている技術を確認

このように、Qiitaのサイトで使用されている技術が確認できます。

私が個人的に学習している Ruby, Ruby on Rails などがQiitaで使用されていることが確認できました。

![スクリーンショット 2020-10-11 19.33.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472549/c1767acc-78ce-a2d4-ace9-c74b79a1bd1d.png)
AWS初学者が認定資格SAAの取得を目指す①〜AWSとは？〜

#本記事について 
本記事はAWS認定資格SAA(ソリューションアーキテクト アソシエイト)の資格を取得するための学習で調べたキーワードを書き留めるための記事です。
まず初めに軽くではありますがAWSとは何かについて記しておきます。

## AWSとは
AWSとはAmazon Web Servicesの略で、Amazonが提供している100以上の**クラウドコンピューティングサービス**の総称、とググると出てきます。
自分はこの文章では何もわからずちんぷんかんぷんでした...
なのでとりあえずは**クラウドコンピューティング**とは何か？からみていきます。

### クラウドコンピューティング
クラウドコンピューティングとはインターネットを介してサーバー・DB・ストレージ・ソフトウェアなどのコンピュータを使った色々なサービスを意味しています。PCとインターネットさえあれば誰でもサーバーやDB・ストレージなどを利用できるのです！
このたくさんのサービスを提供しているのが**AWS**という事ですね！

ちなみにクラウドコンピューティングができるまでは、会社の建物内などに直接サーバーを設置して運用する「物理サーバ」を使うやり方を**オンプレミス**と呼びます。
オンプレミスは時間や費用・場所などの確保が必要となるので、クラウドコンピューティングがとても便利なものかがわかりますね！

## 代表的なサービス
AWSの代表的なサービスを４つまとめていこうと思います。


### EC2
EC2とは「Amazon Elastic Compute Cloud」の略で、簡単にいうとAWS上に**サーバーを構築し利用できる**サービスです。WEB上でサーバーを持てるという事です！
また、Elasticには伸縮性や弾力性といった意味がありユーザーの必要に応じて変更できることが強みで、スペック不足などの対処も容易であります。
EC2では仮想サーバーのことを**インスタンス**と呼びます。
インスタンスを複数に分けることで可用性や信頼性を考慮した運用ができます。
仮想サーバーではLinuxやWindowsといったOSが利用可能で、自動的にサーバーの構築とインストールを行ってくれます。
**キーペア**というインスタンスにログインする際に必要な「秘密鍵」も用意されていて、ログイン情報も安全に管理されています。

また、EC2には3つの料金体制があります。

・オンデマンドインスタンス
サーバーの利用時間によって料金が発生する**従量課金**のスタイルです。
短時間や限られたタイミングでだけ利用したいときや、試しに仮想サーバーの運用を始める際に適しています。

・リザーブドインスタンス
稼働時間を事前に設定して、**料金を先に支払う方法**です。
常にインスタンスを利用したいが、予算はオーバーしたくないといったときに役立つでしょう。

・スポットインスタンス
AWS内で使われていないコンピューティングリソースをお得に利用する方法です。
条件はありますが、最大で90％割引で利用できるため、コスト重視での利用を求める場合におすすめされます。


### S3
S3とは**オンラインストレージや静的なコンテンツを配信することができる**サービスです。
イレブンナインというとても高い耐久性を誇り、データ消失の可能性が限りなくゼロに近いと言われています。（ちなみの確率で言うと1,000万年に1度の確率みたいです）
主な機能として「ライフサイクル」、「バージョニング」、「イベント」、「暗号化」、「アクセス権限」、「ログ記録」、「静的Webサイトホスティング機能」があります。
こちらの機能については別の記事で改めて書きたいと思います。


### RDS
RDSとは**リレーショナル型データベース**(関係性データベース)機能を提供するサービスです。
リレーショナル型データベースとは、行と列の2つの軸で表されるデータベースのことで情報の統合性や管理効率化に優れています。
RDSで利用できるRDBMS(Relational DataBase Management Systemの略でデータベースを管理するためのソフトウェア)は「MySQL」、「Postgre SQL」、「Amazon Aurora」、「ORACLE」、「SQL server」、「Maria DB」があります。
詳しくはAWS公式HPを参照してください。
https://aws.amazon.com/jp/rds/


### Lambda
Lambdaとはサーバーレスの**FaaS(Function as a Service：ファース、エフアース)**です。
これだけだとちんぷんかんぷんですね...
Faasとはクラウド利用形態の一つでインターネットを通じて、プログラミングで作成した処理を定義・実行するクラウドの利用形態です。要するにサーバーレスの名前の通りサーバーがいらないと言うことですね。本来ならWEBアプリケーションを運用管理するには、サーバーやミドルウェアも管理しないといけないのですが、LambdaはそれらをAWSが行ってくれるのです。なので運用管理を行う必要がなく、アプリケーションやプログラムコードだけを作成すれば、Webアプリケーションを公開できるようになります。


## AWSのメリット・デメリット
AWSのメリットとデメリットについてまとめます。

### メリット
1. **費用面**
ハードウェア・ソフトウェアの購入が不要で従量課金制のため定額制とは違い無駄だコストを抑えられます。

2. **セキュリティ**
常に最新のセキュアが施され、第三者機関認証も利用できます。

3. **拡張性**
メモリやストレージなどの拡張が簡単に行えます。

4.**俊敏性**
PCとインターネット環境さえあればできるので手軽に素早く利用できます。

5.**場所**
物理的なサーバーが不要なので場所を確保する必要がありません。

### デメリット
1.**費用面**
従量課金制のため費用の予算が組みづらいです。

2.　**サービスの理解**
サービスの種類が多すぎて(100種類以上)、全てを把握するのが難しいです。


#　まとめ
とりあえず簡単ではありますがAWSとは何かを自分なりに描いてみました。
詳しく書くとキリがないので省いてしまった部分もありますが誰かのためになると嬉しいです。

※ここ間違ってる！などありましたらコメントいただけると幸いです。
[rails]herokuのデプロイエラーActionView::Template::Error (Mysql2::Error: Table --- doesn't exist):






herokuにデプロイした際にエラーが出てしまいました。We are sorry...というやつです...



#エラー内容

heroku logs --tail --app [app名] でログを確認したところ以下mのようなエラーが出ました
これはあるテーブルでエラーが出ているみたいですね

```
ActionView::Template::Error (Mysql2::Error: Table 'heroku----' doesn't exist):
```


#考えられる原因

調べましたところ、このエラー文で考えられる原因は以下の3点でした(他にもある可能性はあります )

###1railsのバージョンの問題

rails５.0と5.2の場合はこのようなエラーが出ることがあるみたいです
migrationファイルの書き方,型に問題があるといった点で問題があるみたいです
私は6.0であまり詳しくしらべてませんので　もし当てはまるかたは調べてみてください


###2 調べたときにupになっていない　or　NO FILEがある。

ターミナルでrails db:migrate:statusをうって確認してみてください
no fileがあった場合は削除しなければなりません（別の記事に方法載せてます。）



###3 heroku上ののSQLでちゃんとmigrateされていない

heroku run rails db:migrate

これで直りました。


######というかしっかりエラー文を読むと明らかにこれでが原因でしかないのかもしれません。...

以上でした
Webメールクライアント RainloopをCentOS8にインストールする

# Rainloopってなに？

DB不要のお手軽Webmailクライアントです。
SquirrelMailが有名でしたが、マルチアカウントに対応したWebmailクライアントで便利に使っていました。
CentOS8化を期に手順をまとめておこうとおもいます。

# インストール

## SELinux

~~つかえません~~つかいません。

本来はSELinuxを有効にしましょう。と言いたいところですが、
SELinux周りで躓くくらいなら先に動かしてヒャッホイしたいということでスキップします。
いわゆる技量不足のため麺硬めはできません。ってやつです。美味しく食べてください。
（社内公開用だからあれだけど、外部公開する時はメリデメ見極めて採用可否を判断してくださいね。）

## お約束のremi レポジトリ追加
```
# dnf install -y epel-release
# dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
```

## dnf-utilのインストール

```
# dnf install -y dnf-utils
```

## PHP7.4インストール

```
# dnf module install php:remi-7.4
```

## php設定まわり

```
# cp -p /etc/php.ini{,.bak.`date +%Y%m%d`}
# vi /etc/php.ini
# diff /etc/php.ini{,.bak.`date +%Y%m%d`}
694c694
< post_max_size = 10G
---
> post_max_size = 8M
846c846
< upload_max_filesize = 10G
---
> upload_max_filesize = 2M
924d923
< date.timezone = "Asia/Tokyo"
```
## httpdのインストール

```
# dnf module install -y httpd
# systemctl enable --now httpd
```

## firewall開放

```
# firewall-cmd --add-service=http --permanent
# firewall-cmd --reload
```

## rainloopのインストール

```
# cd /var/www/html
# curl -sL https://repository.rainloop.net/installer.php | php


       [RainLoop Webmail Installer]


 * Connecting to repository ...
 * Downloading package ...
 * Complete downloading!
 * Installing package ...
PHP Notice:  A non well formed numeric value encountered in /var/www/html/ff1fcaf169289dd373a566cbacd9f706/ff1fcaf169289dd373a566cbacd9f706.lib on line 1849
 * Complete installing!

 * [Success] Installation is finished!

```

## permissionの変更

```
# chmod 777 data
```

## 初期セットアップ

ブラウザで`http://{IPアドレス}/?/admin`へアクセスする。
chromeの場合、パスワード漏洩の警告でますが、気にせずOKをクリック。

|ID:| PW:|
|:--|:--|
|admin| 123456|
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126158/a9007794-484b-f78d-1b65-69ebfc2c5436.png)

- Language、Language(admin)をJapaneseに変更する
- 管理者パスワードの変更
を忘れず実施。

# ドメイン
ドメイン単位で、IMAP/SMTPサーバーの設定情報を入力する

# ログイン
ログイン時はメールアドレスと、メールアカウントのパスワードでログインする
IMAPフォルダを直接ブラウザ上に表示してくれるため、ディスク消費しない。
結合テストコードでのエラー文　but there were no matches　に苦しめられた

# エラー文
```
  1) ユーザー詳細ページ ユーザー詳細ページが表示されない ログインしていないとログイン画面に遷移する
     Failure/Error: expect(page).to have_link "by #{@prototype.user.name}", href: user_path(@prototype.user)
       expected to find link "by YU" with href "/users/1670" but there were no matches
```
のような感じです。
#結論
expect().to have_linkのhref属性にはprefixは使えないぽいです。
URIの形で記載しなければならないのかなと思います。
また何かわかったら追記します。


###エラー
```
expect(page).to have_link "by #{@prototype.user.name}", href: user_path(@prototype.user)
```
＃＃＃エラーが解消

```
expect(page).to have_link "by #{@prototype.user.name}", href: "/users/#{@prototype.user.id}"
```

#何をしていたか
結合テスとコードをRspecで書いていました。
Twitterのように何か投稿をしてその投稿に組み込んだ"by 名前"をクリックするとその名前の人の詳細ページに飛ぶというものです。have_linkメソッドはaタグに使用できるものなので、リンクのボタンにそのリンクがついているかというテストをするときに使うと思います。

以上
【2D OD】PANet : FPN２回version


<h1>Path Aggregation Network for Instance Segmentation</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/44bd85fb-258c-f951-d77f-e79b71949125.png)
2018年にSOTAになったPANetについてみていく。

Mask-RCNNを拡張したモデルになっている。

Instance SegmentationとObject Detectionの精度を上げるため、全体の特徴を捉えつつ、localの特徴も捉えらるような構造となっている。

Mask-RCNNとFPN(Feature Pyramid Network)に関して理解してると分かりやすいと思う。



<h1>アルゴリズム</h1>
<h2>Bottom-up Path Augmentation</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/5b0014c1-aba3-e4ed-09a9-4bb34e612cfe.png)

エッジなどの局所的なパターンへの感度が高いと位置検出の精度が向上する
→下位層の情報を伝播させやすくすることで、候補領域抽出をより正確にする


<h2>Adaptive feature pooling</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/baeee630-9398-d96a-24e9-6370ac9e862a.png)

FPN(Feature Pyramid Network)では候補領域のサイズごとに処理していた。
しかし、違う解像度の情報も使えたらもっと精度があがんじゃない？！
Chanelごとの最大値を取って結合している。


<h2>Fully-connected Fusion</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/5056d003-685f-993d-6ac0-034ddc5f04e2.png)

fcレイヤーは、前景を予測するために使用される(赤いBox)
前景が予測出来ればInstance Segmentationの精度もあがる。





<h1>結論</h1>
GlobalとLocalの特徴を捉えらた事で精度が上がった。


<h1>参考文献</h1>
Path Aggregation Network for Instance Segmentation
https://arxiv.org/pdf/1803.01534v4.pdf
PANet論文読み
https://qiita.com/Q_ys/items/e303c5e0121b1226cd50
kubernetesでiSCSIを使用する。

# 前置き
UbuntuでiSCSIを使用する方法は以下のサイトを参照する。
https://www.server-world.info/query?os=Ubuntu_18.04&p=iscsi&f=1

Kuberenetesネットワークの設定は省略

iscsiを立てたサーバのIPは192.168.0.120とし、ホスト名はk8s-nasである
マウントするディスクはXFSでフォーマットする

# フォルダ構成
以下のフォルダ構成を行う

```
./
├── iscsi-chap-secret.yaml
├── iscsi-provisioner-pv.yaml
├── iscsi-provisioner-pvc.yaml
└── pod
    └── iscsi-test-pod.yaml
```

# ファイル説明
## パスワード定義設定
ユーザーネームがusernameでパスワードがpasswordのときは以下の通り記載する。

```yaml:iscsi-chap-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: iscsi-targetd-chap-secret
type: "kubernetes.io/iscsi-chap"
data:
  discovery.sendtargets.auth.username: dXNlcm5hbWUK
  discovery.sendtargets.auth.password: cGFzc3dvcmQK
```

補足として、base64のエンコードコマンドをいかに記載する。

```bash
$ echo username |base64
dXNlcm5hbWUK
$ echo password |base64
cGFzc3dvcmQK
```
## PersistentVolume設定

```yaml:iscsi-provisioner-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: iscsi-pv
spec:
  capacity:
    storage: 10Gi
  persistentVolumeReclaimPolicy: Retain
  accessModes:
    - ReadWriteOnce
  iscsi:
    targetPortal: 192.168.0.120:3260
    iqn: iqn.2020-10.local:k8s-nas.target01
    lun: 1
    # fsType: ext4
    fsType: xfs
    chapAuthDiscovery: true 
    chapAuthSession: true
    readOnly: false 
    secretRef:
      name: iscsi-targetd-chap-secret
```

## PersistentVolumeClaim設定

```yaml:iscsi-provisioner-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
  annotations:
    volume.beta.kubernetes.io/persistent-volume: iscsi-pv
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
```

## 接続用podの設定
podにiscsiをマウントする。

```yaml:iscsi-test-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: iscsi-pvc-pod
  name: iscsi-pv-pod1
spec:
  securityContext:
    fsGroup: 1001
  containers:
  - name: iscsi-pv-busybox
    image: busybox
    command: ["/bin/sh", "-c"]
    args: [ "tail -f /dev/null" ]
    securityContext:
      runAsUser: 1009
    volumeMounts:
    - name: iscsi-vol1
      mountPath: /var/lib/busybox
      readOnly: false
  volumes:
  - name: iscsi-vol1
    persistentVolumeClaim:
      claimName: myclaim
```
# 起動方法について

```bash
kubectl apply -f ./
kubectl apply -f ./pod/iscsi-test-pod.yaml
```

# 動作確認
以下のコマンドでpodで内に入る

```bash
kubectl exec -it pod/iscsi-pv-pod1 /bin/ash
```

以下のコマンドで、永続ストレージ部分にデータを保存をする。

```bash
echo Hello > /var/lib/busybox/test.txt
```

masterにiscsiにマウントディスク内容を調べるとtext.txtが作成される。
Tensorflow 2で1系記法のCNNを動かす方法

## 想定読者
 - Tensorflow 2の環境で1系のコードで書かれたCNN(畳み込みNN)を動かそうと試行錯誤している人

## 前提
### 実行環境
* macOS High Sierra
* Python 3.7.8
* Tensorflow 2.3.1

### CNNのコードについて
コードは諸事情により載せませんが、

* MNISTのデータ取得に`tf.keras.*` を使用
* その他 `tf.nn.*`, `tf.train.*`, `tf.*` を使用

して、CNNを実行しているコードです。

## 1系から2系への主な変更点

Tensorflow 1から2への主な変更点については、 [こちら](https://data-analysis-stats.jp/%E6%B7%B1%E5%B1%9E%E5%AD%A6%E7%BF%92/tensorflow-2-0-%E4%B8%BB%E3%81%AA%E5%A4%89%E6%9B%B4%E7%82%B9/) 等いろいろな記事を拝見しましたが、CNNを実行する上で直接影響のあったものは以下でした。

* Eager Executionのデフォルト化
* Session, Placeholderの廃止

※ CNNの実装方法によっては他にもあるかもしれませんがその点はご容赦ください。


## 1系記法のコードを2系で動かす方法
1系記法のCNNを2系で動かす(ためにコードを変更する)方法は以下の3つがあるようです。

1. 変更のあったAPIを地道に書き換える
2. アップデートスクリプトを活用する
3. 2系挙動を無効化する


### 1. 変更のあったAPIを地道に書き換える
賢い方法ではありませんが、変更箇所が少なければ該当箇所を地道に書き換えるというのもなくはないかと思います。CNNを動かすために要した修正を以下に示します。

#### (1) Eager Executionの無効化
`import tensorflow as tf` の直後に以下を追記し、Eager Executionを無効化する。

```python
tf.compat.v1.disable_eager_execution()
```

#### (2) いくつかのAPIの記法変更
コード内の **'1系'** の列に該当するAPIを **'2系'** にある記載の通りに変更する。

|#|1系|2系|
|:---|:---|:---|
|1|tf.placeholder|tf **.compat.v1.**placeholder|
|2|tf.random_uniform|tf.random.uniform|
|3|tf.add_to_collection|tf **.compat.v1.**add_to_collection|
|4|tf.get_collection('costs')|tf **.compat.v1.**get_collection|
|5|tf.train.AdamOptimizer|tf **.compat.v1.**train.AdamOptimizer|
|6|tf.Session()|tf **.compat.v1.**Session()|

**#2**のような単純に `compat.v1` を追加ではないものもありました。
上記以外で `compat.v1` の追加が必要なAPIについては、[Tensorflow Module: tf.compat.v1](https://www.tensorflow.org/api_docs/python/tf/compat/v1)をご参照ください。

### 2. アップデートスクリプトを活用する
[コードをTensorFlow 2に自動的にアップグレードする](https://www.tensorflow.org/guide/upgrade)を参考に、アップデートスクリプトを用いて、コードを2系記法に変換する方法もあるようです。1の手動変換よりは安全かと思いますが、一部手動変換を要する箇所もあるような記述もあり、全自動ではなさそうです。

### 3. 2系挙動を無効化する
[TensorFlow1コードをTensorFlow2に移行します](https://www.tensorflow.org/guide/migrate)によると、
Tensorflowのインポート文

```python
import tensorflow as tf
```

を

```python

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
```

のように変更して2系挙動を無効化することで、1系記法のコードが実行できるようになるようです。(私のコードでは実行が確認できました)

## 終わりに
3の方法で動いたら一番嬉しいですね。
私は1をした後に3の方法を見つけたのでそういう人が出ないようにこれを書きました。
どんどんTensorflowに慣れていきたいものです。
『りあクト！Firebaseで始めるサーバーレスReact開発』を読んで、為になったことまとめ  1-1基本環境を作る

# はじめに
[りあクト！Firebaseで始めるサーバーレスReact開発](https://booth.pm/ja/items/1572683)を読んで、個人的に為になったTIPSを学習記録としてまとめます。

# Typescriptの設定でコンパイル高速化
Typescriptの設定ファイルtsconfig.jsonにincrementalを有効にするオプションを記述すると再コンパイルの時間を短縮することができ、ホットリロードにかかる時間も短くなる

```json:tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react",
    "baseUrl": "src",
    "incremental": true //←追記
  },
  "include": [
    "src"
  ],
  "exclude": ["node_modules","build","scripts","functions"]
}

```

# TypeScriptの型定義ファイル自動インストール
パッケージのtypesyncを使用すればpackage.jsonの中身を調べて、必要な型ファイルがなければ自動でdevDevpendenciesに追加してくれる。

```
$ npm install -g typesync
$ typesync
```

# コミット時に自動でLintチェック
`husky`と`lint-staged`というパッケージを使うことで、コミット実行前にLintチェックすることができる。
`husky`はgitに用意されているhooks機能と同様のタイミングに処理を登録することができ、コミット前だけでなくpush実行前など、[ここ](https://git-scm.com/docs/githooks)に定義されているほとんどのhooksを使用できる。
`lint-staged`はgitでステージングされたファイルのみにLintチェックすることができる。  


設定は```package.json```に記述する。

```json
  "scripts": {
    ︙
    ︙
    "precommit": "lint-staged"
  }
  ︙
  ︙
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "src/**/*.{js,jsx,ts,tsx}": [
      "eslint --fix",
      "git add"
    ],
    "src/**/*.{css,jsx,tsx}": [
      "stylelint --fix",
      "git add"
    ],
    "functions/src/**/*.{js,ts}": [
      "cd functions/ && eslint --fix",
      "git add"
    ]
  },
```

# 参考
りあクト！Firebaseで始めるサーバーレスReact開発(https://booth.pm/ja/items/1572683)
https://typescript-jp.gitbook.io/deep-dive/intro-2/husky
https://qiita.com/khlizard/items/dfe1ec9d82c0ed5da7c6
https://github.com/typicode/husky/tree/master
https://kic-yuuki.hatenablog.com/entry/2019/05/27/090515
https://github.com/okonet/lint-staged
https://kray.jp/blog/expound-git-add/
【Rails6】Capistranoでのデプロイ時、CircleCI仮想環境からEC2へのSSH接続に失敗する

#事象
Capistranoでのデプロイ時、CircleCI仮想環境からEC2へのSSH接続に失敗する

```
Net::SSH::AuthenticationFailed: Authentication failed for user *****@*************
```
[![Image from Gyazo](https://i.gyazo.com/a9b6fa69b7a4947d03433ce21e73a8bb.png)](https://gyazo.com/a9b6fa69b7a4947d03433ce21e73a8bb)
#前提
CircleCIの導入については以下の記事を参考にさせていただいたので、
記事の内容通りに実施してSSHが失敗したという前提で進めていきます。

[CircleCI + Capistrano + AWS(EC2) + Railsで自動デプロイしてみた](https://qiita.com/YK0214/items/98bbdf7ce25c557c77a3 "Qiita")



#結論
CircleCIに設定していた環境変数（PRODUCTION_SSH_KEY）が誤っておりました。
.circleci/config.yml内の記述-add_ssh_keys:によって、
CircleCIのコンテナ上に作成される秘密鍵の名称は「id_rsa_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX」であるため、
CircleCIに設定する環境変数は、「id_rsa_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX」が正解でした。
筆者はここで約2日悩まされることになりました。笑
※「XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX」の部分はfingerprintsの：なし文字列

#詳細
筆者は以下のようにCircleCIに環境変数（PRODUCTION_SSH_KEY）を設定しておりました。
「~/.ssh/hoge_rsa_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX」
※hoge_rsaはローカルからEC2へSSH接続するための秘密鍵



原因調査のために、CircleCIコンテナにSSH接続。
※CircleCIコンテナへのSSH接続については公式ドキュメント「[SSH を使用したデバッグ](https://circleci.com/docs/ja/2.0/ssh-access-jobs/#section=pipelines "Qiita")」をご参照ください


~/.sshディレクトリを覗いてみると、、、
[![Image from Gyazo](https://i.gyazo.com/4022cff1ba5cffad958639cf3ce88865.png)](https://gyazo.com/4022cff1ba5cffad958639cf3ce88865)

！！！！！！！！！！！！！！！！！！！！！！！！

**id_rsa_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX**

だと、、、
「hoge_rsa_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX」じゃない、、、
まさか、、、

というわけでCircleCIの環境変数（PRODUCTION_SSH_KEY）に
「id_rsa_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX」を設定し直したところ、
無事にCircleCI仮想環境からEC2へのSSH接続およびCapistranoでの自動デプロイに成功しました。🎉
大阪府の Go To EATの加盟店舗をスクレイピングしCSVに変換

[Go To Eat大阪キャンペーン](https://goto-eat.weare.osaka-info.jp/gotoeat/)の加盟店をスクレイピング

```python
import time

import requests
from bs4 import BeautifulSoup

import pandas as pd

result = []

url = "https://goto-eat.weare.osaka-info.jp/?search_element_0_0=2&search_element_0_1=3&search_element_0_2=4&search_element_0_3=5&search_element_0_4=6&search_element_0_5=7&search_element_0_6=8&search_element_0_7=9&search_element_0_8=10&search_element_0_9=11&search_element_0_cnt=10&search_element_1_0=12&search_element_1_1=13&search_element_1_2=14&search_element_1_3=15&search_element_1_4=16&search_element_1_5=17&search_element_1_6=18&search_element_1_7=19&search_element_1_8=20&search_element_1_9=21&search_element_1_10=22&search_element_1_11=23&search_element_1_12=24&search_element_1_13=25&search_element_1_14=26&search_element_1_15=27&search_element_1_16=28&search_element_1_17=29&search_element_1_cnt=18&searchbutton=%E5%8A%A0%E7%9B%9F%E5%BA%97%E8%88%97%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B&csp=search_add&feadvns_max_line_0=2&fe_form_no=0"

while True:

    r = requests.get(url)
    r.raise_for_status()

    soup = BeautifulSoup(r.content, "html.parser")

    for li in soup.select("div.search_result_box > ul > li"):

        data = {}
        data["店舗名"] = li.select_one("p.name").get_text(strip=True)
        data["ジャンル"], data["地域"] = li.select_one("ul.tag_list").stripped_strings

        for tr in li.table.select("tr"):

            k = tr.th.get_text(strip=True)

            if k == "住所":
                v = list(tr.td.stripped_strings)

                data["郵便番号"] = v[0]
                data[k] = " ".join(v[-1].split())
            else:
                data[k] = tr.td.get_text(strip=True)

        result.append(data)

    tag = soup.select_one("div.wp-pagenavi > a.nextpostslink")

    if tag:

        url = tag.get("href")

    else:
        break

    time.sleep(1)

df = pd.DataFrame(result).reindex(
    columns=["店舗名", "ジャンル", "地域", "郵便番号", "住所", "TEL", "営業時間", "定休日"]
)

df.to_csv("osaka.csv", encoding="utf_8_sig")
```
iterm を格好良くした

# itermの画面
![terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610591/67f0be66-e4d0-6a0b-8dfb-9cad5529a378.png)
# やったこと
* itermのテーマをjapanesequeにした
* 背景を半透明にした
* 「コンピュータ名:」を緑色にした（詳細は後述）
 * 全部白いままだとコマンドをどこで打ったのかわかりづらいので。
 * 黒地に緑が個人的に格好良いと思うので
* ステータスバーでgitとファイルパスをつけた。
 * 参考：[iTerm2 にステータスバーが付いた - Qiita]( https://qiita.com/delphinus/items/1748937aefeb241bdcee)
 * 画像ではgitのブランチとファイルパスを設定した（他にもCPUやメモリの使用率、現在のユーザー名などを入れられるらしい）

## 「コンピュータ名:」を緑色にする方法
Preferences > Profile > Advanced > Triggers edit で以下のように設定する。
これで文頭からkubotaaで始まる場合のみ色がつく。
Macのシステムを操作して色をつける方法もあるみたいだが、これはitermの機能を使った。
![iterm_color.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610591/91c4f9fd-da8f-1b5d-8189-63283ebe94ae.png)
Ruby on Rails 6.0 の環境構築メモ

# はじめに

個人のWindows10のPCに初めてRuby on Railsの環境構築するまでの備忘録。
ちなみに筆者は、Web系はLinux(CentOS)とWindows10のCakaPHPをおさわりしたことしかない。

# Ruby 2.6.6 のインストール
Ruby2.7とRails6.0（あるいは周辺gem）の組み合わせによっては警告が発生する場合があるとのことなので、Ruby2.6.6を選択。

- 下記リンクにて「rubyinstaller-devkit-2.6.6-1-x64.exe」をダウンロード。
https://rubyinstaller.org/downloads/

- ここで後のコマンドラインによるインストール処理にてエラーが発生するため、事前にWindowsFWとセキュリティソフトを停止しておく。

- ダウンロードしたインストーラーを実行。
「Use UTF-8 as default external encoding.」にチェック
「MSYS2 development toolchain 2019-10-01」にチェック
エディタ「VisualStudioCode」を選択

- 表示されたコマンドラインのRubyInstallerにて、Enterして実行。

以上でRubyのインストールが完了したので、コマンドラインでバージョンを確認。

```powershell
> ruby -v
ruby 2.6.6p146 (2020-03-31 revision 67876) [x64-mingw32]
```

ついでにgemもバージョン確認。

```powershell
gem -v
3.0.3
```

# Gitインストール
- 下記サイトよりインストーラーをダウンロード。  
https://gitforwindows.org/

- ダウンロードしたインストーラーを実行。
「Use Visual Stadio Code as Git's default editor」を選択
「Use the OpenSSL library」を選択
extra options はよしなに

以上で、Windowsスタートメニューに「Git Bush」などのアイコンが追加されていることを確認して終了。

# Node.jsのインストール
Node.jsをバージョン管理するためにnodistを使用。

- 下記サイトよりnodistインストーラーをダウンロード。「NodistSetup-v0.9.1.exe」  
https://qiita.com/satoyan419/items/56e0b5f35912b9374305

- nodistをインストール。
※「PATH not update,~」のエラーが出たので以下をシステムの環境変数に追加。
【Path】C:\Program Files (x86)\Nodist\bin
【NODIST_PREFIX（新規）】C:\Program Files (x86)\Nodist
【PATH（新規）】%NODIST_PREFIX%\bin
【NODE_PATH（新規）】%PATH%\node_modules

- nodistバージョン確認。
 
```powershell
>nodist -v
0.9.1
```

- Node.jsのインストール。
12系の最新を選択（End-of-life：2022-04-30）

```powershell
>nodist + 12.19.0
>nodist 12.19.0
```

```powershell
>node -v
v12.19.0
```

- nmpのバージョンが古かったため、下記リンクを参考にアップデート。  
https://nodejs.org/ja/download/releases/

```powershell
>nodist npm 6.14.8
>npm -v
6.14.8
```
※npxのインストールはしていない。

# yarnのインストール

```powershell
>npm install -g yarn
>yarn -v
1.22.10
```

# bndlerのアップデート
バージョンが古かったため、最新に更新。

```powershell
>gem install bundler
>bundler -v
Bundler version 2.1.4
```

# SQLite3のインストール
テンポラリーファイルのパスのユーザー名が全角の場合、一時ファイルの作成に失敗するので、先にテンポラリーファイルを変更してからインストール。

```powershell
>set TEMP=C:\Temp
>set TMP=C:\Temp
>gem install sqlite3
```

# Rails6.0.3のインストール

```powershell
>gem install rails -v 6.0.3
>rails -v 
Rails 6.0.3
```

以上。
Ubuntu上のZabbixで同ホストのDockerコンテナとSystemDプロセスを監視する。

# 環境
| もの | Version |
|:-:|:-:|
| Ubuntu | 20.04 LTS  |
| Zabbix | 5.0.4 |
| zabbix-agent2  |  不明,now 1:5.0.4-1+focal amd64 |
| Docker  | 19.03.12  |
| MariaDb | Ver 8.0.21-0ubuntu0.20.04.4 for Linux on x86_64 ((Ubuntu)) |

# Zabbix5のインストール
https://www.zabbix.com/jp/download?zabbix=5.0&os_distribution=ubuntu&os_version=20.04_focal&db=mysql&ws=nginx

こちらの手順でインストール

# Zabbix-Agent2のインストール
```sh
apt install zabbix-agent2
```

## zabbix-agentの停止
```sh
systemctl stop zabbix-agent.service
systemctl disable zabbix-agent.service
```

# Docker sockファイルを読み取れるようにする
zabbixユーザーをdockerグループに追加する。

```sh
gpasswd -a zabbix docker
```

[参考：Zabbixエージェント2を使用したDockerの監視](https://qiita.com/atanaka7/items/15a553b78b013ab537c1)

----------------------
ここまでで、Zabbix-Web-Server --> Zabbix-Server --> Zabbix-Agent2の疎通が出来ているはず。

# Zabbix Agent2によるSystemd Service監視について
https://tech-lab.sios.jp/archives/18664

# Zabbix Agent2 Discovery
以下の公式参照
[7 DISCOVERY OF SYSTEMD SERVICES](https://www.zabbix.com/documentation/current/manual/discovery/low_level_discovery/systemd)

# Zabbix Agent2 Metrics
以下の公式参照

[ZABBIX AGENT 2 / ITEM KEYS](https://www.zabbix.com/documentation/current/manual/config/items/itemtypes/zabbix_agent/zabbix_agent2)
選択範囲を一発でタグで囲む方法(VScode)

僕がVScodeでマークアップするときにめちゃくちゃ多用する機能について解説します！
これをすることで大幅に作業効率が上がります！

#はじめに
例えばこんなコードがあったとします。

```index.html
  <div class="text">
    こちらが本文です
  </div>
```

これを書いた後に
「あ！divタグじゃなくてpタグで囲まないといけなかった(　ﾟдﾟ)」
みたいな時ないですか？？？

僕はこれすごく思ってて、憂鬱になりながらも「divタグを消してpタグの開始タグを書いて、末尾に終了タグを書く」という動作をずっとしていました。

これが1つならいいものの、以下のような場合だと、友達の家の猫が自分にだけ寄ってこない時くらいの煩わしさを感じてしまいます。

↓liタグで囲むの忘れてた場合

```index.html
  <div class="text">
    <ul>
      リスト1
      リスト2
      リスト3
      リスト4
      リスト5
      リスト6
      リスト7
      リスト8
      リスト9
    </ul>
  </div>
```

#準備
３分とかからない準備が必要です！

1.VScode起動
2.キーボードショートカットの設定画面にいく
3.同画面の検索窓に「emmet wrap」を入力
4.「emmet:ラップ変換」と「emmet:個々の行でラップ変換」にショートカットキーを割り当てる

これで準備完了です！！！

#実践
それでは使っていきましょう！

1.まず、タグで囲みたい部分を選択します

2.割り当てたショートカットキーを押すと、上に窓が出てくるのでそこにタグを書きます
(今回はliタグとします)

3.Enterキーを押すと、タグで囲むことができます

###下で実行結果を見てみましょう！

##「emmet:ラップ変換」
「emmet:ラップ変換」に割り当てたショートカットキーを押し、上の窓に「li」と入力すると、

```index.html
<div class="text">
    <ul>
      <li>
        リスト1
        リスト2
        リスト3
        リスト4
        リスト5
        リスト6
        リスト7
        リスト8
        リスト9
      </li>
    </ul>
  </div>
```
こんな感じで選択した部分の最初と最後にliタグが入り、一括りにできました！

ですが今回のコードの場合は、リスト1〜9のひとつひとつをliタグで括りたいですね

その場合は、「emmet:個々の行でラップ変換」の方を使います！

##「emmet:個々の行でラップ変換」
「emmet:個々の行でラップ変換」に割り当てたショートカットキーを押し、上の窓にタグを入力するのですが、
今回は「li」と入力するのではなく「li*」と入力します！
そうすることで、、、

```index.html
<div class="text">
    <ul>
      <li>リスト1</li>
      <li>リスト2</li>
      <li>リスト3</li>
      <li>リスト4</li>
      <li>リスト5</li>
      <li>リスト6</li>
      <li>リスト7</li>
      <li>リスト8</li>
      <li>リスト9</li>
    </ul>
  </div>
```
理想通りになりました！！！

####おしまい！

#参照
【Visual Studio Code】選択範囲を一発でHTMLタグで囲む方法【簡単・便利】
https://www.youtube.com/watch?v=n6usaCJFKNo&list=LLTpOM4yhFYJcQCl5I853uhg&index=10