OmniAICreator/Qiita-1.07M huggingface dataset:
データサイエンスのための微分積分 第19回 連続関数の演算と初等関数の連続性

:::note info
本記事は数学講座[2.18連続関数の演算と初等関数の連続性](https://www.matongxue.com/lessons/591/parts/965)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::

# 和、差、積、商の連続性

**定理:** 
関数 $f(x)$ と $g(x)$ が $x_0$ で連続であるとき、それらの和（差） $f±g$、積 $f・g$ および商 $\displaystyle\frac{f}{g} (g(x_0) ≠ 0$) も $x_0$ で連続です。

# 逆関数の連続性

**定理:** 
関数 $y=f(x)$ が区間 $I_x$上で**狭義単調増加（または単調減少）かつ連続** である場合、その**逆関数** $x=f^{-1}(y)$ も対応する区間 $I_y={y|y=f(x),x\in I_x}$ 上で**狭義単調増加（または単調減少）かつ連続**です。

# 合成関数の連続性

**定理1:** 
関数 $y=f[\ g(x)\ ]$ が関数 $u=g(x)$ と関数 $y=f(u)$ の合成であり、$y=f[\ g(x)\ ]$ が $\mathring{U}(x_0)$ で定義されている場合、$\displaystyle\lim_{x\to x_0}g(x)=u_0 $であり、関数 $y=f(u)$ が $u_0$ で連続であるならば、次のようになります：
$\displaystyle \lim_{x\to x_0}f[\ g(x)\ ]=\lim_{u\to u_0}f(u)=f(u_0)$

また、以下のようにも表記できます（つまり、$\displaystyle\lim_{x\to x_0}$ の記号は連続関数 f を貫通することができます）：
$\lim_{x\to x_0}f[\ g(x)\ ]=f[\lim_{x\to x_0}g(x)]=f(u_0)$

**定理2:** 
関数 $y=f[\ g(x)\ ]$ が関数 $u=g(x)$ と関数 $y=f(u)$ の合成であり、$y=f[\ g(x)\ ]$ が $\mathring{U}(x_0)$ で定義されている場合、関数 $y=g(x)$ が $x_0$ で連続であり、$g(x_0)=u_0$ であり、また関数 $y=f(u)$ が $u_0$ で連続であるならば、関数 $y=f[\ g(x)\ ]$ も $x_0$ で連続です。



# 初等関数の連続性

下記の表中の関数は、**基本初等関数（Basic elementary functions）** と呼ばれ、全ての**基本初等関数**が自然定義域上で**連続関数**であることが証明されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/4eb76fe1-52de-8578-4b7e-1a04cd39f284.png)

定数と基本初等関数の有限回の四則演算と有限回の合成で構成され、また一つの式で表される関数を**初等関数（Elementary functions）** と呼びます。例えば：

$y=\sqrt{1-x^2},\quad y=\sin^2 x,\quad y=\ln\sin x$

連続関数の和、差、積、商の連続性および合成関数の連続性により、**初等関数**も自然定義域上で**連続関数**であることがわかります。

# 極限解の例題

**例1:**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/95190195-2c82-039c-0a17-47287fdc3ead.png)

**例2:**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/54cc51cf-6d14-cb33-a54c-6da7cbdd37b1.png)


# 参考情報

https://ja.wikipedia.org/wiki/%E5%88%9D%E7%AD%89%E9%96%A2%E6%95%B0
GitHubEducationの申請に苦戦した話

# はじめに
GitHub Educationを申請したけど、通らなくて困ったので、他の人がこの記事を見て解決できればと思います。github educationとは何かとかは他の記事を見てください。エラー文は出てくるのでそれ読んで対処すれば大体大丈夫。実際に通った事例載せときます。

## 申請した際の状況について
* githubを使うだけでプロフィール何もいじってない
* 学生証が裏と表に必要な情報が載っている
* 通信制大学生

## 申請が通らなかった理由(概要）
* プロフィール充実させてね
* アップロード写真には学校名がないよ
* あなたの位置情報的に近くに大学ないよ(あんまり気にしなくて良い？)*1
* 画像ファイルアップロードだけど、信用できないからダメ
* 日本語わからん、英語にしてくれ

*1 あなたの位置情報と大学の位置情報が合わないと言われた。学生証に通信制と書いていなければならないらしい。しかし、うちの学生証には記載はなかった。けど、通ったのであまり気にしなくていいかも？

## 解決方法
### プロフィール充実させてね
プロフィールに学生証に載っている氏名、学校名を記載する必要があるみたいでsettingsから
1. プロフィールのnameに自分の実名を記載
2. Bioに「I'm studing in 〇〇 Univercity」を記載

### 「アップロード写真には学校名がないよ」と「日本語わからん、英語にしてくれ」
裏だけだと学校名が載ってなかったから通らなかった。なので、PowerPointに裏と表の写真貼り付けた。ついでに、有効期限の英語訳「Expires on March 31,2024」を追記して、名前も英語にしてみた。学生証の余ったスペースに追記した。

### 画像ファイルアップロードだけど、信用できないからダメ
これは、パソコンの画面にPowerPoint全画面表示させて、携帯でgithubログインして直接撮りました。

# まとめ
とりあえずのメモで書いたので、理解できないかもしれないけど許してね。TwitterのDMとかコメントしてもらったら直します。バイバイ
Java 配列の要素を比較する方法

Javaの学習で配列の比較をする時、つまずいた部分について記事にしたいと思います。

# equalsとdeepEqualsについて

このような配列が二つ存在する場合、配列の要素の数が同じかつ、インデックスの要素が正しいか確認したい時があるかと思います。

```java
int[] a = {85, 78, 92};
int[] b = {85, 78, 92};
```
Javaの場合、等価演算子で配列の中身を比較することができず、equalsメソッドを使って比較することができます。

```java
//java.util.Arraysのインポートが必要です
import java.util.Arrays;

int[] a = {85, 78, 92};
int[] b = {85, 78, 92};

//aとbの配列を比較し要素数と値が正しければtrueがisEqualに入ります
boolean isEqual = Arrays.equals(a, b);

if (isEqual) {
    // 配列が等しい場合の処理
    System.out.println("配列は等しいです。");
} else {
    // 配列が等しくない場合の処理
    System.out.println("配列は等しくありません。");
}

```
まだ使用したことないですが、多次元配列は、deepEqualsで確認することが可能みたいです。

```java
int[][] array1 = {{1, 2}, {3, 4}};
int[][] array2 = {{1, 2}, {3, 4}};

boolean isEqual = Arrays.deepEquals(array1, array2);

if (isEqual) {
    // 配列が等しい場合の処理
    System.out.println("配列は等しいです。");
} else {
    // 配列が等しくない場合の処理
    System.out.println("配列は等しくありません。");
}
```
使う機会がありましたら使ってみようかなと思います。



# PHPは等価演算子のみで配列の中身を確認できる

PHPでは、等価演算子(==)を使用すれば、配列の要素数と値が同一かどうか確認することができます。

```php:index.php
<?php
 
$fruits1 = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$fruits2 = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
 
if ($fruits1 == $fruits2){
  echo '等しいです';
} else {
  echo '等しくないです';
}
 
?>
```

# まとめ
PHPを使って2年ほど開発していたので、ついついPHPの書き方で書いてしまいます。

Javaの型宣言はPHPにはないので最初戸惑いましたが、変数に何が入ってるのか分かるので第三者がコードを見た時にすぐに理解できる点がJavaの良い所かなと個人的に思いました。
NodeREDのパレット文字の日本語化

# はじめに
NodeREDのパレットの文字を低学年向けに日本語化したい要望あり。
Chrome　Extensionの勉強がてらする。

# Chrome Extension

## まずファイルの準備から
NodeRedJpPaletteフォルダを作り、その中にmanifest.js とcontent.jsを用意する。
```manifest.json
{
  "name": "NodeRedJpPalette",
  "version": "1.0.0",
  "manifest_version": 3,
  "content_scripts":[{
    "matches":["http://localhost/*"],
	  "run_at": "document_idle",
    "all_frames": true,
    "js":["content.js"]
  }]
}
```
```content.js:javascript
window.addEventListener("load", main, false);

function main(e) {
	const jsInitCheckTimer = setInterval(jsLoaded, 1000);

	function jsLoaded() {
		if (document.querySelector('.red-ui-palette-label') != null) {
			clearInterval(jsInitCheckTimer);
			
			let elements1 = document.getElementById('red-ui-palette');
			let elements2 = elements1.getElementsByClassName('red-ui-palette-label');
			let len = elements2.length;
			
			for (let i = 0; i < len; i++) {
				if(elements2[i].textContent=="inject")elements2[i].textContent="インジェクト";
				if(elements2[i].textContent=="debug")elements2[i].textContent="デバッグ";
				if(elements2[i].textContent=="complete")elements2[i].textContent="コンプリート";
				if(elements2[i].textContent=="catch")elements2[i].textContent="キャッチ";
				if(elements2[i].textContent=="status")elements2[i].textContent="ステータス";
				if(elements2[i].textContent=="comment")elements2[i].textContent="コメント";
				if(elements2[i].textContent=="function"){
					elements2[i].textContent="ファンクション";
					elements2[i].setAttribute('style',"font-size:smaller")
				}
				if(elements2[i].textContent=="switch")elements2[i].textContent="スイッチ";
				if(elements2[i].textContent=="change")elements2[i].textContent="チェンジ";
				if(elements2[i].textContent=="range")elements2[i].textContent="レンジ";
				if(elements2[i].textContent=="template"){
					elements2[i].textContent="テンプレート";
					elements2[i].setAttribute('style',"font-size:smaller")
				}
				if(elements2[i].textContent=="delay")elements2[i].textContent="ディレイ";
				if(elements2[i].textContent=="trigger")elements2[i].textContent="トリガー";
				if(elements2[i].textContent=="exec")elements2[i].textContent="実行";
				if(elements2[i].textContent=="filter")elements2[i].textContent="フィルター";
			}
		};
	}
}

```
## インストール
後は　ブラウザの開発者モードをONにして　Edgeなら"展開して読み込む"を,
Chromeなら"パッケージ化されていない拡張機能を読み込む"押してフォルダを指定

NodeRedを起動して確認します。

## 項目の追加
すみません。全部の項目をしていません。
フォルダー内のcontent.jsを書き換えて、ブラウザの拡張機能で再読み込みをすれば機能が更新されます
【メモ】オブジェクトを配列に変換とsort()【Object.entries()】

今回、下記について調べてみました。
1. オブジェクト型を配列に変換する方法
2. 配列の要素を参照した上でソートする方法

## オブジェクト型を配列に変換する方法
```js
// サンプルのオブジェクト
const obj = { 
    A: 3000, 
    B: 9000, 
    C: 6000,
}

// オブジェクトを配列に変換
const sortedEntries = Object.entries(obj)
// [ [ 'A', 3000 ], [ 'B', 9000 ], [ 'C', 6000 ] ]
```

これで、オブジェクト型から配列型への変換に成功しました。

## 配列の要素を参照した上でソートする方法

### `sort()`関数
`sort()`関数で配列の要素を並び替えることができます
```js
// 2つの引数はどちらも配列の要素として引数を受け取り、比較、計算する
配列.sort(a, b) => b[1] - a[1]
```
`b[1] - a[1]`の結果次第で順番を変えていく

### 実際に`sort()`してみた
```js
// オブジェクトの数値型のvalueの降順にソートした上で変換する場合
const sortedEntries = Object.entries(obj).sort((a, b) => b[1] - a[1])
// [ [ 'B', 9000 ], [ 'C', 6000 ], [ 'A', 3000 ] ]

// もし昇順にするなら
const sortedEntries2 = Object.entries(obj).sort((a, b) => a[1] - b[1])
// [ [ 'A', 3000 ], [ 'C', 6000 ], [ 'B', 9000 ] ]
```
これで、内側の配列の1番目の数値の大きさを参照した上で、内側の配列の順番が昇順または降順でソートされるようになりました。

今回の`.sort((a, b) => a[1] - b[1])`の場合、
戻り値`a[1] - b[1]`の結果が正の数なら昇順、
戻り値`a[1] - b[1]`の結果が負の数なら降順でソートしてくれます。

## まとめ
引数の値を参照し、計算した結果の戻り値が正か負か、でソートの条件が変化する、ということですね。

これで、並び替えに成功しました。
Azureアプリケーションプロキシ経由でProxmoxにアクセスする（一部制約あり）

脱VPNとして手軽なAAP経由で、Proxmoxにアクセスをためしてみたいと思います。

:::note info
**結論**
- Web GUIに接続自体はできるが、VMへのコンソール接続ができない。
- WebSocketの利用に制約があることが原因。
:::
# AAP Connectorのインストール
WindowsServerにインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/c7953d3a-1d01-97f6-dcb2-4c8ad300afd4.png)
AADアカウントでログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/0592bb17-efe2-9054-34d6-af05e77d8e40.png)
2つのサービスが動いていればOKです。
```.ps1
Get-Service | where {$_.DisplayName -like "*AAD*"} | ft -autosize -wrap
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/138a3e84-328c-66cf-d1aa-d1e1c8a10698.png)
Azureポータルに登録されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/43be74b8-d63e-f3e7-4a7d-4723760f5892.png)

# hostsにルートの登録
```.ps1
Add-Content $env:SystemRoot\System32\Drivers\etc\hosts  "192.168.100.150 proxmox.local"
Get-Content $env:SystemRoot\System32\Drivers\etc\hosts
Start notepad "C:\Windows\System32\drivers\etc\hosts"
```
コネクタサーバーのhostsにProxmoxへのルートを追記します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/c86b8dd1-09ae-ea91-6a70-89851c8bdd63.png)


# オンプレミスアプリの登録

ポータルからオンプレミスアプリの登録をします。このあと、ユーザ権限も追加が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/76532ba8-6e31-000c-57d9-8f2038fe398b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/c3fad5dc-5ad8-7857-9c09-c365a55709fe.png)


# アクセスのテスト
BadGatewayエラーが出ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/f4e9e2ef-f151-2947-7a71-0f173466fa22.png)

こちらのサイトによると、SSL関連のエラーらしいので「バックエンドSSL証明書を検証する」のチェックを外します。

https://seesmitty.com/easy-setup-for-azure-ad-application-proxy-a-beginners-guide/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/77086707-311d-016c-3b93-d400e9fb2a7f.png)


アクセスできました。しかし読み込みが止まったりちょっと挙動がおかしいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/2dda0ef8-0c8f-55c0-088f-45da9e2b461e.png)


# コンソール接続でエラー

SSH/VNCでVMを見ようとするとエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/d635a117-7a78-613f-28dc-787fc9cb5e56.png)

こちらの公式説明によるとWebSocketはいろいろ制約があるとのこと。
https://learn.microsoft.com/ja-jp/azure/active-directory/app-proxy/application-proxy-faq#websocket

:::note warn
# Azure AD アプリケーション プロキシでは WebSocket プロトコルはサポートされますか。

WebSocket プロトコル (QlikSense やリモート デスクトップ Web クライアント (HTML5) など) を使用するアプリケーションがサポートされるようになりました。 既知の制限事項には、次のようなものがあります。

- アプリケーション プロキシでは、**WebSocket 接続を開く際に、サーバー応答に設定されている Cookie を破棄**します。
- WebSocket 要求に SSO は適用されません。
- Windows Admin Center (WAC) の機能 (イベント ログ、PowerShell、リモート デスクトップ サービス) は、Azure AD アプリケーション プロキシ経由では動作しません。
:::

# まとめ
- 仕様なのでAAP経由でProxmoxのコンソール接続はできなそうです。HTML5はOKとのことなので**Apache Guacamoleなどを挟むか、またはネットワーク的な対策**が必要です。
- もし解決策をごぞんじでしたら教えていただけるとありがたいです。

# 参考にさせていただいたサイト
https://learn.microsoft.com/ja-jp/azure/active-directory/app-proxy/application-proxy-faq#websocket

https://seesmitty.com/easy-setup-for-azure-ad-application-proxy-a-beginners-guide/
プログラマーへの道 #12 無名関数とアロー関数（プログラミング入門）のメモ

# 参考にした動画
https://youtu.be/CcUk46e6TDk

# 学んだこと
・[関数 | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Functions)
・無名関数
・アロー関数



# 関数
・変数に代入できる。
・複数の処理をまとめて実行するためのブロック。
・関数は名前を持っていて、必要なときに呼び出すことや再利用ができる。
・関数を修正する必要がある場合、関数単位で変更を行うことができてメンテナンスし易い。

```html
<html>
	<body>
		<button id="id-button">my button</button>
	</body>
	<script>
		btn = document.getElementById("id-button")
		btn.addEventListener("click",clickedButton)

		function clickedButton(){
			alert("clicked button")
		}
	</script>
</html>
```
<b>ブラウザ</b>

![スクリーンショット 2023-06-01 21.07.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/a88fa2a0-27e3-7aae-b2ea-6361b1c36c3f.png)



# 無名関数（名前の無い関数）
・無名関数は必要な箇所で直接定義するので、コードがコンパクトになり、コードの見通しがよくなる。
・変数に代入できる。
・無名関数はその場限りの使用が主な役割のため、他の場所で再利用することができない。
・無名関数に名前が無いので、エラーメッセージに具体的な情報が表示されないことがあり、デバッグやテストが困難になる場合がある。
```html
<html>
	<body>
		<button id="id-button">my button</button>
	</body>
	<script>
		btn = document.getElementById("id-button")
		btn.addEventListener("click",function(){
			alert("test")
		})
        //clickedButton関数は動かない
		function clickedButton(){
			alert("clicked button")
		}
	</script>
</html>
```
![スクリーンショット 2023-06-01 21.02.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/8801ee3a-57c9-4f23-33f9-ea0b76bce24a.png)

# アロー関数
・関数のシンタックスシュガー（省略記法）である。
```html
<html>
	<body>
		<button id="id-button">my button</button>
	</body>
	<script>
        //リロードするとclickedbutton,testの順番でアラートが出力される。
		clickedButtonHennsuu = () => alert("test")

		function clickedButton(hensuu){
			alert("clicked button")
			hensuu()
		}

		clickedButton(clickedButtonHennsuu)
	</script>
</html>

```

![スクリーンショット 2023-06-03 19.39.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/27b3b19c-759e-0555-e16c-7a621017f598.png)
![スクリーンショット 2023-06-03 19.40.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/25071158-cc30-7e85-04c2-a78f379ab77c.png)

# やりたいことメモ
リロードではなくてボタンをクリックしたらアラートを出す方法を知りたい
【Firebase】Functionsでcollectionを削除

## 課題
Firebaseを利用してユーザーが退会することをトリガーとしてユーザーが作成したFirestoreのデータを削除したい

## 問題
Firestoreにデータを入力する際にcollectionの名前をfirebase authのUIDに設定していた。しかしCollectionを指定して直接削除する関数は存在しなかった。

## 解決法
Collectionのすべてのdocumentを持ってきて、それを反復処理を通して削除する。

## コード

```typescript
import * as admin from "firebase-admin";
import * as functions from "firebase-functions";

export const deleteUserData = functions.auth.user().onDelete(async (user) => {
  const db = admin.firestore();
  const uid = user.uid;
  const collectionRef = db.collection(uid);

  return collectionRef
    .get()
    .then((snapshot) => {
      const batch = db.batch();
      snapshot.forEach((doc) => {
        batch.delete(doc.ref);
      });
      return batch.commit();
    })
    .catch((error) => {
      console.error("Error deleting collection: ", error);
    });
});
```
バージョンの古いnginxをインストールする

業務で最新のnginxではなく古いnginxを構築する時に実施した手順とはまりポイントを記載しておきます。

# nginxのモジュール取得
[こちら](https://nginx.org/download/)にて最新版から初期のモジュールまで全て取得可能です。
zipファイルはexeファイルとなっています。
Linuxで構築する場合はtar.gzのファイルを使用することになります。
~~~
wget https://nginx.org/download/nginx-x.y.z.tar.gz
~~~

# 解凍、configure
解凍
~~~
tar zxvf nginx-x.y.z.tar.gz
~~~
ユーザ、グループ作成
~~~
groupadd nginx
useradd -g nginx -s /sbin/nologin nginx
~~~
configure(必要なモジュールを組み込む)
~~~
cd nginx-x.y.z
./configure --prefix=/usr/local/nginx-x.y.z --user=nginx --group=nginx
~~~
ここで依存関係などで詰まるのでその度に`yum`や`apt`でインストール実施する
~~~
yum search xxxx
yum install xxx
~~~
依存関係を解決できたらインストール
~~~
make & make install
~~~
これで無事完了、、、となるはずが自分の場合依存関係のところでハマりました。

gcc関連のモジュールがないと指摘されたので、yumを実行したのですが
何度やっても変わらない。
そのため、真剣にエラーを読むと下記のようになっていました。
~~~
Error: Package: glibc-headers-x.y.z.x86_64 (base)
           Requires: kernel-headers
Error: Package: glibc-headers-x.y.z.x86_64 (base)
           Requires: kernel-headers >= x.y.z
~~~
先人の知恵を借りるべくGoogle検索をしたところ下記記事がヒット。
[yumのkernel-headers依存エラーを解決（CentOS7）]("https://www.purpledice.jp/yumのkernel-headers依存エラーを解決（centos7）/")
この記事を参考にすると、`/etc/yum.conf`に下記記載があるとkernelのアップデートが除外されてしまうようでした。
~~~conf
exclude=kernel*
~~~
今回自分が使用していた環境は社内で払い出されたVMを使用しており、ユーザ側で勝手に意図しないkernelのアップデートがされないように初期構築で組み込まれていたようでした。
今回はkernelのアップデートが行われないと先に進めないため、一旦コメントアウトにして、先ほどうまくいかなった、`yum install gcc`を実行し無事｀`configure`を通過しました。

依存関係が上手くいかない時は下記が大事であると再認識した次第です。
1 `/etc/yum.conf`を疑う
2 `rpm -qa | grep xxx`でインストール状態を確認する
3 `yum update`を行う

# 補足
nginx起動
~~~
/usr/local/nginx-x.y.z/sbin/nginx
~~~
nginxの停止
~~~
/usr/local/nginx-x.y.z/sbin/nginx -s stop
~~~
confファイルのエラーチェック
~~~
/usr/local/nginx-x.y.z/sbin/nginx -t
~~~
nginxのバージョンや設定パラメータを表示
~~~
/usr/local/nginx-x.y.z/sbin/nginx -V
~~~
参考：[コマンドラインのパラメータ]("http://mogile.web.fc2.com/nginx/switches.html")

nginxの各環境の起動シェル
[NGINX Init Scripts]("http://mogile.web.fc2.com/nginx/switches.html")
Rails：「ActiveStorage + S3」によるエラー（Seahorse::Client::NetworkingError: Failed to open TCP connection to rails-bucket.s3.ap-northeast-1.amazonaws.com:443 (getaddrinfo: Temporary failure in name resolution)）

# 原因不明のエラー対応
ActiveStorageを使ってS3に画像を保存するための環境を構築したところ、以下のエラーが発生して苦労しました。しかし、これらのエラーはローカルのネットワークの問題やAWS側の一時的な障害によるものだと判明し再実行したところ成功しました。原因の詳細は謎のままです。

```bash
% docker-compose run --rm web rails db:seed
[+] Running 1/0
 ✔ Container rails_ec-db-1  Running                                                0.0s
rails aborted!
Seahorse::Client::NetworkingError: Failed to open TCP connection to rails-bucket.s3.ap-northeast-1.amazonaws.com:443 (getaddrinfo: Temporary failure in name resolution)
/myapp/db/seeds.rb:7:in `block in <main>'
/myapp/db/seeds.rb:4:in `times'
/myapp/db/seeds.rb:4:in `<main>'
Tasks: TOP => db:seed
(See full trace by running task with --trace)
```
```bash
% docker-compose run --rm web rails db:reset
[+] Running 1/0
 ✔ Container rails_ec-db-1  Running                                                           0.0s
Dropped database 'myapp_development'
Dropped database 'myapp_test'
Created database 'myapp_development'
Created database 'myapp_test'
rails aborted!
Seahorse::Client::NetworkingError: Failed to open TCP connection to rails-bucket.s3.ap-northeast-1.amazonaws.com:443 (getaddrinfo: Temporary failure in name resolution)
/myapp/db/seeds.rb:7:in `block in <main>'
/myapp/db/seeds.rb:4:in `times'
/myapp/db/seeds.rb:4:in `<main>'
Tasks: TOP => db:reset => db:setup => db:seed
(See full trace by running task with --trace)
```

再実行結果。問題なく成功しました。
```bash
% docker-compose run --rm web rails db:reset
[+] Running 1/0
 ✔ Container rails_ec-db-1  Running                                                           0.0s
Dropped database 'myapp_development'
Dropped database 'myapp_test'
Created database 'myapp_development'
Created database 'myapp_test'
```
```bash
% docker-compose run --rm web rails db:seed
[+] Running 1/0
 ✔ Container rails_ec-db-1  Running
 ```
# まとめ
「S3のバケット名、AWSアクセスキーのポリシーの権限、Rails周りの設定方法に間違いはないか」などエラーの原因を深掘りしていき時間をかなり要してしまいましたが、AWSやアプリ側とは関係ない箇所が原因とわかり、良い教訓となりました。
部活（スポーツの試合）の動画に対し、得点表示を足すのに、字幕機能を使う。字幕用のテキストファイルを作るC#のプログラムを作った。

# 説明

部活（スポーツの試合）の動画だが、得点表示がないとわかりにくい。

得点表示のために動画編集ソフトで編集するのは、たいそうめんどくさい。

（Youtubeなどでも対応している）字幕機能を使うのがよいのではないか、というアイデア。

その、字幕用のテキストファイルを作るC#のプログラムを作った。

 **自動で作成されるわけではなく、動画を見ながら、リアルタイムで手入力するので、その点のめんどくささが、劇的に減るっているわけではない。** 

一発撮りなので、間違うとやり直す羽目になる。（所詮テキストファイルなので、部分修正してもよいが、時間も、得点も累積なので、一か所の修正が、その後全体に影響があるので、やり直した方が早い、というレベル。）


# コンパイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107418/05af5df4-d48d-acd4-b48f-db7b8c803dcf.png)

```
c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /target:exe TokutenJimakuMaker.cs
```

# 実行

引数は、２つで、対戦の２名称を与えてやる。〇〇校 ●●校　みたいに

```
>　TokutenJimakuMaker.exe 紅組 白組 
```

はじまると、直ちに、時間計測がはじまるので、動画再生と同時に、実行する必要がある。

使うキーは、「１」「２」のみ。１で左側、２で右側に点が入っていく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107418/10eb9ce9-5348-aabb-70a5-b7bc08d0b01a.png)

同階層に

```
Out_Jimaku.vtt
```

という、字幕ファイルが出来るので、それを、動画に取り込めばよい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107418/753a34fb-cec9-25e5-d0e6-a23ab0cc5de6.png)




```c#:TokutenJimakuMaker.cs

//c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /target:exe TokutenJimakuMaker.cs
using System;
using System.Diagnostics;
using System.Threading;
using System.IO;
namespace TokutenJimakuMaker
{
class Program
{
static void Main(string[] args)
{
	var stopwatch = new Stopwatch();
	stopwatch.Start();
	string s1 = args[0]; //紅組
	string s2 = args[1]; //白組
	int num =1;
	int v1 =0;
	int v2 =0;

	string preTm = "00:00:00.000";
	string fn = @"./Out_Jimaku.vtt";
	File.WriteAllText(fn, "WEBVTT"+Environment.NewLine+Environment.NewLine);
	ConsoleKeyInfo input;
	do
	{
		input = Console.ReadKey(true);
		if (input.KeyChar == '1' || input.KeyChar == '2')
		{
			TimeSpan ts = stopwatch.Elapsed;
			string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:000}",
				ts.Hours, ts.Minutes, ts.Seconds,ts.Milliseconds );
			string message = num + "\n" + preTm + " --> " + elapsedTime +"\n" + s1 + " " + v1 + " - " + s2 + " " + v2;
			Console.WriteLine("----------------------");
			Console.WriteLine(message + "\n");
			File.AppendAllText(fn, message + "\n\n");
			preTm = elapsedTime;
			num +=1;
			if(input.KeyChar == '1') {v1 +=1;}
			if(input.KeyChar == '2') {v2 +=1;}
			Console.WriteLine("  →  " + v1 + " - " + v2 + "\n");
		}
	} while (input.Key != ConsoleKey.Escape);
}
}
}
```

# 二倍速
ちなみに、動画を２倍速で再生しながら、字幕をつくるなら

```
TimeSpan ts = stopwatch.Elapsed;
ts = ts + ts
```
とすれば、２倍速の字幕になる

# youtube
なら、以下の字幕機能で追加すればよい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107418/6044c58f-20da-458d-dbb8-7e571db2fe81.png)

# 出来上がり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107418/ef382144-da5a-868c-2d7a-c6955dd4e8de.png)


# 蛇足

ちなみに、これ、
ChatGPTに指示出したら、９割ぐらい希望通りのソースを書き出したてくれたので、それを加工した。
便利な世の中である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107418/df59a402-4d1b-72d5-bb5b-45fe86ddc6d4.png)
Git/GitHubの使い方1(入門)

# Git/GitHub
## Git/GiitHubの目的
「いつ」「誰が」「どんな変更をした」といったファイルのバージョン(変更履歴)管理が容易になり、チーム開発もスムーズに行うことができる。 

## 基本知識　
### version管理
ソースコードを初めとしたファイルの変更履歴(version)を管理すること。
これにより、変更箇所の確認(diff)、特定時点の内容に戻す(reset)という操作が可能になります。　
### リポジトリ
version管理において、管理されるファイルと履歴情報が保存される領域のこと。　
****リポジトリで、ファイル/ディレクトリを操作すること****でversion管理が可能にあります。
更に、リポジトリには**localリポジトリ**と**remoteリポジトリ**があります。　
#### localリポジトリ 
ローカル環境下(個々人のPC下)に存在し、ファイルやファイルの変更内容が保存されています。
#### remoteリポジトリ
リモート環境下(ネットワーク上のサーバ等)に存在し、ローカルリポジトリの内容が集約され、開発者全員が共有できるようになっています。　


以下のサイトにわかりやすい図が載っています。


https://tech-blog.rakus.co.jp/entry/20200529/git

### Git
別名「分散型バージョン管理システム」。
複数のリポジトリでファイルのバージョンを管理するシステムのこと。
分散型　：複数人が、個々人でローカルリポジトリで編集し、リモートリポジトリにその内容を反映させる方法。
集中型：複数人が、一つのリポジトリに対して、変更を加えていく方法。

https://dxo.co.jp/blog/archives/10604#

### GitHub
Gitの仕組みを利用した**Webサービス**のこと。
複数人で開発を行うときには、GitHubを使います。

よくGitとGitHubの違いで「メールとgmailの関係性」という説明がされています。　
個人的には、メールはシステムの名称でgmailというサービスを通して、初めてメールという機能を使用できるのに対して、GitはGitHubというサービスを通さなくても使用できるので、あまり説明に納得がいっていません。　
感覚的な理解として、GitHubはGitの機能を拡張し万人に使いやすいようにしているサービスという漠然とした理解を持っています。
また、gitはローカル環境(個々人)での個人でのリポジトリ編集がメインで、githubでは、サーバを通して複数人でのリポジトリ編集がメインと感じます。


## 参考サイト　

https://dxo.co.jp/blog/archives/10604#


https://tech-blog.rakus.co.jp/entry/20200529/git

https://ics.media/entry/15195/
ECMAScript雑学

ECMAScriptって、策定ステップとかどうなってるの？みたいな疑問からお勉強してみた

## ECMAScriptとは
ECMAScript（エクマスクリプト）は、Ecma Internationalもとで標準化されたJavaScriptの規格。
もともとJavaScriptはNetscape社のブラウザで使われる言語として誕生したので、他のブラウザは想定されておらず各ブラウザはJavaScriptを独自に拡張していた。
そのため、JavaScriptはまったく標準化がされていない言語だったが、
これではいろいろ問題があるとして、Netscape社は国際標準化団体のECMAに依頼してJavaScriptのコア部分を標準化した。
これがECMAScriptと呼ばれるものになる。

## Ecmaとは
情報通信システム分野における国際的な標準団体Ecma Internationalの事。

欧州電子計算機工業会（European Computer Manufacturers Association）の略語「ECMA」と呼ばれていたが1994年に「ECMA」に名称が変わったので大文字にせず「Ecma International」と表記されるようになった
JavaScript以外にも色んな分野が話し合われている。

## ECMA-262
ECMAScriptの事
「262」はEcma Internationalでの管理番号

## TC39とは
TCは「Technical Committee」の事。
「TC39」はECMAScriptを策定してる専門委員会のこと。
Ecmaは色々な仕様を策定しているので、その中でECMAScriptを策定してるグループの名前が「TC39」
ちなみに同じくEcma標準化されてるDartは「TC52」

## バージョンについて
1997年から2011年までは、1 - 5.1（4は破棄された）まで通し番号で管理されていたが、2015年に公開されたバージョンから西暦を名称に含めることになった。
2023年5月現在の最新は「ECMAScript® 2022」
最新の草案は「ECMAScript® 2024」
https://tc39.es/ecma262/

## 策定ステップについて
ECMAScriptは各機能を5つの段階に分けて策定される
ECMAScript 2016からは機能ごとに仕様のプロポーザル(提案)を出し策定
それぞれのプロポーザルにはStageと呼ばれる5段階のラベルがある
1年ごとに新しいECMAScript仕様がリリースされる
Stage 4となったプロポーザルは次期ECMAScriptに取り込まれ、正式にECMAScriptの仕様となる

### 5策定ステップ 段階のStage
- 0 Strawman - アイデア
- 1 Proposal - 提案
- 2 Draft - ドラフト
- 3 Candidate- 仕様書と同じ形式
- 4 Finished - 策定完了
次期ECMAScriptは1年ごとに出るので、その時までにStage 4となったものが次期ECMAScriptに入る。

## TC39のプロセスステップ
https://tc39.es/process-document/
ECMAScriptの「0 Strawman」からのTC39でのプロセスは以下のように進む
TC39のGitHubで進捗など見ることができる
https://github.com/tc39

### Stage 0 Strawman
アイディア出し。

### Stage 1 Proposal
プロポーザルの目的や解決方法を示す
Polyfillやデモ等を用いて解説する

### Stage 2: Draft
いわゆるドラフト
ECMAScript標準と同じルールでAPIや構文、セマンティックについて説明していなければならない

### Stage 3: Candidate
仕様は完成した状態
実装や外部のフィードバックを求める状態
レビュアはその仕様策定者以外ならだれでもなれるが専門的な知識を持っている必要がある
ECMAScriptのエディタがチェックする必要があり

### Stage 4: Finished
2つの実装(not Polyfill)が必要
ECMAScriptへ取り込まれる準備が完了したことを示す状態
ECMAScriptのエディタがチェックする必要があり

## 参考URL
- [ECMAScriptとは何か？](https://azu.github.io/slide-what-is-ecmascript/)
- [ECMA-262](https://www.ecma-international.org/publications-and-standards/standards/ecma-262/)
- [Draft ECMA-262](https://tc39.es/ecma262/)
- [TC39](https://tc39.es/)
- [Ecma TC39 Github](https://github.com/tc39)
- [The TC39 Process](https://tc39.es/process-document/)
オブジェクト指向とは

やたらとオブジェクト指向を感情的に攻撃する人がいる。そもそもオブジェクト指向とは何かを考えた時に、それは言語でもアーキテクチャでもなく、個別のソフトウェアの性質ではないかと思った。

身の回りを見渡してみるとモノであり、状態を持つ物で溢れている。照明のスイッチやオーディオ機器の音量を調節するダイヤルは「私」とインタラクトする、オン/オフやメモリ位置の状態を持った「オブジェクト」だ。

そしてソフトウェアのフロント部分はまさに現実のモノを模倣しているのだから、これらがオブジェクト指向であるのは自然なことであり、それを否定しても面倒なことになるだけだと思う。

ここまで考えて思いついたのは「私」という存在の特異さである。「私」が朝起きてから夜寝るまでの全ての行動や生まれてから死ぬまでのライフイベントの数々はオブジェクト指向では記述できない。「私」に使われるモノはオブジェクト指向で記述するのが合っているが、主体性を持った「私」を記述するには手続き型が最適だ。

他にも手続き型の性質を持ったモノは存在する。マンガや小説や映画などの物語、音楽、確定申告などのいわゆる「手続き」など意外に多い。世の中の全てをオブジェクト指向で認識するのは間違いだ。

C++などの素朴なオブジェクト指向言語にはmain関数がある。これはオブジェクト指向のコードの中で「私」を代表し、唯一手続き型の性質を持つ「特異点」だ。しかしJavaやC#など、次世代のオブジェクト指向言語はこの特異点を「エレガントでない」とみなし、main関数もオブジェクトの中に組み込んでしまった。

確かに社会から見れば「私」はただのモノに過ぎない。main関数もOSやJava VMに管理されるひとつのモノだ。しかしそれでも、たとえ形式的なものであっても主体性を失いたくはない。そのような思いがオブジェクト指向を攻撃する人の憎悪の源泉ではないかと思う。まあJavaはともかくC#、というよりその開発元のMSはそういうタイプの人に嫌われているからね……。

現在、ソフトウェアの少なくともフロント部分はオブジェクト指向の性質を持っていて、私達はそれを当然のように使っている。しかしAI技術が進歩することによって、私達が「〇〇をしたい」というだけで自動的に全ての手続きが組み上がるソフトウェアが実現するかもしれない(部分的には実現してはいる)。そうなったときには開発者も自ずとオブジェクト指向から脱却する日が来るかもしれない。
Go言語におけるセマフォの利用：なぜ必要で、容量の決め方

## はじめに

Go言語における並行プログラミングでは、セマフォは非常に重要な役割を果たします。この記事では、セマフォがなぜ必要なのか、そしてセマフォの容量の決定方法について説明します。

## セマフォとは何か

セマフォは、複数のゴルーチンが共有リソースへのアクセスを調整するための同期原理の一つです。Goでは、セマフォはチャネルを使って表現されることが多く、以下のような形で空の構造体のチャネル`chan struct{}`を使用することが一般的です。

```diff_go
sem := make(chan struct{}, 2)
```

## なぜセマフォが必要なのか

複数のゴルーチンが共有リソースに同時にアクセスしようとすると、データの不整合や競合状態を引き起こす可能性があります。この問題を避けるために、セマフォはリソースへの同時アクセスを制限します。

具体的には、以下のコードではデータベースへの書き込みを調整するためにセマフォが使用されています。

```diff_go
sem <- struct{}{}
defer func() {
  <-sem
}()
_, err = db.Exec("INSERT INTO rates (date, currency, rate) VALUES (?, ?, ?)", time.Now(), result.Currency, result.Rate)
```

セマフォを利用することで、一度に実行できるデータベースへの書き込みの数を制限し、データベースの過負荷やデータの不整合を防ぐことができます。

## セマフォの容量の決定方法

セマフォの容量は、一度に許可されるリソースへのアクセスの最大数を表します。この例では、`sem := make(chan struct{}, 2)`が容量2のセマフォを作成しています。これは一度に最大2つのデータベース書き込み操作を許可することを示しています。

セマフォの容量を決定するときは、システムの要件とリソースの性能を考慮に入れる必要があります。例えば、データベースへの書き込みが高負荷になりすぎてパフォーマンスが低下する可能性があるため、それを適切に制限する必要があります。一方で、同時アクセスの数が少なすぎると、システムのスループットが低下する可能性があります。

そのため、容量の設定は、システムの性能要件、リソースへのアクセスパターン、およびリソース自体の性能（この場合、データベースの書き込みパフォーマンス）に基づいて調整する必要があります。また、負荷テストやベンチマーキングを行い、システムの応答性とスループットを維持しながらリソースへの最大同時アクセス数を定量化することも有効な手段です。

以下のようなコードでシステムのパフォーマンスをテストすることができます。

```diff_go
for i := 0; i < 100; i++ {
    go func() {
        sem <- struct{}{}
        defer func() {
            <-sem
        }()
        _, err = db.Exec("INSERT INTO rates (date, currency, rate) VALUES (?, ?, ?)", time.Now(), "USD", 1.0)
        if err != nil {
            log.Println(err)
        }
    }()
}
```

## まとめ

Go言語におけるセマフォは、リソースへの同時アクセスを制御する強力なツールです。適切な容量の決定により、システムのパフォーマンスと安定性を最適化することができます。
DjangoをDockerで起動した際のエラー:ModuleNotFoundError: No module named 'composeexample';

## 実現したいこと
PythonのフレームワークDjangoをDockerで起動させてlocalhostでアクセスする

## コード
ソースコードをGitHubにアップロードしておりますので、ご参照いただけると幸いです。
https://github.com/kazunobu2022/docker-django

## コマンド
実行したコマンドは次の内容になります。
```
docker-compose run web django-admin.py startproject composeexample .
sudo chown -R $USER:$USER .
docker-compose up
```
## 発生している問題・エラーメッセージ
docker-compose up　で起動させると下記のようなエラーが発生します。

```
django-web-1  |   File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
django-web-1  |   File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
django-web-1  |   File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
django-web-1  |   File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
django-web-1  |   File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
django-web-1  | ModuleNotFoundError: No module named 'composeexample'
django-web-1 exited with code 1
```

## 参考にしたサイト

次の記事を参考に構築しております。
https://docs.docker.jp/compose/django.html

改善点をご指摘いただけると幸いです。
よろしくお願いいたします。
【備忘録】WinSCPで何を入力すればTermuxに接続してログインできるか？

WinSCPで何を入力すればTermuxに接続してログインできるのでしょうか？

自分のための備忘録として書いておきます。

Termuxをインストールしたスマホでまずアプデをします。

```
apt update
apt upgrade
```

OpenSSHサーバーをインストールします。

```
pkg install openssh
```

SSHサーバーを起動します。

```
sshd
```

ユーザー名を確認します。

```
id
```

ユーザー名はu0_aXXという形式です。
XXは数字となっています。

パスワードを設定します。

```
passwd
```

>Termuxでは1024以下のポートが使えないため、デフォルトで8022番ポートを使うよう設定されています。

そのため、WinSCPのデフォルトの22ではなく8022となるようにポート番号は入力して下さい。

以上の情報を確認してWinSCPに入力するとログインすることが出来ます。

## ■出典

Termux on AndroidのSSHサーバに接続する方法 | LFI
https://linuxfan.info/termux-sshd
minicondaでアップデートしようとしたら、CondaSSLErrorがでたので解決した

# 結論
minicondaで`conda update --all`したら、エラーが出てしまったので`conda config --set ssl_verify False`としたら動いた。

# 具体的に発生した問題
`conda update --all`したら、以下のようなCondaSSLErrorエラーが出た。

![スクリーンショット 2023-06-03 175926.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2617861/c3d12ffe-7e06-2826-5a13-0d01cf86ae0a.png)

# どうやって解決したか

conda上での同様のSSLErrorの報告を見つけることができなかったが、SSLに関するエラーであったためSSLを無効にすれば解決するのではと思い、condaでSSLを無効にする`conda config --set ssl_verify False`としたら問題なく`conda update --all`できた。

# 
根本の課題は解決していないが、とりあえず動いたので一安心。
SSLが再び有効にしたいのであれば`conda config --set ssl_verify True`とすればよい。
php application/octet-stream になりアップロードできない

参考
https://qiita.com/Ago0727/items/9ee8373d4957946bb7cb

php.iniのファイルのupload_max_filesizeを変更する

```php.ini
upload_max_filesize = 10M
```

iphone のアプリのクセがあるからアップロードできないのかなと思ったが、
許可されたファイルサイズが小さすぎたのが原因らしい。
中学一年生が基本情報技術者試験受けてみた

**はじめに**
こんにちは。中学一年生のikkun084です。
今回は、先日受けた基本情報技術者試験の結果が出ましたので、皆さんに伝えようと思いました。
**基本情報技術者試験とは？**
最初に、知らない方のために、基本情報技術者試験とはなんなのかについて説明したいと思います。
>"基本情報技術者試験は、ICTや情報処理の分野の国家試験として数十年の歴史をもつ「情報処理技術者試験」の区分の一つです。情報処理技術者試験は、「情報処理の促進に関する法律」に基づき、情報処理に関する業務を行う者の技術の向上に資するために経済産業大臣が行っている国家試験なので、基本情報技術者試験は、その名の通り、情報処理技術に関する基本的な知識・技能を有していることを国が認定するものと言えます。"

引用元
https://www.fe-siken.com/feis.html


試験は前半と後半に分かれていて、その両方で６割以上の点数を取ると合格になります。
前半(A):
基本的な知識や、法律などの知識を問われ、大人なら常識で解ける問題もあるかもしれませんが、覚えなければならないことが多いです。
後半(B):
実際にはない架空の言語で書かれたプログラムを見て、質問に答える問題と、情報セキュリティーなどに関する問題が出ます。

**勉強方法**
次に、僕の勉強方法を伝えたいと思います。
![8Kd4ieY4hIJnCYt1682159537_1682159801.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3335275/72f165fc-2bfd-cba3-3e20-980d23485adf.jpeg)
主な勉強にはこの本を使いました。この本を読めば大体の試験範囲の内容がわかります。

また、作問の都合上、前半は似た問題や同じ問題が出ることが多いので、過去問をたくさんやれば前半はできるようになっていきます。なのでこのアプリを使って勉強しました。

【令和2年春対応】基本情報技術者試験 午前問題集
https://apps.apple.com/jp/app/id716625312
![96m4VYDCg6qIol61682160755_1682160866.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3335275/adc96915-3f96-9c26-a426-f0b4980a1130.jpeg)
このアプリなら前半の問題の中で、苦手な部分だけを集中してできるため、とても役に立ちました。
試験前は、
![Cy8TdKX21mwpNEA1682161652_1682161661.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3335275/bbfabaff-f608-7b84-0ff9-93be5b90078d.jpeg)
この予想問題集を解き、得意な部分、苦手な部分や、じぶんがどれだけできているのか確かめるのに役立てました。
**試験結果・あとがき**
最後に、試験結果を報告します。
試験結果は、、、
![スクリーンショット 2023-06-03 17.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3335275/3dc9a431-e044-4d2b-33a1-1813de3a6d76.png)
合格です！
Aがちょうど600点で、ギリギリでした。
受かってよかったです。
React Hooksについて

# 概要
React Hooksは、Reactライブラリの一部として導入された機能で、関数コンポーネント内で状態や副作用を扱うための新しい方法になります。これにより、クラスコンポーネントを使用せずに、よりシンプルで再利用可能なコードを書くことができます。

## 状態の管理：
従来のReactでは、クラスコンポーネントを使用して状態を管理しましたが、Hooksを使用することで、関数コンポーネントでも状態を管理できます。useStateフックを使用すると、状態を宣言し、その値を読み取ったり更新したりできます。

## 副作用の処理：
関数コンポーネントでは、useEffectフックを使用して副作用を処理できます。useEffectは、コンポーネントがレンダリングされた後に実行される関数を指定し、タイミングや条件に基づいて副作用を実行できます。たとえば、APIリクエストの送信やDOMの更新などの副作用を処理することができます。

## カスタムフックの作成：
Hooksを使用すると、カスタムフックを作成してロジックを再利用できるようになります。カスタムフックは、ロジックを抽象化し、関数コンポーネントで簡単に利用できるようにするための手段です。例えば、フォームのバリデーションやデータの取得などの共通の処理をカスタムフックとしてまとめることができます。

## クラスコンポーネントの置き換え：
Hooksを使用することで、クラスコンポーネントを使用せずに同価値の機能を持つReactコンポーネントを作成できます。これにより、コンポーネントの定義やライフサイクルメソッドの管理などがシンプルになり、コードの読みやすさと保守性が向上します。
```jsx:jsx
import React, { useState, useEffect } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    // コンポーネントがマウントされた後に実行される副作用
    document.title = `Count: ${count}`;

    // コンポーネントがアンマウントされる前に実行されるクリーンアップ関数
    return () => {
      document.title = 'React App';
    };
  }, [count]);

  const increment = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>Increment</button>
    </div>
  );
}

export default Counter;

```
上記のコードでは、"Counter"という関数コンポーネントを作成しています。このコンポーネントでは、useStateフックを使用して"count"という状態変数を管理しています。setCount関数を使用してcountの値を更新することができます。
また、useEffectフックを使用して副作用を処理しています。この例では、コンポーネントがマウントされた後に実行される副作用として、document.titleを更新しています。useEffectの第2引数に[count]を指定することで、countの値が変更されたときのみ副作用が実行されます。さらに、クリーンアップ関数を返すことで、コンポーネントがアンマウントされる前にクリーンアップ処理を行っています。
increment関数はボタンのクリックイベントで呼び出され、setCountを使用してcountの値をインクリメントします。
最終的に、Counterコンポーネントはp要素で現在のcountの値を表示し、ボタンを含むdiv要素を返します。
このように、React Hooksを使用すると、関数コンポーネント内で状態や副作用を管理することができます。これにより、よりシンプルで読みやすいコードを書くことができます。
AWS SAM でデプロイしたら、urllib3の依存関係が解決できなかった話

# なにがおきたか

https://dev.classmethod.jp/articles/notify-line-aws-billing/

こちらのアプリをデプロイしたところ、urllib3の依存関係が解決できず実行ができなくなってしまった。

# 何をしたか
requirements.txt に以下の一文を追加しました。

```requirements.txt
urllib3<2
```

# 現状
こちらのissueで対応してもらっているみたいです。

https://t.co/bKAiA9Hk3Z
2023年5月振り返り~リリースしてからがスタート~

## はじめに
GWもう終わったのか！と思っていたら、いつの間にか5月も終わっていました。
何と6月と終わると1年の半分終わりです。体感2秒です。2秒。
もう半年終わるのか、、と思うと焦ってきます。エンジニアの3年目。勝負どころ。
振り返りは何とか５月目も継続中、、今月もよろしくお願いします！

## 2023年5月のざっくり何してた？
![](https://storage.googleapis.com/zenn-user-upload/6345a31f6bc8-20230603.png)
GWはどこ行くにも人が多すぎて結局受験生のような生活を送っていました
（こんなキラキラしてなかった）

ざっくり3点。
**・担当していた案件のリリース
・機能をどう届けるか考える
・データに強くなりたい**

> ・担当していた案件のリリース

こちらは特にビハインドや手戻りもなく、リリースできました（パチパチ）
細かくTBしてスケジュールを組んで、、というのが癖づいてきたのかもと思ったり。
大きな規模な開発でも同様に進められるようにしていきたいです。

> ・機能をどう届けるか考える

これは自分の担当していたリリースとは別件できっかけがあり考えるように。
当たり前ですが、リリースして使ってもらってからがスタート。
だからこそ作って終わりではなく、どう認知してもらうか、活用してもらうかまで考えること。
ここをビジネスサイドと一緒に話しながら進められたのが良かったです。

>・データに強くなりたい

元々役割として意識はしていましたが、ビジネスサイドと話していく中で
（欲しいデータがないという部分もありますが）今あるデータでももっと活用できるのではと思うように。
知識、経験どちらも足らないのでインプット進めている最中です。

### 今月おもしろかった、気になった記事、本など
■プロを目指す人のためのTypeScript入門（通称：ブルーベリー本） 

https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AETypeScript%E5%85%A5%E9%96%80-%E5%AE%89%E5%85%A8%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%8B%E3%82%89%E9%AB%98%E5%BA%A6%E3%81%AA%E5%9E%8B%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%BE%E3%81%A7-Software-Design-plus/dp/4297127474

[こちらの記事](https://zenn.dev/shava2c/articles/6fd5ed3e31fb82)をきっかけに
一度まるっと1冊写経してみようと思い、GWに始めてみました。（半分趣味）
また感想やら読んでのアウトプットは別でできたらと思っています！

■技術書展イベント行ってみました

https://techbookfest.org/

先月に引き続き、オフラインのイベントへ参加。
独特の空気感に圧倒されつつも楽しかったです。
どんなものを手にとるのかでざっくり自分が何に興味があるか分かるなと。


## 印象に残ったトピック
#### ①チーム内で「テストについて考えようの会」開催
プライベートメソッドのテストと、サービスがまたがる場合のテストについて、
普段の開発の中で考えたことのシェア+チームメンバーで考えたいと思い開催しました。
明確に自分自身が答えを持っていない中での開催ではありましたが、
**どうあるべきか?をチームで考える** というのが個人的には体験としてとても良かったです。
　具体でもこういうこと進めたいよねという話が上がったり。また開催できたらと思います。

#### ②CTOとの1on1
実は毎週CTOとの1on1の時間をもらっているのですが（贅沢）、今月は特に濃かったなと思います。
仕事のことというよりは自分自身のことに向き合っていただきました。
できていないこと自覚する、あるいは変化しなければと思うタイミングなので、
なかなか苦しい時間ではあったりするのですが←、ありがたいなと。
いただいている時間分、お返しできるようになりたいものです。

**自分が常にベストを尽くしているのか**、**自分が決めに行こうとしているのか**
**扱うものの対象を理解しようとしているのか**は常に考えたいと思います。

1on1の中で、習得した知識や経験を人に説明できる状態にせねばと思い、
絶賛言語化の特訓中です。
そのうちの1つとして、技術面でのブログも増やしていきたいなと。
早速5月2本記事書いてみました↓

https://qiita.com/makky/items/d3cc0959b9d280d30727


https://qiita.com/makky/items/6d11906bee33f67e9e27


6月は週に1本目指しています（言ってやらざるを得ないようにするタイプ）

## 終わりに
GWがあったので稼働日は少なかったですが学びや変化が多かった月でした。
しゃがんでると思ったら前に進んでる気がして、またしゃがんでる気がしたり、次のステップが見えたり。
毎日飽きないです。生きてるな〜と思います笑。環境に感謝です。

余談of余談
最近は仕事中も勉強中もずっと焚き火の音聞いています↓

https://youtu.be/4YUwV8kIYdc

焚き火の音を聞くと、落ち着くのと、やるぞ！と良い切り替えのスイッチになっています。
オススメです。

今月もありがとうございました！
来月もよろしくお願いいたします！
(リンクだけです)「断面二次モーメント（英: moment of inertia of area）を調べた。

# wikipediaで

https://ja.wikipedia.org/wiki/%E6%96%AD%E9%9D%A2%E4%BA%8C%E6%AC%A1%E3%83%A2%E3%83%BC%E3%83%A1%E3%83%B3%E3%83%88

https://ja.wikipedia.org/wiki/%E5%B9%B3%E8%A1%8C%E8%BB%B8%E3%81%AE%E5%AE%9A%E7%90%86

英:

https://en.wikipedia.org/wiki/Second_moment_of_area

https://en.wikipedia.org/wiki/Parallel_axis_theorem

以下の日本語版がありません。

https://en.wikipedia.org/wiki/List_of_second_moments_of_area


# Mathematicaで
「**領域上の積分、記号幾何学**」イイですね。 モーメントの意味がわかっていない私には。

領域上の積分 ＜　Mathematica 10の新機能 › 記号幾何学 ›
https://www.wolfram.com/mathematica/new-in-10/symbolic-geometry/integrate-over-regions.html

Integrate[y^2, {x, y} \[Element] Rectangle[{-b/2, b/2}, {-h/2, h/2}]]

重積分

Integrate[y^2, {y, -h/2, h/2}, {x, -b/2, b/2}]

# WolframAlphaで
勉強中

# sympyで
長方形断面(y**2で)
```python
from sympy import *
x,y,b,h=symbols('x y b h',real=True)
print("#",integrate(y**2*b,(y, -h/2, h/2)))
# b*h**3/12
```

長方形断面(y**2で重積分)
```python
from sympy import *
x,y,b,h=symbols('x y b h',real=True)
print("#",integrate(y**2,(y, -h/2, h/2),(x, -b/2, b/2 )) )
# b*h**3/12
```

円形断面(y**2で)
```python
from sympy import *
y  =symbols('y'  ,real=True)
a,d=symbols('a d',real=True,positive=True)
print("#",integrate(2*y**2*sqrt(a**2-y**2),(y,-a,a))) 
print("#",integrate(2*y**2*sqrt(a**2-y**2),(y,-a,a)).subs({a:d/2})) 
# pi*a**4/4
# pi*d**4/64
```

円形断面(r**2で)
```python
from sympy import *
r    =symbols('r'    ,real=True)
a,d  =symbols('a d'  ,real=True,positive=True)
Ix,Iy=symbols('Ix Iy',real=True,positive=True)
Ip=integrate(r**2*(2*pi*r),(r,0,a))
print("#",Ip) 
ans=solve([Eq(Ip,Ix+Iy),Eq(Ix,Iy)],[Ix,Iy])
print("#",ans[Ix],ans[Iy])
mySubs={a:d/2}
print("#",ans[Ix].subs(mySubs),ans[Iy].subs(mySubs))
# pi*a**4/2
# pi*a**4/4 pi*a**4/4
# pi*d**4/64 pi*d**4/64
```

# 過去問

https://qiita.com/mrrclb48z/items/663772aaca008bec2579

# 参考

https://qiita.com/naoya_ok/items/cb3bc2e212bde8a18b81

https://qiita.com/mrrclb48z/items/de4bcba38edc6a8b35fa

# 未整理

\!\(\*UnderscriptBox[\(\[Integral]\), \({x, y} \[Element] 
   Rectangle[{\(-b\)/2, b/2}, {\(-h\)/2, h/2}]\)]\)y^2

Simplify[
\!\(\*UnderscriptBox[\(\[Integral]\), \(\[AliasDelimiter]\(\
\[AliasDelimiter]{x, y} \[Element] 
      Rectangle[{\(-b\)/2, b/2}, {\(-h\)/2, h/2}]\)\)]\)x^2]
Integrate[1, {x, y} \[Element] Circle[{1, 2}, r]]

Simplify[
\!\(\*UnderscriptBox[\(\[Integral]\), \({x, y} \[Element] 
    Rectangle[{\(-b\)/2, b/2}, {\(-h\)/2, h/2}]\)]\)y^2]

＞変数の順序は重要で, 入れ替えるとうまくいかない.

https://www.lab2.toho-u.ac.jp/sci/c/math/mathematica/2018-04calculus.pdf#page=13


＞材料力学への数式処理の適用
「真直はりの解析」教材の開発

https://www.tetras.uitec.jeed.go.jp/files/data/199901/19990113/19990113.pdf
URPにおけるポストエフェクトのかけ方

# はじめに
Unityのレンダーパイプランの一つにUniversalRenderPipeline（URP）があります。今回はURPの時にポストエフェクトをかける方法を解説してきます。
ポストエフェクトとは、カメラ全体に発行やぼかしといったエフェクトを掛けることを言います。実際に初期から搭載されている2つのエフェクトを使用することで以下のようなものが表現できます。
![d8072083d45605002a3108376369503e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/6b3c27ba-faf9-8012-9e2f-1a06f17a750d.png)

:::note warn
注意
URPを選択したプロジェクトのみ使用できるコンポーネントがあるため、今回解説する方法でポストエフェクトをかけたい場合はURPになっているか確認してください。
:::

# 目次
実行環境
エディタ上の設定方法
簡単な使い方

# 実行環境
Unity 2020.1.2f1

Unityのプロジェクトを生成時にURPを選択していれば問題ないです。
![ba73e6ed8545c2a7d9bf8c93b1a25c78.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/9c1d1eaa-2723-9b57-6403-9e5aa6d07017.png)

# エディタ上の設定方法
URPではVolumeコンポーネントを使用してポストエフェクトを反映させていきます。コンポーネント自体の内容は下の通りです。
![49faea72594576d1c75d50bff0b43fee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/45dfd5d1-8a64-e411-bbd9-b63998de77d4.png)

それでは実際にエディタ上で設定をしていきましょう。
まずHierarchy > Volumeを選択します。
![c011f0f5a1511dbf65e51bafb31ce695.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/8523566a-af6b-3aa7-915b-b62c3c7ba479.png)
Volume内にあるGlobal VolumeやBox Volumeの主な機能としては以下の通りです。それぞれ使用用途に合わせて選択してください。
|オブジェクト名|主な機能|
|:---|:---|
|Global Volume|カメラがどこにいてもポストエフェクトが反映されます|
|Box Volume|正方形の当たり判定があり、カメラが正方形内にいるときのみポストエフェクトを反映します。|
|Sphere Volume|球状の当たり反映があり、カメラが球の中にいるときのみポストエフェクトを反映します。|
|Convex Mesh Volume|カスタムメッシュを設定することができ、その範囲内にカメラがある場合ポストエフェクトを反映します。|

今回はGlobal Volumeを選択いました。
次に使用するエフェクトを登録するプロファイルを生成します。Volumeコンポーネント内のProfileのNewを押すとプロファイルが生成されます。
![af7533c0a50777b467fbe6abf42aaa11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/0fe10ed0-2745-1901-f5dc-62ffb9a1ae42.png)
もしすでに生成済みのプロファイルを使用したい場合は、ProfileのNoneのところにアタッチすることで反映されます。

最後にメインカメラの確認です。
Cameraコンポーネント内のRenderingにあるPost Processingにチェックがついているか確認してください。
![995659d615640b03251a3eb29a4c7f90.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/530b2e29-79b5-774b-82f8-0694dc232651.png)

これにてすべての設定が終了です。


# 簡単な使い方
Hierarchy内に生成したVolumeオブジェクトのVolumeコンポーネントからAdd Overrideを押すことで使用したいエフェクトを追加することができます。
![98b15e2454460c5fcc29c935998f77f2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/6ddfe768-d2dd-0c3e-86a6-ff59228e242d.png)
選択できるエフェクトとしては初期から搭載されているPostProcessingや自作したカスタムエフェクトなどがあります。
![d75d41cd417235db6ac24bd98f144798.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127325/66f5946d-46fd-099a-0e7b-13e45cb3d82e.png)

# まとめ
今回はURPを使用しているときのポストエフェクトの設定の仕方についてまとめました。ポストエフェクトを使用することでかなり見栄えが良くなるのでぜひ使用してみてください！ただし何個もエフェクトを掛けるとかなりの負荷がかかってしまうのでその点にはお気をつけて...
【GitHub】ProjectsのRoadmapに土日を追加してみた

今日はGitHub Projectsの話です。

GitHub Projectsはプロジェクト管理にとても便利です。
ただ、土日を表示する機能がないので↓みたいに休み関係なくスケジュールを引かれちゃってる人が多いのでは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/0dc8edd4-a1f8-40c7-bdc1-ba2e61f91978.png)
そんなあなたがしっかり休めるよう、土日表示の方法について書いてみました！

# 完成イメージ
存在感は薄いけど、ちゃんと土日が出ている！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/282cbbf1-3865-b502-7a57-4622d38e2ec4.png)

# 土日項目を追加する
１．画面右上の「Settings」を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/3a0266d2-38c8-2109-2e22-ed12395e6b7f.png)

２．「New Field」で以下のように指定して「Save and create」
※「Starts on」には表示したい初めの土曜日を指定してね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/0c6f7266-409c-1614-7b12-c833ee5d5ad6.png)

３．土曜日を表示したい分だけ「Add Iteration」を押下（ちからわざ）
※日曜日も同じようにやってね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/6c5158a5-7ba0-b145-3246-599c68cafb47.png)

４．「Roadmap」の画面にもどって、「Markers」で「土」、「日」にチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/6e3c0fa7-c398-3d2c-bb0e-864b5ed44e61.png)

# 祝日も追加しよう
１．「Settings」の「New Field」で以下のように指定して「Save and create」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/389c3a49-783b-59d3-6fa4-8e0989685828.png)

２．無駄な「祝２」、「祝３」は消しておこう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/9006be53-f9e8-d93f-1422-03466fe97670.png)

３．「More options」から次の祝日を追加していくよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/657e0fc5-e60a-61a3-699d-6decc37adf7e.png)

４．最後は土日と同じように「Markers」で「祝」にチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521440/26c97ee0-b9e2-13a2-02bf-ac36d717b2ae.png)

# 実際のGitHub
https://github.com/users/hoshiimo-se/projects/5/views/2

# 動画もあるよ
https://www.youtube.com/watch?v=dPU25FsjdNc&t=132s
イベントループについてJavaScriptの特性から学ぶ

# はじめに
JavaScriptにおけるイベントループについて学び直しました。
イベントループとは何か理解する上で、JavaScriptの特性について解説し順を追って解説していきます。

# JavaScriptのシングルスレッドとイベントループ
JavaScriptは非同期操作を行う能力を持つシングルスレッドのプログラミング言語です。
まずはシングルスレッドとは何かから理解していきましょう。

## シングルスレッド
シングルスレッドとは、一度に一つのタスクしか処理できない状態を指します。これはJavaScriptの主要な特性です。
しかし、ネットワークリクエストのような待ち時間の長い操作や、タイムアウトのような遅延操作を行う際には、その処理が完了するまで他のすべての処理がブロックされてしまうという問題が発生します。

ここで非同期処理の出番です。

## 非同期処理
非同期処理は、待ち時間の長いタスクをバックグラウンドで実行し、その完了後に結果を処理する方法です。この処理が行われる間、JavaScriptは他のタスクを実行することができます。これにより、ユーザーはウェブページを自由に操作したり、他のタスクが実行されるのを待つことなく、別の処理を実行出来ます。

しかし、これらのバックグラウンドに回った非同期タスクはどのようにメインスレッドに戻り実行されるのでしょうか？

ここでイベントループが登場します。
## イベントループ
イベントループは、非同期操作を扱うためのJavaScriptの内部メカニズムの一部です。つまり、**JavaScriptの処理が実行される仕組み**という意味です。

イベントループは以下の順に実行されます。

1. **タスクキュー**：イベントループはタスクキュー（またはメッセージキュー）と呼ばれるキューからタスクを取得します。

2. **タスクの実行**：取得されたタスク（関数）が呼び出され、その実行が完了するまでイベントループは次のタスクに進みません。

3. **次のタスク**：タスクの実行が完了すると、イベントループはタスクキューから次のタスクを取得します。そして、そのタスクが実行されます。

4. **ループ**：上記のプロセスが終了すると、イベントループはタスクキューに他のタスクがあるかどうかをチェックします。キューに他のタスクがある場合、そのタスクが実行されます。これを繰り返してループします。

このようにして、イベントループはJavaScriptのメインスレッドが常に忙しく、非同期操作を適切にスケジュールする役割を果たしています。
なお、JavaScriptはマクロタスクとマイクロタスクの2つのタスクキューを持っています。

## マクロタスクとマイクロタスク
イベントループの中で大きな括りとされるタスクキューは２つの種類に分けられます。

### マクロタスク
マクロタスクは一般的に大きなタスクや全体的なタスクを指します。これには以下のようなものが含まれます：

- 全体のスクリプト（最初に読み込まれるスクリプト全体）
- setTimeoutやsetIntervalによるコールバック
- requestAnimationFrameによるコールバック
- ユーザインタラクション（クリックやキーボードイベントなど）

### マイクロタスク
一方、マイクロタスクはより小さなタスク、または他のタスクの実行後に実行する必要があるタスクを指します。これには以下のようなものが含まれます：

- Promiseによるthenやcatchのコールバック
- MutationObserverによるコールバック
- queueMicrotask関数によるコールバック

### 実行の順番
さて、２つのキューを紹介したのでこの２つのキューの所持順番について説明します。
順番を理解する為に以下の処理をみてください。

```js
console.log('1: 開始');

setTimeout(() => {
    console.log('2: setTimeoutのコールバック');
}, 0);

Promise.resolve().then(() => {
    console.log('3: プロミスのコールバック');
});

console.log('4: 終了');
```
さて、どのような順番でconsole.logが出力されるでしょうか。結果は以下になります。
```makefile
1: 開始
4: 終了
3: プロミスのコールバック
2: setTimeoutのコールバック
```

1行目と4行目は予想通りですが、3行目と4行目の順番が気になりますね。
setTimeoutの秒数指定が0ですし、Promiseも定義直後にresolve()関数を実行しているので、どちらも待ち時間無しで実行されるように見えますが、何故順番が前後しているのでしょうか。
この順番がまさにマイクロタスクとマクロタスクの処理順番に繋がります。

以下、処理順番の図解になります。

![無題のプレゼンテーション (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849606/cdc0005f-3263-6de4-721e-59f123c2a65a.png)

上記の図解で解るように、マクロタスク内の処理が完了した後に、次のマイクロタスクが実行されます。そしてマイクロタスク内の処理が完了した後に、次に控えているマクロタスクを実行する、といった流れになります。

先ほどのコードで言うと、以下のような流れで処理が行われています。
![無題のプレゼンテーション (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849606/be692836-7504-786b-1c7e-298ff7431308.jpeg)

**1. マクロタスクの実行**
まず最初のマクロタスクとして、全体のスクリプトが実行されます。
シングルスレッドなので上から順に実行されていき、setTimeoutとPromiseはバックグラウンドに回されて処理の完了を待つので今回のキューでは処理は実行されません。

setTimeoutもPromiseも即座にコールバック関数が実行されるので、次回以降のキューに控えて実行を待ちます。

**2. マイクロタスクの実行**
最初のキューであるマクロタスクが実行完了後、次のキューに移ります。次のキューはマイクロタスクなので、マイクロタスクに分類されるPromiseのコールバック関数が実行されます。

**3. マクロタスクの実行**
2番のキューであるマイクロタスクの実行完了後、次のキューに移ります。次のキューはマクロタスクなので、マクロタスクに分類されるsetTimeoutのコールバック関数が実行されます。

以上がマクロタスクとマイクロタスクの処理順番の解説になります。

# 最後に
以上でイベントループについてJavaScriptの特性について順を追いながら解説した内容になります。
イベントループを理解して、処理の順番を意識した実装をすることで予期せぬ挙動を防ぐことが出来ます。