OmniAICreator/Qiita-1.07M huggingface dataset:
node_modulesを復元する方法

過去のLaravelプロジェクトなどで使っていたnode_modulesを新規プロジェクトでもそのまま使いたかったので、復元方法を備忘録として残して起きます。

#前提
・npmが使えること

#用意するもの
・過去プロジェクトなどで利用したpackage.jsonの`"devDependencies": { ... }`
・新しいプロジェクト（インストール済み）

#やり方
自身の過去プロジェクトなどからpackage.jsonを開き、`"devDependencies": { ... }`をまるごとコピーします。
自分の環境では以下のコードをまるっとコピーしましたが、自身の環境に合わせて削除（または追加）してください。

```package.json
"devDependencies": {
    "@babel/core": "^7.14.3",
    "@babel/preset-env": "^7.14.4",
    "@tailwindcss/forms": "^0.2.1",
    "@tailwindcss/postcss7-compat": "^2.0.4",
    "alpinejs": "^2.7.3",
    "autoprefixer": "^10.2.6",
    "axios": "^0.21",
    "bootstrap": "^4.0.0",
    "browser-sync": "^2.26.14",
    "decompress": "^4.2.1",
    "del": "^6.0.0",
    "gulp": "^4.0.2",
    "gulp-autoprefixer": "^8.0.0",
    "gulp-babel": "^8.0.0",
    "gulp-ejs": "^5.1.0",
    "gulp-imagemin": "^7.1.0",
    "gulp-notify": "^4.0.0",
    "gulp-plumber": "^1.2.1",
    "gulp-postcss": "^9.0.0",
    "gulp-rename": "^2.0.0",
    "gulp-replace": "^1.1.3",
    "gulp-sass": "^4.1.0",
    "gulp-sass-glob": "^1.1.0",
    "gulp-uglify": "^3.0.2",
    "gulp-webp": "^4.0.1",
    "imagemin-mozjpeg": "^9.0.0",
    "imagemin-pngquant": "^9.0.2",
    "jquery": "^3.6.0",
    "jquery-ui": "^1.12.1",
    "laravel-mix": "^6.0.19",
    "lodash": "^4.17.19",
    "mix-tailwindcss": "^1.3.0",
    "popper.js": "^1.12",
    "postcss": "^8.2.9",
    "postcss-import": "^12.0.1",
    "resolve-url-loader": "^2.3.1",
    "sass": "^1.20.1",
    "sass-loader": "^8.0.0",
    "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.1.4",
    "vue": "^2.5.17",
    "vue-loader": "^15.9.6",
    "vue-template-compiler": "^2.6.10"
  }
```

新しい環境の`package.json`を開き、`"devDependencies": { ... }`を上書きして保存します。

ターミナルのCDコマンドでプロジェクトフォルダに移動し、`npm install`と打てば完了です。
Rspecで WARNING: Using `expect { }.not_to raise_error(SpecificErrorClass)` risks false positives

Rspec実行時に以下で怒られました。

```
WARNING: Using `expect { }.not_to raise_error(SpecificErrorClass)` risks false positives, since literally any other error would cause the expectation to pass, including those raised by Ruby (e.g. `NoMethodError`, `NameError` and `ArgumentError`), meaning the code you are intending to test may not even get reached. Instead consider using `expect { }.not_to raise_error` or `expect { }.to raise_error(DifferentSpecificErrorClass)`. This message can be suppressed by setting: `RSpec::Expectations.configuration.on_potential_false_positives = :nothing`.
```

雑にGoogle翻訳する


> 警告： `expect {} .not_to raise_error（SpecificErrorClass）`を使用すると、誤検知のリスクがあります。これは、Rubyによって発生したエラー（例： `NoMethodError`、` NameError`、 `ArgumentError`）を含め、文字通り他のエラーが期待を通過させるためです。つまり、テストしようとしているコードに到達できない可能性があります。代わりに、 `expect {} .not_to raise_error`または` expect {} .to raise_error（DifferentSpecificErrorClass） `の使用を検討してください。このメッセージは、 `RSpec :: Expectations.configuration.on_potential_false_positives =：nothing`を設定することで抑制できます。

`expect {}.not_to raise_error (SpeificErrorClass)` を使うと、該当エラーが起こる前に別エラーが投げられた場合などで通ってしまう誤検知の可能性があるらしい。
そのためエラーが起こらないことのテスト `expect {}.not_to raise_error` とするか、別のエラーが起こるテスト `expect {} .to raise_error (DifferentSpecificErrorClass)` にしましょうとのこと。
今回はクラスを指定せず、エラーが起こらないことを確認するテストに書き換えてRspecに大人しくなってもらいました。

---

※こちらの記事は自ブログからの転載です

https://akinov.hatenablog.com/entry/2021/08/05/140713
SourceTree で submodule のクローンに失敗する問題対応

# 問題

* チェックアウト時やプル時に何度もgithubのパスを聞かれる
* submodule のクローンができない
* メインのリポジトリ自体はプルできる

# 対応 

* .gitmodules を確認、https を ssh にする
    * NG ex. url = https://github.com/○○○○
    * OK ex. url = git@github.com:○○○○.git
* 設定反映
    * `git submodule sync`

sourcetree 固有の問題に思えます。
CCNA Part 2（OSI参照モデル)

##プロトコル

プロトコルとは通信におけるルールのことを言います。
送信側と受信側で同一のプロトコルでなければデータの疎通はうまくいかない。

##プロトコルスタック

通信における様々なプロトコルを役割ごとにまとめたものを
プロトコルスタックまたはネットワークアーキテクチャー
またはプロトコルスイートと呼びます。

その昔は各メーカーは自社製品同士でしか利用できないプロトコルスタックを作っていた。
異なる機種間でも通信できる世界標準のプロトコルスタックとして作られたのがOSI参照モデル。
OSIはOpen Systems Interconnectionの略です。
ISO（International Organization for Standardization：国際標準化機構)が作る。

##OSI参照モデル

ネットワークで必要とされる機能を7つのレイヤに分割する。
各層はレイヤやLと呼ばれることもある。
レイヤ毎にプロトコルを切り分けることを階層化と言います。
これによりプロトコルの役割が明確になり、変更があっても最小限の
プロトコルの変更で済むといったメリットがある。

##各層の役割

レイヤ1 ：　物理層

機器や電気信号に関するプロトコル群
例、　ケーブルの種類の長さに関するルールや電圧レベル、電気信号に関するルール
通信速度、電気信号の符号化に関するルールなど

レイヤ2 :データリンク層

隣接ノード間の通信に関するプロトコル群
例、データの送信元と宛先の識別方法に関するルール、
データの衝突の検知や回避に関するルール、送出するためのデータ加工に関するルールです。

レイヤ3 :ネットワーク層

エンドツーエンド（データの送信元と宛先を結ぶ通信経路全体)の通信に関するプロトコル群
例　データの送信元と宛先の個別方法に関するルール、経路選択の方法に関するルール、
データの送出方法に関するルールです。

レイヤ4 ：トランスポート層

通信における信頼性に関するプロトコル群
例　確実な伝達orスピードのどちらを優先するか　異常があった時の対処に関するルール
送信量の調節に関するルール

レイヤ5 :セッション層

アプリケーション間の接続に関するプロトコル群
例　2者間の接続開始から終了までのルール　接続の維持や回復に関するルール　
接続情報の管理に関するルール

レイヤ6 :プレゼンテーション層

ユーザーが見て触れるデータに関するプロトコル群
例　文字コードに関するルール　画像や動画に関するルール　
データの圧縮や暗号化に関するルール

レイヤ7 :アプリケーション層

アプリケーション固有のプロトコル群
例　電子メールの送受信に関するルール　メールサーバーの利用に関するルール
添付ファイルの送信に関するルール


##カプセル化/非カプセル化

送信データを各レイヤで処理する際、ヘッダという制御情報を付加します。
データリンク層ではヘッダに加えてトレーラと呼ばれるエラーチェック用の情報も付加します。
この送信データを作るためにレイヤ毎にヘッダを付加していく処理をカプセル化と言います。

対して、受信データは処理されていくにつれてヘッダが外されていきます。
それを非カプセル化と言います。

データ＋ヘッダ（＋トレーラ)のデータ単位をPDU(Protocol Data Unit)と言います。
PDUはレイヤのヘッダが付加されているかで呼び名が変わります。特にL2のデータリンク層は
フレームと言います。またL3まではパケット、L4まではセグメントと言います。
Moodleからスクレイピングする

# はじめに
オープンソースのeラーニングプラットフォームである「Moodle」だが、自分で情報を取得し、解析したいと思った。MoodleにはAPIが用意されているため、システム管理者に連絡すれば使えるようになるのかもしれないが、面倒なので自前でスクレイピングできるようにした。
完全なる自分用メモのための記事。

# ソースコード

``` login.java
//import文は省略
class login{
	public static void main(String[] args){
		String UA="hogehogeBOT 1.0/" //ユーザーエージェント
		String id="aiueo1234" //ユーザーid
		String password="123456789" //パスワード
		try{
			Connection.Response response=Jsoup.connect("https://moodle.org/login/index.php")
				.userAgent(UA)
				.method(Connection.Method.GET)
				.execute();
			String logintoken=response.parse().getElementsByAttributeValue("name","logintoken").get(0).attr("value");

			response=Jsoup.connect("https://moodle.org/login/index.php")
				.userAgent(UA)
				.cookies(response.cookies())
				.data("logintoken",logintoken)
				.data("username",id)
				.data("password",password)
				.method(Connection.Method.POST)
				.followRedirects(false)
				.execute();

			Map<String, String> cookies=response.cookies();
			cookies.remove("MOODLEID1_");
			while(response.statusCode()==303){
				response=Jsoup.connect(response.header("Location"))
					.userAgent(UA)
					.cookies(cookies)
					.method(Connection.Method.GET)
					.followRedirects(false)
					.execute();
			}
			String text=response.parse().outerHtml();

			//ここに処理

		}catch(IOException e){
			System.out.println("Moodle接続時にエラーが発生しました（接続エラー）。");
			e.printStackTrace();
		}
	}
}

```

# その他
詰まった部分としては、ログイントークンと呼ばれる隠れたフォームが存在していたことである。ログインが必要なページに対する、スクレイピングでは大抵、`login.php` などにフォームデータ付きのPOSTリクエストを投げればSession用のCookieが帰ってくるので、そのCookieをもってログインページなどに行けば上手くいく。ただ、Moodleの場合は、一度、`login.php` にアクセスし、トークンを取得しなければならなかった。
ログイントークンに関しての詳細は↓

https://docs.moodle.org/dev/Login_token

また、ログイン後、`303 See Other` で 何度かリダイレクトされる。その際、 `followRedirects` を初期状態にしていると、Cookieが引き継がれず、ログインできていない状態でトップページなどに戻される。よって、ステータスコードが303の間は初めに貰ったCookieをもってリダイレクトする処理を自身で書いてやることで、回避した。
Swift Generics(関数)

## Genericsなしのオーバーロードによる実装

```swift
func makeTuple(_ a: Int,_ b: Int) -> (Int, Int) {
    return (a, b)
}

func makeTuple(_ a: String,_ b: String) -> (String, String) {
    return (a, b)
}

print(makeTuple(1, 2))
print(makeTuple("1", "2"))
```

## Genericsにより1つの関数で実装

```swift
func makeTuple<T>(_ a: T, _ b: T) -> (T, T) {
    return (a, b)
}

print(makeTuple(7.123, 0.098))
print(makeTuple(true, false))
```

## プロトコルによる制約

Tが比較可能(Comparable)な型であることが明示されたので関数内で比較可能

```swift
func max<T : Comparable>(_ a: T, _ b: T) -> T {
    return (a > b ? a : b)
}

print(max(1, 2))
```

### プロトコルによる制約によりそれぞれの属性が利用可能

SubSequenceとdropFirst()が利用可能になった

```swift
func last<T : Collection>(_ array: T) -> T.SubSequence{
    return array.dropFirst()
}

print(last([4, 0, 9, 1, 2, 5]))
```

## whereによる制約

下の例ではwhereにより配列の要素の方がT, Uともに同じであることが保証されている

```swift
func concat<T : Collection, U : Collection>(_ argument1: T, _ argument2: U) -> [T.Element] where T.Element == U.Element {
    return Array(argument1) + Array(argument2)
}

print(concat([1, 2, 3], Set([4, 5, 6])))
```
Ubuntu 20.04LTS ServerにUSB-LAN変換アダプタを増設

#USB-LAN変換アダプタ
常時利用せず、スループットも求めないのでamazonで安価なものを購入しました。

[TP-Link 有線LANアダプタ ギガビット イーサネット Nintendo Switch / windows / Linux / macOS 対応 UE305](https://www.amazon.co.jp/gp/product/B08MPT4YXT/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1)

#Ubuntu 20.04LTS ServerのUSBポートに接続

```
$ lsusb
Bus 002 Device 004: ID 0b95:1790 ASIX Electronics Corp. AX88179 Gigabit Ethernet
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

「SIX Electronics Corp. AX88179 Gigabit Ethernet」と認識されました。

#インタフェースの確認
未設定の状態でUSBポートにUSB-LAN変換アダプタを接続したのでIPアドレス等の表示はありません。

```
$ ip a
(略)
6: enx7cc2c6FFFFFF: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
```

#設定
/etc/net/interfacesで設定かなと思っていましたが、/etc/netplan/配下にあるYAMLファイル「00-installer-config.yaml 」を編集する仕様に変更になったとのこと、このディレクトリにあるファイルを編集します。
同時にenp1s0(PC本体のLANインタフェース)のIPアドレス割当設定をDHCPサーバからの割当から固定IPアドレス設定に変更します。
既に192.168.2.0/24のネットワークには他のホストPCやスイッチがあるので2つのインタフェースには192.168.2.6, 192.168.2.7を割り当てます。

```
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp1s0:
      addresses:
      - 192.168.2.6/24
      gateway4: 192.168.2.1
      nameservers:
        addresses:
        - 8.8.8.8
        - 8.8.4.4
        search: []
    enx7cc2c6FFFFFF:
      addresses:
      - 192.168.2.7/24
      gateway4: 192.168.2.1
      nameservers:
        addresses:
        - 8.8.8.8
        - 8.8.4.4
        search: []
  version: 2
```

#設定の反映
以下のコマンド実行で再起動なしに設定が即時に反映されます。

```
$ sudo netplan apply
```

#反映の確認
yamlファイルで設定したIPアドレス192.168.2.6/24と192.168.2.7/24が各々、enp1s0とenx7cc2c6FFFFFFに設定されていることが確認できました。

```
$ ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 192.168.2.6/24 brd 192.168.2.255 scope global enp1s0
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
6: enx7cc2c6FFFFFF: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 192.168.2.7/24 brd 192.168.2.255 scope global enx7cc2c6FFFFFF
       valid_lft forever preferred_lft forever
```

#疎通確認
192.168.2.0/24のネットワークいるWindowsPCから192.168.2.6, 192.168.2.7にpingをして、疎通確認ができました。

#まとめ
今回は下記について設定を行いました。
　・Ubuntu 20.04LTS用PCへのUSB-LAN変換アダプタの接続
　・IPアドレスの固定割当設定
　・疎通確認
ftplib.mlsd()が使えないサーバーでファイルの正確な更新日時を得る

# Pythonのftpで正確な更新日時を取得する
FTPに便利な `mlsd()` がどうしても使えない環境なので、`nlst()` か `dir()` でどうにか解決しなければなりませんでした。その解決までの覚え書きです。

##失敗した書き方
下記の書き方だと失敗というか、時間がちゃんと取れなかったんですよね・・・

```python:ng-sample.py
# ======= modules =======
from dateutil import parser
from ftplib import FTP, error_perm

# ======= variables =======
filelist = [] # 取得したファイルリスト


# ======= ftp =======
ftp = FTP(
    "server_name",
    "user",
    passwd="password"
)
lines = []

ftp.cwd("/remote/site_path/")
ftp.dir(lines.append)
for line in lines:
    tokens = line.split(None, 9)
    name = tokens[8]
    # 時間の取得(正確性が低い)
    time_str = tokens[5] + " " + tokens[6] + " " + tokens[7]
    time = parser.parse(time_str)
    filelist.append([name,str(time)])
ftp.quit()

# ======= export result =======
result = {}
result["filelist"] = filelist

sys.stdout.write("Content-Type: application/json")
sys.stdout.write("\n")
sys.stdout.write("\n")
sys.stdout.write(json.dumps(result,indent=1))
sys.stdout.write("\n")
sys.stdout.close()

```

## 成功した書き方
`ftp.voidcmd("MDTM " + name)[4:].strip()` が味噌です。

```python:ok-sample.py
# ======= modules =======
from dateutil import parser
from ftplib import FTP, error_perm

# ======= variables =======
filelist = [] # 取得したファイルリスト


# ======= ftp =======
ftp = FTP(
    "server_name",
    "user",
    passwd="password"
)

ftp.cwd("/remote/site_path/")
for name in ftp.nlst("."):
    # 正確性はより高い
    time_str = ftp.voidcmd("MDTM " + name)[4:].strip()
    time = parser.parse(time_str)
    filelist.append([name,str(time)])
ftp.quit()

# ======= export result =======
result = {}
result["filelist"] = filelist

sys.stdout.write("Content-Type: application/json")
sys.stdout.write("\n")
sys.stdout.write("\n")
sys.stdout.write(json.dumps(result,indent=1))
sys.stdout.write("\n")
sys.stdout.close()
```

### 余談

pythonのきれいな書き方ってなんでしょう。まだ書き始めたばかりで雲をつかむような感覚です。
`sys.stdout.write()` を下にまとめていいのか・・・？など

参考: https://stackoverflow.com/questions/29026709/how-to-get-ftp-files-modify-time-using-python-ftplib
bytemark/webdavがReverseProxy超えだと接続できない

## 発生した問題
[bytemark/webdav](https://hub.docker.com/r/bytemark/webdav/)を使ってdocker-composeでお手軽にWebDav環境を構築できますが、ApacheのReverseProxyのバックエンドに構築したらクライアントからの接続で「入力したフォルダーは有効ではないようです」と表示されて接続できなくなりました。
![WS000381.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80431/12dc1b35-439e-da18-6e09-d6fbd90146c0.jpeg)

## 原因
bytemark/webdavコンテナが出力したログを見ると クライアントからの OPTIONSメソッドのアクセスがHTTP401のエラーになっていました。

```apache
"OPTIONS /hoge HTTP/1.1" 401 381 "-" "Microsoft-WebDAV-MiniRedir/10.0.18362"
```

ユーザー名/パスワードで認証するより前に OPTIONSメソッドが来ているため拒否されているようです。


## 対応
bytemark/webdavコンテナ内の
/usr/local/apache2/conf/conf-enabled/dav.conf
の中で

```apache
<RequireAny>
  Require valid-user
</RequireAny>
```
と定義されていて、すべてのメッソドに認証が必要な設定になっているので

```apache
<LimitExcept OPTIONS>
  Require valid-user
</LimitExcept>
```
として、OPTIONSメソッドを認証なしで通るようにします。
conf-availableディレクトリのdav.confをdockerのボリュームで直接マウントしてみましたがコンテナの起動に失敗しました。
Apacheのconfファイルは起動時にアルファベット順に読み込まれることを利用して、変更後の内容を記述したzdav.conf というファイルを conf-enabledディレクトリ内にマウントすることでdav.confの内容を丸ごと上書きするようにしました。

```apache:zdav.conf
DavLockDB "/var/lib/dav/DavLock"
Alias / "/var/lib/dav/data/"
<Directory "/var/lib/dav/data/">
  Dav On
  Options Indexes FollowSymLinks

  AuthType Digest
  AuthName "WebDAV"
  AuthUserFile "/user.passwd"
  <LimitExcept OPTIONS>
    Require valid-user
  </LimitExcept>
</Directory>

# These disable redirects on non-GET requests for directories that
# don't include the trailing slash (for misbehaving clients).
BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "MS FrontPage" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
BrowserMatch "^WebDAVFS/1.[01234]" redirect-carefully
BrowserMatch "^gnome-vfs/1.0" redirect-carefully
BrowserMatch "^XML Spy" redirect-carefully
BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully
BrowserMatch " Konqueror/4" redirect-carefully
BrowserMatch "^gvfs" redirect-carefully
```
マウントするconfファイルの定義をdocker-compose.ymlの最終行に追加します。

```yaml:docker-compose.yml
version: '3'
services:
  webdav:
    image: bytemark/webdav
    restart: always
    ports:
      - "80:80"
    environment:
      AUTH_TYPE: Digest
      USERNAME: hoge
      PASSWORD: fuga
      LOCATION: /hoge
    volumes:
      - ./hoge/dav:/var/lib/dav
      - ./hoge/zdav.conf:/usr/local/apache2/conf/conf-enabled/zdav.conf
```

## まとめ
dockerを使えば色々な機能を数分で立ち上げることが可能ですが、コンテナ内で問題が発生した場合は調査と対応にそれなりの時間を取られることを想定しておく必要があります。
electronを使ってwindowsで音声入力できるようにするアプリを開発した

音声入力を色々と触るようになってきたので、windows上で疑似入力できるようにアプリを作ってみる。

```app.js
     socket.on('soundMessage', function ( data ) {

          textMessage = data;

          console.log(data);
      
          var ks = require('node-key-sender');
      
          clipboard.writeText(textMessage);
      
          ks.sendCombination(['control', 'v']);
      
        }
```

web speech apiが結構便利

windowsアプリからブラウザをホスティングしてそこから文字データを持ってくる
やり方で作成した。

node.jsで文字を疑似入力するときにnode-key-senderが便利
クリップボードに文字データを張り付けてControl + V を押させる。

この、node-key-senderはjava runtimeがPCに無いと動かないみたいなので、確認するコードを追加してみた。
詳細は、git に上げておく。

https://github.com/hazamayuuzi1113/memeWrite_source.git

アプリのダウンロードは下から。

https://github.com/hazamayuuzi1113/memeWrite.git
[AWS_33]Lambdaについて

##環境
AWS Lambda 
Python 3.7


##AWS Lambdaとは

* サーバレスコンピューティングサービス
サーバなしでコードを実行できる。
通常ならサーバのセットアップなどが必要だが、それらが無くてもプログラムを実行できる。

* FaaSに該当する
IaaSーPaaSー`FaaS`ーSaaS
ファンクションをサービス提供する。

|サービス|ターゲットとなる方式|説明|
|---|---|---|
|PaaS|リクエストリプライ方式|リクエストごとにアプリケーション全体を起動・終了させる|
|FaaS|イベントドリンブン方式|必要なサービス毎に起動・終了させる|
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/9a6d8e74-3de3-f060-40dc-bd0a432b1a1b.png)
画像引用：[IT media：コレ1枚で分かる「サーバレスとFaaS」](https://www.itmedia.co.jp/enterprise/articles/1701/16/news026.html)

* コードを実行するインフラに依存せずに実行できる

* サポートしている言語は、
    * Java
    * Go
    * PowerShell
    * Node.js
    * C#
    * Python
    * Ruby
* イベントに応じてコードを実行できる
例：S3バケットにオブジェクトが配置されたら実行する

* 自動スケーリング
Lambdaで処理が追いつかなくなったら自動でLambdaを追加するイメージ。

* エッジロケーションで実行できる
お客さんに最も近い場所で実行できる。

* EC2インスタンスに比べてサーバ管理が無い

* 実行していないアイドリング時の料金がかからない
<br><br>


##他のAWSとどんな連携ができるのか
####APIGateway
APIGatewayにリクエストするとLambdaが実行される。

####S3
S3バケットにオブジェクトが配置されたらLambdaが発動する。

####EventBridge
定期的にLambdaを実行する。
例:毎朝このLambdaの関数を実行したい。

####CloudWatchLogs
Lambda関数を作成すると自動的にCloudWatchと連携がされる。
Lambdaの実行結果は正常に終了したのか、エラーが出たのか、CloudWatchのログで確認が出来る。
<br><br>


##用語
####イベントソース
Lambda関数が実行されるきっかけ。
例：S3,SQS,SNS,EventBridge

####ハンドラ
Lambda側でイベントを受け取る。
デフォルト：ファイル名.関数名
<br><br>



##公式チュートリアル
* 以下ページで簡単な`Hello World`的な戻り値の出力を試すことができ、操作感を掴むことができる。<br>
[AWS Lambda サーバーレスでコードを実行](https://ap-northeast-1.console.aws.amazon.com/lambda/home?region=ap-northeast-1#/begin)
<br><br>以下の場合は、Pythonを使った実行結果。
![スクリーンショット 2021-08-05 16.33.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/d5d11acf-2ab6-f3be-2e11-2242bfc9619c.png)

* イベントソースがLambdaに送られ、サンプルコードが実行される様子をイメージで理解するページもある。
APIゲートウェイやKinesis、S3バケットをクリックするとLambdaを実行できる。
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/03e5abf0-3bdf-c8b8-7da2-348c1967fd51.gif)



##ハンズオン
Lambda関数の作成から実行までの一連の流れを実際に手を動かしてやってみる。

####Lambda関数の作成
1. `Lambda　＞　関数の作成　`をクリックする。
    * 以下のいずれかのオプションを選択して、関数を作成します。：　`設計図の使用`
    * キーワードによる検索：　`hello-world-python`
1. `設定`をクリックする。
    * 関数名：`hello-python`(任意）
    * 実行ロール：`基本的な Lambda アクセス権限で新しいロールを作成`
1. `関数の作成`をクリックする。

####テストイベントの作成
1. `コードタブ　＞　hello-python/lambda_function.pyを開く　＞ Test`をクリックする。
![スクリーンショット 2021-08-05 17.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/d7e626e2-d8f8-1e10-47d3-901afca665d5.png)
    * `新しいテストの作成`
    * イベントテンプレート: `hello-world`
    * イベント名: `helloEvent`(任意)
    * コード欄<br>
    テストイベントのLambdaに渡される状態を記載。keyがvalueに対応している。

```:json
{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}
```
2.`作成`をクリックする。

####Lambda関数をテストする
1. `Test`をクリックする。<br>
結果から分かること...
    * Responseは`value1`<br>
      ソースコードで戻り値をkey1としているため。
    * Duration: 1.57 ms<br>
      実行時間。
    * Billed Duration: 2 ms<br>
      課金時間。
![スクリーンショット 2021-08-05 17.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/fe146a33-c0b6-4bce-e2ff-765413bcc288.png)

1. CloudWatchでログの確認する
Start〜Endまで、コンソール画面で出力されていた内容をCloudWatchでも確認出来る。
![スクリーンショット 2021-08-05 17.53.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/31124083-8aa7-4ca7-b7e9-f16282d22bde.png)
JavaScript文字列と数値違い

JavaScriptの学習の備忘録と振り返りの記事です。
何かの参考になれば幸いです。
付け足しや訂正などある場合ご教授いただけると
大変嬉しく思います！！

##出力

```js
console.log()
```

##文字列
console.log(`"文字列はダブルクオテーションで囲う"`)

##数値

console.log(`数値は数値のまま`)

##計算

文字列の場合
<details><summary>`"文"+"字"`で連結ができる</summary>
</details>

数値の場合
<details><summary>`+、−、＊、/`で計算ができる</summary></details>
`％`を使うと`余りの計算`をしてくれる
【Amazon】WorkMailからメールが送れないときにSESで確認すべき2点【Simple Email Service】

##きっかけ
WorkMailを開設し、いざ他のアドレスにテストメールを送ろうとしたが、エラーで帰ってくるので解決を試みた。

##解決方法
①AmazonSES画面のDKIMを開き、
__DKIM：【enabled】__
__DKIM Verification Status：【verified】__
になっているか？
なっていない場合、Route 53にてName・Type・Valueの3行をレコード追加する。
![スクリーンショット 2021-08-05 124811.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/777576/65dd2c30-e97a-ba38-eada-03b5bbb4e74c.jpeg)

②【Identity Policies】が作成されているか？
※多分ドメイン設定時に自動作成されるはずですが、何かの手違いで消した場合は再度生成する
（私は間違って消しちゃった…多分これのせいで送れなかったのかも）
![スクリーンショット 2021-08-05 130350.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/777576/304f70fd-8b05-14f1-dcd5-ddb65889eeae.jpeg)


▶【Identity Policies】が生成されていれば、WorkMailでテスト送信！
送信先にメールが届いていれば完了！


##【Identity Policies】がなかった場合の生成方法
（本ログは本項がメインです

①「Create Policy」をクリック
![スクリーンショット 2021-08-05 125423.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/777576/816d6bca-74b2-01f4-ed35-d985a20a846f.jpeg)

②Policy作る？と聞かれるので「Policy Generator」をクリック
![スクリーンショット 2021-08-05 130212.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/777576/d629e9ce-faf6-015b-05db-f5fa2d72a132.jpeg)

③ジェネレータにてPrinciplesに「*」、Actions両方にチェックを入れ、「Add Statement」クリック
![スクリーンショット 2021-08-05 130731.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/777576/b50c6234-ca9e-9031-81cb-a058485e0f18.jpeg)

④Statementが生成されるので、Nextをクリック
![スクリーンショット 2021-08-05 130926.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/777576/444b8dd9-7854-814c-cfa2-8ae2dcbd4b9f.jpeg)

⑤Create Policyの中身が表示されるので、問題なければApply Policyをクリック！で、完了！
![スクリーンショット 2021-08-05 131227.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/777576/2a70e0e8-1f5c-310e-8657-a85bd3f711db.jpeg)


##おわりに
送ったテストメールを確認して、メールのセキュリティに鍵マーク:lock:が付いていたら、SESセキュリティが効いてる証拠なので、キャリアメールアドレスにも送れます:sparkles:
![スクリーンショット 2021-08-05 131804.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/777576/a5e68ba1-a1aa-eb5b-2db3-9927898c6f79.jpeg)


######つぶやき
Policy作るのめっちゃ簡単にできたけど、「メール送れない！なんで！？」からここにたどり着くまでちょっと苦労したので、本ログ残します。。多分今後もここで躓きそう:frowning2:
SSHできるDockerコンテナの作り方、VSCode Remote-SSHを添えて

## 1. Docker環境構築
<https://docs.docker.jp/engine/examples/running_ssh_service.html>

を参考にしてDockerFileファイルを作る。
ファイル名はpython-testとしている。

```dockerfile
FROM python

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:creencast' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
```

* [補足]
  * PermitRootLoginの初期値が、「without-password」から「prohibit-password」に変わっていたので修正している。
  * rootユーザのパスワード設定処理の「root:creencast」は適切に変更すること。
  * rootユーザで開発したくない場合は、DockerFileに以下のようにユーザ追加命令を追加する。  
    `RUN useradd --shell /bin/bash -u 1000 -m user && echo "user:user" | chpasswd`

* 以下のコマンドを上記のDockerFileがあるディレクトリで実行する。

```bash
docker build -t python-test -f python-test ./
docker run -d -P --name python-test python-test
```

* `docker port python-test 22`を実行してコンテナのポート22が、ホストのどのポートに割り当てられているか確認する。
以降のコマンドは、以下のポート番号を例として使う。

```text
0.0.0.0:49153
:::49153
```

## 2. VScodeインストール

* <https://code.visualstudio.com/download> からdebファイルをダウンロード
* sudo apt install ./download/code_1.56.2-1620838498_amd64.deb  
  ※:dpkgでインストールするやりかたは古いらしい。
* ExtenstionsでRemote-SSHをインストールする。

## 3. VScodeでDocker環境にsshする

* VSCode左側の「Remote Explore」>「SSH TARGET」> 「+」ボタンを押す。  
* ログインコマンドを聞かれるので、`ssh root@0.0.0.0 -p 49153`と入力する。  
* 設定の保存先を聞かれるので、`/home/<ユーザ名>/.ssh/config`を選択する。（他の選択肢はよくわからない）  
* 「SSH TARGET」に「0.0.0.0」が追加されるので選択する。  
* ログインパスワードを聞かれるので、入力する。  
* 下段にbashが表示されればOK。あとはDockerのコンテナ内の環境で開発ができる。  

### 補足

ホスト側でインストールしたextensionsはログイン先では使用できない。
ログイン先毎にインストールする必要がある。ホスト側でインストールしたものを使用可能する方法があるかは不明。
【体験記】Power Platform Fundamnentals(PL-900)を受験した

MicrosoftのPower Platform Fundamnentals(PL-900)に合格したので勉強方法
や所感などを簡単にまとめます。

#【Power Platform Fundamentalsとは】
　以下、公式サイトより。
　この試験の受験者は、Power Platform の機能を理解し、Power Automate　で基本的なビジネス
　プロセスを自動化し、Power BI で基本的なデータ分析を実行し、シンプルな Power App を作成
　することでより効果的に行動し、Power Virtual Agents を使用して強力なチャットボットを作成
　することで、生産性の向上を目指します。
　　https://docs.microsoft.com/ja-jp/learn/certifications/exams/pl-900

#【受験した理由】
　世間でノーコードやローコードが流行しているなかで、Microsoft365に付随するPower Platfromを
　使ってどんなことが出来るのか（出来ないのか）を知りかった。
　そのうえで学んだことのアウトプットの1つとしてこの試験を受験しました。
　（受験料が無料になるバウチャーチケットの存在もかなりデカかった笑）

#【勉強方法】
　①Microsoft Power Platform Virtual Training Day: Fundamentals
　　これを受講して試験料が無料になるバウチャーチェットをゲットしました。
　②Microsoft Learn
　　2周くらいしました。
　③デジタルイベント「PL-900 : Microsoft Power Platform Fundamentals 試験対策」
　　①を受講後にMicrosoftから招待メールが送付されました。
　　模擬問題もたっぷりついてます。
　　動画を2周、ダウンロードしたPDFファイルを3周くらいしました。

#【受験結果】
　出題数：36問　（一般に40問程度と言われています。その時々で多少の差はあるようです。）
　得点：809 / 1000
　合格点：700点

#【所感】
　基本的には知識問題です。知っていれば解ける（正解する）し知っていなければ解けない。
　これについては同じFundamentalsのカテゴリーのAZ-900などと同じ感じでした。
　ハンズオンはありませんでしたが「これこれをするにはどんな手順になるか？」を選択肢から選
　んで順に並べるといったような問題は出題されるので、単純な暗記だけでは太刀打ちできない問
　題もそこそこありました。
　あとDynamics365に関する問題が数問出ていたり、Microsoft Learnに記載のない問題が出ていたり
　しました。
　試験に合格するだけなら③を2～3周するだけでも十分な気がします。
　試験に合格したとはいえ概要についての知識を得ただけなので、今後は実際に製品を動かして実
　務にどう落とし込むか・・・に取り組んでいこうと思います。
自作PC~2019年~

#はじめに

私は普段あまりゲームをしないので、VRゲームをサクサクできるようなスペックや高解像度のグラフィック出力は必要ない。そのため、コスパ重視で普段のネットサーフィンやプログラミングがサクサクできるような部品選びをした。

##CPU/GPU/RAM/ROM スペック
最終的に買った部品は以下である。
CPU性能はAMD Rizenの第二世代 2700, 8コア16スレッド, クロック数=3.2GHzと良くも悪くもないものを買った。大体のゲームが遅延を感じることなくできるスペックで、2700Xの方が安心だが当時の値段で1万円の差があったため一つ低いモデルにした。マザボはCPUとの互換性がうるさいので、今回はセットで売られているものを選んだ。RAMは安定性と互換性に優れたCrusial DDR4 PC4-21300(166MHz) 16G*2。これも最新のモデルが1αnm世代であることを考えると、良くもなく悪くもない性能だろう。ROMはOSが60~80GB程度なのでそれを除いてsteamで容量大きめのゲームを2,3本downloadしても余裕があるくらいの256GBで、Sumsung EVO 970 M.2 SSDにした。これはHDDとSSDで値段を比較してもそれほど変わらなかったので、速度の速いM.2 SSDにした。GPUはフルHD(1,920×1,080)144fps対応モニターで100fps以上でも問題ない性能で、その中ではコスパのいいGe Force GTX 1660 AERO ITXにした。電源は500Wがマザボの対応電力だったが、少し電力が大きいほうが良いと聞いたので650Wで適当なものにした。以下その表。

|項目 |製品名 |値段|
|---|---|---|
|CPU| AMD RIZEN7 2700 |34,000円
|Mother Board |B450 Pro4|*CPUとセット価格|
|RAM| Crusial DDR4 PC4-21300 16GB*2 |17,000円|
|ROM| Sumsung EVO 970 M.2 SSD 256GB |9,000円|
|GPU| Ge Force GTX 1660 AERO ITX |28,000円|
|電源 |KRPW-AK650W/88+ |5,000円|
|OS |Windows 10 64bit version |14,000円|
|Monitor| BENQ FULL HD 24インチ |25,000円| 
|Total| |132,000円|
##性能評価
FF15ベンチマークでスコア評価を行いました。
グラフィック標準品質で7270、高品質で5296のスコアでした。実際プレイ画面を見ていて、高品質の方が視点変更が少しラグかったり、遅延した場面をたまにあったので、高品質ではFF15を実質プレイできないスペックとなります。

![フルHD_標準品質.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/b78c20e0-f1cc-b354-61f5-09339c766154.png)
![フルHD_高品質.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/5e94ca6b-e88c-2d22-b494-3674a3e2f026.png)

##まとめ
　VRゲームとか機械学習とか今のところしないので、このPCでしばらくは問題なさそう。実際、3年間使ってきて何不自由なかった。2021年現在では、RIZEN 2700はもうローエンド品なので今ではRyzen 3800TやRyzen 3800XT、GPUはRTX 2060やRTX 2070、RAMはCrusial DDR4 PC4-25600とかがコスパいいかもしれない。
PlayCanvasのプロジェクトをアプリビルド用にダウンロードをする方法 [Cordova]

[playcanvas-rest-api-tools](https://github.com/playcanvas/playcanvas-rest-api-tools)というPlayCanvasで作成したプロジェクトをAPI経由でダウンロードできるツールがあります。いくつかダウンロードの際にプロジェクトに対して編集する機能があります。
今回は、アプリビルド用（Cordova)を利用する際のプロジェクトのダウンロード方法を紹介します。

#### 1.git clone 

```bash
git clone git@github.com:playcanvas/playcanvas-rest-api-tools.git
```

#### 2.リポジトリ内`.env.template -> .env`, `.config.template.json -> config.json`に名前を書き換えます。

```bash
mv .env.template .env
mv .config.template.json config.json
```

##### .envについて
API Tokenは[こちら](https://playcanvas.com/account)から取得できます。

```.env
AUTH_TOKEN=xxxxxxxx
```

##### .config.jsonについて
`プロジェクトID`, `プロジェクト名`, `シーンID`, `ブランチID`を設定します。

```config.json
{
    "playcanvas": {
        "project_id": プロジェクトID,
        "name": "プロジェクト名",
        "scenes": [
            シーンID
        ],
        "branch_id": "ブランチID",
        "description": "",
        "preload_bundle": false,
        "version": "",
        "release_notes": "",
        "scripts_concatenate": true,
        "scripts_sourcemaps": false,
        "scripts_minify": true,
        "optimize_scene_format": false
    }
}
```

#### 3. プロジェクトをダウンロード

```bash
npm run cordova-publish
```

###### ダウンロードされたプロジェクトについて
playcanvas-rest-api-tools//temp/download/プロジェクト.zipでダウンロードされます。

```bash
xxxxxx.json                    __settings__.js                 index.html                      styles.css
__game-scripts.js               __start__.js                    logo.png
__loading__.js                  config.json                     manifest.json
__modules__.js                  files                           playcanvas-stable.min.js
```

## ビルドしたプロジェクトをCordovaで動かす

##### 1. cordovaのインストール

```bash
npm install -g cordova
```

##### 2. プロジェクトを作成
```bash
cordova create playcanvas-project com.example.playcanvas "PlayCanvas Project"
``

生成されたディレクトリ

```bash
config.xml      package.json    www
```

##### 3. 先程ダウンロードしたファイルを`www`配下に移動

##### 4. iosのプラットフォームを追加

```bash
cordova platform add ios
```

##### 5. config.xmlに下記を追記
```xml
<platform name="ios">
        <!-- Add these two lines... -->
        <preference name="scheme" value="app" />
        <preference name="hostname" value="localhost" />

        <!-- ...alongside whatever already exists in this section -->
</platform>
```

##### 6. ビルド
```bash
cordova build ios
```


##### 7. 実行
```bash
cordova run ios
```
#### 8. 実機で動かす場合にはXcodeから実行します。
![run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257048/d287a401-1109-e12d-1ea9-eab8241f4c3a.png)


### Android
[こちら](https://cordova.apache.org/docs/ja/10.x/guide/platforms/android/)を参考に環境設定を行います。

##### 1. ビルド
```bash
cordova build android
```

##### 2. 実行
```bash
cordova run android
```

#### 3. 実機での確認
[デバイスを接続](https://developer.android.com/studio/run/device?hl=ja)してAndroidの実機で確認します。これで動かすことが出来ます。
Qt WebAssemblyアプリのApacheへのデプロイ

# はじめに
Ubuntu上にQtのQebAssembly環境を構築してビルドやデバッグを行った後に、実際の稼働環境にデプロイする話で、以下の記事の続編です。

https://qiita.com/AlohaYos/items/fe64c54b36a9649970ed

https://qiita.com/AlohaYos/items/0fecff0840277eae4a8a

# 自動デプロイ
デプロイといってもファイルをコピーするだけです。
QtでWebAssemblyアプリをビルドし、生成物をウェブドキュメントのディレクトリに転送します。私の使用している Ubuntu18.04ではhtmlドキュメントを保存するディレクトリは以下の通り。

    /var/www/html

### スクリプト

以下のスクリプトを使って、ビルド後のファイルをコピーしていきます。

```wasmcopy.sh
#!/bin/bash

rm /var/www/html/*.*
cp $1/*.html /var/www/html
cp $1/*.js /var/www/html
cp $1/*.wasm /var/www/html
cp /var/www/html/$2.html /var/www/html/index.html
```

Qtプロジェクトをまとめているディレクトリなどに上記のwasmcopy.shを配置し実行権限を与えておきます。

    ~/Documents/qtproject/wasmcopy.sh

### Qtプロジェクトの準備

ビルド後に自動的にスクリプトを実行するように設定します。
Qt WebAssemblyのBuild設定で、Buildステップの「Buildステップを追加」ボタンを押してCustom Process Stepを追加します。
![Screenshot from 2021-08-05 11-35-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1839672/1bd8f550-4480-dc7a-24b5-c8bc9b259b7c.png)

```設定項目.
    Command：          ~/Documents/qtproject/./wasmcopy.sh
    Arguments：        %{buildDir} %{ActiveProject:Name}
    Working directory：%{buildDir}
```

### ビルド＆実行

Qt Creatorでビルドを行うと、実行に必要なWebAssemblyファイルが/var/www/htmlにコピーされます。あとはウェブブラウザで下記アドレスにアクセスしてください。

    http://localhost/index.html

emrun無しでApacheで動作するWebAssemblyアプリができました。

![Screenshot from 2021-08-05 11-55-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1839672/a5172eba-20d5-08d9-13dd-195d63551f6b.png)
serverlessでLambda関数をdeployするとき、一度Lambda関数を削除して再度deploy実行した時に"Lambda function <Lambda関数名> could not be found"と表示された時の対処法

serverlessでLambda関数をdeployしてLambda関数が作成された後、
誤ってLambda関数を削除してしまいました。
そのため、再度serverlessでLambda関数をdeployした時、初回deploy時には表示されなかったエラーが表示されました。

```
An error occurred: HelloLambdaFunction - Resource handler returned message: "Lambda function <Lambda関数名> could not be found" (RequestToken: XXXXXXX, HandlerErrorCode: NotFound).
```
[serverlessの公式ドキュメント](https://www.serverless.com/)を見直してみたところ、
CloudFormationを介してLambda関数やらLambda関数のロールやらを作成してくれていたのに、
私が勝手にLambda関数だけを削除してしまったので、"Lambda function <Lambda関数名> could not be found"と
エラーが出てきた、という状況が見えてきました。

そのため、いったん、初回deploy時に作成された環境をきれいにすることにしました。

* 初回deploy時に作成された CloudFormationの該当するスタックを削除
* 初回deploy時に作成された Lambda関数のロールの削除
* 初回deploy時に作成された S3バケットを削除

結果、再度serverlessでdeploy実行した時、問題なくLambda関数が作成されました。
PowerShell インストールメモ

#はじめに
- VSCode に下記のメッセージが出たので最新版のPowerShell をインストールしてみました。<br></br>
![2021_0805_0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843142/1a57e08d-f2bf-b78f-a240-30397e4aba1e.jpeg)

#環境
- OS：Windows10 64bit
- インストール日：2021/08/05
- PowerShell-7.1.3-win-x64.msi

#自分が行った手順
##①ダウンロード
- [PowerShell/PowerShell](https://github.com/PowerShell/PowerShell/releases/tag/v7.1.3)から最新版をダウンロード<br></br>
![2021_0805_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843142/b59c7836-840e-6b21-7335-0fdb58937086.jpeg)

##②ダウンロードしたファイルを実行
- 全てデフォルト設定<br></br>
![2021_0805_12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843142/0e647f50-e427-a79f-579c-6385e0dfb884.jpeg)

##③VSCodeを起動
- PowerShell が最新版になっていることを確認<br></br>
![2021_0805_20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1843142/bdf9bff5-a715-f402-6a12-3a2d6b4ca5de.jpeg)
【FileMaker】SendGrid経由でメールを送る - エラーコード10が返ってくる

そうなんですよ、FileMakerでSendGrid API経由でメールを送信すると、ちゃんと送っているにもかかわらず、エラーコードが返ってくるんですよ。
ゾンビですよね。
![スクリーンショット 2021-08-05 11.59.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/1495fb7d-d998-af45-2a3b-3cf7fd20c4ca.png)


見落としがちですが、公式のヘルプ、「[URL から挿入](https://help.claris.com/ja/pro-help/content/insert-from-url.html)」にも書いてありますが、だいぶ読み進めないと現れません。
![スクリーンショット 2021-08-05 12.06.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/9ae40d40-2d0f-abcb-92d9-ceefa0e3ead0.png)
公式にもあるとおり、「応答に内容がないことが想定される場合」とあるので、一概にエラーではないという判定はできませんが、SendGrid APIのメール送信処理については、応答が返ってこないので正常終了している、という判断で以下のようにエラー処理をします。

![スクリーンショット 2021-08-05 12.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/5c9fb494-5582-2d10-6f76-bb137c0cf85d.png)
If文の中は、適宜運用に合わせて実装して下さい。

その他、FileMakerでSendGridを実行する記事を書いています。
FileMakerとSendGridでQiita内を検索してみて下さい。

今までの記事は、こちら。
[【FileMaker】SendGrid経由でメールを送る 下準備編](https://qiita.com/tyuma/items/42b415fb9c515ff1b0d8)
[【FileMaker】SendGrid経由でメールを送る テキストメール編](https://qiita.com/tyuma/items/778b94db943b0e3ba713)
[【FileMaker】SendGrid経由でメールを送る 添付ファイル編](https://qiita.com/tyuma/items/e9c7f113af3794305ad6)

では！
【Google Cloud Day'21】「What's new in Google Kubernetes Engine.」を視聴して

What's new in Google Kubernetes Engine.
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d1-appdev-01
本セッションでは Google Kubernetes Engine (GKE) の最新情報について、20 分間で出来る限り深く解説していきます。Live QA でのご質問もお待ちしています！

<table>
	<tr>
		<th>質問</th>
		<th>回答</th>
	</tr>
	<tr>
		<th>今後は、Autopilot を最初に検討するほうがいいですか</th>
		<td>セッションないでユースケースについてふれましたが、ライフサイクルが短めのワークロードで試すのがいいと思います。</td>
	</tr>
	<tr>
		<th></th>
		<td>Kubernetes の運用をより簡単に行えるので、まず GKE Autopilot で対応可能かご検討頂くのはオススメです。</td>
	</tr>
	<tr>
		<th>VPCの中のRedisとかアクセスするパターン、Cloud RunでもVPCConnectorでできますが、Autopilotだと、ユーザVPCにコンテナが起動する。それぞれ選択する使い分けはどうしたらいいのか。autoscalingの迅速化とかの観点</th>
		<td>Cloud Run と Autopilot の使い分けですが、いくつか考え方があるかと思います。</td>
	</tr>
	<tr>
		<th></th>
		<td>例えばコンテナに設定可能なマシンスペック(vCPU/Memory)についてはCloud Runは 最大で4vCPU / 8 GB なのに大して、GKE Autopilot はより大きなサイズを設定可能です。</td>
	</tr>
	<tr>
		<th></th>
		<td>また完全にプライベートなエンドポイントをもたせたい場合も VPC 内で動作する GKE Autopilot を選択することになるかと思います。</td>
	</tr>
	<tr>
		<th></th>
		<td>オートスケールについては、Node の作成から行うことがある分、Autopilot の方が少々時間がかかるかなーという印象です。ご利用の際にはぜひ検証比較頂ければと思います。</td>
	</tr>
	<tr>
		<th>Autopilotの課金体系はどういったものになりますか？</th>
		<td>GKE Autopilot の料金ですが、Pod 単位の課金となります。(vCPU / Memory / Ephemeral Storage) また、クラスタ自体に $0.1/時間の管理費用が掛かります。</td>
	</tr>
	<tr>
		<th></th>
		<td>詳しくは公式ページをご確認ください。https://cloud.google.com/kubernetes-engine/pricing</td>
	</tr>
</table>


<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>GKEsutopilot</th>
		<td></td>
	</tr>
	<tr>
		<th>multi cluster services</th>
		<td></td>
	</tr>
	<tr>
		<th>スケーラビリティ</th>
		<td></td>
	</tr>
	<tr>
		<th></th>
		<td></td>
	</tr>
</table>


![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/a4c9b6a9-e91a-9c33-fca2-afd04ff0ac76.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/9cf72203-d16c-0b57-feb6-4a2d7abe7148.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/2338ff8e-8f4e-b070-11bc-dc4a653e70bc.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/06600d1a-553b-2a49-90a3-55300c5fa685.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/219de4a1-fe97-d178-71cf-d936ca21b24c.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/45f40fd2-aae5-4f17-7b47-dd13a955f135.png)
【Google Cloud Day'21】「次世代 CAFIS 実現へ向けた Anthos を活用したハイブリッドクラウドの未来像とは？」を視聴して

次世代 CAFIS 実現へ向けた Anthos を活用したハイブリッドクラウドの未来像とは？
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d1-appdev-02
"クレジットカードを中心とした決済中継を実現するための決済プラットフォームをクラウド上に実現するため、ハイブリットクラウドアーキテクチャを構想。Anthos 等の製品群を活用して、可用性・セキュリティ等の高い非機能要件の実現とともに、ビジネス要求の変化に対応できるサービス基盤を開発している。
本セッションでは、開発に至る経緯・要求を共有するとともに、採用した要素技術のご紹介をいたします。"

<table>
	<tr>
		<th>質問</th>
		<th>回答</th>
	</tr>
	<tr>
		<th>AWS、Private、Google Cloud と複数のクラウドを利用されていますが、苦労された点などありますか？</th>
		<td></td>
	</tr>
	<tr>
		<th>パブリッククラウドを初めて利用する際にはどのような点に注意したほうが良いでしょうか？</th>
		<td>いきなり大きく始めるのではなく、小さく始めることが重要だと考えます。PJリスクをあまり大きくせずに始めることで、要員やセキュリティなどの課題を抽出し、次のアクションを取りやすくなるからです。この過程で、クラウドを利用するノウハウを蓄積し、より大きなPJに適用可能となります</td>
	</tr>
	<tr>
		<th>クラウド間でSLAなどが異なる点において、サービスのSLA策定などはどのように行われているのでしょうか</th>
		<td>まずはクラウドを意識せずにサービスに必要なSLAを検討しております。その上で、各クラウドのSLAを踏まえて、マルチクラウドを採用するといったアーキテクチャに落とし込みます。</td>
	</tr>
	<tr>
		<th>セキュリティログ監視、管理あたりだと、他にも色々選択肢があったとおもいますが、Chronicle の採用ポイントを教えて下さい。</th>
		<td>Google上のAPに変更が不要だった点が大きいです。また、コスト面でも類似製品と比較して半分程度だった点も重要なポイントです。</td>
	</tr>
	<tr>
		<th>AnthosはAWSにも対応しているかと思いますが、AWS上もKubernetesクラスタをAnthos管理下に入れる予定等はありますか？</th>
		<td>既存のAWS上のアプリケーションも存在しており、今の所はAnthos管理下には入れておりません。今後、実際にAnthosを利用していく中で、システムメンテナンスやシステム運用の容易性が認識できれば、管理下に入れることも検討したいと考えております。</td>
	</tr>
	<tr>
		<th>AWSで稼働しているKubernetes環境もAnthosを利用しているのでしょうか？</th>
		<td>AWS環境に関しては、Anthosは利用せずに開発を行っております。</td>
	</tr>
	<tr>
		<th>マルチクラウド環境で運用の課題はなんでしょうか？</th>
		<td>クラウドで共通的に利用可能なノウハウに加えて、個別にクラウドごとに必要な物が出てくるかと思います。これを踏まえて安定的にサービスを提供するための、人や社内プロセスを整理してくことが課題となるかと思います。</td>
	</tr>
</table>

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>cafisとは</th>
		<td></td>
	</tr>
	<tr>
		<th>課題</th>
		<td></td>
	</tr>
	<tr>
		<th>クラウド利用時のメリット</th>
		<td>属人かも防いでいきたい</td>
	</tr>
	<tr>
		<th>クラウド利用時の課題</th>
		<td></td>
	</tr>
	<tr>
		<th>ハイブリッドクラウドの採用について</th>
		<td>一つのクラウドで障害がでたら、違うクラウドに切り替えるような仕組みしている</td>
	</tr>
	<tr>
		<th>GCP採用のポイント</th>
		<td></td>
	</tr>
</table>

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/fa69b062-2e3b-5979-ad1e-9990d47d471d.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/e60aada4-4c9d-57dc-94e7-df1edee21e80.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/1981bfb1-7afb-ef8b-8cf5-b735b4f9c7b9.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/2ba8e0b5-8c5c-f1a9-b762-d41f9e6536f0.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/1341d0e6-6df9-0de4-7df1-616c7ce70adf.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/7a07f670-5998-e730-830b-54f834e15f8e.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/433d13c6-49d4-0636-f59a-826b020c6008.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/9acc8999-27f1-652c-b71d-b1c6116a21b8.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/766a1031-bebc-83ac-6dfe-9b0e6c267136.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/035cc583-b32f-b8bb-ca9a-765fc4ce703e.png)
ファイル取得「UnityNativeFilePicker」でファイル選択時のイベントの取得について

Unityで開発を行っております。

iOSでファイル取得のために「yasirkula/UnityNativeFilePicker」プラグインを使用しています。
https://github.com/yasirkula/UnityNativeFilePicker

こちら非同期で動いておりますが、動画ファイル等サイズの大きいファイルを選択した際に、読み込み処理が行われているのかどうかがわからないので、
ファイル選択時のイベントの取得方法をご存じでしたら教えていただけないでしょうか。

USBより4BG近くの動画ファイルを選択した際など、転送時間が掛かるものに関しては読み込み中の表示を行いたいと考えております。

Unityは
Unity2020.3.1f1

を使用しております。

よろしくお願いします。
データサイエンス業務の全体像を知る

業務未経験ながらデータサイエンス業務について色々調べてみたのでまとめます。
全体像と使用されるツールについてです。

### 全体像を分かりやすく図で表すとざっとこんな感じ 
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1777576/f9592693-ff0b-54a5-92db-058c60c94b94.png)

## 左から順に説明していきます。 

## 多様なデータ 
いろんなデータがごっちゃになった状態のことを指しています。 
センサーから持ってきたログファイルであったり、テキストデータの可能性もあるかもしれません。 
この多様なデータを保存する場所として使われるのがデータレイクで、生データを取り扱います。 

## ETL 
多様なデータをDWHへ格納する際に必要な作業です。 
世の中にはETLツールというものがあり、データサイエンティストの工程の8割といわれる部分を軽減してくれるそうです。 
どうやらコーディングが必要な箇所なようで、SQLやPython、他にもなんか使われているみたいです。 

## データウェアハウス 
整理されたデータが格納されている場所です。 
こっから直接BIツールで可視化することもできたり。 
予測モデルの構築のためのデータ抽出もここから行います。 

## BIツール 
PowerBIやTableauなどがよく聞くソフトウェア。 
他、クラウドにもあり、データウェアハウスから直接持ってくることもできるようです。 
例.GCP：Bigquery（DWH）とデータポータル（BI）が結びついている 

## 予測モデルの構築 
画像・言語・音声などの全てのデータから色々なことを予測します。
AutoMLもクラウド内のサービスとしてあり、それぞれの処理に特化したAutoMLがちゃんとある。 
例.AutoML Translation（GCP）グーグル翻訳を組み込むことができる。 

## 提案書 
BIツールや予測結果を提案書を作成し、データを元に経営レベルまで話を進めると予想。 
コンサルに近く、ビジネスよりのデータサイエンティストのアウトプットはこっち？  

## 機器やアプリへの組み込みなど 
よくAIによってなんちゃら～って聞くのはここの話ですね。

 
## 次に、企業でよく使用されているツールについて説明します。 

どのツールも大体上の図のどこかのプロセスで使われるものとなっています。 

## データレイク関連 
#### Hadoop 
オープンソースのミドルウェアで、データレイクとして使われている。 
分散サーバーから成り、あらゆる種類の大量のデータを保管・処理でき、有名です。 
（Sparkについて） 
Hadoopと互換性があり、並行利用されているとのこと。 
Hadoopは大量のデータを処理可能で遅い、Sparkは容量は少ないが速い（イメージ） 

#### クラウドのデータレイク 
クラウドにもデータレイクがちゃんと用意されているようです。  
AWS：たぶんあるけど名前不明 
Azure：たぶんあるけど名前不明 
GCP：Cloud Stroage、その他 
## ETL関連 
#### trocco 
データの転送・統合・ETLが行えるサービスで、クラウドのDWHにも対応しているらしい。 
（データレイクからデータウェアハウスに移すための処理） 
#### TalendのETLツール 
オープンソースのツールで、無償版からアップグレードして機能を追加できる。 
多くのETLツールを提供しており、各クラウドのDWHにも対応 
#### クラウドのETL 
AWS：AWS Glue 
Azure：Ａzure ＤataFactory 
GCP：見つかりませんでした。 
あんまり良いこと書いてないけど詳しく知りたい人はどうぞ 
https://it-trend.jp/etl/article/252-0005 
## データウェアハウス関連 
#### クラウドのデータウェアハウス 
AWS：Amazon Redshift 
Azure：Azure Synapse Analytics 
GCP：Bigquery 
より詳しい説明はこちら 
https://qeee.jp/magazine/articles/2870 
## BIツール 
#### Tableau 
有名な奴。多くの企業で使用されているBIツール 
####クラウドのBIツール 
AWS：Amazon QuickSight 
Azure：PowerBI 
GCP：データポータル（旧データスタジオ）、Looker 
## 予測モデルの構築に使われるやつら 
#### SAS 
ホームページによると高度なアナリティクスソフトウェアらしい。 
統計解析・データマイニング、時系列予測、テキスト分析とホームページに書かれています。 
#### AutoML 
たぶんいっぱいありすぎるので割愛。 
各クラウドにもそれぞれAutoMLが用意されているようです。 
## その他、データサイエンス系で聞いたツール 
#### Splunk 
ログ解析ツール。サーバー、ネットワーク、システムなどさまざまなマシンからログデータを収集し、リアルタイムな検知・分析が可能 
実用例：セキュリティインシデントの検出 
他にもあり次第追記します。 

##まとめてみた感想 

### クラウドがサービスが使われる理由がよくわかりました。
#### もちろんこんな記事1つで説明できるわけはないので、実際にデータサイエンティストとして働き始めた後、色々ツッコミを入れながら自分でも読みたいと思います。
Gradleコマンドで実行したテストをIntellij IDEAでブレークポイント付けてデバッグする

## ナニコレ?
通常はIntellij経由でテストを実行すればブレークポイントを張った場所で止めることができるが、
ターミナルのgradleコマンド経由で実行したテストでも同じことがしたいときのやり方。

## 手順

### 1. デバッガの設定をする

`Run` > `Edit Configurations...` を開き、左上の「+」ボタンから「Remote JVM Debug」を選ぶ。
特に設定はいじらずデフォルトのまま「OK」で保存。（port=`5005`）

![Screen Shot 2021-08-05 at 11.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109747/0241e2bb-59d7-60ec-57e5-e04780c39068.png)


### 2. Gradleコマンドで対象のテストを実行

```
./gradlew test --tests "HogeTest*" --debug-jvm
```

- `--tests` ...実行対象のテストをフィルタリング。[公式DocのTest filteringの章](--tests "HogeTest*")を参照
- `--debug-jvm` ...テストを実行する直前で停止し、ポート= `5005` でデバッガがアタッチされるのを待機する

### 3. デバッガを実行

Intellijでブレークポイントを付けておき、
1で作ったConfigurationを「🪲」ボタンをクリックして実行する。

![Screen Shot 2021-08-05 at 11.46.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109747/f3bc88dd-1c02-98ff-b05e-da93b14cefae.png)

→ テストが実行され、ブレークポイントを張った場所で止まる💪
Windowsでファイル内テキスト検索

## 概要
「〇〇って書いてあるファイルがどこに行ったか分からない」「個人情報が入っているファイルを探したい」といった場合にPowerShellを使用して検索する方法


参考：[Select-String (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Docs](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string?view=powershell-7.1)


※検索に使用しているファイルに記載されている個人名は[[疑似個人情報データ生成サービス]](https://hogehoge.tk/personal/)を使用して生成しており、実際に存在するものではありません。

##コマンド

```powershell
Select-String 検索するフォルダ -pattern 検索文字列
```

```powershell:使用例
(ファイルを検索するフォルダでShift＋右クリック [PowerShellウィンドウをここで開く]でPowershellを実行)

PS C:\>Select-String *.* -pattern 田中

personal_infomation1.csv:15:14,田中修子,タナカシュウコ,女,0798418030,1969/01/07

PS C:\> Select-String *.* -pattern 夫

personal_infomation2.csv:2:1,岩谷盛夫,イワタニモリオ,男,0125635115,1969/01/10
personal_infomation2.csv:35:34,浜野定夫,ハマノサダオ,男,0326502254,1971/09/11
personal_infomation2.csv:72:71,白川明夫,シラカワアキオ,男,0893529050,1982/10/09
personal_infomation2.csv:86:85,米沢政夫,ヨネザワマサオ,男,0271615143,1984/08/24
personal_infomation3.csv:30:29,大谷光夫,オオヤミツオ,男,0944136870,1987/10/19
personal_infomation3.csv:69:68,大場照夫,オオバテルオ,男,0769047463,1985/11/06
personal_infomation4.csv:5:4,白木哲夫,シラキテツオ,男,0338896081,1970/01/10
personal_infomation4.csv:6:5,香川悦夫,カガワエツオ,男,0424848009,1989/06/29
personal_infomation4.csv:48:47,坂田郁夫,サカタイクオ,男,0186750955,1984/08/11
personal_infomation4.csv:85:84,山上忠夫,ヤマガミタダオ,男,0879011016,1988/09/02
```
## Appendix

コマンドプロンプトの場合

```shell
find "検索文字" *
```

Linuxの場合

```shell
grep -ir "検索文字" .
```
ColabのRのノートブックにNEologd辞書をインストール

# Ⅰ．はじめに
　Google Colaboratory（略称: Colab）で、 R のノートブックを作り、MeCab から RMeCab、NEologd 辞書までインストールした手順のメモです。

# Ⅱ．Colab で R を使うとき
　次のリンクからノートブックを新規作成する。
　　https://colab.research.google.com/notebook#create=true&language=r

# Ⅲ．R のコード

## １．日本語フォントのインストール
　ggplot2 のグラフなどで、日本語を使いたいとき日本語フォントのインストールが必要になる。
　今回は、日本語 IPA フォントをインストールした。  

```r
system("apt-get install -y fonts-ipafont")
```

## ２．MeCab をインストール

- MeCab 本体や辞書等のシステムライブラリをインストール

```r
system('apt-get install -y mecab libmecab-dev mecab-ipadic-utf8')
```

## ３．RMeCab をインストール

- RMeCab をインストール

```r
install.packages("RMeCab", repos = "https://​rmecab.jp/R")
```

- RMeCab の動作確認

```r
library(RMeCab)
RMeCabC("すもももももももものうち")
```

- 次のように出力されれば、RMeCab が使えている。

>名詞: 'すもも'
助詞: 'も'
名詞: 'もも'
助詞: 'も'
名詞: 'もも'
助詞: 'の'
名詞: 'うち'


## ４．NEologd 辞書のインストール

- NEologd 辞書をインストール

```r
system('apt install git make curl xz-utils file')
system('git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git')
system('/content/mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -a -y')
```
　３行目を`system('echo yes | /content/mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -a')`から`system('/content/mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -a -y')`に変更（2021.08.07）


- 辞書を mecab-ipadic-NEologd に変更する（/etc/mecabrc の書換）

```r
system('sed -i -e "s!/var/lib/mecab/dic/debian!/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd!g" /etc/mecabrc')
```

- 辞書を NEologd 辞書に変更できたか動作確認

```r
library(RMeCab)
RMeCabC("鬼滅の刃")
```


- 次のように出力されれば、NEologd 辞書が使えている。

> 名詞: '鬼滅の刃'

- 辞書を標準のシステム辞書 IPADIC に戻すとき、

```r
system('sed -i -e "s!/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd!/var/lib/mecab/dic/debian!g" /etc/mecabrc')
```

# Ⅳ．参考URL

https://qiita.com/satoru-ka/items/f47ecd43d9e69d64b0a8

https://qiita.com/Naritoshi/items/8f55d7d5cce9ce414395
wiresharkでsshdumpを、sudoパスワード設定有のリモートサーバーに対して行う

# 結論のみ

Remote capture commandに次のコマンドを入力する

```
echo PASS | sudo -S tcpdump -U -i PORT -w - 'capture filter'

-S: SUDOパスワードを標準入力から読み込む
PASS: sudoパスワード
PORT: キャプチャしたいポート。ens37など
capture filter: キャプチャフィルタ。
  Remote capture filterの内容をコピペでよい。
  Remote capture commandを利用すると、Remote interface や Use sudo on the remote machine、
  No promiscus mode や Remote capture filter の入力値は無視されるため。
  
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/61210676-c997-c94a-9400-1665d7f457db.png)

# その他

コマンドラインで済ませたい人はこちら

```
echo SUDOPASS | sshpass -p SSHPASS ssh user@host "sudo -S tcpdump -U -n -w - -i PORT 'not port 22'" | sudo wireshark -k -i -

-k : すぐにキャプチャを始める
-i : キャプチャインタフェースを指定。-はstdinのこと。
```
【VisualStudio】コンパイルエラー対応一覧

# コンパイルエラー一覧
## CS1705
### エラー内容
```
アセンブリ '<アセンブリ名 1>' は、参照されているアセンブリ '<アセンブリ名 2' よりも新しいバージョンを含む '<型名>' を使用します
```
* 参照しているアセンブリ(ここではアセンブリ1とする)で複数のバージョンの型にアクセスしている状態を指すエラー
  * 例えばプログラムAから参照しているアセンブリ1のバージョン1.0で定義されている`ClassA`とバージョン2.0で定義されている`ClassA`に同時にアクセスしてしまっている状態

### 解決策
* 参照しているアセンブリのバージョンをそろえる
* コンパイル時に参照設定を指定する(参考資料を参照)

### 参考資料
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-messages/cs1705