OmniAICreator/Qiita-1.07M huggingface dataset:
Golang における assert

# Go言語における `assert` の使い方

## 1. `assert` とは？
一般的に **assert（アサーション）** は、プログラムの特定の条件が満たされていることを確認し、もし条件が満たされなければエラーを発生させる仕組みです。主に **テスト** や **デバッグ** のために使用され、開発中のバグを早期に発見するのに役立ちます。

Golang には、**他の言語にあるような組み込みの `assert` 機能が存在しません**。そのため、Go では **明示的に比較し、エラーを処理する方法** が推奨されています。しかし、テストフレームワークなどを活用することで、アサーションに近いことを実現できます。

---

## 2. `assert` を使う方法

Golang で `assert` のような機能を実現する方法を紹介します。

### 2.1 標準 `testing` パッケージで実装
Go には `assert` 関数はありませんが、標準の `testing` パッケージを使用して、手動で条件をチェックできます。

```go
package main

import (
	"testing"
)

func TestExample(t *testing.T) {
	expected := 42
	actual := 40 + 2

	if expected != actual {
		t.Errorf("Expected %d, but got %d", expected, actual)
	}
}
```
このように、`t.Errorf()` を使うことで、条件が満たされない場合にエラーメッセージを出力できます。

---

### 2.2 `testify/assert` パッケージを使用
手動で `if` 文を書くのは面倒なので、サードパーティ製の `assert` ライブラリを利用すると便利です。特に `testify` は、Go のテストでよく使われるアサーションライブラリです。

#### **インストール**
```sh
go get github.com/stretchr/testify
```

#### **使用例**
```go
package main

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestAssertExample(t *testing.T) {
	expected := 42
	actual := 40 + 2

	assert.Equal(t, expected, actual, "値が一致しません")
}
```
上記のコードでは、`assert.Equal()` を使用して `expected` と `actual` が等しいことを確認します。一致しない場合はテストが失敗します。

---

### 2.3 `require` を使う（`testify`）
`assert` の代わりに `require` パッケージを使用すると、**失敗時に即座にテストを終了** できます。

```go
package main

import (
	"testing"

	"github.com/stretchr/testify/require"
)

func TestRequireExample(t *testing.T) {
	expected := 42
	actual := 40 + 2

	require.Equal(t, expected, actual, "値が一致しません")
}
```
`require.Equal()` は `assert.Equal()` と同じですが、失敗した時点でテストが即終了する点が異なります。

---

## 3. `assert` を使うべき場面
Go でアサーションを使うべき場面は主に **テスト** です。特に `testify/assert` を使うと、次のようなメリットがあります。

- `assert.Equal()` や `assert.NotNil()` など、簡潔に記述できる
- 失敗時のメッセージが見やすくなる
- `require` を使えば、無駄な処理を省ける

逆に、本番環境のコードでは **明示的なエラーハンドリング** が推奨され、`assert` のような機能はあまり利用されません。

---

## まとめ
- Go には組み込みの `assert` はない
- `testing` パッケージで `if` 文を使ってアサーションを実装できる
- `testify/assert` を使うと、簡潔なテストが書ける
- `require` を使うと、エラー時に即テストを終了できる
- 本番環境ではエラーハンドリングを明示的に行うのが推奨

Go での `assert` の使い方を理解し、適切に活用しましょう！

---
find_spec_for_exe': can't find gem railties (= 7.1.0) with executable rails (Gem::GemNotFoundException)

久々に新規アプリ作ろうとしたらタイトルエラー

```ターミナル
 % rails _7.1.0_ new アプリ名 -d mysql
 ```

エラー文
 ```
 `find_spec_for_exe': can't find gem railties (= 7.1.0) with executable rails (Gem::GemNotFoundException)
```

railsのバージョンが7.1.0じゃないようなので
%rails -vで現在のバージョン確認

```
Ignoring debug-1.7.1 because its extensions are not built. Try: gem pristine debug --version 1.7.1
Ignoring rbs-2.8.2 because its extensions are not built. Try: gem pristine rbs --version 2.8.2
Rails 7.0.8.7
```

% rails _7.0.8.7_ new アプリ名 -d mysqlで新規アプリ作成できました。
忘備録です。
【電脳少女プログラミング2088 ─壊レタ君を再構築─】python超初心者がやってみた！

Pythonどころかプログラミング初心者のものたんとです！

今回は、Paizaさんの新作プログラミングゲーム【電脳少女プログラミング2088】を初プレイしてみました！

電脳少女プログラミング2088とは、簡単にいうと、プログラミング問題を解き、
電脳少女を修復していくゲームとなります！

私は初心者なので、まずはDランクの問題から始めてみようと思います！

![スクリーンショット 2025-02-10 11.35.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006887/f195a37f-958c-6504-89c7-3532460b3e8d.png)

（Dはeasyって書いてあるし解けるやろ。）

【問題】
![スクリーンショット 2025-02-10 11.36.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006887/16a18592-1392-3b00-3d8e-530e7a1873cd.png)

（Dはeasyやもんな…）
「問題の意味さっぱり分からん！」

![スクリーンショット 2025-02-10 11.37.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006887/9f140350-723e-3174-098c-ca0aa9f84557.png)
（フォーマット？条件？期待する出力？出力例？）

「何も分からんぞ！」

【私の出した答え】
![スクリーンショット 2025-02-10 11.43.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006887/3b46b8a1-82c2-6122-a9bc-0e77fa63018f.png)
（多分813って出たらいいんや！）

![スクリーンショット 2025-02-10 11.44.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006887/36eaf747-0d70-d63d-0561-9cbd8ff1d8e8.png)

「全部ダメ！」

（分からんからめっちゃ調べること1000年）
「こんな感じで解けるらしい」
![スクリーンショット 2025-02-10 12.13.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006887/a4f400a2-00d0-4391-c771-7df8fbfde96e.png)

結果は...!!
![スクリーンショット 2025-02-10 12.13.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006887/779a9482-69e2-ccf6-2a91-afa8df5372db.png)

「やっと解けた！これでメタバース開発者第1歩！」

という感じで、なんとかDランクの問題を調べて解くことができました！

途中、間違えすぎて、まさかの
![スクリーンショット 2025-02-10 12.54.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006887/7637596c-1688-51a8-b6af-1232aa57dd3d.png)
「ドジっ子」という性格ゲットしちゃいました！（ヤッタァ！...?）

ハッキリ言うと、「Quest3が欲しい‼︎」と思って電脳少女プログラミング2088をプレイし始めたのですが、
プレイすることによって、プログラミング初心者の私にとってたくさんいい事がありました！

【たくさんのいい事！】

・Pythonnの基礎を終えた段階で分かっていなかった部分が浮き彫りになった！
これからの学習において、分かっていない部分がハッキリとすることで、今後何を学習していけばいいのかが明確になったことはいい事ですよね！


・初心者の私でも分かっている部分は自信になった！
問題を自力で解けなかったけど、私調べているうちに「これを使うことは予測していたよ！」と思うことがいくつかあって、その部分は私自身の実力となりつつあるのだなと思いました！これからの学習においてモチベーションになるのでこれもいいことですよね！


・ゲーム感覚でプログラミング学習ができるのは楽しい！
ただひたすらにコードを打っていくよりも、「クリアしたら、こんなパーツがもらえる！」などと思えば、ワクワクしながらプログラミング学習に励めますよね！いいことです！



このように初心者の私でも得られる恩恵は大いにありました！
まだまだ基礎をようやく1周したところ程度の私ですが、これからも電脳少女プログラミング2088を使いながら楽しく、効率的で、着実なプログラミング学習を進めていきたいと思います！

私の初めての記事をお読みいただきありがとうございました！

ここから最高のメタバース企業を作るべくまっすぐ進んでいきます！
（フォローとかあるのかな？あればぜひフォローお願いします！）

ではまたいつかの記事でお会いしましょう！ありがとう！
Next.js+ESLintで起こったエラーの解消方法

## はじめに
Next.jsを学習するにあたってESLintのエラーに詰まってしまったのでその解消方法を今回、記事にしました。なお、Nest.jsのプロジェクトを立ち上げる際、TypeScriptの使用は行わないと設定しています。

## 発生したエラー
ターミナルで`yarn lint`を実行すると以下のエラーが発生しました。
```sh
Failed to load parser '@typescript-eslint/parser' declared in ' » eslint-config-next/core-web-vitals » /usr/src/app/node_modules/eslint-config-next/index.js#overrides[0]': Cannot find module 'typescript'
```
このエラーの内容を整理すると、以下の2点が問題になっています。
1. **ESLintが @typescript-eslint/parser を読み込もうとして失敗している**
2. **typescript モジュールが見つからないと怒られている**

しかし、プロジェクトではTypeScriptを使用しておらず、typescript-eslint の設定も不要なはずです。それにもかかわらず、なぜこのエラーが発生したのかを調査しました。

## 原因の調査
Next.jsのESLint設定で`next/core-web-vitals`を適用しています。
```javascript:eslint.config.mjs
import { dirname } from 'path';
import { fileURLToPath } from 'url';
import { FlatCompat } from '@eslint/eslintrc';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

const compat = new FlatCompat({
  baseDirectory: __dirname,
});

const eslintConfig = [
  ...compat.extends('next/core-web-vitals'), // ここでTypeScript関連の設定が読み込まれる
  'prettier',
];

export default eslintConfig;
```
`compat.extends('next/core-web-vitals')`を適用しているため、Next.js公式のESLint設定`eslint-config-next`が適用されています。この設定にはデフォルトでTypeScriptのパーサー (@typescript-eslint/parser) が含まれており、TypeScriptを使用していない場合でも typescript のインストールを求められることがあります。

つまり、**TypeScriptを使っていないのに、Next.jsのESLint設定が`@typescript-eslint/parser`を強制的に読み込んでしまい、エラーが発生した というのが原因です。**

## 解決方法
**結論：`.eslintrc.js`を使い解決しました**
Next.js プロジェクトでは、従来の`.eslintrc.js`スタイルを使うのが無難です。

理由は以下の通りです
1. **Next.jsのESLint設定(eslint-config-next)はTypeScriptを前提としている**
2. **フラットコンフィグ(eslint.config.mjs)を使うと無理が生じる**
3. **.eslintrc.js のほうが安定して動作する**

以下の.eslintrc.jsをプロジェクトルートに作成し、eslint.config.mjsを削除またはリネームして併存しないようにします。

```javascript:.eslintrc.js
module.exports = {
  root: true,
  ignorePatterns: ['node_modules', '.next'],
  extends: ['next', 'prettier'],
ecmaVersion, sourceType を指定
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
  },
  rules: {
    'no-console': 'warn',
    'no-unused-vars': 'warn',
    // Next.js では React import が不要なので無効化
    'react/react-in-jsx-scope': 'off',
  },
};
```
**TypeScriptを「ダミー」としてインストール**
Next.jsのESLint設定は**内部的に`@typescript-eslint/parser`と`typescript`を要求**するため、ダミーの typescript をインストールしておくとより安定します。
```sh
yarn add -D typescript
```
※TypeScriptを使わないなら`tsconfig.json`は不要なので、作成しなくてOKです。

## なぜ、eslintrc.jsに移行したのか？
**「TypeScriptを使わないのに`typescript`をインストールするなら、フラットコンフィグ(eslint.config.mjs)のままでよかったのでは？」と思うかもしれません。**

しかし、`.eslintrc`に移行した理由は以下の通りです。

**.eslintrc.jsのメリット**
1. **Next.js公式のESLint設定は`.eslintrc.js`に最適化されている**
2. **`.eslintrc.js`の方が安定して動作する**
3. **ESLintの公式ドキュメントでも`.eslintrc.js`の使用が推奨されている**
4. **フラットコンフィグ(eslint.config.mjs)はNext.jsではまだ完全に安定していない**

つまり、無理にフラットコンフィグを使うよりも、従来の `.eslintrc.js`を使う方がシンプルで問題が起こりにくい という結論になりました。

**フラットコンフィグとは**
詳しい説明は省きますが、ESLint v8.23.0以降で導入された新しい設定方式であり、将来的にはの`.selintrc.js`に取って代わるそうです。

### まとめ
今回のエラーを解決するにあたりTypeScriptを使用しないのにTypeScriptをインストールするのは根本的解決とは言えないのかもしれませんがひとまずESLintが動作するようになったのでよしとします。
SU01_ユーザーマスター（情報）の管理

1.ユーザー作成

2.ユーザー情報の変更
操作：
①「SU01」で検索
②ユーザー名を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/f4774015-835b-b15d-bfe1-c6d71985db4a.png)
③「変更」マークを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/7a0cf613-ca84-906d-81e8-e6fb8117ab96.png)
④「更新」画面で情報の修正ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/bf6259cf-85a8-0f1c-0eb6-85ef7feaa9f0.png)


3.パスワード管理

4.役割および権限の割り当て

5.ユーザーのロック/アンロック
Python入門

## Pythonを使う準備方法
>https://www.python.org/downloads/
最新版をダウンロードする
IDLEを開く

## コードを新規ファイルに書いた場合の実行方法
>RUN
RUN Module

## 変数とか型の基本の話
>print(1)
1

>print("こんにちは")
こんにちは

>print('こんにちは')
こんにちは

>s ="今日は晴れですね"
print(s[3,7])
晴れです
//0から数えるので3文字目は「晴」。
//0から数えて7文字目ではなく、6文字目のこと。
//抜き出したい文字列の終了位置に「+1」するので「す」までになる

>s ="今日は晴れですね"
print(s[:5])
今日は晴れ
//これは0から数えて4文字目までということ

>s ="今日は晴れですね"
print(s[3:])
晴れですね
//0から数えて3番目から末尾まで出力される

>s ="今日は晴れですね"
print(s.replace("晴れ","雪")
今日は雪ですね
//新潟豪雪らしいです

>list = [1,2,3,4]
list.append(5)
print(list)
1,2,3,4,5
//appendって追加って意味　なので末尾に追加する機能がある

>list = [1,2,3,4]
list.append(3,5)
print(list)
1,2,3,5,4
//insertって入れるって意味　なので指定の位置に入れる機能がある
//3番目に5を入れるって書いてあるけど、0,1,2,3番目の3番目の前に5を入れるってことらしい？

## 参考資料
> 動画×会話でゼロからはじめるPython入門

>第4章 pip install moviepyでインストールエラー

>pip install --upgrade numpy
Successfully installed numpy-1.21.6

>pip install numpy==1.25.0
>ERROR: Could not find a version that satisfies the requirement numpy==1.25.0 
>ERROR: No matching distribution found for numpy==1.25.0

>python -m pip list
Package Version
pip     25.0.1

>解決しませんでした。4章から先は進めず終わる
Golang でよく利用する testing をまとめた

# Golang でよく利用する testing まとめ

Go 言語には標準で `testing` パッケージが用意されており、ユニットテストやベンチマークテストを簡単に記述できます。本記事では、Golang のテストでよく利用するテクニックをまとめます。

---

## 1. `testing` パッケージの基本

Go では、`testing` パッケージを使ってテストを書くのが一般的です。基本的なテストの書き方は以下の通りです。

```go
package main

import (
	"testing"
)

func Add(a, b int) int {
	return a + b
}

func TestAdd(t *testing.T) {
	result := Add(2, 3)
	if result != 5 {
		t.Errorf("Expected 5, but got %d", result)
	}
}
```

テスト関数の命名は `TestXxx` という形式にする必要があります。`go test` コマンドを実行すると、このテストが自動的に実行されます。

---

## 2. テーブル駆動テスト

テーブル駆動テストとは、複数のテストケースをまとめて定義し、それをループで処理するテストの手法です。

```go
func TestAddTableDriven(t *testing.T) {
	tests := []struct {
		a, b, expected int
	}{
		{1, 1, 2},
		{2, 3, 5},
		{10, 5, 15},
	}

	for _, tt := range tests {
		result := Add(tt.a, tt.b)
		if result != tt.expected {
			t.Errorf("Add(%d, %d) = %d; want %d", tt.a, tt.b, result, tt.expected)
		}
	}
}
```

テストケースを増やしやすく、可読性も向上するため、実践的なコードではテーブル駆動テストをよく使います。

---

## 3. `setup` / `teardown` 処理

テストの前後に準備や後処理が必要な場合は、`TestMain` を使うことができます。

```go
func TestMain(m *testing.M) {
	// テスト前のセットアップ処理
	setup()

	// テスト実行
	exitCode := m.Run()

	// テスト後のクリーンアップ処理
	teardown()

	// テストの終了コードを返す
	os.Exit(exitCode)
}
```

---

## 4. `t.Helper()` を活用する

ヘルパー関数を定義する際には `t.Helper()` を使うことで、エラーメッセージの出力時にヘルパー関数を無視して呼び出し元の情報を表示できます。

```go
func assertEqual(t *testing.T, got, want int) {
	t.Helper() // ヘルパー関数であることを明示
	if got != want {
		t.Errorf("Expected %d, but got %d", want, got)
	}
}
```

---

## 5. `mock` を用いたテスト

依存関係をモック化してテストする場合、`interface` を利用すると便利です。

```go
type UserRepository interface {
	FindByID(id int) string
}

type MockUserRepository struct{}

func (m *MockUserRepository) FindByID(id int) string {
	return "mock_user"
}

func TestMockRepository(t *testing.T) {
	mockRepo := &MockUserRepository{}
	user := mockRepo.FindByID(1)
	if user != "mock_user" {
		t.Errorf("Expected mock_user, but got %s", user)
	}
}
```

---

## 6. `httptest` を用いた HTTP ハンドラのテスト

Go の `net/http/httptest` パッケージを使うと、HTTP ハンドラのテストを簡単に実装できます。

```go
func HelloHandler(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(http.StatusOK)
	w.Write([]byte("Hello, World!"))
}

func TestHelloHandler(t *testing.T) {
	req := httptest.NewRequest("GET", "http://example.com/hello", nil)
	w := httptest.NewRecorder()

	HelloHandler(w, req)

	resp := w.Result()
	body, _ := io.ReadAll(resp.Body)

	if resp.StatusCode != http.StatusOK {
		t.Errorf("Expected status 200, but got %d", resp.StatusCode)
	}
	if string(body) != "Hello, World!" {
		t.Errorf("Unexpected response body: %s", body)
	}
}
```

---

## まとめ

Golang の `testing` パッケージを活用すると、簡単にユニットテストや統合テストを記述できます。本記事で紹介した内容を活用し、より堅牢なコードを実装しましょう。

- 基本的な `TestXxx` 関数の作成
- テーブル駆動テストの活用
- `setup` / `teardown` の処理 (`TestMain`)
- `t.Helper()` を使ったヘルパー関数
- `mock` による依存関係のテスト
- `httptest` による HTTP ハンドラのテスト

Go のテストを効率よく書き、バグの少ないアプリケーションを目指しましょう！
vagrantで仮想環境を構築しVSCodeでSSH接続できないときの対処法

VagrantでVirtualBoxの仮想環境を構築・起動している状態で、VSCodeから仮想環境にSSH接続を試行していると、以下のメッセージが表示されてダウンロードが終わらないで先に進めなくなる時があります。

    SSH ホスト {ホスト名} を設定しています：VS Code Server をローカルでダウンロードしています
そんなときはまずコマンドプロンプト側で中に入ります。

    vagrant ssh
そして、ダウンロード中のファイルを削除します。

    rm -Rf ~/.vscode-server/
その後PC再起動を実施し、再度

    vagrant up
からやり直してみてください。
これでだいたいうまくいきます。
サクラエディタ使い方（随時更新）

1.複数行から特定列だけをどう選択（矩形選択）する?
操作：Altを押しながら、マウスを移動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/f456b438-d50b-e5dd-d20c-dc55015d3b7c.png)
【UE】VRでWidgetに対して右手/左手で操作したことを通知する

## 初めに
VRを使ってWidgetを操作する際に右手で操作しているのか左手で操作しているのか区別が必要な場合があったため、その時の備忘録的な感じでこの記事を書いています。
具体的には[【UE】リストの項目をドラッグ操作で入れ替える](https://qiita.com/NaoTel38/items/d183bc66fcc978db916a)で紹介しているドラッグ操作を実行する際に、右手で操作している最中に左手で操作しても問題ないようにするため区別が必要になりました。
あまり活用することはないかと思いますが、同じように操作した際の手の区別が必要になった方の一助になればと思います。

## 環境情報
Windows 11
UE 5.3.2

## 実装方法
今回の例ではVRテンプレートを使って説明していきます。
大まかなポイントは以下の通りです
・WidgetでOnKeyDown/Up関数をオーバーライドさせる
・Widegt Interaction Componentに対してPress Keyを実行させる

### ①Widgetを用意する
これはぶっちゃけ何でもよいとしか言いようがないです。
今回はWBP_TestMenuというものを作りました。
BorderとTextが並んでいるだけの簡素なものです。
VRのコントローラーでクリックされた際にクリックしたコントローラーが右だったか左だったかをRight/Leftで表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/c8fec27d-d41a-f0db-fe25-91398f68f741.png)

**ここで重要なポイントです。**
Hierarchyの一番上にある要素を選択してDetailsタブの中身を見ます。
Interactionの項目のなかにIs Focusableというものがあるのですが、
ここに必ずチェックを入れてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/574b5c81-39f1-5298-d96e-064f0e8037d3.png)

このあとOnKeyDown/Up関数をオーバーライドするのですが、ここにチェックを入れていないと
Widget Interaction Componentで操作してもその通知がWidgetに対して行われなくなります。

### ②OnKeyDown/Up関数をオーバーライドする
OnKeyDown/Up関数をオーバーライドしていきますが、先にクリックされた手がどちらだったかを表示する処理を追加します。
WriteTextというイベントを作成して引数のIsRightの値に応じてRight/Leftを表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/45b7c9e2-82a9-ed66-ad6e-31bb13844add.png)

FUNCTINOSのOverrideからOnKeyDown/Upを選択します。
今回は説明簡略化のためにOnKeyDownのみを実装していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/42aa24a8-ab62-2025-b3ec-43a00bba9987.png)

今回はOnKeyDown関数内部では以下のように実装します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/560f7bff-3e09-7c5e-4029-bb2f4880dc07.png)
Widget Interaction ComponentでOnKeyDownを呼ぶ際にGamepad Left Trigger/Gamepad Right TriggerをKeyとして設定する予定なので、一応それ以外のキーが引数で渡された場合は処理を行わないようにします。
後はWriteTextイベントに渡されたKeyが右手操作によるものかの判定結果を渡します。

### ③Widget Interaction ComponentでOnKeyDown/Upを実行する
VRテンプレートではVRPawnでWidget Interaction Componentを持っていますが、
実装はMenuクラスで行っているのでこちらに手を入れていきます。

Menuが持っているWidgetComponentにのWidget Classに今回作成したWBP_TestMenuを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/359de629-a143-74af-269c-b5455d7cdce9.png)

MenuクラスのEvent Graphを見ると左下の方にEnhancedInputAction IA_Menu_Interact_Left/Rightがあります。
Widget Interaction Ref Left/RightでPress Pointer Keyを実行しているのでその続きで以下のように実装します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/4609ea7c-be23-68e6-6e27-cd9255038e4b.png)

必ずPress Pointer Keyの後にPress Keyを実行するようにしてください。
Press Key単体ではOnKeyDown/UpをオーバーライドしているWidgetでイベントが発火されません。
Is Over Focusable Widgetの判定でTrueの時だけ実行させることでWidget Interaction ComponentがホバーしているWidgetに対してだけOnKeyDown/Upイベントを発火させることができます。
PressKeyで渡すKeyは正直なんでも大丈夫です。他のキーと被らないように左右で別のキーを渡せればOKです。

実際に実行してみるとこんな感じです。

![show.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/d9e4f45b-54ac-da4b-9d53-09b6f81f0924.gif)
Vonage 2025 レビュー キャンペーン　最大5,000円のAmazonギフト券をゲットしよう！

![Vonage 2025 Spring Campaign IT Review.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851076/e2a271f7-9958-9baf-4495-00b84118a355.png)

Vonage のレビューを書いて、最大5,000円のAmazonギフト券をゲットしよう！
実際にVonageを使っている皆さまのレビューを募集します。
各APIをどのように組み込んで使っているかなど、具体的なレビューをお待ちしております。
👀 詳しくはこちらのサイトをご覧いただき、ぜひVonageの関する口コミレビューを投稿してください。
🎁 なお、ギフト券は先着順となりますので、皆さんお急ぎください！!
Golang における context とは?

# Go言語の Context パッケージ徹底解説

Go 言語の `context` パッケージは、ゴルーチン間でのキャンセル、タイムアウト、デッドライン、および値の共有を管理するための仕組みを提供します。本記事では、`context` パッケージの基本概念から具体的な使用方法まで詳しく解説します。

---

## 1. Context とは？

`context` は、Go 言語において非同期処理やネットワークリクエストの制御を容易にするための仕組みです。具体的には、以下の機能を提供します。

- **キャンセルの伝播**: 特定の処理を中断するための仕組み
- **タイムアウト制御**: 一定時間が経過したら処理を強制終了
- **デッドライン設定**: 期限を指定して処理を中止
- **値の受け渡し**: ゴルーチン間でのデータ共有

Go の標準ライブラリの多くは `context` をサポートしており、HTTP リクエストやデータベースアクセスなどの処理を適切に管理できます。

---

## 2. `context` パッケージの基本的な使い方

`context` パッケージには、複数の関数が用意されており、それぞれ異なる用途で使用されます。

### 2.1 `context.Background()` の利用

`context.Background()` は、親となるコンテキストがない場合に使用される基本的なコンテキストです。

```go
package main

import (
	"context"
	"fmt"
)

func main() {
	ctx := context.Background()
	fmt.Println(ctx)
}
```

### 2.2 `context.WithCancel()` でキャンセル処理

`WithCancel` を使うことで、キャンセルが可能なコンテキストを生成できます。

```go
package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel() // 必ずキャンセルを呼び出す

	go func() {
		time.Sleep(2 * time.Second)
		cancel()
	}()

	<-ctx.Done()
	fmt.Println("Context canceled")
}
```

### 2.3 `context.WithTimeout()` でタイムアウト設定

一定時間後にキャンセルされるコンテキストを作成するには `context.WithTimeout()` を使用します。

```go
package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
	defer cancel()

	select {
	case <-ctx.Done():
		fmt.Println("Timeout exceeded")
	}
}
```

### 2.4 `context.WithDeadline()` でデッドライン設定

特定の時刻をデッドラインとして設定する場合は `context.WithDeadline()` を使用します。

```go
package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	deadline := time.Now().Add(3 * time.Second)
	ctx, cancel := context.WithDeadline(context.Background(), deadline)
	defer cancel()

	select {
	case <-ctx.Done():
		fmt.Println("Deadline reached:", ctx.Err())
	}
}
```

### 2.5 `context.WithValue()` で値を共有

`context.WithValue()` を使うと、コンテキスト内に値を保存してゴルーチン間で共有できます。

```go
package main

import (
	"context"
	"fmt"
)

func main() {
	ctx := context.WithValue(context.Background(), "userID", 42)
	fmt.Println("User ID:", ctx.Value("userID"))
}
```

ただし、大きなデータを `context` に格納するのは推奨されていません。データ共有には `context` ではなく、チャネルや構造体を利用するのが適切です。

---

## 3. `context` を使うべき場面

`context` は以下のようなケースで特に有効です。

- **HTTP リクエストのタイムアウト管理**
- **データベースクエリのキャンセル処理**
- **長時間実行される処理の制御**
- **複数のゴルーチン間での情報共有**

---

## まとめ

Go 言語の `context` パッケージを活用することで、非同期処理やゴルーチンの適切な管理が可能になります。特に、

- `context.Background()` は基本となるコンテキスト
- `context.WithCancel()` でキャンセル可能なコンテキストを作成
- `context.WithTimeout()` で一定時間後にキャンセル
- `context.WithDeadline()` で特定の時刻にキャンセル
- `context.WithValue()` で値をゴルーチン間で共有

といった機能を理解し、適切に活用しましょう。
PostgreSQLの操作をまとめる

# PostgreSQL の基本操作まとめ

この記事では、PostgreSQL における基本的なデータベース接続とテーブル操作について解説します。

---

## 1. DB 接続

### 1.1 `psql` コマンドで接続
```sh
psql -U <ユーザー名> -d <データベース名>
```
例:
```sh
psql -U postgres -d mydatabase
```

### 1.2 ホスト・ポートを指定する場合
```sh
psql -U <ユーザー名> -h <ホスト名> -p <ポート番号> -d <データベース名>
```
例:
```sh
psql -U postgres -h localhost -p 5432 -d mydatabase
```

### 1.3 Docker で接続する場合
```sh
docker exec -it <コンテナ名> psql -U <ユーザー名> -d <データベース名>
```
例:
```sh
docker exec -it my_postgres_container psql -U postgres -d mydatabase
```

---

## 2. Table 操作

### 2.1 テーブル一覧表示
```sql
\dt
```
またはスキーマも含めて表示する場合:
```sql
\dt *.*
```

### 2.2 テーブルの中身を表示
```sql
SELECT * FROM <テーブル名>;
```
例:
```sql
SELECT * FROM users;
```

### 2.3 テーブルの作成
```sql
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

### 2.4 テーブルの削除
```sql
DROP TABLE <テーブル名>;
```
例:
```sql
DROP TABLE users;
```

### 2.5 テーブルの中身を削除
```sql
TRUNCATE TABLE <テーブル名>;
```
例:
```sql
TRUNCATE TABLE users;
```

また、外部キー制約がある場合は以下のように `CASCADE` をつけることで関連データも削除できます。
```sql
TRUNCATE TABLE <テーブル名> CASCADE;
```

---

# まとめ
PostgreSQLの基本的な操作をまとめました
【簡単AWS】【Auto Scaling】Auto Scalingのヘルスチェック設定について

# 記事概要
AWS Auto Scalingでは、インスタンスのヘルスチェックを設定する際に**EC2**と**ELB**（Elastic Load Balancer）の2種類の健康状態チェック方法があります。

本記事では、**EC2ヘルスチェックのみが有効で、ELBヘルスチェックが無効**の場合に発生する可能性のある挙動やリスク、そして推奨される設定について解説します。

---

## ヘルスチェックの種類
### EC2ヘルスチェックとは
EC2インスタンスの**インスタンスステータスチェック**をもとに健康状態を判断します。具体的には以下の2つのステータスを確認します：
- **システムステータスチェック**：EC2のハードウェアやネットワーク関連の問題を検出
- **インスタンスステータスチェック**：インスタンスのオペレーティングシステムレベルでの問題を検出

### ELBヘルスチェックとは
ELBはアプリケーションの稼働状況を確認するため、指定されたポートとパスに対してリクエストを送信し、**アプリケーション層の健康状態**をチェックします。インスタンスが正常にリクエストに応答できるかどうかで健康状態を判断します。

---

## EC2のみ有効でELBが無効の場合に発生する可能性のある挙動
### 1. **アプリケーション層の異常を検知できない**
EC2ヘルスチェックはインスタンスのOSやネットワーク状態を確認するだけで、アプリケーションの状態は監視しません。そのため、以下のようなケースでは問題が検知されず、異常なインスタンスが引き続きトラフィックを受け取る可能性があります。
- アプリケーションサーバーがクラッシュしている
- 必要なポートが閉じている
- アプリケーションの応答が著しく遅い

### 2. **不健康なインスタンスが負荷分散対象に残り続ける**
ELBヘルスチェックが無効な場合、ELBはアプリケーション層で不健康なインスタンスを認識できません。その結果、不健康なインスタンスが引き続き負荷分散の対象になり、ユーザーのリクエストが失敗するリスクは高まります。

### 3. **インスタンスの置き換えが遅延する**
EC2ヘルスチェックで不健康と判断されるまでには一定の時間がかかる場合があります。その間、異常なインスタンスがトラフィックを処理しようとし、サービスのパフォーマンスが低下する可能性があります。

---

## 推奨される設定
### **EC2とELBのヘルスチェックを併用する**
アプリケーションの可用性を確保するために、**EC2とELBの両方のヘルスチェックを有効化する**ことを推奨します。これにより、インフラ層とアプリケーション層の両方でインスタンスの状態を正確に監視できます。

### **ヘルスチェックの設定手順**
1. AWSコンソールにログインし、Auto Scalingグループを選択します
2. **ヘルスチェックの設定**でEC2とELBの両方を有効にします
3. **ELBのヘルスチェック条件**（パスや応答タイムアウト時間など）を適切に設定します
4. 設定を保存し、適用します

---

## おわりに
Auto Scalingのヘルスチェック設定は、サービスの可用性とパフォーマンスに直接影響を与えます。**EC2のみのヘルスチェックではアプリケーション層の問題を検知できない**ため、ELBヘルスチェックの併用が重要です。

本記事がAuto Scalingの設定見直しの参考になれば幸いです。ぜひ皆さんも適切なヘルスチェックを設定し、より安定したAWS環境を構築してください。

---

### 参考リンク
- [AWS Auto Scaling ドキュメント](https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/healthcheck.html)
- [Amazon EC2 インスタンスの状態チェック](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html)

---

### 著者について
AWS初心者からエンジニア向けに、Auto Scalingやクラウド技術についての情報を共有しています。興味がある方はぜひフォローしてください！一緒に勉強しましょう！
トライアンドエラーとエンジニアの成長-人間関係にも応用できるか？

# **トライアンドエラーとエンジニアの成長─人間関係にも応用できるか？**

こんにちは、しゅんです。  
4回目のポエムになります。今回は**エンジニアにとってトライアンドエラーがいかに重要か、そしてそれが技術だけでなく人間関係や他の分野にもどう影響するか**について話します。  

僕がずっと言い続けている言葉があります。それは、**エラーとはお友達です**というものです。技術を学ぶ上での失敗は、むしろ次の成長へのステップであり、学ぶための貴重なヒントを与えてくれます。しかし最近、**人間関係におけるエラーが技術とは異なり、簡単には修復できないこと**を身をもって感じています。僕の中で今も解決しきれていない悩みの一つです。

---

## **1. 技術でのトライアンドエラーは僕の成長を支えた**  

技術において、トライアンドエラーは避けられないプロセスです。

### **PCB設計やプログラミングでの失敗から学んだこと**  

PCB設計を始めた頃は、電流が流れない原因を探すために何時間も基板とにらめっこしていました。ハンダ付けも手が震えてミスばかりしていましたが、何度もやり直すことで少しずつコツを掴み、今では失敗を恐れず作業できるようになりました。  

プログラミングでも、Python、C、C++、Java、どの言語も最初はエラーだらけでした。特にAIや音声認識のプロジェクトでは、モデルの学習が全然進まず、数日間何の成果も得られなかったこともあります。それでもエラーを修正するたびに理解が深まり、問題を一つ一つ解決することで今の僕があります。

> **技術のエラーは、次の正解を見つけるための道しるべです。**

---

## **2. 最近の人間関係でのトライアンドエラーとその影響**  

技術のトライアンドエラーには慣れている僕ですが、人間関係のエラーがここまで自分を追い詰めるとは思いませんでした。特に、**一番最初に日本でできた大切な友人関係**での失敗が心に深くのしかかり、日常生活にも影響が出ています。

最初は、失敗しても謝罪して改善すれば問題ないと思っていました。ですが、何度も同じようなミスを繰り返してしまい、そのたびに「また失敗した」「相手の信頼をさらに失ってしまった」と自分を責め続けました。**くよくよと失敗を引きずり、気持ちの切り替えができずに空回りする日々が続きました。**  

さらに、頑張っているつもりでも、他人から見たら何も変わっていないと思われているのではないかという不安に襲われ、**「もっと変わらなきゃ」と焦るあまり、心の中で自滅してしまう状態**になりました。もともと、十分な睡眠が取れていない状況もあり、精神的にも肉体的にも限界が来てしまい、ついに**鬱状態になってしまいました。**  

布団から起き上がれない日もあり、学校の課題も進まなくなりました。夜になると失敗した場面が頭に浮かび、「信頼はもう取り戻せないんじゃないか」「これ以上何をしても無駄なんじゃないか」と考え込んでしまいます。心が疲れ果ててしまい、時には**暴走するかのように、焦って無理な行動を取ってしまうこともありました**。その結果、さらに誤解を生んでしまい、自分で状況を悪化させてしまったのです。

**人間関係にはもちろん相手を諦めて、その前に築いた友人関係での失敗を次の関係に活かす方法もあります｡** でも、僕はそうしたくありません。**大切な人との関係を何度でも修復したい**と思っています。簡単に「次に活かせばいい」という考えに逃げず、**この関係を諦めずに大切にしていくことが僕の選択**です。どんなに時間がかかっても、一つ一つ慎重に進むことが必要だと感じています。

> **失敗はたくさんしました。それでも、諦めることだけはしないと決めています。焦らず、一歩ずつ前へ進んでいきます。**

---

## **3. 医療や飛行機のように、実践では許されないトライアンドエラー**  

技術や勉強段階ではエラーが歓迎されますが、すべての分野でそうとは限りません。特に、**医療や航空の現場では、失敗が許されない場面**が多くあります。  

### **医療における誤診とその重さ**  
医療の現場では、誤診が患者の命に直結することがあります。そのため、医師たちは勉強段階で何度もトライアンドエラーを重ね、失敗から学ぶ必要がありますが、実際の診療ではエラーを最小限に抑えることが求められます。**勉強段階でこそエラーから学び、実践で失敗しないための準備を整えることが重要**です。

### **航空の安全性とトライアンドエラー**  
飛行機も同じです。離陸後に何かトラブルが発生すれば、乗客全員の命に関わります。そのため、エンジニアたちはシミュレーションで何千回もエラーを出し、それを修正して安全性を確保します。実践では一切のエラーを許さないため、準備段階でどれだけトライアンドエラーができるかが重要になります。

人間関係でもこれに似た部分があります。トライアンドエラーは勉強段階や気軽な友人との関係なら可能かもしれませんが、**大切な人との関係では、同じエラーを繰り返してはいけない**のです。

---

## **4. 僕が学んだ人間関係でのトライアンドエラーの重要性**  

最近の経験を通して、僕はただ謝るだけでは関係は修復できないことを学びました。**大事なのは、同じ失敗を繰り返さないためにどう行動するか**です。例えば、相手の言葉にすぐ反応するのではなく、一度立ち止まって「相手が本当に求めていることは何か」を考えるようにしました。

技術と違い、人間関係のエラーは慎重に対応しなければ逆効果になりますが、それでも諦めずに修復の努力を続けることで、少しずつでも信頼を取り戻せるのだと思っています。

---

## **5. まとめ：エラーはお友達、でも大切な人との関係は慎重に**  

技術においては、エラーは次の成長につながる大切な存在です。しかし、人間関係や医療、航空といった分野では、エラーが深刻な影響を与えることもあるため、慎重さが求められます。  

僕が最近の経験から学んだのは、**エラーを恐れる必要はないけれど、繰り返さないための努力は必ず必要**だということです。そして何より、簡単に諦めるのではなく、一つひとつの関係を大切にしながら向き合い続けることが大事だと感じています。

> **「エラーはお友達。でも、大切な人との信頼は簡単に諦めない。」**

失敗してもいい、ただしその失敗を無駄にしないで次に活かすことが重要です。最後まで読んでくれて本当にありがとう。
MS-900(Microsoft 365 Fundamentals)を受けてきたので所感

去年のMicrosoft資格の調査後、受けたくはなかったがやむなく受ける羽目になったので、練習と検証の為にMS-900を受けてきた。

https://qiita.com/Mr164/items/a5bc3eee67480ca56bfa
# 試験を受けるにあたって

久しぶりにベンダー試験を受ける段になり、円高の煽りをもろに食らっていることに軽く絶望。
練習で12000円弱が飛んでいくのは嫌なので、Microsoft Virtual Training Dayを受講することで半額クーポンをゲットする。

https://www.microsoft.com/ja-jp/events/top/training-days

# 勉強方法
AWSに比べて試験対策の資料がほとんどないため、色々とあさっては見たが、
結論としては**公式のプラクティス評価**が一番という事で、
90%以上の正解率を出せるまで繰り返し解きまくった。
50問出題ではあるが、全体としては100～150題ぐらいのランダム出題のようには感じた。
他の無料問題もいくつか見たが、出題の質と量を考えたときに
プラクティス評価以上に役に立つものではなかった。
気分転換に使うぐらいならいいかも。

MicrosoftLearnも流し読みしたが、
全く日本語として理解させない文章がストレスだったので、
Geminiに「**以下のサイトを元にゆっくり解説動画のシナリオを作成して**」と
お願いして翻訳させた。
(Copilotはよくとんでもない嘘つくので使わなかった)

https://learn.microsoft.com/ja-jp/credentials/certifications/practice-assessments-for-microsoft-certifications

# 試験
試験はサンドボックスで試した通りではあるが、
問題作成者が新入社員さんなのかと思うぐらい、プルダウンとドラッグアンドドロップの使い分けが意味不明。
適切なサービス選ぶだけなら全部プルダウンでいいだろ。
穴あきのところにサービスの名前をドラッグアンドドロップするとか、
その機能使いたいだけだけだろと。

# 試験結果
結果は試験終了後に即表示され、1000点中822点で合格(合格点は700点)

# 所感
試験内容もMicrosoftLearnに乗っていないような微妙な問題が数題出題される。
**公式のプラクティス評価**で9割以上安定してとれるなら、合格点は取れるので、
知らないなら知らないで割り切るのが重要。
満点を取る試験ではない。

正直、この試験にどんな需要があるのだろうと不思議ではある。
多分、難易度としては原付試験と同じくらいのではなかろうか。
資格のことを知らない上司に対して自己研鑽のアピールにはちょうど良いのかもしれないが、
知識を深めるという意味ではまぁ・・・うん・・・といった感じ。

しかし、Microsoftパートナーシップという貸し剥がしのような契約形態の維持の為、
さらに情報の少ないRolebase試験をふたつも受けなければいけない。(しかも高い)
せめてAWSのような次回受験時50％オフバウチャーぐらいつけてほしいものだ。
【Unity】知識0からメダルゲーム一つでどこまで学べるのか

## はじめに
　この前Unityでメダルゲームを作って遊んだので、その時に学んだことをQ&Aの形式でアウトプットしたいと思います。

## 筆者のスペック（？）
どんな状態で制作に入ったのかを話しておきます。
- Unityを使うのは初めて
- 3Dゲームを作るのも初めて
- C#は書いたことない

　普段からPythonは書いているので、C#を書く上で、だいぶ障壁が減っていた感じはしますが、そこまで複雑なものは書かないので、完全な初心者でもOKです。

## Q&A
**Q.視点移動ってどうやってするの？**
A.Altを押しながらドラッグしてください

#### 以下の内容は後で貼るリンクから動画を参照すると良いです
**Q.モノってどうやって置くの？**
A.左にあるヒエラルキーってところで右クリして、3Dオブジェクトを選ぶと、候補が出てきます。筆者はCube（四角柱）やCylinder（円柱）を使ってみました。既に設置してあるものを選んだ状態で生成すると、それらを一つの塊として扱えます。また、これをAssetsという下のところにドラッグアンドドロップすることで、使いまわせるようになります。プレハブ化というらしいです。

**Q.モノの形ってどうやって変えるの？**
A.Sceneの画面上部に手のマークがあるので、その横のタブを選んで形や位置を変えられます。さらに隣には角度を変えるものもあります。自分でいろいろ試してみた方が早いです。

**Q.モノの色ってどうやって変えるの？**
A.下のAssetsで右クリックしてcreateを選択するとMaterialというのがあるので、まずはそれを作成し、色などの設定を変更します。出来上がったMaterialは、色を変えたいモノに、ドラッグアンドドロップすることで適用できます。

**Q.動く床ってどうやって作るの？**
A.C#で動かすためのスクリプトを組んで、それをMaterialと同様に、ドラッグアンドドロップで適用します。

**Q.他にはC#でどんなことができるの？**
A.メダルゲームでいえば、ランダムな位置から出現させたり、特定の方向からメダルを射出したり、様々な使用方法が考えられます

**Q.じゃあC#はどうやって書くの？**
A.下のAssetsで右クリックしてcreateを選択すると、MonoBehaviour Scriptというのがあるので、それを選んでください。できたファイルは好きなエディタから書き換えたらOKです。C#が書けない人はAIに書いてもらいましょう。

**Q.重力の影響を受けるようにするには？**
A.インスペクターの一番下にあるAdd ComponentからRigidbodyというのを追加しましょう。

#### 参考動画
https://youtu.be/_xPo9DUECiM?si=Y4QbneyWjYByuEa1

追加で動画に載っていなかったQ&Aです。

Q.**摩擦係数とか反発係数をいじるには？**
下のAssetsで右クリックしてcreateを選択するとPhysics Materialというのがあるので、まずはそれを作成し、数値を変更します。その後、Materialと同じように、適用したいモノに、ドラッグアンドドロップしてください。

Q.**画面にUIを出すには？**
ヒエラルキーから3Dオブジェクトを生成したように、UIというのがあるので、まずはCanvasを生成します。その後、Canvasの下にTextなどを生成していけばうまくいきます。C#を使うことで、画面に変数の中身をTextとして表示することも可能です。

## まとめ
- Unityのエディタでドラッグアンドドロップを活用して、オブジェクトを編集する
- 出来上がったオブジェクトに動きをつけたり、オブジェクトの生成、破棄にC#を活用する

メダルゲームの作成を通じて、基本的に以上の2点で進めていく感覚が、なんとなく掴めた。
 
## 最後に
　ここまで読んで下さりありがとうございました。ゲームの情報を受け取って、処理を走らせて、ゲームに反映させるとかは、Pythonでのゲーム制作と変わらないですね。とりあえず、どんなことができそうかのイメージはついたので、最初に扱う題材として悪くなかったと思います。ちなみに学習時間は４時間ほどです。
Geminiを利用して英語のヘルプを日本語に翻訳した

会社のGithubリポジトリのヘルプは、英語Markdownファイルで書いていますが、日本語に翻訳したいです。Geminiを利用して効率よくそれを実現しました。

Gemini（ジェミニ）は、Googleが開発した生成AI（人工知能）モデルです。テキストや画像、音声、動画などのさまざまな形式のデータを理解・処理し、文章生成や要約、リサーチなどの機能を提供します。﻿

https://gemini.google.com/

Markdownファイル１７２本ほどありますが、大抵コピぺで二日間で翻訳完了できました。AIこその間違いを発見しましたが、メモさせていただきます。

## リクエスト
まずなにをやりたいか注文します。指示文で命令します。思い出せる注意事項も一緒に伝えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/66a0c0a6-66c8-75e0-d5c1-ae65e2d8f493.png)
## 作業実施
加工したいものをどんどんコピペでGeminiに渡します。処理後のものはMardown方式で出力されて、コピーアイコンでコピーできます。以下の例でみると、ソース部分はそのまま変更せず説明文とコメントは翻訳されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/ada79abb-23fc-da2f-2c70-3d7535946e1f.png)
## 不備対応の例
たまに、テーブルのタイトルは翻訳されていないことを発見しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/df6911a9-dc11-6580-14e5-fc9d81c72b54.png)
翻訳してくださいと指示すると、背景を無視して、文字通りにやってくれてしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/0e5c5417-b9cc-8907-85b2-6fa371ec2253.png)
指示を直してもう一回チャレンジです。今回は日本語と英語両方ともタイトルに入れてくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/6b5376ee-ce02-2f15-d29c-e0223c82f63b.png)
それを削除したいですが、タイトル不要と誤解されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/29d1aef9-e009-8baf-3ee2-ab7f80c44cff.png)
説明に戸惑いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/a636d61e-0e4b-7dbc-61ad-4e59e7f3e43c.png)
焦らず、修正箇所とほしい出力を伝えて、正しく対応できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/358d082e-939a-ec80-fa48-27f956430c0d.png)
## 進まない例
バーコード作成のMarkdownについて、どうも「バーコードを作成してください」と誤解されて、できないよと終わりです。いくら説明しても進まないです。仕方ないですが、手動翻訳しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/0c859a2e-2ee2-33cf-afc3-250474aad687.png)

## まとめ
Geminiを利用するとき、不備箇所と正しい内容を並んで指摘する方法はとても有効だとわかりました。
ラズパイでJW-CAD for Windowsを使う

ラズパイにWindows用ソフトであるJW-CAD for Windowsをインストールして使ってみる。

以下本文中ではJW-CAD for Windowsをjwwと記述する。

試用機種：Raspberry Pi 4
試用OS：64Bit debian 12.9 (2025.02/10時点での最新）

## １．最新のラズパイOSをインストール

（１） Raspberry Pi Imager にて作成したSDカードで起動する。
（２） 恒例のおまじない
```
sudo apt update
sudo apt upgrade
sudo apu dist-upgrade
```
（３）ラズパイ設定メニューからロケールをJP,utf-8にする。※１
（４）再起動

## ２．Pi_Appsのダウンロード＆インストール
これがあると、後の作業がすごく楽ちん
```
git clone https://github.com/Botspot/pi-apps 
pi/pi-apps/install 
```
## ３．Wineのインストール
（１）ラズパイメニューからPi_Appsを起動する。
（２）Box86を検索しインストールする。
　　ラズパイは86系ではなくARMなのでこれが必要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810807/e3f199f2-e82b-38a2-3ce4-92b3e8b9caad.png)
（３）Wineを検索しインストールする。
（４）日本語フォントをインストールする。
```
BOX86_NOBANNER=1 winetricks fakejapanese_ipamona
```
## ４．Windowsアプリケーションをインストールする。
WineではWindowsのドライブ、システムディレクトリ、システムファイルをラズパイに仮想展開している様なのでその下にインストールできる。

（１）jwwのインストール　
　今回は、ファイルの場所を自分が認識しやすいように、/home/piの下へjwwというディレクトリを作ってそこを利用する事にした。
 
 jwwのインストール用EXEファイルをWindowsPCからUSBメモリ経由でPi下のディレクトリへコピーする。（今回は/home/pi/WinSoftというディレクトリを作ってその下へコピーした）
　ファイルマネージャからこのEXEファイルをWine_Desktopで開く。（マウス右ボタン）

　インストーラが起動し、著作権の画面が出るので承諾して進むと、インストールディレクトリを聞いてくるが、今回は事前に用意した/home/pi/jwwを指定した。
　デスクトップにアイコンを作成するか聞いてくるので了解してインストールを完了する。

 ## ５．動作確認
 　デスクトップのアイコンをダブルクリックしjwwを起動する。起動は少し遅いが、立ち上がってしまえば普通の反応速度で使用できる。ただし、？？？となる表示があるので、フォントが不足しているのかも知れない。また、ファイルの保存がうまくできない様だ。おそらくWindows形式のドライブを探している様な感じ。

※１　↑上記記述は勘違い。ラズパイのOSをインストールしたばかりで、ロケーションの設定をしてなかった為、？？？？表示となっている部分があった。ロケーションをjp,utf-8に設定したら解決した。
また、ファイル保存の動作についても解決。これは、OSの再起動の結果なのか、日本語設定の結果なのかは解らないが正常に動作するようになった。

図面の作成は問題なく行える事が解ったので、いよいよ成果物の印刷。

ラズパイのメニューの「設定」-「印刷設定」にてプリンターを設定する。ラズパイから普通に使えることを確認してjwwからの印刷を行ってみる。

**インストールから図面の作成、印刷までほとんど何の問題もなく行えた。Wineすごい！**

## ６．最後に
今回、なぜわざわざラズパイでjwwを使おうと思ったかというと、木製家具などを製作する際に、パーツのカット寸法や角度を再確認したり、見直したりするために古いWin10のノートPCを手元に置いて作業している。

しかし、強制空冷のPCには過酷な環境なので、いろいろガタが来ている。新しいWin11のPCを投入するような環境でもないので、CPU負荷の小さいjwwならばパッシブ空冷のラズパイで十分なのでは？と思いやってみた。

結果、おそらく3BやZero2wでもまったく問題ないだろうと感じる位快適に使える事が解った。OFISソフトはWindowsでもLinuxでも同様に使えるものがあるので問題ないが、使い慣れたjwwはWindows版しかないので悩んでいたが、WineのおかげでLinux環境に移行しても問題ないことが解り安心した。

今回は、予想以上にWineが使い物になる事が知れて驚いた。
【Chrome】【エラーコード 】STATUS_ACCESS_VIOLATIONでクロームが開けない

# コード
```PHP
1・タスクマネージャーを開き、chrome.exeが動作していないことを確認
2・動作している場合は、「タスクの終了」で停止する
3・Windows + R を押して「ファイル名を指定して実行」を開く
4・
C:\Program Files\Google\Chrome\Application
か
C:\Program Files (x86)\Google\Chrome\Application
を入力
5・chrome.exe の名前をChrom.exeに変更

```

# 結果
```javascript
なぜか治る、なぜ治るのかはふｍ

```
LambdaのコードエディタにD&Dでファイルアップロードできるって知ってた？

昨年後半に、AWS LambdaのコードエディタがVSCode風になりましたよね。

https://aws.amazon.com/about-aws/whats-new/2024/10/aws-lambda-code-editor-based-code-oss/

コードが書きやすくなっただけでなく、この部分にファイルをアップロードできるって知ってました？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/1e292454-000a-3f41-5cb0-71aff64ef12c.png)

:::note
ドラッグアンドドロップでもコマンド（`Ctrl + C`→`Ctrl + V`）でも可能ですが、ディレクトリーをアップロードする場合は、コマンド方式ではエラーになりました。
:::

なので、ちょっとしたライブラリーなら、いちいちLambdaレイヤーを作らなくても追加が可能です。

例えば、PythonのRequestsライブラリーであれば、`pip install -t python requests`で取得した後、pythonディレクトリー内のファイル一式を貼り付けるだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/f938fa4c-5fc5-bcea-35ae-fe1617b7f70b.png)

:::note
アップロードはちょっと遅いかな？という体感です。
:::

アップロードが終わるとこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/49efda04-ec07-2095-de38-101c9a86a268.png)


これだけで、Requestsライブラリーが使用可能です。

コードを書き換えて、

```python
import json
import requests

def lambda_handler(event, context):
    # TODO implement
    response = requests.get("http://www.google.com")
    return {
        'statusCode': 200,
        'body': json.dumps(response.text[:100])
    }
```

デプロイの後、テスト実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/19954ac0-26a6-b247-8cb2-4976ad0fc5dd.png)

うまくいきました。
VoiceOverとはなんぞや

はじめに
私は視覚に障害がある当事者である
アプリ開発に少しでも役立てていただければ幸いだ。

そもそも、VoiceOverてなんやねん
VoiceOver（ボイスオーバー）はApple端末に搭載されているアクセシビリティである。
画面の内容を読み上げてくれる機能（スクリーンリーダー）の一つで、他にもWindowsなら「ナレーター」Androidなら「トークバック」などがある。
一般の状態ではワンタップ操作で使用したり、マウスでカーソルを当ててクリックしたりするが、視覚障害のある方々はそのような操作は困難である。
そのために、画面のスクロールはスワイプだったり、そのボタンを選択するにはトントンと2回タップしたりして操作できるようにする機能だ

本題
さて、ここまではボイスオーバーやスクリーンリーダーの主な特徴を説明してきた。
本題に入ろう。
今回はアプリを作るために気をつけて欲しいことを書いていく。

1. 画像だけじゃゃなんのぼたんなのか、何が書いてあるのかがわからない
1. これはアプリだけでなくウェブ開発にも言えることだが、画像だけを置かれるとそれが何を意味しているのか、さっぱり理解ができなくなってしまう。
それを回避するには、HTMLならALT＝で説明する文字列を書いてあげれば、画像にカーソルが当たった時にコードで記述された説明文を読み上げる。スィフトやらエックスコードなら同じような値があるはずだ。
2. ただボタンを置くだけじゃなんのボタンかわからない。
皆さんは、エレベータや家電の操作をすると起動しているだろうか？
おそらく、ボタンに書かれている文字を見て操作をするだろう。
これはボイスオーバーなどのスクリーンリーダーにも言える。
もしアプリ上にいくつかのボタンがあって、そのボタンのどれにも文字が書いてなかったら、または、エレベーターがあって、そのどのボタンにも文字が書いていなかったら、非常に困ったことになるだろう。
一般にはアイコンで区別するかもしれないが、視覚障害の方方はその区別ができないか、しずらい人が多い。
そのため、アプリを作るときは、ボタンに対して「これはボタンだよ」と言う指示とボタンに文字をつけて欲しい。

最後に
ここまで私なりに工夫して欲しい点を書いてきたが、アップルデベロッパーのサイトにアクセシビリティ絵の対応のドキュメントがあるので、より詳しく知りたい方はそちらもご覧いただき、アプリ・ウェブ開発の参考にしていただきたい。
アクセシビリティ→
global $post が必要なパターンと不要なパターンについて

### global $post が必要なパターン
1. メインループの外で投稿データにアクセスする場合
```php5
// ループの外で現在の投稿データを取得したい場合
global $post;
$current_post_id = $post->ID;
```

2. 関数の中で現在の投稿データにアクセスする場合
```php5
function my_custom_function() {
    global $post;
    return $post->ID;
}
```

3. 複数のループを扱う際に元の投稿データを保持したい場合
```php5
global $post;
$original_post = $post; // 元の投稿を保存

// 新しいクエリ
$custom_query = new WP_Query($args);
while ($custom_query->have_posts()) : $custom_query->the_post();
    // 処理
endwhile;

$post = $original_post; // 元の投稿を復元
wp_reset_postdata();
```

### global $post が不要なパターン
1. WordPressのメインループ内
```php5
while (have_posts()) : the_post();
    // the_title() や the_content() などのテンプレートタグが
    // 自動的に現在の $post を参照する
    the_title();
endwhile;
```

2. WP_Queryを使用する場合
```php5
$custom_query = new WP_Query($args);
while ($custom_query->have_posts()) : $custom_query->the_post();
    // WP_Queryが自動的に$postを設定する
    the_title();
endwhile;
wp_reset_postdata(); // 重要：元の投稿データを復元
```

3. get_posts()を使用する場合
```php5
$posts = get_posts($args);
foreach ($posts as $post) {
    setup_postdata($post);
    // ここでテンプレートタグが使える
    the_title();
}
wp_reset_postdata();
```

- なぜループ内で不要か？
WordPressのループ関数（the_post()）が自動的に現在の投稿を$postグローバル変数にセットするため

- なぜ関数内で必要か？
PHP関数のスコープルールにより、関数内からグローバル変数にアクセスするにはglobal宣言が必要なため

- なぜWP_Query使用時に不要か？
WP_Queryクラスのthe_post()メソッドが自動的に$postをセットするため

- 重要な注意点
カスタムクエリを使用した後は必ずwp_reset_postdata()を呼び出して、元のメインクエリの状態を復元する。複数のループを扱う場合は、元の$postを変数に保存しておくことが安全
ACF（advanced custom fields）を使ってのfile項目入出力

ACFのプラグインからも、functions.phpからも、ファイルアップロード項目の設定を出来ますが、返り値を配列にした場合、どのキーになんのデータが入るのかという情報がなかなか検索できなかった為、したためさせていただきます。

### ACF側の設定(下記のように設定をした場合）
このコードを入れることで、ACFの管理画面で手動設定をしなくても動作します。
これは「ACF Local JSON」と呼ばれる機能の一つで、PHPコードでフィールドを直接定義する方法です。

コードでフィールドを設定する場合のメリット：
- サイト移行が容易（ACFの設定をデータベースからエクスポート/インポートする必要がない）
- バージョン管理が可能（コードとしてGitなどで管理できる）
- 複数の環境で同じ設定を簡単に共有できる

ACF管理画面でフィールドを設定する場合のメリット：
- GUIで視覚的に設定できる
- 設定内容をリアルタイムで確認できる
- コードを書く必要がない

使い分けとしては：
- 開発時や複数サイトで同じ設定を使う場合 → PHPコードで定義
- 1サイトのみで使用し、頻繁に設定を変更する場合 → ACF管理画面で設定
```php5
function register_newsletter_acf_fields() {
  if(function_exists('acf_add_local_field_group')):
    acf_add_local_field_group(array(
      'key' => 'group_newsletter',
      'title' => 'ニュースレターPDF',
      'fields' => array(
          array(
              'key' => 'field_pdf_file',
              'label' => 'PDFファイル',
              'name' => 'pdf_file',
              'type' => 'file',
              'return_format' => 'array',  // 戻り値を配列にしたい場合
              'library' => 'all',
              'mime_types' => 'pdf'
          ),
      ),
      'location' => array(
          array(
              array(
                  'param' => 'post_type',
                  'operator' => '==',
                  'value' => 'newsletter',
              ),
          ),
      ),
    ));
  endif;
}
add_action('acf/init', 'register_newsletter_acf_fields');
```

### 取得方法
```php5
// 取得方法
$pdf_file = get_field('pdf_file');

// 取得できる配列の内容
array(
    'ID'          => 123,                      // 添付ファイルのID
    'url'         => 'http://..../sample.pdf', // ファイルのURL
    'title'       => 'サンプルPDF',            // タイトル
    'filename'    => 'sample.pdf',             // ファイル名
    'filesize'    => 12345,                    // ファイルサイズ
    'author'      => '1',                      // 投稿者ID
    'type'        => 'application/pdf',        // MIMEタイプ
    'subtype'     => 'pdf',                    // サブタイプ
    'description' => '説明文',                 // 説明
    'caption'     => 'キャプション',           // キャプション
)
```

### 使用例
```php5
$pdf_file = get_field('pdf_file');
if($pdf_file) {
    echo '<a href="' . esc_url($pdf_file['url']) . '">';
    echo esc_html($pdf_file['title']);
    echo '(' . size_format($pdf_file['filesize']) . ')';
    echo '</a>';
}
```
※esc_url()は、URLを安全にエスケープする関数で、XSSなどの攻撃を防ぎます。
主な機能:
- 危険な文字をエンコード
- 許可されたプロトコル(http, https, mailto等)のみ通過
- 不正なURLを空文字列に変換

※esc_html()
HTML特殊文字をエンティティに変換する関数で、XSSなどの攻撃を防ぎます。
主な変換:
```
& → &amp;
< → &lt;
> → &gt;
" → &quot;
' → &#039;
```
※size_format()
- バイト数を人間が読みやすい形式に変換する関数です
- 単位を自動的に調整します(B, KB, MB, GB)
- 小数点以下は最大1桁まで表示
【マインクラフト（統合版）】「いかずちの杖」と「はかいのつるぎ」を融合できるようにしてみました

# はじめに

ここでは本環境で実装している「いかずちの杖」と「はかいのつるぎ」を融合した状態で使う方法をご紹介します。

https://qiita.com/glasses_seven/items/6f125a1d45f5d9cef538/

https://qiita.com/glasses_seven/items/88f9e2fea056172d41b7/

融合と言っても新しいアイテムを生成するものではありません。
それぞれのアイテムをメインハンドとオフハンドに持たせる事によって、装備している間だけ融合させる事ができるようにしています。


# 動作環境

<dl>
    <dt>プラットフォーム</dt>
    <dd>Windows10</dd>
    <dt>マインクラフト（統合版）</dt>
    <dd>Bedrock Edition v1.21.51</dd>
    <dt>socket-manager</dt>
    <dd>v1.14.1</dd>
    <dt>言語</dt>
    <dd>PHP v8.2.4（v8.1.0以降）</dd>
</dl>


# 外観の融合

「いかずちの杖」と「はかいのつるぎ」のそれぞれのアイテムを、メインハンド／オフハンドのどちらに持たせてもアイテムが重なって見えるようにジオメトリを多少調整しています。

おそらく重なっているせいだとは思いますが、表面が電波障害にあっているようなノイズのように見えますが、それはそれでエネルギーを充填しているようにも見えるので、ある意味エフェクトだと思っていますｗ

以下はメインハンドに持たせるアイテム別のインベントリイメージです。

<br />
▼メインハンドが「いかずちの杖」

![メインハンドが「いかずちの杖」](https://socket-manager.github.io/document/minecraft-contents/img/item-fusion/thunder-rod-inventry.png "メインハンドが「いかずちの杖」")

<br />
▼メインハンドが「はかいのつるぎ」

![メインハンドが「はかいのつるぎ」](https://socket-manager.github.io/document/minecraft-contents/img/item-fusion/explode-sword-inventry.png "メインハンドが「はかいのつるぎ」")


# 発射する攻撃の融合

メインハンドにどちらのアイテムを持たせていても攻撃の内容は同じです。

以下の画面で「いかずちの杖」の落雷と「はかいのつるぎ」の爆撃が同時に発動しているのがわかると思います。

<br />
▼一人称

![一人称](https://socket-manager.github.io/document/minecraft-contents/img/item-fusion/fusion-first.gif "一人称")

ちなみに一人称の画面ではウインドウの幅に応じて見え方が異なる事があります。

例えば以下のようにアイテムスロットが小さくなるほど幅を狭くすると、アイテム同士が分離して隣り合わせたような見た目になります。

![横並びの見た目](https://socket-manager.github.io/document/minecraft-contents/img/item-fusion/narrow-first.png "横並びの見た目")

<br />
▼横から見た場合

![横から見た場合](https://socket-manager.github.io/document/minecraft-contents/img/item-fusion/fusion-side.gif "横から見た場合")

<br />
▼上から見下ろした場合<br />

![上から見下ろした場合](https://socket-manager.github.io/document/minecraft-contents/img/item-fusion/fusion-upside.gif "上から見下ろした場合")

---

実装は至ってシンプルです。
「いかずちの杖」と「はかいのつるぎ」のアイテムには元々お互いの処理を実装していて、メインハンド／オフハンド共に今回の２つのアイテムで埋まっている場合には、どちらの処理も同時に走らせています。


# おわりに

オフハンドの装備を外せば、メインハンドに装備しているアイテムは元通り使えます。

今回のように融合させた使い方でも「召雷の魔石」のエンティティプロパティの実装時と同じようにネットショップに接続中は攻撃が発動しないようにしています。

https://qiita.com/glasses_seven/items/e58ec2ceaf2850461965/

https://qiita.com/glasses_seven/items/5553772d3fa8edd09cc0/

https://qiita.com/glasses_seven/items/e77bfb43baf55e35680b/

また、「はかいのつるぎ」の実装時と同様に丸腰状態で使うとかなりのダメージを受ける事になるので、発射から数秒間の間は無敵状態にしています。
和歌山発！Next.js × Supabase で万葉集タイピングゲームを作ってみた！目指せ伝説の６鶴(6000点)！



## はじめに
はじめまして、Ryusei Tagashira(@nanimiru)です。
Next.js × Supabase × vercel でおしゃれなタイピングゲームを爆速でデプロイしました。

まずはプレイしてみてください！

https://manyo-typing.com/

プレイ動画：

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Next.js × Supabase × vercelで万葉集を題材にしたタイピングゲームを爆速でデプロイしました。<br>ぜひ、プレーしてみてください！<a href="https://t.co/dyYmdxHEk9">https://t.co/dyYmdxHEk9</a> <a href="https://t.co/u2vnZH0A7Q">pic.twitter.com/u2vnZH0A7Q</a></p>&mdash; なにみる (@nanimiru_jp) <a href="https://twitter.com/nanimiru_jp/status/1888790610771095714?ref_src=twsrc%5Etfw">February 10, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 制作した経緯
和歌山に活動拠点を持つわたしは、和歌山にゆかりのある「万葉集」を題材にしたタイピングゲームを作ることで、地方の若者にプログラミングやパソコン操作に興味を持ってもらいたいと思い立ちました。

ただし、よくある古臭いタイピングゲームにはしたくなく、新しい技術スタックを活用して、アニメーションやサウンドなどの演出にもこだわりました。

ゆくゆくは和歌山市内の学校教育で活用されることを目標とし、一緒に開発するワークショップも企画したいと考えています！

## タイピングゲームの内容について
万葉集を題材にしたタイピングゲームで、60秒間の制限時間内でスコアを競います！

https://manyo-typing.com/how-to-play
### ポイント

- 連続タイプで秒数が追加！
- オレンジ色のゲージが溜まると、制限時間が延長されます

- 1000点ごとに「鶴」が飛ぶ演出
- 最大6羽の鶴を飛ばせますが、筆者も未だ達成できず！（笑）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675673/4f9559bd-2706-4163-f3eb-ebae051c1bfb.png)

### ランキング機能
- ベストスコアを記録して、他のユーザーと競いましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006880/7a8502d1-7c7e-3e7c-5846-41cddc903eac.png)

いいスコアが出たときは、ランキングへの登録をお忘れなく！

## 技術スタック
- Next.js App Router
    - 柔軟なページ管理とサーバーサイドレンダリングでパフォーマンスを確保
- TypeScript
    - 型安全を確保し、開発の生産性とメンテナンス性を向上
- Tailwind CSS
    - シンプルで直感的なスタイリングを実現
- Supabase（データベース）
    - ユーザー情報やランキングデータの保存に使用。リアルタイムなデータ処理が便利
- Vercel（デプロイ）
    - 簡単かつ高速にデプロイし、無料プランでも高パフォーマンスを実現

なるべくシンプルでミニマルな構成を意識しつつ、パフォーマンスは落とさない構成を目指しました。

## 終わりに
今回は、Next.js × Supabase を使って和歌山の万葉集を題材にしたタイピングゲームを作成した話をご紹介しました。

ぜひ、最高スコアを目指してプレイしてみてください！6羽の鶴を飛ばせる猛者は現れるのでしょうか…？

https://manyo-typing.com/

また授業などでご活用いただける学校関係者の方がいらっしゃいましたら、学内用ランキング（学級クラス別など）を用意いたしますので admin@nanimiru.jp までご連絡いただけますと幸いです。
【React】中に <div> を入れられる <p> っぽいタグを自作する

# 注意

※そもそも `<p>` の中に `<div>` を入れる必要があるかというと普通はあまりないかと思いますので、どうしてもコンポーネントを自作しなければいけないという場合以外は `<div>` タグに `marginBottom: 1rem` や `marginTop: 1rem` を CSS で指定しましょう。

Bootstrap を使う場合はこんな感じです。

```jsx
<div className="mb-3">
  余白のあるテキスト
</div>
```

https://getbootstrap.jp/docs/5.3/utilities/spacing/

## 中に &lt;div&gt; を入れられる &lt;p&gt; タグっぽい見た目のコンポーネントを自作する

&lt;p&gt; の中に &lt;div&gt; を入れようとすると以下のようなエラーになってしまいます。

```c
Warning: validateDOMNesting(...): <div> cannot appear as a descendant of <p>
```

しかし、div なんていうのは React のあらゆるところで使われていて、これは p タグが使えないと言うのとほとんど変わりません。（もちろん、使わなければ良いのですが。）

では、中に &lt;div&gt; を入れられる &lt;p&gt; タグを作るにはどうすれば良いでしょうか。要するに margin-bottom が 1rem のブロック要素を作れば良いだけの話です。

```tsx:src/components/P.tsx
interface Props extends React.HTMLAttributes<HTMLDivElement> {
  // some other props
}

// <p> タグの代わりの <P> コンポーネント
export default function P({ children, style, ...props }: Props):
  // style に marginBottom を追加する。
  // ただし、marginBottom が既に指定されていた場合は上書きしない。
  // また、style が undefined の場合は何も起きない。
  const styleWithMarginBottom = { marginBottom: '1rem', ...style };

  // children は div の子要素として渡す。
  // 残りの props は div タグにそのまま渡す。
  return (
    <div style={styleWithMarginBottom} {...props}>
      {children}
    </div>
  );
}
```

```tsx:src/main.tsx
<P>
  <div>Hello!</div>
</P>
```

これで入れられるようになりました。多分バッドプラクティスだと思うので会社では真似しないでください :-P

## 直接 style= 指定することを避けたい場合

直接 style= でスタイルを指定することを避けたい場合は、style を className に置き換えてください。ただし、CSS 適用の優先順位に注意してください。

## 参考

props の型には React.HTMLAttributes や ComponentProps を使用してください。

> React.ComponentPropsを使ったコンポーネントの Props 設計
> https://zenn.dev/tm35/articles/4bc94d7e6cb314
SCSSについて

Webデザインとフロントエンド開発において、スタイルシートは欠かせない要素である。その中でも、CSS（Cascading Style Sheets）は標準的なスタイルシート言語として広く採用されている。しかし、CSSには幾つかの欠点があり、その解決策としてSCSSが登場した。ここでは、CSSの欠点、SCSSの特徴と利点について解説する。
# CSSとSCSSの違い
まず、CSSとSCSSについてだが、Webページのスタイルを定義するものとして共通だが、SCSSはCSSの拡張であり、変数、ネスト、ミックスインなどの機能を備えている点が異なる。これにより、スタイルの管理がしやすくなり、再利用性や保守性が向上する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935725/ab92428e-8034-4559-9929-7cb90fd499c7.png)

# CSSの欠点とSCSSによる改善

### 繰り返しコード
CSSでは、同じスタイルを複数のセレクタに適用する場合、それぞれのセレクタに対して同じプロパティを繰り返し定義する必要がある。
例えば、以下のように記述する。
``` sample1.css
.header {
  font-size: 16px;
  color: #333;
}

.footer {
  font-size: 16px;
  color: #333;
}
```
例えばヘッダ、フッダのフォントサイズを変更する場合、このような繰り返しコード(同じ値の`font-size`、`color`が複数回定義されている)では変更箇所が定義数分になり、手間がかかりることになる。
下記のコードのようにSCSSではmixinを使用することで繰り返しをなくすことができる。
``` sample1.scss
@mixin common-styles {
  font-size: 16px; /* ここを変更するだけでよい */
  color: #333;
}

.header {
  @include common-styles;
}

.footer {
  @include common-styles;
}
```



### カスケーディングの複雑さ
カスケーディングとは、ある要素のあるプロパティに対する宣言が複数あるとき，宣言の強さの関係を定めて，うち 1 つの宣言だけが有効になるようにする仕組みである。
CSSのカスケーディングの仕組みは、スタイルの優先順位を理解しにくくし、意図しないスタイル適用の原因となることがあります。以下に、カスケーディングがどのように機能するのかを示す例を紹介します。
``` sample2.css
.button {
  color: white;
  background-color: blue;
  padding: 10px;
}

.button-primary {
  background-color: red;
}
```
上記の CSS コードでは、`.button` と `.button-primary` が独立したクラスとして定義されている。これにより、スタイルの優先順位が分かりづらくなったり、異なるスタイルファイルで定義されている場合に影響範囲を把握しづらくなったりする可能性がある。

``` ssample2.scss
.button {
  color: white;
  background-color: blue;
  padding: 10px;

  &-primary {
    background-color: red;
  }
}
```
SCSS のネスト構造を利用することで、`.button-primary` が `.button` に関連する修飾クラスであることが明示され、コードの可読性が向上する。

### 変数や関数が未対応
CSSでは変数や関数を使用することができず、同じ値を複数箇所で使用する場合は、手動で入力する必要がある。
``` Sample3.css
/* カラーコードを何度も記述する必要がある */
.button {
  background-color: #007bff;
  color: white;
  padding: 10px;
}

.alert {
  background-color: #007bff; /* 再度同じカラーを記述 */
  color: white;
  padding: 15px;
}
```
このコードでは、`#007bff` というカラーコードをボタンとアラートの両方で使っている。カラーを変更したい場合、その部分をすべて探して変更しなければならない。下記のコードのようにSCSSではその問題を解消できる。
``` sample.scss
$primary-color: #007bff;

.button {
  background-color: $primary-color;
  color: white;
  padding: 10px;
}

.alert {
  background-color: $primary-color; /* 再利用できる */
  color: white;
  padding: 15px;
}

```
さらに、関数を使って値を計算することもできない。たとえば、サイズを倍にしたい場合、CSSでは以下のように記述する必要がある。
``` sample4.css
.button {
  width: 100px; /* ここで明示的に記述 */
  height: 50px;
}

.button-large {
  width: 200px; /* 手動で計算する必要がある */
  height: 100px;
}
```
この例では、button-large を作る際に、サイズを2倍にするために手動で値を変更しているため、管理が煩雑になり、修正時の手間が増えてしまう。下記のコードのようにSCSSではその問題を解消できる。
``` sample4.scss
$value: 100px;

.button {
  width: $value;
  height: $value;
}

.button-large {
  width: $value * 2; /* 倍の値を簡単に計算 */
  height: $value; 
}

```
### まとめ
CSSはWebデザインやフロントエンド開発において広く使われているが、繰り返しコードやカスケーディングの複雑さ、変数や関数の未対応といった欠点がある。これに対して、SCSS（Sassの拡張版）は、mixinやネスト機能、変数および関数を利用することで、スタイルシートの保守性や可読性を大幅に向上させる。これにより、重複を避けつつ、スタイルの管理とデバッグが容易になり、開発効率が向上する。CSSの限界を補完するSCSSは、現代のWeb開発において非常に重要なツールとなっている。