OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift】String型（やInt, Double etc...）からEnumへの変換

## 概要
String型からEnumに変換してプロジェクト内で使うシーンは多々ありますよね
簡単かつ雑にまとめておきます

## 変換方法
以下のドキュメントにある`RawRepresentable`プロトコルのイニシャライザを使う。
もう本当にそれだけです笑

https://developer.apple.com/documentation/swift/rawrepresentable/init%28rawvalue%3A%29

実際に使ってみると以下のようになります。
```swift
// ※String型のRawRepresentableに準拠させる
enum Fruit: String {
    case apple
    case banana
    case orange
}

let fruit = Fruit(rawValue: "apple") // ここでrawValueからEnumインスタンス生成
print(fruit) // Optional(Fruit.apple)

// enumなので分岐も網羅できて良き
if let fruit {
    switch fruit {
    case .apple, .orange:
        print("This is an " + fruit.rawValue)
    case .banana:
        print("This is a " + fruit.rawValue)
    }
}
```
このような感じで、Enumのイニシャライザ引数であるrawValueに変換したい文字列を渡してあげることで、Enumのインスタンスが生成されます。

**ポイント**
1. 変換先のEnumはString型を割り当てる
1. `init(rawValue:)`イニシャライザの引数に変換したい文字列を指定


case名と異なる文字列をEnumに変換することも可能です。
```swift
// 対応する文字列を各caseに割り当てる
enum Fruit: String {
    case apple = "リンゴ"
    case banana = "バナナ"
    case orange = "オレンジ"
}

let fruit = Fruit(rawValue: "オレンジ")
print(fruit) // Optional(Fruit.orange)
```
## 注意点
生成されたインスタンスは、**Optional型**で、対応するcaseがない場合は**nil**を返します。
以下をご覧ください。

```swift
enum Fruit: String {
    case apple
    case banana
    case orange
}

let fruit = Fruit(rawValue: "peach")
print(fruit) // nil


```
このようにcaseに定義していない文字列から生成した場合nilになりますので、
アンラップするなり、nilの場合の処理を追加するなりして使用しましょう。

### ちなみに
今回Stringからの変換で紹介しましたが、init(rawValue:)のイニシャライザは`RawRepresentable`プロトコルに準拠していれば使用ができます。
そのため、Int, Float, Doubleなどでも使用できます。

```swift
enum Temperature: Double {
    case cold = -10.5
    case warm = 20.0
    case hot = 35.5
}

let temp = Temperature(rawValue: 20.0)
print(temp) // Optional(Temperature.warm)
```

## おわりに
かなり簡単に変換ができましたね。
個人的にはAPIレスポンスで受け取った文字列から、モバイル側でEnum管理するパターンがかなり多いためよく使用します。
（なのにあってるっけ...ってなるのでまとめました）
覚えておきましょう！
式でWBS作成

### Excel式でWBSを作成
要件：
①　土日、休日がグレーにする
②　予定、実績の工数は日にわける
③　予定と実績の線が日付より引かれる
### 式
①土日、休日 リストシートに休日をリストする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/529e2fd5-0cc6-42c7-85d7-888de3e58103.png)
グレーする
```
=OR( TEXT(DC$8,"aaa")="土",TEXT(DC$8,"aaa")="日",COUNTIF(リスト!$D$4:$D$19,DC$8)>0)

```




②予定線
```
=$DC$11:$EK$139,$DC$141:$EK$411
```

③実績線
```
=AND(DC$8>=$K11,DC$8<=$L11)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/c7e6a9da-dc6a-40f9-9c68-75dc3e051d21.png)


```
=IF($K$2="予定",IF(DF$8>=$H154,IF(DF$8<=$I154,VALUE(TEXT($J154/NETWORKDAYS($H154,$I154,リスト!$D$4:$D$19),"##.00")),""),""),IF(DF$8>=$K154,IF(DF$8<=$L154,VALUE(TEXT($M154/NETWORKDAYS($K154,$L154,リスト!$D$4:$D$19),"##.00")),""),""))
```
【供養】跳ねるロゴ背景を作った

## 概要
姉のお店の予約画面をGoogleFormから移行するサイトを作成していたところ、GoogleForm見たいといわれてしまいショックを受けたため、跳ねるロゴを背景に入れるようにした。
最終的にお気に召さなかったため、ここで供養する。

## 動き

![2025-02-16_20h01_15.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/b8a627f1-41aa-4087-ad95-94b5a8cbc349.gif)

gifにしたのでかくかくしているが、滑らかに動くようにしている。

## 実装

```html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Bouncing Logo</title>
  <style>
    body {
      margin: 0;
      overflow: hidden;
    }

    canvas {
      position: absolute;
      top: 0;
      left: 0;
      z-index: 0;
      pointer-events: none;
    }
  </style>
</head>

<body>
  <canvas id="bouncingCanvas"></canvas>

  <script>
    document.addEventListener("DOMContentLoaded", function () {
      const canvas = document.getElementById("bouncingCanvas");
      const ctx = canvas.getContext("2d");

      function handleResize() {
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
      }

      handleResize();
      window.addEventListener("resize", handleResize);

      const logoImg = new Image();
      logoImg.src = "sample-logo.svg"; // 適宜修正

      let requestId;
      let imagesLoaded = false;
      logoImg.onload = () => {
        imagesLoaded = true;
        startAnimation();
      };

      const leaderWidth = 200;
      const leaderHeight = 40;
      const leader = {
        x: 0,
        y: 0,
        vx: (Math.random() - 0.5) * 8,
        vy: 5,
        width: leaderWidth,
        height: leaderHeight,
      };

      const gravity = 0.5;
      const frictionX = 0.999;
      const restitution = 0.8;

      function animate() {
        requestId = requestAnimationFrame(animate);

        if (!imagesLoaded) return;

        ctx.clearRect(0, 0, canvas.width, canvas.height);

        leader.vy += gravity;
        leader.x += leader.vx;
        leader.y += leader.vy;
        leader.vx *= frictionX;

        if (leader.x > canvas.width) {
          leader.x = canvas.width;
          leader.vx = -leader.vx * restitution;
        } else if (leader.x < leader.width) {
          leader.x = leader.width;
          leader.vx = -leader.vx * restitution;
        }

        const bottom = leader.y + leader.height;
        if (bottom > canvas.height) {
          leader.y = canvas.height - leader.height;
          leader.vy = -leader.vy * restitution;

          if (Math.abs(leader.vy) < 8) {
            leader.vy = -(10 + Math.random() * 10);
            leader.vx = (Math.random() - 0.5) * 8;
          }
        } else if (leader.y < 0) {
          leader.y = 0;
          leader.vy = -leader.vy * restitution;
        }

        ctx.drawImage(
          logoImg,
          leader.x - leader.width,
          leader.y,
          leader.width,
          leader.height
        );
      }

      function startAnimation() {
        requestId = requestAnimationFrame(animate);
      }
    });
  </script>
</body>

</html>
```

`canvas`を利用して書いている。ロゴを一つ描画している程度なので、スマホでも問題なく動作する。1個のロゴの軌跡を追従するようにしてみたときは、少しほっとくと書くつくほど重かったため、1つに変えた。

一定の基準を下回ると大きくはね、ランダムに左右にはねるように作った。

## まとめ
でざいんってむずかしい٩( ᐛ )و
[Express初心者メモ]ユーザーの動きを考えるとイメージできた①（ルーティング）

## はじめに
Expressを使い始めた時、特に以下の点で悩んでいました。

- <font color="#bce2e8">**send, use, get, postなどの使い方がわからない**</font>
どのメソッドをどのタイミングで使うべきかが全然理解できませんでした。

- <font color="#bce2e8">**その構文をなぜ書くのかがわからない**</font>
初心者がコードを見てもその意味がピンときませんでした。

### これらを解決するために：
バックエンドの処理とユーザーの動作を結びつけて考えると理解しやすかったので、自分の備忘録として記載しています。

※Udemyや独学で勉強している方の基礎固めになれば幸いです。
独学初心者のため、考え方に相違がある場合はぜひご指摘いただけると幸いです:bow:


## この記事の内容
1. Expressとは
2. ルーティングの基本
（別記事）動的・静的とは？
（投稿予定）ターミナルがエラーだらけの解決法
  2-1. 環境構築（コードを書く前の準備）
  2-2. コードの記述と実装
3. PATHパラメータの取得
4. GETパラメータの取得
5. POSTリクエストの処理
6. 実践：簡単なAPIを作る
7. まとめ

長文となるため、目次ごとに投稿していきます:bow:

▼ 今回の記事
1. Expressとは
2. ルーティングの基本


## 1. Expressとは
Expressは、Node.jsで動く軽量なWebフレームワーク。ブラウザ（ユーザー操作）のリクエストを処理するサーバーを、手軽に作れます。

まずは、ルーティングの基本について勉強しました。
## 2. ルーティングの基本
ルーティングは「どのURLにアクセスしたら、どの処理をするか」を決める仕組みで、ユーザーのリクエストに対して適切なレスポンスを返します。

ルーティングの流れはこのような感じです：
| ステップ | 操作内容 | 説明 |
| --- | --- | --- |
| ① ユーザーの操作 |ユーザーがlocalhost:3000/aboutにアクセス  | ユーザーがURLにアクセス  |
| ② サーバーの処理  |app.get("/about") でリクエストを処理   | サーバーがリクエストを受けて「About Page」を返す  |
| ③ ゴール  |  ブラウザに「About Page」が表示される |  ユーザーがページを確認 |

このステップをもとに、実際にコードを書いていきます:muscle:

### （別記事）動的・静的とは？
自分がこの時点で？？？だったのが、ユーザーが直接URLにaboutを入力することなんてないのではと、ほとんどはaboutのボタンなりをクリックしてページを表示するのが通常ではと思いました。
ルーティングには動的・静的の2種類があることを知り、今回は静的ルーティングを扱います。

▼動的と静的の違いについて、勉強メモとしてまとめました。
[動的・静的とは？](https://qiita.com/Hana_/items/2e8a242849e200fcd6df)

### 2-1. 環境構築（コードを書く前の準備）
まずは、必要な準備をして、Expressを使える状態にします。
① npmの初期化
```javascript
npm init -y   //package.jsonを生成
```
② Expressのインストール
```javascript
npm install express  //Expressをインストール
```
③ディレクトリの構成
```javascript
my-express-root
 ├── index.js           //Express サーバーファイル
 ├── package.json       //Node.js プロジェクト設定
```

index.jsは個人で作成します。作成できたら次はindex.js内にコードを書いていきます！
### 2-2. コードの記述と実装
### index.js
```javascript
//①Expressをインストールして使用
const express = require("express");　//Expressをロード
const app = express();　//アプリケーションを作成

// ② ルーティング（GETリクエストの処理）
// `/` にアクセスしたときの処理
app.get("/about", (req, res)=>{  
  res.send("aboutページ一覧です");
});

//③サーバーを起動（ポート3000で待機）
app.listen(3000, () => {
  console.log("Server is running on port 3000");
});
```
次に実装するためにターミナルで以下のコマンドを実行して、実装したいフォルダに移動します。
```javascript
cd ~/Desktop/my-express-root
```
移動できたら、nodemon を使って index.js のサーバーを起動します。
nodemonを使うと、コードを変更するたびに自動でサーバーが再起動されます。
nodemonをインストールされていない場合は、以下のコマンドでインストールしてください。
```javascript
npm install -g nodemon  // nodemonをグローバルにインストール
```
インストール後、ターミナルで以下のコマンドを実行してサーバーを起動します。
```javascript
nodemon index.js
```
localhost:3000でサーバーを立ち上げるようコードを書いているので、検索で``localhost:3000/about``を実行します。
結果が「aboutページ一覧です」と表示されると成功です！


### 補足
ルーティングの静的には express.static() を使う場合があります。
👉 express.static() を使う場合 → フォルダ内のHTMLファイルを 自動で提供（複数の静的ファイルを扱うとき便利）
👉 express.static() を使わない場合 → res.send() や res.sendFile() で 個別にレスポンスを制御（特定のページだけ返したいとき）

ご一読いただきありがとうございました！
STM32F303K8、フィボナッチ数列で遊ぶ(UNO3比9倍程度)


x 過去ログを見よ!!!

目的
整数のベンチマークする


いろいろ
Arduino UNO R3は、約17542msで
STM32F303K8は、約1971msで約9倍、速い

Arduino UNO 3 約17542ms(18秒)
M5NanoC6 約336ms(0.3秒)
M5StampS3 約328ms(0.3秒)
STM32H743 約72ms(0.072秒)
STM32F303K8 約1971ms(1.971秒)


結果
----





![Screenshot from 2025-02-16 19-45-51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/51523b68-2174-4ca1-9dd7-249cdff524d3.jpeg)


![o_coq815.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e3666f72-af4d-43a8-8601-ad37a909d882.jpeg)



プログラム
----



```c++




//値が100,000を超えるまでのフィボナッチ数列を生成する作業を500,000回繰り返すのに要した時間を計測する。
#define DEBUG 0
void setup() {
  Serial.begin(9600);
  Serial.println();
  Serial.print("START");
  for(int i = 0;i < 9;i++){
    Serial.print('.');
    delay(500);
  }
  Serial.println();
}
void loop() {
  unsigned long x;
  unsigned long prevx;
  unsigned long temp;
  unsigned long start_time, end_time;
  unsigned long time;
  start_time = millis();
  for (unsigned long a = 0; a < 500000; a++) {
    x = 1;
    prevx = 0;
    while (x < 100000) {
      temp = x;
      x = prevx + x;
      prevx = temp;
#if DEBUG
      Serial.println(x);
#endif
    }
  }
  end_time = millis();
  time = end_time - start_time;
  Serial.print("END Value:");
  Serial.println(x); //最後の値の出力
  Serial.print("StartTime:");
  Serial.print(start_time);
  Serial.print(" EndTime:");
  Serial.print(end_time);
  Serial.print(" Time:");
  Serial.println(time);
  delay(1000);  //1秒待機
}






```
PowershellでKeycloakのSAMLアサーション取得まで

# 目的

KeyCloakのデプロイ、SAMLアサーションの設定、ユーザーの設定完了後、SAMLアサーション発行までの動作試験を素のWindowsで実行するため。

# コード

```
# セッションオブジェクトの作成
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
# KeycloakのURL
$url_keycloak = "＜http or https＞://＜KeycloakのURL＞/realms/＜レルム名＞/protocol/saml/clients/＜Clientsで設定した文字列＞"
$username = "＜Keycloakのユーザー名＞"
$password = ＜Keycloakのパスワード＞"

# ログイン画面取得リクエストの送信
$loginResponse = Invoke-WebRequest -Uri $url_keycloak -Method Get -WebSession $session

# ログイン画面に含まれるユーザー、パスワード入力フォームに情報を入力。
$form = $loginResponse.Forms[0]
$form.Fields["username"] = $username
$form.Fields["password"] = $password

# ログインリクエストの送信
$samlResponse = Invoke-WebRequest -Uri $form.action -Method Post -Body $form.Fields -WebSession $session

# 今回は表示するだけ。SAMLアサーションを使ったSSO処理の追加が必要。
Write-Output $samlResponse.Forms[0].Fields["SAMLResponse"]

```

# 注意点

- httpsで通信する場合、証明書の設定が必要、オプションの追加が必要

# その後に必要な対応

- SAMLアサーションを使ったSSO処理の実装

# 使いどころ

- セキュリティ要件で追加のアプリインストールができない場合
- アプリチームから試験に利用可能なアプリ提供がない。又は日程的に提供されるのが先になる場合
[Express初心者メモ]ユーザーの動きを考えるとイメージできた②（動的・静的とは）

## はじめに
Express を勉強していて、「動的」と「静的」の違いによってコードの書き方が変わることに混乱したため、自分の備忘録としてまとめました。
※Udemyや独学で勉強している方の基礎固めになれば幸いです。
独学初心者のため、考え方に相違がある場合はご指摘いただけると幸いです:bow:

## 動的ファイルと静的ファイルの違いとは？
Expressでは、「ファイルの提供方法」によって動的・静的に分かれます。
どちらを使うかは、ページの内容が変わるかどうかで判断！
下記で覚えるとイメージしやすかったです。
| | 例 | 特徴 |
| --- | --- | --- |
| 静的ファイル |会社概要ページ（about.html）| 事前に作成されたHTMLをそのまま配信|
| 動的ファイル|検索結果ページ（search.ejs）| ユーザーごとに異なるデータを埋め込んで生成|

それぞれの特徴を詳しく見ていきます。

- 静的ファイル 
.html や .css など、あらかじめ作成されたファイルをそのまま表示する
express.static("public") を使って提供する

例：静的なページ（about.html）を配信
```javascript
app.use(express.static("public"));  // publicフォルダの中身を静的ファイルとして提供
```

▼ 静的ファイルの構成
```javascript
/my-express-static
 ├── public              // 静的ファイルを格納するフォルダ
 │    ├── about.html     // 固定ページ（静的ファイル）
 │    ├── styles.css     // CSSファイル
 │    ├── script.js      // クライアント用のJavaScript
 ├── index.js            // Expressサーバーファイル
 ├── package.json        // Node.jsプロジェクト設定
```

- 動的ファイル
サーバーでデータを埋め込んで HTML を生成する
テンプレートエンジン（EJS など）が必要
res.render("search", { results }) でデータを渡して表示する

例：検索結果ページ（search.ejs）を動的に表示
```javascript
app.get("/search", (req, res) => {
  const results = ["Apple", "Banana", "Cherry"];  // 検索結果のデータ
  res.render("search", { results });  // search.ejs にデータを渡して表示
});

```

▼ 動的ファイルの構成
```javascript
/my-express-dynamic
 ├── views               // 動的ファイル（EJSテンプレート）を格納するフォルダ
 │    ├── search.ejs     // 検索結果ページ（動的ファイル）
 ├── index.js            // Expressサーバーファイル
 ├── package.json        // Node.jsプロジェクト設定
```
### 💡まとめ
「サーバーからデータを取得・更新するなら動的、それ以外は静的」と考えると理解しやすかったです。
Djangoのmigration機能でDBモックデータを投入しよう！

:::note alert
本記事は開発初期段階やハッカソンなどで***DBレコード,migrationsファイルの削除***が許容される場合を想定し、手順を記載しております。
:::

## 1. 手順

:::note warn
DBにある既存データは、下記コマンドにより削除されます。
実行する際はご注意ください。
:::

# たったこれだけの手間！
コマンドは **たった5つ** 叩くだけです。
慣れていない方でも**ほぼ確実に再現できる**やり方です！

まずは操作手順からどうぞ。
（パスはご自身の環境に合わせて編集してください）

### ローカル環境での実行

```bash
# DBデータを削除
python manage.py flush

# マイグレーションファイルを削除（__init__.pyは残す）
rm app/migrations/0*.py

# マイグレーションを再作成
python manage.py makemigrations

"""
ここで後に解説するマイグレーションファイルをapp/migrations/配下に作成（配置）します。
"""

# マイグレーションを実行
python manage.py migrate
```

### Docker環境への実行

```bash
# DBデータを削除
docker-compose exec web python manage.py flush

# マイグレーションファイルを削除（__init__.pyは残す）
rm app/migrations/0*.py

# マイグレーションを再作成
docker-compose exec web python manage.py makemigrations

"""
ここで後に解説するマイグレーションファイルをapp/migrations/配下に作成（配置）します。
"""

# マイグレーションを実行
docker-compose exec web python manage.py migrate
```

## 2. モックデータの作成と投入
:::note warn
models.py の記述が正しくされていることが前提になります。
:::    

1. `models.py`の内容を生成AIに読ませる

2. 「"migrations.RunPython"を使用してモックデータを作成」と指示      

3. 生成されたコードをマイグレーションファイルとして保存
   - 保存先：`migrations/0002_[説明的な名前].py`
   - 例：`migrations/0002_add_mock_data.py`

***下記のようなコードが生成されます。***

```python
# 生成されたコード例
from django.db import migrations
from django.utils import timezone

def create_initial_data(apps, schema_editor):
    User = apps.get_model('app', 'User')
    
    users = [
        User(
            id=1,
            username='test_user1',
            email='test1@example.com',
            password='password123',
            created_at=timezone.now(),
            updated_at=timezone.now()
        ),
    ]
    User.objects.bulk_create(users)

def remove_initial_data(apps, schema_editor):
    User = apps.get_model('app', 'User')
    User.objects.all().delete()

class Migration(migrations.Migration):
    dependencies = [
        ('app', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(create_initial_data, remove_initial_data),
    ]
```

生成AIの作成するデータが正しいかどうかはご自身で確認ください。

## 3. migrations.RunPythonの解説

`migrations.RunPython`は、Djangoのマイグレーション機能の一つで、Pythonコードを使ってデータベースを操作するためのメソッドです。

### 主な用途
- 初期データの投入
- 既存データの変更
- データの移行処理
- カスタムデータ操作

### 基本構造
```python
migrations.RunPython(
    forwards_func,  # マイグレーション適用時の関数
    reverse_func   # ロールバック時の関数
)
```

### 動作の仕組み
1. マイグレーション適用時（`python manage.py migrate`）
   `forwards_func`が実行されデータベースへの変更が行われる

2. ロールバック時（`python manage.py migrate app 0001`など）
   `reverse_func`が実行され変更が元に戻される
   

:::note
#### あとがき
今回は限定的な場面での実施手順を書きましたが、`migrations.RunPython`やmigrationはまだまだ奥が深く、既存のデータを活かした実装もいけるようでした。
検証用データなどは実務でも使う機会が多いため、この辺りのスキルは実は重要な気がしています。
個人的にこういった開発に付随して必要な技術や知識はもっと深めていきたいです。

最後まで拝読いただきありがとうございました。
:::
IntelliJ + WSL2でプロジェクトが正しく読み込まれない時の対処法

## 問題
- ディレクトリが正しく読み込まれない
- Project StructureでSDKとモジュールが空になっている

## 解決手順

1. WSLにJDKをインストール
    ```bash
    sudo apt update
    sudo apt install openjdk-21-jdk
    ```

2. JDKの場所を確認
    ```bash
    ls /usr/lib/jvm/
    # または
    update-alternatives --list java
    ```

3. IntelliJの設定
- Project Structure を開く（⌘; または Ctrl+Alt+Shift+S）
- 左側の「Project」を選択
    - 「Project SDK」→「Add SDK」→「JDK」
    - WSLのJDKパスを指定（例：`/usr/lib/jvm/java-21-openjdk-amd64`）
- 同様に「module」タブ選択
    - + で新規モジュール追加
    - 場所はprojectのrootディレクトリ
    - ビルドシステム intelliJ
    - jdk 先ほどダウンロードしたやつ
- 作成

これで自分は読み込まれるようになりました。
Reactイベントハンドラ命名慣習 handleSomething, onSomething

# 自分用メモ
## Reactイベントハンドラの一般的な命名規則
- propsとして渡すイベントには`onSomething`、イベントを処理するハンドラ関数には`handleSomething`を使うことが一般的だそう。

```react
const Children = ( { onButtonClick } ) => <button type="button" onClick={onButtonClick}>Button</button>

const Parent = () => {
    const handleClick = () => {
        console.log("clicked!");
    }

    return <Children onButtonClick={handleClick} /
}
```
このリンクの少し上の箇所

https://ja.react.dev/learn/tutorial-tic-tac-toe#why-immutability-is-important
UnityのStandardAssetsをダウンロードしよう

Standard Assets for UnityがAssetStoreから姿を消したので、StandardAssetsをダウンロードする代替手段を教えます。

まず以下のサイトにアクセス

https://unity.com/releases/editor/archive

そして2018のタブに飛び、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680216/eb9e2ee5-bdc1-42f5-be41-5b93b42d1a17.png)

2018.1.9f2を探します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680216/d5f85d58-73f3-49e0-9200-55897d552a3e.png)

そのままInstallボタンを押せばUnityHubが起動し、どの項目をダウンロードするかというチェックボックスと共にStandardAssetsが含まれているかと思います。
※僕はすでにDLしているので画像は出せません。

それを普通にダウンロードし、Install Completeと出ればOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680216/3f6410c0-27a3-4588-bf0f-c46e519e7bdb.png)

無事にインストールできていれば、以下のディレクトリにStandardAssetsというフォルダが生成されているかと

C:\Program Files\Unity\Hub\Editor\2018.1.9f2\Editor

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680216/b9579302-8df5-4f1a-91f2-04af84db4665.png)

その中のpackageファイルをUnityでImportするなりして、完了です。
【解決】yarn storybook実行時のエラー - 知らぬ間にYarn Berryに切り替わっていた話

## はじめに

最近、既存のプロジェクトで `yarn storybook` を実行しようとしたところ、予期せぬエラーに遭遇しました。調査してみると、知らぬ間にYarn Berryにアップグレードされていたことが原因でした。この記事では、その問題の解決方法を共有します。

## 発生した問題

以下のようなエラーが発生しました：

```bash
! The local project doesn't define a 'packageManager' field. Corepack will now add one referencing yarn@3.2.3+sha512...
! For more details about this field, consult the documentation at https://nodejs.org/api/packages.html#packagemanager

**Internal Error**: hoge-package@workspace:.: This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile
```

`yarn install` を実行すると、今まで見たことのない以下のようなファイルが生成されました：

```bash
Untracked files:
  .pnp.cjs
  .pnp.loader.mjs
  .yarn/
  yarn.lock
```

## 原因

この問題は、プロジェクトが知らぬ間にYarn Berry（v3.2.3）に切り替わっていたことが原因でした。

### Yarn Classic vs Yarn Berry
Yarnには大きく分けて2つのバージョンがあります：

1. **Yarn Classic (v1系)**
   - 従来の一般的なパッケージマネージャー
   - `node_modules` ディレクトリを使用
   - 多くのプロジェクトで使用されている標準的なバージョン

2. **Yarn Berry (v2以降)**
   - Plug'n'Play (PnP) という新しいモジュール解決システムを使用
   - `.yarn` ディレクトリや `.pnp.cjs` などの独自の設定ファイルを使用
   - より高度な機能を提供する新しいバージョン

## 解決方法

以下の手順で問題を解決できました：

1. まず、Yarn Berryによって生成された新しいファイルを削除
```bash
rm .pnp.cjs .pnp.loader.mjs yarn.lock
rm -rf .yarn
```

2. Yarnを従来のバージョン(v1)に戻す
```bash
corepack disable
npm install -g yarn
```

3. 依存関係を再インストール
```bash
rm -rf node_modules
yarn install
```

4. Storybookを起動
```bash
yarn storybook
```

## なぜこの解決方法が有効だったのか

- プロジェクトは元々Yarn Classicで構築されていたため、Yarn Berryの新しい機能や設定ファイルは不要でした
- Yarn Classicに戻すことで、プロジェクトの既存の構成や依存関係の管理方法を維持できました
- 余分な設定ファイルを生成せずに、必要なパッケージのみをインストールできるようになりました

## 教訓

- パッケージマネージャーのバージョンが予期せず変更される可能性があることを認識しておく
- エラーメッセージに「packageManager field」や「Corepack」という言葉が出てきたら、Yarnのバージョンを確認する
- プロジェクトの依存関係管理方式を変更する際は、チーム全体で合意を得てから行う

## まとめ

今回の問題は、Yarn BerryとYarn Classicの違いを理解し、適切なバージョンに戻すことで解決できました。このような問題に遭遇した際は、まずパッケージマネージャーのバージョンを確認することをお勧めします。

## 参考リンク
- [Yarn Berry Documentation](https://yarnpkg.com/getting-started/migration)
- [Node.js Corepack](https://nodejs.org/api/corepack.html)
- [Yarn Classic Documentation](https://classic.yarnpkg.com/)
jQueryで名前入力フォームを実装。バリデーションとアラートの基本

```html
<form action="#" id="js-form-name" class="p-form">
  <div class="p-form__input">
    <input
      type="text"
      id="js-input-name"
      class="c-input"
      placeholder="山田　太郎"
    />
    <p class="p-form__error-message"></p>
  </div>
  <button type="submit" class="p-form__button c-form-button">送信</button>
</form>
```
```js
jQuery("#js-form-name").on("submit", function (e) {
  e.preventDefault();

  const nameInput = jQuery("#js-input-name");
  const nameValue = nameInput.val();

  if (!nameValue) {
    nameInput.next(".p-form__error-message").text("名前を書いてね");
    return;
  }

  nameInput.next(".p-form__error-message").text("");
  alert(`${nameValue}さん、ようこそ`);
});
```

```js
jQuery("#js-form-name").on("submit", function (e) {
```
`#js-form-name`に対して、`submit`イベントを監視（バインド）する。
ユーザーがフォームの送信ボタンを押すと、この関数が実行される。

※`e`は「イベント情報」を受け取るための変数で、“event”（イベント）の略。中身は「イベントオブジェクト」と呼ばれ、クリックや送信などの詳細な情報が入っている。

```js
e.preventDefault();
```
デフォルトの送信動作を無効化する。通常、フォームが送信されるとページがリロードされるが、それを防ぐために`preventDefault()`を使う。

```js
const nameInput = jQuery("#js-input-name");
const nameValue = nameInput.val();
```
`#js-input-name`を取得し、`nameInput`に格納。
`val()`メソッドを使って入力された値を`nameValue`に格納。

```js
if (!nameValue) {
  nameInput.next(".p-form__error-message").text("名前を書いてね");
  return;
}
```
`nameValue`が空（未入力)の場合は、エラーメッセージ「名前を書いてね」を表示して終了。
nameInput.next(.p-form__error-message)は、nameInputの直後にある兄弟要素でクラスが.p-form__error-messageの要素を取得し、そこにテキストをセットする。

```js
nameInput.next(".p-form__error-message").text("");
```
ここまで来たということは、nameInputに値が入力されているので、エラーメッセージを消去する。

```js
alert(`${nameValue}さん、ようこそ`);
```
入力された名前を使って、「◯◯さん、ようこそ」と表示。
ARPとルーティングの基本とネットワーク内通信の流れ

# 1.初めに
ネットワーク通信を学ぶ中で、ARP（Address Resolution Protocol）やルータの役割を理解することは非常に重要です。この記事では、ARPの役割や、異なるネットワーク間でのデータ転送の流れを、実際の機器とシミュレーションツール（例：Packet Tracer）を使いながら学んだ内容をまとめます。

# 2.ARPとは？
ARP（Address Resolution Protocol）は、IPアドレスからMACアドレスを解決するためのプロトコルです。特に同じネットワーク内で通信する際、PC間でデータを送受信するためには、送信先のMACアドレスが必要になります。これを得るためにARPを使用します。
## ARPリクエストとリプライ
### 1.ARPリクエスト
送信元のPCが宛先のIPアドレスに対応するMACアドレスを知らない場合、ARPリクエストをブロードキャストでネットワークに送信します。

### 2.ARPリプライ
宛先のPCがARPリクエストを受け取ると、自分のMACアドレスを含んだARPリプライを送信元PCに返します。この時、送信元PCは宛先PCのMACアドレスを取得します。

# 3.ルータの役割と異なるネットワークへのデータ送信
同じネットワーク内であれば、PC間での通信は直接行われますが、異なるネットワーク間で通信する場合はルータが必要です。ルータは、異なるサブネット間の通信を仲介し、データを適切なネットワークに転送します。

## 1.PCが異なるネットワーク宛てにデータを送信
送信元PCが宛先PCのIPアドレスが同じネットワークに属していないことを認識すると、ルータに対してデータを転送します。これを「デフォルトゲートウェイ」と呼びます。

## 2.ルータの処理
ルータは受け取ったパケットの宛先IPアドレスを確認し、宛先が異なるネットワークに属する場合、次に転送すべきインタフェースにデータを転送します。この際、ルータはARPを使用して転送先のMACアドレスを解決し、新たにイーサネットフレームを作成します。

# 4. 実際のネットワーク通信の流れ（具体例）
以下は、PC1からPC2へデータを送る際の流れを説明します。

## 1.PC1が送信先IPを認識
PC1が宛先IP（例えば192.168.2.100）を認識し、同じネットワーク内であればそのまま送信します。異なるネットワークの場合は、デフォルトゲートウェイ（ルータ）に送信されます。

## 2.ARPリクエスト（同じネットワーク内の場合）
送信先のMACアドレスが不明な場合、PC1はARPリクエストをブロードキャストで送信します。宛先PCがそのリクエストを受け取り、ARPリプライを返します。
そして必要なMACアドレスを取得した後、PC1が送信するデータ（イーサネットフレーム）を作成し、宛先MACアドレスを指定して送信します。
※同じサブネット内であれば、ルータは使用せず、直接PC2にデータが送られます。

## 3.ルータを使用する場合（異なるネットワーク間）
PC1が異なるネットワークに向けてデータを送信する際、ルータが間に入ります。PC1はルータに向けてデータを送り、ルータはそのパケットの宛先IPアドレスに基づき適切なインタフェースを選び、転送先のネットワークに向けて新しいパケットを送信します。

# 5.まとめ
・スイッチとルータの違い
スイッチはMACアドレスをもとに、ネットワーク内でデータの転送を行いますが、ルータはIPアドレスをもとに、異なるネットワーク間の通信を中継します。


ネットワーク通信の流れを理解することは、ネットワーク設計やトラブルシューティングにおいて非常に重要です。ARPやルータの役割を理解し、実際の通信がどのように行われるのかを把握することで、より効率的にネットワークを構築できます。

# 6.参考資料・ツール
・Packet Tracer: シミュレーションツールとして活用しました。ネットワーク設計やトラブルシューティングの練習に役立ちます。
・Wireshark: 実際のパケットをキャプチャして解析することで、ネットワーク通信の詳細を確認できます。
Breeze APIわからない

Reactの方は全然わからなかったので復習しようと思います。
参考にしたサイト

https://github.com/justnixx/laravel-breeze-api-react

https://github.com/Nilanth/laravel-breeze-react

↓これ大事っぽい
```
  withXSRFToken: true,
  withCredentials: true,
```
## Laravel
### 定数の定義
色々方法があるっぽい
- 'config/const.php'ファイルを作製する
- constructフォルダを作製する
- Enumsを作製する
php8.1からEnumが追加されたそうで調べた感じ結構みんなEnum使ってそう

https://www.php.net/manual/ja/language.types.enumerations.php

### logのパーミッションエラー
まだ、未確認だがこれでパーミッションのエラーは解決するっぽい
```
api/config/logging.php
        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => env('LOG_LEVEL', 'debug'),
            // 'days' => 14,
            'days' => env('LOG_MAX_DAYS', 14),
            'permission' => 0775,←ここを追加したらいいらしい
            'replace_placeholders' => true,
        ],
```

### web.phpを消して復元したらも元に戻らなかった
こんな感じのエラーが出たけど解決できなかった
```
Target class [web] does not exist.
require(/src/api/routes/web.php): Failed to open stream: No such file or direc
```

### sunctumをapiルーティングにしたいとき
`api/config/sanctum.php`に`'routes' => false,`を追加

### 何が何かあんまり理解できなかったので見返し用に
sessionやcookie周りのエラー
ここを何を設定しているか確認
api/config/session.php
```
    'driver' => env('SESSION_DRIVER', 'file'),
    'domain' => env('SESSION_DOMAIN'),
    'secure' => env('SESSION_SECURE_COOKIE'),
```
api/app/Http/Kernel.php
```
    protected $middlewareGroups = [
        'api' => [
            /************sessionが使えるように追加************/
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            /************sessionが使えるように追加************/
        ],
    ];
```

### api/vendor/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStateful.php
fromFrontendメソッドでlog出してみた
```
stateful: [（configのsanctum.statefulに書いてあるもの）]  
domain: フロントのドメインに/を付けてた  
is: 1  ←return
```

### 419のエラーについて
ちょっと上の方にも載せてるけど補足。
`api/app/Http/Kernel.php`このファイルのmiddlewareGroupsのapiの中に下記が要らない
```
\App\Http\Middleware\VerifyCsrfToken::class,
```

### Cookieが書き込まれない
.envのこの設定がよくないです。
フロント側とcookieの名前を合わせなくてはなりません。
```
SESSION_DOMAIN=
```

### 401エラーについて
バックエンド側が悪かった。
`api/app/Http/Controllers/Auth/AuthenticatedSessionController.php`
このファイルでtoken送ってるか確認して、送ってあげればエラーが解消する
このファイルを何もいじっていなければ特に問題ないと思います。
【初学者用】Chromeの初期表示時に、Qiitaを表示させる方法

### IT業界でよく話題に上るQiita。
もし毎回検索してQiitaを表示しているのなら、、
**「Chrome立ち上げたらQiita画面」** にしてみませんか？

## Chromeの初期表示時に、Qiitaを立ち上げる方法
①Chromeを起動。
②Chrome右上のハンバーガーマークをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089043/5f4ed76d-f333-4d16-9340-88616c5dd1a9.png)

③「設定」を押下し、サイドバーの「起動時」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089043/e4d76899-e3fe-46e2-bda9-a0b0b330c7f7.png)

④「特定のページまたはページセットを開く」を選択
　→「新しいページを追加」リンクをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089043/78e61f77-bf5c-40c2-b4a4-0bff74b72a3e.png)

⑤ダイアログの「サイトのURL」にQiitaのリンクを貼りつけ、追加ボタンを押下。
リンク：[Qiita](http://qiita.com "Qiita Home")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3089043/d91ba354-d27f-4c1a-aa01-bba664bdf1bf.png)

以上で、再度Chromeを立ち上げるとQiitaが表示されるようになります。


## ひとこと
初学者向けに書きました。
モチベーション上げるのにおススメの方法です:blush:
【React×TypeScript】前回作ったTODOアプリをリニューアル

# はじめに
前回作ったTODOアプリをフルリニューアルしました
今回は、デザインも含めてガッツリ触りました

・実際のサイト

https://stady-record-type.web.app/

# 使用した技術スタック
- Vite
- React
- Chakra-ui v3
- TypeScript
- Supabase
- React Hook Form
- Jest

# リニューアルを通して成長したこと
- モックを使ったテスト実装
- 学習記録に必要な機能実装のための型定義

特に、機能実装のための型定義を使って色々触っていると、思考がゴチャついてしまうことがあったので、
一度整理して何度もコードを見て流れを言語化していました。
以前からTypeScript触ったことはありましたが、
自分で作る機会がなかったので、結構試行錯誤ができてよかったです。

# Chakura-UI v3を使った弊害
結構、テストで引っかかってしまったり、
様々な箇所で読み取るのに時間がかかりました。
次回も使っていきたいけど迷い中ですね、、、

# 今後したいこと
もっと学習してできるようになってきたら、
今回作ったアプリをリファクタリングしていきたいなと思います。

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp
【合格体験記】MLS：AWS Certified Machine Learning

ギリギリとはいえ合格したので、備忘録的に合格体験記を残しておきます。


↓合格ツイート

https://x.com/3_nipa/status/1887113587170132016


# 1. MLSとは
AWS MLS（AWS Certified Machine Learning – Specialty）は、AWSクラウド上でのMLの活用やモデルの構築・デプロイに関するスキルを評価する試験


https://aws.amazon.com/jp/certification/certified-machine-learning-specialty/

# 2. 私について
 - PMやセールスの人
 - 業務でクラウドに触ることはない
 - 1,2年前?ぐらいにSAAを取得
     - 細かい仕様までは覚えていないが、リソースの概要はそこそこ頭にあった
 - 5年前？ぐらいにG検定は取得しており、機械学習等の基礎は理解している


# 3. 受験動機
- 某フォロワーさんたちに、資格試験頑張ってたのでわいもなんか受けるか〜！って冗談を言った（のが最初）

https://x.com/mimiOL_ganbaru/status/1883125853930074614

- 機械学習や生成AIなどのシステム開発の引き合いがちらほらあるため、多少は技術面でも会話できるようにしたかったから

# 4. 勉強方法
## 学習期間
- 期間：2/4（火）〜2/5（水）（事前に勉強できず、徹夜で詰め込みました･･･）
- 時間：10時間ぐらい


## 使用教材
- Udemy
    - 演習テスト1を3周
    - 演習テスト2を2周

https://www.udemy.com/course/aws-30-b/?couponCode=KEEPLEARNING

- 公式問題
    - 試験前に1回だけ（正解率45％で、試験は絶望的だなーって思いながら深呼吸した）

https://explore.skillbuilder.aws/learn/courses/12469/aws-certified-machine-learning-specialty-practice-question-set-mls-c01-english


# 5. 感想＆振り返り
- AWSの試験は、ユースケースからどれが適しているかを選択する問題なので問題を解いていて楽しい
- 当たり前だが、徹夜せずにコツコツ勉強すべし。
- わからない問題はChat GPTに質問して理解できる現代、マジで助かりすぎました。
ExcelのHYPERLINK関数について

## ExcelのHYPERLINK関数で自オブジェクト（同じBook内）に飛ぶときの仕様について記載。
※参考 兼 自身のメモ用

```vb
' 構文「= HYPERLINK("#リンク先", "セルに表示する文字列")」
' 例）
= HYPERLINK("#Sheet1!A1", "リンク先")
```

### 結論
自オブジェクトに飛ぶときは"#"を付与する必要がある
AWS Batch SDK for .Net 

~~~csharp
using System;
using System.Threading.Tasks;
using Amazon.Batch;
using Amazon.Batch.Model;
using Amazon.Runtime;

namespace AWSBatchJobSubmission
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // AWS認証情報を設定
            var awsCredentials = new SessionAWSCredentials(
                "YOUR_ACCESS_KEY",  // アクセスキー
                "YOUR_SECRET_KEY",  // シークレットキー
                "YOUR_SESSION_TOKEN" // セッショントークン
            );
            
            // AWS Batchクライアントの作成
            var batchClient = new AmazonBatchClient(awsCredentials, Amazon.RegionEndpoint.USEast1);

            var submitJobRequest = new SubmitJobRequest
            {
                JobName = "JOB_NAME", // ジョブ名
                JobQueue = "JOB_QUEUE_NAME", // ジョブキュー
                JobDefinition = "JOB_DEFINITION_NAME", // ジョブ定義
                ContainerOverrides = new ContainerOverrides
                {
                    // コンテナで実行するコマンドを指定
                    //Command = new List<string> { "echo", "Hello, AWS Batch!" },

                    // 環境変数を追加または上書き
                    Environment = new List<Amazon.Batch.Model.KeyValuePair>
                    {
                        new Amazon.Batch.Model.KeyValuePair
                        {
                            Name = "ENVIRONMENT_ARGS",
                            Value = "ENVIRONMENT_VALUE"
                        }
                    },

                    // リソース要求を指定（オプション）
                    ResourceRequirements = new List<ResourceRequirement>
                    {
                        new ResourceRequirement
                        {
                            Type = ResourceType.VCPU,
                            Value = "1" // 1 vCPU
                        },
                        new ResourceRequirement
                        {
                            Type = ResourceType.MEMORY,
                            Value = "2048" // 2048 MB
                        }
                    }
                }
            };

            try
            {
                // ジョブを送信
                var submitJobResponse = await batchClient.SubmitJobAsync(submitJobRequest);

                // ジョブIDを表示
                Console.WriteLine($"Job ID: {submitJobResponse.JobId}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error submitting job: {ex.Message}");
            }
        }
    }
}
~~~
高速で配列の挿入・削除をしたい！【D言語】

# 要約

$O(\log N)$ で挿入・削除する方法
- `std.container.rbtree.RedBlackTree` を利用する

以下の方法では $ O(N) $になってしまう。
- `std.algorithm.mutation.remove()`
- スライスと配列の結合(`~`)を使った方法

:::note info
単純な queue を実装する場合は、先頭の要素を取得・削除するだけでいいので `std.range.primitives.popFront`で十分。
参考: [popFornt](https://dlang.org/library/std/range/primitives/pop_front.html)

:::

# 計算回数が O(N) になる方法について

## `std.algorithm.mutation.remove()`
こんな書き方。
```dlang
import std;

void main() {
    int[] array = [1, 2, 3, 4, 5, 6];
    array = array.remove(2); // array = [1, 2, 4, 5, 6]
}
```
`remove()` 後の配列は使えないので、再代入する必要がある。
`array.remove(2)` 直後(再代入前)の`array`は`[1, 2, 4, 5, 6, 6]` と削除された分を前に詰めた配列に変更されている。そのときの処理で $O(N)$ のループがあるらしい。
詳細は、以下のコードにある。
[std.algorithm.mutation.d](https://github.com/dlang/phobos/blob/master/std/algorithm/mutation.d#L2162)

## スライスと配列の結合(`~`)を使った方法
```dlang
import std;

void main() {
    int[] array = [1, 2, 3, 4];
    array = array[0..2] ~ array[3..$]; // array = [1, 2, 4]
    array = array[0..1] ~ 5 ~ array[1..$]; // array = [1, 5, 2, 4]
}
```

スライスを取る操作は$O(1)$であるが、後ろ側のスライスを結合する際に$O(N)$の時間がかかってしまっているらしい。

# 計算回数 O(log N) にするにはどうするか

`RedBlackTree` を使う。

https://dlang.org/library/std/container/rbtree/red_black_tree.html

赤黒木という二分木構造がある。

https://ja.wikipedia.org/wiki/%E8%B5%A4%E9%BB%92%E6%9C%A8


例えば以下のようにできる。
テンプレート引数の `true` は同じ値の重複を許すことを意味する。
（デフォルトは `false` なので、この引数を指定しないと木の要素のうち同じ値は1つだけになる。）
実行例のように、重複する要素を削除するときは1つだけ削除される。

```dlang
import std;

void main() {
    
    auto tree = redBlackTree!(true, int)();

    foreach(_; 0..20) {
        int n = uniform(0, 10);
        tree.insert(n);
    }

    writeln("## Insert 完了 ##");
    tree.length.writeln;
    tree[].writeln;

    writeln("## 0を1つ削除 ##");
    tree.removeKey(0);
    tree.length.writeln;
    tree[].writeln;

}
```

``` 実行例.txt
## Insert 完了 ##
20
[0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 3, 4, 6, 6, 6, 6, 7, 7, 8, 8]
## 0を1つ削除 ##
19
[0, 0, 0, 0, 0, 2, 2, 2, 2, 3, 4, 6, 6, 6, 6, 7, 7, 8, 8]
```

本当に $O(\log N)$ で挿入・削除ができているのか確かめてみる。
さっきのコードのループを$10^5$回に増やして時間を計測する。

（仮に1回の挿入・削除に $O(N)$ かかっていれば、N回ループを回しているので全体の計算回数は $O(N^2) \sim 10^{10}回$ となり、現実的な実行時間にならない。）

```dlang
import std;

void main() {
    
    auto tree = redBlackTree!(true, int)();

    auto insertStart = Clock.currTime();

    foreach(_; 0..10e5) {
        int n = uniform(0, 10);
        tree.insert(n);
    }

    auto insertEnd = Clock.currTime();

    writeln("## INSERT完了 ##");
    writeln(insertEnd - insertStart);

    auto removeStart = Clock.currTime();

    foreach(i; 0..10e5) {
        int n = i.to!int % 10;
        tree.removeKey(n);
    }

    auto removeEnd = Clock.currTime();

    writeln("## REMOVE完了 ##");
    writeln(removeEnd - removeStart);

}

```

```実行結果.txt
## INSERT完了 ##
323 ms and 341 μs
## REMOVE完了 ##
226 ms and 932 μs
```

良さげ。

## まとめ

AtCoderのコンテストで、`remove` で1回、スライスの結合で1回TLEを出しました。
$N \sim O(10^5)$ 回くらいのループの中で `array.sum()` を使って、予期せずTLEを出したこともあるので、組み込み関数の中での計算回数を失念しがちです。
使う関数全ての公式ドキュメントを読むのは非現実的だとしても、利用する関数の中でどんな処理をしているか（計算回数、副作用 etc）を意識しておかないといけないなと思います。

## 参考
- [RedBlackTree/redBlackTree - multiple declarations - D Programming Language](https://dlang.org/library/std/container/rbtree/red_black_tree.html)
AWS Certified AI Practitioner 認定の学習方法(AIF-C01)

# AWS Certified AI Practitioner の学習方法

AWS Certified AI Practitionerの学習方法について参考になればと思い共有です。

なお、当方では、2025年1月に取得していますが、取得される時点で情報は更新されている可能性があることに注意ください。


# 先に結論

Udemy のみで十分です。

# 教材

## 1. 【最新】AWS認定AIプラクティショナー試験突破講座＋模擬試験２回分付き！

AWS Certified AI Practitionerでは、AWSに関連する問題が半分、AIに関連する問題が半分の印象でした。
こちらの講座ではAIに関連する知識をわかりやすく解説されていたため、AIに関連する知識を根本的に身につけるためおすすめです。
ただし、同じ問題はあまり出題されないため、既にAIの基本的な知識を有する方、とりあえず短期間で合格したいと言う方は 2.のUdemy のみで十分です。

https://www.udemy.com/course/aws-ai-practitioner/?couponCode=KEEPLEARNING

## 2. 【AIF-C01 】短期突破！AWS Certified AI Practitioner 模擬試験（2回分）+ 練習問題

問題数は多くありませんが、多くあれば良いと言うものではありません。
一見最初はこんな問題本当に出るのか？と思われるような問題も出てきますが、実際半分以上は同じ問題が出題されたたm、合格への近道としてはこのUdemyを回すことです。

https://www.udemy.com/course/aws-certified-ai-practitioner-2-aif-c01/?couponCode=KEEPLEARNING
Dataverseの計算列について解説

# はじめに
Microsoft Dataverseでデータ管理をしていく際に、`計算列`という列を用いて動的なデータ管理が行えることをご存じでしょうか？
本記事では、Dataverseの列の種類の１つである`計算列`について解説を行っていきたいと思います。

## 計算列とは？
テーブルで既に作成されている列の値をもとに、条件分岐や演算子を用いて自動的に値を生成してくれる動的な列のことを指します。
・この列とこの列の値を結合して表示させたい
・この列の数値が○○以上のレコードは表示のフラグを true にしておきたい
・この列の日付と、この列の日付の差分を出したい
など、このような条件を計算式を設定しておくことで自動で表示してくれるのが計算列です。

## 計算列の作成方法
今回はこちらの **社員名簿テーブル** を用いて計算列について解説していきたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/b0f94dd6-de8e-45a0-8bda-9432d4310196.png)

基本的に計算列の作成方法の前提として、「+」を押し新しい列を追加します。
`表示名`と`スキーマ名`は必ず設定してください。
（ご自身のテーブル作成の規則にのっとった分かりやすい名前で結構です。）
`データの種類` で **計算式** を選択します。
中身については以下のシーン別において一部作成例を解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/b5ffe173-42d5-486b-aa1d-ea24eab8b3b3.png)



**1. 「姓」と「名」の列を結合させて「フルネーム」を表示させたい**
列同士の値を結合させて、１つのデータとして表示させたい場合は、`「&」`を用いて結合させます。
新しい列を作成時にデータの種類を計算式に設定すると `計算式` を入力する箇所が表示されます。
ここに結合させたい列を`「&」`を使い入力します。
列名は手入力をすると画像のように候補としても表示されますので、入力補完に役立ててください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/024e1639-516a-4f3c-8134-5d3c566570fe.png)


今回の例を用いると計算式には以下を入力します。

```ruby:計算式
    姓 & 名
```
はい、これだけで自動入力が行われます。
計算式の入力を終えたら列の保存ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/4673988b-8f2c-476b-8e8b-f221351df2c4.png)

画像のように `フルネーム` 列が作成され、現在入っているデータについても自動的に更新が行われました。
こちらはシンプルに結合を行っただけなので、
姓と名の間にスペースが欲しいなぁ...なんてこともありましたら、以下のように設定して任意の文字を付け足すことも可能ですのでこの辺りはご自由にカスタマイズしてください。

```ruby:計算式
    姓&" "&名 
    
    //メモ " "の間には[半角スペース]を入力
```
**変更結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/33289758-5145-44d8-b9e6-987429da2585.png)

**2. 「部署名」を基準に部署番号を割り振りたい**
`Swithch関数`を利用することで、列の値を基準に結果を判定させることもできます。
例えば、「営業部であれば１」、「総務部であれば２」という番号を割り当てたい。となった時に
以下の計算式を入力して新しい列を作成します。

```ruby:計算式
    Switch(
    部署,
    "営業部",1,
    "総務部",2,
    "開発部",3,
    "人事部",4,
    "マーケティング部",5
    )
```

**作成結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/dcd16ba3-f8ff-4caa-ac8b-689449883267.png)


このように自動で列の作成が行われ、すでに入っているデータについても自動で計算を行ってくれるので、大量のデータの更新作業を行わなくても済むことになります。
応用として `If関数` や `And関数` `Or関数` を組み合わせて使用することも可能です。

:::note warn
Microsoft の公式ドキュメントには現在も計算列の使用では一部サポートされていない関数などがあるとのことです。
サポートされていない関数や、複雑な関数には対応しきれない場合があるので
その時は Power Automate のフローを活用するなどをしてください。
:::

+ 公式 MicrosoftLearn 数式リファレンス
 
https://learn.microsoft.com/ja-jp/power-platform/power-fx/formula-reference-formula-columns


## 計算列で扱えるデータ型
計算列で扱えるデータは以下のとおりになります。
+ テキスト
+ 10進数
+ 整数
+ フロート
+ ブール値
+ 選択肢 (旧オプション セット)
+ 日付

これらは公式のドキュメントに記載があります。
`通貨` についてはサポートされていないようです。
> 通貨データ型は現在サポートされていません。

+ 公式 MicrosoftLearn 数式列を使用する

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/formula-columns?tabs=type-or-paste#data-types


## まとめ
以上が Dataverse の計算列についての解説でした！
こちらでご紹介した関数などはほんの一部ではありますが、
有効活用することで効率的にデータ管理を行うことが可能になります！
他にも気付いたことがあれば、随時記事を更新していきます！
ぜひ活用してみてください！！！
projwfc.xを実行する時の注意点

# はじめに
Quantum ESPRESSOパッケージにprojected (partial) density of states (PDOS)を計算する``projwfc.x``というプログラムがあります。

うまく実行できないことがあったのですが、その原因は些細なことでした。些細なことなので忘れてしまって同じことを繰り返しそうなので、ここに記載しておきます。機会があればtipsの一つとしてまとめたいと思います。

# 問題
- 計算を実行すると終了はするが、PDOSがすべてNaNになる
- 出力ファイルに計算された重みなどは出力されるが、PDOSが出力されずに計算がstuckしてしまう（qsubファイルに指定した実行時間が来て異常終了してしまう）。

# 解決策
- 並列計算を行わない（新しいバージョンのQEであればSCF/NSCF計算と異なるプロセス数でPDOSの計算は実行可能です。古いバージョンであれば``wf_collect=.true.``とする必要があるでしょう。PDOSの計算は単純なので1プロセスでもほぼ問題無く計算は実行できるようです）

ただtrickyなのはSmearingを用いた計算の場合には並列計算をしても問題無かったのにtetrahedron法を用いるとstuckしてしまったことです。ISSPのohtakaの場合、thread並列でもstuckしてしまいました。このあたりは詳しく調べる必要があります。


# おわりに

実はこの問題のおかけで論文にまで発展したかもしれない計算／プロジェクトがお蔵入りしてしまいました。そのようなことを繰り返さないように、ちょっとした間違いは記録して検索を可能にしておくのが良いようです。
今更ながらReactに入門してみた

##  はじめてつくるReactアプリ with TypeScript: たった2.5時間で「わかる！ できる！」　（三好アキ　著）
Kindleでみつけたこの本を参考にはじめてのReactアプリを作成していきます。
## 作業メモ
- React開発ツールReact + Viteをインストール
- React + Typesctiptでアプリを開発
- WeatherAPI をつかって気象データを取得
- create-react-app の使用は現時点で、推奨されていないので、React + Viteで開発をおこなう
    - 違いは、Javascriptファイルをまとめるバンドラーの違い
    - create-react-app ではWebpackが使われる
    - React + Virte ではViteが使われる
- 開発でつかっていくのは `src`フォルダ
- ReactではHTMLタグ以外にもコンポーネントをimportでき、自分で名前をつけて`<Title/>`のように使うことができる
    - 自分で作ったタグの最初の文字は大文字にすることが一般
    - ReactコンポーネントであることをReactに伝えていることとなる
- `components ` フォルダを作成して各コンポーネントのファイルを格納するのが一般的
- APIにデータを送るために、入力されたデータを一時的にアプリ内に保管する必要がある。この保管場所をReactではstateと呼ぶ
    - stateに保管することでコンポーネント内でそのデータを利用できるようになる
- `import { useState} from "react"` でデータの保管場所であるstateを作成する
- `const [city, setCity] = useState("")` 
    - `city`がstateとなり、ユーザーが入力した都市名が保管される
    - `setCity`が`state`にデータを書き込んだり操作したりする仕組みとなる
    - 慣例的に２つ目の名称は「set + state名」とするのが一般的
- `useState("")`のカッコ内の値がstateの初期データとなる
- `<input/>`で入力されたデータを`setCity`に渡す仕組みとして`onChange`を使う
- `onChange={e => setCity(e.target.value)}`の解説
    - `e`はevent parameter の略称で頭文字をとっている
        - `e`のかわりに`evewnt`や`eve`と書く人もいるが働きは同じ
        - `e`には`<input/>`に関係する情報が格納されているので、ユーザーが入力した都市名の情報もそのひとつ
        - `e`の中の`target`にアクセスしてその中の`value`を取得している
- `return`のカッコ内ではJavascriptのコードを`{}`で挟むことで使える！
- Reactの重要な設計コンセプトに「One-way Data Flow」がある
    - Appから気象データをResultsにわたす
    - FormからResultsにデータを渡すのはReactの設計コンセプトと異なる
        - データは上位のコンポーネントから下位のコンポーネントに渡しましょう！
    - 最上位のコンポーネントをだけがデータを持ち、そのデータを必要としている配下のコンポーネントに渡す、という設計
        - これによってデータを一元管理できる
        - データの数が増えても管理が容易になる

- コンポーネント間の受け渡しには`props`を使用する
- JavaScriptのテンプレートリテラル
    - 文字列の中にJavaScriptのコードを入れるときにつかう
    - バッククオートと`$`を使う



1. ```npm create vite@latest``` で環境作成


### 疑問点
- `export default xxx`のdefaultの意味はなんだろう。著書では細かい説明はなかった。ビギナーが現時点では深く理解する必要はないと記載されている
IBM Cloud(主にインフラ寄り) 2025年 新機能（随時更新）

IBM Cloud(主にインフラ寄り)に関して、2025年に発表された主要な新機能についての情報です。

クラウドベンダーは、膨大な投資をクラウド事業に対して継続して行っていますから、必然的に多くの進歩・改善が起こります。去年は実現していなかった数々の事が今年実現しましたし、今できない事も、1年後にはできるようになっているかもしれません。

これまでの情報は下記にあります。
2024年：　https://qiita.com/y_tama/items/c40881b20b3a51ebb585
2023年：　https://qiita.com/y_tama/items/d0916c4757c5ac2f79ab
2022年：　https://qiita.com/y_tama/items/c92dea67bd5769d308f3
2021年：　https://qiita.com/y_tama/items/7bb4145d0526ecca78a5
2020年：　https://qiita.com/y_tama/items/d38d878377aff7e7e990
2019年：　https://qiita.com/y_tama/items/48f866f394f8d0445bc3
2018年：　https://qiita.com/y_tama/items/d25cd73d0fce3a58746a
2017年：　https://qiita.com/y_tama/items/63c09a89dce5392e91ee
2016年：　https://qiita.com/y_tama/items/848106c811178673061a

また、下記などの情報源も有用です。
IBM Cloud release note
　https://cloud.ibm.com/status/release-notes
Blog
　https://www.ibm.com/blogs/solutions/jp-ja/category/cloud/
柔らか層本
　https://ibm.ent.box.com/v/ibmcloud-yawaraka

上から新しい順に並んでいます。

# NIVDIA A100を東京で提供開始(2025/5)
https://cloud.ibm.com/docs/vpc?topic=vpc-release-notes#vpc-may1525

# AMD MI300Xを提供開始（海外DC）(2025/5)
https://cloud.ibm.com/docs/vpc?topic=vpc-release-notes#vpc-may0625

# Intel Gaudi3を提供開始（海外DC）(2025/4)
https://cloud.ibm.com/docs/vpc?topic=vpc-release-notes#vpc-apr2225

# ALB for VPCにBackup poolを設定可能に(2025/3)
https://qiita.com/y_tama/items/a49e0999f028248c0c5a

# PowerVSのNetwork Security Groups機能が利用可能に（2025/2）
PowerVSのNetwork Security Groups機能が利用可能になりました。
https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-nsg
https://qiita.com/y_tama/items/601a09de5efd3763a8dd

# GPU NVIDIA H200を提供開始(2025/2)
Washington DCとFrankfurtでNVIDIA H200を提供開始（Select Availability）しています。
https://cloud.ibm.com/docs/vpc?topic=vpc-release-notes#vpc-feb1225

# Sapphire Rapidsの36コアモデル提供開始（2025/2）
6416Hが利用可能になりました。

# Transit GatewayのCloud Monitoring対応(2025/1)
Transit GatewayのmetricsをCloud Monitoringで可視化できるようになりました。
https://cloud.ibm.com/docs/transit-gateway?topic=transit-gateway-monitoring

ちなみに昨年末にDirect Link 2.0についても対応しているので、ネットワーク周りの可視化が促進されていると思います。
https://cloud.ibm.com/docs/dl?topic=dl-monitoring

# Virtual Serial Number(VSN)をPowerVSの全ロケーションでサポート(2025/1)
PowerVSのIBM iのVirtual Serial Number(VSN)機能が全DCで利用可能になりました。
https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-creating-power-virtual-server#vsn

# RISE with SAP on IBM Power Virtual Serverを発表(2025/1)
https://jp.newsroom.ibm.com/2025-01-24-RISE-with-SAP-on-IBM-Power-Virtual-Server-to-Help-Accelerate-Transformation-with-SAP-S-4HANA
低レイヤについて勉強メモ

# 低レイヤ勉強記録
じっくり書いていると読みたいのに書くのが主になるので、そんなに書きません。
メモ程度です

## 参考書
[コンピュータシステムの理論と実装](https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E7%AC%AC2%E7%89%88-%E2%80%95%E3%83%A2%E3%83%80%E3%83%B3%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-Noam-Nisan/dp/481440087X)

### 1.ブール論理(2025/2/14)
よくある論理としてAND,OR,NOT等々があるけど、NANDで実装可能
物理的に実装したのがゲート
シンプルなHDLを使って実装を行った。
　→　ほんとにNANDだけでできちゃった...

### 2.ブール算術(2025/2/24)
1章で作成した論理ゲートで半加算器、全加算器、インクリメント、ALUの作成
2進数あたりが絡むのでいい復習だった
ALUは入力値の反転から和、ANDまで取れるので高性能なのかな？
OSとCPUの関係：OSの役割とコンパイラとの違い


コンパイラーが何をしているのか知りたくて調べたところ，OSとCPUとの関係，OSとコンパイラーの役割の違いについて知る必要があった．
そこで，調べた事を以下に纏めた．


### 要点

- OSは，GUIやCLIの指示（非バイナリ）をCPUが理解できるバイナリに変換して渡す
- しかし，OSはコンパイラーのように事前にバイナリを生成するわけではない
- OSはリアルタイムにユーザーの操作をバイナリの命令としてCPUに渡す「翻訳者」のような存在
- コンパイラーは，事前にソースコードをバイナリ化するため，リアルタイム性はない

このように，OSとコンパイラーは異なる役割を持ちつつも，どちらもCPUが理解できる形式に変換する重要な役割を担っている．




### 予備知識（事前知識）

<details><summary>この記事を理解するために必要な基本的な概念について説明する．</summary>


#### バイナリとは

バイナリ（binary）とは，0と1の二進数で表現されたデータのことである．コンピュータはすべての情報を0と1の組み合わせで処理しているため，プログラムの実行やファイルの保存も最終的にはバイナリデータとして扱われる．

#### バイナリファイルとは

バイナリファイル（binary file）とは，人間が直接読むことができないバイナリデータを含むファイルである．例えば，実行可能ファイル（.exe, .elf など），画像，音声，動画，圧縮ファイルなどがこれに該当する．これに対し，テキストファイル（.txt, .csv など）は人間が直接読み書きできる．

#### 実行可能ファイルとは

実行可能ファイル（executable file）とは，OSが直接実行できる形式のバイナリファイルである．Windowsでは `.exe` や `.dll`，Linuxでは `.elf` 形式などがある．これらのファイルはCPUが直接解釈できる機械語（バイナリ命令）を含んでいる．

#### 機械語とは

機械語（machine code）とは，CPUが直接解釈して実行できる命令の集合である．人間が記述するプログラム（C言語，Pythonなどの高水準言語）は，そのままではCPUが理解できないため，コンパイルやインタプリタによって機械語に変換される必要がある．

#### OSのカーネルとは

OSのカーネル（kernel）とは，OSの中核部分であり，ハードウェアとソフトウェアの橋渡しを行う役割を持つ．プロセス管理，メモリ管理，ファイルシステム管理，デバイス管理などを担当し，CPUに対する命令を適切に制御する．

</details>





### OSとCPUの関係

コンピュータの処理は，大きく以下の流れで進む．

```
プログラム（ソースコード）
↓（コンパイル）
実行可能ファイル（バイナリ）
↓（OSが管理するプロセスとしてロード）
OS（カーネル）
↓（CPUへの命令スケジューリング）
CPU（機械語を実行）
```

ここで重要なのは，OSがCPUに対して直接命令を送るのではなく，実行可能なバイナリをロードし，プロセスを管理する役割を担っている点である．


### ファイル操作におけるOSとCPUの役割

プログラムを実行しない単なるファイル操作（コピーや移動）についても，CPUは重要な役割を果たす．

例えば，ユーザーがマウスでファイルをドラッグ＆ドロップして移動する場合，次のような流れになる．

- ユーザーの操作（GUI）がOSにイベントとして送信される
- OSはファイルシステムに対し，「このファイルを別のフォルダへ移動せよ」という命令を出す
- OSのカーネルがCPUにバイナリの命令を送る
- CPUはストレージコントローラとやり取りし，データを移動する
- OSが処理完了をGUIに通知する

この流れの中で，最終的にCPUが動作してストレージへデータを書き込む処理を行う．


### OSはコンパイラーと同じなのか？

OSは，GUIやCLIの指示（非バイナリ）をCPUが理解できるバイナリに変換して渡す．これは，コンパイラーの動作と似ているが，厳密には異なる役割を果たす．

| 項目 | OS | コンパイラー |
|------|----|------------|
| **入力の種類** | ユーザーの操作（GUI, CLI）やプログラムのシステムコール | ソースコード（C, Python など） |
| **出力の形式** | **CPU命令をリアルタイムでスケジューリングし，直接実行** | **機械語（バイナリ）に変換して，実行可能ファイルを生成** |
| **実行のタイミング** | **リアルタイムで動作** | **事前にバイナリを生成し，後で実行** |
| **役割** | CPUやハードウェアリソースの管理，プログラムの実行支援 | 高水準言語をCPUが理解できるバイナリに変換 |

OSは「リアルタイムな翻訳者」のような役割を果たし，コンパイラーは「事前にコードを機械語に変換するツール」という違いがある．


### OSがリアルタイムに処理を翻訳する理由

もしOSがコンパイラーのようにすべての処理を事前にバイナリ化しておくと，以下のような問題が発生する．

- 事前にすべての可能な操作を準備するのは非現実的
- 動的な処理ができなくなる

OSはマウスのクリックやキーボードの入力をリアルタイムで処理する必要がある．そのため，OSはコンパイラーのように事前にバイナリ化するのではなく，リアルタイムに翻訳してCPUに指示を出す方式を採用している．



### 参考文献

- Andrew S. Tanenbaum, "Modern Operating Systems", Pearson
- Silberschatz et al., "Operating System Concepts", Wiley
- David A. Patterson, John L. Hennessy, "Computer Organization and Design", Morgan Kaufmann
- GNU Compiler Collection (GCC) Documentation: https://gcc.gnu.org/
- Linux Kernel Documentation: https://www.kernel.org/doc/html/latest/
- Intel 64 and IA-32 Architectures Software Developer's Manual: https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html