OmniAICreator/Qiita-1.07M huggingface dataset:
Prismaのフィールド修飾子についてまとめてみた

Prismaのスキーマの修飾子をまとめてみました

## 基本
### `@id`
フィールドを主キーとして定義
```
model User {
  id Int @id @default(autoincrement())
}
```


### `@default`
フィールドのデフォルト値を設定
```
model Post {
  createdAt DateTime @default(now())
  published Boolean @default(false)
  viewCount Int @default(0)
}
```

### `@unique`
フィールドに一意制約
```
model User {
  email String @unique
}
```
### `@relation`
モデル間のリレーションシップを定義
```
model Post {
  author User @relation(fields: [authorId], references: [id])
  authorId Int
}
```
## マッピング
### `@map`
フィールド名をdb上の列名に変換
```
model User {
  firstName String @map("first_name")
}
```
### `@@map`
モデル名をdb上のテーブル名に変換
```
model User {
  id Int @id
  
  @@map("users")
}
```

## データベース固有の修飾子
### `@db`
データベースにこの形式で保存してね
```
model User {
  id String @id @default(uuid()) @db.Uuid
  
  createdAt DateTime @db.Timestamptz(6)
}
```
## 複合インデックスと制約
### `@@index`

複数のフィールドを組み合わせて検索する時に、検索を速くするための設定
```
model Post {
  title String
  content String
  
  // title と content を組み合わせた検索を速くする
  @@index([title, content])
}
```
### `@@unique`
複数のフィールドの組み合わせが一意（重複しない）であることを保証する
 → 1つの投稿に対し、いいねを1回までに制限
```
model Like {
  userId Int
  postId Int
  
  @@unique([userId, postId])
}
```
Git rebase を用いたコンフリクトの解消方法 


## **概要**

Git では、履歴をリニアに保つために `merge` と並び、`rebase` もよく利用されます。  
本稿では、rebase の基本的な考え方から、コンフリクト解消の具体的手順、そして解消後の push 時の注意点について、初心者でも理解しやすいように丁寧に解説します。  

## **1. 背景と rebase の基本概念**

### 1.1 なぜ rebase を使うのか？

複数人で同じリポジトリを運用している場合、他のメンバーによって `main` ブランチがどんどん進んでいく中、古いブランチで作業しているとその変更との差分が大きくなる場合があります。  
このとき `git rebase` を使うことで、自分の作業ブランチを最新の `main` の先端に「付け替え」ることができ、履歴をリニアに保ちながら統合しやすくなります。

```bash
# 例：feature ブランチを最新の main に基づかせる
git checkout feature
git rebase main
````

### **1.2 rebase が行う処理**

- **ブランチの移動:** 現在のブランチ（例：feature）のコミットを一時的に退避し、最新の main の先頭に置き換えた後、退避した変更を1つずつ再適用していきます。
    
- **履歴の整理:** これにより、マージコミットが不要となり、コミット履歴が一列に並び見通しがよくなります。
    

## **2. rebase 中に発生するコンフリクトの検出**

### **2.1 コンフリクトの検出**

リベース中、以下のようなメッセージが表示されることがあります。

```
CONFLICT (content): Merge conflict in <ファイル名>
```

これは、他のブランチで修正された内容と、自分の変更部分が同じ箇所にあった場合に発生します。


## **3. コンフリクト解消の具体的手順**

ここでは、リベース中に起こったコンフリクト解消の流れを、具体例とともに解説します。

### **ステップ 1: コンフリクト状態の確認**

まず、どのファイルにコンフリクトが発生しているかを確認します。

```
git status
```

出力例:

```
You are currently rebasing branch 'feature' on 'main'.
Unmerged paths:
  both modified:   src/app.js
```

### **ステップ 2: コンフリクト箇所の特定と修正**

コンフリクトが発生しているファイルをエディタで開くと、以下のようにコンフリクトの区切りが表示されます。

```
<<<<<<< HEAD
現在取り込もうとしている内容（main 側の変更）
=======
自分が加えた変更内容（feature 側の変更）
>>>>>>> <コミットID>
```

#### **選択肢:**

- **自分の変更を優先する:** 自分の変更内容のみを残し、不要なマーカーを削除します。

- **取り込み先 (main) の変更を優先する:** main 側の内容をそのまま採用する場合は、feature の変更部分とマーカーを削除します。

- **両方を統合する:** 場合によっては、両側の内容を統合して、より良い形で修正することも可能です。

### **ステップ 3: 解消済みファイルのステージング**

修正が完了したら、対象ファイルをステージに追加します。

```
git add <修正したファイル>
```

ここで git commit は不要です。

### **ステップ 4: rebase の再開**  

すべてのコンフリクトが解消できたら、rebase を再開します。

```
git rebase --continue
```

Git は次のコミットに対して再び適用を試み、もしさらにコンフリクトが発生した場合は同様の手順を繰り返します。

### **ステップ 5: rebase の中止（必要な場合）**

もし解消が複雑になった場合は、以下のコマンドで作業前の状態に戻すことが可能です。

```
git rebase --abort
```

## **4. rebase 後の push に関する注意点**

リベース後、リモートブランチに push するときには注意が必要です。

すでにリモートに同じブランチが存在する場合、通常の push では下記のようなエラーが出ることがあります。

```
! [rejected]          feature -> feature (non-fast-forward)
```

これは、ローカルの履歴がリモートと一致しないため発生します。

リベースによって履歴が書き換えられているため、**強制的に push** する必要があります。

```
git push --force origin HEAD
```

※ 強制 push はリモートの履歴を書き換える操作のため、チーム内でのルールやコミュニケーションを十分に取った上で実施してください。


## **6. まとめ**

- **rebase の目的:**
    履歴をリニアに整理し、見通しの良いブランチ運用を実現するための強力なツール。

- **コンフリクト解消:**
    コンフリクト発生時はエディタで差分部分を確認し、適切な内容に修正 → git add してから git rebase --continue を実行。

- **push 時の注意:**
    リベース後の履歴変更はリモート側と乖離するため、強制 push (git push --force) が必要。  

これらの手順を理解し、実際に運用することで、より快適な Git ワークフローが実現できるでしょう。

なお、各社・チームごとのポリシーに沿った運用や、詳細な設定については、最新のドキュメント等も参考にしてください。

## **参考資料**

- [Qiita: marge を用いたコンフリクト解消方法](https://qiita.com/crarrry/items/c5964512e21e383b73da)

- [Zenn: 〖初心者向け〗git rebaseの基本](https://zenn.dev/mikaneko/articles/0fe1daf2e8a987)
npmのキャッシュについて💿

## はじめに

npmのキャッシュは、パッケージをダウンロードした際にローカルに保存される場所のことです。
キャッシュにより、同じパッケージを再度インストールする際に、インターネットからダウンロードする手間を省き、インストール時間を短縮することができます。

## 目次

1. [npmのキャッシュの目的](#-npmのキャッシュの目的)
2. [npmのキャッシュの場所](#-npmのキャッシュの場所)
3. [npmのキャッシュの管理](#-npmのキャッシュの管理)
4. [npmのキャッシュに関する注意点](#-npmのキャッシュに関する注意点)
5. [まとめ](#-まとめ)
6. [参考文献](#-参考文献)

## 🧷 npmのキャッシュの目的

### 🔖 インストール時間の短縮
同じパッケージを何度もダウンロードする必要がなくなるため、プロジェクトのセットアップやビルドの時間を大幅に短縮できます。
### 🔖 ネットワーク負荷の軽減
インターネットへのアクセス頻度が減るため、ネットワークへの負荷を軽減できます。
### 🔖 オフラインインストールのサポート
一度ダウンロードされたパッケージはキャッシュに残るため、一時的にネットワーク接続がない環境でもインストール作業を進められる場合があります。


## 🧷 npmのキャッシュの場所
npmのキャッシュの場所はOSによって異なりますが、一般的には以下の場所に保存されています。

* MacOS/Linux：~/.npm または $HOME/.npm
* Windows：%AppData%\npm-cache

💡 以下のコマンドを実行することで、現在のキャッシュの場所を確認できます。
```bash
npm config get cache
```

## 🧷 npmのキャッシュの管理
npmは、キャッシュを自動的に管理しますが、必要に応じて手動で操作することも可能です。

### 🔖 キャッシュの確認
キャッシュの内容を直接確認することは推奨されていませんが、キャッシュの場所を確認することは上記の方法で可能です。

### 🔖 キャッシュのクリア
古いバージョンや不要になったパッケージのキャッシュをクリアすることで、ディスク容量を節約したり、予期せぬエラーを防ぐことができます。
キャッシュをクリアするには、以下のコマンドを実行します。
```bash
npm cache clean --force
```

💡 注意
* --force オプションは npm のバージョン 5 以降で必要です。以前のバージョンでは npm cache clean のみで実行できます。キャッシュのクリアは、問題解決の最終手段とすること。
* キャッシュのサイズ確認
npm自体には直接キャッシュサイズを確認するコマンドはありません。
利用しているOSのファイル管理ツールでキャッシュディレクトリのサイズを確認する必要があります。
* キャッシュの設定
npmのキャッシュに関する設定を変更することもできます。
例えば、キャッシュの有効期限や最大サイズなどを設定できます。
主な設定項目は以下の通りです。
    * cache: キャッシュディレクトリのパスを設定
    * cache-max: キャッシュの最大サイズを設定
    * cache-min: キャッシュの最小空き容量を設定
    * cache-lock-stale: キャッシュロックファイルの有効期限を設定

　　**※ `cache-max/min`は、npm のバージョンによってサポート状況が異なります。**

キャッシュの設定は、`npm config set <設定名> <値>`コマンドで変更可能。
例えば、キャッシュディレクトリを変更する場合は以下のようになります。

```bash
npm config set cache /path/to/new/cache
```

## 🧷 npmのキャッシュに関する注意点
* キャッシュはディスク容量を消費します。定期的にクリアすることを推奨します。
* キャッシュをクリアすると、次回以降のパッケージインストール時に再度ダウンロードが必要になるため、時間がかかる場合があります。
* パッケージのバージョンによっては、キャッシュに残っている古いバージョンが原因で問題が発生することがあるので、キャッシュをクリアしてから再度インストールを試してみてください。

## 🎉 まとめ
* npmのキャッシュは、主に**インストール時間の短縮・ネットワーク負荷の軽減・オフラインインストール**の解決に役立っている！
* npmのキャッシュの保管場所は`npm config get cache`で確認可能！
* パッケージインストールがうまくいかない時は、`npm cache clean --force`でキャッシュクリア

## 💫 参考文献
* [npmキャッシュ削除とインストール済みを削除して再インストール](https://ticklecode.com/npmcachedelete/)
* [いまさら聞けない！npmのこれだけは知っておきたい基礎知識](https://ascii.jp/elem/000/001/511/1511427/)
VPC構成におけるNATゲートウェイ活用と冗長化設計

## 背景

例として以下のようなネットワーク構成が要求されている場合：

- 1つのVPCに、2つの **パブリックサブネット** と 2つの **プライベートサブネット**
- 各サブネットは、**異なるアベイラビリティゾーン（AZ）** に分散
- **IPv4 CIDRブロック**を使用
- パブリックサブネットは **インターネットゲートウェイ経由で外部接続**
- プライベートサブネットに配置された **EC2インスタンスがインターネット経由でソフトウェア更新** を行える必要あり
- **高可用性（HA）構成**が求められる（単一障害点の回避）

---

## 要件

| 項目 | 内容 |
|------|------|
| インターネットアクセス | プライベートサブネット内のEC2がアップデートや外部通信を可能にする |
| 高可用性             | 単一のNATに依存せず、AZ障害時でも通信を継続できる構成にする |

---

## 解決策（AWS推奨構成）

| 対象 | 対応策 |
|------|--------|
| 各AZのパブリックサブネット | それぞれに **1つずつNATゲートウェイ** を作成 |
| プライベートサブネット | 対応するAZのNATゲートウェイに **ルートテーブルを紐付け** |
| 通信 | プライベートEC2 → NAT GW → インターネット（経由：パブリックサブネット） |

---

## ポイント解説

- **なぜNATが必要？**  
  プライベートサブネットは直接インターネットと通信できないため、NAT（Network Address Translation）を介して**外部へリクエストを転送**します。

- **なぜ複数NATゲートウェイ？**  
  単一のNAT Gatewayを使うと、そのAZが落ちた場合に**全通信が止まるリスク**があります。各AZに配置することで、**可用性を向上**させます。

- **パブリックサブネットとの違い**  
  パブリックサブネット内のEC2はインターネットゲートウェイを介して直接インターネットと通信できますが、プライベート側では**NAT経由**が必須です。

---
- 各プライベートサブネットは同じAZのNAT Gatewayにルーティング
- NAT Gatewayはパブリックサブネットに配置され、IGW経由で通信
---

## まとめ

この構成により、以下の要件をすべて満たすことができます：

| 要件 | 対応内容 |
|------|----------|
| プライベートサブネットのインターネットアクセス | NAT Gateway経由で可能にする |
| 高可用性構成                             | 各AZにNATを設置し、障害時も他AZから通信継続可能 |
nginx.conf error_log


error_log /var/log/nginx/error.log {設定レベル};
<table>
<tr>
<th rowspan="2">error_log<br>出力レベル</th>
<th colspan="8">nginx.conf設定レベル</th>
</tr>
<tr>
<th>emerg</th>
<th>alert</th>
<th>crit</th>
<th>error</th>
<th>warn</th>
<th>notice</th>
<th>info</th>
<th>debug</th>
</tr>
<tr>
<td><b>emerg</b></td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
</tr>
<tr>
<td><b>alert</b></td>
<td>-</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
</tr>
<tr>
<td><b>crit</b></td>
<td>-</td>
<td>-</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
</tr>
<tr>
<td><b>error</b></td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
</tr>
<tr>
<td><b>warn</b></td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
</tr>
<tr>
<td><b>notice</b></td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>出力</td>
<td>出力</td>
<td>出力</td>
</tr>
<tr>
<td><b>info</b></td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>出力</td>
<td>出力</td>
</tr>
<tr>
<td><b>debug</b></td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>出力</td>
</tr>
</table>


ログレベル	内容
debug	詳細なデバッグ情報を記録する。トラブルシューティングに役立つレベル。
info	サーバーの基本動作や一般的な情報を記録。通常の運用におすすめ！
notice	注意が必要だけど重大ではない事象を記録。
warn	潜在的な問題や警告を記録。
error	エラー情報を記録。ただしサーバーの動作は継続できるレベル。
crit	重大なエラーを記録。サーバーが危機的な状況にある場合。
alert	直ちに対応が必要な問題を記録。
emerg	サーバーが完全に動作不能な状況を記録。



エラーパターン	例	内容
404エラー	/index.html not found	リクエストしたファイルやページが存在しない
500エラー	Internal Server Error	サーバー内部での処理が失敗
セッションエラー	Session timed out	セッションが切れたり設定ミスが発生
アクセス拒否	Permission denied	権限不足でリソースへのアクセスが拒否される
プロキシエラー	Gateway timeout	プロキシサーバーとの通信に問題
やっかいなThe compiler is unable to type-check this expression

Xcode 16で突然 `The compiler is unable to type-check this expression` というエラーに遭遇したこと、ありませんか？  
何気なくコードを書いていると、ある日突然ビルドエラーが出る。しかもどこが原因なのか、すぐにはわからない…  
AIに丸投げしてコピペで聞いてみても、ほぼ原因は返ってきません。

そこで、今回は私が普段このエラーの原因を特定するためにやっている手順を共有します。  
結論からいうと、「怪しそうな箇所を一旦コメントアウトしていき、根気よく探して別メソッドや別ViewBuilderに切り分ける」ことで、かなり解決できることが多いです。
## 1. `onAppear` や `.onChange` の中身を順番にコメントアウトしてみる
- `onAppear { ... }` や `.onChange(of: xxx) { ... }` の中には、実際にいろいろな処理が書いてあると思います。
- これを **順番にコメントアウト** していってみて、どこでエラーが消えるかを確認します。
- もしコメントアウトしたタイミングでエラーが消えたなら、**そのコードを別メソッド** に切り分けて呼び出すようにすれば大抵解決します。  

SwiftUIだと、なぜか冗長な処理が入り組んでいるときにコンパイラがタイプチェックで迷子になることがあるんですよね。
下記のように少しずつコメントアウトしていきましょう。
```
// onAppear {
//     someComplexFunc()
//     // ↑ この部分をコメントアウトしてビルド
//     // 次は別の処理をコメントアウトしてビルド
// }
```
エラーが再現しなくなったら、該当部分を別のメソッドやファイルに分離すると割とうまくいきます。
## 2. `VStack` や `HStack` の中身を順番にコメントアウトしてみる
- もし `onAppear` や `.onChange` で原因が見つからなかったら、次は `VStack` や `HStack` などのスタック系の中身を疑ってみましょう。
- 同様に **順番にコメントアウト** してビルドし直して、いつエラーが消えるかをチェックします。
- これでどこかのViewが怪しいと分かったら、そこを **別の`@ViewBuilder`** に切り分けるようにすれば解決することが多いです。

SwiftUIのViewツリーが複雑になってくると、コンパイラが「表現しきれない！」と怒ってしまうのかもしれません。  
適度にViewを分割してあげるのが吉です。
こんな感じで少しずつコメントアウトして原因を探ります。
```
VStack {
    // View1()
    // View2()
    // ... 順番にコメントアウトしていき、原因箇所を特定
}
```
## 3. リファクタリングで変えた変数名を再チェックする
- 最後に、これが **個人的に一番ハマるパターン** です。
- 変数名やプロパティ名をリファクタリングで変更したとき、ちゃんと全部置き換わっていない可能性があります。
- 特に `@Binding` している変数や、ObservableObjectのプロパティなんかは、Xcodeのリファクタリングがうまく効かない場合があるんですよね…。
- Swift6だと@MainActor@Observableをつけたクラスのプロパティをリファクターしたときに$プロパティがうまく置き換わりません
- こうなると、意味不明なエラーが出たり、原因があちこちに隠れたりします。
- 1や2の手順をやってもなかなか解決しない場合、ほぼこれに当たっています。
- 
一度リファクタリングすると、そのあとにさらにコードを追加してしまいがち。  
気がついたときには原因箇所がたくさんある、なんてことも。  
そうなる前に、**@BindingやObservableObjectのプロパティ名が一致しているか** をこまめに確認するのが大事です。

## まとめ

`The compiler is unable to type-check this expression` は、
- **関数やViewの中身が複雑になりすぎている**
- **リファクタリングで名前が合わなくなっている**
などで割と起こりがちです。

**順番にコメントアウトして怪しいところを洗い出す**  
→ **別メソッド（または別View）に分割**  
→ **リファクタリング時の変数名の整合性も再チェック**  
という流れで、結構な確率で解決できます。

もし同じエラーで悩んでいる方がいたら、ぜひ試してみてください。  
やはり地道なアプローチが遠回りなようで一番手っ取り早いです。

以上、少しでも参考になれば幸いです！
📌 Set と Map の違いまとめ (JavaScript)  　初心者なりにまとめてみた！

ここ最近paizaの単語のカウント問題を解いていたけど、最終問題まで解けた！
段階的に解いていくうちに学んだ`Set`と`Map`について改めてまとめたい！

`JavaScript` の `Set` と `Map` はどちらもデータを格納するけど、用途や特性が異なる！
（いろいろ間違ってたらごめんなさい。(m´・ω・｀)m ｺﾞﾒﾝ…ぜひご教示ください(^^ゞ）

# <br>✅ Set（集合）

### 💡 特徴
- 値のみを格納（キーがない）
- 重複を許さない（同じ値は 1 つだけ）
- 要素の順序を保持（挿入順）
- 配列のように扱えるが、重複を排除したい場合に適している

### <br>🛠 主な操作
![スクリーンショット 2025-04-07 230554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4018208/4f29b9fa-355b-4f0e-af0f-e750e06edd38.png)
※見にくかったら、画像をクリックしたら見やすくなるかも

### <br>🔹 使用例
```js
const mySet = new Set();

// 値を追加
mySet.add("apple");
mySet.add("banana");
mySet.add("apple");  // 重複は無視される

console.log(mySet);  // Set(2) { 'apple', 'banana' }
console.log(mySet.has("apple"));  // true
console.log(mySet.size);  // 2

// 値を削除
mySet.delete("banana");

console.log(mySet);  // Set(1) { 'apple' }

// 全削除
mySet.clear();
console.log(mySet.size);  // 0
```

# <Br>✅ Map（連想配列 / ハッシュマップ）
### 💡 特徴
- キーと値のペア を格納できる
- キーにあらゆるデータ型を使える（オブジェクトや関数もOK）
- キーの順序を保持
- `Object` の代わりに使えるが、`Map` はキーを安全に扱える

### <Br>🛠 主な操作

![スクリーンショット 2025-04-07 230604.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4018208/037210e6-4887-460d-bb83-9d4ae43956d2.png)

### <br>🔹 使用例
```js
const myMap = new Map();

// キーと値を追加
myMap.set("name", "Alice");
myMap.set(123, "Number Key");
myMap.set({ obj: true }, "Object Key");

console.log(myMap.get("name"));  // Alice
console.log(myMap.get(123));  // Number Key

// キーの存在をチェック
console.log(myMap.has("name"));  // true

// キーを削除
myMap.delete(123);

console.log(myMap.size);  // 2
```

## <br>✅ Set と Map の違いまとめ

![スクリーンショット 2025-04-07 230157.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4018208/2c3a5525-38b0-4cca-9aed-d778c0e9389e.png)


## <Br>✅ どちらを使うべきか？

![スクリーンショット 2025-04-07 230207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4018208/95877825-e9f3-40c3-b23e-8a6333b90960.png)


## <br>✅ Set と Map を使った実践例
🔹 例1: 文字列の重複チェック（`Set`）
```js
const words = ["apple", "banana", "apple", "orange", "banana"];
const uniqueWords = new Set(words);
console.log([...uniqueWords]); // ['apple', 'banana', 'orange']
```
🔹 例2: 単語の出現回数カウント（`Map`）
```js
const words = ["apple", "banana", "apple", "orange", "banana"];
const wordCount = new Map();

words.forEach(word => {
    wordCount.set(word, (wordCount.get(word) || 0) + 1);
});

console.log(wordCount); 
// Map(3) { 'apple' => 2, 'banana' => 2, 'orange' => 1 }
```

## <Br>✅ まとめ

✔ `Set` は重複を排除し、値のコレクションを管理するのに最適
✔ `Map` はキーと値のペアを管理するのに最適
✔ 順序を保持したい場合、どちらも `for...of` で順番通り取得可能

これで `Set` と `Map` の違い がバッチリ理解できたね！ 🎯


<br><br><br>[僕の失敗談と解決談🚀](https://paizabeginner.wordpress.com/)
最新！Dockerで簡単WordPress環境構築！

## 概要
Docker上にWordPress環境を簡単に構築します。

## 環境
macOS Sequoia 15.3.1
Docker version 27.5.1
Docker Compose version v2.32.4-desktop.1
nginx 1.27
PHP 8.3
MariaDB 10.11
WordPress 6.7

## 構成

```sh
.
├── README.md
├── environments
│   ├── development
│   │   └── docker-compose.yml
│   └── docker
│       └── nginx
│           └── default.conf
└── web
    ├── index.php
    ├── license.txt
    ├── readme.html
    ├── wp-activate.php
    ├── wp-admin
    ├── wp-blog-header.php
    ├── wp-comments-post.php
    ├── wp-config-docker.php
    ├── wp-config-sample.php
    ├── wp-config.php
    ├── wp-content
    ├── wp-cron.php
    ├── wp-includes
    ├── wp-links-opml.php
    ├── wp-load.php
    ├── wp-login.php
    ├── wp-mail.php
    ├── wp-settings.php
    ├── wp-signup.php
    ├── wp-trackback.php
    └── xmlrpc.php
```

※ 表示の関係でwp-admin, wp-content, wp-includesの中身は割愛しています。

## 手順
### 1. docker-compose.yml作成

```docker-compose.yml
services:
  php:
    image: wordpress:6.7-php8.3-fpm
    container_name: wordpress
    restart: always
    volumes:
      - ./../../web:/var/www/html
    environment:
      WORDPRESS_DB_HOST: mariadb
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppass
    depends_on:
      - mariadb

  nginx:
    image: nginx:1.27
    container_name: nginx
    ports:
      - "8080:80"
    volumes:
      - ./../../web:/var/www/html
      - ../docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:cached
    depends_on:
      - php

  mariadb:
    image: mariadb:10.11
    container_name: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:
```

### 2. nginx設定ファイル

```nginx:docker/nginx/default.conf
server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass wordpress:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires max;
        log_not_found off;
    }
}
```

### 3. Docker起動
docker-compose.ymlがあるディレクトリにて以下を実行しましょう。

```shell
cd environments/development
```

```shell
docker compose up
```

### 4. 確認

http://localhost:8080 にアクセスして確認してみましょう。

http://localhost:8080/wp-admin/install.php にリダイレクトされてWordPressの初期設定画面が表示されます。

![スクリーンショット 2025-04-09 17.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/c8031cdd-23c6-49d2-a560-08200f30bc8f.png)
Microsoft Fabric 管理ポータル

[目次に戻る](https://qiita.com/taku_tachibana/items/35576a7aa1104182185c)
　
### ■前回の記事
[容量の一時停止/再開の自動化](https://qiita.com/taku_tachibana/items/d99f3e798841338b6f05)

### ■本記事の目的
今回は、Fabricの管理ポータルについてまとめていきます。
管理ポータルで、いくつか重要な機能を紹介します。

### ■概要
Microsoft Fabricのテナントにおける管理ポータルについて理解する。

### ■前提
今回は、特にありません。

### ■管理ポータルへのアクセスと権限
管理ポータルへは、設定　＞　ガバナンスと分析情報　＞　管理ポータル
でアクセスすることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/fa0587ff-5cbd-4c00-a2c1-5e5e568cb86b.png)

　
但し、権限によって、選べる管理メニューが異なります。
「**Fabric管理者**」という権限の有無で以下のような見え方になります。

　
Fabric管理者権限なし：「容量の設定」と「ヘルプとサポート」のみ選択できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/f6eccd36-a3f1-4395-8805-85432a43bc43.png)

　
Fabric管理者権限あり：より多くの管理メニューが参照・選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/3587d004-8444-47d8-952b-6ae58f986de3.png)

　
Fabricテナントレベルの設定を行うためには、
Fabric管理者の付与と後者の管理メニューが必要となってきます。


### ■Fabric管理者の付与
Fabric管理者を付与する方法を記載しておきます。
多くの場合、Microsoft Entra IDの管理者が操作することになると思います。
EntraIDの管理者の権限については、具体的に言及しませんが、
付与可能な管理者ユーザーに付与をいただいてください。

EntraIDのライセンスによって、
制限付きアクセス許可やPIMがあれば、そちらを検討してください。

　
管理者ユーザーがAzureログイン　＞　Microsoft Entra IDにアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/b427482c-2b5d-43bf-b5cb-8385a3c2065a.png)

　
今回はユーザーに対して付与します。
左メニュー　＞　管理　＞　ユーザー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/4bb1b64b-c503-48a6-bca0-4b30f5cc4a86.png)

　
検索欄でユーザーを検索　＞　対象ユーザー名をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/c6096e2c-506b-49c7-afe4-160a4a9783cc.png)

　
左メニュー　＞　割り当てられたロール　＞割り当ての追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/d2a72cf0-95f4-412b-9471-f2bd58bc3be2.png)

　
右のポップメニュー　＞　検索欄に「Fabric」を入力　＞　Fabric管理者にチェック　＞
追加　＞　割り当てまでに数秒ほどかかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/24c9a3b8-4ca3-45c9-ae92-f5e1f7d58a1e.png)

　
対象のユーザーに割り当てられたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/a2b57e61-c2aa-4ba2-82f4-99f4bd47066d.png)


　
次に重要な機能をいくつか記載しておきます。
### ■テナント設定
Fabricテナントレベルでの**設定事項を有効化/無効化**することが可能です。
設定項目100個以上あるため、すべてご紹介できませんが、
ユーザー・グループ対する機能の許可/拒否を設定します。
設定項目によっては、特定のセキュリティグループに許可/拒否を設定することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/88ab0d0a-3951-4ac8-8187-3b72e54a9789.png)


### ■ドメイン
ワークスペースをその目的・用途によってグループ化する機能です。
主にデータセキュリティやガバナンスのために作成するものとなります。
秘密度ラベルを使用して、アクティビティの監査ログを記録するなどを行えます。
※ドメインは、ワークスペースへのユーザー・グループアクセス制御は趣旨ではありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/895bdac4-dc95-4adf-8d34-e8900348278a.png)


今回の内容はここまでとなります。
次回はワークスペース内部のアクセス制御についてまとめます。

### ■次の記事
[ワークスペース内部のアクセス制御](https://qiita.com/taku_tachibana/items/2c72e617842da716b558)
　
　
[目次に戻る](https://qiita.com/taku_tachibana/items/35576a7aa1104182185c)
AWS CodeBuild で内蔵の containerd を使って nerdctl する

# 背景

CodeBuild を privilege モードで起動すると Docker が利用できるが、何らかの理由で docker 以外のコマンドを使いたい。
例えば [SOCI Index](https://aws.amazon.com/jp/blogs/news/under-the-hood-lazy-loading-container-images-with-seekable-oci-and-aws-fargate/) を CodeBuild 上で生成するため、 `nerdctl` コマンドを使えるようにしたい。

# 検証環境

- aws/codebuild/standard:6.0 ([Ubuntu 22.04](https://github.com/aws/aws-codebuild-docker-images/blob/1e24f33651ce49697c4e413b8bf2f2f1dae4df99/ubuntu/standard/6.0/Dockerfile#L11))

# ポイント

環境変数 `CONTAINERD_ADDRESS=/var/run/docker/containerd/containerd.sock` でセットする。

nerdctl がデフォルトで参照する containerd のソケットは `/run/containerd/containerd.sock` だが、CodeBuild は containerd をそことは異なるところに作成するため、明示する必要がある。

環境変数さえセットできれば、あとは nerdctl のバイナリを落としてきて通常通り nerdctl 経由の containerd でビルド・プッシュが可能。

# 備考

## CodeBuild で SOCI Index を作成する手順

### nerdctl で通常通りビルドする

### soci-snapshotter をインストールする (nerdctl-full を入れなかった場合)

```bash
wget --quiet https://github.com/awslabs/soci-snapshotter/releases/download/v${SOCI_SNAPSHOTTER_VERSION}/soci-snapshotter-${SOCI_SNAPSHOTTER_VERSION}-linux-amd64.tar.gz
tar -C /usr/local/bin -xvf soci-snapshotter-${SOCI_SNAPSHOTTER_VERSION}-linux-amd64.tar.gz soci soci-snapshotter-grpc
```

### nerdctl で soci index と一緒に Push

```bash
nerdctl push -q --snapshotter=soci $IMAGE_URI
```
turbo repoで環境変数の参照設定がめんどくさくなってきたとき

turbo repoではタスク実行時に参照する環境変数を、`turbo.json`に記載することで厳格に管理することができます。

https://turbo.build/docs/crafting-your-repository/using-environment-variables

環境変数を厳格に管理できるので、素晴らしい機能だと思います。
ただ、他で厳格に環境変数を管理できてたいたら二重管理だなと思う瞬間も人によってはいると思います。
そんな時に以下のコマンドを使うと、turborepoでの環境変数管理を無視できます。

```bash
turbo run build --env-mode=loose
```
optionで`--emv-mode=loose`を設定するだけです。

これをするとタスクごとの環境変数の管理ができなくなるので注意が必要ですが、そんなものは必要ないという状況では上記を実行してもいいかなと思います。
非同期処理続編(Flux, エラーハンドリング, block)

---

## はじめに

前回の記事では、`WebClient`を使ってOpenWeatherMap APIに非同期でアクセスする方法をご紹介しました。  
今回はその続編として、より深く**リアクティブプログラミングの基礎**である`Mono`と`Flux`、**エラーハンドリングの実践例**、そして**非推奨ながらblockする方法**について解説します。

---

## MonoとFluxとは？

`WebClient`はSpring WebFluxのリアクティブな仕組みの上で動作します。その中核となるのが以下の2つの型：

| 型 | 意味 | 用途例 |
|----|------|--------|
| `Mono<T>` | 0個または1個のデータを非同期に返す | APIの単一レスポンスなど |
| `Flux<T>` | 0個以上のデータ（ストリーム）を非同期に返す | リアルタイムログ、ストリーミングデータなど |

### Monoの例（天気情報1件）
```java
Mono<WeatherResponse> response = webClient.get()
    .uri("/weather?...") // パラメータ略
    .retrieve()
    .bodyToMono(WeatherResponse.class);
```

### Fluxの例（複数データをストリームで受け取る）
```java
Flux<String> stream = Flux.just("晴れ", "曇り", "雨");
```

---

## エラーハンドリングの書き方

API通信は常に成功するとは限りません。`WebClient`では、`onStatus()`などを用いてHTTPステータスごとのエラー処理が可能です。

### 実例：404などのエラー対応

```java
public Mono<WeatherResponse> getWeather(String city) {
    return webClient.get()
        .uri(uriBuilder -> uriBuilder
            .path("/weather")
            .queryParam("q", city)
            .queryParam("appid", apiKey)
            .queryParam("units", "metric")
            .build())
        .retrieve()
        .onStatus(HttpStatus::is4xxClientError, response -> {
            return Mono.error(new RuntimeException("クライアントエラー（都市名などを確認）"));
        })
        .onStatus(HttpStatus::is5xxServerError, response -> {
            return Mono.error(new RuntimeException("サーバーエラー"));
        })
        .bodyToMono(WeatherResponse.class);
}
```

### `.doOnError()`

```java
.doOnError(e -> log.error("API呼び出し中にエラー：{}", e.getMessage()))
```

---

## 非推奨：block()で同期的に取得する方法

非同期処理が基本ですが、「どうしても今ここで値を取り出したい」という場合は`block()`を使うこともできます。ただし**スレッドをブロックするため推奨されません**。

### 使用例（同期取得）

```java
WeatherResponse response = webClient.get()
    .uri("/weather?...") // パラメータ略
    .retrieve()
    .bodyToMono(WeatherResponse.class)
    .block(); // ★同期的に取得（注意）
```

> **注意**：WebFluxの世界ではなるべく`block()`を使わずに全体をリアクティブに設計するのがベストです。

---

## まとめ

- `Mono`：1件の非同期データ、`Flux`：複数件のストリームデータ
- `WebClient`でのエラーハンドリングは`onStatus()`や`doOnError()`を活用
- `block()`を使用する際は設計の見直しも含めて検討する

---
REST API の実装　アウトプット用

# 今回学んだこと
REST API の参照、登録、更新、削除をSpring BootでコーディングしARC(Advancerd REST Client)を用いて確認した。

## 1,REST API GET(参照)
<dl>
    <dt>Controllerクラス</dt>
    <dd>リクエストの入り口で、複雑な処理は基本書かない</dd>
    <dt>Serviceクラス</dt>
    <dd>業務処理のもととなる箇所、ビジネスロジック(3層アーキテクチャの一番大事な処理)はサービスクラスに実装する</dd>
</dl>    

```
@GetMapping("/url/{所得したいもの}）
public ~ (@PathVariable("所得したいもの")String 所得したいもの){
    return サービスのGETを返す;
}
```

### 重要なアノテーション
@RestController・・・コントローラークラスとして定義する。メソッドの戻り値が、レスポンスの戻り値となる
@GettMapping・・・Getリクエスト用のアノテーションvalue属性にURLのパスを指定する紐図いているメソッドが実行される
@Autowired・・・@Serivceクラスで設定したサービスを＠RestControllerで簡単に呼び出せる
@PathVariable・・・特定の商品番号情報を所得するといったケースで、動的にURLに値を指定する使用を実装する。

## 2,REST API POST(参照)

@PostMappingでAPIのURLを指定して＠RequestBodyアノテーションでjson形式で受け取ることを指定する

```
@PostMapping("/url"）
public void ~ (@RequestBody serviceで所得するものを呼び出す){
    サービスのaddを返す;
}
```

## 3,REST API　PUT（更新）

@PutMappingでURLを指定して@RequestBodyでjson形式を受け取る、その後、@PathVariableで指定された更新キーを取得する。

```
@PostMapping("/url/{所得したいもの}"）
public void ~ (@RequestBody serviceで所得するものを呼び出す, @PathVariable("所得したいもの")String 所得したいもの){
    サービスのidとアイテムを返す;
}
```

## 4,REST API DELETE（削除）

@DeleteMappingでURLを指定して@PathVariableで指定された削除キーを取得する

```
@DeleteMapping("/url/{所得したいもの}"）
public void ~ (@RequestBody serviceで所得するものを呼び出す, @PathVariable("所得したいもの")String 所得したいもの){
    サービスのidとアイテムを返す;
}
```
## 5,まとめ
Spring Bootを使って基本的なREST APIの設計を行なった、Spring Bootではどのアノテーションがどんな働きを持っていることが重要であり、パッケージを分けることによってそれぞれのプログラムがどんな役割でどのような働きをしているかをわかりやすく設計することが大切であることを学んだ。
【応用情報】OP25Bとサブミッションポート

## OP25Bとサブミッションポート
　**OP25B**(**Outbound Port 25 Blocking**)は、外部に向けて送信される宛先ポート番号が25番のIPパケットのうち、ISP自身のメールサーバ以外から送信されるIPパケットを遮断する。OP25Bはスパムメール対策になるが、一方で、別のISPにも契約している利用者がメールを送れなくなるといった不都合が生じる。そこで、OP25Bの影響を受けずに外部のメールサーバを使用したメール送信を可能にするのが**サブミッションポート**である。サブミッションポートとは、メール送信の際に用いる専用のTCPポートで、SMTP-AUTHなどによる利用者認証を行えるポートである（通常、587番ポート）。外部のメールサーバへはサブミッションポートを使ってメールを送信し、**SMTP-AUTH**などで認証を経ればメール送信が出来る。

## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
令和06-07年 応用情報技術者 試験によくでる問題集【午後】 単行本（ソフトカバー） – 2024/3/22
大滝 みや子 (著)
p.56
WindowsでCapsLockをCtrlにする

# はじめに
Windows PCを使うときにCapsLockキーをCtrlキーに変更する方法をまとめました。

# Ctrl2Capをダウンロード
[Ctrl2Cap](https://learn.microsoft.com/ja-jp/sysinternals/downloads/ctrl2cap)
1. まずはダウンロード。
2. zipファイルを展開する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935750/f0452735-84c7-4bdc-a357-5ddc4f056d5b.png)

# コマンドプロンプトでインストール
1. コマンドプロンプトを管理者として実行で開く。
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935750/0d690550-882a-4f6a-9d69-bd7138430fc4.png)

2. 先ほどのファイルを展開したディレクトリに移動して、インストールするコマンドを実行する。
    ```bash
    ctrl2cap /install
    ```
![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935750/300749cb-0086-4ca8-9f26-9bbfb81c30d3.png)

PCの再起動をすれば、変更されているはず！

# PowerToysと併せて使う
Microsoft StoreでPowerToysと検索して、インストール。
![image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935750/9a88fae7-7690-4a58-b7fb-67ed6a2e6d1b.png)

PowerToysにはたくさんの機能があるので、色々使ってみるといいかも。
![image (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935750/95a0d9b1-5d11-433a-83db-3dee5c2953da.png)

今回は、Keyboard Managerを紹介。
![image (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935750/acbbc911-5629-4dc0-b1f3-9d97987fafb3.png)

例えば、Ctrl＋HキーでBackspaceにしたいとき
![image (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935750/5c016b83-dd08-4152-9332-6057140dc4b8.png)

こんな感じで、ショートカットを設定していく。

他にも組み合わせるとMac風のショートカットが作れるかも！

## Mac風のキーバインドを作るには？
Macにもコントロール(control)キーはありますが、cmd(コマンド)キーというものも存在します。
修飾キーが1個多いという感じでしょうか。

cmd＋Aと打った時と、control＋Aと打った時では動作が異なります。Macではうまくこれらのキーを使い分けていろいろなショートカットが実現できるのです。

しかし、WindowsでCapsLockをCtrlに変えるだけだと、Macのcmdキーのようなものが増えたことにはなりません。
私のおすすめは、**CapsLockキーに全く使わないキーを設定する**ことです。
例えば、F14とかF15とか。。。
そして、F14＋Fで「→」キーを再現する、というショートカットを作ればいいですね。
この方法なら、PowerToysだけで実現できます！

# 終わりに
PowerToysだけでもCapsをCtrlに変更することは可能です。
ただし、変更後にCapsキーを押したら、Ctrlキーを押して入力待ち状態になってしまいます。
つまり、Capsを一回押して、離して、Aキーを押すと全選択が効いてしまうということです。これは不便です。
単純にCapsLockキーをCtrlキーにしたいのなら、Ctrl2Capと組み合わせて使うのがいいと思います。
Mac風にしたければ、CapsLockキーに全く使わないキーを設定する方法が良いでしょう。

以上、読んでいただきありがとうございました。
DMBOKをちゃんと読もう①：DMBOKの位置づけ

※筆者はDMBOK関連の資格は取得していません

DMBOK、日本語版で600P以上ある巻物。
データマネジメント、データ利活用に関わる人ならちゃんと読むべき…ですが、実態としては読めていない人が大半なはず。ちゃんと読んで、内容をかいつまみつつ、自分のためにまとめていきたいと思います。

初回は、DMBOKの位置づけ

## DMBOK？
DMBOK（Data Management Body of Knowledge）は、データマネジメントの全体体系をまとめた知識体系。
Data Management Association（DAMA）は、世界各地に支部を持つ、全世界のデータ専門家のための国際的な非営利団体で、このDAMAからデータマネジメントプロフェッショナルにとって有益な資料かつ指針として刊行されている書籍です。企業がデータを効果的に管理し、使用するためのフレームワークと基準、データガバナンス、データ品質、データアーキテクチャ、データモデリング、データストレージと運用など、多くの重要なトピックについて詳細に説明しています

## ビジネスに関連する知識体系の中のDMBOK
「ビジネスに関連する知識体系」の中で位置づけると、以下のような関係性になります

DMBOKの位置づけ（ビジネス知識体系との関係）
■ ビジネス全体の知識体系の大まかな分類
①経営/戦略・・・・MBA体系、バランススコアカード、SWOTなど企業戦略や経営判断に関する枠組み
②業務プロセス/業務改善・・・BPM（Business Process Management）、LEAN、Six Sigma など	業務フローの最適化や改善
③IT/情報システム管理/プロジェクトマネジメント・・・・ITIL、COBIT、TOGAF、PMBOK、BABOK	ITガバナンス、アーキテクチャ、プロジェクト管理、業務分析など
④データ/情報活用・・・DMBOK, DCAM, CMMI-DA など	データガバナンス、品質、メタデータ管理、マスターデータ管理など

DMBOKは「データ/情報活用」領域に属する専門知識体系で、
IT戦略やデジタル活用の「土台」となる情報資産（データ）を適切に管理・活用するための体系です。

経営層が掲げる「データドリブン経営」「DX推進」などを実現するための具体的なやり方を提供し、データ活用を阻む「サイロ化」「品質不良」「責任不在」といった課題を、組織横断的にガバナンス・ルールを通じて解決します。
※DMBOKは、ビジネス全体で言えば「インフラ・ガバナンス側」に寄っていて、MBAやPMBOKが“やりたいこと”を示すのに対し、DMBOKは“そのためにデータをどう扱うか”の裏方を整える指南書です。
ただし、長くて重くて良く分からない・・・のが欠点。というわけで、次回からは中身の話を整理していきます。
ストリーミングデータを加工してS3に保存：Kinesis Data Firehose + Lambda構成ガイド

## 概要

**リアルタイムデータの蓄積と加工**は、ログ分析、モニタリング、機械学習前処理など、多くのユースケースで重要な要素です。

本記事では、**Amazon Kinesis Data Firehose** と **AWS Lambda** を用いて、次のような構成を実現する方法を紹介します：

- **リアルタイムでストリーミングデータを取り込み**
- **必要なデータ加工処理をLambdaで自動化**
- **処理済みデータをS3に永続化**

このアーキテクチャは、**完全サーバレス**でスケーラブルな設計が可能であり、初期構築や運用の手間を最小限に抑えることができます。

---

## システム構成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2360194/6a3f94dd-b094-4d1c-a819-ff441cc5a5d1.png)


---

## データ処理の流れ

1. **データ送信元** は、Firehose の Delivery Stream に対して HTTP API などを用いてデータを送信します。
2. **Firehose** は、受信したデータをリアルタイムで **Lambda 関数** に渡します。
3. **Lambda 関数** 内では、データ整形・バリデーション・フィールドの追加や変換など、自由に加工処理を実装可能です。
4. 加工が完了したデータは、**Amazon S3** に自動で格納され、後続のバッチ処理やAthenaなどによるクエリ分析に活用できます。

---

## Lambda 変換関数のサンプル（Python）

```python
import json
import base64

def lambda_handler(event, context):
    output = []
    for record in event['records']:
        # Base64デコードしてJSONとしてパース
        payload = json.loads(base64.b64decode(record['data']))

        # 加工処理：例としてタイムスタンプの追加
        payload['processed_at'] = context.aws_request_id

        # 加工後のデータを再エンコード
        encoded_data = base64.b64encode(json.dumps(payload).encode('utf-8')).decode('utf-8')

        output_record = {
            'recordId': record['recordId'],
            'result': 'Ok',
            'data': encoded_data
        }
        output.append(output_record)

    return {'records': output}
    
```
---

## Firehose の主な設定項目

| 設定項目               | 内容                                                                 |
|------------------------|----------------------------------------------------------------------|
| **Delivery Stream Type** | Direct PUT または Kinesis Stream 経由を選択可能                        |
| **Lambda 関数指定**       | 加工処理用のLambda関数を指定（リアルタイム変換を有効化）                 |
| **S3 設定**               | 保存先バケット、キーPrefix、圧縮（GZIPなど）の指定が可能                 |
| **ログ設定**             | CloudWatch Logs にFirehose処理結果を出力してデバッグや監視が可能          |

---

## なぜこの構成が有用なのか？

| 特徴       | 説明                                                                 |
|------------|----------------------------------------------------------------------|
| **完全サーバレス** | EC2やECSを使用せず、スケーラブルで保守不要なデータパイプラインが構築可能 |
| **拡張性**       | Lambdaのロジック変更で柔軟にデータ加工処理をアップデート可能               |
| **コスト効率**   | バッチ転送＆圧縮でストレージコストや転送コストを最小限に                     |
| **保守性**       | マネージドサービス活用により、スケーリング・パッチ・稼働監視が不要           |

---

## まとめ

| ユースケース                         | 説明                                                                 |
|--------------------------------------|----------------------------------------------------------------------|
| **Webログの整形と分析保存**         | JSON形式に変換し、AthenaやQuickSightでのクエリ分析が可能に           |
| **IoTセンサーのデータ拡張と蓄積**    | 不要フィールド除去やメタ情報追加などをLambdaで前処理                  |
| **ユーザー操作ログのフィルタ保存**   | 特定イベントや操作のみを抽出して保存し、後続分析を効率化               |

Lambdaによるデータ前処理をFirehose内で実現することで、**後続のバッチ処理やBI分析を意識したデータ構造をS3に直接格納**できます。拡張性・保守性・運用効率の三拍子が揃ったサーバレスアーキテクチャです。
【初心者向け】Amazon ECSとECRとは？Dockerとの関係もスッキリ解説！

# 【初心者向け】Amazon ECSとECRとは？Dockerとの関係もスッキリ解説！

近年、アプリケーションの開発・運用において「コンテナ」が当たり前のように使われるようになってきました。AWSでは、この**コンテナを簡単＆効率的に動かすためのサービス**が提供されています。

その代表が…

- **Amazon ECS（Elastic Container Service）**  
- **Amazon ECR（Elastic Container Registry）**

この2つです。

でも、「ECS？ECR？何それ？」「Dockerと何が違うの？」と迷う方も多いはず。この記事では、**Dockerの基礎から、ECSとECRがどう関係しているのか、超わかりやすく解説**していきます！

---

## 1. コンテナって何？

まず「コンテナ」ってそもそも何？という話から。

> 一言で言うと、「アプリを動かすための環境をまるごと箱に詰めたもの」。

通常、アプリを動かすには、OSやミドルウェア、ライブラリなど色んな部品が必要です。コンテナはそれらを全部ひとつにまとめて、どこでも同じように動かせるようにしたパッケージのような存在です。

---

## 2. Dockerとは？

この「コンテナ」を作ったり管理するためのツールが **Docker** です。

### Dockerの主要な概念：

| 概念         | 説明 |
|--------------|------|
| イメージ      | コンテナの「設計図」。アプリや環境の中身が詰まったテンプレート。 |
| コンテナ      | 実際に起動された「アプリ本体」。イメージをもとに動く。 |
| Dockerfile   | イメージを作るための「レシピ」ファイル。 |
| Docker Hub   | いろんなイメージを公開・取得できる「倉庫」。 |
| コンテナレジストリ | Dockerイメージを保存・管理する「保管庫」 |

---

## 3. Amazon ECRとは？

> **Amazon ECR = AWSが提供するプライベートなDockerイメージの保管庫**です。

Docker Hubが誰でも使える「パブリックな倉庫」なのに対し、ECRはAWS上でセキュアにイメージを保管できる**マイ倉庫**のようなもの。

### ECRのポイント

- DockerイメージをAWS上に安全に保存
- IAMでアクセス管理できる
- ECSやFargateとスムーズに連携できる

### イメージをECRにアップする流れ

1. リポジトリ作成
2. AWS CLIでログイン
3. Dockerイメージをビルド
4. タグを付ける
5. `docker push` でアップロード！

---

## 4. Amazon ECSとは？

> **ECS = DockerコンテナをAWS上で動かすサービス**です。

アプリをコンテナ化したら、次はそれを「どう動かすか」が大事。ECSは、複数のコンテナを**まとめて起動・管理・スケーリング**するためのサービスです。

---

## 5. ECSの主要な構成要素をわかりやすく解説！

ここがちょっと複雑なので、例え話で覚えるのがオススメです！

| ECSの構成要素   | たとえ話 | 内容 |
|----------------|-----------|---------------------------|
| クラスター      | 土地・敷地 | コンテナを動かすための場所 |
| タスク定義      | レシピ・設計図 | どんなアプリをどう動かすか |
| タスク          | 実際の料理 | 起動されたアプリの実行単位 |
| サービス        | 店長・マネージャー | タスクを維持・管理する役割 |

---

## 6. コンテナの実行方法（ECSでは2通り）

ECSでコンテナを動かすには、以下の2パターンがあります。

### ✅ タスクから直接実行（1回きり）

- バッチ処理や短期的な処理に向いている
- 終わったら自動で終了する

### ✅ サービスから実行（常駐）

- Webアプリなど、**常に動かし続けたい処理**に最適
- 落ちても自動で復旧してくれる

---

## 7. FargateとEC2の違いって？

ECSでコンテナを実行するには、どのような**「土台」**で動かすかも選べます。

| 起動タイプ       | Fargate（おまかせ） | EC2（自分で管理） |
|------------------|----------------------|-------------------|
| サーバー管理     | 不要（完全サーバレス） | 必要（自前で管理） |
| スケーリング      | 自動で簡単 | インスタンス数を調整する必要あり |
| SSHアクセス      | できない | 可能（トラブル対応しやすい） |

---

## 8. まとめ：ECS + ECR + Dockerで始めるモダンなアプリ開発

AWSでモダンなアプリケーションを開発・運用するなら、**Dockerで作ったアプリをECRに保存し、ECSで実行する**のが王道です。

初心者のうちは以下の流れを覚えておけばOK！

```text
Dockerfileを書く
↓
Dockerでイメージをビルド
↓
ECRにPush
↓
ECSのタスク定義に登録
↓
サービスで起動！（もしくはタスク実行）
```

最初は難しそうに見えるかもしれませんが、一度流れを掴んでしまえばとても強力な仕組みです！

---

## 最後に：とりあえず「動かしてみよう！」

ECSやECRは、実際に使ってみると「なるほどこういうことか！」と理解が深まります。

「まずは小さなWebアプリをDocker化して、Fargateで動かしてみる」くらいの小さな一歩からはじめてみましょう！
【応用情報】標的型攻撃メールの特徴

## 標的型攻撃メールの特徴
　**標的型攻撃メール**には、次のような特徴がある。
・実在する信頼出来そうな組織名や個人名あるいは関係者を装った差出人になっている。
・受信者の業務に関係の深い話題や、受信者が興味を引くような内容が記述されている。
・ファイル名に細工を施し、実行形式ファイルを別形式と偽って開かせようとする。
・毎回異なる内容で、長期間にわたって標的となる組織に送り続けられる。
　なお、ファイル名を偽装する代表的な手口の一つに、**RL Trap**がある。これは、文字の並び順を変えるUnicodeの制御文字RLO(Right-to-Left Override)を利用した手口である。例えば、ファイル名「ABCfdp.exe」の3文字目の「C」と4文字目の「f」の間にRLOを挿入すると（RLO自体は見えない）、ファイル名の見た目が「ABCexe.pdf」に変わる。RLTrapでは、これを利用してファイル名を偽装する。

## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
令和06-07年 応用情報技術者 試験によくでる問題集【午後】 単行本（ソフトカバー） – 2024/3/22
大滝 みや子 (著)
p.56
【応用情報】S/MIME(Secure/Multipurpose Internet Mail Extensions)

## S/MIME(Secure/Multipurpose Internet Mail Extensions)
　S/MIME(Secure/Multipurpose Internet Mail Extensions)は、電子メールの暗号化とデジタル署名（電子署名）に関する標準規格である。S/MIMEは、共通鍵暗号と公開鍵暗号を併用するハイブリッド暗号方式である。つまり、S/MIMEでは、メール本文や添付ファイルの暗号化には処理速度が速い共通鍵暗号を利用し、暗号化に用いる共通鍵の受け渡しには安全性の高い公開鍵暗号を用いる。

### S/MIMEを使用したメールの暗号化と復号の手順
送信者：1.共通鍵を生成し、その共通鍵でメール内容を暗号化する。
　　　　2.受信者の公開鍵で共通鍵を暗号化する。
　　　　3.1.で暗号化したメール内容と、2.で暗号化した共通鍵を送信する。
受信者：4.暗号化されている共通鍵を自身の秘密鍵で復号する。
　　　　5.復号した共通鍵を使ってメール内容を復号する。

## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
令和06-07年 応用情報技術者 試験によくでる問題集【午後】 単行本（ソフトカバー） – 2024/3/22
大滝 みや子 (著)
p.53
linuxでフルパスを含むファイル名を取得する

サーバオペレーションしているとそのファイルのフルパスが欲しくなる時ありますよね。
teratermでscpしようとしているときとか...

そんなときは
<b>readlink -ev hoe.txt</b>

-evをつけるとファイルが存在しないときエラーを出しながら、ファイルのフルパスを表示してくれます。
ChatGPT活用記事(文章作成など)

自分用のメモとして

## 文章作成

東京都作成のガイドライン

https://www.digitalservice.metro.tokyo.lg.jp/business/ai/ai-guideline

→上記への突っ込み資料

https://note.com/sa1p/n/n135727ee8aa8

→さらに、デジ庁含めてGeminiで整理した資料

https://note.com/pogohopper8/n/nfaca0cae6fab

noteを書くときに使えるプロンプト(文章作成系)

https://note.com/fladdict/n/n808e4246f01b

## インプット・調査系

Chat GPTを最強の学習ツールにする方法

https://qiita.com/tak001/items/7605f0be7b424118e5a5

【ChatGPT】エンジニアがChatGPTを最大限に活用するための方法

https://qiita.com/star09036/items/8517d74f36287e778009

DeNA南場会長が生成AIツールを使い倒している件について

https://qiita.com/ouQVZUDx/items/9ce7e1f528d3a0e61907

## ガバナンス系

https://note.com/weel_media/n/nf0172973896c

https://www.ipa.go.jp/jinzai/ics/core_human_resource/final_project/2024/generative-ai-guideline.html

https://www.jdla.org/document/
【Model】演習１

## 背景

https://qiita.com/koreyuki_akao/items/659185f8bd3dbabf9e8e

## この演習のゴール

- モデル（テーブル）の追加ができるようになること

## 完成図

![06_Model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054073/da5e9f62-b88a-46c2-b9fe-5d5b0e5b4b6f.png)


## 用語

| 用語            | 説明                                                                |
|-----------------|--------------------------------------------------------------------|
| models.Model　 　| Djangoの全てのモデルの親クラス。これを継承することでORM機能を使える|
| CharField()     | 文字列用のフィールド。max_lengthで文字数制限を指定。                     |
| IntegerField()  | 整数値を保存するフィールド。年齢や得点などに使われる。                   |
| ForeignKey()    | 他のモデルとの「1対多」関係を作る。リレーションを構築できる。             |
| class Meta:     | モデルのメタ情報（テーブル名・並び順など）を定義する内部クラス。         |
| db_table        | 実際にDB上で使われるテーブル名を指定。省略時は「app名_モデル名」になる。  |
| on_delete=models.CASCADE        | 親が消されたら、子も自動で消える。親 → 子 に影響が波及（カスケード）する  |

## 手順

### models.pyを編集

```python:models.py
from django.db import models

# クラス
class Classes(models.Model):
  name = models.CharField(max_length=50)
  
  class Meta:
    db_table = 'classes'

# 学生
class Students(models.Model):
  name = models.CharField(max_length=50)
  grade = models.IntegerField()
  class_fk = models.ForeignKey(Classes, on_delete=models.CASCADE)
  
  class Meta:
    db_table = 'students'
    
# テスト
class Tests(models.Model):
  name = models.CharField(max_length=50)
  
  class Meta:
    db_table = 'tests'
    
# テスト結果
class TestResults(models.Model):
  score = models.IntegerField()
  student_fk = models.ForeignKey(Students, on_delete=models.CASCADE)
  test_fk = models.ForeignKey(Tests, on_delete=models.CASCADE)
  
  class Meta:
    db_table = 'test_results'
```

### モデルの変更を記録

```bash:zsh
python manage.py makemigrations アプリ名
```

### DB反映

```bash:zsh
python manage.py migrate アプリ名 
```

### DBの確認

- 期待：「Classes」「Students」「Tests」「TestResults」が追加されていること
#### VSCode拡張「SQLite」で確認するが…ない？？
    
   ![スクリーンショット 2025-04-09 16.00.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054073/c93fb59f-8273-4c09-bd9e-0f65d94daa31.png)

:::note info
解決：【DB再起動】
db.sqlite3 を右クリック → 「Close Database」 を選択
再度 Open Database で db.sqlite3 を選択し直す
:::

    
#### ターミナルから確認
    
SQLiteシェルを開く
    
```bash:zsh
python manage.py dbshell
```
    
テーブルの確認
    
```bash:zsh
sqlite> .tables
```

    
#### 結果（あった😮‍💨）
拡張機能の不具合かしらん？
    
```bash:zsh
sqlite> .tables
auth_group                  django_admin_log          
auth_group_permissions      django_content_type       
auth_permission             django_migrations         
auth_user                   django_session            
auth_user_groups            **students**                  
auth_user_user_permissions  **test_results**              
**classes**                     **tests**
```
    
シェルを閉じる
    
```bash:zsh
sqlite> .quit
```
    

## 所要時間

- 15分
PythonでOpenImageIO(OIIO)と.ocioファイルを使ってACESな色空間を変換する

# 自己紹介
株式会社digitalbigmoのパイプラインエンジニアの小池@plinecomです。

# これは何？
OpenEXRでは色空間としてACESを使うことが多いんだけれど、ACESにもイロイロ種類があるので相互変換できるようにしたいと思った。


# とりあえず、コード
```python:main.py
import OpenImageIO as oiio
import glob
import os

if __name__ == '__main__':

    for path in glob.glob('C:/EXR/ACES2065_1/*.exr'):

        output_folder = os.path.join(os.path.dirname(path) , 'ACEScg')
        os.makedirs(output_folder, exist_ok=True)
        output_path = os.path.join(output_folder, os.path.basename(path))

        print(output_path)

        #Read File
        buf = oiio.ImageBuf(path)

        #Convert ColorSpace
        dst = oiio.ImageBufAlgo.colorconvert( buf, "ACES2065-1", "ACEScg",
                                      colorconfig='studio-config-v2.2.0_aces-v1.3_ocio-v2.4.ocio')

        #Write File
        dst.write(output_path)

```

# 必要なPython外部モジュール
* OpenImageIO

# コードの説明

## 色空間の変換方法の指示
```python:
        dst = oiio.ImageBufAlgo.colorconvert( buf, "ACES2065-1", "ACEScg",
                                      colorconfig='studio-config-v2.2.0_aces-v1.3_ocio-v2.4.ocio')
```
[OCIO](https://github.com/AcademySoftwareFoundation/OpenColorIO-Config-ACES/releases)で配布されているの.ocioファイルを読み込ませて、変更元のカラースペースACES2065-1と変更後のカラースペスACEScgを指定して変換している。

## .ocioファイルが沢山有ってよく分からないよぅ
私もよく分からない。なんとなく調べた感じによると、、
- studio版とCG版というのがあって、studio版の方が精密らしい。
- バージョンっぽいものが3つもある。前から順に
    - .ocioファイルのバージョン
    - 対応するACESのバージョン
    - 対応するOpenColorIOプログラムのバージョン
 
# 宣伝
株式会社digitalbigmoでは美肌プラグインの販売や映像VFXの制作業務を行なっています。ご興味のある方は、webページを見にきてください。一緒にお仕事しましょう。

https://digitalbigmo.com

# 参考文献
[OpenImageIO本家（英語）](https://sites.google.com/site/openimageio/home)
[OpenImageIO本家リファレンス（英語）](https://openimageio.readthedocs.io/en/latest/imagebufalgo.html#color-space-conversion)
unzipの進捗状況をプログレスバーで表示させる

大量のファイルを包んだ zip ファイルを `unzip`コマンドで展開すると，大量のファイル名がズラズラと表示され，その出力処理のオーバーヘッドで，時間が無用にかかってしまいます。

```sh
$ unzip LargeArchive.zip -d DestDir
Archive:  LargeArchive.zip
   creating: ...
   （以下大量にファイル名表示の行が続く）➡ 時間が無用にかかる！
```

`unzip` に `-q` オプション(quiet)を渡せば出力を消して黙らせることができますが，すると今度は展開処理中に反応がなく止まってしまい，あたかもフリーズしたように見えてしまいます。

理想は，進捗状況を表すプログレスバーが表示されることですが，残念ながら `unzip` の標準機能ではそのような機能は用意されていません。そこで，[Pipe Viewer](https://www.ivarch.com/programs/pv.shtml)（`pv`コマンド）を噛ませることで，プログレスバー表示の `unzip` を実現しましょう。

# `pv` コマンドのインストール

`pv` コマンド(pipe viewer)を，何らかの方法でインストールします。

### Homebrew

```sh
brew install pv
```

### MacPorts

```sh
sudo port install pv
```

### ソースから (`configure` & `make`)

[公式サイト](https://www.ivarch.com/programs/pv.shtml)に `configure` & `make`によるソースコードからのビルド手順の解説があります。

Universal Binary としてビルドする手順は次の記事に記しました。

https://qiita.com/doraTeX/items/34ebe4b485128b10fa4d


# `pv` & `unzip` のラッパーとなるシェル関数を定義

`pv_unzip` というシェル関数を，次のように定義します。

```bash
function pv_unzip() {
  local unzip_opts=()
  local zipfile=""
  local outdir=""

  # 引数を解析
  while [[ $# -gt 0 ]]; do
    case "$1" in
      -*)
        unzip_opts+=("$1")
        shift
        ;;
      *)
        if [[ -z "$zipfile" ]]; then
          zipfile="$1"
        elif [[ -z "$outdir" ]]; then
          outdir="$1"
        else
          echo "Too many arguments" >&2
          return 1
        fi
        shift
        ;;
    esac
  done

  # 引数チェック
  if [[ -z "$zipfile" ]]; then
    echo "Usage: pv_unzip [unzip options] zipfile.zip [output_dir]" >&2
    return 1
  fi

  # outdir が未指定の場合はカレントディレクトリを使用
  if [[ -z "$outdir" ]]; then
    outdir="."
  fi

  # ファイルとディレクトリの存在チェック
  if [[ ! -f "$zipfile" ]]; then
    echo "Error: '$zipfile' does not exist or is not a file" >&2
    return 1
  fi
  if [[ ! -d "$outdir" ]]; then
    mkdir -p "$outdir" || { echo "Error: Cannot create '$outdir'" >&2; return 1; }
  fi

  # pv の存在確認と処理の分岐
  if command -v pv >/dev/null 2>&1; then
    # pv がある場合：進捗表示付きで展開
    local total_files
    total_files=$(unzip -l "$zipfile" | sed -n '/-----/,/-----/p' | sed '1d;$d' | wc -l)
    unzip "${unzip_opts[@]}" -d "$outdir" "$zipfile" | pv -l -s "$total_files" > /dev/null
    local unzip_status=${PIPESTATUS[0]}  # unzip の終了ステータスを取得
    return "$unzip_status"
  else
    # pv がない場合：通常の unzip で展開
    unzip "${unzip_opts[@]}" -d "$outdir" "$zipfile"
    return $?  # unzip の終了ステータスをそのまま返す
  fi
}
```

この中で，
```bash
total_files=$(unzip -l "$zipfile" | sed -n '/-----/,/-----/p' | sed '1d;$d' | wc -l)
```    
の部分は，zipアーカイブ内の総ファイル数を取得しています。ヘッダ行などファイル名以外の部分を除外するために，`-----` で囲まれたファイルリスト部分を取り出し，最初の1行(`-----`)と最後の1行(`-----`)を削除(`sed '1d;$d'`)して，その行数をカウント(`wc -l`)することで，zipアーカイブ内の総ファイル数を調べているわけです。

# 使い方

```
pv_unzip [unzip options] ARCHIVE.zip [output_dir]
```

* `-o` (overwrite) のようなオプションを指定すると，それがそのまま `unzip` コマンドに伝えられます。
* ただし，本来の `unzip` コマンドにある `-d`（出力先ディレクトリ）オプションは不要で，第2引数に出力先ディレクトリを指定します。
* 第2引数（出力先ディレクトリ）の指定を省略した場合は，カレントディレクトリに展開されます。
* `pv` コマンドがインストールされていない場合は，普通の `unzip` コマンドにフォールバックされます。

# 動作中の様子

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41739/1bf4d2d7-1d2a-4f9a-81ae-666d0ceb6ebd.png)
MCreator/バイオーム・ディメンション

#前の記事：https://qiita.com/yt365/items/476698203bbc8e56daeb
今回はバイオームとディメンションを作っていきます。
## この記事で分かること
・MCreatorでバイオームを作る方法
・MCreatorでディメンションを作る方法
## バイオーム
＋ボタンを押してバイオームを選びます。![2025-04-08_11h03_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/5f160f99-6eb5-48e4-ab37-8ae25e8c0104.png)
名前を入力して作成します。
大気の色や草の色を設定します。
![2025-04-09_15h44_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/49dfc723-1a46-4dbc-b56a-fbf3398b3f73.png)
下の生成ボタンを押して、地表のブロックや地下のブロックを設定します。![2025-04-09_15h45_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/4d7e12e1-ba17-4996-a9b8-e92395576b76.png)
バイオームを生成させる場所にチェックを入れていきます。
生成される木を設定します。
![2025-04-09_15h48_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/02f479fc-5343-4b75-b1f9-3c6c6bc8619d.png)
建造物などを設定したら右上の保存ボタンを押します。
## ディメンション
＋ボタンからディメンションを選びます。
ディメンションの名前を入力して作成します。
地面のブロックや液体ブロックなどを設定します。
今回、ワールドの生成タイプは変更しません。
![2025-04-09_15h50_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/f5bae9a9-d984-485b-baa6-4995345c7b20.png)
下のボタンからポータル設定にします。
ポータルの有効化をオフにします。
![2025-04-08_11h55_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/ce6c47ee-c36a-402d-9902-59d9d5af49e0.png)
右上のボタンで作った要素を右上の保存ボタンで保存します。
## ディメンションの移動
＋ボタンからアイテムを選びます。
![2025-04-08_12h00_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/043e6de4-0f1c-4218-aa97-a244b160537b.png)
テクスチャを設定して、トリガーに移動して、プロシージャを作成します。
![2025-04-09_16h02_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/67b338ee-063d-4017-ac1e-0f5b73db2306.png)
プロジャーでこのようなブロックをつけて右上の保存ボタンで保存します。
![2025-04-08_12h10_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/eb637922-ab24-4830-81f1-14406caa6b8c.png)
## 試してみる
右上の再生ボタンを押してマイクラを立ち上げます。
クリエイティブタブから先ほど作ったアイテムを使って作ったディメンションに移動します。
今回作った通りやれば、作ったバイオームと作ったディメンション同時に見れると思います
![スクリーンショット 2025-04-08 121714.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054637/aa971518-63bc-4dfc-9142-d437ebf6a47f.png)
## 終わりに
 これでディメンションやバイオームが作れると思います。
 設定とか変えればエンドみたいな世界も作れると思います。
#次の記事:https://qiita.com/yt365/items/420b6ccf2ce3a59b3b4d
Sourcetree使ってたらGitコマンド忘れる件について

## Gitコマンド　覚えていますか？
前置きが長くなりそうなので、コマンドだけが知りたい方は読み飛ばしてください。

こんにちは、未経験からSES企業に転職した初学者です。
4月から勤務を開始し、研修を受けさせていただいています。
オンラインスクールでGitコマンドを学習し、GitHubを使っていたのですが、
研修ではSourceTreeを使用します。
これがお手軽でびっくりしたと同時に、思ったことが一つ
「Gitコマンド忘れてまう」
です。

私自身の忘備録のために、よく使うコマンドから順に記載します。
誰かの参考になると幸いです。

### git commit(コミット)
意味：「ローカルの変更を記録する」コマンド。
1. ローカルリポジトリ全ての変更をコミットしたい場合
    ```
    git add .
    git commit -m "コミットメッセージ"
    ```
    "コミットメッセージ"の文章部分を変更しましょう！
現場によってルールが決まっているかと思いますが、「〇〇の変更」などなど、、、。
※　`-m`とは？
Gitコマンドの **オプション** の一つで、--messageの略！

1. 任意のファイルだけコミットしたい場合
    ```
    git add ファイル名
    git commit -m "コミットメッセージ"
    ```
    例
    ```
    git add src/UserService.java
    git commit -m "ユーザーサービスのロジック修正"
    ```

### git push(プッシュ)
意味：「ローカルでの変更(コミット)をリモートに送る」コマンド。
```
git push <リモート名> <ブランチ名>
```
    
例
```
git push origin main
```
Sourcetreeでは何気なくプッシュしたりしているが、
リモート名、ブランチ名を意識しましょう。

### git pull (プル)
意味：「リモートの最新履歴を取り込んで、ローカルリポジトリに反映する」コマンド
```
git pull <リモート名> <ブランチ名>
```
    
例
```
git pull origin main
```

### git fetch(フェッチ)
意味：「リモートの最新情報(履歴)だけを取得する」コマンド
ローカルリポジトリには反映されないので注意！
```
git fetch <リモート名>
```
    
例
```
git fetch origin
```

これまでブランチ名を指定してきましたが、省略して書きます。
最新情報の取得のみ（変更を反映しない）。

## あとがき
本当に主に使う4つのコマンドを紹介しました。
[Xでも話題](https://x.com/0gachi/status/1908944498060849662?s=46&t=uvgIKtZWUzYIqf_rnn5Pbw) になっていましたが、カタカナ多すぎて訳わからなくなりますよね。
初学者のみなさん、一緒に頑張っていきましょう！
ブロックを取るRubyのProcはEnumerator化することができるか

結論。できる。
　
ブロックを取るメソッドの Enumerator化は、`enum_for`や`to_enum`でできる。

```ruby
def foo
  (1..10).each { yield(_1) }
end

enum_for(:foo).map { _1 * 2 }
#=>[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
```

では、ブロックを取る Procオブジェクトは、`Enumerator::Yielder#to_proc`を使って Enumerator化できるのである。

```ruby
foo = ->(&bk){
  (1..10).each { bk.call(_1) }
}

Enumerator.new { |y| foo.(&y) }.map { _1 * 2 }
#=>[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
```

※参考
https://qiita.com/obelisk68/items/8518159d1eba55397a9a
https://docs.ruby-lang.org/ja/latest/method/Enumerator=3a=3aYielder/i/to_proc.html