OmniAICreator/Qiita-1.07M huggingface dataset:
TOAST UI Editor のファイルアップロード機能 

# 目次
[1.基本的な流れ](#1-基本的な流れ)
[2.まずはエディターに機能を追加する](#2-まずはエディターに機能を追加する)
[3.実際にアップしてurlを返す処理](#3-実際にアップしてurlを返す処理)

**TOAST UI Editor** というマークダウンエディターでファイルアップロードする方法に苦戦したので、誰かのためになればと思いアウトプット記事を書いてみます。
Laravel + Vue.js を使った開発です！

# 1. 基本的な流れ

今回実装させた TOAST UI Editor でのファイルアップロードは、
**選択した画像をサーバーにアップロードして、返ってきた URL を textarea に表示させるというものです。**
最初の状態だと、下記のように画像の情報がそのまま表示されてしまうため、
アップロードして返ってきたURLを表示できるようにしたいところ。

![スクリーンショット 2022-04-03 16.51.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2267102/570c0b22-1be4-133a-7821-b42361b88798.png)

# 2. まずはエディターに機能を追加する


TOAST UI Editor は既に出来上がってるマークダウンエディターなので、
そこに URL を返す機能を追加しなければいけません。

まずは、
`:options="options"`を追加します。

```php5:CreateComponent.vue
<div class="form-group">
    <p>本文</p>
    <editor ref="toastUiEditor" :options="options" />
</div>
```

そして、
```javascript:CreateComponent.vue

<script>

export default {

...省略

    data() {
        return {
            options: {
                hooks: {
                    addImageBlobHook(blob, callback) {
                        const uploadFile = new FormData(); 
                        uploadFile.append("imageData", blob); 
                        axios
                            .post("/images/store", uploadFile) //コントローラにファイルを送る
                            .then((res) => {
                                callback(
                                    "/storage/image/" + res.data.thumbnail, //返ってきたURLを textarea に返す
                                    "image"
                                );
                            })
                            .catch((err) => {
                                alert(err);
                            });
                    },
                },
            },
        };
    },
```


こうすることで、画像を選択してアップしたら URL が返ってきてそのまま textarea に表示されます！


# 3. 実際にアップしてurlを返す処理


実際に画像をアップして URL を返す処理は、コントローラで行われています。

**`.post("/images/store", uploadFile)`**
この送信先のコントローラは、こんな感じです。
画像アップ & URL を返しています。

```php:ImageController.php
public function store(Request $request)
{
    if ($request->imageData->isValid()) {
        $filename = $request->imageData->store('public/image'); //ファイル保存
        return ['thumbnail' => basename($filename)]; //保存したファイルのURLを返す
    }
}
```

これでファイルアップロード機能は完成です！

**実際にアップしてみた結果がこちら！**
スタイリッシュになった〜！

![スクリーンショット 2022-04-03 18.21.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2267102/a54d1c06-6dfc-736c-c5a7-90cbc0e4994b.png)


[参考にしたサイト](https://github.com/nhn/toast-ui.react-editor/issues/7)
Vue.jsで「AndroidかつWebViewで閲覧されている」場合の表示の出し分け

# やりたいこと
* AndroidかつWebViewで閲覧されている時、特別な表示を出したい
    * この条件だとFacebookログインができないので、ログインボタンを押せないようにしたり注意書きを出したりしたい
    * 参考 : [Android埋め込みブラウザーにおけるFBログイン認証のサポート終了](https://developers.facebook.com/blog/post/2021/06/28/deprecating-support-fb-login-authentication-android-embedded-browsers/?locale=ja_JP)
* 開発はVue.jsを利用
* 実機で動作検証もしておきたい

# 実装方法
## UserAgentの判定
UserAgentに `Android` と `wv` がどちらも含まれる場合を以下のように判定する。
参考 : [AndroidのWebViewを完璧に切り分けたい \| 曖昧/旬](http://imys.la/shun/archives/4810)

```js
methods: {
    showNoticeAboutFacebookLogin() {
      const regexpA = /Android/i
      const regexpB = /wv/i
      if (window.navigator.userAgent.search(regexpA) && window.navigator.userAgent.search(regexpB) !== -1) {
        return true
      }
      return false
    }
}
```

## 表示の出し分け
上記の判定から `v-if` と `v-else` を利用して表示を出し分ける。

```html
<a v-if="showNoticeAboutFacebookLogin()" class="fb--cannotUse" disabled>
  Facebookでログイン
</a>
<a v-else :href="facebookLoginUrl" class="fb">
  Facebookでログイン
</a>
<p v-if="showNoticeAboutFacebookLogin()" class="notice">
  Facebookをご利用の方はブラウザからログインしてください。
</p>
```

```scss
.fb--cannotUse {
  ...
  pointer-events: none;
}

.notice {
  ...
  color: #d00000;
}
```

# 実機検証
localhost上で立ち上げている場合、下記の方法で簡単に実機検証ができる。

https://qiita.com/reona396/items/7efd9bb98d956b3e9785

https://www.gigas-jp.com/appnews/archives/9390

8080以外のポート番号で立ち上げている場合も、Chrome InspectのPort forwardingの設定のポート番号を書き換えれば良い。

アプリ内ブラウザのUserAgentの内容は下記が詳しい。

https://zenn.dev/kecy/articles/f51851e42c4243

Androidで `wv` が付くアプリ内ブラウザの一例として、LINEで確認してみる。
[Keepメモ](https://guide.line.me/ja/chats-calls-notifications/chats/chat-keep.html)など自分だけが見られるチャットルームにURLとして `http://localhost:ポート番号` を入力して送信する。
URLはリンクになるので、タップしてアプリ内ブラウザを立ち上げて動作を確認する。
Chrome Inspectを利用している状態であれば、アプリ内ブラウザからでもlocalhostの内容を確認できる。
ファイル操作コマンド


■基本コマンド
・touch ファイル名
　カレントディレクトリにファイル作成。
　(例)touch test_file.txt

・cat ファイル名
　カレントディレクトリのファイル閲覧。

・mkdir ディレクトリ名
　カレントディレクトリにディレクトリ作成
　(例)mkdir test_dir

・cd ディレクトリパス
　カレントディレクトリ変更。相対パス、絶対パスどちらも可。
　ディレクトリに「..」指定で１階層戻る。
　ディレクトリ指定無しでホームディレクトリに移動

・pwd
　カレントディレクトリのパス取得

・ls
　カレントディレクトリ内のディレクトリ、ファイルを一覧表示

■mvコマンド
・mv 移動対象ファイル名 移動先ディレクトリ名
　対象のファイルを対象のディレクトリに移動する

・mv 移動対象ディレクトリ名 移動先ディレクトリ名
　対象のディレクトリを対象のディレクトリに移動する

・mv 現在のファイル名 変更後のファイル名
　ファイル名を変更する。ディレクトリ名も同じように変更可能

■cpコマンド
・cp 現在のファイル名 コピー後のファイル名
　対象のファイルを指定ファイル名でコピーする。
　ディレクトリコピーの場合、「-r」オプションが必要（つけないとエラーになる）

■rmコマンド
・rm 対象ファイル名
　対象のファイルを削除する。
　ディレクトリ削除の場合、「-r」オプションが必要（つけないとエラーになる）


【補足】
・「tab」キーで補完可能
・Rootディレクトリは「/」で表現される
OCI上でコンパートメントを作成しよう

# 手順
１．OCIのコンパートメントとは
２．コンパートメントを作成

# １．OCIのコンパートメントとは

https://speakerdeck.com/ocise/ociji-shu-zi-liao-idoyobiakusesuguan-li-iam-xiang-xi?slide=41


https://www.slideshare.net/oracle4engineer/oracle-cloud-infrastructure-20218

# ２．コンパートメントを作成
① OCIホーム画面の右上の「ハンバーガーメニュー」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/939bab9f-0f9d-0daf-5065-2629fb3dc2ed.png)

③ 「アイデンティティとセキュリティ」→「コンパートメント」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/6c787b49-52f9-1d38-34e9-06a76ec10442.png)

④ 「コンパートメントの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/d38162ee-7a5b-5cf8-097f-0630700aebf6.png)

⑤ 名前：springAnalytics
  説明：データ分析プロジェクト
  親コンパートメント：ルートもしくは、上位層のコンパートメント選択
  「コンパートメントの作成」ボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/22d1976b-5a59-c127-01c3-16ed5a197acd.png)

⑥ 画面をリフレッシュすると、作成したコンパートメントが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/3f5195f1-d10c-1682-5a4a-fe9b9ffca6ca.png)
GitHub READMEに画像を表示する方法

### はじめに
GitHubのREADME.mdに画像を表示出来たらいいなと思い調べました。

### やり方
やることは、３ステップです。
①　新規issueを作成
②　表示したい画像をドロップ
③　生成された画像URLをREADME.mdにコピペ

### 新規issueを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199242/2a0dc9ff-2147-8f79-5e33-f76de5b79a3b.png)

### 表示したい画像をドロップする
コメント欄に表示したい画像をドロップすると、下のように画像のURLが生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199242/44f8e21e-c184-cb39-02a3-0000ad733355.png)

### 生成された画像URLをREADME.mdにコピペ

上で生成された画像URLをRAEDME.mdに貼り付けると、画像が表示されます。
issueは閉じてしまいましょう。

### 終わりに
やり方は意外に簡単でした。
この方法について、とても分かりやすい記事がありました。

### 参考
https://note.com/yukinooffice/n/n8b579ba619f7
migemoをWindows + Pythonで楽に使う方法


# 3行で説明

- migemo、便利ですよね。
- Windows + Python用にインストールしたところミスが多かったので、scriptを書いて自動化しました。
- 下記をコマンドプロンプトから実行すればインストール完了です。（場合によりユーザーアカウント制御のダイアログが表示されますので、適宜`はい`等をクリックしてください）

```bat
curl.exe -L https://raw.githubusercontent.com/cat2151/migemo-auto-install-for-windows-and-python/main/install_python_cmigemo.bat --output install_python_cmigemo.bat && install_python_cmigemo.bat
```

# インストール時にミスした場所
試す方の参考になればと思います。

- 手順を読み間違えた。また、手順のうちWindows向けの手順でないものを読み替えたときミスした
    -  → ここに成功した手順をscriptとして残します。
- pipしていたところpipが動かなくなり調査したところ壊れていた
    - → get-pipで解決した
    - → scriptに含めました
- migemo.dllをダウンロードしようとするとブラウザにブロックされた
    - → curl.exeで対処しました
    - → scriptに含めました
- migemo.dllをpython.exeのある場所やPATHの通った場所に配置しないと動かない
    - → scriptに含めました
- python.exeのあるディレクトリに書き込み権限がないとmigemo.dllを配置できない
    - → 権限付与した（プロパティ/セキュリティ/Users/アクセス許可/フルコントロールを付与した）
    - → 権限付与しない場合、権限昇格してコピーする
        - → scriptに含めました
- python.exeが64bit版のとき、migemo.dllを32bit版にすると動かない
    - → ひとまずscriptは64bit版決め打ちにしています
    - → ここに書き残しておきます
-  誤ってmigemo-dictファイルだけ孤立して配置すると（roma2hira.dat等を配置しないと）エラーなく期待値と異なる動作をした
    - (hoge)としか表示されなかった。期待値は「(ﾎｹﾞ|ホゲ|補元|保元|帆桁|捕鯨|ほげ|ｈｏｇｅ|hoge)」
    - → scriptで自動化した。誤った配置をする余地をなくした。
    - → ここに書き残しておきます
- `cmigemo.Migemo(日本語ディレクトリ名)` とするとエラーなく期待値と異なる動作をした
    - (hoge)としか表示されなかった。期待値は「(ﾎｹﾞ|ホゲ|補元|保元|帆桁|捕鯨|ほげ|ｈｏｇｅ|hoge)」
    - → ここに書き残しておきます

# 関連リンク
[script本体（GitHub）](https://github.com/cat2151/migemo-auto-install-for-windows-and-python)
[C/Migemo（Windows DLL）](https://www.kaoriya.net/software/cmigemo/)
[C/Migemo ソースコード](https://github.com/koron/cmigemo)
[python-cmigemo（Pythonモジュール）](https://github.com/mooz/python-cmigemo)
自分的プロジェクト運営3種の神器（よく使うってだけ）

# 概要

何度かプロジェクト運営を行う立場になって、自分なりのフォームというか、
運営時に行うことが固まってきたので一度アウトプットしてみようと思いました。

ツールではないのですが、それぞれに意図を持って行うことで、
プロジェクトが程よくいい感じに運営できている気がするので、ここにまとめます。
（ちなみに、いい感じの定義は正しいゴールに向かえている感じで、稼働の安定や事業の成長に直結はしていません。  
　ただ、意識しないと安定も成長も作れないので、大きく違うとは思いません。）

# 各種説明

以下の3つのツール（ドキュメント、会議体）を作って、プロジェクトを運営します。

- キックオフ
- WBS
- 振り返り

ここでのプロジェクト運営のスコープは自チーム内をスコープにしています。
顧客や会社の上長などのステークホルダーはほとんど登場しません。
顧客や会社の上長は別途定例会や規模の大きなプロジェクトならステアリングコミッティの運営なども大事だと思います。

次の節から各項目の詳細を記載します。

## キックオフ

当たり前ですが、キックオフ開催しています。
パワーポイントで作って、説明しています。
説明する内容、お品書きはこんな感じです。

- プロジェクトの目的（お客さんが求めるもの、達成したいこと）
- プロジェクトの目的（会社が求めるもの、得たいこと）
- プロジェクトの目標（目的を達成するための指標、3つくらい）
- 全体スケジュール
- 体制、役割
- 方針
- （最初はワーキングルールとかコミュニケーション、勤怠ルールとか）

プロジェクトの目的を両面から発表して、メンバーの納得感と会社としてのやりたいことをつなげます。
こうすることで、会社の成長という点にも後々つながりやすくなっている気がします。
（もちろん意識するだけじゃ..というところですが、意識するとその方角に向けるのでやっぱり必要だと思います）

## WBS

これは、もっと当たり前ですが...ないとスケジュール管理をできません..
作成するときに全部埋めるのは正直不可能だし、すぐ予定は狂うので、全部を細かく埋めないようにしています。
「この時期に重要な試験（フィールドテストとか擬似本番環境を使うとか）があるから、この時期までにこの完成度を達成していないといけない。とか、リリースまでを期限で区切ると逆算して、ここまでに製造、ここまでに試験が終わっていないといけないとか、クリティカルパスを意識したマイルストーンを置くようにしています。

で、マイルストーンを達成できるよう月次・週次の予定を組み立てていく。
週次の予定は進捗に応じて組み直し、大幅な組み替えをしないといけない時はどうしても月次での変更が必要になる。
（大体、遅延が大きくて翌月増員と稼働増で...みたいなパターンになりがちですが...あとは作業の進め方のリセットとかも1ヶ月を区切りにして、振り返りとセットで行うようにしています。）

## 振り返り

できれば2週間、最低でも1ヶ月に1回は振り返りを行うようにしています。
正直、これが一番難しいです。
プロジェクトを一番俯瞰的に見えているPMの立場でもチームの大事なKeepやProblemは見えないことがままあります。
それをメンバーに求めると、PMも孤独な心境を感じたり、メンバーも不適切な期待を受けるので、
振り返りでPJ改善は理想であり、うまくいった時もあるのですが、毎度求めるものではないかなと思っています。

振り返りでPJ改善はPJの重要な時間を 「1時間くらい × 人数分」 使うので、PJ改善につながる成果を求めたくなりますが、メンバー個人の気づきや整理につながるならそれもいいかなと思いました。
一番恐れてるのは、振り返りの時間を呆然と過ごすことで、ここは普段の心理的安全性を高めて、
率直な感想を言えるようになってもらう、言いにくいことでも悪気なく言ってもらうができるといいなぁと思います。

良い振り返りはこれ！というのがまだありませんし、ないかもしれませんが、振り返りという時間を持ち、
作業からチーム・自分に目を向けてもらう時間は確保し続けていきたいなぁと思います。

# まとめ

ほぼ自分の備忘録、文章をつらつら書き綴りました。
書いてみると、本当になんともない取り組みだと思いましたが、どなたかの参考になれば幸いです。

自分の経験ではまだ20名程度までしかチームの範囲が見えていないので、
もっと大きなPJのPJ運営を行う場合、コミュニケーションパスや管理する内容・ノウハウはもっと広くなるのかなと思っています。
とはいえ、PJはある程度自分の目が届く範囲で運営できるのがやりやすいですが...
laravelで記事の削除をする機能[多数]

# はじめに
ポートフォリオ作成にあたって、記事を削除するための機能を作成した。
ただ削除する機能についてはいくつか方法があるので、それをまとめようと思う。

## 基本情報

まずControllerでの設定をします。掲示板なのでHome画面に記事を一覧で出力します。
細かいことは省きますが、articleメソッドでmemoテーブルからstatusが1のものを呼び出して出力する

```php
      $memo = Memo::where('status','1')->where('id',$id)->first();

```

**ルーティング**
```php
    Route::post('/delete/{id}', 'AccountController@delete')->name('delete');
```


## 削除機能その①
**物理的に削除する（delete）**

Modelで記事のidと一致したものをdelete()で削除する
※「削除しました」というメッセージが出力されるようにフラッシュメッセージで設定する

```php

public function destroy($id)
{
  Articles::where('id', $id)->delete();
  return redirect('/')->with('success', '削除しました');
}
```

## 削除機能その②
**論理機能削除**


|Column|Type|Option|
|---|---|---|
|status|integer|default = 1|


削除ボタンを押すとstatusが1→2になる
Modelで以下のような設定をすると対象になる記事のstatusが2になる
もとの設定でstatus=1だけが出力されるようになるから、それ以外が出力されない


```php
    public function delete(Request $request , $id){
        $inputs = $request->all();
        Memo::where('id',$id)->update([ 'status' => 2 ]);
    
        return redirect()->route('home')->with('flash-delete','削除しました');
    }
```
Linuxでユーザーを確認する方法

現在コマンドを実行しているユーザーを確認する方法です。

```
$ whoami
ubuntu
```

ちなみに現在ログイン中のユーザーを表示するのは以下。

```
$ who
ubuntu   pts/0      2022-04-03 07:49

or

$ users
ubuntu

```

以上です。
AWS VPCエンドポイント メモ

* VPCエンドポイントについてメモする。

## 概要

* VPCと他サービスの通信を可能にするVPCコンポーネント。
* VPC内のインスタンスとVPC外のサービスをプライベート接続で通信できる。
  * インターネットゲートウェイを経由せずに済む。

## 用途

* セキュリティ上の理由でインターネットに接続せずにサービス接続したい場合に利用する。

## 3種類のエンドポイント

* 次の3種類のエンドポイントが存在する。
  * インターフェイスエンドポイント
  * ゲートウェイエンドポイント
  * Gateway Load Balancer エンドポイント

### インターフェイスエンドポイント

* サービスのエンドポイントとENI(Elastic Network Interface)をPrivateLinkでリンクするエンドポイント

  ![vpc_endpoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/52f87f12-ef55-7080-0647-9c7e1cfa5ec6.png)


  

### ゲートウェイエンドポイント

* ルートテーブルを書き換え、(VPCエンドポイントの)ゲートウェイ経由でAWSのAPIエンドポイントへアクセスするエンドポイント

* S3とDynamoDBのみ対応

  ![gw_endpoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/24ec6858-a001-be2b-ee18-e0df6e70492c.png)


### Gateway Load Balancer エンドポイント

* Gateway Load Balancerを使用して設定したネットワーク/サービスにルーティングするエンドポイント

  ![gwlb_endpoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/dfba26d4-baf6-f610-1cd0-3b4f97600396.png)


## 参考情報

* [VPC エンドポイント](https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpc-endpoints.html)
Unityでマルチスレッド処理を試すための9行

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) 素朴なスクリプトでわかりたい


# Unityで並行処理
マルチスレッド化した無限ループを準備してネットワーク処理をブンブン回したいのですが、調べるとやり方がいろいろあるようで難しいです。
その基本を理解するために、実験として最小限のプログラムを作ってみました。

# 参考記事
[初心者のためのTask.Run(), async/awaitの使い方](https://qiita.com/inew/items/0126270bca99883605de)

## つかうもの
```task.Run(() => {[処理]})```
というコマンドを使います。
このコマンドは、[処理]の部分を別スレッドで実行するものらしいです。

Unityのバージョンは2020.3.25f1のもので試しました。

## 理解のための素朴なコード
もろもろ省略したシンプルなコードです。
Unityで以下のスクリプトを作成し、空のオブジェクトなどにアタッチすれば実行可能です。が、トラブル防止のための処理なども省略してしまっているので、実行はちょっと危険です。ご注意ください。
（実行してみた場合にはPCの再起動をお勧めします。）

```C#:LoopSample.cs
using UnityEngine;
using System.Threading.Tasks;

public class LoopSample : MonoBehaviour
{
    //スタート時に１回だけ以下を実行
    void Start()
    {
        Thread_1();//無限ループ実行用の関数を起動
    }

    //無限ループ実行用の関数
    public void Thread_1()
    {
        Task.Run(() =>//このコマンドで以下を別スレッドで実行
        {
            while (true)//無限ループの本体
            {
                Debug.Log("Test");//コンソールにTestを表示
            }
        });
    }
}

```
## 実行結果
実行するとUnityのConsoleにTestという文字が表示され、Collapseがオンになっていれば、表示数が右端にどんどんカウントアップされていきます。
そしてなんと停止ボタンを押してもカウントアップが続きます。別スレッドとはいえ、なんかすごいです。自分の環境ではUnityがそのままフリーズしてしまいました。


## 少しだけ事故防止処理を施したコード
今度は以下の２つの処理を入れてもうちょっとだけ扱いやすくしてみます。
・停止した時に無限ループスレッドも止まるようにする。
・例外が発生した時にエラーログが出るようにする。

```C#:LoopSample2.cs
using UnityEngine;
using System.Threading.Tasks;

public class LoopSample2 : MonoBehaviour
{
    private bool Flag_loop = true;//無限ループ制御用フラグを設定し、揚げる

    void Start()
    {
        Thread_1();
    }

    void OnApplicationQuit()//アプリ終了時の処理（無限ループを解放）
    {
        Flag_loop = false;//無限ループフラグを下げる
    }

    public void Thread_1()//無限ループ本体
    {
        Task.Run(() =>
        {
            while (Flag_loop)//無限ループフラグをチェック
            {
                try
                {
                    Debug.Log("Test");
                }
                catch (System.Exception e)//例外をチェック
                {
                    Debug.LogWarning(e);//エラーを表示
                }
            }
        });
    }
}

```
## 実行結果
実行するとUnityのConsoleにTestという文字が表示され、Collapseがオンになっていれば、表示数が右端にどんどんカウントアップされていきます。
...というところは先ほどと同じですが、今回は停止ボタンでカウントの表示も止まるハズです。

# さいごに
素朴に並行処理を試してみるだけの記事がなかったのでまとめてみました。
実際に動かすことで、苦手意識から開放されそうな気がします。
より本格的な並行処理、非同期処理を実現するためには、async/awaitのコマンドや、UniTaskやジョブシステムといった仕組みが用意されています。

下記のような参考になる記事がたくさんありますので、ここから先はネクストステップに進みやすいかと思います。
[Taskを極めろ！async/await完全攻略](
https://qiita.com/acple@github/items/8f63aacb13de9954c5da)

また、間違いがありましたらご指摘いただければ幸いです。
AWS Internet Gateway と NAT Gateway メモ


* 今更ながらAWSのネットワークコンポーネントInternet GatewayとNAT Gatewayについてメモする。

## Internet Gateway

* VPCがインターネット接続を行うために必要となるAWSコンポーネント。

  * VPC内のインスタンスは、Internet Gatewayがなければ同一VPC内のインスタンスとしかやり取りできない。

    ![ig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/7c114f9f-be81-f288-a300-0b854984d218.png)


* `Static NAT` : プライベート IP とパブリック IP が 1 対 1 で変換する。

* internet Gatewayとのやり取り

  * パブリックサブネット：〇
  * プライベートサブネット：×

## NAT Gateway

* プライベートサブネット内のインスタンスからVPC外のサービスに接続するためのAWSコンポーネント。

  * 外部サービスはそれらのインスタンスと接続できない。

  ![ng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/0908e847-95a5-130c-76e3-cc660eeedeb4.png)


* `Dynamic NAPT` : プライベートIPとパブリックIPを多対1で変換する。

  * 複数インスタンスからの通信が、プライベートIPでNAT Gatewayを通過する際、1つのパブリックIPに変換される。

* NAT Gateway単体ではインターネットとの接続性がない。

  * NAT Gatewayをパブリックサブネットに配置し、Internet Gatewayに接続できるようにする必要がある。

* **ユースケース**

  * インターネットへのアクセスは実施しつつ、インターネットからはアクセスさせないようなセキュリティ対応が求められるようなケース

## 参考情報

* [NAT ゲートウェイ](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-gateway.html)
* [インターネットゲートウェイを使用してサブネットをインターネットに接続する](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Internet_Gateway.html)
X-Frame-Options ヘッダー メモ


## X-Frame-Optionsとは

* HTTPのセキュリティ対策レスポンスヘッダーの一つ
* ブラウザーがページをフレームなどの中に表示することを許可するかどうかを示すために使用する
* Webサイト側はコンテンツが他サイトに埋め込まれないよう保証する



## 設定目的:クリックジャッキングの防止

![cj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/d6f78214-a7bb-d8ac-ea2a-83bd099d99a3.png)


* **クリックジャッキングによって発生しうる脅威**
  * ログイン後のユーザーのみが利用可能なサービスの悪用
    * 意図しない情報発信、意図しない退会処理 など
  * ログイン後のユーザーのみが編集可能な設定の変更
    * ユーザー情報の公開範囲の意図しない変更 など

## 設定値

* `DENY`
  * ページをフレーム内に表示することを許可しない
* `SAMEORIGIN`
  * ページ自体と同じオリジンのフレーム内でのみ表示可能とする



## 参考情報

* [X-Frame-Options](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/X-Frame-Options)
【JavaScript】関数多くないですか！？

## はじめに
こんばんは、プログラミング初心者だいごです。
最近、ちょっとずつJavaScriptの学習を始めています。
学習を進める中でいっぱい関数っていう言葉が出てきます。
関数宣言やら関数式、無名関数などいろんろ出てきて頭がパンク寸前ですw
そんなこんなで今回は関数を簡単にまとめていきます。

## 様々な関数
今回はこのラインナップです。
１個ずつ簡単に解説していきます。
- 関数宣言
- 関数式
- 無名関数
- 即時関数
- アロー関数

### 関数宣言
```javascript
function 関数名(引数){
  // 関数内の処理
}
```
王道中の王道！これが関数宣言です。
特徴としては関数の定義がfunctionから始まるところです。
この関数宣言は、宣言を含むスコープが実行されるまでにfunctionオブジェクトが生成されます。

### 関数式
```javascript
変数 = function(引数){
  // 関数内の処理
}
```
はい！これが関数式です。
特徴としては、無名の関数を変数に定義または代入して関数を定義するところです。
また、この関数式は、その式が実行されるときにfunctionオブジェクトが生成されます。
つまり、関数宣言との違いは、記述の仕方とオブジェクトが生成されるタイミングになります。

### 無名関数
```javascript
const countNum = function(num) {
  console.log(num)
}
countNum(1)
```
はい！これが無名関数です。
関数式と一緒の記述ですね。
厳密に言えば、function(){}が無名関数と呼ばれる部分になります。
この無名関数は、より簡潔なコードを書けるというメリットがあります。
また、特徴としては、関数を多く使用するコードであるときに使用すること関数名の重複を避けることができることです。

### 即時関数
```javascript
(function countNum(num) {
  console.log(num)
})(1)
```
なんか（）が多い！って印象ですね。
これが即時関数です。
この関数は、名前通り関数を定義すると同時に実行される構文です。
()の中に無名関数を記述することで、その関数を即実行することができるようになります。
特徴としては、流用する可能性のない関数を定義するときに使用することと別途関数を定義する手間がないことです。

### アロー関数
```javascript
const 変数名 = () => {
  処理
}
```
近年使用される事例が増えてきてる噂の関数、これがアロー関数です。
この関数は、functionの記述を省略し、その代わりに（）=>という記述によって関数を定義する構文です。
特徴としては、無名関数または即時関数において、より省略した記述をしたい時に使用できることです。

## 終わりに
長くなりましたがなんとかまとめることができました。
それぞれの関数に良さがあるので、使い分けれたらベストだと感じました。
これからも日々の学びを発信していくのでよかったらご覧ください。
ご指摘・コメント等お待ちしてます。
ありがとうございました。
[Kotlin]JetpackComposeでボタンを押したときのエフェクトについて（リップルエフェクト）

# 概要
ボタンを押したときのエフェクトがコードの書き方によってどう変わるかを比較してみました
# 本文

 JetpackCompose用テンプレートのコードにclickableなBoxを追加したものです。画面をタップするとリップルエフェクトが発生します。

```kotlin
        setContent {
            ComposeClickableTestTheme {
                Surface() {
                    Box(
                        modifier = Modifier
                            .fillMaxSize()
                            .clickable(
                                onClick = { },
                            )
                    ) {
                    }
                }
            }
        }
```

適用されていたThemeを消しました。clickableなBoxはリップルエフェクトを出さず単純な点滅になります。

```kotlin
        setContent {
            Surface() {
                Box(
                    modifier = Modifier
                        .fillMaxSize()
                        .clickable(
                            onClick = { },
                        )
                ) {
                }
            }
        }
```

Themeが無いままでも以下のように書き換えると、clickableなBoxはリップルエフェクトを発生するようになります。

```kotlin
        setContent {
            Surface() {
                Box(
                    modifier = Modifier
                        .fillMaxSize()
                        .clickable(
                            onClick = { },
                            interactionSource = remember { MutableInteractionSource() },
                            indication = rememberRipple(bounded = true),
                        ),
                ) {
                }
            }
        }
```
Herokuで1Dynoに2つのアプリをデプロイする備忘録


# やりたかったこと

- 作成したWEBアプリ無料枠の範囲内でを稼働させる為にバックエンドとフロントエンドで異なる言語を一つのDynoで動かしたい

# どうしたか

- デプロイ時にカレントディレクトリに作成するProcfileファイルに複数アプリの起動を＆で定義する

```Procfile
web: java -jar target/spring-boot-0.0.1-SNAPSHOT.jar & wait -n; sh -c 'cd ./client && npm start'; wait
```

# 嵌まったポイント

- 動作検証
    - heroku localコマンドでローカル実行
- shコマンドでエラー
    - Powershellで動かしていたのを忘れていました(笑)WSLで
- 両アプリでポートが被った
　　- 最初原因がわからず、コマンドの起動順を入れ替えて発覚。環境変数で調整して解決
[AWS SAM] Lambda関数でOPTIONメソッドを作り「CORSの複数origin対応」を攻略する②(シンプルな代案の説明)

# 前置き

- この記事では「CORSの複数origin対応」はしません
- Lambda、API Gatewayの動作を知るため、色々試した中の一つを覚書として残しただけになります

# 対象となる状況

- シンプルなCORS対応のためのOPTIONSメソッドを全メソッドに付与したい
    - 例えば、動作確認のため「許可するoriginは ”*(全て)” または “任意の1origin” 」でOKな状況など

# 記事の構成
- [[AWS SAM] Lambda関数でOPTIONメソッドを作り「CORSの複数origin対応」を攻略する①(概要説明)](https://qiita.com/sawa-akabee/items/1f3ab7886ffe0688a4e3) 
    - 全体的な説明、CORSについてなど
- [AWS SAM] Lambda関数でOPTIONメソッドを作り「CORSの複数origin対応」を攻略する②(シンプルな代案の説明) 
    - 本記事
- [[AWS SAM] Lambda関数でOPTIONメソッドを作り「CORSの複数origin対応」を攻略する③(実装説明)](https://qiita.com/sawa-akabee/items/126da675908f607bb1f7) 
    - 本当に伝えたい内容

結論を見たいだけな場合は③を参照してください！

# 環境

- macOS: Big Sur v11.6.1(Intel)
- バックエンド(Lambda関数を呼び出すAPIをSAMで構築する)
    - SAM CLI: 1.42.0
        - Runtime: node.js 14.x (Typescript)

# 手順

## 1. API GatewayにCORSを設定する

- template.ymlに次の記載を行い `$ sam deploy` することで、GETやPOSTが設定されているエンドポイントにOPTIONSが自動で付与される

```template.yml
   Globals:
      Api:
++      Cors:
++        AllowOrigin: "'*'"
++        AllowMethods: "'GET,POST,OPTIONS'"
++        AllowHeaders: "'Content-Type, Authorization, Accept, timeout'"
```

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490917/8095e47a-935d-6305-d097-6b731454982a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490917/03390c2d-ac38-0f6d-7c18-93f950bb6316.png)



## 2. Lambda関数のレスポンスヘッダーにCORSの許可関連設定を追加する

```example.ts
import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';
import 'source-map-support/register';

export const exampleHandler = async (
  event: APIGatewayProxyEvent
): Promise<APIGatewayProxyResult> => {
  return {
    statusCode: 200, 
		headers: {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'GET,POST,OPTIONS',
      'Access-Control-Allow-Headers': 'Content-Type, Authorization, Accept, timeout',
    },
    body: JSON.stringify({
      message: 'Hello world!',
    }),
  };
};
```

## 3. 動作確認

- `'Access-Control-Allow-Origin': '*'` としているため、フロントからのGETのAPIコールが問題なく通っているはず

# 注意点

## 統合リクエストタイプが”MOCK”となっている

- ちょっと複雑なことやりたいときは、Preflight(OPTION)用のLambda関数を用意して、mockの代わりにそのLambda関数を呼び出すように設定する
    - 「複雑なこと」とは、例えばAccess-Control-Allow-Originは `複数のoriginを許可することはできない` のでどうにかしたい！など
    - 手前味噌ですが次の記事を参照してください
        - [Preflight(OPTIONS)をLambda関数で自作する(複数originの許可対応)](https://qiita.com/sawa-akabee/items/126da675908f607bb1f7)

## シングルクォテーションとダブルクォテーションを併用しているのは何？

[AWS SAMのCORSを設定する（REST APIバージョン） - Qiita](https://qiita.com/kakudaisuke/items/91e781e532a3cd300a55#2-lambda%E3%81%AE%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%81%ABcors%E8%A8%B1%E5%8F%AF%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%82%E3%81%92%E3%82%8B)

> `"'*'"`というシングルクォテーションとダブルクォテーションを両方使う書き方がマストみたいです。どちらかだけのクォテーションにしてしまうと`Error: AllowHeaders must be a quoted string (i.e. "'value'" is correct, but "value" is not).`
てな具合に怒られます。
> 
- 自分の環境ではちょっと書き方が違ったけどエラーになりました
GitHub Pages で Next.js を使う場合に js や CSS などの static ファイルが読み込めない場合の対処法

GitHub Pages で Next.js を使おうとしたが、html などのファイルは読み込めているにも関わらず `_next` 配下の CSS や JS の static ファイルがなぜか 404 になってしまい困った。

結論としては jekyll が悪さをしているので、`.nojekyll` ファイルを配置するようにすれば治る。

どうやら jekyll の仕様として `_` から始まるディレクトリが見えないようでした。。

![jekyll ignore files](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225665/4f1279a0-445d-ed25-9dc8-08d08571438e.png)

ref: http://jekyllrb-ja.github.io/docs/structure/

Thanks 
https://qiita.com/manten120/items/87e9e822800403904dc8#github-actions-でデプロイするための準備
C#技術記事URL保存

# 拡張メソッドについて
> C# 2.0 までの常識で言うと、 既存のクラスの機能拡張（＝メソッドの追加）をしたければ、 そのクラスを継承したりなどして、新しいクラスを作るしかありませんでした。

> これに対して、C# 3.0 では、後述する方法で、 既存のクラスにメソッドを追加できます。 （正確には、インスタンスメソッドの“ようなもの”。インスタンスメソッドと同じ構文で呼べるだけ。） このような、後から追加するメソッドのことを拡張メソッド（extension method）と呼びます。

https://ufcpp.net/study/csharp/sp3_extension.html
測定誤差を考慮した最小二乗法

# 誤差を考慮した最小二乗法
理論の説明をした後に、解析的に求めた結果を反映させた関数をColabで実装します。
(大学の講義で学んだことを自分なりにかみ砕いて説明したものです)
# 理論的な話
### 普通の単回帰
状況としては、説明変数$x_i$ と、目的変数$y_i$ が実験を通して得られたという状況を考えます。
これで単回帰をすれば、

$ Y_i =ax_i+b$

という1次関数の形で、目的変数$y$ を予測するモデルが出来上がります。

そこで、

$\displaystyle \sum_i (y_i-Y_i)^2$

が最小になるような$a,b$ を見つければいいというのが普通の最小二乗法です。


## 誤差考慮Ver

### 何をするか
まず、測定をするときには誤差が生じます。その誤差が偶然誤差であり、その偶然誤差が正規分布に従う場合にのみ使用することのできるものです。導出は省きますが、結論、今回最小化したいのは

$ \chi^2=\displaystyle \sum_i \displaystyle \frac{(y_i-Y_i)^2}{\sigma_i^2} $

です。これはカイ二乗値です。
ここで、$\sigma_i$ は $y_i$ の測定誤差です。

$\chi^2$を最小化するためには、パラメータ微分が0となるような$a,b$ を探す必要があります。
これは頑張れば解析的に求めることができます。

数値的にやるのであれば勾配降下法とかを使うんだと思います。

ここでは、解析的に求める手順（細かい計算は省く）を紹介します。

### 微分をして、極値をとるタイミングを探す。
パラメータ微分が0となる点を見つけます。

やることとしては、

$ \displaystyle\frac{\partial \chi^2}{\partial a}=0$
$ \displaystyle\frac{\partial \chi^2}{\partial b}=0$

という連立方程式を解いて、$a,b$ を求めます。

計算すると、

$a=\displaystyle (\sum_i\frac{x_iy_i}{\sigma_i^2}\sum_i\frac{1}{\sigma_i^2}-\sum\frac{y_i}{\sigma_i^2}\sum_i\frac{x_i}{\sigma_i^2})/\Delta$

$b=\displaystyle (\sum_i\frac{x_i^2}{\sigma_i^2}\sum_i\frac{y_i}{\sigma_i^2}-\sum\frac{x_iy_i}{\sigma_i^2}\sum_i\frac{x_i}{\sigma_i^2})/\Delta$

と書くことができます。

ここで、

$\Delta=\displaystyle \sum_i\frac{x_i^2}{\sigma_i^2} \sum_i \frac{1}{\sigma_i^2}-(\sum_i\frac{x_i}{\sigma_i^2})^2$　

と置きました。

### パラメータの誤差
測定誤差があれば、パラメータにも誤差があるでしょう。

これは、誤差の伝搬の考え方から

$\sigma_a=\displaystyle \sqrt{\sum_i\frac{1}{\sigma_i^2} /\Delta}$

$\sigma_b=\displaystyle \sqrt{\sum_i\frac{x_i^2}{\sigma_i^2} /\Delta}$

とすることができるそうです。

### 換算カイ二乗について
$ \chi_{redu}^2=\displaystyle\frac{\chi^2}{df}$

という式で**換算カイ2乗**を定義します。ここで、$df$は自由度(観測の長さ-パラメータ数)です。

この値が1に近いほど良い精度のモデルであるという事ができます。

# 実装
コードは以下の通りです。
一発で見れるように、パラメータのリストを返り値にしました。

```python
import numpy as np

def chi2_reg(x,y,ye,Ndata,Npara=2):
  param={}  #空のパラメータリストを作成

  param['Delta'] = np.sum(x**2/ye**2) * np.sum(1/ye**2) - (np.sum(x/ye**2))**2

  param['a']=((np.sum((x*y)/ye**2))*(np.sum((1/ye**2)))-(np.sum((y/ye**2)))*(np.sum((x/ye**2))))/param['Delta']
  param['sig_a']=np.sqrt(np.sum(1/ye**2)/param['Delta'])

  param['b']=(np.sum(x**2/ye**2)*np.sum(y/ye**2)-np.sum(x*y/ye**2)*np.sum(x/ye**2))/param['Delta']

  param['sig_b']=np.sqrt(np.sum(x**2/ye**2)/param['Delta'])

  param['chi2']=np.sum(y**2/ye**2)-param['a']*np.sum(x*y/ye**2)-param['b']*np.sum(y/ye**2)
  param['red_chi2']=param['chi2']/(Ndata-Npara)

  return param
```

このあと、x、y、ye、Ndata=len(x)を指定し、
```python
result=chi2_reg(x,y,ye,Ndata)
result
```
とすれば、結果を見ることができます。
Vue.js v-onの使い方

# 概要
JavaScriptではクリックして何かを実行させる場合に`onclick`を使用します。  
しかし、Vueの場合以下のような処理を実装することはできません。
```
onclick="{{ value }}++"
```

そこで`v-on`という構文を使用します。
# 記述方法
`v-on`構文は以下のように記載します。
```
v-on: イベント名="処理"
```
# 実例
例としてクリックするごとに1インクリメントする処理を記述します。
```
template: '<p v-on:click="value++;" clicked: {{ value }}.</p>'
```

上記のように書くことで`value++`が認識されるようになります。
Javascript コンソールにアウトプット

## はじめに
以下の書籍を購入したのでその本に書かれていることを実践/整理するために本ページを作成しています。
### 参考書
https://www.sbcr.jp/product/4815601577/
## 目的
簡単なJavascriptのコードをブラウザ上のコンソールに書いて実行する
## 実践
### 作業環境
MacBookPro(2016)
macOS monterey(12.3)
chrome
### 手順
```javascript:文字列を出力
console.log('おうむ返し');
```
「おうむ返し」と表示される
```javascript:足し算
console.log(2 + 3);
```
「5」と表示される
```javascript:引き算
console.log(150 - 38)
```
「112」と表示される

##まとめ
console.log（）で括弧内の文字を出力したり、計算したりできる。
【Oracle】Mac環境でmattn/go-oci8のライブラリをインストール時「oci.h: No such file or directory」が発生

## 概要
GolangでOracleに接続する際に、[mattn/go-oci8](https://github.com/mattn/go-oci8)のライブラリを使うことになると思います。ライブラリのGitHubのページにある手順に従ってMacにインストールしようとしたのですが、go getの実行時に`oci.h: No such file or directory`が発生しました。
今回はこのエラーについて、対応した内容をメモ書きします。

## 原因
原因はエラーにある通りの内容で、`oci.h`というファイルが無いからになります。
まず前提として、このライブラリを使う前にOracleのInstant Clientを用意する必要があります。基本的には`mattn/go-oci8`のGitHubのページにある手順の通り、ダウンロードした後に、設定ファイルの作成とパスを通せば良いです。ただ、このInstant Clientでにて、接続時に使用する`oci.h`が含まれてませんでした。

## 対応
Macに限った話ではないのですが、 Instant Clientでは`Basic Package`と、oci.hのように開発時に使用する`SDK Package`がファイルとして分けて提供されています。[こちら](https://www.oracle.com/database/technologies/instant-client/downloads.html)がInstant Clientのダウンロードページなのですが、使用するOSを選択して`Basic Package`と`SDK Package`をダウンロードして同じフォルダに配置すればOKです。
Microsoft Graph API は Azure CLI を使うと簡単便利だった

## 背景と目的

Microsoft Graph は、Microsoft 365 関連リソースを操作出来る REST API です。GUI で Microsoft Graph API を操作するツールは色々ありますが、CUI 派の自分にとっては Azure CLI の 認証機能と REST リクエスト機能を使うと簡単便利だったので、使い方を紹介します。デフォルト設定で全ての Microsoft Graph API が使用出来るわけではありません。今回のサンプルは、自分が参加している Teams のチーム一覧を取得するという単純な例です。

## Azure CLI で認証

<https://docs.microsoft.com/ja-jp/cli/azure/authenticate-azure-cli>

上記サイトを参考に Azure AD テナントにサインインします。

サインインするテナントに自分がアクセスできる Azure サブスクリプションがない場合は、以下のパラメーターを使ってみて下さい。

```bash:bash
az login --allow-no-subscriptions
```

## Azure CLI で Microsoft Graph API を操作

サインインしたユーザーの権限で API を実行します。

### 自分のプロファイルを表示する例

<https://docs.microsoft.com/ja-JP/graph/api/user-get?view=graph-rest-1.0&tabs=http#example-2-signed-in-user-request>

```bash:bash
az rest \
  --method get \
  --url https://graph.microsoft.com/v1.0/me
```

### 自分が参加しているチームの一覧を表示する例

<https://docs.microsoft.com/ja-jp/graph/api/user-list-joinedteams?view=graph-rest-1.0&tabs=http#request>

```bash:bash
az rest \
  --method get \
  --url https://graph.microsoft.com/v1.0/me/joinedTeams
```

## 参考

<https://docs.microsoft.com/ja-jp/graph/use-the-api>

<https://developer.microsoft.com/ja-jp/graph/graph-explorer>

<https://docs.microsoft.com/ja-jp/cli/azure/reference-index?view=azure-cli-latest#az-rest>
navタグについて

## navタグとは
「navigation」の略で、HTMLではページ内の「指定部分や他のページへの誘導」を意味します。
navタグを使うことで、ユーザーがページ内のコンテンツを探す手間を省くことができます。

~~~html
<nev>
 <ul>
  <li>お問合せホーム</li>
  <li>概要</li>
  <li>お問合せ</li>
 </ul>
</nav>
~~~

上記のようにサイトのナビゲーション部分をnavタグで囲うのが一般的です。
また、ulタグやolタグのようなリスト要素とセットで使われます。


:::note warn
navタグはサイト内で複数回使えますが、使いすぎると見づらくなるので注意しましょう。
また、サイト下部の「利用規約」や「トップページに戻る」などのナビゲーションを作る場合はnavタグではなく、footerタグだけで十分です。
:::

## navタグで使用できる属性
* <b>グローバル属性</b>

* <b>イベントハンドラ</b>

| 属性 | 説明 |
|:-:|:-:|
| class | 要素にCSSスタイルを適用するためによく使われる属性です。 |
| id  | class属性同様、要素にCSSでスタイルを適用するためによく使われます。同じid属性はページ内で1回しか使えません。  |
| title  | 要素のタイトルを定義します。パソコンのブラウザでは、要素部分にマウスを当てると定義したタイトルが表示されます。  |
| lang  | 要素の中で使われる言語を定義する属性です。  |

## 他のセクションとの違い
* main 
mainタグはHTML文書のメインコンテンツを示します。

* article
articleタグはHTML文書の独立した記事の箇所を示します。

* header/footer
header/footerタグはセクションの情報を示すタグです。navタグも同じ役割を持つ。

* aside
asideタグは余談・補足の情報を示します。

## 参考サイト

https://webukatu.com/wordpress/blog/11267/

https://weblan3.com/html/nav
Deno.test()の書き方は6つある

Denoにはテストランナーが組み込まれています。そのテストランナーで実行されるテストを定義するのが`Deno.test()`関数です。
公式ドキュメントによると`Deno.test()`の書き方は6つあります。

https://doc.deno.land/deno/stable/~/Deno.test

## Deno.test()の書き方

Deno.test()の書き方は以下の6つがサポートされています。

```ts
// 書き方1
Deno.test({
  name: "<test_name>",
  fn() {
    /* <test_code> */
  }
  // ...（その他のオプション）
});

// 書き方2
Deno.test(function test_name() {
  /* <test_code> */
});

// 書き方3
Deno.test("<test_name>", () => {
  /* <test_code> */
});

// 書き方4
Deno.test({
  // ...（その他のオプション）
}, function test_name() {
  /* <test_code> */
});

// 書き方5
Deno.test("<test_name>", {
  // ...（その他のオプション）
}, () => {
  /* <test_code> */
});

// 書き方6
Deno.test({
  name: "<test_name>",
  // ...（その他のオプション）
}, () => {
  /* <test_code> */
});
```

どの書き方にも共通しているのが、テスト名を指定する必要があるということです。テスト名を指定しない場合（例えば関数式の代わりに即時間数を指定した時）は、エラーが発生します。

## テストのオプションについて

テストにはオブジェクトでオプションを渡すことができます。

```ts
Deno.test({
  name: "<test_name>",
  fn() {
    /* <test_code> */
  },
  // 以下はデフォルト値の場合
  ignore: false,
  only: false,
  permissions: "inherit",
  sanitizeExit: true,
  sanitizeOps: true,
  sanitizeResources: true,
});
```

以下、それぞれのオプションについて解説します。

#### ignore

`ignore: true`を指定するとそのテストは無視されます。
windowsの時だけ無視したい場合は、`ignore: Deno.build.os === "windows"`のようにします。

#### only

`only: true`を指定したテストが存在する場合、そのテストだけが実行された上でテスト自体は失敗します。（終了コード1）

デバッグ中に特定のテストだけ実行したい場合などにこのオプションを使います。

#### permissions

テストに許可する権限を指定できます。
`permissions: "inherit"`（デフォルト）を渡した場合は、コマンドを打った時の権限（`--alow-xxx`）が引き継がれます。
`permissions: "none"`を渡した場合は、権限なしで実行されます。
PermissionOptionsObjectを渡しすと、権限を種類別に設定できます。

```ts
Deno.test({
  name: "<test_name>",
  fn() {
    /* <test_code> */
  },
  permissions: {
    read: true, // 読み取り権限だけ許可する場合
  },
});
```

https://doc.deno.land/deno/stable/~/Deno.PermissionOptionsObject

#### sanitizeOps / sanitizeResources / sanitizeExit

これらはtest sanitizerから発生するエラーを無視するためのオプションです。
詳しくは[こちらの記事](https://qiita.com/access3151fq/items/bb99819ad25e889305a6)を参照してください。

## テストを入れ子にする方法

テストを入れ子にするには、test steps APIを使います。

```ts
Deno.test(async function test_name(t) {
  // この部分は最初に実行される

  await t.step({
    name: "nested test 1",
    fn() {
      // ネストされたテスト
    },
  });

  await t.step({
    name: "nested test 2",
    async fn(t) {
      await t.step({
        name: "nested test 1",
        fn() {
          // 更にネストすることもできる
        },
      });
    },
  });

  // この部分は最後に実行される
});
```

テスト用の関数の引数に[TestContext](https://doc.deno.land/deno/stable/~/Deno.TestContext)が渡ってくるので、それに対して`t.step()`でネストされたテストを定義することができます。

## まとめ

- `Deno.test()`には書き方が6つある
- `Deno.test()`にオプションを渡して挙動を調整できる
- ネストできる
【初心者向け】Matplotlibを使用したグラフ作成 　その１：Matplotlibとは

# はじめに
この記事では`Matplotlib`を用いたデータの可視化やグラフの作成方法についてまとめています。

私自身大学の研究活動を通して`Matplotlib`を使用することが多かったのですが、機能が多いため苦戦していました。
そこで大学生や大学院生が論文や資料作成する上で最低限必要な知識をまとめることにしました。
本記事が初学者の手助けになれば幸いです。


# Matplotlibとは？
`Matplotlib`とは、Pythonのグラフ描画ライブラリです。

* [公式ドキュメントはこちら](https://matplotlib.org/stable/index.html)

名前の由来はMATLABユーザーが使いやすいように設計されていることに関連しているみたいです。

# Matplotlibのインストール
`Matplotlib`は外部ライブラリなので使用環境によってはインストールが必要になります。

* `pip`を使用する場合
コマンドプロンプトから以下のコマンドを入力することでインストールできます。
```:pipでインストール
pip install matplotlib
```
* `conda`を使用する場合
Anaconda等の仮想環境を使用している場合はAnaconda promptから以下のコマンドを入力することでインストールできます。
```:condaでインストール
conda install matplotlib
```
# Matplotlibでグラフを作成する基本的な流れ
基本的なグラフ作成の流れは以下の通りです。
　1.　`matplotlib`のインポート
　2.　データの準備
　3.　グラフの作成
各ステップについて例を交えて解説していきます。

## 1. matplotlibのインポート
`matplotlib`では、基本的に`pyplot`モジュールを使用してグラフを描きます。
`pyplot`モジュールは`plt`で略称することが慣例で、以降は`plt`で呼び出すことができます。

```python:matplotlibのインポート
import matplotlib.pyplot as plt
```
Jupyter Notebookの場合は、ノート内にグラフを表示させるために、マジックコマンドも実行しておきます。

```python:matplotlibのインポート
import matplotlib.pyplot as plt
%matplotlib inline
```
マジックコマンドの意味は分からなくてもOKですが、気になる方は以下の記事をチェックしてみてください。

https://www.yutaka-note.com/entry/matplotlib_inline

## 2. データの準備
今回は`numpy`の`ndarry`を使用してsin関数のグラフを描画してみます。
`numpy`も外部ライブラリであるため`pip`か`conda`でインストールが必要となります。

また、`numpy`は`np`で略称することが慣例となっています。
```python:データの準備
import numpy as np
x = np.linspace(0,2*np.pi)
y = np.sin(x)
```
`linspace()`は指定した区間を等間隔に区切った配列を生成することができます。

## 3. グラフの作成
グラフは`plt.plot()`で描画することが可能です。
| 変数名 | 説明 |
|:---:|:---:|
|`x`| 0から2$\pi$までの配列 |
| y| 配列xに対応したsinの値が格納された配列|

* `plt.plot(x,y)` # x,yの配列からグラフを描く

```python:グラフの作成
plt.plot(x,y)
plt.show()
```
![sin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2242763/a302dce9-ddba-b87e-0055-c75d36316889.png)
グラフを作成することができました。

## コード一覧
ステップ1～3をまとめたものを以下に示します。
```python
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

x = np.linspace(0,2*np.pi)
y = np.sin(x)

plt.plot(x,y)
plt.show()
```
# おわりに
今回は`matplotlib`の基本的なグラフ描画について説明しました。
今後は細かいグラフ設定についてまとめていきたいと思います。
何かあればコメントお願いします。
Tailwind CSS



| PHP    | laravel |
|--------|---------|
| 7.4.11 | 8.83.5  |

<br>
まず、インストール。

```bash
npm install -D tailwindcss@latest postcss@latest autoprefixer@latest
```
次にconfigファイルを作る。
```bash
npx tailwindcss init -p
```
tailwind.config.jsを編集。
```tailwind.config.js
 // tailwind.config.js
  module.exports = {
-   content: [],
+   content: [
+     './resources/**/*.blade.php',
+     './resources/**/*.js',
+     './resources/**/*.vue',
+     './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
+   ],
    theme: {
      extend: {},
    },
    plugins: [],
  }
```
```webpack.mix.js
  // webpack.mix.js
  mix.js("resources/js/app.js", "public/js")
    .postCss("resources/css/app.css", "public/css", [
+     require("tailwindcss"),
    ]);
```
```./resources/css/app.css
/* ./resources/css/app.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
```

watchの時は

```bash
npm run watch
```

production時は

```bash
npm run prod
```

cssが反映されない時はtailwind.config.jsからmodeの部分を消去、追加を繰り返す
AtCoder ABC246


# A問題

長方形の3点の座標が与えられる。残りの一点の座標を求めるも問題

- 排他的論理和の以下の性質を使用する。
  - a ^ a = 0
  - a ^ 0 = a
  - a ^ (b ^ c) = (a ^ b) ^ c
 
```python
#それぞれの座標を(x1, x1), (x2, y2), (x3, y3)とする。

x_ans = x1 ^ x2 ^ x3
y_ans = y1 ^ y2 ^ y3
print(x_ans, y_ans)
```

なおif式でも普通に回答可能

```python
x_ans = 0
y_ans = 0

if (x1 == x2):
    x_ans = x3
elif (x2 == x3):
    x_ans = x1
else:
    x_ans = x2

if (y1 == y2):
    y_ans = y3
elif (y2 == y3):
    y_ans = y1
else:
    y_ans = y2

print(x_ans, y_ans)
```


# B問題
原点から点(A, B)方向に向かって長さが1になる点の座標を求める問題

- 原点と点(A, B)の線分の長さをdとすると、求める点の座標は(A/d, B/d)となる。

```python
# A, B
import math
d = math.sqrt(A*A + B*B)

x = A / d
y = B / d

print(x, y)
```


# C問題

- N個の商品の値段Anが分かっている。
- X円分のクーポンをK毎持っていて、一つの商品に対して、0枚以上のクーポンを使用することができる。
- クーポンを使用すると値段aの商品に対して、max{a-kx, 0}で購入できる。
- 一番安く購入できるとすると、何円になる？

max{a-kx, 0}なので例えば10円のクーポンが1枚あり、9円の商品、8円の商品がある場合9円の商品にクーポンを使用したほうが支払総額は8円で済む。

方針は以下
- 各商品の値段とクーポンの値段(X)の商を求める。
  - 割り切れた分はクーポンが残っているのならば使う。(1)
- 各値段の値段とクーポンの値段(X)の余りを求める。
  - (1)でクーポンが残っている場合、余りが小さい商品にクーポンを使用する。

```python
# N, K, X    N: 商品の数、K: クーポンの数、X: クーポンの値段
# A  A: 各商品の値段リスト

sum_A = 0 # クーポンを使用しない場合の値段の合計
used = 0 # 余りなしに使用したクーポンの数
rem_list = # // 余りを格納する

for i in A:
    sum_A += i
    div = i
    temp_used = used
    rem = i % X
    if (rem != 0):
        rem_list.append(rem) 
    if div == 0:
        continue

    # クーポンの残り枚数を考慮する。
    if temp_used + div > K:
        used = K # クーポン数が足りないのですべて使用したとする。
        continue
    used += div

# 余りの昇順
rem_list.sort(reverse=True)

if (used == K):
    # 使用できるクーポンがもうない場合
    print(sum_A - K * X)
else:
    # 使用できるクーポンがある場合
    # 余りが少ない商品に適用する。
    remainK = K - used # 残りクーポン枚数
    sub = sum(rem_list[:remainK])
    print(sum_A - used * X - sub)

```

なるべく単一ループで済むように実装してたら結構実装に時間がかかった。

# 感想

約一年ぶりにAtCoderやってみた。
C問題までは何とか解けた。
ただ特にアルゴリズムとを使わなくてもできる問題だったから運が良かったのかも。。
アルゴリズムしっかり勉強していくぞ✌️
(D以上も解説できるように頑張ります。。)
40 代おっさんAPIを学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## APIとは

Application Programming Interfaceの略
他社が提供するサービス内の情報や機能を扱えるようにする仕組み

### APIの流れ

他社の情報を蓄えているサーバーがあるとします。
そこに情報が欲しいとリクエストを投げて
サーバーがリクエストした内容を返す（レスポンスを返す）

またほかにも、機能を使える仕組みもある

## Web APIとは

HTTP/HTTPSベースで実現するAPI
Webを介して使用するAPI

## RESTful API(REST API)とは

RESTの原則に従って実装されているAPI

### RESTとは

分散システムにおいて複数のソフトウェアを連携させるのに適した設計原則の一つ
4つの原則から成り立っている

アドレス可能性
ステートレス性
接続性
統一インターフェース

#### アドレス可能性

１つのURIを用いてすべての機能を表現できるようにすること

#### ステートレス性

すべてのリクエストが完全に分離していて、セッションなどの状態管理は行われないこと

つまり、1回目と2回目のリクエストは完全に分離しており、リクエスト間は影響を及ぼさない

#### 接続性

情報に別の情報へのリンクを含めることができることを指し、リングを含めることで別の情報に接続することが可能になる

#### 統一インターフェース

情報の取得、作成、更新、削除と言った操作一式はすべてHTTPメソッドを利用

GET:データを取得する
POST:データを新規作成する
PUT:データを更新する
DELETE:データを削除する

## APIを活用するメリット、デメリット

### メリット

#### 開発の効率化、コスト削減

・すべての機能を用意する必要がないため、開発にかかる時間、コストを削減できる
・特定の領域に特化した企業がAPIを提供している場合が多く、ハイクオリティな機能を実装できる

#### セキュリティ・顧客満足度の向上

・APIを利用することで、様々なデータや機能を自社で保有することなく活用でき、セキュリティ面の向上を図ることができる
・自社で用意する必要がないため、低コストで機能を実装でき、価格を抑えたサービス提供を行うことが可能

#### システム変更による影響の最小化

・自社で様々な機能を実装している場合、何かの仕様変更を元に、大部分を書き換えなければいけないケースがあるが、APIであればその影響が最小化できる

### デメリット

#### API提供サービスに依存してしまう

・料金体系の変更やAPI提供の中止によってサービスが成り立たなくなってしまう場合やAPIの仕様変更などで不具合が生じてしまう
・自社サーバーに問題がなくても、API提供側のサーバーに障害が発生すると利用できなくなってしまう

## APIエコノミーとは

APIを活用して広がる経済圏のことで、API公開によって自社だけでなく、他者サービスとの連携により広がっていく商圏（経済圏）

## APIを提供する理由

・サービス連携しビジネスの拡大
・技術をブラックボックス化したまま収益を拡大できる

### 参考資料

<https://www.udemy.com/course/python-web-api/learn/lecture/25073250#overview>
API Gatewayを試してみた（REST API）

# 背景・目的
以前、「[API Gatewayを試してみた](https://qiita.com/zumastee/items/1625106991a680cd41a3)」でAPI GatewayをHTTPで作成したが今度はREST APIを作成します。

# 実践
## REST APIの作成
1.REST APIを選択し、「構築」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7a88560a-6603-b236-39ed-339ee6061897.png)

2.以下を入力し、「APIの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/09aca079-1858-0f85-e9de-f4438a5f102f.png)

## リソースの作成
1.プルダウンから「リソースの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e70d9ed4-ff1a-2ac6-926b-f0b043010a11.png)

2.新しい子リソースで、以下を入力し、「リソースの作成」をクリックします。
- リソース名にqiitaを入力
- API Gateway CORSを有効にするをチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/90ed14f5-3e95-04ae-d937-7df8648f332a.png)

## メソッドを作成
1.プルダウンから「メソッドの作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7aa94de7-e0bb-2096-2dba-5c7409a12a69.png)

2.プルダウンから「GET」を選択し、チェックマークをつけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a09fc46d-3349-9f8d-795c-17cb0b118a79.png)

## セットアップ
1.以下を入力し、「保存」をクリックします。
- 統合タイプにLambda関数
- Lambdaリージョンにap-northeast-1
- Lambda関数にexternal_request_func
- デフォルトタイムアウトの使用にチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/718121a0-ed87-780c-fb86-ccd15973aa5e.png)

## テスト
1.テストをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5ea9540f-e212-7c37-4327-f4433900522a.png)

2.「テスト」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/54bb1135-1cb8-1545-206e-ea047009cbda.png)

3.以下を確認します。
- ステータスが200になっていること。
- レイテンシが数秒程度
- レスポンス本文に{"message","finish!"}が表示されること。
- ログに「Successfully」が表示されること。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/aebbc39f-6e9a-550a-2d65-b28cb9e9908d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/779ef00a-e150-b76c-2998-ad41358376d0.png)

### APIのデプロイ
1.アクションのプルダウンから「APIのデプロイ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4bd4e6a6-41a1-1b95-cb5c-32b48526ea66.png)

2.以下を入力し、「デプロイ」をクリックします。
- デプロイされるステージに「[新しいステージ]」を選択
- ステージ名に「test」
- ステージの説明に「GET on qiita only」
- デプロイメントの説明に「initial deployment」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/06a3cc0b-3473-bdf8-f122-47e0c714053c.png)

### httpsからアクセス
1.以下のURLでアクセスすると、表示されました。
```
https://XXXXXXX.execute-api.ap-northeast-1.amazonaws.com/test/qiita
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ce605b3b-af38-775c-acf6-7cc0cae88c56.png)

2.DDBを確認します。直近の実行結果が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8e3cf6bf-b164-1932-bb5f-2c4bb883e2e2.png)

# 参考
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-create-api-step-by-step.html
NVIDIAのRAPIDSでcuML, cuDF, cuGraphを試してみる

# RAPIDSとは

RAPIDSは一言でいうとGPUのパワーでデータ処理を高速化するNVIDIAが用意しているライブラリです。
データサイエンスでよく使われるライブラリと対応しています。

| RAPIDS     | 対応ライブラリ |
|:----------:|:-------------:|
| cuDF       | Pandas        |
| cuML       | scikit-learn  |
| cuGraph    | NetworkX      |


https://www.nvidia.com/ja-jp/deep-learning-ai/software/rapids/

https://blogs.nvidia.co.jp/2020/06/22/big-data-analytics-tpcx-bb/

![TPCx-BBベンチマーク](https://blogs.nvidia.com/wp-content/uploads/2020/06/rapids-running-672x361.png)
TPCx-BBのベンチマークは、30のクエリでの結果です。16台のDGX A100システム上でRAPIDSを実行することで、10TBのテストでは、クエリごとに上記のような相対的なパフォーマンス向上を実現しています。

# Dockerで環境設定

dockerhubにRAPIDSのdocker imageがありますので利用します。

https://hub.docker.com/r/rapidsai/rapidsai/

2022年4月3日現在下記コマンドでjupyter labを起動します。

``` shell
docker pull rapidsai/rapidsai:22.02-cuda11.0-runtime-ubuntu18.04-py3.8
docker run --gpus all --rm -it -p 8888:8888 -p 8787:8787 -p 8786:8786 rapidsai/rapidsai:22.02-cuda11.0-runtime-ubuntu18.04-py3.8
```

http://localhost:8888/lab をブラウザで開くと下記の通り、あらかじめtutorialなどが格納されたフォルダが用意されています。

![jupyter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271789/f30ab4e8-40dc-a242-84d2-ff827f1331da.png)


# 試しに動かす

試しに cuml/random_forest_demo.ipynb を動かしてみます。

| 処理      | Scikit-learn Model | cuML Model |
|:---------:|------------------:|------------:|
| Fit       | 38.8s             | 1.31s       |
| Evaluate  | 25.4ms            | 306ms       |

Evaluete は m秒単位で遅くなっていますが、Fitが秒単位で圧倒的に早いですね。


# Benchmarkを動かす

githubにあるBenchmarkを動かす。
Docker起動後に下記でクローンして、データセットをダウンロードしておく。

``` bash
mkdir rapidsai
cd rapidsai
git clone https://github.com/rapidsai/cugraph.git
cd cugraph/notebooks/cugraph_benchmarks/
sh ./dataPrep.sh
```

rapidsai/cugraph/notebooks/cugraph_benchmarks/bfs_benchmark.ipynb を実行する。
実行結果として表示されるグラフは下記の通り。
環境にもよるかと思いますが、なんと100～600倍ほどの高速化がされます。
CPUの処理時間がかかるので、処理に20分くらいかかりました。

![BFS Performance Speedup](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271789/05f136ea-5e6a-4570-cdc7-c89d4643a37b.png)

rapidsai/cugraph/notebooks/cugraph_benchmarks/louvain_benchmark.ipynb を実行して、表示されるグラフは下記の通り。
cuGraphはいずれの処理も2秒以内で終わっていますが、CPU側で2時間以上かかりました。
圧倒的じゃないか、わが軍は！

![Performance Speedup: cuGraph vs NetworkX](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271789/8037117d-70dd-e7e2-51a9-36fb9881ba6f.png)


rapidsai/cugraph/notebooks/cugraph_benchmarks/sssp_benchmark.ipynb を実行して、表示されるグラフは下記の通り。
cuGraphはいずれの処理も1秒以内で終わっていますが、CPU側で20分ほどかかりました。
単一始点最短路問題(SSSP)

![SSSP Performance Speedup of cuGraph vs NetworkX](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271789/e9c3845d-e9ed-3a4e-631a-419dfe825559.png)
アルゴリズムの速さ

## 時間計算量
アルゴリズムの速さを決めるものには空間計算量と時間計算量があります。
違いとしては、
➀時間計算量（処理時間の計算量）
➁空間計算量（メモリ使用量の計算量）
単に計算量（オーダー）と言った場合、時間計算量のことを指します。

## O(オー)記法
時間計算量を考えるとき、O記法というのがあります。
O記法とは、そのアルゴリズムがどれくらいの計算量になるのかをザックリ示すものです。
計算結果は、大体この辺の計算量に落ち着くだろう、というものです。

対数をつかったり、使わなかったりすることで計算量が変わってくることが多々あります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/7c37bcdd-573e-5c99-dccb-954b503a0a97.png)
https://www.google.com/url?sa=i&url=http%3A%2F%2Fsevendays-study.com%2Falgorithm%2Fex-day1.html&psig=AOvVaw0x1McBE72gSInQyfF43EaV&ust=1649055804570000&source=images&cd=vfe&ved=0CAwQjhxqFwoTCMCGxd6p9_YCFQAAAAAdAAAAABA6 より引用

基本的にO(logn)を使うことでnの数が増えても、処理速度は減らないような気がしました。

## 3つのアルゴリズムの計算量
代表的な3つのアルゴリズムをもとに計算量を比べていこうとおもいます
### バブルソート
バブルソートをよく知らないという方は[こちら](https://wa3.i-3-i.info/word14886.html)を参考にしてみてください。
バブルソートは、以下の画像のような流れに沿って行われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/ff7fde97-5d99-5688-6a0f-3b851c272aea.png)
https://www.google.com/url?sa=i&url=https%3A%2F%2Ffree-engineer.life%2Fbubble-sort%2F&psig=AOvVaw1gkzZoK9sYmMxNk1Y7_Zo1&ust=1649056471298000&source=images&cd=vfe&ved=0CAwQjhxqFwoTCKiAyJ6s9_YCFQAAAAAdAAAAABAU より引用

計算量は1個ずつ減っていってることが分かりますね。
データサイズがn個だとすると、```n-1```,```n-2```,```n-3```,となっていき、計算量は```O(n^2)```となります。
先ほどの例を見ても、たしかにデータ量の2乗分の計算量を持っていますね。
これだとデータ量が10になっただけで、100の計算量を持ってしまうので、あまりいいアルゴリズムではないですね。

### 選択ソート
選択ソートが分からない方は[こちら](https://wa3.i-3-i.info/word18246.html)をご覧ください。
こちらもバブルソートと同じく計算量は```O(n^2)```となります。ですが、バブルソートより交換回数が少ないので、バブルソートよりも処理速度は速いです。

### クイックソート
クイックソートが分からない方は[こちら](https://wa3.i-3-i.info/word16752.html)をご覧ください。
計算量は```O(nlogn)```となります。クイックソートは効率がよいアルゴリズムですが、このアルゴリズムにもデメリットはあります。
ピボットをどこにするかで効率は決まってしまいますが、この的確なピボットを計算するのが大変らしいです。

【参考記事】

https://qiita.com/asksaito/items/59e0d48408f1eab081b5

https://qiita.com/drken/items/872ebc3a2b5caaa4a0d0