OmniAICreator/Qiita-1.07M huggingface dataset:
Db2 V9.7/V10.1/V10.5/V11.1からV11.5への移行ガイド



#  Db2 V9.7/V10.1/V10.5/V11.1からV11.5への移行ガイドが公開

Db2（Linux,Unix,Windows版) V9.7/V10.1/V10.5/V11.1から最新バージョンであるDb2 V11.5への移行ガイドが公開されています。



-[【SIL】Db2 for LUW 移行ガイド(考慮点一覧) - Db2 V9.7/V10.1/V10.5/V11.1からV11.5への移行対応版](https://www.ibm.com/support/pages/node/6567153)


-[【SIL】Db2 for LUW 11.5 移行手順ガイド](https://www.ibm.com/support/pages/node/6567151)


Db2はバージョンが上がる場合も既存バージョンとの上位互換性は基本的に保たれますが、それでも細かな変更点やマニュアル上非推奨とされていた機能が数バージョン後に削除される場合もあります。

資料は非常に細かいところまで調べて丁寧に書かれています。
各バージョンでのパラメータの変更点をまとめた資料も含まれており、非常に役立つ力作と思います。

Db2のバージョンアップ（マイグレーション）の際には、ぜひご活用ください。






IBM SupportのサポートのサイトにもQuestion & Answerとして上記資料へのリンクが記載されています。

[[Db2] V9.7/V10.1/10.5/V11.1 から V11.5 への移行に関連する情報](https://www.ibm.com/support/pages/node/6458073?myns=swgimgmt&mynp=OCSSEPGG&mync=E&cm_sp=swgimgmt-_-OCSSEPGG-_-E)

            
 	





#  [Db2 11.5 マニュアルのトップページ]
- 日本語
    - https://www.ibm.com/docs/ja/db2/11.5
- 英語
    - https://www.ibm.com/docs/en/db2/11.5
    - 最新情報は英語で更新されていますので英語で確認するのがお薦めです

# [Db2 11.5 システム要件]
稼働環境の前提要件等の確認はこちらでおこないます（英語）
- [System requirements for IBM Db2 for Linux, UNIX, and Windows](
https://www.ibm.com/support/pages/system-requirements-ibm-db2-linux-unix-and-windows)
AWSでElasticSearch Kibanaを使う

# 可視化
流行りに乗りたいので先人達の真似をしながら作ってみる
Elastic searchに何かしらを格納してkibanaで可視化するのが目標

# 環境
- AWS, Amazon OpenSearch Service
普段AWSを使う機会がないので勉強も兼ねてAWSで挑戦

# 手順
マネージメントコンソールから作る
サービスは **Amazon OpenSearch Service** 
ただ、2021年9月までは Amazon Elasticsearch Service というサービス名だったらしいので、後者の方が情報はたくさん出てくる

## 1. ドメイン作成

無料利用枠で作っていく
- t2.small.search か t3.small.search
- 月 750 時間まで
- オプションで Amazon Elastic Block Store (Amazon EBS) を月 10 GB 利用可能

![スクリーンショット 2022-04-07 15.06.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445177/6fa2ac70-3e20-fe0b-384a-5581f4c54534.png)


ネットワーク周りの設定、VPCやサブネットを選択する
テスト・開発環境では利用できないが SAML 認証も設定可能
AWS Cognito 認証はテスト・開発環境でも設定可能

ドメインのアクセスポリシー
今回はパブリックで自分のGIPのみ許可するポリシー
ビジュアルエディタでGIP追加 -> JSONで確認する

![スクリーンショット 2022-04-07 15.27.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445177/1b8fb398-6688-65f6-f131-3b3c42931e12.png)





AWS CLIでの[コマンドサンプル](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html?icmpid=docs_console_unmapped)もある

```linux:
# r6g.large.search
# 100GiB汎用（SSD）EBS
# 192.0.2.0/32からのみ許可
aws opensearch create-domain --domain-name mylogs --engine-version OpenSearch_1.0 --cluster-config  InstanceType=r6g.large.search,InstanceCount=2 --ebs-options EBSEnabled=true,VolumeType=gp2,VolumeSize=100 --access-policies '{"Version": "2012-10-17", "Statement": [{"Action": "es:*", "Principal":"*","Effect": "Allow", "Condition": {"IpAddress":{"aws:SourceIp":["192.0.2.0/32"]}}}]}'
```

```linux:
# Elasticsearchバージョン7.10, 
# r6g.large.search
# 100GiB汎用（SSD）EBS
# AWSアカウントIDで識別される単一のユーザーに制限：555555555555
# 3つのアベイラビリティーゾーンにインスタンスを分散

aws opensearch create-domain --domain-name mylogs --engine-version Elasticsearch_7.10 --cluster-config  InstanceType=r6g.large.search,InstanceCount=6,ZoneAwarenessEnabled=true,ZoneAwarenessConfig={AvailabilityZoneCount=3} --ebs-options EBSEnabled=true,VolumeType=gp2,VolumeSize=100 --access-policies '{"Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::555555555555:root" }, "Action":"es:*", "Resource": "arn:aws:es:us-east-1:555555555555:domain/mylogs/*" } ] }'
```


## 2. Kibanaログイン
y-t-esというドメインを作成し、立ち上がると右カラムにKibana URLがある

![スクリーンショット 2022-04-07 15.34.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445177/467168c6-4a53-10ec-74ca-c568b9dd6f17.png)

Kibanaにログイン
![スクリーンショット 2022-04-07 15.36.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445177/de818330-7548-4760-b3cd-115798daa5d8.png)

ログ、メトリック、セキュリティのモジュールが選べる
Logstashがある
Cisco、F5がある

![スクリーンショット 2022-04-07 15.38.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445177/fa8cc352-1f4c-d5b0-e7b5-7303dafb0a6c.png)

サンプルがあったのでSample web logsというのを表示
一部読み込み失敗しているけどかっこいい感じに出力される


![スクリーンショット 2022-04-07 15.42.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445177/b5bc5a99-0aa8-cad4-6d32-53fd1e7c8a94.png)
![スクリーンショット 2022-04-07 15.43.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445177/85902fed-a2ec-385d-98f0-dfcbe1ed5adc.png)


・備忘
情報をあげるにはCLIで Elasticsearch REST API の index と bulk を使う
HTTPリクエストのペイロードがインスタンスタイプによってサポートされる最大値が異なる
parrot-sphinx インストール，利用　その１

# parrot-sphinxインストールなどの備忘録
parrot製のドローンのシミュレーションが利用できる，parrot-sphinxのインストールや利用方法，またROSとの連携についてこれから随時記録していきたいと思っています．(parrot-sphinx ver2.5.1)

## parrot-sphinxのインストール
### ftpサーバーのidとパスワードの取得
まず初めにftpサーバーに保存されているparrot-sphinxにアクセスするために，サーバーのidやパスワードを取得する必要があります．そこで，developer@parrot.comにメールでparrot-sphinx利用目的などを明確に説明するとidとパスワードが返信されます．人によっては数日返信が来ないことも...orz

### parrot-sphinxのPPAシステムに登録する．
以下の手順でターミナルにコマンドを入力していきます．(\<myuser\>と\<mypassword>は，developer@parrot.comから取得したものを使用してください．)

    echo "deb ftp://<myuser>:<mypassword>@ftp2.parrot.biz/deb/ $(lsb_release -cs)/" | sudo tee /etc/apt/sources.list.d/apt.parrot.biz.list
    curl -fsSL ftp://<myuser>:<mypassword>@ftp2.parrot.biz/gpg | sudo apt-key add -
    echo 'Dir::Bin::Methods::ftp "ftp";' | sudo tee /etc/apt/apt.conf.d/99sphinx-ftp
    sudo apt update

これは，
https://developer.parrot.com/docs/sphinx/installation.html
で掲載されている手順に沿っていますが，私の場合は2行目のコマンド

    curl -fsSL ftp://<myuser>:<mypassword>@ftp2.parrot.biz/gpg | sudo apt-key add -
を入力した際に，以下のようなエラーが出てうまくいきませんでした．

    curl: (28) server response timeout
    gpg: no valid OpenPGP data found
そのような場合は，以下のようなコマンドに切り替えてください．

    wget ftp://<myuser>:<mypassword>@ftp2.parrot.biz/gpg
    sudo apt-key add gpg
ここまでエラーなく上手くできれば，parrot-sphinxをインストールします．

    sudo apt update
    sudo apt install parrot-sphinx
parrot-sphinxにはいくつかのシミュレーション環境がありますので一覧を表示させます．
    
    sudo apt update
    apt-cache search parrot-ue4
ここでは一番シンプルで容量の少ない環境を紹介します．

    sudo apt install parrot-ue4-empty

# さいごに
今回はここまでの紹介ですが，続きや細かい内容は少しずつ更新していきます．

# 参考
https://developer.parrot.com/docs/sphinx/
Power BI で SharePoint Online に保存した Excel File を直接読み込む

# SharePoint に保存したExcel を読み込む
## 通常のやり方では SharePoint フォルダから
### SharePoint の中身をQuery で読み込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/6ffb0c7b-dce5-e224-3d1e-b75770c8b0de.png)
### たまにエラーになる
SPO を使用して Excel を読み込むと色々とエラーになりがちです。
## Web を使用して読み込む
### Excel からPath を取得する
ファイルメニューから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/ec197861-58fa-ac89-8947-1aad9ad90b45.png)
情報メニュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/7f8d70fe-cee1-2b43-4ba6-a947d7184e66.png)
「パスのコピー」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/340127a2-78e7-5def-610d-5d0a6ecd0e02.png)

### Power BI の「Web」を使用して読み込む
Power BI でデータの取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/c24bd25d-3a9a-ae6c-2af0-5f0a8a151583.png)
「Web」メニュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/aba91ce9-4496-5473-9857-3f634e176cdc.png)
.xlxs の後の ”?web=1” を削除する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/590ff639-a5b2-d40c-8ab0-7f0f60766a90.png)
SharePoint へのログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/451c4f04-54a8-e619-e9e3-5ff067482bea.png)
あとは通常のQueryと同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/dee436b9-daa3-3aa8-9541-86e4096c5e08.png)
Mayura Draw を使わずとも、Inkscape で eps ファイルは作れる

## Mayura Draw って？
マユラードローは描画ソフトの一つで、早い話は図を作成するためのソフトです。拡張子が .md のファイルは Mayura です。大概の大学生なら、Mayura Draw より PowerPoint の方が慣れていると思うのに、なぜ Mayura Draw を使うのか。私が先輩に聞いたところ、LaTex で使うために eps 出力するためだと答えてくださりました。

ん～それだけなら、Mayura を使わずにパワポでできない？

一つの解決策は、pdf で保存して LaTex に使うことでしょう。しかし pdf 変換は荒くなってしまいます。試行錯誤の結果、Inkscape なるフリーソフトを使って eps 出力する方法に落ち着きました。主観ですが、画質はあまり変わらないように思えます。

## Inkscape って？
Inkscape もドローソフトです。大きくは Mayura Draw と変わりませんが、以下の違いを確認しています。

- パワポで作った図形や図を、Inkscape にはペーストできる。つまり、図の作成はパワポで出力だけ Inkscape で eps 出力ということが可能。
- Mayura Draw では使えない（？）日本語フォントを eps 変換可能。

違いではありませんが、ドローソフトですから当然 Inkscape で図を作成することもできます。ダウンロードする際は OS や bit 数に応じたものをしてください。

https://inkscape.org/release/

ちなみにブラウザ上でファイル変換する [Convertio](https://convertio.co/ja/) は大変便利ですが、eps 変換はあまり勧められません。色が崩れることがあるからです。

## 注意
Inkscape は便利な一方、あくまでフリーソフトで使用は自己責任となります。学校の PC にダウンロードする際は、先生の許可を取りましょう。
Linuxシェルコマンドawk

# シェルコマンドawkの使用例：

1、現在のホストの指定されたネットワークカードの`IP`アドレスを取得します：

```bash
[root@centos centos]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.150.52  netmask 255.255.255.0  broadcast 192.168.150.255
        inet6 fe80::149a:d07c:4d0e:dce6  prefixlen 64  scopeid 0x20<link>
        ...................................................................
[root@centos centos]# ipaddr=$(ifconfig ens33 | grep "broadcast" | awk '{print $2}')
[root@centos centos]# echo $ipaddr
192.168.150.52
[root@centos centos]#
```
`！！！ens33：ネットワークカードを指定する、		$2：位置パラメータによるawk検索、区切り文字としてスペースを使用します。`


2、passwdで1000を超えるユーザーのユーザー名とログインシェルを印刷します


```bash
[root@centos centos]# tail -3 /etc/passwd
centos:x:1000:1000:centos:/home/centos:/bin/bash
swk:x:1001:1001::/home/swk:/bin/bash
zbj:x:1002:1002::/home/zbj:/bin/bash
[root@centos centos]# cat /etc/passwd | awk -F: '$3>=1000 {print $1 "\t" $7}'
nfsnobody       /sbin/nologin
centos  /bin/bash
swk     /bin/bash
zbj     /bin/bash
```
`！！！[-F:]：区切り文字としてコロンを使用し、条件付き判断と出力の間に一重引用符を使用します。 "\ t"：タブ文字、区切り文字としてタブキー`

３、 システムにログインできる一般ユーザーを印刷する

```bash
[root@centos centos]# cat /etc/passwd | awk -F: '$3>=1000 && $7=="/bin/bash" {print $1 "\t" $7}'
centos  /bin/bash
swk     /bin/bash
zbj     /bin/bash
```
`ヒント：複数の条件でフィルタリングします。二重引用符付きの文字列、2つの等号 ==`

５、 情報を印刷するときにヘッダーを追加する

```bash
[root@centos centos]# cat /etc/passwd | awk -F: 'BEGIN {print "NAME \t SHELL"} $3>=1000 && $7=="/bin/bash" {print $1 "\t" $7}'
NAME     SHELL
centos  /bin/bash
swk     /bin/bash
zbj     /bin/bash
```
`ヒント：BEGIN は大文字にする必要があります`


---
WebRTC概要について

# 概要
WebRTCについて学んだことをまとめます。

---

# webRTC とは

大雑把にいうと**配信形式**の一つ

* 配信の方式の例
  - HLS
  - MPEG-DASH
  - WebRTC


![pc.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/717054/37bfb651-c080-bb8e-fcd2-ee741f32d000.png)

---

# HLS の特徴

- メリット
  - キャッシュサーバが利用できるため DVR に対応
  - HTTP つまり TCP ペースで安定した配信が可能
- デメリット
  - 遅延が大きい
    - 30~40 秒
    - LLHLS でも 8s
- 利用例
  - apple

**リアルタイム性を求められるオンライン会議では致命的**

---

# WebRTC の特徴

Web Real Time Communication

- メリット
  - 超低遅延
    - 1 秒未満(200ms~300ms)
- デメリット
  - UDP ペースの通信のため安定性に書ける
- 利用先
  - Skype

**超低遅延なので、ウェブ会議等サービスでは利用されることが多い**

---

# 動作

---

## 用語確認 P2P

- Peer To Peer
- サーバーを介さずクライアント同士がそれぞれで接続する仕組み


![pc.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/717054/c3621c65-8a9e-6c86-8fc3-21393bb86fe9.png)


---

## 用語確認 NAT

- Network Address Translation
- IP アドレスを変換する技術
- 一般的には、プライベート IP アドレスをグローバル IP アドレスに変換する技術
- インターネットでは、グローバル IP アドレスを使用して構築したネットワーク(WAN)であるが、企業や家庭ネットワークでは、プライベート IP アドレスを使用して構築されたネットワーク(LAN)
- LAN ネットワークのクライアント PC がインターネット接続する場合、プライベート IP アドレスをグローバル IP アドレスに変換（NAT）が必要

![nat.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/717054/48774768-8165-35ce-0358-4b2bb396beea.png)


これだと、遠く離れた人にビデオ通信するとき、どれだかわからない (^^;

---

## 用語確認 STUN サーバ

- Session Traversal Utilities for NAT
- 自身のグローバル IP をレスポンス

---

## 用語確認 UDP ホールパンチング

- 文字通りは UDP の穴開けを意味する
- LAN 内にある PC に対して外部からアクセスされたものを、パンチして一時的にホールを作り接続する

---

## 用語確認 シグナリングサーバー

- 通信しようとする相手の IP アドレスの解決
  - 相手の名前から IP アドレスを取得するなど。つまりこれから通話する相手の IP アドレスを取得することができるようになる仕組み
- 相手がその通信を許可するかどうか
  - そもそも誰にでも繋がってはいけないので、拒否されているかどうかを判断する仕組み
- 通信状態（セッションと呼ぶ）において使用するパラメータの合意
  - メディアチャネルであれば、お互いの映像に使うコーデックや最大フレームレートなどの合意をとる仕組み

---

## 流れ

![p2p.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/717054/d78739fd-8849-33e7-dd4d-3b5c8c6b863a.png)


---

# 活用:

- [jitsi meet](https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-web-sdk)
  - WebRTC を扱う OSS
  - ただ自らサーバーを立てる必要あり?
  - 参考
    - [docker でたててみた](https://qiita.com/zembutsu/items/efb1713337d89f9a1bf0)
- [skyway](https://webrtc.ecl.ntt.com/skyway/function.html)
  - NTT コミュニケーションズが提供
  - サーバー不硫黄で無料で開発可能

# 参考文献

- [dmm](https://inside.dmm.com/entry/2019/07/18/lc-webrtc)
- [時雨同](https://gist.github.com/voluntas/67e5a26915751226fdcf)
- [qiita - 実装してみた](https://qiita.com/Turtle-child-No2/items/7205d5c1399375a8c10b)
- [agora](https://jp.vcube.com/sdk/blog/webrtc-general-server-configuration-signaling-turn-sfu.html)
FileReader APIをPromise化する方法

# 変更歴

2022/09/21

<ul>
<li>`reader.onload`のところを、`reader.addEventListener("load", () => ...)`というように変更しました。<br>通常、JavaScriptでは<code>el.onclick = () => {}</code>というように、.onを使ってEventListenerを追加するやり方は推奨されていないのです。</li>

<li>Promiseの型にstringの型を追加しました。<br>TypeScriptインタプリタはエラーを吐くので、resolveする前に型チェックを入れる必要があります。</li>
</ul>

# 概要
フロントエンドのWebアプリでユーザーが指定したファイルをアップロードする前に、Base64に変換することが常套手段です。
その理由は、Base64はファイルサイズが多少大きくなるが、データ破壊を防げるからです。

2進コードファイルをブラウザでBase64に変換するには、<a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader">FileReader API</a>を使います。

ただ、このFileReader APIはかなり古いようで、なんと、Promiseに対応していないのです！

そこで、そのFileReader APIをPromiseに包む、Promise化の方法をここでご紹介します。

# コード
ブラウザのHTMLInputElementから取ったFileListを引数としてもらいます。

ファイル一つのみの場合は以下のように使います。
```typescript
const convertToB64 = (filesList: FileList) =>
  new Promise<string>((resolve, reject) => {
    const file = filesList[0];
    const reader = new FileReader();

    reader.addEventListener("load", () => {
      const { result } = reader;
      if (typeof result !== "string") throw TypeError("Reader did not return string.");
      resolve(result);
    });

    reader.addEventListener("error", () => {
      reject(reader.error);
    });

    reader.readAsDataURL(file);
  });
```

複数の場合はPromise.allを使います。
```typescript
const convertAllToB64 = (filesList: FileList) =>
  Promise.all(
    Array.from(filesList).map(
      (file) =>
        new Promise<string>((resolve, reject) => {
          const reader = new FileReader();

          reader.addEventListener("load", () => {
            const { result } = reader;
            if (typeof result !== "string") throw TypeError("Reader did not return string.");
            resolve(result);
          });

          reader.addEventListener("error", () => {
            reject(reader.error);
          });

          reader.readAsDataURL(file);
        })
    )
  );
```

これらのPromiseが解決されたら、Fetch APIなどでサバーに送るなりすればいいです。

## 注意点
FileReader APIのreadAsDataURLは、Data URI Schemeになっています。Base64の前に、data:image/png;base64,を追加しているのです。
これをsplit(",")[1]などでBase64だけを取ることができます。
このままBase64からHexなどに変換しようとすると、フォーマットが変になるのでご注意ください。

# まとめ
以上、FileReader APIの簡単なPromise化方法をご紹介しました！FileReader APIには他のフォーマットに変換する機能があるので、必要に応じて変えればいいと思います。
Vue3 + Storybookでi18nを動かす

Vue３とStorybookでi18nを使えるようにした記事です。

とある日の私はVueプロジェクトにStorybookを導入してちょっといい気分になっていたのですが、i18nの$t()を使っているコンポーネントがStorybookで動かせないのに気が付きました。ブラウザに下記のようなエラーが表示されます。

```
_ctx.$t is not a function
TypeError: _ctx.$t is not a function
```

VueのプラグインはStorybookでは動かないのだなと。Storybook用にプラグインを読み込めば良いだろうと思いましたが、どこに書けば良いのかわからなくてけっこう困りました。まあググれば解決するんですけども。GitHubにそのものずばりなイシューがありました。

https://github.com/storybookjs/storybook/issues/1573#issuecomment-809282599

.storybook/preview.jsにapp.use()を書けば良いようです。下記のようなものを書いて無事動きました！素晴らしい。

```.storybook/preview.js
import { app } from '@storybook/vue3'
import { createI18n } from 'vue-i18n'
import messages from 'messages'

const i18n = createI18n({
  locale: 'ja',
  messages
})

app.use(i18n)
```

どうということの無い内容ですがググっても日本語の情報がなかったので書いてみました。みなさまにはさくっとこの記事にたどり着いて解決してほしいです。ではでは。
【MySQL】使用中のデータベースを確認する方法

本稿では、MySQLで現在使用中のデータベースを確認する方法を紹介します。

## 使用中のデータベースを確認する

以下のコマンドで使用中のデータベースを確認することができます。
>SELECT database();

実際に確認してみます。

MySQLサーバーに接続。
```
% mysql -u root -p
Enter password:
省略
```
現在のデータベース一覧を確認。
```
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb1            |
| testdb2            |
+--------------------+
6 rows in set (0.00 sec)
```

使用中のデータベースを確認。
接続直後はデータベースが選択されていないため、結果はNULLになります。
```
mysql> SELECT database();
+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)
```


データベースを選択。
```
mysql> USE testdb1;
Database changed
```

使用中のデータベースを確認。
```
mysql> SELECT database();
+------------+
| database() |
+------------+
| testdb1    |
+------------+
1 row in set (0.00 sec)
```

MySQLで現在使用中のデータベースを確認する方法を紹介しました。
HTMLの基本を解説２

今回は実際にブラウザーに表示される＜ｂｏｄｙ＞内に記述するタグを解説していきます。
タグの種類が多いので、よく使うタグのみ解説します。解説するタグだけでも簡単なWebサイトを作成できますので、頑張って覚えましょう。

## 基本文法とタグ
＜＞や＜/＞はタグと呼ばれるもので、HTMLでは基本的に文字列をこのタグで挟んで記述します。タグには様々な種類があり「どのタグで挟むか」によってその部分の役割が変わってきます。
　また、＜＞は最初に書かれる方を「開始タグ」、＜/＞は後から書かれる方を「終了タグ」と言います。基本的に二つセットで使われますが、場合によっては終了タグのないものもあります。開始タグから終了タグまでの一つのかたまりを要素と言います。

## タグの解説
* 見出し＜１ｈ＞～＜ｈ６＞タグ
* 段落を表示する＜ｐ＞タグ
* 画像を表示する＜ｉｍｇ＞タグ
* リンクを貼る＜ａ＞タグ
* 箇条書きリストを作る＜ｕｌ＞タグ＋＜ｌｉ＞タグ

### 見出し＜ｈ１＞～＜ｈ６＞タグ
見出しには＜ｈ１＞～＜ｈ６＞タグを使います。＜ｈ１＞、＜ｈ２＞、＜ｈ３＞、＜ｈ４＞、＜ｈ５＞、＜ｈ６＞と６種類のタグがあり、＜ｈ１＞が一番大きな見出しで、Webページのタイトルや記事のタイトルなどによく使われます。＜ｈ＞の後の数字が大きくなるほど小さな見出しになっていきます。
``` html: 見出し
<h1>見出し１</h1>
<h2>見出し２</h2>
<h3>見出し３</h3>
<h4>見出し４</h4>
<h5>見出し５</h5>
<h6>見出し６</h6>
```
見出しタグは大見出しとなる＜ｈ１＞から順に使っていき、次の中見出しには＜ｈ２＞、小見出しには＜ｈ３＞のように、大きな見出しから数字の順だ使っていきます。文字の大きさなど、見た目を理由に当然＜ｈ５＞を使ってはいけません。もしそんなときはCSSで装飾しましょう。
　また、大見出しとなる＜ｈ１＞は基本的には１つのWebページにつき一箇所の使用が良いとされています。そのページのタイトルにだけ使用すると良いです。
　＜ｈ６＞までありますが、実際は多くても＜ｈ４＞で十分でしょう。

### 段落を表示する＜ｐ＞タグ
```html:段落
<p>今日の天気は曇りです。</p>
<p>最高気温は１７℃です。<p>
```
＜ｐ＞タグは文章の段落を表すタグで、文章のまとまりを表示するときはこのタグを使います。＜ｐ＞タグを使うと囲まれた文章が段落になります。ブラウザーの表示でも段落ごと改行され、段落の間には少しスペースができます。改行されない長い文章は読みにくくなるので、＜ｐ＞タグを追加し、段落を分けて表示するとよいでしょう。

### 画像を表示する＜ｉｍｇ＞タグ
画像には＜ｉｍｇ＞タグを使います。通常のタグのように終了タグがないので、文字列を囲まず単独で使うのが特徴的です。
```html:画像
<img src="ファイル名" alt="テキスト">
```
HTMLコード内に＜ｉｍｇ＞と書くだけでは画像は表示されません。「どの画像を表示するか」をsrc属性という場所を設定する属性を使って指示します。画像がHTMLファイルと同じフォルダー内にある場合は表示させたい画像のファイル名を書き、違うフォルダーにある場合はフォルダー名を含めたその画像へのパスを記述します。
　また、指定の際はalt属性も必須です。alt属性とはWebブラウザで画像がうまく読み込めなかった場合に、画像に代わって表示するテキストになります。alt属性を記述するとで、どんな画像が表示されるはずだったか伝えることができます。何の画像なのかわかりやすく記述しましょう。

#### 補足～画像が別のフォルダー内にある時～
呼び出し元のあるファイルと同じ階層にあるフォルダー内のファイルを指定するときは、「/」を使って「フォルダー名/ファイル名」と記述します。
　呼び出し元のファイルも、対象とするファイルも、別のフォルダーにある場合は、「../」を使って一つ上の階層に行くという指定します。上手く画像が表示されないときは、パスの記述を間違えてる可能性が高いので、ファイルの位置関係を確認しましょう。文章にすると難しく見えますが、実際に書いてみるとイメージがつかめて理解が深まります。
### リンクを貼る＜ａ＞タグ
リンクを作るにはリンクさせたい部分を＜ａ　ｈｒｅｆ=""＞と＜／ａ＞タグで挟みます。リンク先はｈｒｅｆ属性で指定します。同じフォルダー内の違うファイルへリンクする場合はファイルパスを指定するだけでリンクを貼ることができますが、別のWebサイトのURLを指定する場合は「ｈｔｔｐ：//」を先頭につけることを忘れないようにしましょう。
```html:リンク
<a href="リンク先URL">リンクするテキスト</a>
```
＜ｉｍｇ＞タグと組み合わせることもできるので、＜ｉｍｇ＞タグを＜ａ＞タグで挟めばリンクができます。
```html:画像リンク
<a href="リンク先URL">
　<img src="ファイル名" alt="テキスト">
</a>
```
### 箇条書きリストを作る＜ｕｌ＞タグ＋＜ｌｉ＞タグ
箇条書きリストを表示するには＜ｕｌ＞タグを使います。リストの表示は＜ｕｌ＞タグだけでは機能せず、＜ｕｌ＞タグ内に＜ｌｉ＞タグを使ってリスト項目を追加していきます。
```html:リスト
<ul>
 <li>項目1</li>
 <li>項目2</li>
 <li>項目3</li>
 <li>項目4</li>
</ul>
```
## 終わりに
今回は頻出するタグについて解説しました。分かりにくい箇所があったかもしれませんが、真史実際に手を動かしてアウトプットすると、理解が深まりますので是非書いてみてください。

エンジニアファーストの会社　[株式会社CRE-CO](https://www.cre-co.jp/) 吉川　真史
ER図について【個人的なお勉強アウトプット】

# 参考記事
https://it-koala.com/entity-relationship-diagram-1897#IE

ER図はデータベース設計で使う設計手法。
エンティティ、アトリビュート、リレーション、カーディナリティと呼ばれるオブジェクトで構成されていて、データ構造を俯瞰的に設計する。

## IE記法とIDEF1X記法
ER図には、IE記法とIDEF1X記法の2種類がポピュラー。

IE記法はIDEF1X記法と比較して直感的に理解しやすい。
IDEF1X記法はリレーションを●で表現することが特徴。IE記法より細かい表現ができる。その分IE記法と比べて直感的なわかりやすさは低くなる。

## 用語
エンティティはデータのまとまりのこと。
ひとつのテーブルのこととか。
エンティティの中にアトリビュートという属性情報がある。
後リビューとの中で主キー、外部キーを表現する。主キーとなる項目はエンティティ上部に四角に囲い明示。外部キーは項目名の後ろに(FK)と書いて明示する。
リレーションはエンティティ同士の関係を表現する線。
リレーションの詳細はカーディナリティをつかって表現する。
カーディナリティをつかうことによって「１対１」「１対多」「多対多」「0以上」や「0または1」を表現することができる。

エンティティが依存している場合は、依存関係にあるエンティティの枠線を角丸にする。

## カーディナリティの書き方
|  記号  |  意味  |
| ---- | ---- |
|  ○  |  0(ゼロ)  |
|　縦線　  |  1(イチ)  |
|  鳥の足  |  多  |

## 書き方
### 1.システムシナリオを確認する
ER図はシステムシナリオが明確になっていることが大前提。ユースケース図やアクティビティ図などをインプットしていく。

### 2.エンティティを洗い出す
ユースケース図などからエンティティを洗い出す。

### 3.エンティティをマスタ系とトランザクション系に分ける。
マスタ系とは基礎となるデータ。
トランザクション系とは業務に伴って発生した出来事の詳細を記録したデータのこと。
本過程でエンティティが合体することもよくある。

### 4.アトリビュートを洗い出す
アトリビュートの洗い出しは画面設計書や類似システムの画面を元に行うと効率的。

### 5.ER図に落とし込む
AWS Lake Formationの権限制御をPythonプログラムから使う方法

# AWS Lake Formationとは？

Lake FormationはAWS上でのデータレイク構築を容易にするサービスです。
複数の機能を持っていますが、特にセキュリティ面でIAMポリシーを補強するセキュリティコントロールを実現できます。

## AWS Lake Formationのセキュリティコントロール

AWSでデータレイクを構築するときの標準的な構成は、実データをS3に配置し、それらのデータのカタログ情報をGlue Data Catalogとして管理する構成になります。
Lake Formationがない場合はS3のバケットポリシーやGlue Data Catalogのポリシーなどの複数のIAMポリシーでセキュリティコントロールを行う必要があり非常に面倒でした。
Lake Formationはデータレイクに含まれるデータベースやテーブルなどの単位でユーザごとにSELECT, INSERTなどの権限制御を行うことができるようになります。従来のRDBで行うような権限制御を行うことができるようになります。

詳しくは[Black Beltの資料](https://d1.awsstatic.com/webinars/jp/pdf/services/20191001_BlackBelt_LakeFormation_A.pdf)をご覧ください。

## AWS Lake Formationのセキュリティコントロールに対応しているサービス

以下のサービスはLake Formationのセキュリティコントロールに対応しています。
- Amazon Athena
- AWS Glue
- Amazon Redshift
- Amazon EMR

例えばLake FormationでAユーザにXテーブルのSELECT権限だけを与えた場合にAmazon Athenaでクエリを実行すると
- `SELECT * FROM Xテーブル` は成功する
- `INSERT INTO Xテーブル ...` は権限がないため失敗する

という挙動になります。

また、Lake Formation側でセキュリティの設定を行えば対応サービス側で何か設定を行う必要はなくLake Formationのセキュリティ設定が各サービスで適用されます。

# AWS Lake Formationに対応していない場合

AWS Lake Formationに対応していない場合、例えば自作のPythonプログラムでデータレイクのテーブルのデータを参照したい場合にLake Formationのセキュリティコントロールを使うことはできないのでしょうか？
Lake Formationが提供している[Querying API](https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-querying.html)を使用するとLake Formationで設定したセキュリティで動作させることができます。

## Querying APIとは？

Querying APIはLake Formationが提供しているGoverned Tablesに対してクエリを行うためのAPIです。
Governed TablesはS3にParquetなどで保存したデータに対して、いわゆるRDBで行えるようなトランザクションの制御を実現するテーブルの形式です。知っている方であれば、Apache Hudi, Apache Iceberg, Delta Lakeと同じような機能を持つものと思っていただけるとイメージしやすいのではないかと思います。

## PythonプログラムをLake Formationのセキュリティコントロールで制御する

実はQuerying APIはGoverned Tables以外の普通のテーブルに対しても実行することができます。普通のテーブルに対してはもちろんトランザクション制御を行うことはできませんが、Lake Formationのセキュリティの制御は適用されます。
以下がQuerying APIを使ったテーブルのデータ参照をするPythonプログラムです。Pythonを実行するIAMユーザにデータ参照を行うテーブルに対してLake FormationでDESCRIBE, SELECT権限を与えると実行が可能になります。一方権限がない場合は `start_query_planning` で `Insufficient Lake Formation Permission`になり権限がないため適切にエラーになることがわかります。

```
import boto3

lf = boto3.client("lakeformation")

# Querying APIを使うときはstart_transactionを実行しTransactionIdを取得する
r = lf.start_transaction(TransactionType="READ_ONLY")
txid = r["TransactionId"]

# データベース名とTransactionIdとPartiQL形式のクエリを指定する
r = lf.start_query_planning(QueryPlanningContext={'DatabaseName': 'db1','TransactionId': txid},QueryString='select * from tbl1')

qid = r['QueryId']

# クエリIDを指定してWork Unitを取得
r = lf.get_work_units(QueryId = qid)

wuid = r['WorkUnitRanges'][0]['WorkUnitIdMin']
token = r['WorkUnitRanges'][0]['WorkUnitToken']

# Work Unitから結果を取得する。結果はApache Arrowのストリームとして返却される
r = lf.get_work_unit_results(QueryId=qid, WorkUnitId=wuid, WorkUnitToken=token)

# Apache Arrowのストリームから結果を取得しprintで表示
import pyarrow as pa
s = pa.ipc.RecordBatchStreamReader(r['ResultStream'])
r = s.read_all()
print(r)
```

取得したデータについてはApache Arrowのストリームで返却されるので、必要に応じてPandasのDataFrameなどに変換して処理を続けることもできます。
Cognito の ID Pools から Credentials を持ってくる(Curlで)

特に認証をしない匿名ユーザ向けの手順です

# TL; DR
- https://qiita.com/k_hoso/items/7f2763421dd37a5e2cd4

# 手順

IdentityPoolId から IdentityId を取得
```
curl -X POST \
    https://cognito-identity.ap-northeast-1.amazonaws.com \
    -H 'Content-Type: application/x-amz-json-1.1' \
    -H 'x-amz-target: AWSCognitoIdentityService.GetId' \
    -d '{ "IdentityPoolId": "ap-northeast-1:12341234-4321-4321-4321-123412341234" }'
```

↑で取得した IdentityId から Credentials(AccessKeyId, SecretKey, SessionToken, Expiration) を取得
```
curl -X POST \
    https://cognito-identity.ap-northeast-1.amazonaws.com \
    -H 'Content-Type: application/x-amz-json-1.1' \
    -H 'x-amz-target: AWSCognitoIdentityService.GetCredentialsForIdentity' \
    -d '{ "IdentityId": "ap-northeast-1:abcdabcd-4567-4567-4567-abcdabcdabcd" }'
```

以上。
Linux上のsingularityコンテナにWindowsのvscodeから接続する

# はじめに
WindowsのVSCodeから「Remote – SSH」の拡張機能を使って、Linux環境にSSH接続し、デバッグはできていた。
しかし、Linux上でSingularityを用いて複数の環境を使い分けした場合に、Linux環境に直接接続するのではコンテナイメージの環境でデバッグできず、不便であった。
そこでLinux上のSingularityコンテナにWindowsのvscodeから接続する方法について調べてみた。

参考元：
https://github.com/microsoft/vscode-remote-release/issues/3066#issuecomment-1019500216


# 環境
Windows
　VSCode 1.65.2(1.64以上)
　　└Remote - SSH v0.76.1

Linux
　ubuntu 18.04
　singurality 3.9.2

# ssh接続のためのconfigファイル
```SSH:config
Host [ホスト名]-[コンテナイメージ名]
  HostName [ホスト名]
  User [ユーザ名]
  RemoteCommand singularity shell [singularityイメージファイル]
  RequestTTY yes
```
> - `Host`に`[ホスト名]-[コンテナイメージ名]`と設定しているのは明示的にするため。任意でよい。
> - configファイルは`C:\Users\[Windowsユーザ名]\.ssh\`にあるのが一般的。
> - VSCodeで`RemoteCommand`を使えるようになったのが1.64からみたい。

# settings.jsonファイル
```json:settings.json
{
"-------------------[中略]-------------------"
    "remote.SSH.serverInstallPath": {
        "[ホスト名]-[コンテナイメージ名]": "~/.vscode-container/[ホスト名]-[コンテナイメージ名]"
    },
    "remote.SSH.enableRemoteCommand": true,
    "remote.SSH.useLocalServer": true,
"-------------------[中略]-------------------"
}
```
> - 接続先に拡張機能をインストールする際、`remote.SSH.serverInstallPath`を設定しておくことで、その接続先にだけインストールすることができるようになるみたい？（他環境を汚さないためなのかな）

# VSCodeからSSH接続
- 左下の $ _>^< $ をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552414/b18b232a-1430-b3d3-d045-e6435ca217cc.png)

- `Connect to Host...`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552414/8771e304-308d-0701-564a-ab4ba0f514dd.png)

- `[ホスト名]-[コンテナイメージ名]`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552414/f873cffd-3762-e271-f8ef-74c3e805652c.png)

- 任意でパスワードを入力

- ubuntu内に用意したコンテナ内に接続できた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552414/b95531c9-a89d-5166-cc18-18f1cd94afea.png)

# VSCodeでデバッグできた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552414/b3c845ce-88fa-9bb7-f239-490d15bbbbd4.png)
AWSの第一歩！写真で分かる🤓IAMユーザーの作り方

## IAMとは
IAMは、AWSリソースに対するアクセス制限や認可をアカウントに与えることで、安全に管理できるサービスです。
公式からは以下のように書かれています。↓
>AWS Identity and Access Management (IAM) は、AWS リソースへのアクセスを安全に管理するためのウェブサービスです。IAM により、誰を認証 (サインイン) し、誰にリソースの使用を承認する (アクセス権限を持たせる) かを制御します。

## なぜIAMを使うのか
初めにアカウントを作った際にできるルートユーザーは権限が強すぎる
　　　　　　　　　　　　　　　　　↓
必要最小限の権限を付与したアカウントを作って、利用しよう！
みたいな流れです。
## いつ作るのか
基本アカウントを作った後はすぐに作るといいと思います。
## 具体的な設定方法

ルートユーザーでログインし、検索画面からIAMを選択する
![スクリーンショット 2022-04-01 22.29.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/5151f6d7-bcd8-4b89-522c-f52e2cf56d0a.png)
そして左のアクセス管理の中からユーザーを選択します。
![スクリーンショット 2022-04-01 22.30.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/8fabc785-cc9c-1f7d-a080-1da12a5aa01f.png)
そしてユーザーからユーザーを追加を押します。
![スクリーンショット 2022-04-01 22.36.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/9c39019c-0b6e-9c05-32b3-8fdbfb94243d.png)
そして任意のユーザー名を記入して、「パスワード・AWS マネジメントコンソールへのアクセス」を選択します。
そして自動生成パスワードを選択します。
![スクリーンショット 2022-04-01 22.37.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/8240b393-cc29-366c-212d-03da0d31f244.png)
次にIAMアカウントに権限を付与します。そこで「AdministratorAccess」を選択します。

>AWS 管理ポリシー名: AdministratorAccess
ユースケース: このユーザーはフルアクセスが許可され、AWS のあらゆるサービスおよびリソースにアクセス許可を委任できます。

![スクリーンショット 2022-04-01 22.38.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/5688f625-1ea2-411e-b430-b78dbdfa5cbc.png)
タグの追加は今回はスルーで大丈夫です。
![スクリーンショット 2022-04-01 22.38.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/f2ab0dcf-49ed-be4e-b88f-c09ebeedde47.png)
そしてユーザーの作成を押し、アカウントを完成です。
![スクリーンショット 2022-04-01 22.39.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/ca8e9516-314d-6f66-b1fe-4540dd226d7d.png)
パスワードは、後々のログインに使うので何かにメモしておいて下さい。

## 参考文献

この記事は以下の情報を参考にして執筆しました。

- [AWS公式IAMの記事](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction.html)
- [Cloud Techのカリキュラム](https://kws-cloud-tech.com/)
- [AWS IAMについて](https://qiita.com/pankata79/items/e61a0dcb65f2d1dafb3e)
パソコンがフリーズする（画面が暗くなる）NVIDIA GPU

# 結論
#### **電源が貧弱過ぎました。**
環境が以下の通りでした
| 機器名 | 名称 |
|:-:|:-:|
| CPU  | intel core i7 7800  |
|  GPU | rtx2070  |
|  電源box| 玄人志向500w シルバー  |

新しく組む際に800w電源を使用するとそのエラーは一切出ませんでしたし、
どうやらエラー内容からも「実行ができなかった」というエラーが多々見られたため電源不足であるとわかりました。
電源全体から8割程度の消費電力を見積もらないとブーストクロック等の機能で電源不足になります。

# 具体的なエラー
記事自体を書くのがだいぶ遅くなってしまったため資料が消えてしまったのですが、nvidiaドライバー関係のエラーとサービスの再スケジュールがフリーズのタイミングで起きていたら電源不足の可能性があるかもしれません。

# 最後に
私自身が情報を収集する際、参考にできる資料が全くなかったため（初歩的なミスであったため）
少しでも参考になれば幸いです。

この記事を見てくださった方で、スクリーンショット等を持っていたら教えてもらいたいです。
Vuex、Vue.js、PDF.jsを使った時にハマったこと

これも備忘録。

PDFの表示にPDF.jsを使用していた。
vuexを使ってPDFを表示する際に、ブラウザバックで戻った場合に、PDFが空白になる現象があった。

そこで、サイドレンダリングさせるために、v-ifを使ってvuexで持っていたPDFのURLを再レンダリングさせて表示するようにした。

iframeを使って表示していたため、キャッシュが残っていたのが問題だったようです。
【MySQL】データベース・テーブルの作成方法

本稿ではMySQLでデータベースとテーブルを作成する方法を紹介します。

## 【参考】公式ドキュメント
[MySQL 8.0 リファレンスマニュアル(データベースの作成と使用)](https://dev.mysql.com/doc/refman/8.0/ja/database-use.html)

## データベース・テーブルの作成

今回使用する主なコマンドの書式は以下の通りです。
> データベース作成
> CREATE DATABASE db_name;

> データベース選択
> USE db_name;

> テーブル作成
> CREATE TABLE tbl_name (col_name data_type);

実際にデータベースとテーブルを作成します。

### データベースの作成と選択
現在のデータベース一覧を確認します。
```
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
```
データベースを作成します。
```
mysql> CREATE DATABASE testdb;
Query OK, 1 row affected (0.01 sec)
```
データベースが作成されたことを確認します。
```
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)
```

データベースを作成しても、そのデータベースは選択されません。
以下のコマンドで使用するデータベースを選択します。
```
mysql> USE testdb;
Database changed
```

### テーブルの作成
現在のテーブル一覧を確認します。
```
mysql> SHOW TABLES;
Empty set (0.00 sec)
```
テーブルを作成します。
```
mysql> CREATE TABLE pet (name VARCHAR(20));
Query OK, 0 rows affected (0.02 sec)
```
テーブルが作成されたことを確認します。
```
mysql> SHOW TABLES;
+------------------+
| Tables_in_testdb |
+------------------+
| pet              |
+------------------+
1 row in set (0.00 sec)
```
作成したテーブルの内容を確認します。
```
mysql> DESCRIBE pet;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql>
```

MySQLでデータベースとテーブルを作成する方法を紹介しました。
VSCodeとDockerでリモート開発する

# 前提
Dockerの環境構築が済んでいる
# 手順
## 1.  VSCodeの拡張機能「Remote Development」をインストール
3つ拡張機能がインストールされますが、今回使うものは「Remote - Containers」です。
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack

## 2.  VSCodeの拡張機能をインストール
### 1. 左下のアイコンをクリック
![4c323700-8273-4400-6f63-cb985420fd0f.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230386/648137ba-be2f-e61e-cfed-ce80852c0a37.jpeg)

### 2. Add Development Container Configuration Filesを選択
![e833e988-5523-eaa0-f6e4-46738485b4c7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230386/a2edc7a4-50ac-3e7e-b87a-24e194846758.jpeg)

### 3. From 'docker-compose.yml'を選択
![3f150ca4-7e49-91d0-8dce-0747913374a3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230386/6341f6e1-dba4-783f-55d9-ad28baa4b14f.jpeg)

### 4. コンテナを選択
![f21c45e3-0902-9e97-ec1d-d4e7c65cd21d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230386/f010e805-8b69-8a2c-c50a-ec348cfe125c.jpeg)

※接続したいコンテナを指定する。
### 5. devcontainer.jsonの修正
以下は一例です。
``` \.devcontainer\devcontainer.json

"dockerComposeFile": [
		"../docker-compose.yml",
		"docker-compose.yml"
	],

	"workspaceFolder": "/workspace",
```

を

``` \.devcontainer\devcontainer.json
"dockerComposeFile": [
		"../docker-compose.yml"
	],

	"workspaceFolder": "/var",
```
に変更

※dockerComposeFileはプロジェクトで使用しているdocker-compose.ymlのパスです。
※workspaceFolderはコンテナのディレクトリ構成を見て、ワークスペースのルートにしたいパスを設定します。

### 6. コンテナに接続
左下のアイコンをクリックしてから
Reopen in Containerでコンテナを開くことができ、直接編集できるようになります。
![0bb7f04e-3f26-12ed-571a-668f39d54a5d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230386/a77453b3-9eb8-2c22-f851-cd1e940b9538.jpeg)



# 参考
https://zenn.dev/iidadaiti/articles/a0b5c540cb10d2/

https://zenn.dev/hkdord/articles/remote-containers

https://code.visualstudio.com/docs/remote/containers
reCAPTCHAの整理(v2)

# 仕組み
## reCAPTCHAにサイトを登録する
まず以下のページでreCAPTCHAに設置するサイトを登録する。
登録すると Site KeyとSecret Keyが発行される。
https://www.google.com/recaptcha/admin/create
![ff841db0-e9bd-33b2-ebd4-0f0d245efef1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230386/0648ac32-cc66-7afb-32cd-c24561ebe870.png)



クライアント側
https://developers.google.com/recaptcha/docs/display

サーバーサイド側
https://developers.google.com/recaptcha/docs/verify

## 大まかな流れ
reCAPTCHAを通るとトークンが発行され、
それをフォームデータと共にサーバー側に送り、
Secret KeyとトークンをGoogleサーバーに送り認証してもらう。返ってきた結果（true/false）で処理する

・参考イメージ1

![e28b6453-2d6f-40a6-f6ab-a92cb4ca97c2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230386/a3357f5f-778b-438b-6c0b-fdb690630fd4.png)

---
・参考イメージ2（InvisibleタイプのreCAPTCHA）

![bcd45562-3818-9867-33bc-37d7f60bb2d6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230386/f43fa9fc-034c-6d64-ac63-e42a16c535e0.png)


[参考]

https://www.synergy-marketing.co.jp/blog/using_recaptcha_on_form#Invisible_reCAPTCHA-3

https://persol-tech-s.co.jp/i-engineer/technology/securitycaptcha
# 実装例
## php

https://blog.senseshare.jp/recaptcha.html

https://www.softel.co.jp/blogs/tech/archives/6016

https://migi.me/javascript/google-recaptcha-ajax/

https://syncer.jp/how-to-introduction-recaptcha

## perl
https://www.lemoda.net/perl/cgi-captcha/index.html

https://www.koikikukan.com/archives/2017/10/12-000300.php

https://developers.google.com/recaptcha/old/docs/perl



# 注意点
## サーバー側の実装をせずにクライアント側だけ実装した時の問題点
クライアント側でデータを操作されて、reCAPTCHAを通さずに、Submitできてしまう。
（ユーザーがreCAPTCHAによるキャプチャ認証を通して発行したトークンかどうかを確認できない）
[参考]

https://syncer.jp/how-to-introduction-recaptcha#sec-5


## サーバー側の実装をクライアント側にした時の問題点
データを容易に操作出来たり、Secret Keyがむき出しなるなど現実的ではない
Google公式のドキュメントでもクライアント側とサーバー側の実装を分けているのはこういった理由があるからだろうと思う。
[参考]

https://qiita.com/_yussy_/items/2d217c0baa598dd55b44
環境別Xdebugの設定メモ

3つの環境別の設定について書いていきます。

# 手順
※便宜上ローカル環境を「ローカル」、コンテナ内を「リモート」と表現しています。
## ①. MAMP(XAMPP)：ローカルでデバッグ
MAMP(XAMPP)に基本Xdebugも付属しています。していない場合は別途インストールする必要があります。
ローカルのVSCode(PHPStorm)とローカルのXdebugでデバッグを行う方法です。

### 1. MAMP(XAMPP)のXdebug設定
php.iniに以下のコードを追加

```php.ini
[XDebug]
zend_extension = C:\pleiades\xampp7.4.23_mb\php\ext\php_xdebug.dll 
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_port = 9003
```
※zend_extension の設定値は一例です。環境によって変わります。


### 2. VSCode(PHPStorm)の設定
VSCodeは拡張機能「PHP Debug」をインストールし、launch.jsonを作成するとデバッグを始められます。
PHPStormはCLIインタープリターの設定がされていることを確認できたら、デバッグを始められます。

## ②. VSCode(PHPStorm)+Docker：Xdebugのリモートデバッグ機能でデバッグ
②ではVSCode(PHPStorm)の本体がローカルにある環境です。
ローカルのVSCode(PHPStorm)とリモートのXdebugでデバッグを行う方法です。

### 1. リモートデバッグ環境を整える

コンテナ内にxdebugをインストールしておく

```Dockerfile:Dockerfile
RUN pecl install xdebug \
    && docker-php-ext-enable xdebug
```
※phpのバージョンが5.6など低いの場合、対応しているバージョンのxebugをインストールする


### 2. php.iniの設定
```php.ini
[XDebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host=host.docker.internal
xdebug.remote_port=9003
xdebug.remote_log=/tmp/xdebug.log
xdebug.idekey=phpstorm
```
※xdebug.idekey項目はvscodeには不要

### 3. VSCodeの設定
リモートのVSCodeに拡張機能「PHP Debug」をインストールし、launch.jsonを作成して、以下のようにpathMappings項目を追加することでデバッグを始められます。

```launch.json
"configurations": [
    {
      "name": "Listen for Xdebug",
      "type": "php",
      "request": "launch",
      "port": 9003,
      "pathMappings": {
        "/var/www": "${workspaceRoot}/dist/www"
      }
    },
```
※pathMappingsの設定値は環境によって異なる。左がリモートで右がローカル

### 3'. Phpstormの設定

参考
※pathMappingsを忘れないこと

https://qiita.com/haruna-nagayoshi/items/99fa041e884c2c3975d2#phpstorm%E3%81%AE%E8%A8%AD%E5%AE%9A


## ③. VSCode+Docker：VSCodeのリモート開発機能を使ってデバッグ
③ではVSCodeの本体(VSCodeサーバー)がコンテナ内にあり、ローカルはあくまでVSCodeクライアントを実行しているだけです。
リモートのVSCodeとリモートのXdebugでデバッグを行う方法です。

### 1. リモート開発環境を整える
まず以下を参考にリモート開発環境を整える
https://root-sea.qiita.com/shoki-kamada/items/feccefffb39abd81b797

※以下のコードをDockerfileに追加してリモートにXdebugをインストールすること

```Dockerfile:Dockerfile
RUN pecl install xdebug \
    && docker-php-ext-enable xdebug
```
※phpのバージョンが5.6など低いの場合、対応しているバージョンのxebugをインストールする


### 2. php.iniの設定
リモートのphp.iniに以下のコードを追加

```php.ini
[XDebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host=host.docker.internal
xdebug.remote_port=9003
xdebug.remote_log=/tmp/xdebug.log
```

### 3. VSCodeの設定
リモートのVSCodeに拡張機能「PHP Debug」をインストールし、launch.jsonを作成するとデバッグを始められます。



# 注意点
デフォルトのポート番号について
vscodeは9003
phpstormは9000,9003
xdebugは9000
が設定されるのでどちらかに合わせること
DHCPでIPがズレてしまった会社の自分用作業PCのIPを探した話

# 動機
テレワークは良いのですが、会社の自分のPCのIPがわからなくなりました。
こまったこまった。

というわけで、IP を探そうっていう単純な動機。

最初は ExPing で ping の通る IP を探してひとつひとつリモートデスクトップで接続・・・とかやったのですが、3 つめでやってらんねーってなりました。

で、ポートスキャンの大御所 nmap なのですが、WSL (WSL2 にあらず) の bash で実施してもうまくいかないのですね。
WSL2 にするのも、msys やら cygwin やらを自宅のPCに入れるのも大げさ・・・。

なので powershell の出番かなと。


# 結果
環境は Windows10 に最初からインストールされている PowerShell 。
VPN につながっている状態で PowerShell のコマンドラインから

```powershell
$ProgressPreference="SilentlyContinue"
```
して、次に
```powershell
for ($i=128; $i -le 256; $i+=1) { Test-NetConnection 192.168.128.$i -Port 3389 -InformationLevel Quiet }
```
。

Test-NetConnection は最初に ping でつながるかどうかをテストするので、ping の通らない IP が入ると、とても遅いです。

あととてもいいかげんなので、以下の通りポートが開いてない IP はわかるのですがそうでない IP は表示されません。そこは人間の目で判断しました。

```
警告: TCP connect to (192.168.128.128 : 3389) failed
False
警告: TCP connect to (192.168.128.129 : 3389) failed
False
警告: TCP connect to (192.168.128.130 : 3389) failed
False
警告: TCP connect to (192.168.128.131 : 3389) failed
False
警告: TCP connect to (192.168.128.132 : 3389) failed
False
警告: TCP connect to (192.168.128.133 : 3389) failed
False
True
警告: TCP connect to (192.168.128.135 : 3389) failed
False
```

これで 少なくともリモートデスクトップが動いている IP はわかったぞ・・・
あとは一台ずつ・・・うがー

## 感想

うちの会社セキュリティガバガバなんで、そんな環境だからできることかもしれません。
まぁ、特定ポートの開いてる端末を探す需要は他にもあるでしょというわけで。
Deltaのカラムマッピング

[Delta column mapping \| Databricks on AWS](https://docs.databricks.com/delta/delta-column-mapping.html) [2021/12/22時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

Delta Lakeでは、Deltaテーブルのカラムと対応する対応するParquetのカラムで違う名前を使用することができるカラムマッピングをサポートしています。カラムマッピングを用いることで、背後のParquetファイルを書き換えることなしに、Deltaテーブルに対する`RENAME COLUMN`のようなDeltaスキーマ進化オペレーションが可能となります。スペースのようにParquetで許可されていない文字列を用いてDeltaテーブルのカラムに名前をつけることができ、ユーザーは上述した文字列の制約のためにカラムの名前を変更することなしに、Deltaに直接CSVやJSONデータを取り込むことが可能となります。

# 要件

- Databricksランタイム10.2以降
- カラムマッピングにおいては、readerバージョン2、writerバージョン5のDelta[テーブルバージョン](https://qiita.com/taka_yayoi/items/0a109082037246163218)が必要となります。必要とされるテーブルバージョンのDeltaテーブルに対しては、`delta.columnMappingMode`を`name`に設定することで、カラムマッピングを有効化することができます。以下の`ALTER TABLE`コマンドを実行することで、テーブルバージョンをアップグレードし、カラムマッピングを有効にすることができます。

```sql:SQL
ALTER TABLE <table_name> SET TBLPROPERTIES (
  'delta.minReaderVersion' = '2',
  'delta.minWriterVersion' = '5',
  'delta.columnMapping.mode' = 'name'
)
```

:::note info
**注意**
テーブルにこれらのプロパティを設定すると、このDeltaテーブルはDatabricksランタイム10.2以降でしか読み書きできなくなります。
:::

# カラム名でサポートされている文字列

Deltaテーブルでカラムマッピングが有効化されると、テーブルのカラム名に`,;{}()\n\t=`を含めることができるようになります。

# カラム名の変更

Deltaテーブルでカラムマッピングが有効化されている際はカラム名を変更することができます。

```sql:SQL
ALTER TABLE <table_name> RENAME COLUMN old_col_name TO new_col_name
```

詳細は[カラム名の変更](https://qiita.com/taka_yayoi/items/47b58eb8696b278a3a82#%E3%82%AB%E3%83%A9%E3%83%A0%E5%90%8D%E3%81%AE%E5%A4%89%E6%9B%B4)をご覧ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
RustでGroupBy(ToDictionary)をしたい

## やりたいこと
Rustで配列内のデータをキー毎に集約する操作(group by)をしたい

```rust
#[derive(Clone, Debug)]
struct Hoge {
    a: String,
    b: i32,
}

let data = vec![
        Hoge {
            a: "a".to_string(),
            b: 1,
        },
        Hoge {
            a: "a".to_string(),
            b: 1,
        },
        Hoge {
            a: "b".to_string(),
            b: 0,
        },
        Hoge {
            a: "c".to_string(),
            b: 2,
        },
        Hoge {
            a: "a".to_string(),
            b: 2,
        },
    ];

```
といった時、dataをHoge.bで集約したいとする

## 最初に結論
foldでやるか、[itertools.into_group_map_by](https://docs.rs/itertools/latest/itertools/trait.Itertools.html#method.into_group_map_by) がいいんじゃないかなと思う。

## 標準的アプロ―チ
foldを使う

```rust
// 型はBTreeMap<i32, Vec<Hoge>になる
let groups = data.iter().fold(
        BTreeMap::new(),
        |mut acc: BTreeMap<i32, Vec<Hoge>>, value| {
            acc.entry(value.b)
                .or_insert_with(Vec::new)
                .push(value.to_owned());
            acc
        },
    );
```

悪くはないのだが、個人的には直感的でないと感じてしまった。  

## grouping_by クレートを使う

[こちらのクレート](https://crates.io/crates/grouping_by) を使うと以下のように書ける

```rust
// 型はHashMap<i32, Vec<Hoge>になる
let groups = data.into_iter().grouping_by(|x| x.b.clone());
```

ただこのクレートはあまりメジャーでない

## [itertools](https://docs.rs/itertools/latest/itertools/)を使う
[itertools](https://docs.rs/itertools/latest/itertools/) には、`group_by`というメソッドがある。こちらはC#やSQLのGroupByとはちょっと違う動きをする。

ただ、バージョン10.0.0から `into_group_map_by` というメソッドが追加されており、これだとC#やSQLのGroupByと同じ動きをするようだ。

```rust
// 型はHashMap<i32, Vec<Hoge>になる
let groups = data.into_iter().into_group_map_by(|x| x.b.clone());
```

このクレートなら他の便利なメソッドも使えるようになるし、これがよさそう。

## まとめ
foldのやり方がピンとこなかったので、いろいろ調べました。itertoolsの`group_by`は罠ですね。
NCL (NCAR Command Language) をUbuntu20.04で使う - miniconda利用


## 背景
#### Ubuntu標準リポジトリ所載のncl-ncarg (v6.6.2b4)が動かない

:::note info
aptコマンドでインストール可能
:::
:::note alert
WRFのplotgrids_new.ncl (計算領域を表示)で背景色が出ない
(libcairoのバージョンが合わないらしい)
:::

⇒ [NCAR](https://www.ncl.ucar.edu/Download/ "Installing NCL")推奨のconda環境を用いたインストールを試みました。
　pythonは使わないので、容量の小さいminicondaを導入しています。


https://www.ncl.ucar.edu/Download/conda.shtml

## 環境
- Ubuntu 20.04.4 LTS
- miniconda 4.12.0 (今回インストール)
- ncl 6.6.2 (今回インストール)
- WRF 4.3.2 ([インストール済](https://qiita.com/hal360/items/910fd7b2760a3f57ec46))

## インストール
### miniconda
1. 最新版インストーラーを[ここ](https://docs.conda.io/en/latest/miniconda.html)からダウンロード
Linuxなら[Miniconda3 Linux 64bit](https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh)
2. インストーラー実行 (インストール先: $HOME/miniconda3)
   ~~~
   $ bash Miniconda-3-latest-Linux-x86_64.sh
   ~~~
   下記コマンドでバージョン番号が出れば成功
   ~~~
   (base) $ conda -V
   ~~~

3. .bashrcの設定変更
インストール時に追加される下記部分を別スクリプトに移す(新たにsetconda.shを作成)。
   ~~~.bashrc
   # >>> conda initialize >>>
   # !! Contents within this block are managed by 'conda init' !!
      ...
   unset __conda setup
   # <<< conda initialze <<<
   ~~~
intel compiler との干渉を避けるため
- minicondaを使うターミナルではsetconda.shを実行
- intel compilerを使うターミナルではsetintel.shを実行
（どちらもログイン後一度で良い）

:::note warn
intel compilerが使える環境ではintel pythonとの干渉に注意
:::

### nclインストール
上述setconda.shなどにより、condaが使用可能な状態で
1. ncl_stableという環境を作り、その中にインストール
    ~~~
    $ conda create -n ncl_stable -c conda-forge ncl
    ~~~

### ncl実行
毎回ncl実行環境(ncl_stable)に入る必要がある
※condaが使用可能な状態であることが前提(setconda.sh)

1. ncl実行環境(ncl_stable)に入る(activate)
    ~~~
    $ conda activate ncl_stable
    (ncl_stable) $    # ncl_stable環境に移行
    ~~~
2. ncl実行 ($以降のみ入力)
    ~~~
    # 1. バージョン表示
    (ncl_stable) $ ncl -V
    # 2. X-window表示 (Enterで改ページ) ($NCARG_ROOTは設定不要)
    (ncl_stable) $ ncl $NCARG_ROOT/lib/ncarg/nclex/gsun/gsun02n.ncl
    # 3. pngファイルを作成
   (ncl_stable) ncl $NCARG_ROOT/lib/ncarg/nclex/nug/NUG_multi_timeseries.ncl
    ~~~
3. 実行環境から抜ける方法
   ※実行後、(base)と表示される時は再度実行
    ~~~
    (ncl_stable) $ conda deactivate
    ~~~
4. 他のcondaコマンド
    ~~~
    $ conda info -e  #仮想環境一覧 (-a)
    $ conda activate (deactivate) [環境名]
    $ conda update --all (または conda upgrade)
    $ conda -V
    $ conda search
    $ conda list (-n ncl_stable)
    ~~~
## 海岸線（高解像度版、必須ではない）
https://www.ncl.ucar.edu/Document/Graphics/rangs.shtml
- [ここ](https://www.io-warnemuende.de/rangs-en.html)からファイルをダウンロード
range(0).zip ... range(4).zip
gshhs(0).zip ... gshhs(4).zip
https://www.io-warnemuende.de/tl_files/staff/rfeistel/download/rangs(0).zip
- ファイルを下記に展開する
~~~
 $NCARG_ROOT/lib/ncarg/database/rangs
($NCARG_ROOT=$HOME/miniconda3/envs/ncl_stable)
~~~

## まとめ
1. Ubuntuでのnclのインストールは
`minicondaのncl_stable環境を作成し、その中にインストール` 
がおすすめ。海岸線データ以外、追加設定は不要です。

2. nclを使うときは、condaが使用可能な状態で(setconda.sh)
 (利用開始) `conda activate ncl_stable`
 (利用終了) `conda deactivate` 

3. 時々、メンテナンスが必要かもしれません。
`conda update --all`
4. 下記記載の方法に従いましたが、intelコンパイラとの共存のための工夫をしています。

https://www.ncl.ucar.edu/Download/conda.shtml
LaravelでCSVダウンロードしたらYou have to supply your credentials to access this resource.と言われた。

LaravelでSCSVファイルをダウンロードしようとしたら、ファイル内でエラーが出力されていた。

## CSVダウンロードコード

```web.php
Route::group(['middleware' => 'auth.very_basic'], function() {
Route::get('sample/csv_download', function () {
    $cvsList = [
        ['タイトル', '本文', '名前']
        , ['テストタイトル１', 'テスト本文１', 'テスト１']
        , ['テストタイトル２', 'テスト本文２', 'テスト２']
    ];
    $response = new StreamedResponse (function() use ($cvsList){
        $stream = fopen('php://output', 'w');

        //　文字化け回避
        stream_filter_prepend($stream,'convert.iconv.utf-8/cp932//TRANSLIT');

        // CSVデータ
        foreach($cvsList as $key => $value) {
            fputcsv($stream, $value);
        }
        fclose($stream);
    });
    $response->headers->set('Content-Type', 'text/csv');
    $response->headers->set('Content-Disposition', 'attachment; filename="sample.csv"');

    return $response;
});

});

```


## 原因

原因は**Basic認証**です。
Basic認証をした状態でfopen関数を使うと認証に引っかかるみたいです。


## 解決策

①fopenを使わない
②自分の場合は一旦このルートだけbasicの外に出しました。


以上
VueCLI(Vue.js)の環境構築

本操作は、Windows10のWSL環境で実行しています。
## VueCLIのインストール

####  VueCLIのインストールにはnpmが必要です。

- Node.jsをインストール
 https://nodejs.org/ja/

インストールされたかはバージョン確認をする
```
$ node -v
v16.14.0
```

- npmをインストール
```
sudo npm install -g npm
````
インストールされたかはバージョン確認をする
```
$ npm -v
v8.3.1
```




#### npmインストール後、vue/cliをインストールします


``` 
sudo npm install -g @vue/cli
```

実行後、@vue/cliのバージョンが出たら成功です。

```
$ vue --verion
@vue/cli 5.0.4
```

## Vueプロジェクトの作成

プロジェクトを作成したいディレクトリまで移動して、
次のコマンドを実行します。
`vue-project` 箇所は各自プロジェクト名を設定してくださいね。

```
$ vue create vue-project
```

vueのバージョンを選択する画面では、基本Vue3で良いと思います。
記事執筆時点で、Vuetifyを使用する際、Vue3は使用できないのでVue2を選択します。
```
Vue CLI v5.0.4
? Please pick a preset:
❯ Default ([Vue 3] babel, eslint)
  Default ([Vue 2] babel, eslint)
  Manually select features
```

プロジェクト作成まで少し時間がかかります。
下記表示が出たら成功です。

```
🎉  Successfully created project vue-project.
```

lsコマンドで、フォルダが作成されているか
確認します。

```
tutumi@LAPTOP-HCBM44GJ:/mnt/c/work$ ls
JavaScript  laravel  vue-project
Dockerfile  myapp    php   rails

```
`vue-project`が出来ていますね！

その後は、出来たフォルダに移動して、プロジェクトを起動します。

```
$ cd vue-project
$ npm run serve

> vue-project@0.1.0 serve
> vue-cli-service serve

 INFO  Starting development server...

 DONE  Compiled successfully in 33031ms  1:27:55 PM

  App running at:
  - Local:   http://localhost:8080/
  - Network: http://x.x.x.x:8080/

  Note that the development build is not optimized.
  To create a production build, run npm run build.
```
表示されている通り、8080ポートのURLにアクセスしてみます。


`http://localhost:8080/`

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381365/ca8d0671-6e2e-1712-925f-0c4d5a18a9a3.png)

上記の画面がでたら、無事にプロジェクト起動が成功しています。
Laravel ミドルウェアの仕組み

## ミドルウェアとは
`HTTPリクエスト、又はレスポンスをチェックする機能`。
middlewareは自分で関数を定義して作成することができる。

主に使う用途としては、
・指定した変数が条件を満たしているか？
・認証されてるユーザーか？など

## ミドルウェアの流れ

・ミドルウェアがない場合

```
 HTTPリクエス → Route → Controller → View → Response
```

・ミドルウェアを入れた場合
`Before Middleware`：リクエストをチェックする機能
`After Middleware`：レスポンスをチェックする機能

```
 HTTPリクエス → Route → Before Middleware → Controller → View → After Middleware　→ Response
```

## 参考記事

https://prograshi.com/framework/laravel/midleware/
備忘録：MySQLで'/tmp/mysql.sock' (38) mysql community serverとエラーがでたときにやること

半年に1回ぐらいMySQL系のエラーと戦っていて、今日も午前中それで潰したので、個人メモ用に記事にする。

## MySQLをインストールし直す
①システム環境設定→MySQL→uninstallボタンを押す
②https://dev.mysql.com/downloads/mysql/ からMacの環境にあったMySQLをインストールしてユーザーとpasswordを設定する。
③`brew uninstall mysql`をしてから`brew install mysql`をする
※もし`mysql@○.○`が`brew list`で存在していたらアンインストールする

③zshを開き、`export PATH=$PATH:/usr/local/mysql/bin`を打ち込んでmysqlのパスを通す。

## MySQLのプロセスを削除

僕の場合、brewの`mysql@○.○`と`MySQL Community Server`とbrewの`mysql`がごっちゃになり、競合をおこしていたのでmysqlのプロセスを削除することで解決した。

`ps ax | grep mysql` でプロセス確認
`sudo kill -TERM プロセスID`で不要なプロセスをKill
`mysql -u ユーザー名 -p`でアクセスできる

**■特記事項**
①MySQL Community Serverとbrewのmysql以外のmysqlは全て削除
②mysql.sockは手動では絶対作らない、インストールした時点で勝手に作られている模様。手動で作ったら全て消すこと
勝手に作られるsockは以下の通り。
```zsh:/tmp
mysql.sock
mysql.sock.lock
mysqlx.sock
mysqlx.sock.lock
```
③`ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).`のようなエラーはプロセスを切れば解決されるのでtouchコマンドを使ってpidファイルを作ると事態がもっと悪化する可能性あり。