OmniAICreator/Qiita-1.07M huggingface dataset:
🐬HTTPが危険って言われるのはなんでだっけぇ？

![Frame 404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982981/9ab24b56-8f76-4d94-a0a8-784a373d5bf3.png)


# HTTPSとは？

インターネット上で情報をやり取りする際、**[HTTP](/docs/engineer/http/about)** は大活躍ですが、実は**安全性**においては課題があります。そこで登場するのが **HTTPS** です。

HTTPSは、HTTPを暗号化技術を用いて **安全にデータをやり取りできるようにした** ものです。

:::note warn 会話ブロック

🐬「暗号化かぁ... セキュリティの話って難しそぉ...」

🐚「大丈夫、HTTPSはHTTPの上に安全なカギをかけたバージョンだと思ってくれればOKです！」

:::

## HTTPは安全ではないのか？

HTTPは、インターネット上で情報をやり取りするためのプロトコルですが、**安全性に課題**があります。

### 平文での通信

**HTTP** では、データが**暗号化されずに平文**（そのままの状態）で送信されます。

つまり、ネットワーク上を流れる情報を第三者が盗み見ることが可能です。

Webサイトでのログイン情報やクレジットカード情報が平文で送信されると、情報が盗まれるリスクがあります。

![スクリーンショット 2025-02-21 16.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982981/ac5d20bd-748d-465e-82f8-e516d52f1c4b.png)

### なりすましの可能性

HTTPでは、通信相手が本物かどうかを**確認する手段が弱い**ため、攻撃者がなりすましをして情報を盗み出すリスクがあります。

### 改ざんの危険性

通信途中で誰かがデータを**改ざん**するリスクもあります。


例えば、悪意のある攻撃者が、あなたが受け取るべき情報を勝手に変更してしまう可能性があるのです。

![スクリーンショット 2025-02-21 16.20.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982981/59c2f957-a7c8-4385-bc11-4ab0f6f429d2.png)



## HTTPSはどう安全にしているのか

**HTTPS**（**H**yper**t**ext **T**ransfer **P**rotocol **S**ecure）は、HTTPに **TLS**（**T**ransport **L**ayer **S**ecurity）という暗号化プロトコル暗号化技術を組み合わせることで、 **通信をより安全に行えるようにしたプロトコル** です。

具体的には、通信内容が**暗号化**されることで、第三者が途中でデータを読み取ったり改ざんしたりするリスクを低減しています。

HTTPSが通信内容を守るために行っている主な取り組みを見ていきましょう。


### 認証（Authentication）

**認証**により、通信相手が本当に**正しいサーバー**であるかを確認します。

サーバーは**デジタル証明書**を提示し、クライアントはその証明書を検証します。

:::note warn 会話ブロック
🐬「つまり、HTTPSでは『このサーバーは本物です！』と証明書で証明しているんだねぇ」

🐚「その通り！偽のサーバーとのやり取りを未然に防げるんですっ」
:::

### 暗号化（Encryption）

HTTPSでは、通信内容が**暗号化**されるため、途中でデータを盗み見られても内容を解読されにくい仕組みになっています。

**公開鍵暗号方式**や**共通鍵暗号方式**を利用し、データが安全に送受信されます。

### 完全性（Integrity）

**完全性**の仕組みにより、通信中にデータが**改ざん**されていないかをチェックします。

ハッシュ値やデジタル署名を利用して、受信したデータが送信時と同じであることを確認します。

:::note warn 会話ブロック

🐬「HTTPSって名前に『Secure』がついているから、何でも安全に守ってくれると思ってたぁ…」

🐚「そういう誤解は禁物ですよ！HTTPSは『 **暗号化技術を用いて通信内容を保護する仕組み** 』であって、絶対安全を保証するものではないんですっ」

:::

![スクリーンショット 2025-02-21 16.22.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982981/39624c79-3585-4092-a93a-1cdb7798085b.png)



## まとめ

HTTPSは、HTTPの**平文通信**や**改ざん、なりすまし**といった脆弱性を解決するための技術です。

- **認証**により、通信相手が本物かどうかを確認
- **暗号化**により、通信内容を秘匿
- **完全性**により、データが改ざんされていないことを保証

これらの仕組みによって、私たちは安心してWebサービスを利用できるようになります。

:::tip ポイント
- **HTTP**は便利ですが、**安全性に課題**があります。
- **HTTPS**は、認証・暗号化・完全性の3本柱でこれらの課題を解決しています。
- オンライン取引や個人情報の送信時には、**HTTPSの利用**が必須です！
:::
個人的備忘録：「migrate_app && server」は危険？Docker起動のベストプラクティスを考察してみた

## はじめに

この問題について考えたきっかけは、Golang を用いたマイクロサービスの開発中に、コンテナが再起動するたびにマイグレーションが実行され、意図しないデータの変更やアプリケーションの起動遅延が発生したことでした。

特に、破壊的変更を含むマイグレーションが誤って適用されるリスクがあることが問題となりました。

## 現在の Dockerfile の問題点

以下の Dockerfile では、コンテナ起動時に必ず `migrate_app` が実行される設定になっています。

```dockerfile
CMD ["/bin/sh", "-c", "/app/migrate_app && /app/server"]
```

この設定では、アプリケーションが起動するたびにマイグレーションが実行されるため、以下の問題が発生する可能性があります。

### 問題点
1. **すでに適用済みのマイグレーションが再適用される**  
   `migrate_app` が idempotent（冪等性を持つ、つまり何度実行しても影響がない）でない場合、データベースの整合性が崩れる可能性があります。
   - 例えば、`CREATE TABLE` を含むマイグレーションを毎回実行すると、テーブルの重複エラーが発生します。

2. **アプリケーションの起動が遅くなる**  
   - 毎回マイグレーションを適用することで、不要な処理が発生し、アプリケーションの起動時間が長くなります。

3. **マイグレーション中にエラーが発生し、アプリケーションが起動しない**  
   - `migrate_app` が失敗すると `server` が起動しないため、コンテナが正しく動作しなくなるリスクがあります。

4. **破壊的変更のリスク**  
   - スキーマ変更がある場合、既存データが失われる可能性があります。
   - `DROP COLUMN` や `ALTER TABLE` でカラムの変更があると、古いバージョンのアプリが動作しなくなることがあります。
   - データ移行が適切に行われないと、アプリケーションの互換性が損なわれる恐れがあります。

## 方法: マイグレーションを手動で適用する
アプリケーションのデプロイ前に**手動でマイグレーションを適用**し、コンテナ起動時には `server` だけを実行する方法です。

**変更後の Dockerfile**

```Dockerfile
CMD ["/app/server"]
```

この場合、デプロイのフローにマイグレーション処理を組み込み、データベースの更新が必要な場合のみ実行します。

## まとめ

- `migrate_app` を idempotent にするのが最も簡単な解決策。
- マイグレーションを手動適用する場合、コンテナ起動時には `server` だけを実行する。
- エントリポイントスクリプトを使うことで、マイグレーションの実行可否を制御できる。
- 破壊的変更がある場合、適用前にバックアップを取り、段階的なリリースを検討する。

アプリケーションの要件に応じて、適切な方法を選択することが大事だと思いました！
個人的備忘録：GitHub Actions × Dockerで実践するGoプロジェクトの構成について記事としてまとめてみた

## **はじめに**
このドキュメントでは、プロジェクトのディレクトリ構成と各ファイル・フォルダの役割について説明します。

:::note warn
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

プロジェクトを理解しやすくし、スムーズに開発を進めるためのガイドラインとして活用してください。

## **書こうと思ったきっかけ**
このプロジェクトにはさまざまなディレクトリとファイルが含まれており、それぞれの役割を明確にすることで、新しく参加する開発者やチーム内のメンバーがより簡単にコードベースを理解できるようにするためです。

**実際のリポジトリ**

https://github.com/free-honda/skill-typing-back

## **ディレクトリ / ファイルの概要**

### **1. CI/CD 関連**
#### `.github/workflows/`  
GitHub Actions の設定ファイルを管理するディレクトリ。CI/CD（継続的インテグレーション・デリバリー）の設定を記述し、テストやデプロイの自動化を行う。

### **2. 認証・データベース関連**
#### `auth/`  
認証関連のロジックを管理。ユーザーのログイン・ログアウト処理や JWT（JSON Web Token）の管理などが含まれる。

#### `db/`  
データベースの操作に関する処理を管理。DB接続やクエリ実行のヘルパー関数を実装する。

#### `migrate/`  
データベースのマイグレーションスクリプトを格納。スキーマの変更や初期データの投入などを行う。

#### `model/`  
データベースのモデル定義を格納。各テーブルの構造を Go の Struct で定義し、ORM（Object-Relational Mapping）として利用する。

#### `repository/`  
データベースアクセスのリポジトリパターンを実装。DBとのやり取りを統一し、コードの可読性を向上させる。

### **3. API・ルーティング関連**
#### `handler/`  
API のエンドポイント処理を実装。各ルートのリクエストを受け取り、データの取得・加工・レスポンスを返す。

#### `router/`  
ルーティング設定を管理。エンドポイントごとに適切な `handler` を紐づける。

### **4. 設定・構成ファイル**
#### `.air.toml`  
`air` のホットリロード設定ファイル。開発時にコードの変更を検知し、自動でサーバーをリロードするために使用。

#### `.gitignore`  
Git の無視ファイルリスト。不要なファイル（`node_modules`、`env` ファイル、ログファイルなど）を Git 管理から除外するために使用。

#### `Dockerfile.dev`  
開発環境用の Dockerfile。開発時に必要な依存関係を含めたコンテナイメージを作成する。

#### `Dockerfile.prod`  
本番環境用の Dockerfile。軽量でセキュアな本番用コンテナイメージを作成する。

#### `docker-compose.yml`  
Docker のコンテナ構成を定義するファイル。複数のサービス（アプリ、DB、キャッシュなど）を一括で管理できる。

#### `Makefile`  
`make` コマンドを使用してビルド・実行を自動化する設定。`make run` などのコマンドで簡単に開発環境を構築可能。

### **5. Go 言語関連**
#### `go.mod`  
Go モジュール管理ファイル。プロジェクトの依存関係を管理し、適切なバージョンのパッケージを使用できるようにする。

#### `go.sum`  
Go の依存関係をロックするファイル。プロジェクトの再現性を確保するために使用。

#### `server.go`  
アプリケーションのメインエントリーポイント。サーバーの起動、ルーティングの設定、ミドルウェアの設定などを実装。

### **6. その他**
#### `phpmyadmin/sessions/`  
phpMyAdmin のセッション管理を行うディレクトリ（詳細不明）。

#### `skill-typing-back/`  
作成したアプリケーションのディレクトリ。バックエンドのロジックや設定を含む可能性がある。

#### `README.md`  
プロジェクトの概要、セットアップ手順、使用方法を記載。新しくプロジェクトに参加する開発者向けの情報を提供。

## **まとめ**
このプロジェクトは、**Go 言語を使用した Web アプリケーション** であり、**Docker を活用したコンテナ環境** を構築し、**GitHub Actions で CI/CD を実現** する構成になっています。

- **バックエンド開発** → `auth/`, `handler/`, `repository/`, `server.go`
- **データベース関連** → `db/`, `migrate/`, `model/`
- **設定・CI/CD** → `.github/workflows/`, `.air.toml`, `Dockerfile.prod`, `docker-compose.yml`
- **開発環境** → `Dockerfile.dev`, `Makefile`

***この構成を理解することで、プロジェクトに貢献しやすくなります。***

本ドキュメントを参考にしながら、各ファイルの役割を把握し、効率的に開発を進めてください。
【SwiftUI】長押しを認識する

# はじめに
SwiftUIの.gestureを使用して、ユーザーの長押しを認識する方法と、実用的な使い方として**コンテキストメニュー**について学習したので、備忘録として残します。

---
## 環境
【Xcode】16.2
【iOS】18.2
【macOS】Sequoia 15.3.1

---

## ポイント

.onLongPressGestureを適用することで長押しを認識。
画像やテキストなど、ほとんどのビューに適用可能。
.contextMenuを適用することで、長押しすると出てくるメニュー（コンテキストメニュー）を実装できる。

---
## .onLongPressGestureで長押しを認識する
![スクリーンショット 2025-02-22 6.14.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/ba286888-eb39-478c-8652-11f89d09c375.png)

`Circle()`に`.onLongPressGesture`というモディファイアを適用することで、長押しを認識する機能を実装しています。
この例では、円を長押しすると色が赤色から緑色に変わるようにしています。

---
## コンテキストメニューを実装する
![スクリーンショット 2025-02-22 6.24.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/f3c0adb7-8a85-4044-acea-3de7fee6a7c7.png)

続いて、要素を長押しすると出てくるメニューであるコンテキストメニューの実装方法です。
コンテキストメニューは`.contextMenu`というモディファイアを適用することで実装できます。
この例では、 "Hello, World!" を長押ししたら "意味" と "読み方" のボタンが表示され、それぞれタップすると "こんにちは、世界" や "ハロー、ワールド" というテキストが "Hello, World!" の下に表示されます。
個人的備忘録：AWS ECS でのデータベースマイグレーション方法を ChatGPT との会話をもとに整理してみた

## はじめに
AWS ECS 上でデータベースのマイグレーションを実行する際、どの方法を選択するべきかを自分なりに解説します。

:::note warn
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

## 書こうと思ったきっかけ
ECS 上でのデータベースマイグレーションの実行方法には複数の選択肢があり、どの方法を採用するべきか迷うことが多いと感じました。

運用の手間や自動化の観点から、最適な方法を整理し、選択しやすい形でまとめることが重要だと考えました。

## マイグレーションを実行する3つの方法（自分調べ）

### 方法 1: `migrate_app` をコンテナに追加（自分調べ）
#### 概要
`migrate.go` をビルドして `migrate_app` というバイナリを作成し、コンテナに含める方法です。

#### メリット
- 手動実行も自動実行も可能 
- `aws ecs execute-command` で簡単に実行できる
- 継続的にマイグレーションが必要な場合に便利

#### デメリット
- コンテナサイズが少し増える（マイグレーション用のバイナリが含まれるため）

#### おすすめなケース
- ECS のコンテナを再起動するだけでマイグレーションを適用したい場合
- 本番運用を考慮し、手動・自動の両方の方法を取りたい場合

---

### 方法 2: `aws ecs execute-command` を使う（自分調べ）
#### 概要
ECS Exec を使用し、実行中のコンテナに入って手動で `migrate.go` を実行する方法です。

#### メリット
- Dockerfile を変更せずにマイグレーションが可能
- 変更不要で試しやすい
- 一時的なマイグレーション作業に適している

#### デメリット
- 毎回手動で `aws ecs execute-command` を実行する必要がある
- 自動化されないため、継続的な運用には向かない

#### おすすめなケース
- 短期間で数回だけマイグレーションを実行したい場合
- 現在のコンテナ環境を変更したくない場合

---

### 方法 3: `ENTRYPOINT` に `migrate_app` を追加（自分調べ）
#### 概要
コンテナ起動時に自動で `migrate_app` を実行するように `ENTRYPOINT` を設定する方法です。

#### メリット
- マイグレーションが完全自動化される
- `migrate_app` を実行し忘れる心配がない
- CI/CD との統合がしやすい

#### デメリット
- マイグレーションに失敗するとアプリが起動しない
- アプリ起動前にマイグレーションが必要ない場合でも実行されてしまう

#### おすすめなケース
- 環境ごとにマイグレーションの状態を管理したくない場合
- CI/CD で自動化したい場合

---

## どの方法を選ぶべきか？（自分調べ）
| 方法 | メリット | デメリット |
|------|--------|------------|
| **方法 1: `migrate_app` を追加** | 手動でも自動でも実行可能 | コンテナサイズが少し増える |
| **方法 2: `aws ecs execute-command` を使う** | 変更不要で簡単に実行可能 | 毎回手動で実行する必要がある |
| **方法 3: `ENTRYPOINT` に `migrate_app` を追加** | 自動でマイグレーションされる | アプリ起動時にエラーがあるとコンテナが落ちる |

### おすすめの選択肢
- **運用がシンプルな方法 1 (`migrate_app` をビルドしてコンテナに含める)**
- **試しにすぐ実行するなら 方法 2 (手動で `migrate_app` を実行)**
- **完全自動化したいなら 方法 3 (`ENTRYPOINT` でマイグレーションを実行)**

### 最もバランスの取れた方法
まずは **方法 1 (`migrate_app` をビルド・デプロイし、ECS Exec で手動実行)** するのがベストです。  
それで問題なければ、方法 3 に移行すると、マイグレーションの実行を完全に自動化できます。

# まとめ（自分調べ）
ECS 上でのマイグレーション実行方法は、大きく3つのアプローチに分かれます。どの方法を選ぶかは、運用のしやすさや、どこまで自動化するかによって決まります。

- **方法 1 (`migrate_app` を追加)** が最もバランスが取れていて、手動と自動の両方に対応できる。
- **方法 2 (`aws ecs execute-command`)** は手軽に試せるが、継続的な運用には不向き。
- **方法 3 (`ENTRYPOINT` に `migrate_app` を追加)** は完全自動化ができるが、エラー時の対応が難しくなる。

まずは **方法 1 を導入して様子を見つつ、最適な方法を選択する** ことをおすすめします。
個人的備忘録：ECS コンテナで "go: not found" が発生したときの対処法と、実際にインストールしてみた

## はじめに

ECS を運用していると、コンテナ内で Go コマンドが見つからない (`go: not found`) という問題に直面することがあります。

本記事では、その原因と解決方法を詳しく解説します。

:::note warn
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

## 書こうと思ったきっかけ

最近、ECS 上で Go を用いたアプリケーションのマイグレーションを行おうとした際に、`go` コマンドが実行できず困った経験がありました。

その過程で、ECS 内で Go を使用する際のベストプラクティスを学びました。

***同じ問題で悩む方の参考になればと思い、本記事を投稿しました。***

## ECS コンテナ内で `go` が見つからない場合の解決方法

ECS のコンテナ内で `go` コマンドが見つからない (`go: not found`) 場合、以下のいずれかが原因です。

- コンテナに Go がインストールされていない
- Go のパスが `PATH` に含まれていない
- ECS のコンテナイメージが golang ベースではなく、Go 実行環境を含んでいない

## 解決策

### ① コンテナに Go がインストールされているか確認

まず、以下のコマンドで Go がインストールされているか確認します。

```sh
ls /usr/local/go/bin
```

もし `go` というファイルが存在しない場合、Go がコンテナに入っていません。

### ② コンテナに Go をインストール

#### Alpine Linux ベースの場合

```sh
apk add --no-cache go
```

#### Debian / Ubuntu ベースの場合

```sh
apt update && apt install -y golang
```

Go をインストール後、バージョンを確認：

```sh
go version
```

### ③ Go の `PATH` を修正

もし `go` が `/usr/local/go/bin/go` にある場合、`PATH` に追加してください。

```sh
export PATH=$PATH:/usr/local/go/bin
```

その後、再度 `go version` を確認：

```sh
go version
```

### ④ Go を含む Docker イメージを使用

本番環境や ECS では、`go run` を使わず、事前に Go バイナリをビルドしてデプロイするのが一般的です。

#### ローカルで Go バイナリをビルド

ECS のコンテナで `go` を直接実行しないように、事前に Go バイナリを作成し、それをデプロイします。

```sh
GOOS=linux GOARCH=amd64 go build -o migrate_app migrate/migrate.go
```

#### Dockerfile を修正

以下のように Go のビルドステージを追加し、ECS でバイナリを実行できるようにします。

```dockerfile
# Go を使ってビルド
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o migrate_app migrate/migrate.go

# 軽量なコンテナにバイナリのみコピー
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/migrate_app .
ENTRYPOINT ["/app/migrate_app"]
```

### ⑤ `go run` を使わずに ECS でマイグレーション

上記の Dockerfile でイメージを ECS にデプロイした後、以下のコマンドで ECS 内で実行します。

```sh
aws ecs execute-command \
  --cluster my-ecs-cluster \
  --task <TASK_ID> \
  --container my-app-repo \
  --interactive \
  --command "/app/migrate_app"
```

もしくは、ECS タスクの `command` を変更し、直接 `migrate_app` を実行するように設定することも可能です。

## まとめ

`ls /usr/local/go/bin` で Go があるか確認  
`apk add go` や `apt install golang` で Go をインストール  
`export PATH=$PATH:/usr/local/go/bin` で `PATH` を修正  
`go build -o migrate_app migrate/migrate.go` でバイナリを作成し ECS で実行  

ECS では Go を直接インストールするより、事前にビルドしたバイナリをデプロイする方法が推奨されます！
個人的備忘録：ECS Exec を活用してコンテナに即アクセスするために、タスク ID を取得し、接続してみた

## はじめに

ECS Exec を活用すると、ECS のデプロイを変更することなく、手動でコンテナにアクセスし、さまざまな管理作業を実行できます。

本記事では、その手順を具体的に解説します。

:::note warn
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

## 書こうと思ったきっかけ

最近、ECS で運用されているアプリケーションのデバッグ作業を行う機会がありました。

:::note info
その際、ECS Exec を利用すればデプロイの手順を変更せずにコンテナ内に入れることを知り、非常に便利だと感じました。
:::

この経験を基に、ECS Exec を使ったコンテナ内での操作方法を共有したいと思い、本記事を執筆しました。

## ECS Exec を使ったコンテナ内での操作方法

### 1. 実行中の ECS タスク ID を取得

まず、現在実行中の ECS タスク ID を取得します。以下のコマンドを実行してください。

```sh
aws ecs list-tasks --cluster my-ecs-cluster
```

実行すると、以下のような JSON 形式のレスポンスが返ってきます。

```json
{
  "taskArns": [
    "arn:aws:ecs:ap-northeast-1:xxx"
  ]
}
```

この `taskArns` の値のうち、最後の部分にある `task-id`（例：`b75dd1e821c54fa3b25159d2d206e4c9`）を使用します。

### 2. コンテナ内に接続

次に、`aws ecs execute-command` を使用して ECS コンテナに接続します。

```sh
aws ecs execute-command \
  --cluster my-ecs-cluster \
  --task b75dd1e821c54fa3b25159d2d206e4c9 \
  --container my-app-repo \
  --interactive \
  --command "/bin/sh"
```

#### 補足

- `--container my-app-repo`：接続するコンテナ名（containerName の値）を指定します。
- `--command "/bin/sh"`：シェルを開くためのコマンドです。

このコマンドを実行すると、ECS コンテナのシェルに入ることができ、プロンプトが以下のように変わります。

```sh
sh-4.2#
```

これで、コンテナ内での操作が可能になります。

## まとめ

ECS Exec を利用すると、デプロイを変更することなく、簡単に ECS コンテナへアクセスし、直接操作することが可能になります。

本記事で紹介した手順を参考にすれば、トラブルシューティングやメンテナンス作業を効率的に行うことができます。

特に、緊急時のデバッグやデータベースの直接操作が必要な場合に役立つので、ぜひ活用してみてください。
【合格体験記】データサイエンス数学ストラテジスト上級に合格しました


## はじめに

こんにちは。今回は データサイエンス数学ストラテジスト上級 に合格したので、勉強方法や試験の感想を共有したいと思います。これから受験を考えている方の参考になれば幸いです。

## 受験のきっかけ

会社の資格報奨金支給対象に本資格があったため、受験を決めました。

## 受験前の知識レベル

私は数学科卒なので、数学の知識はある程度ありました。
また、現職はエンジニアのためAIやアルゴリズムの基礎知識はあるものの、データサイエンティストのような業務はしていません。
したがって、数学には馴染みがありましたが、データサイエンス特有の知識は多くは持っていない状態でした。

## 勉強方法

使用した教材:

- 公式テキスト（1周）
- 公式問題集（1周）

勉強時間:

- 合計20〜30時間 ほど

## 勉強していて難しかった点

学習前のイメージよりも数学の問題のレベルが高かったです。
公式ページのサンプル問題はとても簡単なのですが、実際の問題集にはテイラー展開やマクローリン展開など、やや面倒な問題もあり、不安を感じました。
とはいえ、全体的に極端に難しいものは少なく、理系卒であれば復習程度の感覚で学習できると思います。

## 試験当日を踏まえて

公式のテキストや問題集と同じような（あるいは完全一致の）問題が1〜2問ほど出題されました。
自信のある方以外は問題集を軽く確認する価値はあるかと思います。

また、思っていたよりも難しくはなかったですが、時間がかかる問題もあるため解く順番も気にしないといけないと思います。
私自身一部の問題は解くのを諦めました。

## 試験結果

ギリギリではありますが、トリプルスターで合格できました。
![20250222_DS数学ストラテジスト上級バッチ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941133/ee9272a6-3539-4829-bb18-2a360b67a285.jpeg)

## これから受験する方へ

大学レベルの数学をまったく学んでいない方は苦労すると思います。
合格だけを目標とするのであれば、高校数学の復習&公式問題集でギリギリ合格するかと。

一方で、理系卒の方であれば、復習レベルの勉強でトリプルスターを目指せると思います。

それほど難しい資格ではないので、興味があればぜひ挑戦してみてください！
（それにエンジニア系の資格と比べると受験料が安いですし…）

## おわりに

以上、データサイエンス数学ストラテジスト上級の合格体験記 でした。
この資格に興味がある方や受験を考えている方の参考になれば幸いです！
個人的備忘録：ECS Exec を使ってコンテナ内で DB マイグレーションを行う方法をまとめてみた

## はじめに
ECS Exec を活用することで、ECS のデプロイを変更することなく、手動でコンテナ内に入りデータベースのマイグレーションを実行できます。

本記事では、その手順を詳しく解説します。

:::note warn
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

## 書こうと思ったきっかけ
最近、ECS で運用されているアプリケーションのデータベースマイグレーションを実施する機会がありました。

その際、デプロイの手順を変更せずに手軽に実施できる方法として ECS Exec を活用しました。

この経験を基に、ECS Exec を使った手動マイグレーションの方法を共有したいと思い、この記事を書きました。

## ECS Exec を使って手動マイグレーションを実行する手順

### 1. ECS Exec の事前設定
ECS Exec を利用して手動でマイグレーションを行うために、以下の事前設定を行います。

#### (1) ECS Exec が有効化されているか確認
ECS Exec を使用するには、タスク定義の `enableExecuteCommand` が `true` になっている必要があります。以下のコマンドで有効化できます。

**ECS サービスを更新する場合:**
```sh
aws ecs update-service --cluster your-cluster \
  --service your-service \
  --enable-execute-command
```

**タスク起動時に設定する場合:**
```sh
aws ecs run-task --cluster your-cluster \
  --task-definition your-task \
  --enable-execute-command
```

#### (2) 必要な IAM ポリシーを付与
ECS Exec を利用するには、IAM ロールに以下のポリシーを追加します。

```json
{
  "Effect": "Allow",
  "Action": [
    "ecs:ExecuteCommand",
    "ssm:StartSession",
    "ssm:SendCommand",
    "ssm:GetCommandInvocation"
  ],
  "Resource": "*"
}
```

### 2. 実行中の ECS タスクに接続
まず、現在実行中のコンテナを確認します。

```sh
aws ecs list-tasks --cluster your-cluster
```

**例:**
```json
{
  "taskArns": [
    "arn:aws:ecs:region:account-id:task/your-cluster/task-id"
  ]
}
```

この `task-id` を使用して、コンテナに接続します。

```sh
aws ecs execute-command \
  --cluster your-cluster \
  --task task-id \
  --container your-container-name \
  --interactive \
  --command "/bin/sh"
```

これで ECS コンテナのシェルに入ることができます。

### 3. コンテナ内でマイグレーションを実行
ECS コンテナ内で、アプリケーションに応じたマイグレーションコマンドを実行します。

#### Django（Python）
```sh
python manage.py migrate
```

#### Flask（Alembic）
```sh
flask db upgrade
```

#### Node.js（TypeORM / Sequelize）
```sh
npx sequelize-cli db:migrate  # Sequelize
typeorm migration:run  # TypeORM
```

### 4. 接続を終了
マイグレーションが完了したら、以下のコマンドでコンテナシェルを終了します。

```sh
exit
```

## まとめ
- **ECS Exec を有効化**
- **タスク一覧を取得し、実行中のコンテナを特定**
- `aws ecs execute-command` でコンテナに接続
- **マイグレーションコマンドを実行**
- **完了後に `exit` で終了**

この方法を使えば、ECS のデプロイを変更せずに簡単に手動でマイグレーションを実行できます！
Dockerとはどういったものなのか、めちゃくちゃ簡単に説明してみる

プログラミングの世界でよく聞く「Docker（ドッカー）」、なんだか難しそうですよね。でも、大丈夫！ 実は、Dockerは、例えるなら、とても便利な「魔法のお弁当箱」のようなものなんです。

**1. 普通のお弁当箱と、料理を作るキッチン**

まず、普通のお弁当箱を想像してみてください。

*   **お弁当箱:** ご飯、おかず、デザートなど、必要なものが全部入っていますね。
*   **キッチン:** お弁当箱の中身（料理）を作るところです。

プログラミングの世界では、

*   **お弁当箱:** あなたが作ったプログラム（Webサイトやアプリなど）
*   **キッチン:** プログラムを作るための、様々な道具や材料が揃った場所（パソコンの環境）

と考えることができます。

**2. キッチンの問題点 ～ 材料や道具が違うと…？**

あなたが、自分のキッチン（パソコン）で、一生懸命レシピ（プログラム）通りにお弁当（Webサイト）を作ったとします。

ところが、友達のキッチン（別のパソコン）で同じお弁当を作ろうとすると…

*   「あれ？ 同じ調味料がない！」
*   「使ってる包丁の種類が違う！」
*   「そもそも、コンロがIHじゃなくてガスだ！」

…なんてことが起こって、同じレシピなのに、同じお弁当が作れないことがあります。

プログラミングの世界でも、

*   **OSの違い:** Windows、macOS、Linuxなど、パソコンの基本ソフトが違う
*   **ライブラリのバージョンの違い:** プログラムが使う部品（ライブラリ）のバージョンが違う
*   **環境変数の違い:** パソコンの設定が違う

…といった理由で、「自分のパソコンでは動くのに、他のパソコンでは動かない！」という問題がよく起こります。

**3. 魔法のお弁当箱、Docker登場！**

そこで登場するのが、Dockerという「魔法のお弁当箱」です！

Dockerのお弁当箱は、

*   **中身:** ご飯、おかず（プログラム）だけでなく、調味料、包丁、コンロ（OSやライブラリなど、プログラムの実行に必要なもの全て）まで、全部セットで入っています！
*   **どこでも同じ味:** どんなキッチン（パソコン）でも、お弁当箱を開ければ、全く同じ環境で、同じ味のお弁当（プログラム）を再現できます！

**4. Dockerの仕組み ～ コンテナって？**

Dockerのお弁当箱の中身は、「コンテナ」と呼ばれています。

*   **コンテナ:** プログラムと、その実行に必要なものが全て詰め込まれた、独立した空間です。
*   **Docker Engine:** コンテナを作ったり、動かしたりするための、魔法の調理器具です。

コンテナは、他のコンテナや、パソコン本体の環境から隔離されているので、

*   他のプログラムに影響を与えない
*   セキュリティ的にも安心

というメリットもあります。

**5. Dockerを使うと、どんないいことがあるの？**

*   **環境構築が楽:** 新しいプロジェクトに参加する時、Dockerがあれば、面倒な環境構築は不要！ Dockerfile（お弁当箱のレシピ）を共有するだけで、すぐに開発を始められます。
*   **どこでも動く:** 自分のパソコンでも、サーバーでも、クラウドでも、どこでも同じようにプログラムを動かせます。
*   **バージョン管理が簡単:** プログラムのバージョンが変わっても、Dockerfileを更新するだけで、環境ごと簡単に切り替えられます。
*   **チーム開発がスムーズ:** チームメンバー全員が同じ環境で開発できるので、「私の環境では動かない…」というトラブルを防げます。

**6. まとめ ～ Dockerは、開発者の強い味方！**

Dockerは、プログラミング初心者にとって、少し難しい概念かもしれません。でも、「魔法のお弁当箱」というイメージで考えると、少しは親しみやすくなったのではないでしょうか？

Dockerを使いこなせるようになると、

*   環境構築の悩みから解放される
*   開発効率が大幅にアップする
*   チーム開発がもっと楽しくなる

など、たくさんのメリットがあります。ぜひ、Dockerを学んで、快適なプログラミングライフを送りましょう！

**補足:**

*   **Dockerfile:** コンテナの中身（環境）を定義するための、レシピのようなものです。
*   **Docker Hub:** 世界中の人が作ったDockerイメージ（コンテナの元となるデータ）を共有できる、巨大なレシピ集のようなものです。
*   **仮想マシンとの違い:** 仮想マシンは、パソコンの中に別のパソコンを丸ごと作るイメージですが、Dockerは、もっと軽量で、素早く起動できます。
YOLOv12 on Orin Nano with Jetpack6.2

# jetpack6.2 & install torch & yolov12
- YOLOv12がリリースされたみたいです．jetson orin nanoで試したいとおもいました．
- Jetpack6.1のときは[ここ](https://forums.developer.nvidia.com/t/pytorch-for-jetson/72048)と[ここ](https://docs.nvidia.com/deeplearning/frameworks/install-pytorch-jetson-platform/index.html)見ながらインストールしてたけど，6.2用のtorchがありません．
- デフォルトだと
    ```
    python3 
    Python 3.10.12 (main, Nov  6 2024, 20:22:13) [GCC 11.4.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import torch
    >>> torch.cuda.is_available()
    False
    ```


## Install torch
まずは環境を整えます．
- [Jetson orin nano super install pytorch](https://forums.developer.nvidia.com/t/jetson-orin-nano-super-install-pytorch/319884)
- [jp6/cu126 index](https://pypi.jetson-ai-lab.dev/jp6/cu126)
- https://qiita.com/Romihi/items/3c3e9ac7e4fe5b9adccc
    ```
    python3 
    Python 3.10.12 (main, Nov  6 2024, 20:22:13) [GCC 11.4.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import torch
    >>> torch.cuda.is_available()
    True
    ```
これでtorch, torchvisionがインストールできました．

## YOLOv12を動かす
- このエラーがずっと出てて治リませんでした．torchとtorchvisionのバージョンの違いが原因だったかもしれません．インストールし直したら治りました．
    ```
    RuntimeError: operator torchvision::nms does not exist
    ```
- せっかくjetsonなのでtensorrtを使います．modelの変換は
    ```
    model = YOLO("yolo12n.pt")
    # model = YOLO("yolov12n.pt") githubのreadme通りにyolov12nとするとだめ
    model.export(format="engine")
    ```
- 計算リソースはクロックを引き上げます．
    ```
    sudo jetson_clocks
    ```

## 他のバージョンと実行結果比較
- 信頼度しきい値0.3で実行
- 検出されるような物体は３つくらいの環境をcsi cameraから画像を取り込んで推論
- yolo11nでは約36imgs/s, 12と比べて精度低い，変なクラスが検出された，しきい値次第？
- yolo12nでは約30imgs/s, 11と比べて精度高い，しきい値次第？
- yolo12n-pose, segなどの学習済みモデルがなぜか使えない．
    - issue > https://github.com/ultralytics/ultralytics/issues/19352
    - そもそも学習済みモデルが公開されていないようです．
    - ultralyticsのyolo12のページにはサポートされていると書いていますが．


## 感想
これまでyolo11を使っていましたが，12が出たとのことで試しました．
これまでのコードを変えずにかんたんに試すことができました．
速度を取るなら11がいいかもしれません．

## To Do
- yolo12n-pose, segを試す
- trt以外のモデルでも実行できるようにする

## 参考リンク
- 論文，https://www.arxiv.org/abs/2502.12524
- YOLO12 -Ultralytics YOLO, https://docs.ultralytics.com/ja/models/yolo12/
- YOLOv12: Attention-Centric Real-Time Object Detectors, https://github.com/sunsmarterjie/yolov12
- 実装したコード，
30分記事(時間短縮15分)＜2025/02/21_02＞

# 1.はじめに
・この記事は記載者の自己満足による物です。
・30分で完全に切り上げるために、完全に途中で切れても終わります！笑
（このはじめにを書くのは毎回テンプレとし、このコピペの時間帯は時間に入れないものとする。）
・間違えている可能性あり！！！あまりこの記事信用しないほうがいい気がする！笑

# 2.なんで始めようと思ったか？
・「時間がないから記事が書けない」を言い訳に書いていなかった自分を律するため
・「意味もない記事でもいいから30分で書いて、書く練習をしてみよう！そうすりゃアウトプットにもなる」と思ったため。

# 内容がなくともとにかく書こう。
・いいんですよ。中身すっからかんでも。練習になりゃぁ。

ってことで2025/2/19からスタート！！

# 30分アウトプット開始　＞　今回夜も遅いので15分にします。

2/20分を21として書いてしまいましたが、コレが本当の２１日分ですｗ

カリキュラムのRailsの応用でみんなが詰まると言われるところに来ました。
実際に、2025/02/05 17:10から開始となってるけど、中間試験をとにかく終わらせようとして時間がかかってただけなんだよなぁ。

ということで、中間は１６日に終わったので1週間ほど？で終わったのかな？（やべえ遅い。）

今回はその振り返り。
夜遅くになったのも、終わったと思いきやプルリクで全力突っぱねを喰らい、全力で修正してました。

ひとまず言えること。
「RSpecってbinding.pryでデバッグできたんだ。笑」

そしてその時にenumの設定がRSpecと実際に設定しているやつが異なったことにより
詳細画面の一部が消失。笑

「全部システムできたよね！？なんで君は表示されないの！！？」とかずっと喋ってましたｗ
あまりにもわからなさすぎるので、チャットGPTに聞いたところ
レコードがあるかどうか確認。との言われて確認コードを打ったところ
```

[4] pry(#<RSpec::ExampleGroups::AdminArticles::Nested::Nested>)> Article.find_by(uuid: future_article.uuid)
ArgumentError: 'publish_wait' is not a valid state


結果
このエラーは、:publish_wait という状態 (state) が モデルの状態として認識されていない ことが原因です。

1. state のバリデーションを確認
state には State Machine (AASM など) や Enum を使っている 可能性があります。
publish_wait が定義されていないか、違う記述になっていないか確認してください。
例えば、article.rb に以下のような Enum 定義がある場合：

class Article < ApplicationRecord
  enum state: { draft: 0, published: 1 }
end

→ publish_wait がないため、エラーが発生する。
```

あっ。そのエラーで表示されないってことなのね( ；∀；)。。。
・RSpecはbinding.pryできること
・実際にRSpecで使用されるコードが本当に登録できるかの確認を一つずつすること
など、学びがまだまだたくさんありそうだ

２２、２３日分は予定があるので休みの予定です。

短いですが15分！終了！
【git】git grep リポジトリ内で文字列検索

git リポジトリ内で文字列の検索を行いたい時のコマンドを紹介します。

以下のコードがあったとします。
```java
@Entity
public class TestEntity {

    @Id
    private Long id;

    private String name;
}
```

このクラスで"name"という文字列の検索を行いたいとき git grep コマンドを使います。
```
% git grep name /Users/~/~/TestEntity.java  
```

すると下記のように表示されます。
![スクリーンショット 2025-02-22 1.32.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4015761/1e43d992-6097-45cc-a21a-9943aa52be06.png)


ちなみに name を大文字にしてみると、、、
```
% git grep NAME /Users/~/~/TestEntity.java
% 
```
ヒットはしません。
大文字、小文字の区別もしてくれるんですね。

以上です。
最後までご覧いただきありがとうございました。
600トークン欲しさにLocofyのデモWSに参加してみた

### はじめに

最近、気になっていた「Locofy」（ロコファイ）。
YouTubeの解説動画などで概要は知っていたものの、実際にツールを回したことはありませんでした。デモのワークショップ（WS）が開催されているということで、600トークン欲しさに参加してみました。

:::note info
2025/02/22現在は日曜日以外ほぼ毎日、1日に1〜2セッションのWSが開催
:::

ちなみに、英語は「頑張れば何を言っているかはわかるけど、話す・書くとなるとまったくダメ」なレベル。:sweat_smile:
ただ、Figmaは業務で1年ほど触っていて、「中級者よりの初心者」といったところ。そんな状態でのLocofyデモWSの体験を、ざっくりまとめていきます。

---

### [Locofy](https://www.locofy.ai/?_gl=1%2A1vbujmw%2A_gcl_au%2AMTI1Njk4NjI0NS4xNzQwMDE0MTgz%2A_ga%2AMTg3NzA0MDAxNi4xNzQwMDE0MTg2%2A_ga_9EZZJCG6XV%2AMTc0MDE1MTQ0NC43LjEuMTc0MDE1MjY0My40MC4wLjA.)の概要

まず、「Locofyって何？」という話ですが、ざっくり言うと「FigmaやAdobe XDのデザインをコード化してくれるツール」です。デザインからのコード変換を爆速で行い、React（Next.js）やVueなどのフロントエンド技術と組み合わせて開発できるのが特徴。

---

### デモWSの流れ

**まず、リスニングが大変**

WSは英語で進行。しかもインド系の英語だったため、かなりリスニングに苦戦しました。個人的には特に「background」の発音が独特で、一瞬混乱してわからなかったり……。

**環境と進行**

- カメラ・マイクはオフ
- チャットで質問OK
- 最初に「音声が聞こえているか」確認される
- 参加者は自分を含め5人くらい？
- 使用ツールはMeetやTeamsではなく、Locofy特有の会議ツール

**ワークショップの内容**

1. **フルページのコード化**
   - どんなデザインがコード化しやすいか、しにくいかを解説
   - 実際にFigmaのデザインをコード化しながら、コツを説明



2. **パーツごとのコード化**
   - オートレイアウトやパディング設定の調整方法
   - レスポンシブ対応をどうするかの詳細説明
   - Figmaの右パネルを細かく設定する重要性
   - 「最小値」を決めて適切なレスポンシブデザインを実現する方法

**具体的な実践例**

- ヘッダー
- Airbnb風のカード（上に画像、下にテキスト）
- 宿泊検索フォーム（バックグラウンドレイヤーを活用）

デモではReactとMaterial UIを使ってコード化し、完成したコードは「Locofy Build」に保存されました。

特に印象的だったのは、**画面幅に応じてUIの要素が変わる仕組み**。デモを受ける前は画面幅が変わっても中身の要素は同じのままでしか対応できないと思っていましたが、実際に見てみると適切なレスポンシブ対応ができていたりと、**使いこなせば**本格的なフロントエンド開発ができそうな雰囲気でした。

**WSの最後には……**

- 質疑応答タイムあり
- 左下に600トークン取得ボタンが出現（これが目的:point_up:）

---

### 感想とコメント

正直なところ、**目新しい内容はほぼなし**。YouTubeや公式ドキュメントで見た内容を、そのままライブデモで実践しているだけといった感じでした。

また、デモで使用するデザインも「ホテル予約サイト風」のよく見るもの。とはいえ、「実際に操作しながら学べる」という点では価値がありました。


一番嬉しかったのは、**600トークンをちゃんともらえたこと！** これで、ようやくLocofyを試せるだけのトークンが手に入りました。おそらくフルページのコードを1回おこすだけでトークンをほぼ消費しそうですが、早く試してみたい気持ちでいっぱいです。

今後、Locofyを活用してどれだけ効率化できるか、しばらく検証してみようと思います！
【今さら】cssでネストが出来るようになっていた

## はじめに

ここ数年フロントエンドの開発では基本的にはscssか何かしらのフレームワークを使用していたため、css自体のアップデートに疎くなっていた。

そんな中、先日cssでもscssのように入れ子を使用できるようになっていたことに気付いたため、どのバージョンから対応していたのかを調べてみた。

## Can I use を見る

まあ一番わかりやすい。

css nestingで調べると出てくる。

https://caniuse.com/?search=css%20nesting

![caniuse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737230/13510259-85db-4f61-ae02-c3c303ef6f33.png)


どうやら2段階あるようで、

1. &を使用しないと正しく動作しない
2. &がなくても動作する

みたいです。

1の方は

```scss
.foo {
  div {
    color: green;
  }
}
```

こういうのがNGらしい。

https://issues.chromium.org/issues/40261706

```scss
.foo {
  & div {
    color: green;
  }
}
```

こういう風にしないといけない。

Chromeでいうと1が112-119のバージョンで、2が120以降のバージョンらしい。


## MDN を見る

気になる記載があったので。

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_nesting/Using_CSS_nesting

![mdn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737230/dbad4210-e2ae-43b9-9619-db226e9df1c5.png)


### 連結はできない

```scss
.component {
  &__child-element {
  }
}
/* Sass ではこのようになる */
.component__child-element {
}
```

最近あまり見ない気がしますが、BEMで書いてた時確かにこんな感じのことやってた気がする。

ただcssではこれは現状不可能とのこと。これもいつか対応するのかなと思いつつも、W3Cを読むのはまたの機会に。

## おわり

cssもどんどん便利になっていってるんですね。もっと色々最近の動向を追わねばと思い知らされました。
また)√100(ルート百)までのテーブル(表)を作って遊ぶ。(sqrtを使わない)


注意
----

- 過去ログを見よ!!!
- M5NanoC6での予定は、未定


目的
----

平方根(ルート)を統計計算の為に使用する
バラツキは、非常に小さい整数と事前に予想される為に
100程度で戻りは、10で良いとする

アルゴリズム
全てを(-1)で初期化する
二乗を求めて配列に入れる
隙間を前の値で埋める




プログラム
----

オンラインコンパイラ

```c++



#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    int al; //一時
    int rd; //リード
    int bk; //一つ前の値
    int y[100+1]; //平方根の配列
    
    printf("START\n");
    
    //-1で配列を初期化
    for(int i = 0;i<=100;i++ ){
        y[i] = -1;
        //printf("[%d]=%d\n",i,y[i]);
    }
    
    
    //二乗した値の配列に二乗する前を入れる
    for(int i = 0;i<=10;i++ ){
        al = i * i; //二乗する
        y[al] = i;
        printf("[%d]=%d\n",al,i);
    }
    printf("...\n");
    
    //for(int i = 0;i<=100;i++ ){
    //    printf(".[%d]=%d\n",i,y[i]);
    //}
    
    //-1を一つ前の値で埋めていく
    bk = rd = 0;
    for(int i = 0;i<=100;i++ ){
        rd = y[i]; //値をリードする
        
         //-1の時は、一つ前の値
        if(rd == -1) { y[i] = rd = bk;}
        
        printf("[%d]=%d\n",i,y[i]);
        bk = rd;
    }

    for(int i = 0;i<=100;i++ ){
        if( (i % 10) == 0 ) {printf("\n");}
        printf("%d,",y[i]);
    }

}



```


```

START
[0]=0
[1]=1
[4]=2
[9]=3
[16]=4
[25]=5
[36]=6
[49]=7
[64]=8
[81]=9
[100]=10
...
[0]=0
[1]=1
[2]=1
[3]=1
[4]=2
[5]=2
[6]=2
[7]=2
[8]=2
[9]=3
[10]=3
[11]=3
[12]=3
[13]=3
[14]=3
[15]=3
[16]=4
[17]=4
[18]=4
[19]=4
[20]=4
[21]=4
[22]=4
[23]=4
[24]=4
[25]=5
[26]=5
[27]=5
[28]=5
[29]=5
[30]=5
[31]=5
[32]=5
[33]=5
[34]=5
[35]=5
[36]=6
[37]=6
[38]=6
[39]=6
[40]=6
[41]=6
[42]=6
[43]=6
[44]=6
[45]=6
[46]=6
[47]=6
[48]=6
[49]=7
[50]=7
[51]=7
[52]=7
[53]=7
[54]=7
[55]=7
[56]=7
[57]=7
[58]=7
[59]=7
[60]=7
[61]=7
[62]=7
[63]=7
[64]=8
[65]=8
[66]=8
[67]=8
[68]=8
[69]=8
[70]=8
[71]=8
[72]=8
[73]=8
[74]=8
[75]=8
[76]=8
[77]=8
[78]=8
[79]=8
[80]=8
[81]=9
[82]=9
[83]=9
[84]=9
[85]=9
[86]=9
[87]=9
[88]=9
[89]=9
[90]=9
[91]=9
[92]=9
[93]=9
[94]=9
[95]=9
[96]=9
[97]=9
[98]=9
[99]=9
[100]=10

0,1,1,1,2,2,2,2,2,3,
3,3,3,3,3,3,4,4,4,4,
4,4,4,4,4,5,5,5,5,5,
5,5,5,5,5,5,6,6,6,6,
6,6,6,6,6,6,6,6,6,7,
7,7,7,7,7,7,7,7,7,7,
7,7,7,7,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,
8,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,
10,

```
「0→1」を最速で達成！初めてのOSS貢献ガイド

## **🔥 はじめに**  

**「OSS に貢献したいけど、何をすればいいかわからない…」**  
そんな悩みを抱えていませんか？  

OSS（オープンソースソフトウェア）貢献は、エンジニアにとってスキル向上、キャリアアップ、人脈形成に最適な方法です。しかし、「自分のスキルで貢献できるのか？」と不安になり、一歩踏み出せない人も多いのではないでしょうか？  

本記事では、**完全未経験者が最短で OSS に貢献する方法**を、実際の流れに沿って解説します。💡  

---

## **🚀 1. OSS に貢献するメリット**  

OSS に関わると、こんなメリットがあります：  

✅ **実績になる** → GitHub での活動がポートフォリオ代わりになる  
✅ **学習効率UP** → 実際のプロジェクトでコーディングスキル向上  
✅ **業界とのコネクション** → 世界中のエンジニアと交流できる  
✅ **仕事につながる** → 企業からスカウトが来ることも！  

「でも、OSS に貢献するにはハイレベルなスキルが必要なんでしょ？」と思うかもしれませんが、**初心者でもできる貢献方法はたくさんあります！**  

---

## **💡 2. OSS 初心者が貢献できる 3 つの方法**  

### **① バグ報告 & Issue の整理** 🐛  
OSS の多くは、ユーザーからの **バグ報告** や **Issue 管理** に頼っています。  
もし OSS を使っていてバグを見つけたら、すぐに **GitHub の Issue に報告** しましょう！  

**👉 良い Issue のポイント:**  
- **再現手順** を明確に書く  
- **エラーメッセージやスクショ** を添付  
- 既存の Issue を確認し、重複投稿を避ける  

**✅ 実践:** まずは `good first issue` タグが付いた Issue を探してみよう！  
→ [GitHub: Good First Issues](https://github.com/topics/good-first-issue)  

---

### **② ドキュメント修正 & 翻訳** 📖  
コードを書かなくても **README.md** や **公式ドキュメントの改善** で貢献できます！  

**こんな点をチェックしてみよう：**  
- タイポや誤字脱字  
- わかりにくい説明をリライト  
- 日本語訳がないプロジェクトなら翻訳貢献  

**✅ 実践:** OSS の `docs` フォルダを覗いて、修正点がないか確認！  

---

### **③ コード貢献（小さな修正から始める）** 🛠  
「いきなりコードを書くのはハードルが高い…」と思うかもしれませんが、**小さな修正でも貢献になります！**  

**初心者におすすめのコード貢献：**  
✅ **Typo 修正**（変数名、コメント、関数名）  
✅ **Lint や Format の適用**（Prettier, ESLint など）  
✅ **依存関係のアップデート**（`package.json` など）  

**✅ 実践:** `good first issue` のコード修正系タスクを探してみよう！  

---

## **🛠 3. 実際に OSS にコントリビュートする流れ**  

### **STEP 1: 貢献したい OSS を選ぶ**  
GitHub で「Trending」や「Good First Issue」タグのあるリポジトリを探しましょう！  

🔍 おすすめ検索ワード：
```bash
language:JavaScript good-first-issue
language:Python good-first-issue
language:Go good-first-issue
```

**✅ 実践:** Qiita のタグ `#OSS` でおすすめリポジトリを探してみる！  

---

### **STEP 2: Fork & Clone する**  
貢献するプロジェクトが決まったら、GitHub で `Fork` し、ローカル環境に `Clone` します。

```sh
git clone https://github.com/your-username/forked-repo.git
cd forked-repo
```

---

### **STEP 3: 新しいブランチを作成**  
修正を加える前に、新しいブランチを作成しましょう。

```sh
git checkout -b fix-typo
```

---

### **STEP 4: コード修正 & コミット**  
変更を加えたら、コミットしてプッシュします。

```sh
git add .
git commit -m "Fix typo in README"
git push origin fix-typo
```

---

### **STEP 5: Pull Request を送る**  
GitHub に戻り、「New Pull Request」を作成！  
適切なタイトルと説明をつけて送信しましょう。  

---

## **🎉 まとめ：OSS 貢献は意外と簡単！**  
OSS 貢献は、**コードを書かなくてもできる** ことがたくさんあります。  

**🔹 今日からできる OSS 貢献:**  
✅ Issue をチェックして **バグ報告**  
✅ README やドキュメントの **誤字修正**  
✅ `good first issue` の **コード修正** に挑戦  

まずは **小さな一歩** から始めてみましょう！  

**💬 あなたの OSS 初貢献エピソード、ぜひコメントで教えてください！** 🚀  

---

## **📌 関連リンク**  
- [GitHub: Good First Issues](https://github.com/topics/good-first-issue)  
- [OSS コントリビュートガイド (日本語)](https://opensource.guide/ja/how-to-contribute/)  
- [Qiita #OSS タグ](https://qiita.com/tags/OSS)  

---

### **🔥 Qiita 用に最適化された SEO ポイント**
✅ **検索に強いキーワード配置**：「OSS 貢献」「GitHub」「Good First Issue」  
✅ **実践しやすい具体的なアクション** → 読者の行動を促す  
✅ **内部リンク & 外部リンクで滞在時間UP**  

こんな感じで **OSS × Qiita 向けの記事** を書いてみました！  
「他にもこういう記事が読みたい！」というリクエストがあれば、ぜひ教えてください！🔥

___________
【Unity】CinemachineCameraの入力を無効化する処理

```c#
using Unity.Cinemachine;

public class test : MonoBehaviour
{
    private CinemachineCamera cinemachine;
    private CinemachineInputAxisController[] cinemachineInput;

    void Start(){
        cinemachineInput = cinemachine.GetComponentsInChildren<CinemachineInputAxisController>();
        
        // 無効化
        cinemachineInput[0].enabled = false;
        // 有効化
        cinemachineInput[0].enabled = true;
    }
}
```

以上
C#でIoTプログラミング on ESP32 #6 - ボタンスイッチ2

今回はイベントを使ってボタンの状態を検出するプログラムを消化します。
[前回](https://qiita.com/linyixian/items/30fbed2ad663b4db885e)と同じ回路を使用します。

## ハードウェア
・Freenove ESP32-S3-WROOM Board or Espressif ESP32-S3-DevKitC
・ブレッドボード
・タクトスイッチ
・ジャンパーワイヤ

## 配線
前回と同じ回路です。
![button.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/9a41d66f-0e28-4ab9-bea8-fbcbbf2b3dc3.png)

## 導入するパッケージ
・nanoFramework.System.Device.Gpio

## プログラミング
・新規プロジェクトを作成します。プロジェクト名は「ESP32S3_Button_event」としました。

・コードを入力する前にパッケージは導入してください。

・コードは次のようになります。

```C#:Program.cs
using System;
using System.Diagnostics;
using System.Threading;

using System.Device.Gpio;

namespace ESP32S3_button_event
{
    public class Program
    {
        private static GpioPin ledPin;
        private static GpioPin buttonPin;

        public static void Main()
        {
            GpioController controller = new GpioController();

            ledPin = controller.OpenPin(2, PinMode.Output);
            ledPin.Write(PinValue.Low);

            buttonPin = controller.OpenPin(35, PinMode.InputPullDown);

            buttonPin.ValueChanged += ButtonPin_ValueChanged;

            Thread.Sleep(Timeout.Infinite);
        }

        private static void ButtonPin_ValueChanged(object sender, PinValueChangedEventArgs e)
        {
            Debug.WriteLine(buttonPin.Read().ToString());
            if (e.ChangeType == PinEventTypes.Rising)   //Pinの電圧が低い状態から高い状態に変化した時
            {
                ledPin.Write(PinValue.High);
            }
            else
            {
                ledPin.Write(PinValue.Low); 
            }
        }
    }
}
```

　実行するとスイッチを押した時（この回路ではスイッチをオンにすることでPinに電圧がかかります。）にオンボードLEDが点灯します。
　前回のプログラムではPinの状態を定期的に監視して電圧がかかっているときにLEDを点灯するようにしていました。
　今回のプログラムではPinにかかる電圧が変化した時にイベントが発生し、そのイベントの状態によってLEDを制御するようにしています。
pico2024 WinAntiDbg0x300 Writeup

# はじめに
初期にデバッカーを起動していてもしてなくても検知しているとしてループから抜け出せない仕様

Windbgは使わなくてもクリアできたらしいです。
https://youtu.be/AKYwzmRcLtw?si=lQ7gdsD5XCmG77Rt
をみて学びました

# 手順
picoCTFより実行ファイルをダウンロードする。
ファイルとして .exe, .pdb, .configがある。
- pdbファイル : 実行ファイルの関数情報等が記載された解析補助ファイル？
- config : これを使用して起動しているらしい。

### upxのアンパック
ファイルがupxでパッキングされているため
https://github.com/upx/upx/releases/tag/v5.0.0
より
upx-5.0.0-win64.zip
をダウンロードする。解凍すると.exeがあるので、Windowsのcmdを起動して同じフォルダに移動して以下を実行。
私はパス指定があれだったので同階層にCTFのファイルをすべて移動してしまいました。
```
upx.exe -d WinAntiDbg0x300.exe
```
また、Linuxのupx -dで解凍してしまうとWindowsで実行できなくなる。

# ghidraを用いた解析
https://github.com/NationalSecurityAgency/ghidra
の
```
To install an official pre-built multi-platform Ghidra release:
Install JDK 21 64-bit
Download a Ghidra release file
NOTE: The official multi-platform release file is named ghidra_<version>_<release>_<date>.zip which can be found under the "Assets" drop-down. Downloading either of the files named "Source Code" is not correct for this step.
```
を見て、
https://adoptium.net/temurin/releases/
のWindows用の.msi形式のファイルをダウンロードして実行する。
https://github.com/NationalSecurityAgency/ghidra/releases
より
ghidra_11.3.1_PUBLIC_20250219.zipのような最新のファイルをダウンロードする。
ファイル内の.BAT（バッチファイル）を実行する。

projectを新規作成し、import fileからWinAntiDbg0x300.exeを読み込むがこの時に、アナライズは実行しない。
![スクリーンショット (35).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965944/ce2fe2e2-62a8-436e-b7b6-d8c30b3b4e04.png)

次に、File > Load PDB file > ファイルを選択してロードする。
![スクリーンショット (36).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965944/3b87cf01-5917-411b-902a-c6a4e7ebdf1e.png)

この時点でwinMain関数が見れる状態になる。
winMain関数の逆コンパイル結果に以下のようにあるので、
```
local_8 = CreateThread(0,0,ChallengeThreadFunction,0,0,0);
```
ChallengeThreadFunctionをクリックしてChallengeThreadFunctionに飛ぶ。
この関数は問答無用で５秒ごとにループしているので、これを無効化する。
![スクリーンショット (38).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965944/b76d61f9-cedc-4b5d-a4c8-f83dd8482ae7.png)
NOPを入れる
JMP命令を右クリックし、Clear > Clear Code Bytesをクリック。
![スクリーンショット (39).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965944/f7f29b68-c90a-4deb-8eff-2e789d4d72ee.png)

その後空白になったところ５か所に、Ctrl+Shift+Gまたは、右クリックしてPatchInstructionを選択して、NOP命令に書き換える。
![スクリーンショット (40).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965944/b79a768b-a219-4de1-8c7e-866187eb4e5c.png)

次に、完成したファイルを書き出す
File > Export program > Formatはoriginalで任意の場所に出力する。
Jestでnext/linkの呼び出しを検証する方法

Next.js のアプリケーションでは、ページ遷移に next/link を利用するケースが多くあります。テスト時に実際の遷移を行わず、コンポーネント内部で next/link が呼び出されているかどうかを確認するには、モック化を活用するのが有効です。ここでは、Jest のモック機能を用いて、next/link が正しく呼び出されるかを `toHaveBeenCalled` で検証する方法を解説します。

## next/link のモック化

Jest の `jest.mock` を使って、next/link をモック化します。以下のコード例では、next/link のデフォルトエクスポートを `jest.fn` でラップし、実際には `<a>` タグとしてレンダリングされるようにしています。これにより、リンクコンポーネントがレンダリングされた際の呼び出し状況を簡単に追跡できます。

```javascript
// テストファイル内でモックを定義する例
jest.mock('next/link', () => {
  return {
    __esModule: true,
    default: jest.fn(({ children, href, ...props }) => (
      <a href={href} {...props}>{children}</a>
    ))
  };
});
```

## サンプルコード

ここでは、next/link を利用したシンプルなコンポーネントと、そのテストコードのサンプルを示します。

### コンポーネント例：`MyComponent.jsx`

```javascript
import React from 'react';
import Link from 'next/link';

const MyComponent = () => (
  <div>
    <Link href="/about">
      <a>Aboutページへ</a>
    </Link>
  </div>
);

export default MyComponent;
```

### テストコード例：`MyComponent.test.jsx`

```javascript
import React from 'react';
import { render } from '@testing-library/react';
import MyComponent from './MyComponent';
import Link from 'next/link';

// モック定義（グローバルなモックが未定義の場合のみ）
jest.mock('next/link', () => {
  return {
    __esModule: true,
    default: jest.fn(({ children, href, ...props }) => (
      <a href={href} {...props}>{children}</a>
    ))
  };
});

describe('MyComponent', () => {
  it('next/linkが呼び出されていることを検証', () => {
    render(<MyComponent />);
    // コンポーネントのレンダリング時に next/link のモックが呼ばれているか確認
    expect(Link).toHaveBeenCalled();
  });
});
```

## 解説

- **モック化のポイント:**  
  next/link を jest.fn でラップすることで、コンポーネント内部での呼び出しを追跡可能にしています。実際には `<a>` タグとしてレンダリングされるため、DOM の構造はシンプルなままです。

- **呼び出し検証:**  
  テスト内で `render` 関数を用いて MyComponent を描画し、その際に next/link のモックが呼び出されることを `toHaveBeenCalled` で確認します。これにより、リンクコンポーネントが意図した通りに利用されているかどうかをチェックできます。

## まとめ

今回の記事では、Next.js の next/link を Jest でモック化し、呼び出し検証を行う方法を紹介しました。モック化を利用することで、コンポーネント間の依存関係を切り離し、シンプルかつ効果的なユニットテストが実現できます。自身のプロジェクトでも、この手法を活用してテストの充実化を図ってみてください。

Happy Testing!
眠気と戦う民たちへ

## はじめに
生きてる限り、眠気と戦う時があると思うのでしょうが、
みなさまはどう対処されておりますか？
私はひたすら眠気に耐え忍ぶ毎日を過ごしております。
何十年とお付き合いした眠気の原因と私なりの対処法についてまとめさせていただければと思います。

何か対処法があれば、教えてください・・・（切実）

## 原因（予想）

- 環境要因
    - 換気不足によるCo2過多（空気の入れ替えが有効）
    - 部屋が暗い
    - 熱すぎる or 寒すぎる

- 人間要因
    - 食後の眠気 （血糖値を下げる効果があるため黒酢が効くらしい・・・）
    - 暇
    - 逆に難易度が高い仕事でパンク
    - 純粋な睡眠不足
    - 二日酔い

#### 感想
環境要因（周りの環境）と人間要因（自分に起因する原因）を挙げてみました。
テレワークなら換気もしやすそうですが、出社していると換気しづらい環境もあって悩ましいです。。。
あと二日酔いはほんまにごめん！！！って感じなんですけど、お酒飲むのはやめられないですね。。。

続いて私なりの対処法について記載します！！

## 眠気への対処法

- 食べ物/飲み物系
    - コーヒー
    - レッドブル
    - あったかい飲み物をのむ
    - 水をがぶ飲み
    - 一番辛いミンティアを食べる（おなか壊しやすくなってやめました）
    - ガムをかむ（おなか壊しやすくなってやめました）

- 動く系
    - 歩く
    - 人と話す
    - テレワークなら歌を歌う
    - テレワークなら風呂に入る

- その他
    - すぐ終わる仕事をする（目標作る、考える作業は眠くなりがち）
    - 目薬

- 最終手段
    - トイレで10分寝る（だいたい無理。立ってても眠くなっちゃう）
    - 30分寝るか、外で散歩する（だいたい解決するが、倫理的には・・・？）

#### 感想
改めて振り返ってみると、意外と対策してたんだなと思いました。
とはいうものの、眠気とは常に戦っているなという印象です。
いつになれば決着がつくのでしょうか。

早く楽になりたいです。
React：useMemoとuseCallbackのよい点

皆さん、こんにちは。

今日は「React：useMemoとuseCallbackのよい点」についてご紹介します。

`useMemo`と`useCallback`は、`React`のパフォーマンス最適化のために使われるフックです。
特にコンポーネントが再レンダリングされる際に、不要な再計算を避けるために使用されます。
以下で、それぞれのフックの特徴と使い方を詳しく説明します。

# useMemo

`useMemo`は、計算結果をメモ化して再利用できるようにするためのフックです。特に計算が高価な場合や、レンダリングごとに再計算する必要がない場合に有効です。

## よい点

- 高価な計算を一度だけ実行し、依存する値が変わった場合にのみ再計算されるため、パフォーマンスを改善できる。
- 計算量が多い処理を、無駄に繰り返さないようにする。

## 使い方

```
import { useMemo } from 'react';

const MyComponent = ({ items }) => {
  // items が変わらない限り、フィルタリングされたリストを再計算しない
  const filteredItems = useMemo(() => {
    return items.filter(item => item.active);
  }, [items]); // items が変更された場合にのみ再計算

  return (
    <ul>
      {filteredItems.map(item => (
        <li key={item.id}>{item.name}</li>
      ))}
    </ul>
  );
};
```

- `useMemo`の最初の引数は計算する関数、2番目の引数は依存配列です。依存配列の値が変わるときにだけ再計算が行われます。

# useCallback

`useCallback`は、関数をメモ化するためのフックです。特に関数を props として子コンポーネントに渡す場合に、不要な再レンダリングを防ぐために使用します。

## よい点

- 関数が再作成されるのを防ぎ、特に子コンポーネントに関数を渡す場合にパフォーマンスを向上させる。
- useEffect や useMemo と一緒に使うことで、依存配列に不必要な再実行を避けることができる。

## 使い方

```
import { useCallback } from 'react';

const MyComponent = ({ onAction }) => {
  // onAction が変更されない限り、新しい関数を作成しない
  const handleClick = useCallback(() => {
    onAction();
  }, [onAction]); // onAction が変更された場合にのみ再生成

  return <button onClick={handleClick}>Click me</button>;
};
```

- `useCallback`の最初の引数はメモ化する関数、2番目の引数は依存配列です。依存配列内の変数が変わった場合にのみ、新しい関数が生成されます。

# まとめ

- `useMemo`は高価な計算をメモ化して、無駄な計算を避けるために使用します。
- `useCallback`は関数をメモ化して、再レンダリング時に不必要な関数の再生成を防ぐために使用します。
どちらも、パフォーマンスを最適化するためのツールとして非常に有効ですが、過度に使用するのは避けるべきです。依存関係が多い場合や、計算が簡単な場合には、使うことが逆にパフォーマンスを悪化させることがあります。

ぜひ参考にしてみてください。

今日は以上です。

ありがとうございました。
よろしくお願いいたします。
【Lazydocker】設定の変更方法

## Lazydockerを起動する

以下のコマンドを実行してLazydockerを起動します。

```terminal
lazydocker
```

## 設定ファイルを開く

左上のプロジェクトパネルをクリックし、`o`を押下するとエディタで設定ファイルが開きます。

![スクリーンショット 2025-02-21 23.49.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/daa55d18-5a08-4c86-a734-e9cce4d66900.png)

## 設定項目

以下のような項目について設定できます。

```yml
gui:
  scrollHeight: 2
  language: "auto" # one of 'auto' | 'en' | 'pl' | 'nl' | 'de' | 'tr'
  border: "rounded" # one of 'rounded' | 'single' | 'double' | 'hidden'
  theme:
    activeBorderColor:
      - green
      - bold
    inactiveBorderColor:
      - white
    selectedLineBgColor:
      - blue
    optionsTextColor:
      - blue
  returnImmediately: false
  wrapMainPanel: true
  # Side panel width as a ratio of the screen's width
  sidePanelWidth: 0.333
  # Determines whether we show the bottom line (the one containing keybinding
  # info and the status of the app).
  showBottomLine: true
  # When true, increases vertical space used by focused side panel,
  # creating an accordion effect
  expandFocusedSidePanel: false
  # Determines which screen mode will be used on startup
  screenMode: "normal" # one of 'normal' | 'half' | 'fullscreen'
  # Determines the style of the container status and container health display in the
  # containers panel. "long": full words (default), "short": one or two characters,
  # "icon": unicode emoji.
  containerStatusHealthStyle: "long"
logs:
  timestamps: false
  since: '60m' # set to '' to show all logs
  tail: '' # set to 200 to show last 200 lines of logs
commandTemplates:
  dockerCompose: docker compose # Determines the Docker Compose command to run, referred to as .DockerCompose in commandTemplates
  restartService: '{{ .DockerCompose }} restart {{ .Service.Name }}'
  up:  '{{ .DockerCompose }} up -d'
  down: '{{ .DockerCompose }} down'
  downWithVolumes: '{{ .DockerCompose }} down --volumes'
  upService:  '{{ .DockerCompose }} up -d {{ .Service.Name }}'
  startService: '{{ .DockerCompose }} start {{ .Service.Name }}'
  stopService: '{{ .DockerCompose }} stop {{ .Service.Name }}'
  serviceLogs: '{{ .DockerCompose }} logs --since=60m --follow {{ .Service.Name }}'
  viewServiceLogs: '{{ .DockerCompose }} logs --follow {{ .Service.Name }}'
  rebuildService: '{{ .DockerCompose }} up -d --build {{ .Service.Name }}'
  recreateService: '{{ .DockerCompose }} up -d --force-recreate {{ .Service.Name }}'
  allLogs: '{{ .DockerCompose }} logs --tail=300 --follow'
  viewAlLogs: '{{ .DockerCompose }} logs'
  dockerComposeConfig: '{{ .DockerCompose }} config'
  checkDockerComposeConfig: '{{ .DockerCompose }} config --quiet'
  serviceTop: '{{ .DockerCompose }} top {{ .Service.Name }}'
oS:
  openCommand: open {{filename}}
  openLinkCommand: open {{link}}
stats:
  graphs:
    - caption: CPU (%)
      statPath: DerivedStats.CPUPercentage
      color: blue
    - caption: Memory (%)
      statPath: DerivedStats.MemoryPercentage
      color: green
```


## 設定の確認方法

現在の設定はプロジェクトパネルの`About`から確認できます。

## 参考

https://github.com/jesseduffield/lazydocker/blob/master/docs/Config.md
【RockyLinux 9.5 で WordPress 環境構築】WordPressのインストールと設定

RockyLinux9.5でWordPress環境構築した際のメモです。
今回はWordPressをインストールし設定します。

## WordPressをインストール

```wget``` と ```tar``` をインストール
```
sudo dnf install wget
sudo dnf install tar
```

ホームディレクトリに移動
```
cd ~
```

WordPressの最新版を ```wget``` でダウンロード
```
sudo wget https://ja.wordpress.org/latest-ja.tar.gz
```

ダウンロードしたgzファイルを解凍。
```
tar xvzf latest-ja.tar.gz
```

回答したファイルをホームディレクトリからドキュメントルートへ移動。
```
sudo mv ./wordpress/ /var/www/yoursite.com/
```

ドキュメントルート内のファイル所有者をapacheに変更
```
sudo chown -R apache.apache /var/www/yoursite.com/
```

## WordPressの初期設定

http://xxx.xxx.xxx.xxx (IPアドレス)にアクセスすると、WordPressの初期設定画面が表示されているはずです。

画面の案内に従い、データベースの接続情報、WordPressのユーザー情報を入力します。WordPressのインストールが無事成功すれば、サイトのURLにパス ```/wp-admin/``` を指定することで、管理画面にアクセスできます。

## wp-config.php の権限設定

```wp-config.php```は重要なファイルのため、権限を設定します。
所有者には読み取り（4） と 書き込み（2）の権限を与えます。（4 + 2 = 6）
グループとその他のユーザーには何の権限も与えないようにします。（0）

```
sudo chmod 600 /var/www/yoursite.com/wp-config.php
```

## WordPressのデータ移行

### 現行サイト 
1. ツール > エクスポート
1. 「すべてのコンテンツ」を選択して「エクスポートファイルをダウンロード」

### 新規サイト 
1. ツール > インポート
1. 「Wordpress」の「今すぐインポート」をクリック
1. 「インポーターの実行」をクリック
1. ダウンロードしたエクスポートファイルを選択
1. 「添付ファイルをダウンロードしてインポートする」にチェックして実行

## RockyLinux9.5でWordPress環境構築
1. [さくらのVPS設定](https://qiita.com/tfz/items/58a8a185573ff7080599)
1. [Apacheのインストールと設定](https://qiita.com/tfz/items/f4d74b8a5d93068fe675)
1. [PHPのインストールと設定](https://qiita.com/tfz/items/9e962e83cf84f4e20c14)
1. [mariaDBのインストールと設定](https://qiita.com/tfz/items/ffb4eaaba2eea68211fe)
1. WordPressのインストールと設定
1. [DNS設定とCertbotによるSSL証明書の取得と設定](https://qiita.com/tfz/items/546cc990465b876bc5de)
[Security] 認証(Authentication）と認可（Authorization）の違い

### 目的

**認証**（Authentication）と **認可**（Authorization）は，それぞれ異なる役割を持っており．以下でその違いを簡単に説明する．

#### 結論
認証は本人確認，認可は権限の確認．したがって，認証後に認可を行う流れとなる．


---

### 認証 (Authentication)
認証は，**ユーザーが誰であるか**を確認するプロセスである．あるユーザーからアクセスがあった際に，その**ユーザーが本物**であることを確認する．

- 目的 : ユーザーの身元を確認する
- 質問 : 「あなたは誰ですか？」
- 例
  - ユーザー名とパスワードによるログイン
  - 生体認証（指紋，顔認証など）


### 認可 (Authorization)
認可は，**認証されたユーザーがどのリソースにアクセスできるか**を決定するプロセス．ユーザーがシステム内で行える操作やアクセスできるデータを制限する．

- 目的 : ユーザーが実行できる操作やアクセスできるリソースを管理する
- 質問 : 「あなたには何をする権限がありますか？」
- 例
  - ユーザーが特定のファイルを編集する権限を持っているかどうか
  - 管理者と一般ユーザーに異なるアクセス権を設定する


---


### 認証と認可の関係
認証は認可の前提条件である．ユーザーが正しく認証されていなければ，認可のプロセスが成立しない．
つまり，**認証が成功して初めて認可のプロセスを経る**．これによりユーザーの権限が決まる．


---


### 開発における認証と認可の違いを意識する必要がある場合

開発の際，認証と認可を区別して考えることが重要である．
以下のようなシチュエーションでは，その違いを意識する必要がある．

#### 1. **APIの設計**
   - RESTful APIでは，認証は通常，トークン（例えばJWT）を用いて行われる．認証後，APIはそのトークンを使ってリクエストが正当なものかを確認する．その後，認可を行ってユーザーのアクセス権限に基づいた処理を行う．
   - 例: ユーザーが特定のリソースにアクセスできるかどうかは，認証が成功した後の認可処理で決定される．

#### 2. **ユーザー管理システム**
   - システムで異なる役割（例えば，一般ユーザー，管理者）を持つユーザーがいる場合，それぞれの役割に応じてアクセス制限を設定する必要がある．認証後，認可を行ってそのユーザーが特定の機能にアクセスできるかどうかを判断する．

#### 3. **セキュリティの強化**
   - 特定のリソースにアクセスするために多要素認証（MFA）を使うことがあります．この場合，認証後に追加の確認を行うことがあり，認可処理に影響を与える場合があります．認証の強化と認可の設定を適切に組み合わせることで，セキュリティが強化できる．

#### 4. **権限の細かい制御**
   - 高度な権限管理が必要なアプリケーション（例えば，企業内システム）では，認証が成功した後に細かいアクセス制御が必要となる．ユーザーがどのリソースにアクセスできるかを認可で制御する．

総じて，開発中に認証と認可の違いを意識することで，セキュリティがしっかりと管理され，予期せぬアクセス問題を防ぐことができる．
Excel VBAでディクショナリ（連想配列）を使用したい

# 1. はじめに
* Excel VBAでディクショナリ（連想配列）の使い方を知りたい

# 2. 開発環境
* VBA
* Excel 2021

# 3. 事前準備
ツール > 参照設定から```Microsoft Scripting Runtime```にチェックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/1704da12-35ea-4c5f-91a9-f24830e799f7.png)

# 4. サンプルコード
* ディクショナリを宣言して値を取得する

```vb: Sample1()
Public Sub Sample1()

    Dim count As Integer
    
    ' ディクショナリを宣言
    Dim dic As New Scripting.Dictionary
    
    ' ディクショナリに値をセット
    With dic
        .Add Key:="JP", Item:="日本語"
        .Add Key:="EN", Item:="英語"
        .Add Key:="KO", Item:="韓国語"
    End With

    ' デバッグ1 全件取得
    For count = 0 To dic.count - 1
        Debug.Print dic.Keys(count) & " " & dic.Items(count)
    Next

    ' デバッグ2 KEYを指定
    Debug.Print dic.Item("JP")

End Sub
```

```:実行結果
JP 日本語
EN 英語
KO 韓国語
日本語
```
# 4. 参考文献

https://qiita.com/haruki_nakayama/items/9479f8f7570450f15b97

https://mt-auto-minhon-mlt.ucri.jgn-x.jp/content/help/detail.html?q_pid=FAQ_ETC