OmniAICreator/Qiita-1.07M huggingface dataset:
【Figma Plugins】Figma Pluginsからバージョン履歴にアクセスする

## はじめ
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/1b307ab8-00bc-cf4d-f9cf-576a9f0d4d77.png)

FigmaのPluginを開発する際、Figma Pluginsからバージョン履歴にアクセスしたいと思ったことはありますか？
この記事では、Figma Pluginsからバージョン履歴にアクセスする方法を解説します。

## バージョン履歴に保存する
バージョンヒストリーに保存するには、`saveVersionHistoryAsync` という関数を使います。

引数には、`title` と `description` を受け取ることができます。

- `title`：バージョンのタイトル
- `description`：バージョンを表す説明

```ts
saveVersionHistoryAsync(
    title: string,
    description?: string
): Promise<VersionHistoryResult>
```

`saveVersionHistoryAsync` の戻り値は、Promiseの`<VersionHistoryResult>`が返ります。

```ts
interface VersionHistoryResult {
  id: string
}
```


詳しくは、以下のリンクをご確認ください！

https://www.figma.com/plugin-docs/api/properties/figma-saveversionhistoryasync/

### 注意事項
:::note warn
このメソッドを使用する前に行われたすべての変更がバージョン履歴に保存される訳ではありません！
:::

例えば、以下のような場合、`figma.createRectangle()` で作成した Rectangle が保存されることは保証されません。

```ts
async function example() {
  await figma.createRectangle();
  await figma.saveVersionHistoryAsync('v1');
  figma.closePlugin();
}
example().catch((e) => figma.closePluginWithFailure(e))
```

そのため、以下のように保存する前に一時処理を止めてから保存すると、バージョン履歴に保存されます。

```ts
async function example() {
  await figma.createRectangle();
  await new Promise(r => setTimeout(r, 1000)); // wait for 1 second
  await figma.saveVersionHistoryAsync('v1');
  figma.closePlugin();
}
```

## バージョン履歴を取得する
バージョン履歴を取得するには、FigmaのREST APIから取得する必要があります。

API周りは以下の記事を参考にアクセスしてみてください。

https://qiita.com/degudegu2510/items/4c1d88d2223a66e82350

```ts
const FILE_KEY = "**********************"
const TOKEN = "********************************************"

const getVersionHistory = async () => {
  const response = await fetch(
    `https://api.figma.com/v1/files/${FILE_KEY}/versions`,
    {
      method: "GET",
      headers: {
        "X-Figma-Token": TOKEN
      }
    }
  )
```

レスポンスは、以下のようになります。

```json
{
  "versions": [
    {
      "id": "**********",
      "created_at": "2024-06-29T03:56:12Z",
      "label": null,
      "description": null,
      "user": {
        "handle": "**********",
        "img_url": "https://s3-alpha.figma.com/profile/**********",
        "id": "**********"
      },
      "thumbnail_url": "https://s3-alpha-sig.figma.com/thumbnails/**********"
    }
  ],
  "pagination": {
    "prev_page": "https://api.figma.com/v1/files/**********/versions?page_size=**&before=**********"
  }
}
```

https://www.figma.com/developers/api#version-history

## まとめ
この記事では、Figma Pluginsからバージョン履歴にアクセスする方法を解説しました。
ぜひこの記事を参考にして、バージョン履歴にアクセスしてみてください！

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
【Power Apps】msappファイルからYAMLファイルを生成する方法

この記事では、Power AppsのmsappファイルからYAMLファイルを生成する方法を紹介します。

## 1. Visual Studio Codeのインストール

まず、VSCodeをインストールします。VSCodeはMicrosoftが提供する無料のソースコードエディタで、多くの拡張機能を利用できます。

[VSCodeのダウンロードページ](https://code.visualstudio.com/)にアクセスし、お使いのOSに合ったインストーラをダウンロードします（Windows、macOS、Linux）。
ダウンロードしたインストーラを実行し、画面の指示に従ってインストールを完了させます。

## 2. Power Platform Tools(拡張機能)のインストール

VSCodeのインストールが完了したら、Power Platform Toolsという拡張機能をインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/601ce0dc-8531-f22f-a5a1-ca070187ba93.png)

拡張機能の検索窓に「Power Platform」と入力するとPower Platform Toolsが表示されるので、Installボタンをクリックしてインストールします。

View→Terminalでターミナルを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/e73fe188-61de-1aca-ed17-2058d768f671.png)

ターミナルにpac helpと入力、Enterを押して以下の画面になればインストールが完了しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/55ea55d6-0d89-6d02-77ee-035d5fbd237a.png)

## 3. msappファイルのダウンロード

Power Apps　Studioを開き、YAMLを生成したいアプリで∇→コピーのダウンロードを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/5112a61a-f12f-aab6-2553-dd5285fb30c2.png)

ダウンロードしたmsappファイルをデスクトップ上のmsappフォルダに格納します。
分かりやすい場所に移動させればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/f617ada2-2a24-bb9f-54a4-37c96fcb129a.png)

## 4. YAMLファイルの生成

先ほど移動させたフォルダのリンクを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/fbaba989-c68a-44c8-bc73-f4535d63026d.png)

ターミナルにcd [フォルダリンク]を入力してEnterを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/27d7c011-d6e7-66a3-43f3-32d18965ac11.png)

unpack (msapp→yaml)する場合は、ターミナルに以下のフォーマットで入力します。
```
pac canvas unpack --sources .\[出力先のフォルダ名]\ --msapp .\[msappファイル名]
```
出力先のフォルダ名が存在しない場合はフォルダが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/1f688758-5267-9c62-61ba-99150b7dac13.png)

unpackされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/9dc9351d-c10c-5328-4637-c934f4d8770d.png)

Srcフォルダ下にyamlファイルが画面ごとに存在しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/3ee69e72-9144-30f0-54b9-55f6b40c33d6.png)

## 参考

https://learn.microsoft.com/ja-jp/power-pages/configure/vs-code-extension

https://mofumofupower.hatenablog.com/entry/2021/06/24/230753

## 元記事

https://powerplatformnikki.com/msapp2yaml/
golangci-lintを使ってみる

## はじめに
goでプログラミングした際に、文法間違いやエラーチェックが抜けている箇所を指摘してくれるgolangci-lintを使ってみます。

## golangci-lint インストール
```zsh
brew install golangci-lint
brew upgrade golangci-lint
```

## Goを書く
```go
package main

import (
	"net/http"
)

func middleware1(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("before middleware\n"))
		next.ServeHTTP(w, r)
	})
}

func middleware2(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		next.ServeHTTP(w, r)
		w.Write([]byte("after middleware\n"))
	})
}

func main() {
	handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello World\n"))
	})

	http.Handle("/", middleware1(middleware2(handler)))

	http.ListenAndServe(":8080", nil)
}
```

## golangci-lintを実行する

メソッドがerrorを返してくるけど、実際にエラーチェックしてない箇所を指摘してくれています。

```zsh
golangci-lint run main.go 

main.go:9:10: Error return value of `w.Write` is not checked (errcheck)
                w.Write([]byte("before middleware\n"))
                       ^
main.go:17:10: Error return value of `w.Write` is not checked (errcheck)
                w.Write([]byte("after middleware\n"))
                       ^
main.go:23:10: Error return value of `w.Write` is not checked (errcheck)
                w.Write([]byte("Hello World\n"))
                       ^
main.go:28:21: Error return value of `http.ListenAndServe` is not checked (errcheck)
        http.ListenAndServe(":8080", nil)
```

## プログラムを修正
```go
package main

import (
	"net/http"
)

func middleware1(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		_, err := w.Write([]byte("before middleware\n"))
		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
		next.ServeHTTP(w, r)
	})
}

func middleware2(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		next.ServeHTTP(w, r)
		_, err := w.Write([]byte("after middleware\n"))
		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
	})
}

func main() {
	handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		_, err := w.Write([]byte("Hello World\n"))
		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
	})

	http.Handle("/", middleware1(middleware2(handler)))

	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		panic(err)
	}
}
```

## 再度golangci-lintを実行

何も指摘がないので、OKそう。
```zsh
golangci-lint run main.go

```
リテラル型のwideningと型推論

## リテラル型のwidening とは
**リテラル型のwidening** とは、一定の条件下で**リテラル型がプリミティブ型へと拡張（widening）されて型推論される**働きのことです。

型推論が行われるときに`123`型や`'foo'`型といったリテラル型が`number`型や`string`型へと拡げられて（widening）型推論される場合があるというものです。

**他の値が代入されうる場合にリテラル型のwidening が起こる**のですが、リテラル型がプリミティブ型へと拡張されて型推論される場面をより詳しくみていきたいと思います。

### 型注釈なしのlet で変数を宣言
まずは、型注釈をつけずに`let`を使って変数を宣言した場合にwidening が発生する場合があります。

`const`と`let`で宣言した変数に同じ文字列をそれぞれ代入してみると、型推論の結果が異なることとなります。
```ts
const tuna = 'tuna' //const tuna: "tuna"

let fish = 'tuna'  //let fish: string
```
`const`で宣言した変数には値が再代入されることがないため、代入した値のリテラル型である`'tuna'`型で型推論がされています。

一方`let`で宣言した場合には、`'tuna'`という文字列以外が変数に代入される可能性があるため、`'tuna'`型と推論するのではなく、プリミティブ型へと拡げて`string`型で推論されています。

<br/>

`'tuna'`しか値をとらないことを型注釈で明示した場合には、型のwidening は起こりません。
```ts
type Tuna = 'tuna'

let fish: Tuna = 'tuna'  //let fish: "tuna"
```

`const`ではなくあえて`let`で変数が宣言されるということは、**この変数には値が再代入されうる**と明示しているようなものですので、変数の型をどのようの推論すべきかを考えてみると、初期値のリテラル型として推論するよりも、そのプリミティブ型が代入されうると考えてプリミティブ型に拡げて型を推論しておく方が合理的だと思えますね。

### オブジェクトリテラルの型推論
オブジェクトリテラルのプロパティにリテラル型の値をもたせた場合にもwidening が起こります。
```ts
const tuna = {
  name: 'tuna',
  age: 2
}

//型の推論結果
// const tuna: {
//   name: string;
//   age: number;
// }
```
オブジェクトリテラルの場合にも、**プロパティの値があとから上書きされうる**ために型widening が起こっていると捉えられます。

#### as const
`as const`の働きの１つに、widening が起こらないようにするというものがあります。
オブジェクトリテラルに`as const`をつけることで各プロパティには`readonly`がつけられて上書きできなくなるため、型widening が起こらなくなるわけです。
```ts
const tuna = {
  name: 'tuna',
  age: 2
} as const

// 型の推論結果
// const tuna: {
//     readonly name: "tuna";
//     readonly age: 2;
// }
```
### 型注釈
リテラル型のwidening は型推論によって起こるものです。

型注釈をつけて型を明示してしまえば型推論の必要もなくなり、widening も起こらなくなります。

すでに型が明確に定まっていてwidening されたくない場合には、`as const`や型注釈をつけて明示しておくと読み手にもやさしいコードになりそうですね。
よく使用するTex(備忘録)

自分がよく使用するTexコマンドをまとめる

分数:\frac{1}{2}

添字:\A_i, \A_{ki}

インテグラル(積分):\int_{0}^{t}

乗数:\e^k, \e^{-k}

円周率:\pi

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820079/24829858-6d2e-f8c9-7366-7ac203e20761.png)
http://www.ic.daito.ac.jp/~mizutani/tex/special_characters.html
VITEで読み込んだ環境変数はクライアントサイドに公開されるので注意

# 概要
某教材でAPIキーの情報が、`VITE`で読み込める環境変数として定義されておりました。

```bash
VITE_API_KEY = xxx
```

# 問題
VITEの[公式ページ](https://ja.vitejs.dev/guide/env-and-mode.html)にもありますが、
読み込まれた環境変数は、`import.meta.env` を経由してクライアントソースコードにも文字列として公開されます。

`API_KEY`の情報が開発者ツールを使用することで、第三者から確認できてしまうということです。

:::note warn
SECURITY NOTES

Vite のソースコードに公開される変数は最終的にクライアントバンドルに入るので、VITE_* 変数はセンシティブな情報を含まないようにすべきです。
:::

# まとめ
`VITE_*` で定義した環境変数はクライアントサイドにも公開されるので、取り扱いに注意が必要。

簡単ですが、備忘録も兼ねて執筆しました。
敵対的模倣学習(GAIL)について

# はじめに

敵対的模倣学習(GAIL;Generative Adversarial Imitation Learning )について解説した記事をおく。

https://github.com/Hideki105/mathematical-engineering/blob/main/%E6%95%B0%E7%90%86%E5%B7%A5%E5%AD%A6/hdk/%E6%95%B5%E5%AF%BE%E7%9A%84%E6%A8%A1%E5%80%A3%E5%AD%A6%E7%BF%92/Generative_Adversarial_Imitation_Learning.pdf
zipメソッドに3つの引数を渡したいときの実装メモ

# 概要

zipメソッドに3つの引数を渡したいときどのように実装するか

# 実装

```swift
let array1 = [1, 2, 3]
let array2 = ["a", "b", "c"]
let array3 = [true, false, true]

// zipを使って3つの配列を処理
for (element1, (element2, element3)) in zip(array1, zip(array2, array3)) {
    print("element1: \(element1), element2: \(element2), element3: \(element3)")
}
```

zipメソッドをネストして使用することで実現可能です。
zip(array2, array3)は、array2とarray3の要素をペアにします。これにより、(element2, element3)というタプルの配列を作ることができます。
googleドキュメントに自動でフォントを変更する機能を実装

報告書や論文を執筆する時、英数字や記号は〇〇フォント、それ以外は△△フォント。みたいに指定される場合が多いと思います。
Microsoft Wordならそれらの設定を行えるのですが、Googleドキュメントではできません。

そこでGoogleドキュメントにGAS(Google Apps Script)を使用することで、同様の機能を実装しようと思います。GASの使い方がわからない場合は以下の記事で解説しています。
[GASを使用してみる](https://qiita.com/TooMe/items/97b4b5ff97f982d0c1f6)

コードは以下のようになります。
```javascript
function changeFontForHalfCharacters() {
  const doc = DocumentApp.openByUrl('*****************************************');
  let body = doc.getBody();
  let paragraphs = body.getParagraphs();
  let halfWidthRegex = /[ -~]/; // 半角文字の正規表現

  paragraphs.forEach(function(paragraph) {
    let text = paragraph.getText();
    let textElement = paragraph.editAsText();
    let len = text.length;
    
    for (let i = 0; i < len; i++) {
      let char = text.charAt(i);
      if (halfWidthRegex.test(char)) {
        textElement.setFontFamily(i, i, "Times New Roman");
      }
    }
  });
}

```
まずはGoogleドキュメントを読み込み、そのテキストの内容を変数に格納し、
英数字、記号は半角で入力するので、「半角の文字はこのフォントにする」という形で実装します。


この引数に編集したいGoogleドキュメントのURLを指定することにより使用ができます。
```javascript
const doc = DocumentApp.openByUrl('*****************************************');
```

ここで半角時のフォントを指定できます。今回は「Times New Roman」を指定しています。
```javascript
if (halfWidthRegex.test(char)) {
    textElement.setFontFamily(i, i, "Times New Roman");
}
```

以下のように使用します。
1. GoogleドキュメントのURL、フォントをプログラムで指定
1. このプログラムを実行する
これで半角(英数字、記号)のみを指定したフォントにすることができます。
【PostgreSQL】メタコマンド〜\!〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \!とは

> 引数がないときはサブシェルに制御を渡し、サブシェルが終了したらpsqlが再開されます。 引数があるときは、シェルコマンド`*command*`を実行します。
> 
> 
> 他のほとんどのメタコマンドと異なり、行の残り部分はすべて`\!`の引数であると常に解釈され、引数内の変数の置換も逆引用符の展開も行われません。 行の残りの部分は単にあるがままにシェルに渡されます。
> 

[\!について](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%E3%81%AE%E5%88%A5%E5%90%8D%E3%81%A7%E3%81%99%E3%80%82-,%5C!%20%5B%20command%20%5D,-%E5%BC%95%E6%95%B0%E3%81%8C%E3%81%AA%E3%81%84)

## 試してみた

シェルを起動(exitを入力するまで)

```sql
\!
```

コマンドを組み合わせることもできるらしい

```sql
\! mkdir new_directory && cd new_directory
```

自分の環境ではディレクトリの作成だけで移動はできなかった

## まとめ

スクリプトの中でechoなどを利用したいときに使えるかも。
都度psqlで入り直さなくていいのはありがたい
IBM i Services Directory : QSYS2.JVM_Info ビュー　ヒープ,GC情報、基本情報を表示

WRKJVMJOBコマンドで取得できるのと同様なJVM情報を取得できます。

## 概要
■ビュー名：QSYS2.JVM_INFO
■カテゴリ：Javaサービス
■サポート：IBM i 7.2 SF99702 Level 5以降
■参照URL（IBM i 7.5）：https://www.ibm.com/docs/ja/i/7.5?topic=services-jvm-info-view

## 使用例

以下はインフォセンター記載のサンプルです。

実行中のJVMジョブについてヒープサイズが大きい順に値を返します。
```
 SELECT * FROM QSYS2.JVM_INFO
    ORDER BY CURRENT_HEAP_SIZE DESC;
```

実行サンプルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1a795f66-9cb1-e281-5b9c-653521d3758a.png)

APサーバーやHTTP ADMINサーバー等が表示されていますね。ジョブ名/ユーザー名/ジョブ番号があって、Javaスレッドカウント、GC関連情報：トータルGC時間、GC回数などが表示されます。

右にスクロールすると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1d0e3773-17d2-4a4a-56fb-2f6cf117eb29.png)

ヒープサイズ情報：イニシャルヒープサイズ、現在のヒープサイズ、使用中のヒープサイズ、そのジョブの最大ヒープサイズなどが表示されています。

総じてJVMジョブの基本情報とメモリ関連の情報が取得できます。


## WRKJVMJOBの例

オリジナルのWRKJVMJOBコマンドも気になる方がいると思うのでｗ、のぞいてみますと、、
```
WRKJVMJOB
```

JVMジョブの一覧が表示されます。各ジョブの詳細はOPT欄に番号を入力してエンターキーを押して確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/52cf44b2-34e5-f69d-84bf-6a9bb833477c.png)

例えば、5=処理 を選択すると、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a6d42bcc-a8a0-b325-2794-c87cfd4729de.png)

そのジョブの基本情報（JDKバージョン、ビット数など）が画面上部に表示されます。
さらに、1～10の番号を押して必要な情報を取得します。QSYS2.JVM_Infoビューで取得しているのは、オプション5,10等の情報のようです。

***オプション5.ガーベッジ・コレクション情報の表示***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1507eeea-65a9-748c-a66b-933334c1d482.png)

***オプション10. GCサイクル・テーブルの表示***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b6c093a1-423f-edd3-2c60-1b95561ed139.png)

番号列がGCサイクル番号を示します。
QSYS2.JVM_Infoビューだと下記に表示される値ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a8fc8449-70d3-1879-8e10-7653f1233699.png)

5250 WRKJVMJOBコマンドだと各GCサイクルごとの開始時/終了時、GCによって解放されたヒープサイズが表示されています。対して、QSYS2.JVM_Infoビューでは現時点を基準にヒープの最大、最小サイズ等を表示しますので、用途に応じて使い分けが必要かもしれません。
【JavaScript】querySelectorに複数の属性を指定すると、ネストした要素にアクセスできる

## はじめに
以下のようなHTML要素があったときに、どうすれば内部要素をピンポイントで取得できるのかと思っていました。
```html:index.html
<div id="x">
    <div class="y">This is the element we are selecting</div>
</div>
```

## 解決策
`querySelector`で以下のように親要素から順に指定します。
それぞれの要素の間にスペースを書くことで、ネストされた要素にアクセスすることができました。
```javascript:script.js
const a1 = document.querySelector("#x .y");
console.log(a1.innerText);
```
```:コンソール
This is the element we are selecting
```
ちなみに、親要素を書かなくてもネストされた要素にアクセスできますが、次のように複数の要素があると、最初の要素にアクセスされます。
```html:index.html
<div class="y">Dummy element</div>
<div id="x">
    <div class="y">This is the element we are selecting</div>
</div>
```
```javascript:script.js
const a1 = document.querySelector("#x .y");
const a2 = document.querySelector(".y");

console.log(a1.innerText);
console.log(a2.innerText);
```
```:コンソール
This is the element we are selecting
Dummy element
```
Firebase FCM エラー解決

## エラー内容

```js:error.js
FirebaseError: Messaging: A problem occurred while unsubscribing the user from FCM: FirebaseError: Messaging: A problem occurred while unsubscribing the user from FCM: Requested entity was not found. (messaging/token-unsubscribe-failed). (messaging/token-unsubscribe-failed).
```


## 解決方法
【PostgreSQL】メタコマンド〜\crosstabview〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \crosstabviewとは

> 問い合わせのバッファを実行し（`\g`と同様）、その結果をクロス表形式で表示します。 問い合わせは少なくとも3つの列を返す必要があります。 `colV`で特定される出力列が縦方向のヘッダになり、`colH`で特定される出力列が横方向のヘッダになります。 `colD`は表内に表示される出力列を特定します。 オプションの`*sortcolH*`で水平方向のヘッダをソートする列を指定できます。
> 
> 
> それぞれの列の指定は、列番号（1から始まります）でも列名でも可能です。 列名については、通常のSQLの大文字小文字変換および引用の規則が適用されます。 省略した場合、`colV`は列1、`colH`は列2となります。 `colH`は`colV`とは異なるものでなければなりません。 `colD`を指定しない場合、問い合わせの結果にはちょうど3つの列がなければならず、`colV`でも`colH`でもない列が`colD`となります。
> 
> 縦方向のヘッダは一番左の列に表示され、`colV`の列にある値が問い合わせ結果と同じ順序で現れますが、重複するものは除かれます。
> 
> 横方向のヘッダは1行目に表示され、`colH`の列にある値が現れますが、重複するものは除かれます。 デフォルトでは、これらは問い合わせの結果と同じ順序で表示されます。 しかしオプションの`sortcolH`引数が指定された場合は、`colH`の値は対応する`sortcolH`の値に従ってソートされて横方向のヘッダに現れますが、`sortcolH`の列の値は整数値でなければなりません。
> 
> クロス表の内側では、`colH`のそれぞれの個別値`x`と`colV`のそれぞれの個別値`y`に対して、その交点`(x,y)`に位置するセルに、問い合わせの結果の`colH`の値が`x`で`colV`の値が`y`である行の`colD`列の値が現れます。 そのような行がなければ、セルは空欄になります。 そのような行が複数あると、エラーが報告されます。
> 

[\crosstabviewについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%5Ccrosstabview%20%5B%20colV%20%5B%20colH%20%5B%20colD%20%5B%20sortcolH%20%5D%20%5D%20%5D%20%5D)

## 試してみた

まずはデータの用意
```sql
CREATE TABLE sales (
    region TEXT,
    product TEXT,
    sales_amount INTEGER
);
```

```sql
INSERT INTO sales (region, product, sales_amount) VALUES
('North', 'Product A', 100),
('North', 'Product B', 150),
('South', 'Product A', 200),
('South', 'Product B', 250);
```

まずは普通にSELECT

```sql
postgres=# SELECT region, product, sales_amount FROM sales ORDER BY 1,2;
 region |  product  | sales_amount 
--------+-----------+--------------
 North  | Product A |          100
 North  | Product B |          150
 South  | Product A |          200
 South  | Product B |          250
(4 rows)
```

\crosstabviewを使ってみる

```sql
postgres=# \crosstabview region product
 region | Product A | Product B 
--------+-----------+-----------
 North  |       100 |       150
 South  |       200 |       250
(2 rows)
```

## まとめ

クロス表形式と聞いて難しい印象でしたが、使ってみると実務にも活かせそう。
すぐには思いつきませんが。。
Utility Types の Pick と Omit の基本的な使い方と違い

## これはなに

すでに存在している型を参照して、新規に作成したコンポーネントの型を指定したい場面がありました。
この記事はそのときに使ったTypescript の Utility Types の `Pick` と `Omit` の基礎知識と違いをまとめました。

どちらも参照元の方から、利用したいプロパティを抽出するときに使います。

https://www.typescriptlang.org/docs/handbook/utility-types.html

## 準備

`Todo` というオブジェクトを参照する想定にします。

```typescript
interface Todo {
  title: string;
  description: string;
  completed: boolean;
  date: number;
  people: string;
}
```

## Pick

### 概要
`Pick` は参照元の型から、利用したいプロパティを選択して形を構築します。
[Typescript 2.1](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html#partial-readonly-record-and-pick) でリリースされました。

### 基本的な書き方

`Pick<（参照元の）型名, "利用するプロパティ名" | "利用するプロパティ名">;`

前項で作成した `Todo` から利用したいプロパティを選択します。
```typescript
type = TodoPreview = Pick<Todo, "title" | "completed">;
```

### 状態

下記の型が定義されたことになります。

```typescript
Type TodoPreview {
  title: string;
  completed: boolean;
}
```


## Omit

### 概要

`Omit` は `Pick` と逆の働きをします。
参照元の型から、利用しないプロパティを選択して、除外した状態で形を構築します。
[Typescript 3.5](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-5.html#the-omit-helper-type) でリリースされました。

### 基本的な書き方

`Omit<（参照元の）型名, "利用しないプロパティ名" | "利用しないプロパティ名">;`

前項で作成した `Todo` から除外したいプロパティを選択します。
```typescript
type = TodoPreview = Pick<Todo, "date" | "people">;
```

### 状態

下記の型が定義されたことになります。

```typescript
Type TodoPreview {
  title: string;
  description: string;
  completed: boolean;
}
```

## まとめ

- 利用したいプロパティだけで型を作りたいときは `Pick`
- 型から利用しないプロパティを除外したいときは `Omit`

## 参考

- https://www.typescriptlang.org/docs/handbook/utility-types.html
順序回路の作法 その13

# 概要
順序回路を理解する。
リレー回路が、良いと閃いた。
リレー回路で説明してみた。
規模が大きくなると、リレー回路では、説明が難しい。
タイミングチャートが、有効と感じる。
やっぱり、回路図がないとね。simcirjs使う。


# 8bitシフトレジスタ

D-FFを８個つなぐ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9d9ad4be-16ed-c381-86dd-54506e2becdd.png)

# 成果物

https://embed.plnkr.co/plunk/BgKwYWjNfRAfKgl6WTWQ


以上。
順序回路の作法 その12

# 概要
順序回路を理解する。
リレー回路が、良いと閃いた。
リレー回路で説明してみた。
規模が大きくなると、リレー回路では、説明が難しい。
タイミングチャートが、有効と感じる。
gtkwaveがある、iverilogで説明してみる。

# 8bitシフトレジスタ

入力パルスを記憶して8クロック後に、取り出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a15eb397-815c-3f71-badd-00d3d287811e.png)

# サンプルコード　

_inが入力でclkがクロックです。
レジスタを8個、用意して、クロックの立ち上がりで、入力を記憶して
後ろから順にバケツリレーをしています。

```

module sr8(input _in, clk, output _out);
	reg b1;
	reg b2;
	reg b3;
	reg b4;
	reg b5;
	reg b6;
	reg b7;
	reg b8;
	assign _out = b8;
	always @(posedge clk)
	begin
		b8 <= b7;
		b7 <= b6;
		b6 <= b5;
		b5 <= b4;
		b4 <= b3;
		b3 <= b2;
		b2 <= b1;
		b1 <= _in;
	end
endmodule


```


以上。
Qiita Engineer Festa参加の所信表明とか提供できるサービスの話


![動く扉絵.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/00a54f9e-d3ef-e44e-af49-b8f056b736e9.gif)

（投稿後、編集でキャンペーンに参加する方法で投稿マラソンのバッジがもらえることがわかったので、本稿はQiitaCLIで投稿を検証する方法も兼ねています）

:::note
新人研修案件終わったどー！という気持ちで、次の案件までに投稿マラソン埋めていきたい気持ちに溢れています
:::

## やること（やりたいこと）
本フェスタ参加はアウトプット的には大きな役割を持つ。

- 計画を立てて38記事書く
  - 役に立つであろう記事に仕上げるのは当然のことながら「ニッチなものこそ情報を残すべき」という意識を強く持ちたい
  - 日記やポエムを許容する。チラシの裏に書いて捨てろとは言う（思う）けど、その意見や考察は誰かの救いになっている事があるかもしれない。
- 記事のテーマを増やす
  - 今考えていることは後述の通り
  - 限界まで考え抜いた先に何かがある、気がする。前回のアドベントカレンダーでも気付きや取っ掛かりが見つけられた。
- コード以外のアウトプットだって立派なコントリビューションだ、と主張し、現状のルールに準拠した形で解決する仕組みを作る
  - 一番言いたいのはこれ
  - 特にGitHub Contributionは書いてナンボの世界なのが納得できない
  - この仕組みを使って就活・転職サービスに活用されている事は一定理解している。

## 開始前の所感・見解など
せっかくなので、Engineer Festa中はQiitaCLIも使いながら記事を書いてみて、運用してどうだったかも記録に残していこうと思います
アドベントカレンダー的（25記事）で見たとしても多すぎるぐらい、ハーフフェスタ分（38/2記事）でも書くことはないのでは？という気がしてますが、そこは何とかしたいところ。

さて、今回記事にしようと思うテーマは以下の通り

- プログラミングの学び方
  - 2024年4月〜6月新卒研修振り返り：個人の部
  - 全体から見た話は秋の人材研修会社系勉強会も含めて分析・検討
  - 特に今年はコミュニティ発でQiita organizationをやるので、そちらに参加してみた意義や効果についても実データがベースとなる
  - AIコミュニティも様々な分野や活動があり、情報の変化が凄まじい
  - 今の研修業界の流れについて妥当性など
- QiitaCLIの運用の話
  - Webエディタで良くね？勢だけどちゃんとQiitaCLIを運用目線で評価する
  - おそらく、Webエディタで出来たことがQiitaCLIでできないことはある（公式からは記事の削除について言及されている）
  - Zennとの共存や、コンテンツをCMSで管理するための方法などを考えていくことになりそう
- AIで動画を作れるか？
  - 記事を書く、分かりやすくまとめる、受け入れやすいように工夫するという三つのプロセスで考えた時、最後の工夫ができてない
  - 今回は「記事を書く」がそもそもの目標であるため、あまり掘り下げなくてもいい。が、できるに越した事はない。
- GASのマイライブラリ・マイLINEBotのver8対応と設計
  - 最近実務で運用について考える機会が少ないため、自主的に機会作り
  - 過去に作ったプロジェクトでは、開発を楽にしようと言う視点が大きかったが、運用的に楽になったとはとても言い難いものだった。
  - 運用目線（特にビジネスロジック）でシステムを考えるにはどうするべきか？
  - 主にLINEBotで運用していくので、あわよくばLINE Expertも視野に入れたい

単体レベルのAI系APIを見ていると実装は難しくないので、あとは予算と全てのサービスを紐付けた後の運用耐性が妥当かどうか。
プログラミングの勉強が辛くて難しいように、AIの勉強も辛くて難しいはずなので新しいものに飛び込む時の心構えの話もしたいです。

## とはいえ（懸念）
アドベントカレンダーを例に取ると、今まで最初の段階で構想考えたり事前計画や方針を決めてやるぞ！って決めた内容の通りにできてなかった（でも目標だけは達成している）という実績があり、おそらく今回もそうならないだろうな、という気がしているのでこだわりすぎずに書いていきたいです。
noteとか他のプラットフォーム向けじゃないかと思うものもあったりしますが、PDCAを回しやすくするという目的もあるので、まずはQiitaに向けて全力でやっていくことを目指します。
実は本稿は6/10に投稿する予定の記事として作成していましたが、投稿に当たってQiitaCLIを使おうということで色々検証したり、本業が山場を迎えた関係で今日に至るまで寝かせてしまったという事実もありで、最低限38記事書こう！という目標に対してすでに期間が半分に！
という状況も考えると、悠長なことをしている余裕はないので若干焦り気味でもあるのが正直なところではありますが、事前準備はしてあるのでがむしゃらに頑張る！という事はやりません。
ちゃんとプロジェクトマネジメントしているつもりなので、この辺りをどうやって解決していくかという話についてもある程度戦略は考えているので、改めてそちらで取り上げていく事にします。

とりあえず、（6/10の時点で）やる事は決めたし方針も立てたし、準備も整っているので後は作業をするだけです。

## 今日のプロンプトなど
勉強という意味でいいな、と思ったんでせっかくだから活用していこう、のコーナー。やらないと続かないので、エンジニアフェス中は意識的に取り入れていきたい

### ヘッダ
- Seaart
- [モデル](https://www.seaart.ai/ja/models/detail/760db40b0570d7241f9608f6ab1616b6)
- [LoRA](https://www.seaart.ai/ja/models/detail/ef7d35c4650e865a2e003bbe0e4bb498)
- プロンプト:`プログラマー, ブログ, タイトル, ヘッダー, キャッチー, 最高_品質, ノートパソコン, オペレーター, 一人の女の子, デスク, オフィス, OL`

### フッタ
- Seaart
- [モデル](https://www.seaart.ai/ja/models/detail/760db40b0570d7241f9608f6ab1616b6)
- [LoRA](https://www.seaart.ai/ja/models/detail/ef7d35c4650e865a2e003bbe0e4bb498)
- プロンプト:`プログラマー, ブログ, タイトル, ヘッダー, キャッチー, 最高_品質, ノートパソコン, オペレーター, 一人の女の子, デスク, オフィス, OL`

![動かない扉絵.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/ab752e89-7137-79ff-7816-582f34679fe6.png)
2024/7/2主にITとかセキュリティの記事

「システムの復元」でパソコンを修復、復旧ポイントの上書きに注意(7/1)
https://xtech.nikkei.com/atcl/nxt/column/18/02860/060400001/

なぜVLANを使うのか　LAN分割に3つのメリット［Part1］(7/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/061800194/061800001/

VLANの方式は主に2つ　スイッチ間は「タグ」を使う
［Part2］(7/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/061800194/061800002/

企業ネットワークでの使い方　まず機器管理用VLANを分ける［Part3］(7/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/061800194/061800003/

VLANの「先」にあるもの　集中管理をSDNで実現
［Part4］(7/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/061800194/061800004/

ドメイン名ってどう決まるの？(7/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800014/061800084/
【VBA】Edge操作の基本

●seleniumBasicをインストールする。
https://florentbr.github.io/SeleniumBasic/

●NET Framework 3.5のランタイム
https://www.microsoft.com/ja-jp/download/details.aspx?id=21

●WebDriver(Edge)
該当バージョンをダウンロードし、解凍したexeをSeleniumBasicと同じフォルダにコピーする。

開発タブを挿入し、参照設定でSelenimuを設定する。

★Edge操作の参考
Sub Sophosログイン()

　　Dim driver As New SeleniumVBA.WebDriver
　　Dim element As WebElement

　　Set driver = SeleniumVBA.New_WebDriver

    
　　'新規でブラウザ（Edge）起動　プロファイルが別物で開く
　　driver.StartEdge ThisWorkbook.Path & "\msedgedriver.exe"
　　driver.OpenBrowser

　　'Sophoslogin画面表示
　　driver.NavigateTo "https://172.16.0.1:4444"
    
　　'■最大サイズに変更
　　driver.ActiveWindow.Maximize
    
　　'■Chromeで起動
　　'driver.StartEdge 'Edgeの場合は driver.Start "edge"
　　'driver.Get "https://172.16.0.1:4444/"

　　'Sophoslogin画面表示
　　'driver.NavigateTo "https://172.16.0.1:4444"

　　'■新しいタブを開く
　　'driver.ExecuteScript ("window.open('https://172.16.0.1:4444')")    '対象のURLを開く
      
　　'■対象とするタブを一つ右にずらす(新規タブをフォーカスし、対象とする)
　　'driver.SwitchToNextWindow

　　'表示待ち（適宜調整）
　　driver.Wait 2000

　　'詳細を表示しないのボタンを押す
　　Set element = driver.FindElementByID("details-button")
　　element.Click

　　'詳細を表示しないのボタンを押す
　　Set element = driver.FindElementByID("proceed-link")
　　element.Click

　　'表示待ち（適宜調整）
　　driver.Wait 2000

　　　'ユーザー名入力
　　　Set element = driver.FindElementByName("username")
　　　element.SendKeys "admin"

　　　'パスワード入力
　　　Set element = driver.FindElementByName("password")
　　　element.SendKeys "Zaq12wsxcd?"

　　　'ログインボタンを押す
   　 Set element = driver.FindElementByName("loginbutton")
　　　element.Click

'表示待ち（適宜調整）
    driver.Wait 10000

'ネットワークを選択する
     Set element = driver.FindElementByID("nav-network")
     element.Click
 
'表示順序：料金が安い順
     'Set element = driver.FindElementByID("s")
     'element.SelectByVisibleText "料金が安い順"

'検索ボタンクリック
     'Set element = driver.FindElementByID("searchModuleSubmit")
     'element.Click

'表示待ち、兼、一時停止（適宜調整）
     'driver.Wait 5000

'結果保存
     'driver.SaveScreenshot ThisWorkbook.Path & "\ルート、運賃検索結果.png"
     'driver.SaveHTMLToFile driver.GetPageSource, ThisWorkbook.Path & "\ルート、運賃検索結果.html"

End

End Sub
Javaで「文字列の文字の数(コードポイントの数)を取得する(String.codePointCount)」の動作を確認してみた

# 概要

Javaで「文字列の文字の数(コードポイントの数)を取得する(String.codePointCount)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/string/index9.html

# 実装

以下のファイルを作成しました。
```JSample9_1.java
class JSample9_1{
  public static void main(String[] args){
    String msg1 = "東京都港区赤坂";
    String msg2 = "𪛊あ";

    System.out.println(msg1.codePointCount​(0, msg1.length()));
    System.out.println(msg2.codePointCount​(0, msg2.length()));
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample9_1.java 
$ java JSample9_1 
7
2
```

# まとめ

何かの役に立てばと。
そのdocker-compose.yaml、正しいですか？

環境差異のない環境を簡単に共有・デプロイできることから、開発環境だけではなく本番環境でも広く利用されているDockerですが、あなたの書いているその`docoker-compose.yaml`は仕様に添えていますか？

GitHub等でDockerを用いた環境構築用のrepoを見ていると、未だに`docker-compose.yaml`やcomposeファイル内でのversion記述をよく見かけます。


# `docker-compose.yaml`は非推奨
2024年7月現在、`docker-compose.yaml`は非推奨となっています。
Composeファイルの仕様を定めている[compose-spec](https://github.com/compose-spec/compose-spec)の[Compose fileの項目](https://github.com/compose-spec/compose-spec/blob/master/spec.md#compose-file)を見ると、

> The default path for a Compose file is compose.yaml (preferred) or compose.yml that is placed in the working directory. Compose also supports docker-compose.yaml and docker-compose.yml for backwards compatibility of earlier versions. If both files exist, Compose prefers the canonical compose.yaml.

> Compose ファイルのデフォルトパスは compose.yaml（推奨）または compose.yml で、作業ディレクトリに置かれます。Compose は、以前のバージョンとの後方互換性のために docker-compose.yaml および docker-compose.yml もサポートしています。両方のファイルが存在する場合は、compose.yaml を優先します。

と書かれています。

後方互換のために`docker-compose.yaml`も仕様できますが、非推奨となっている以上、仕様に則った`compose.yaml`を用いるべきでしょう。

未だ多くの環境で`docker-compose.yaml`ファイルを見かけますが、将来的なサポート停止や今後、互換性問題などが浮上する可能性もありますので、極力移行しておきましょう。

ちなみに、手元の環境(Docker Compose v2.26.1)で検証してみたところ、パラメータとしてファイルを指定しない限り、以下の優先順位で実行されました。

1. compose.yaml (最も優先される)
2. compose.yml
3. docker-compose.yml
4. docker-compose.yaml

([この辺](https://qiita.com/CinnamonSea2073/items/7dc16defd6be8526c8e9)が関係してたりするんですかね？)

# versionプロパティは非推奨
最新のDocker環境で、`compose.yaml`に`version`プロパティを指定すると、`'version' is obsolete`という警告が出力されます。

ビルド自体には問題ないのですが、[compose-spec](https://github.com/compose-spec/compose-spec)の[Version and name top-level elements](https://github.com/compose-spec/compose-spec/blob/master/04-version-and-name.md)によると、非推奨になっているようです。

`Compose V1`の仕様では、`version`を見てファイルの検証が行われていましたが、現在は、後方互換性のために仕様そのもの定義されてはいるものの、この`version`の指定値を元にファイルの検証を行うべきではないとされており、もはや不要な項目となっています。

バージョンの差異で正常に動かなさそうではあるのですが、どうやら、古い2.x系と3.x系を1つにまとめて共通のプロパティを統合してよしなにしてるらしいです。

# おわりに
Compose v2以降、`docker-compose`コマンドは`docker`コマンドのサブコマンドとなり、`docker compose`という形式で使用されるようになりました。
この点は私も認識していましたが、`version`プロパティが非推奨化されていたことは把握しておらず、多くのリポジトリ等で依然として使用されていることを踏まえ、周知のためにも投稿しました。

この記事が誰かのお役に立てれば幸いです。
ウェブ開発者向けインフラの基本4


# どうしてデータベースにはたくさんの種類があるの？


## はじめに

データベースとは、たくさんのデータを整理して保存するための仕組みです。でも、どうしてこんなにたくさんの種類があるのでしょうか？

昔は、リレーショナルデータベース（RDBMS）が一番よく使われていました。これらのデータベースは、エクセルのスプレッドシートみたいに、データを表（テーブル）にして保存します。とても便利で、長い間多くの会社で使われてきました。

エクセルのスプレッドシートを思い浮かべてください。データを行と列に整理して書き込むイメージです。エクセルでは、シートがテーブルに相当し、セルにデータを入力していきます。ただし、エクセルは基本的に個人用のツールであり、大量のデータを管理したり、複雑な検索や更新を行うには限界があります。

一方、（エクセルに比べて） リレーショナルデータベースは、大量のデータを効率的に管理できるように設計されています。各テーブルはエクセルのシートと似ていますが、テーブル間の関係（リレーション）を定義することができます。これにより、異なるテーブル間でデータを結びつけ、一貫性のあるデータ管理が可能になります。また、リレーショナルデータベースは、SQLを使用して複雑なクエリやトランザクションを実行することができます。

### 補足：トランザクションの観点:
リレーショナルデータベースは、トランザクション処理をサポートしています。トランザクションとは、一連の操作を一つの単位として扱い、すべての操作が成功するか、あるいはすべてが失敗するかを保証する仕組みです。これにより、データの一貫性と信頼性が保たれます。例えば、銀行口座間の資金移動など、複数の操作が一貫して実行される必要がある場合に重要です。エクセルでは、これらのトランザクション処理を自動的に行うことはできません。

このように、リレーショナルデータベースは、大規模なデータ管理やトランザクション処理が必要なシステムにおいて、エクセルよりも強力で柔軟なツールとなります。

---

## データの種類が増えた！

でも、インターネットが普及して、たくさんの種類のデータが増えてきました。たとえば、SNSの投稿、オンラインショップの商品レビュー、大量の写真や動画などです。こうしたデータをリレーショナルデータベースだけで管理するのは難しくなってきました。

そこで、データの種類に合わせて新しいデータベースが登場しました。それぞれのデータベースは、特定の種類のデータや用途に特化しています。

### 1. ドキュメント指向データベース
データをJSONやXMLのような形式で保存します。自由な形でデータを保存できるので、SNSの投稿や商品レビューなどにぴったりです。

大きなファイルキャビネットのようなものです。いろいろな形のファイルが保存されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/dbbe442b-524f-bdf2-ea71-841df6bb76cf.png)

**主な特徴:**
- 柔軟なデータモデル
- 高速な書き込み性能
- 水平スケーリングが容易

**代表的な製品:**
- MongoDB
- CouchDB
- Firebase Firestore
- Azure CosmosDB (Core または Document と呼ばれる使い方)

### 2. キーバリューストア
データをキーと値のペアで保存します。シンプルでとても速いので、キャッシュ（よく使うデータを一時的に保存する場所）としてよく使われます。
大きな辞書のようなものです。単語（キー）とその意味（値）がペアになっています。


**主な特徴:**
- シンプルなデータモデル
- 高速な読み書き性能
- キャッシュとして利用されることが多い

**代表的な製品:**
- Redis
- Amazon DynamoDB
- Memcached
- Azure Storage Table
- CosmosDB (Table)



### 3. グラフデータベース
データをノード（点）とエッジ（線）で表現します。人や物の関係を表すのに適しているので、ソーシャルネットワークや推薦システムに使われます。
大きな地図のようなものです。地点（ノード）と道（エッジ）があり、それぞれの関係がわかりやすいです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/fe1cf4ca-f1e1-aaf0-ca9c-0780904ce70a.png)


### 4. カラム指向データベース
データを列ごとに保存します。大規模なデータ解析やデータウェアハウスに適しています。
図書館の本棚のようなものです。各棚には特定のカテゴリの本が並んでいます。


**主な特徴:**
- データ間の関係性を重視
- 高度なクエリが可能
- ネットワークデータの処理に適している

**代表的な製品:**
- Neo4j
- Amazon Neptune
- ArangoDB


---

## まとめ

要するに、いろいろな種類のデータを効率よく管理するために、たくさんの種類のデータベースが必要になったのです。それぞれのデータベースには得意なことがあり、適材適所で使われています。

データベースの種類が増えたおかげで、私たちはもっと便利で多様なサービスを利用できるようになりました。それが、たくさんのデータベースがある理由です。





## 最近のメモ

 
 [**ウェブ開発者向けインフラの基本**](https://qiita.com/dms-matthew/items/22440f59370e84be3f55)
 
[**ウェブ開発者向けインフラの基本2**](https://qiita.com/dms-matthew/items/3db4fd1c4328e4efffd3)

[**ウェブ開発者向けインフラの基本3**](https://qiita.com/dms-matthew/items/0b7900723e58003f86d6)
 
[**ウェブ開発者向けインフラの基本4**](https://qiita.com/dms-matthew/items/8bbdc0bf51002fbd8603)
Tailwind CSS 独自のプロパティ名覚えるの大変だな → Master CSS にしようかな

## この記事の概要

Tailwind CSS、便利ではありますがときどきプロパティ名が分からなくなりませんか？

- `font-size`が`text-`から始まるのに対して`font-weight`が`font-`から始まる
- `jutify-`はすべて`justify-`から始まるのに対し`align-`は`content-`と`items-`と`self-`と分かれている
- `place-content`や`place-items`は`place-items-center`など、何の略称もない

ルールがあるような、無いような。

「CSS だとこう書くのは分かってるんだけど……」と迷ってしまうこともあります。

それを解消してくれるかもしれないのが Master CSS です。

https://css.master.co/

## 環境

大抵のフレームワークで使えますが、1 番ポピュラーなので React で説明します。

主要なものだけ記載します。

| 依存関係 | バージョン |
| --- | --- |
| react | 18.3.1 |
| typescript | 5.2.2 |
| vite | 5.3.1 |
| @master/css | 1.37.8 |

## インストール

Vite で環境を作ります。

```sh
npm create vite@latest
```

今回は他の依存関係は必要ありません。

```sh
npm install @master/css
```

`src/main.tsx`のようなファイルに適用すれば OK です。

```diff_tsx:src/main.tsx
  import React from 'react'
  import ReactDOM from 'react-dom/client'
  import App from './App.tsx'
  import './index.css'
+ import '@master/css'

  ReactDOM.createRoot(document.getElementById('root')!).render(
    <React.StrictMode>
      <App />
    </React.StrictMode>,
  )
```

## スタイルの適用

```diff_tsx
  import { useState } from 'react'
  import reactLogo from './assets/react.svg'
  import viteLogo from '/vite.svg'
  import './App.css'

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

    return (
      <>
        <div>
          <a href="https://vitejs.dev" target="_blank">
            <img src={viteLogo} className="logo" alt="Vite logo" />
          </a>
          <a href="https://react.dev" target="_blank">
            <img src={reactLogo} className="logo react" alt="React logo" />
          </a>
        </div>
-       <h1>Vite + React</h1>       
+       <h1 className="font-size:50px font-weight:weight font-style:italic margin:50px text-align:center">Vite + React</h1>
        <div className="card">
          <button onClick={() => setCount((count) => count + 1)}>
            count is {count}
          </button>
          <p>
            Edit <code>src/App.tsx</code> and save to test HMR
          </p>
        </div>
        <p className="read-the-docs">
          Click on the Vite and React logos to learn more
        </p>
      </>
    )
  }

  export default App
```

`font-size:50px`のように、一般的な CSS の書き方から`;`をなくすだけでスタイルを組めます。

もちろん`px`以外でも`rem`や`em`など好きな値を使えます。

## 容量

Master CSS は省略記法を使えて、その方がコードの容量は少なくなります。

クラスの指定に使った文字数は minify などされず、そのまま適用されるからです。

とは言え、一般的な範囲で言えば問題無い程度だと判断しています。

省略記法を使って覚えづらくなったり、チーム内で記法が揺れるくらいなら、完全な状態で書くのもアリだと思います。
ウェブ開発者向けインフラの基本3


# キューと非同期処理の仕組みを理解しよう


ウェブ開発をしていると、「キュー」や「非同期処理」といった言葉を耳にすることが多いですよね。これらの概念は、システムのパフォーマンス向上やユーザー体験の改善にとても重要です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/23c078f5-2ec4-8d7d-5fea-e37d2d405279.png)

---

## キューとは？

キューは、データを一時的に保管するための構造です。簡単に言うと、「順番待ちの列」のようなものです。先に入ったデータから順番に処理される仕組み（FIFO：First In, First Out）です。

テーマパークの人気アトラクションを思い浮かべてみてください。お客さんは列に並んで順番を待ちます。先に並んだ人から順番にアトラクションを楽しむことができます。この「順番待ちの列」がキューの基本的な考え方です。



---

## 非同期処理とは？

非同期処理は、他の処理が完了するのを待たずに次の処理を進めることです。これにより、システム全体の効率が向上し、ユーザーにとってスムーズな体験が提供されます。


```mermaid
sequenceDiagram
    participant ユーザー
    participant ウェブサーバー
    participant キュー
    participant キューワーカー

    ユーザー->>ウェブサーバー: リクエスト送信
    ウェブサーバー->>キュー: リクエストをキューに追加
    ウェブサーバー->>ユーザー: HTTPレスポンスを返す（リクエストをクローズ）
    Note right of ユーザー: 違うことを始める（非同期処理）
    キューワーカー->>キュー: リクエストを取得して処理
    Note right of キューワーカー: 処理を実行（ユーザーにHTTPレスポンスは返さない）
```


## キューと非同期処理の組み合わせ

キューと非同期処理を組み合わせることで、さらに効率的なシステムを構築できます。例えば、会社の情報システム部の田中さんに新しいパソコンを依頼するシナリオを考えてみましょう。田中さんは、メールで依頼を受け取ると、新しいパソコンを購入し、初期設定をして、会社のシールを貼ってくれます。しかし、メールは先着順にキューイングされます。依頼者と田中さんは非同期に動くため、依頼者は田中さんの作業を待つ必要はありません。

```mermaid
sequenceDiagram
    participant 依頼者
    participant メールサーバー
    participant キュー
    participant 田中さん

    依頼者->>メールサーバー: パソコン購入依頼メール送信
    メールサーバー->>キュー: 依頼メールをキューに追加
    メールサーバー->>依頼者: メール送信完了通知（非同期処理）
    Note right of 依頼者: 他の作業を続ける
    田中さん->>キュー: 依頼メールを取得して処理
    Note right of 田中さん: パソコン購入・初期設定・シール貼り
```



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60530/1e8e8263-93bc-188e-03f1-516bf4000926.png)


---

## 実際のシナリオ

例えば、メール送信サービスを考えてみましょう。ユーザーがメールを送信するたびに、サーバーはそのリクエストをキューに追加します。そして、非同期にメールを送信することで、サーバーが一度に大量のリクエストを処理できるようになります。



ウェブ開発をしていると、重たい処理をサーバー側で行う必要があることがあります。そんな時には、サーバーに過度な負荷をかけないように、キューと非同期処理の仕組みを検討してみてください。

この仕組みを使うことで、以下のようなメリットがあります。

- サーバー負荷の分散: リクエストを順番に処理することで、一度に大量の処理が集中することを避けられます。
- ユーザー体験の向上: ユーザーのリクエストを素早く受け付け、処理結果を待つ間も他の操作を続けられるようにします。
- 効率的なリソース利用: サーバーのリソースを効率的に利用し、システム全体のパフォーマンスを向上させます。


このように、キューと非同期処理の仕組みを活用することで、サーバーの負荷を分散し、効率的なシステム運用が可能になります。重たい処理が必要な場合は、ぜひこの仕組みを検討してみてください。




## 最近のメモ

 
 [**ウェブ開発者向けインフラの基本**](https://qiita.com/dms-matthew/items/22440f59370e84be3f55)
 
[**ウェブ開発者向けインフラの基本2**](https://qiita.com/dms-matthew/items/3db4fd1c4328e4efffd3)

[**ウェブ開発者向けインフラの基本3**](https://qiita.com/dms-matthew/items/0b7900723e58003f86d6)
 
[**ウェブ開発者向けインフラの基本4**](https://qiita.com/dms-matthew/items/8bbdc0bf51002fbd8603)
KCNA向け勉強メモ #1

KCNA(Kubernetes Cloud Native Associate)受験前の最後の見直しに使う資料として作成

# NetworkPolicyの特徴
* Kubenetesクラスタ内でPod同士が通信するときのトラフィックルールを規定するもの
* 受信トラフィックは分離可能
* 送信トラフィックは分離不可能
* 送信/受信は異なるNetworkPolicyオブジェクトで管理されている

 # NetworkPolicyを表示するコマンド

```bash
kubectl get netpol
```

# Kubernetesのクライアント証明書
* x509証明書

# OpenID connect(OIDC)
* JWT(JSON Web Token)の認証方法

# Pod
* ステートレスアプリケーションを実行する時に簡単にスケーリングしてローリングアップデートを実行できるリソース

# OpenPolicyAgent(OPA)
* リクエストを検証しポリシーを適用できる

# ContainerRuntimeInterface(CRI)
* Kubernetesが異なるコンテナランタイム（Docker、containerd、CRI-Oなど）と通信するための標準化されたAPI

# REST
* KubernetesAPIのオブジェクトは、RESTfulなHTTP APIに従って操作
    * HTTPメソッド（GET、POST、PUT、DELETE）を使って実行

# kOps
* Kubenetes Operations

# Gauge
* 時間の経過とともに増加または減少する単一の数値を表す Prometheusのメトリックタイプ

# RollingUpdate
* Deploymentでダウンタイムなしで新しいコードをデプロイするデプロイ戦略

# kubectl explain
* Kubernetesリソースタイプに関するドキュメントを取得するのに使用するコマンド

# Kubenetes API
* Kubernetesクラスタのプライマリインターフェイス

# Service Mesh
* サイドカープロキシを使用して通信の制御やセキュリティ、監視などを実現

# Autoscaling戦略
* Cluster Autoscaler
* Vertical Pod Autoscaler
* Horizontal Pod Autoscaler

# デフォルトで作成されるNamespace
* default, kube-public, kube-system, kube-node-lease

# kubeconfigを表示するコマンド

```bash
kubectl config view
```

# NodePort
* 各ノードのポートでリッスンすることでアプリケーションを外部に公開するServiceType

# Ingress
* サービスを外部に公開出来る機能

# Cloud Control Manager（CCM）
* クラウドネイティブ環境でのKubernetesクラスタ管理する機能

# ServiceのIPアドレス
* ClusterIP（Kubenetesクラスタ内でのみ疎通可能な仮想IP）
* ExternalIP（特定のKubenetesNodeのIP）
* NodePort（全KubenetesNodeの全アドレス[0.0.0.0]）
* LoadBalancer（クラスタ外で提供されているLoadbalancerの仮想IP）
* Headless(IPアドレスの提供なし)

# Rook
* 自己管理、自己スケーリング、および自己修復ストレージを作成できるツール

# base64
* KubernetesAPIのSecret内のデータのデフォルト保護レベル

# クラウドネイティブの2つの目標
* 急速なイノベーションと信頼性
03_Material UIの構築ができた

# 前回のお話
ツール作成に使用する言語を何にするか悩んだ結果、Web系で作成することに。

https://qiita.com/ersia/items/61b6a8e4b447b47bed18

# 手を動かすも構築がよくわからない
とりあえず考えるより行動、まずMaterial UIを動かすところから始めることにしました。
一通り入れて起動はできましたが改めてやってみるとよくわからず解決したことが多いので手順メモです。

## まずMaterial UIとは
>Install Material UI, the world's most popular React UI framework.

なるほど、Reactで使えるUIフレームワークなんですね。

>Material UI uses Emotion as its default styling engine.

Emotionというスタイリングエンジンをデフォルトで使用しています。なるほど。

>Material UI uses the Roboto font by default.

Robotoというフォントをデフォルトで使用しています。ふむふむ

## 実行するコマンド

### コマンドの前に参考記事紹介
非常に参考にさせていただいた記事です、手順はこちらをほぼなぞっています。

https://qiita.com/mow_icey/items/d4db94073e0484f2187a

### とりあえず打ち込むコマンドはこれだけで良さそう
`npm install @mui/material @emotion/react @emotion/styled`
`npm install @fontsource/roboto`
楽勝じゃん、即終わるわねこんなの。フフーン

### ・・・と思うじゃん？
実際打ってみたらエラーを吐きました。
当然、そもそもこれはReactで使えるものなので、前提のReactを入れないといけません。
実際はReactが原因じゃないんですけども。

### React入れればいいじゃんと思うじゃん？

そもそもnpmが実行できません。まずNode.jsを入れましょう。

https://nodejs.org/en/download/package-manager

yarnやら色々ありますが、コマンドプロンプトで実行するための記述が違うので一旦npmにしています。
違いについては先人が記事を書いてくださっている～！！！！大感謝～～～～！！！！！

https://qiita.com/conte0745/items/68d7d34b3d28c5172243

個人的には圧倒的に処理速度が早かったので、npmよりyarnが好きです。


### Reactを構築
このコマンドでtestappフォルダにReactの開発環境を作成します。
npxで雛形をダウンロードして構築することができます。
`npx create-react-app testapp`

Enterを押すとこの文章が出てくるので、y押してEnter押します。
```
create-react-app@5.0.1
Ok to proceed? (y)
```

しばらくするとnpmのコマンドがいくつかでてくるすこし上のところに、この文章が出てきます。
```
Created git commit.

Success! Created testapp
```
Success！やったね

### Reactが構築できたか確認
まず先ほどのコマンドで作成したフォルダ（testappフォルダ）に移動します
`cd testapp`

そしてこのコマンドを実行すると、ローカルで初期画面が表示されるように
`npm start`
Compiled successfully!
と出てきたらここにアクセス
[http://localhost:3000](http://localhost:3000)

びえ～～～～！！！やったよ！！動いてるよ～～～～～！！！！！！！！

コマンドプロンプトを閉じたらサーバーも閉じてくれます。
閉じずにそのまま続行します

### いよいよMaterial UIを導入
コマンドプロンプトで先程のtestappフォルダに移動し、これを打つだけ。
`npm install @mui/material @emotion/react @emotion/styled`

フォントはなくても動きますが、見た目は本当に大事、フォントだけに
`npm install @fontsource/roboto`

これでひとまず、Material UIが動くようになりました！

# 次にやりたいこと
まずは画面をどうするか、大まかなデザインに入りたいと思います。
①家計簿アプリと②ゲーム特化タスク管理アプリの2つを考えていますが、②が先ですね・・・
なにしろ私がめちゃくちゃほしいので・・・・・・・・

お読み頂きありがとうございました。エルシアでした

# 参考記事

https://qiita.com/Hai-dozo/items/90b852ac29b79a7ea02b

https://qiita.com/jghiroyukisato/items/1ad59ed6f469af5e696f

https://smillione.co.jp/it_blog/3006/
メガベンチャー３年目のエンジニアが転職ドラフトで転職してみた

*[こちらの記事は転職ドラフト体験談投稿キャンペーンに参加しています](https://job-draft.jp/articles/251)
# 初めに
タイトルにもあるように、都内の某メガベンチャーに勤めて3年目になる自分が、転職ドラフトを使って転職するまでの経緯を時系列で簡単にまとめてみました。
転職ドラフトでご転職を考えられている方のご参考になれば幸いです。

# 転職ドラフトに参加した理由
1番大きな理由は、3年目にもなると、1年目の頃に比べて、普段の業務で成長を感じることも減り、このままの状態が続くことに危機感を感じたからです。
2番目の理由は、今の自分のスキルだともう少し給料を貰っても良いのではないかと、ネット情報などを見ていて感じてたからです。

# レジュメの作成
転職ドラフトでは、一部のユーザーがレジュメを公開してくれているので、その中でオファーを多く貰っていたり、高いオファーを貰っている人のレジュメを参考にレジュメを作成しました。
自分は今までにやった数ヶ月スパンの大きめのタスクを3〜4つほど「概要」->「チーム構成」->「やったこと」->「成果と課題」という順番でまとめました。
また、休日にはRailsやChromiumといったOSSにパッチを5個ほど送ったりもしていたので、そういった成果に関しても記入しました。
レジュメを作成するのには半日以上かかった気がしますが、ここでしっかり内容を記入したことでたくさんのオファーに繋がったと感じますし、転職ドラフト以外の媒体で転職する場合にもレジュメを使い回せるので、レジュメは時間をかけてしっかり書くことをオススメします。
# ドラフト参加
今回は自分の市場価値がどの程度なのか知りたかったので、希望年収の欄は未記入にして参加しました。
最終的には
- 指名: 約30件
- 最低提示年収: 600万
- 最高提示年収: 860万
- 提示年収中央値: 720万

という結果になりました。

# カジュアル面談
面白そうな企業5社くらいに絞ってカジュアル面談を申し込みました。実際に話してみると自分がその企業にマッチしてるかよく分かるので、面接の前に受けるのをオススメします。

# 面接
どの会社も面接回数は2〜3回くらいでした。
内定の承諾期限が一週間しかない企業もあるので、志望度の高い企業は初めの方に受けてしまって、内定が出たらさっさとそこで転職を終わらせてしまうのが良い気がします。
自分は選考の過程であまりマッチしてないかもなという企業も、一応面接を受けてみてたんですが、そういう企業はどこも最終面接で落とされてしまったので、合わないと感じたら選考を辞退した方が時間が節約できて良いかもです。
面接で評価されたなと思うのは、「OSSへの貢献」、「新規事業でのプロジェクト進行管理」、「誤って削除されたデータベースの内容の一部をダンプファイルから復旧させた話」とかです。
逆に、インターンのメンターを数ヶ月くらいやってたこともレジュメには書いてたんですが、その話は一切触れられることはなかったので、マネージメント経験を売りにしたいなら、マネジャーやテックリードといった、ちゃんとした役職についておく必要があるようです。

# 最後に
この記事が少しでも誰かのご参考になりますと幸いです。

ちなみに転職ドラフト登録後に、マイページに紹介コード「**DYHK**」を入力してレジュメ審査を通過しますと、
以下のどれかが転職ドラフト事務局様からプレゼントいただけるので良ければご活用ください！
>- お好きなO’REILLY JAPANの本1冊（税込5500円以内）
>- ACTUSギフトカタログ Straw（ストロー）
>- Amazonギフト券 3000円分（Eメールタイプ）

[キャンペーン詳細](https://job-draft.jp/articles/437)
最後までお読みくださりありがとうございました！
AWS構成図はDraw.ioで書こう！

# はじめに
AWS構成図をまとめたいと思い、ツールを調べていたところ、`Draw.io`というツールを発見しました。
他にも`Miro`など、色んなツールがありますが、以下の観点で`Draw.io`を使用しました。

- 始めやすさ
    - VSCodeを導入していれば、アカウントは不要
    - 個人的にここが一番大きい
- AWSのマークが使える

`Draw.io`は、VSCodeの拡張機能にもあるので、アカウント等は用意することなく、始めることができます。

:::note warn
この記事では、具体的なAWS構成図は紹介いたしません。
構成図を詳しく知りたい方は、別記事を参照ください。
:::

# Draw.io とは
一言で言うと、無料の図表作成ツールになります。
ドラッグ&ドロップの操作で、簡単にフローチャートや組織図、UML図などのダイアグラムを作成することができます。

https://qiita.com/riku-shiru/items/5ab7c5aecdfea323ec4e

# Draw.io Integration
`Draw.io Integration`は、Draw.ioをVSCode上で使えるようにしてくれた拡張機能になります。

![スクリーンショット 2024-07-02 0.48.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849898/4e1d15b3-8c8e-b05b-98ab-4edba2e771f7.png)

インストールがまだの方は、早速インストールしましょう。
新しくファイルを作成して、拡張子が`.drawio`、`.dio`、`.drawio.svg`、`.drawio.png`にすると、エディター画面が開きます。

![スクリーンショット 2024-07-02 1.00.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849898/3ae47e02-1bd2-e64e-d55a-28d0cc7dd47b.png)

あとはここで、自由に操作するだけです。


## AWSのリソースアイコンが使用できる
「その他の図形」 > 「ネットワーク / AWS19」を選択して、適用を押します。
そうすると、AWSのアイコンを自由に使えることができます。

![スクリーンショット 2024-07-02 1.10.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849898/06ec5bd5-a221-9628-e6c9-247cb39142e1.png)

これはすごく便利ですね...！！

# まとめ
最初に記載した、「始めやすさ」は個人的には、Draw.ioが群を抜いているかなと思いました。
これでドキュメントを残して、未来の開発者に役立ててもらいたいですね。

最後までご覧いただき、ありがとうございました。
Next.jsのuseClientとは？

# use clientとは
クライアントサイドで動作する必要があるコンポーネントを指定するために使います。
これにより、クライアントサイドでのインタラクティブな操作が可能になります。

- 補足(***インタラクティブ***とは)

1.React Hooks関数コンポーネントで状態管理やライフサイクルイベントを扱うための機能で、useStateやuseEffectなどです。

2.イベントハンドラー
イベントハンドラーは、ユーザーの操（クリック、入力、フォームの送信など）に応じて特定の処理を実行するための関数)
です。

# 小学生にもわかるように解説
家でゲームをしていて、ゲーム機がある部屋（サーバールーム）と、ゲームをしている部屋（クライアントルーム）があります。

- サーバールーム（Server Room）
ここにはたくさんのデータやゲームのルールが保存。
部屋の中の人（プログラム）は、色々な準備をして、データをクライアントルームに送ります。

- クライアントルーム（Client Room）
ここで実際にゲームを遊びます。
ゲーム機やコントローラーがあり、ボタンを押したり、キャラクターを動かしたりします。


ゲームの準備ができたら、データをクライアントルームに送り、
クライアントルームで、あなたがゲーム機のボタンを押したりしてプレイします。

```use client```は、「この部分はクライアントルームで遊ぶためのものだよ！」と教えてあげるラベルのようなものです。

例えば、あなたがボタンを押すとキャラクターがジャンプするプログラムがあります。このプログラムは、クライアントルームで動かさないといけません。そこで、「use client」と書いておくと、「このプログラムはクライアントルームで動かすよ！」とわかるようになります。


# 実際の例
ログインページではuseclientを使いました。
```src/app/login/page.tsx
"use client"

import { Input } from "../../components//atoms/Input";
import { PrimaryBtn } from "../../components/atoms/PrimaryBtn";

export const Login = () => {
  return (
    <div className="w-[500px] bg-white rounded-lg shadow-lg py-10">
      <form className="flex flex-col justify-center items-center gap-10">
        <h1 className="text-3xl text-lime-800 font-bold text-center">
          ログイン
        </h1>
        <div className="w-[80%]">
          <Input
            type="text"
            placeholder="email"
          />
        </div>
        <div className="w-[80%]">
          <Input
            type="password"
            placeholder="password"
          />
        </div>
        <PrimaryBtn onClick={() => null}>ログイン</PrimaryBtn>
      </form>
    </div>
  );
};

export default Login;
```
ボタンに関するコンポーネントでも使いました。
```src/components/atoms/PrimaryBtn.tsx
"use client"

import { ReactNode } from 'react'

type PropsType = {
    onClick: () => void
    children:ReactNode
} 

export const PrimaryBtn = ({ onClick,children }: PropsType) => {
  return (
    <button className="bg-lime-800 text-white p-4 text-lg rounded-lg" onClick={onClick}>
      { children }
    </button>
  )
}

export default PrimaryBtn
```

# 使用ケース
調べたら以下のケースでよく使われるみたいです。
1.```認証```
認証関連の機能は、ユーザーの入力、セッション管理、API呼び出しなど、クライアントサイドで処理する必要がある時

ex)
ログインフォームやユーザープロフィールの編集など


2.```フォームの入力とバリデーション```
ユーザーが入力するフォームは、クライアントサイドでのインタラクティブな操作が必要

ex)
入力値のバリデーションや動的なフィードバックを行う場合

3.```状態管理```
コンポーネント内部で状態を持つ時（ex useStateやuseReducerを使う時）

4.```イベントハンドリング```
クリックイベントやフォームの送信など、ユーザーの操作に応じて処理をする時

# 注意
***Reactではuse clientは使いません***。
理由はReactには、SSRの仕組みなどがないからです。


# 資料
ChaGpt参照

https://www.youtube.com/@yudai-hc/videos