OmniAICreator/Qiita-1.07M huggingface dataset:
重い腰を上げて .cursorrules から Project Rules へ移行する

2025年の1月か2月くらいに `.cursorrules` が非推奨になるよ〜 & 将来廃止するよ〜と公式から発表がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/4620ef6e-3247-41c0-98c2-3be976421cd2.png)

なので、`Project Rules` というものに移行する必要があるのですが、中々重い腰が上がりませんでした。
世間では、バレンタインやホワイトデーは終わり、卒業と入学のイベントは終わりGWまで終わってしまい、桜も散ってしまいました。
私が登録している「あとでやる事リスト」も山の様になっていき、危機感を覚えてきたのでそろそろやります。

まぁ、簡単です。
5~10minもあれば終わるのでさくっとやってやりましょう。

## 全体の流れ

### Project Rules を知る。
まず、Project Rules についてどういうものか知っておきたいです。
私がここまで寝かせたのは面倒だからではありません。
先人のまとめてくれているであろう記事を参照したかったからです。
こちらを参考にどういうものか知っておきましょう。

https://zenn.dev/globis/articles/cursor-project-rules

### 移行作業

Cursor 君に移行してもらいましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/674fc80b-4f29-4ef7-973d-3c6584c8820f.png)

最低限指示が必要なのは、
mdcファイルにしてくれというのと、ルールタイプをこちらで決める事ですかね。
あと一応ファイルの配置場所も伝えてあげます。

ルールタイプは↑の記事に記載されてました！（感謝）
作業後は既存の `.cursorrules` は削除してもらいます。

これで移行終わり。

### 確認作業

今回私はルールタイプを`Always`にしました。
つまり、常にコンテキストとして参照されるはずです。
その確認をしましょう。

下記をファイルの一番最後に仕込んでみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/5ea2de3f-a4b0-4b26-84bd-3cf8db900066.png)

コンテキストを何も含めずに（大事）、このリポジトリについて説明してください。と指示してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/9466b32f-93e4-4c5e-8468-ace8b1ff671d.png)

おぉ。ちゃんと読み込まれていますね。感動です。
今までの `.cursorrules` だと、読まれない事も多々あったんですよね。
（.cursorrules を作った時、結構細かくテストしました）

今回、`Project Rules`になったことで、ルールタイプの設定が出来る様になったのは素晴らしい。
これでもっと開発が捗りそうです。

## 公式

https://docs.cursor.com/context/rules#cursorrules-legacy
「ILI9341」に2倍角「あ、埼玉」を表示(Arduino)(STM32G071)


参考
----

https://github.com/Tamakichi/Arduino-misakiUTF16




結果
----


![image_original(45).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9daddc97-2615-49b4-8d12-9ab70d45abab.jpeg)



プログラム
----

```c++


//misaki_test_nibai1_071_1


//インクルド
#include <Arduino.h>
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <misakiUTF16.h>


//設定
#define TFT_RST A1
#define TFT_DC 3
#define TFT_CS 4

//液晶の定義
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);


//初期化
void setup() {

  //シリアルの初期化
  Serial.begin(9600);
  Serial.println("ILI9341 Test!");

  //液晶のリセットピンの設定
  pinMode(TFT_RST, OUTPUT);
  digitalWrite(TFT_RST, HIGH);
  //digitalWrite(TFT_RST, LOW);

  //液晶の初期化
  tft.begin();

}  //setup


void k_print(int x, int y, char *ptr) {

  unsigned char font[8];        // フォント格納バッファ
  unsigned char font2[16 * 2];  // フォント格納バッファ

  while (*ptr) {                         // 文字列分ループ
    ptr = getFontData(font, ptr, true);  // 1文字分のフォント取得
    if (!ptr)
      break;  // エラーの場合は終了

    int j = 0;
    for (int i = 0; i < 8; i++) {

      int al = font[i];
      int s = 0;
      s = s | (0b0000000000000001 & al); al = al + al;
      s = s | (0b0000000000000100 & al); al = al + al;
      s = s | (0b0000000000010000 & al); al = al + al;
      s = s | (0b0000000001000000 & al); al = al + al;
      s = s | (0b0000000100000000 & al); al = al + al;
      s = s | (0b0000010000000000 & al); al = al + al;
      s = s | (0b0001000000000000 & al); al = al + al;
      s = s | (0b0100000000000000 & al); 
      s = s | (s + s);

      font2[j++] = s >> 8;
      font2[j++] = s & 0xff;
      font2[j++] = s >> 8;
      font2[j++] = s & 0xff;

    }  //for


    //ビットマップの表示
    tft.drawBitmap(x, y, font2, 16, 16, ILI9341_WHITE);
    x = x + 16;

  }  //while

}  //k_print


//無限ループ
void loop(void) {

  //画面のクリア
  tft.fillScreen(ILI9341_BLACK);

  //表示位置を0,0にする
  //tft.setCursor(0, 0);

  //テキストの表示
  //tft.setTextColor(ILI9341_RED);    tft.setTextSize(3);
  //tft.println("Hello World!");

  char *str = "あ、埼玉";  // 文字列
  k_print(0, 0, str);

  delay(5000);  //5秒待つ

}  //loop


```
【資格】AWS DOPに1発合格しました！！！

# はじめに
先日、AWS DOP(DevOps エンジニア プロフェッショナル)の試験を受けて、見事1発で合格することが出来ました:smile: 930点で意外と余裕がありました:smile::smile::smile:

![スクリーンショット 2025-05-14 094440.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/fd71a441-df27-4175-97a4-c98a86123482.png)


ざっくり自分がやったことなどを紹介します。

# AWS DOPとは？
AWS DOPはAWS公式の認定資格であり、**AWS上の分散アプリケーションシステムのプロビジョニング、運用、管理に関する高度な専門知識**を問う資格になります。試験料金としては300USDと比較的高額です。
下位の資格として、DVA(デベロッパー アソシエイト)とSOA(SysOpsアドミニストレーター アソシエイト)があります。

資格によって試験時間や合格点が違うのですが、DOPの場合は180分で75問で、合格ラインは750点になります。
詳しい試験の概要や、試験範囲の割合は[こちら](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-devops-pro/AWS-Certified-DevOps-Engineer-Professional_Exam-Guide.pdf)に記載されています。

![スクリーンショット 2025-04-03 112526.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/7dc8fe3e-4784-4ec2-8cd5-dc2334457071.png)

![スクリーンショット 2025-05-22 180450.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/177c9fab-a885-40ec-9cdd-654599a94054.png)



# 私自身の経歴
IT業界に入って10年になります。主にバックエンドの開発・設計を行ってきました。
AWSの経験としては4,5年くらいになります(AWS専属ではないため、実質3年くらいだとは思います)
AWS公式的には、プロフェッショナル資格は**AWS環境のプロビジョニング、運用、および管理についての2年以上の経験**となっているので、もう少し経験が浅い人でも受けてみるのは良いと思います。

試験内容的には、以下の内容が多かった気がします。

- **DR(ディザスタリカバリ)の指定したアプローチ**を考慮したインフラ構成の検討
- **複数環境の統制**をするためのAWSサービスの組み合わせ(Organizationsなど)
- SCPなどの**予防的統制**、AWS Configなどの**発見的統制**を行う際の適切なサービス選定
- **脆弱性や攻撃**からの防御方法
- **CI/CD**についてのサービス選択

なお、DOPに合格するまでに保有していた資格としては、
- Certified Cloud Practitioner
- Solutions Architect - Associate
- Developer - Associate
- SysOps Administrator - Associate
- Solutions Architect - Professional
になります。

# やったこと
私がやったことは主に、以下の3つになります。

- 所属会社でのインフラ設計・構築
- 資格対策本での座学
- Udemyでの模擬試験実施

## 所属会社でのインフラ設計・構築
所属会社では主にCDKでのインフラ構築をしています。
そこで身に付けた複数環境へWebアプリケーションを構築するために必要な
- CI/CD周り(CodePipelien、CodeBuild、S3など)
- ECS、ECR
- EC2
- ALB
- Route53、ACM
- CloudFront
- S3
- WAF
- DB周り(Aurora、Dynamo)
- VPC
- IAM、Organizations
などの実務経験は役に立ちました。

## 資格対策本での座学

AWS DOPについては、対策本がないのでAWS SAPの本を読みました。
なので、AWS SAPを取ってからAWS DOPを受けて、座学の勉強時間を減らすのが良いと思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/7b2eaab7-5175-4d72-9609-e0a9f0f2fe05.png" width=50%>

## Udemyでの模擬試験実施

[【全出題範囲網羅+詳細解説】AWS DOP-C02日本語実践問題225問(DevOps Engineer Pro)](https://www.udemy.com/course/aws-dop-practice/)という講座を買いました。
75問×3回分の模擬試験を受けることが出来ます。

実際の試験と似たような問題が結構あったりして、非常に良かったです。
※**試験合格**という目標だけに特化するなら【Udemyでの模擬試験実施】だけでも受かるかもしれません:thinking: 

# おわりに
今回はAWS DOPの試験を受けた際にどんな風に勉強したか、などをまとめました。
これから受けようと思っている方の参考になれば、幸いです:bow:
【公ド読】レガシ コードの文書化

【公式ドキュメントを読もうシリーズ】レガシ コードの文書化

## シリーズ概要

[https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3](https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3)

## URL

[https://docs.github.com/ja/copilot/copilot-chat-cookbook/documenting-code/documenting-legacy-code](https://docs.github.com/ja/copilot/copilot-chat-cookbook/documenting-code/documenting-legacy-code)

## 説明

レガシコードを文書化してくれる。

## 所感

既存のプロジェクトへの参加などの際にドキュメントが無い状況でも、先輩に聞かずに挙動について理解できる可能性が上がるのは助かる。

既存プロジェクトに参加する際もそうだし、AIが生成したコードを理解するうえで、多く使う機能のひとつだと思う。
【Python初心者】issubclass()関数とisinstance()関数の違いと使い方まとめ

Pythonの学習中に `issubclass()` と `isinstance()` という関数が出てきて、  それぞれの使い方や違いを整理しておきたかったのでメモとしてまとめました。
どちらも「あるクラスやオブジェクトが、他のクラスとどういう関係か」を判別するときに使う関数です。

## issubclass()関数：クラス同士の親子関係を調べる

`issubclass()` は、あるクラスが **指定したクラスのサブクラス（子クラス）かどうか** を判定する関数です。

### 書き方

```python
issubclass(子クラス, 親クラス)
```

### 例

```python
class Animal:
    pass

class Dog(Animal):
    pass

print(issubclass(Dog, Animal))   # True
print(issubclass(Animal, Dog))   # False
```

`Dog` は `Animal` を継承しているので、`issubclass(Dog, Animal)` は `True` になります。  
逆に、`Animal` は `Dog` の親なので、`issubclass(Animal, Dog)` は `False` になります。

## isinstance()関数：オブジェクトの型を調べる

`isinstance()` は、あるオブジェクトが **指定したクラスのインスタンスかどうか** を判定する関数です。

### 書き方

```python
isinstance(オブジェクト, クラス)
```

### 例

```python
dog = Dog()

print(isinstance(dog, Dog))      # True
print(isinstance(dog, Animal))   # True（親クラスでもTrueになる）
print(isinstance(dog, str))      # False
```

`dog` は `Dog` クラスから作ったオブジェクトなので、`Dog` でも `Animal`（親クラス）でも `True` になります。  
文字列型（`str`）とは関係ないので `isinstance(dog, str)` は `False` です。

## 使い分けのまとめ

| 関数名         | 判定対象               | 何を調べるか                       |
|----------------|------------------------|------------------------------------|
| `issubclass()` | クラスとクラス         | サブクラス（継承関係）かどうか     |
| `isinstance()` | オブジェクトとクラス   | インスタンス（型）かどうか         |

## 補足：Pythonでは「型＝クラス」「値＝インスタンス」

Pythonでは、「型」と言ったときには `int` や `str` のようなクラスのことを指していて、実際の値（データ）はそのクラスから作られた「インスタンス」になっています。

```python
print(type("hello"))           # <class 'str'>
print(isinstance("hello", str))  # True
```

このように `isinstance()` は型判定としてよく使われています。  
また、`issubclass()` はクラス設計の場面などで継承関係を確認するのに使われるみたいです。

## おわりに

最初は名前が似ていてよくわからなかったのですが、書いてみると役割の違いがはっきりしてきました。  
今後もクラスを使う場面で登場しそうなので、引き続き使いながら慣れていきたいと思います。
[.NET 9] Minimal API で Swagger UIが「Unable to render this definition」になったら

.NET Minimal API のプロジェクトにて、Swagger UIが正常に表示されない事象が発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41274/aa261f48-8bb8-4244-82d9-cf00e7dffac4.png)

Middlewareの設定や、/swagger/v1/swagger.json の内容を確認しても特に異常はなく、
openapi: 3.0.4 のバージョン表記がきちんとなされている状態。

しかしながら、Microsoft.AspNetCre.OpenApi 9.0.5 が出力する Open API 3.0.4 の記法の一部について、Swagger UIと互換性がない場合があるようです。

以下の指定により、OpenAPI 2.0にバージョンを強制的に下げることでエラーを回避できました。

```
app.UseSwagger(c =>
{
    c.OpenApiVersion = Microsoft.OpenApi.OpenApiSpecVersion.OpenApi2_0;
});
```
2025/6/2主にITとかセキュリティの記事

IIJセキュアMXサービスへの不正アクセスについてまとめてみた(5/31)
https://piyolog.hatenadiary.jp/entry/2025/05/31/010131

1億8400万件のログイン情報が流出、マルウェアで収集か＝報道(5/30)
https://coinpost.jp/?p=621572

WordPress 10万超のサイトに影響、大人気プラグインに緊急脆弱性(5/31)
https://news.mynavi.jp/techplus/article/20250531-3340593/

Microsoft 365 Copilot の新機能 | 2025 年 5 月(5/30)
https://blogs.windows.com/japan/2025/05/30/whats-new-in-microsoft-365-copilot-may-2025/

中小企業狙う「ボイスフィッシング」、金融機関装う電話で「偽サイト」誘導…不正送金２８億円(5/31)
https://news.yahoo.co.jp/articles/4aadcfe39e96ce81c3a5fd95954ac86cb1d7abcb
https://www.yomiuri.co.jp/national/20250531-OYT1T50100/

もう本当に終わりです(5/30)
https://note.com/kind_crocus236/n/n75809e55b708

レノボ調査：2025年における日本のAI支出額は5倍以上の増加、一方で組織全体でAIを導入した企業はわずか2%(5/30)
https://www.jiji.com/jc/article?k=000000203.000013608&g=prt
https://www.excite.co.jp/news/article/Prtimes_2025-05-30-13608-203/

警視庁と携帯電話会社4社が特殊詐欺被害の根絶を目指す「ストップ！詐欺」共同宣言を発出(5/31)
https://dime.jp/genre/1975212/

欧州 ETSI TS 119 471 V1.1.1 電子署名と信頼基盤（ESI）； 電子属性証明サービスのプロバイダに対する方針およびセキュリティ要件 (2025.05)(5/31)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/05/post-d0eb1f.html

Sui、1.6億ドルのハッキング凍結資金を解放｜被害者救済が本格化へ(5/31)
https://crypto-times.jp/news-sui-releases-160-million-in-frozen-hacking-funds-victim-relief-begins-in-earnest/

【実録】「まさか、不正利用されるなんて…」クレジットカードで見知らぬ請求「756円」が！ 発覚の流れと“カード会社の対応”を赤裸々に告白します(5/31)
https://financial-field.com/credit/entry-404363

第三次大戦はもう始まっている...「死の4人組」と「戦争の根本的な変質」にどう立ち向かうべきか？(5/31)
https://www.newsweekjapan.jp/kimura/2025/05/4-5.php

「戦闘なしで台湾を屈服させる方法」　中国の軍事雑誌に掲載されたシナリオとは(5/31)
https://www.chosunonline.com/site/data/html_dir/2025/05/31/2025053180009.html

相次ぐ“証券口座乗っ取り不正売買問題 ”に警視庁が捜査開始　2025年に入り急増4月までに不正取引3500件超、被害額は3000億円超に(5/31)
https://nordot.app/1301434326597124516

5月31日【今日は何の日？】「大数学者ガロア、決闘の末に…」ー不遇の天才と大理論「ガロア理論」(5/31)
https://innovatopia.jp/tech-social/tech-social-news/55598/

九天（Jiu Tian）：中国が世界最大のドローン母艦を公開、100機群制御で軍事バランス変革へ(5/31)
https://innovatopia.jp/drones/drones-news/56097/

カンボジアで摘発の詐欺拠点、拘束された日本人は２９人…日本を標的に警察官装った詐欺電話か(5/31)
https://www.yomiuri.co.jp/national/20250531-OYT1T50141/

RTA走者が利用するバグ技がセキュリティ分野で注目され始める！(2024/4/26)
https://nazology.kusuguru.co.jp/archives/149143

Amazonの自動運転車が事故！再び「脆弱性」発見？(5/31)
https://jidounten-lab.com/u_54709

マイナンバーカードで電子署名できる？クラウドサインのマイナンバーカード署名機能もご紹介(5/30)
https://www.cloudsign.jp/media/mynunbercard-cloudsign/

日米防衛相、サイバー協力強化　能動的防御の法律成立で(5/31)
https://www.nikkei.com/article/DGXZQOUA2963G0Z20C25A5000000/

日米防衛相会談について(5/31)
https://www.mod.go.jp/j/approach/anpo/2025/0531a_usa-j.html

中谷防衛相「ルールに基づく国際秩序を回復」　シャングリラ対話で中露批判展開も(5/31)
https://www.sankei.com/article/20250531-BS4PIY6RWVNSLN24UQRHTM5PUI/

【解説】“不正選挙陰謀論”はびこる韓国　投票箱を24時間監視し映像公開　大統領選挙の期日前投票で異例の対応(5/31)
https://nordot.app/1301365643047715648

日本の祝日制定を巡る競争の実態と背景：議員立法により追加されてきた歴史的経緯、海の日vs.山の日抗争、地方自治体や利益団体による働きかけ(5/31)
https://nikkeimatome.com/?p=60625
PySpark/Databricksデータエンジニアのための実践的Data Vault実装

**Delta Lake上でのSurrogate KeyとHashdiffの生成**

Delta Lake × Data Vaultのプロジェクトで、PySparkによるSurrogate Key（代理キー）とHash生成を実装しました。

本記事では、その具体的な手法を紹介します。

## データセットの準備

Databricks上で事前に用意されている TPC-H `lineitem` データセットを使用します。

```python
path = 'dbfs:/databricks-datasets/tpch/delta-001/lineitem/'
df = spark.read.format("delta").load(path)
```
※ 本記事では、ビジネスキーのNULL値チェックはData Qualityフレームワーク（例：DQX）で事前に処理されている前提とします。

## Data Vaultにおけるキーの取り扱い
Data Vaultでは、レコードの一意性や不変性を担保するために、SHA2-256ベースのハッシュによるキー生成がよく用いられます。

ここでは次の3種類のキーを生成します：

- 複合Surrogate Key（1レコードを一意に表現）
- 個別のビジネスキーごとのSurrogate Key（Hub接続用）
- Hashdiff（SatelliteのSCD2変化検知用）

使用するカラム一覧は以下の通りです：
```python
list_sks = [
    'l_orderkey', 'l_partkey', 'l_suppkey', 'l_linenumber',
    'l_extendedprice', 'l_discount', 'l_tax',
    'l_returnflag', 'l_linestatus', 'l_shipdate',
    'l_commitdate', 'l_receiptdate',
    'l_shipinstruct', 'l_shipmode', 'l_comment'
]
```
## Surrogate Key / Hashdiffの生成クラス
以下のクラスを使えば、Surrogate KeyやHashdiffの生成ロジックを一元管理できます。

※ NULL処理（coalesce()など）はここでは省略していますが、必要に応じて実装可能です。

```python
import pyspark.sql.functions as F

class KeyGenerator:
    """
    Surrogate Key / Hashdiff生成のためのPySparkユーティリティクラス
    """

    @staticmethod
    def generate_surrogate_key(df, cols, output_col=None):
        if output_col is None:
            output_col = "sk_" + "_".join(cols)
        return df.withColumn(
            output_col,
            F.sha2(F.concat_ws("||", *[F.col(c).cast("string") for c in cols]), 256)
        )

    @staticmethod
    def generate_individual_surrogate_keys(df, cols, prefix="sk"):
        for col in cols:
            df = df.withColumn(
                f"{prefix}_{col}",
                F.sha2(F.col(col).cast("string"), 256)
            )
        return df

    @staticmethod
    def generate_hashdiff(df, cols, output_col="hashdiff"):
        return df.withColumn(
            output_col,
            F.sha2(F.concat_ws("||", *[F.col(c).cast("string") for c in cols]), 256)
        )
```

## 実装例
```python
from datetime import datetime

# バッチ開始時点のtimestampを全行に適用する
load_date_literal = datetime.now()
df = df.select("*", F.lit(load_date_literal).alias("load_date"))

# 複合Surrogate Keyの生成
df = KeyGenerator.generate_surrogate_key(df, cols=list_sks)

# 個別Surrogate Keyの生成
df = KeyGenerator.generate_individual_surrogate_keys(df, cols=list_sks)

# Hashdiffの生成（例：Satellite用に量とロード日も含める）
df = KeyGenerator.generate_hashdiff(df, cols=list_sks + ['l_quantity', 'load_date'])
```

## 実務でのポイント
開発初期段階では、生成されたSurrogate KeyやHashdiffだけでなく、元のビジネスカラムもDataFrameに残しておくと、SatelliteやHubへのロード結果や、BIツール側の期待値と乖離が出た際に、元データと照合して原因を特定する作業が楽になります。

ご意見やご感想、あるいはより良い実装方法のご提案などがあれば、ぜひコメントでお知らせください。  
少しでも現場での実装の参考になればと思います。
競プロ日記#25/06/01

# 競技プログラミングの鉄則

[A07 - Event Attendance](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_g)
- 昨日のABCでimos法が出てきたので一応復習しておいた。
```
int main() {
    long long D,N;
    cin >> D >> N;
    long long  dif[100009];
    for (long long i = 0; i < N; i++) {
        long long L,R;
        cin >> L >> R;
        dif[L]++;
        dif[R + 1]--;
    }
    long long sum[100009];
    sum[0] = 0;
    for (long long i = 1;i <= D; i++) {
        sum[i] = sum[i - 1] + dif[i];
    }

    for (long long i = 1; i <= D; i++){
        cout << sum[i] << endl;
    }

    return 0;
}
```
[B07 - Convenience Store 2](https://atcoder.jp/contests/tessoku-book/tasks/math_and_algorithm_al)
- 同じくimos法の実装練習



# 余談だん
今週から資格試験の勉強を始めたのと個人開発で色々触ったりする予定なのでなかなか時間取れない可能性
いい例と悪い例でを見て理解するREST API

# REST APIとは？

一行で言うと
REST APIとは、**RESTという設計ルールに従って作られたWeb API**のことです。
つまりRESTはあくまで考え方のことです。

## RESTとは？

REST（Representational State Transfer）とは、Webのリソース（情報）に対する**一貫したアクセスルール**を定義する考え方です。

ざっくり言えば、
「リソースをHTTPを使って扱うための決まりごと」です。
この
*>>リソースをHTTPを使って扱うための決まりごと*
にはいろんな種類があり、どのような考え方を利用してAPI設計をするかで異なります。
(REST以外にも,SOAP API、Graph QL、 gRPCなどがあります。)

---

## RESTの設計原則（超ざっくりにとどめます）

1. **リソースはURIで表現する**
   　例：映画情報 → `/movies`

2. **リソースに対する操作はHTTPメソッドで表す(URIで表そうとしない)**
   　- `GET`：取得
   　- `POST`：新規作成
   　- `PUT` or `PATCH`：更新
   　- `DELETE`：削除

3. **ステートレス**
   　→ サーバーはクライアントの状態を記憶しない。

4. **統一インターフェース**
   　→ どのAPIでも同じ操作ルール（GETで取得、POSTで登録など）を守る。

---

## movieリソースのCRUD操作例（正しいREST API）

```markdown
| URI            | HTTP method |
|----------------|-------------|
| /movie         | GET         |
| /movie         | POST        |
| /movies/:id    | GET         |
| /movie/:id     | PUT         |
| /movie/:id     | DELETE      |
```

---

## バッドな例（非RESTful）

以下のようなAPI設計は、RESTの原則に反していて**分かりづらく、保守性が低い**です。

```markdown
| URI                    | HTTP method |
|------------------------|-------------|
| /getAllMovies          | POST        |
| /createNewMovie        | GET         |
| /updateMovieData       | POST        |
| /deleteMovieById       | POST        |
```

### 問題点：

* 操作がHTTPメソッドではなく**URIに埋め込まれている**
* `GET`で「作成」など、HTTPメソッドの意味を無視している
* URIの構造に**リソースの概念がない**
---
ターミナルのカレントディレクトリ表示を任意の相対パスにする方法

## 概要

ターミナルのプロンプト表示でカレントディレクトリ表示

```sh
user@host:~/Projects/foo/bar/workspace/src$ 
```

を **任意のディレクトリからの相対パス** を使って

```sh
user@host:workspace/src$ 
```

みたいに短くしたい。

## 背景

ターミナルのプロンプトに表示されるカレントディレクトリが長くなって見辛くなることってあるあるだと思います。Bashであれば `PS1` という環境変数の中の `\w` を `\W` に変更することで、絶対パスではなくカレントディレクトリ名だけにすることができます。しかし、ディレクトリ名だけになってしまうとそれはそれでどこだかわかりにくって問題もあります。

そこで、ワークスペースのルートディレクトリからの相対パスを表示するようにできたらちょうど良さそうと考え、本記事ではその実現方法を記します。

## 手順

### 1. 環境変数 `PS1` を変更する

~/.bashrc に以下を記述します。 `WORKSPACE_FOLDER` は好きな名前に変更可能です。

```sh:~/.bashrc
function rpath() {
    if [[ -n "$WORKSPACE_FOLDER" && "$PWD/" == "$WORKSPACE_FOLDER/"* ]]; then
        local workspaceBase=${WORKSPACE_FOLDER%/*}
        echo -n "${PWD#$workspaceBase/}"
    else
        # ワークスペース外の場合は絶対パス(ホームディレクトリは~に置き換え)
        echo -n "${PWD/$HOME/\~}"
    fi
}
PS1='`rpath`\$ '  # プロンプト文字列は個人の好みで調整する
```

:::note warn
`PS1` の中身はシングルクォートで囲った文字列にしてください。これは環境変数 `PS1` が評価される度に `rpath` が再評価される必要があるからです。もしダブルクォートだと ~/.bashrc が読み込まれるタイミングの1回だけしか評価されず、ディレクトリを移動してもプロンプト表示が最初から変わってくれません。ダブルクォートにする場合は `PS1="\`rpath\`\$ " のようにエスケープしましょう。
:::

### 2. .bashrc を再読み込みする

以下のコマンドで ~/.bashrc を再読み込みします。

```sh
source ~/.bashrc
```

### 3. 環境変数 `WORKSPACE_FOLDER` を設定する

以下のコマンドで現在のディレクトリをワークスペースのルートディレクトリとして環境変数 `WORKSPACE_FOLDER` を設定します。

```sh
export WORKSPACE_FOLDER=$(pwd)
```

:::note info
Visual Studio Codeのターミナルであれば、ユーザーの settings.json かワークスペースの .vscode/settings.json に以下を設定することで自動でワークスペースのルートディレクトリが環境変数 `WORKSPACE_FOLDER` に設定できます。 [^1]

```json:settings.json
{
    "terminal.integrated.env.linux": {
        "WORKSPACE_FOLDER": "${workspaceFolder}"
    },
}
```

:::

[^1]: [Visual Studio Code Variables Reference](https://code.visualstudio.com/docs/editor/variables-reference)

## 試すとこんな感じ

手順1を済ませた前提。

```sh
~$ source ~/.bashrc
~$ pwd
/home/vscode
~$ mkdir -p foo/bar/workspace/src
~$ cd foo/bar/workspace/
~/foo/bar/workspace$ export WORKSPACE_FOLDER=$(pwd)
workspace$ cd src/
workspace/src$ 
workspace/src$ cd ../../
~/foo/bar$ 
```

`WORKSPACE_FOLDER` より親の階層に行ったら `\w` と同じように絶対パスになります。

## おまけ

`WORKSPACE_FOLDER` より親の階層に行っても `workspace/..` のように相対パスを貫きたい場合は `rpath` 関数を以下のように書き換えてみてください。

```sh:~/.bashrc
function rpath() {
    local relativePath=$(realpath --relative-to "$WORKSPACE_FOLDER" "$PWD" 2>/dev/null)
    if [[ -z "$WORKSPACE_FOLDER" || -z "$relativePath" ]]; then
        # WORKSPACE_FOLDERが未設定または不正な場合は絶対パス(ホームディレクトリは~に置き換え)
        echo -n "${PWD/$HOME/\~}"
        return
    fi

    local workspaceFolderName=${WORKSPACE_FOLDER##*/}
    if [[ "$relativePath" == "." ]]; then
        echo -n "$workspaceFolderName"
    else
        echo -n "$workspaceFolderName/$relativePath"
    fi
}
```

~/.bashrc を編集して再読み込みすると

```sh
workspace$ source ~/.bashrc
workspace$ cd src/
workspace/src$ cd ../..
workspace/..$ mkdir -p workspace2/lib
workspace/..$ cd workspace2/lib
workspace/../workspace2/lib$ 
```

こんな感じでワークスペースの親、兄弟ディレクトリに行っても相対パスで表示できます。
GoogleのBeyondCorpとは？ゼロトラストネットワークの本質を理解する

## 🛡 はじめに

「ゼロトラスト」という言葉は、最近のクラウドセキュリティ界隈で頻繁に登場しますが、その中でもGoogleが提唱した **BeyondCorp（ビヨンドコープ）** はその先駆けとして知られています。

本記事では、

- ゼロトラストとは何か？
- BeyondCorpの概要と構成
- 従来の境界型セキュリティとの違い
- 実際のクラウド環境（Google Cloud/AWS）への応用ヒント

を中心に解説します。

---

## 🔐 ゼロトラストとは何か？

ゼロトラスト（Zero Trust）とは、「**誰も信頼しない**」という前提に基づいたセキュリティアーキテクチャです。

### 🔸 特徴

- **ネットワークの内外を問わず、すべてのリクエストを検証**
- **ユーザーとデバイスのコンテキストに基づいた動的なアクセス制御**
- **従来のVPNやIP制限に依存しない**

このアプローチにより、リモートワークやクラウド利用が進む現代の企業においても柔軟で強固なセキュリティ体制が構築できます。

---

## 🏛 BeyondCorpとは？

**BeyondCorp** は、Googleが内部インフラ向けに開発したゼロトラストアーキテクチャの実装です。  
VPN不要で、社員がどこからアクセスしても、**ユーザーとデバイスに基づいてアクセスを制御**します。

### ✅ 背景

Google社内では、APT攻撃（Aurora攻撃など）をきっかけに、従来のVPN＋境界防御モデルから脱却し、「信頼しない設計」へ移行しました。

---

## 🧩 BeyondCorp の構成要素

以下の3つがコアコンポーネントとされています。

### 1. **Device Inventory**
- 社員の端末の状態を常に把握（OS、パッチ状態、暗号化有無など）

### 2. **Access Proxy**
- 社内リソースへのすべてのアクセスを仲介し、ユーザー・デバイス・リクエストの内容を評価

### 3. **Trust Evaluation Engine**
- ユーザー認証情報、デバイス状態、ポリシー、行動履歴などを元に、アクセスを「その都度」評価（Dynamic Authorization）

---

## 🔄 従来のVPNベースのセキュリティとの違い

| 項目 | 従来型セキュリティ | ゼロトラスト（BeyondCorp） |
|------|---------------------|-----------------------------|
| アクセス判定 | ネットワーク境界（IP/VPN） | ユーザー＋デバイス＋リスク評価 |
| 信頼の範囲 | 内部は基本的に信頼 | 常に検証し信頼しない |
| VPN | 必須 | 不要 |
| ログ・監査 | 限定的 | 全アクセスを細かく記録・監査 |

---

## 🌐 Google CloudでのBeyondCorp的実装

Google Cloudでは、以下のサービスを組み合わせることで **BeyondCorp Enterprise** に近い構成が可能です。

| 機能 | サービス名 |
|------|------------|
| ID認証・MFA | Cloud Identity / Identity-Aware Proxy（IAP） |
| デバイス制御 | Endpoint Verification（Chrome拡張 or MDM連携） |
| アクセス制御 | Context-Aware Access（条件付きアクセス制御） |
| ログ・監査 | Cloud Audit Logs / Chronicle（SIEM連携） |

---

## ☁️ AWSやハイブリッド環境での応用

- AWSでは **IAM Identity Center** + **Device Posture Check（MDM連携）** による類似構成が可能
- VPN不要にするには **AWS Verified Access（2023年登場）** の利用が鍵
- 社内ADとSSO連携するなら、Okta, OneLogin, AzureAD 等と組み合わせ

---

## 💡 まとめ

- BeyondCorpは「誰も信頼しない」ことを前提にした **セキュリティの思想**
- VPNレスで業務を可能にする、クラウド時代の合理的なアーキテクチャ
- Google CloudではIAPやContext-Aware Accessで実現可能

従来の境界型セキュリティからの脱却は、単に技術を入れ替えるだけでなく、組織の文化や運用にも深く関わります。  
**ゼロトラスト＝プロダクト導入**ではなく、**ゼロトラスト＝セキュリティの原則**であることを忘れずに設計することが重要です。

---

## 📚 参考リンク

- [BeyondCorp – Google Cloud](https://cloud.google.com/beyondcorp)
- [ゼロトラストとは？（Google Cloud公式）](https://cloud.google.com/blog/ja/products/identity-security/what-zero-trust)
- [Zero Trust Architecture (NIST SP 800-207)](https://csrc.nist.gov/publications/detail/sp/800-207/final)
【合格体験記】TableauCertifiedDataAnalystに2週間で受かった話

2025年6月1日、TableauCertifiedDataAnalystに75%（ボーダー65%）で合格しました。
TableauCertifiedDataAnalystは2025年3月にリニューアルされていることもありますので、最近勉強されている方への参考とならば幸いです。

# About me
- DataSaberに2025年2月になっています
- 普段の業務からTableauCloudを毎日のように使っています
- 勉強を始めたのは5月19日からで2週間・2時間/日の勉強時間でした

# 2025年3月のリニューアルによる影響
### １．出題形式
- 他の合格体験記ですと、3部構成で知識問題→実技→知識、55問でした
- 今回受けたところ、すべてが知識問題、65問になっていました
- 以前は部ごとにしか見直しできなかったようですが、全部知識問題になったことですべてを見直せるようになりました
- 知識問題になったこともありますが、時間は余裕過ぎて見直ししても30分余ったので切り上げて終わりました
- 勉強方法と振り返りを後述しますが、過去問が全くアテにならなりませんでした

### ２．試験環境
- 2024年3QからピアソンVUEでたまにバグがあるそうで、私は速報値の画面が印刷されませんでした。試験終了後に速報値表示後Thankyou画面が表示されますが、そのまま止まってしまった場合は試験監督へ相談しましょう
- 最近の話ではありませんが、私の同僚で受験した方もテストセンターでPCが止まった話を聞いています＠2024年
- 上記からもしもの時を考えるとテストセンターで受ける方が安心かと思います
- テストセンターによってはキーボードが海外仕様になっているケースがあるそうですが、私は行きつけの名駅テストセンターで受けたせいか日本語キーボードでした

# 勉強方法と振り返り
### 勉強方法
- **Udemyを見る（1週間）**
  - 他の方の合格体験記で「Complete guide to acing the Tableau Desktop Specialist + Tableau Certified Data Analyst exams, with full practice tests!」が勧められていたのでセールで買って見ました
  - 英語の翻訳はChrome拡張機能のVideoCCTransratorを使いました
  - 見終わったあとにPractice Examsの章で模試を1回受けました
 - **DataSaberの実技Ordを解き直し（3日）**
   - DataSaberの実技を解き直しました。2月に受けて以来だったのでOrd8は忘れていました
 - **Tableauユーザーのための伝わる！わかる！データ分析×ビジュアル表現トレーニングを解く（2日）**
   - 地味に迷う要素が毎回あって良問なのですが、時間がなくて1章しかできませんでした
 - **UdemyでPractice Examsの章を解く（1日）**
   - 2つ目の過去問を解きました
 - **試験当日、他の方の合格体験機で多少復習（1日）**
   - Rank関係やFirst/Last関係などの細かな関数を復習しました

### 振り返り
- **上述のUdemyの講座よりDataSaber問題の演習の方が役立つ**
  - 試験は知識問題ではあるのですが、設定画面のレイアウトを覚えているかや、関数でどんな結果が返されるか、という類の問題なので動画を見るより実践操作をしたほうが良いです
  - Udemyは体系的に教えてくれるものの、上記のような細かさは文面や資料で記憶するより画面を操作して体に染み込ませた方が対応できると思います
  - Udemyの良さは数少ない模試があることなのですが、リニューアルによって的が外れていたので良さが半減という感じです
  - 時間がギリギリであれば模試だけでもやる価値があるのですが、30分くらい余るほど余裕なのでなくて良かったかと思います
<br>

 - **TableauPrepやTableauサーバー（Cloud）も実機を触るべし**
   - TableauPrepは業務で使っており余裕でしたが、触ったことがない方はTableau様が開催してくれる無償ハンズオンセミナーに参加すれば2時間くらいあれば十分通用するレベルでマスターできます
   - 業務的にTableauサーバー画面やCloudは使うことがなく（DB接続が基本なので）、私が点を落とした問題はこの分野が多いと思います。TableauPublicにもないので演習もしにくいのですが、スケジューラやら色々触った方が良さそうです


# さいごに
結局のところ、DataSaberの実技Ordが身についていればTableauCertifiedDataAnalystでも十分通用する所感です。
DataSaberは良いぞ！
ElasticBeanstalkとは

# Elastic Beanstalkとは

**Elastic Beanstalk**は、AWSが提供するPaaS（Platform as a Service）のサービスです。アプリケーションのコードをアップロードするだけで、そのコードを実行するために必要なインフラストラクチャ（EC2インスタンス、ロードバランサー、データベース、セキュリティグループなど）を自動的にプロビジョニングし、デプロイ、そして管理してくれます。

つまり、開発者はサーバーの設定や管理といった手間のかかる作業から解放され、**アプリケーションの開発に集中できる**ようになります。AWSの様々なサービスを裏側で組み合わせて、ベストプラクティスに従った環境を自動的に構築してくれるため、インフラの専門知識が少なくても、手軽に高可用性でスケーラブルなアプリケーションをデプロイできるのが大きなメリットです。

対応している言語やプラットフォームも豊富で、Java、.NET、PHP、Node.js、Python、Ruby、Go、Dockerなど、主要なものが網羅されています。

## 目次

* アプリケーションとバージョン
* 環境
* 環境層（ウェブサーバー環境、ワーカー環境）
* デプロイオプション
* ヘルスモニタリング
* 自動スケーリングとロードバランシング
* コスト効率と管理の容易さ

## アプリケーションとバージョン：あなたの「プログラムと変更履歴」

Elastic Beanstalkでは、アプリケーションのコードを管理するために「**アプリケーション**」と「**バージョン**」という概念を使います。

* **アプリケーション**：デプロイするアプリケーション全体の論理的なまとまりです。例えば、「MyWebApp」という名前のアプリケーションを作成します。
* **バージョン**：アプリケーションの特定のコードセットを表します。例えば、新機能を追加した場合は「v1.0」、バグ修正を行った場合は「v1.1」といったように、コードの変更履歴をバージョンとして管理できます。

新しいコードをデプロイする際は、新しいバージョンとしてアップロードし、既存の環境に適用することで、ダウンタイムを最小限に抑えながら更新を行うことが可能です。

## 環境：アプリケーションを実行する「箱」

「**環境**」は、アプリケーションの特定のバージョンを実行するための、AWSリソースの集合体です。つまり、アプリケーションが実際に動くサーバーやネットワークなどのインフラ全体を指します。

例えば、開発環境、ステージング環境、本番環境といった形で、同じアプリケーションの異なるバージョンや設定を持つ複数の環境を作成できます。これにより、開発から本番運用までのプロセスをスムーズに進めることができます。

## 環境層：アプリケーションの「役割」に応じたデプロイ

Elastic Beanstalkの環境には、主に2つの「環境層」があります。これにより、アプリケーションの役割に応じた最適なインフラ構成を自動で設定してくれます。

* **ウェブサーバー環境**：HTTPリクエストを処理するウェブアプリケーションやAPIサーバーをデプロイするための層です。ロードバランサーの背後にEC2インスタンスが配置され、高可用性とスケーラビリティが確保されます。
* **ワーカー環境**：時間のかかるタスクやバックグラウンド処理（例：画像処理、メール送信、データ処理など）を行うための層です。SQS（Simple Queue Service）と連携し、キューからタスクをプルして非同期で処理します。

## デプロイオプション：安全に更新するための「戦略」

Elastic Beanstalkには、アプリケーションの更新（新しいバージョンのデプロイ）を安全に行うための複数のデプロイオプションが用意されています。これにより、デプロイ中のダウンタイムを最小限に抑えたり、問題が発生した場合に簡単にロールバックしたりできます。

主なデプロイオプションには、以下のようなものがあります。

* **オールアットワンスデプロイ**：一度に全てのインスタンスを更新します。デプロイ時間は短いですが、その間はサービスが停止する可能性があります。
* **ローリングデプロイ**：インスタンスのバッチ（グループ）ごとに更新します。サービスが完全に停止する時間を短縮できますが、デプロイに時間がかかります。
* **イミュータブルデプロイ**：新しいインスタンスを立ち上げてデプロイし、テスト後に旧インスタンスを削除します。ダウンタイムがなく、ロールバックも容易ですが、一時的にインスタンス数が増えるためコストがかかります。
* **ブルー/グリーンデプロイ**：新しい環境（グリーン）を構築し、完全にデプロイが成功した後にDNSを切り替えてトラフィックを流します。最もダウンタイムが少なく安全ですが、新しい環境を別途用意するためコストがかかります。

## ヘルスモニタリング：環境の「健康状態」を常に監視

Elastic Beanstalkは、デプロイされた環境のヘルス（健康状態）を常に監視しています。CPU使用率、ネットワークトラフィック、アプリケーションの応答時間など、様々なメトリクスを収集し、異常を検知した場合には自動的に対処（例：インスタンスの再起動）したり、アラートを発したりします。

## 自動スケーリングとロードバランシング：負荷に応じた「自動調整」

Elastic Beanstalkは、内部でEC2のAuto ScalingとElastic Load Balancing (ELB) を利用しています。

* **自動スケーリング**：アプリケーションへのアクセスが増加した場合、自動的にEC2インスタンスの数を増やして負荷を分散します。逆にアクセスが減少すれば、インスタンス数を減らしてコストを最適化します。
* **ロードバランシング**：複数のインスタンスにトラフィックを効率的に分散し、特定のインスタンスに負荷が集中するのを防ぎ、アプリケーションの可用性を高めます。

これらはElastic Beanstalkが自動で設定してくれるため、開発者は設定の手間なく高可用性とスケーラビリティの恩恵を受けることができます。

## コスト効率と管理の容易さ：開発者の「負担軽減」

Elastic Beanstalk自体には追加料金はかかりません。利用したAWSリソース（EC2、S3、ELB、RDSなど）の料金のみが発生します。これにより、必要なリソースだけを使用し、使わないリソースを自動的に停止することで、コストを最適化できます。

また、インフラのプロビジョニング、デプロイ、パッチ適用、監視といった管理タスクをAWSが代行してくれるため、開発者はインフラ管理の負担から解放され、アプリケーション開発に集中できるのが最大のメリットです。

## まとめ

Elastic Beanstalkは、アプリケーション開発者がインフラの心配をせずに、自身のコードを迅速にデプロイし、管理するための強力なPaaSサービスです。複雑なAWSサービス群を裏側で適切に組み合わせてくれるため、初心者でも簡単にスケーラブルで高可用なアプリケーション環境を構築できます。
【TypeScript&Nuxt.js】占いアプリ③選んだカードを表示させる

# 前回はこちら
https://qiita.com/sakuc47/items/d81bdea5c57f95573049

### 進め方
1. タロットカードのデータをTypeScriptで配列にする ✅
2. その中からランダムに1枚選ぶロジックを書く
3. **結果を表示する画面を作る** 👈今回はこれ
4. カードごとに画像を表示してみる
5. NuxtLinkでページ遷移（トップ→結果ページ）
6. デザインを整える
7. 応用：今日の運勢APIを取り入れてみる
8. データの組み合わせで文章を作る

## App.vue の `<template>` を編集してカード情報を表示する

```vue
<div class="p-results">
  <h2>今日の運勢</h2>
  <div class="p-results-card">
    <p>タロットNo: {{ selectedCard.id }}</p>
    <p>名前: {{ selectedCard.name }}</p>
    <p>意味: {{ selectedCard.normalMeaning }}</p>
  </div>
</div>
```


![画面収録 2025-05-25 20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524465/3c1de9e9-7437-4c60-b593-52c4d439b3bb.gif)

※動画では「ID」になっているが、「タロットNo」に変更

### 正位置or逆位置をランダムで決めたい

自分で考えてもわからなかったのでGPTに聞いてみた。☁️

:::note info
JavaScript（TypeScript）で `Math.random()` を使えば、0〜1未満の乱数が出る。

たとえばこうすると 50% の確率で「正位置」か「逆位置」を選べる：
```
const isReversed = Math.random() < 0.5 // trueなら逆位置、falseなら正位置
```
:::
 
| 用語  | 意味 |
|:-:|:-:|
| Math.random()  | 0以上1未満の小数をランダムに出す |
| < 0.5 | 50% の確率で true/false を作れる |
| ref で状態管理 | Vueの「記憶の箱」だね |
| ? : | 三項演算子（条件によって表示を切り替える） |

そもそも`Math.random() ` についての理解ができていないので、次の記事で学習する。
VPCとは

# VPCとは

**VPC**は「Virtual Private Cloud」の略です。その名の通り、AWSクラウド内に論理的に分離された、お客様専用の「仮想ネットワーク」を構築できるサービスです。

AWSアカウントを作成すると、デフォルトでVPCが作成されていますが、より柔軟なネットワーク設計やセキュリティ強化のためには、このVPCを理解し、適切にカスタマイズする必要がある。

## 目次

* サブネット
* ルートテーブル
* インターネットゲートウェイ (IGW)
* NATゲートウェイ
* セキュリティグループ
* ネットワークACL (NACL)
* VPCピアリング
* VPCエンドポイント

## サブネット：VPCをさらに分割する「区画」

VPCの中に、さらに小さなネットワークの区画を作成するのが「**サブネット**」です。サブネットは必ず1つのアベイラビリティゾーン（AZ）内に存在します。

サブネットには、大きく分けて2種類あります。

* **パブリックサブネット**：インターネットから直接アクセス可能なリソース（Webサーバーなど）を配置するためのサブネットです。インターネットゲートウェイを経由して外部と通信します。
* **プライベートサブネット**：インターネットから直接アクセスできないリソース（データベースサーバーなど）を配置するためのサブネットです。より高いセキュリティが求められる場合に利用します。

## ルートテーブル：ネットワークの「交通整理役」

「**ルートテーブル**」は、ネットワークトラフィックをどこにルーティング（転送）するかを決定するルール（ルート）の集合体です。サブネット内のインスタンスから送信される通信が、どこに向かうべきかを指示する交通整理役のようなものです。

例えば、「インターネットへの通信はインターネットゲートウェイへ」「社内ネットワークへの通信はVPN接続へ」といったルールを設定できます。

## インターネットゲートウェイ (IGW)：インターネットへの「出入り口」

「**インターネットゲートウェイ (IGW)**」は、VPCとインターネット間の通信を可能にするためのVPCコンポーネントです。VPCにアタッチすることで、VPC内のリソースがインターネットと双方向で通信できるようになります。

パブリックサブネットに配置されたWebサーバーなどがインターネットからのアクセスを受け付けたり、外部のAPIにアクセスしたりする際に、このIGWが必要になります。

## NATゲートウェイ：プライベートサブネットからインターネットへの「安全な出口」

「**NATゲートウェイ**」は、プライベートサブネット内のインスタンスが、インターネットからの直接アクセスを許可することなく、インターネットへのアウトバウンド（外向き）通信を行うためのマネージドサービスです。

例えば、プライベートサブネット内のデータベースサーバーが、OSのアップデートのためにインターネット上のリポジトリにアクセスする必要があるが、外部からのアクセスは受け付けたくない、といった場合に利用します。NATゲートウェイは高可用性でスケーラブルなため、一般的な用途で推奨されます。

### NATインスタンスとの違い

以前はNATインスタンスというEC2インスタンスを立てる方法もありましたが、運用管理の手間やスケーラビリティの面から、現在ではNATゲートウェイの利用が推奨されています。

## セキュリティグループ：インスタンスレベルの「防火壁」

「**セキュリティグループ**」は、EC2インスタンスなどの**インスタンスレベル**でインバウンド（内向き）およびアウトバウンド（外向き）のトラフィックを制御するステートフルな仮想ファイアウォールです。

「ステートフル」とは、一度許可されたアウトバウンド通信に対する戻りのインバウンド通信は自動的に許可される、という意味です。例えば、Webサーバーが外部にリクエストを送信した場合、その応答は自動的に許可されます。

## ネットワークACL (NACL)：サブネットレベルの「関所」

「**ネットワークACL (NACL)**」は、サブネットレベルでインバウンドおよびアウトバウンドのトラフィックを制御するステートレスな仮想ファイアウォールです。

「ステートレス」とは、インバウンドとアウトバウンドの通信をそれぞれ個別にルールで明示的に許可する必要がある、という意味です。セキュリティグループよりも大まかなルールを設定する際に利用され、セキュリティグループと組み合わせて多層防御を実現します。NACLはセキュリティグループよりも先に評価されます。

## VPCピアリング：異なるVPC間の「直通トンネル」

「**VPCピアリング**」は、2つのVPC間でプライベートな通信経路を確立するための機能です。異なるVPC内のインスタンス同士が、プライベートIPアドレスを使って直接通信できるようになります。

例えば、開発環境と本番環境を別のVPCで運用しているが、一時的に開発環境から本番環境のデータベースにアクセスしたい、といった場合に利用します。同じアカウント内のVPCだけでなく、異なるアカウントや異なるリージョン間のVPCピアリングも可能です。

## VPCエンドポイント：AWSサービスへの「プライベートな玄関」

「**VPCエンドポイント**」は、VPCからS3やDynamoDBといったパブリックなAWSサービスに対して、インターネットゲートウェイやNATゲートウェイを介さずに、プライベートに接続するための機能です。

これにより、AWSサービスへのアクセスがインターネットを経由しないため、セキュリティが向上し、ネットワークトラフィックの管理も容易になります。データがインターネットに公開されないため、コンプライアンス要件を満たしやすくなります。

## まとめ：VPCはAWSの「インフラ設計図」

VPCは、AWSクラウド上に自分だけのネットワーク空間を作り、その中でリソースを安全かつ効率的に配置するための「インフラ設計図」のようなものです。サブネットで区画を分け、ルートテーブルで通信経路を指示し、セキュリティグループやNACLでアクセスを制御するなど、様々な要素を組み合わせて理想のネットワーク環境を構築できます。
IAMとは

# IAMとは

**IAM**は「Identity and Access Management」の略。簡単に言えば、**「誰が」「何に」「どんな操作を」できるのか、AWSの中でそのアクセス権限をしっかり管理する仕組み**のことです。

## 目次

* IAMユーザー
* IAMグループ
* IAMポリシー
* IAMロール

## IAMユーザー：AWSを利用する「人」や「アプリケーション」

AWSを利用する際、最初に登場するのが「**IAMユーザー**」です。

### ルートユーザー：AWSアカウントの「最高責任者」

AWSアカウントを作成した際に最初にできるのが「**ルートユーザー**」です。これは、AWSの全てのサービスとリソースに対して、文字通り「ルート（根源）」となる全ての権限を持つユーザー。例えるなら、会社の社長さんのような存在です。

**注意点として、日常的な操作には絶対にルートユーザーを使わない**ようにしましょう。万が一情報が漏洩したりすると、アカウント全体が危険にさらされてしまいます。

### IAMユーザー：日常業務をこなす「実務担当者」

私たちが普段AWSの操作をする際には、この「**IAMユーザー**」を使います。それぞれのユーザーに対して、必要な権限だけを付与することで、もしもの時にも被害を最小限に抑えられます。まるで、各部署の実務担当者が、自分の業務に必要な範囲で会社のシステムにアクセスするイメージです。

### パワーユーザー：なんでもできる「部署のリーダー」

「**パワーユーザー**」は、IAMユーザーやグループの管理以外の、ほぼ全てのAWSサービスにフルアクセスできる権限を持つユーザーです。これは、部署のリーダーやプロジェクトマネージャーのような存在で、大半の作業はこなせるけれど、人事権（ユーザー管理）は持たない、といったイメージです。

## IAMグループ：ユーザーをまとめて「部署」のように管理

個々のIAMユーザーに毎回権限を付与していくのは大変ですよね。そこで便利なのが「**IAMグループ**」です。

IAMグループは、複数のIAMユーザーをひとまとめにする機能です。例えば、「開発部グループ」や「運用部グループ」のように、部署や役割ごとにグループを作成し、そのグループにまとめて権限を設定することで、管理の手間を大幅に削減できます。

## IAMポリシー：権限を「ルールブック」として定義する

「**IAMポリシー**」は、**「誰が」「何に」「どんな操作を許可/拒否するか」を具体的に記述したルールブック**です。これは、JSON形式というデータフォーマットで記述されます。

具体的には、以下の3つの要素を定義します。

* **どのAWSリソースか**：S3バケットなのか、EC2インスタンスなのかなど
* **どのサービスか**：S3、EC2、Lambdaなど
* **どのような操作を許可/拒否するか**：ファイルの読み取り、サーバーの起動、データの削除など

### ポリシーの種類：誰が作った「ルールブック」か

IAMポリシーには、大きく分けて2種類あります。

* **AWS管理ポリシー**：AWSが作成・管理している、汎用的なポリシーです。例えば、「S3への読み取り専用アクセス」といった、よくある権限セットが用意されています。
* **カスタム管理ポリシー**：自分たちのAWSアカウントで、用途に合わせて自由に作成・管理するポリシーです。よりきめ細やかな権限設定が可能です。

そして、もう一つ「**インラインポリシー**」というものがあります。これは、特定のIAMユーザーやグループ、ロールに直接「埋め込まれた」固有のポリシーです。例えるなら、特定の個人や部署にだけ適用される、その場限りの特例ルールのようなものです。

### ポリシーの適用方法：ルールブックを「誰に/何に」渡すか

ポリシーは、大きく2つの方法で適用されます。

* **ユーザーベースのポリシー適用**：IAMユーザー、IAMグループ、IAMロールにポリシーをアタッチ（紐付け）します。これが最も一般的な使い方です。
* **リソースベースのポリシー適用**：特定のAWSリソース（例えばS3バケットなど）にポリシーを直接アタッチします。これにより、そのリソースへのアクセスを制御できます。

## IAMロール：AWSサービスやユーザーの「役割」を定義する

「**IAMロール**」は、AWSサービスやIAMユーザーの「役割」を定義し、アクセス権限を管理する概念です。これは、特定の「役割」を持たせることで、一時的に必要な権限を付与する仕組みと考えると分かりやすいでしょう。

### AWSサービスロール：AWSサービスが「代理人」として動く

「**AWSサービスロール**」は、AWSリソースに付与されるロールのことです。

例えば、EC2インスタンスからS3バケットにファイルをアップロードしたい場合、EC2インスタンスに直接アクセスキーとシークレットキーを設定するのはセキュリティ上良くありません。そこで、EC2インスタンスにS3へのアクセス権限を持つ「IAMロール」を付与します。

このIAMロールは、**AWS STS（Security Token Service）**というサービスから一時的なアクセスキーを取得し、それを使って別のAWSリソースにアクセスします。これにより、**アクセスキーとシークレットキーのペアをインスタンス内に保存する必要がなくなり、セキュリティが大幅に向上します。**まるで、特定の業務を依頼された代理人が、一時的に鍵を借りて作業をするようなイメージです。

### クロスアカウントアクセス用ロール：別アカウントへの「一時的な通行許可証」

「**クロスアカウントアクセス用ロール**」は、AWSアカウントをまたいで、別のAWSアカウント内のAWSサービスへのアクセスを一時的に許可するためのロールです。例えば、別の会社のアカウントにあるデータに、一時的にアクセスする必要がある場合などに利用します。

### AWSの外部ユーザー用ロール：社外の人にも「限定的なアクセス権」

「**AWSの外部ユーザー用ロール**」は、「**IDフェデレーション**」という仕組みを利用して、AWSアカウントの外部にいるユーザー（例えば、自社システムにログインしているユーザーなど）に対して、AWSアカウント内のAWSリソースへのアクセスを許可できるロールです。これにより、AWSユーザーを個別に作成することなく、外部のユーザーにも必要なアクセス権限を与えることができます。

## まとめ：IAMはAWSの「セキュリティの要」

IAMは、AWSを安全に、そして効率的に利用するための基盤となる非常に重要なサービスです。一見すると複雑に見えるかもしれませんが、

* **誰が (IAMユーザー、グループ)**
* **何に (IAMポリシー)**
* **どんな操作をできるか (IAMポリシー)**
* **その権限を一時的に与える役割 (IAMロール)**

という形で役割が分かれています。
【Python初心者】classmethodとstaticmethodの違いと使い方まとめ

Pythonのクラスでよく出てくる `@classmethod` と `@staticmethod`。  
それぞれがどういうものかをうまく整理できていなかったので、この記事では基本的な使い方を自分なりにまとめてみました。

## はじめに：@は何をしているの？

この記事では `@classmethod` や `@staticmethod` という記法が登場します。  
この `@` で始まる書き方は **「デコレータ（decorator）」** と呼ばれる仕組みです。

Pythonでは、`@デコレータ名` と書くことで、**関数やメソッドに特別な意味や機能を追加する**ことができます。

たとえば、

```python
@classmethod
def show(cls):
    ...
```

というのは、「この関数はクラスメソッドですよ」とPythonに伝えている、というイメージです。

※今回はデコレータの仕組みそのものについては深くは触れません。」
「@を使って、その関数に意味を付けているんだな」くらいの理解で読んでいただけると幸いです。

## インスタンスメソッドとは？

まず基本となるのが「インスタンスメソッド」です。

```python
class Person:
    def say_hello(self):
        print("こんにちは！")

p = Person()
p.say_hello()  # → こんにちは！
```

- `self` は「今このメソッドを呼び出しているインスタンス自身」を意味します。
- `p.say_hello()` のとき、Pythonは `self` に自動的に `p` を渡しています。

## classmethod（クラスメソッド）

```python
class MyClass:
    @classmethod
    def show_class(cls):
        print("これはクラスメソッドです")

MyClass.show_class()  # → これはクラスメソッドです
```

- `@classmethod` を付けると、最初の引数が `cls` になります（これは「class」の略です）。
- `cls` は「今呼び出されたクラス自身」を指します。
- **インスタンスを作らなくてもクラスから直接呼び出せます**。

### クラスメソッドの活用例（ファクトリメソッド）

```python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def from_birth_year(cls, name, birth_year):
        age = 2025 - birth_year
        return cls(name, age)

p = Person.from_birth_year("さくら", 2000)
print(p.name, p.age)  # → さくら 25
```

- 通常は `age` を直接指定してインスタンスを作りますが、
- `birth_year` しかデータとして持っていない場合もあるので、**そういったケースに対応する別の作り方を用意**しています。
- こういった「通常とは異なる作り方（別の入力）でインスタンスを生成するメソッド」のことを **ファクトリメソッド（factory method）** と呼びます。

## staticmethod（スタティックメソッド）

```python
class MyMath:
    @staticmethod
    def add(a, b):
        return a + b

print(MyMath.add(3, 4))  # → 7
```

- `@staticmethod` を付けると、`self` や `cls` を受け取らなくなります。
- クラスやインスタンスの情報に関係ない処理を、クラスの中にまとめておきたいときに使います。
- いわゆる「便利関数」をまとめておくイメージです。

## まとめ（使い分け）

| 種類 | 第一引数 | 使いどころ | 特徴 |
|------|-----------|------------|------|
| インスタンスメソッド | `self` | インスタンスの情報を使いたいとき | インスタンスから呼ぶ |
| クラスメソッド | `cls` | クラス自身を使いたいとき（別の生成方法など） | クラスからも呼べる |
| スタティックメソッド | なし | クラスにもインスタンスにも関係ない処理 | クラスにまとめたい便利関数など |

今回は、初心者でも理解しやすい例を使いながら、`@classmethod` と `@staticmethod` の基本的な違いや使い方を整理してみました。  
少しでも理解の助けになればうれしいです。
Sony AITRIOS AIH-IVRW2をLocal Consoleで設定する

AITRIOS AIH-IVRW2をクラウドサービス外で使用する場合のLocal Consoleの設定手順になります。

# AITRIOS Portalを使用する場合はこちら
AITRIOSをセットアップしてみる(AIH-IVRW2編)

https://qiita.com/Shibu-Shin/items/817b8eab41aa8a8f984a
# Local Console
Local Consoleをダウンロードします。
今回は、local-console-setup-4.0.18.exeをダウンロードします。

https://github.com/SonySemiconductorSolutions/local-console/releases

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/7604b287-e5a4-4ece-8742-a1d0c4c1784f.png)
Installをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/41c88dc5-0ab3-443a-8082-49ad90829683.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5fb2dfe4-0549-41fb-9f2b-c3b819dbdcc2.png)
Finishをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a76382fe-2557-41ed-ae25-26ef47c9f98a.png)
# Local Consoleの設定
Local Consoleを立ち上げ、Connectを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/67697b9b-52b4-4594-9e0e-4653aa173fab.png)
Wi-Fi SSDを有効にし、SSIDとPasswordを入力しGenerateをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a0d9ea6e-204d-4588-86ee-a3d2d8374409.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/189c2ab0-d2e0-4f94-8147-6c7293d8978a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5e4c10d8-f4b0-4fc3-9cb4-7e7d01bc5dc2.png)
QRコードが生成されました。
# AIH-IVRW2への読み込み
AIH-IVRW2のリセットボタンを5秒ほど押して、QRコードを読み込ませます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/db2e1c63-0de2-405a-ab5f-c6099b02441c.png)
接続するとConnectedになります。
Previewをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5b7702f9-c1ce-4d2a-96ce-fd3d4ca68772.png)
映像が表示されます。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1a98ffa9-fac6-432b-b7a7-812cc6e41842.png)
# FactoryReset
再度、クラウドにつなぎたいなど初期化する場合はAIH-IVRW2のリセットボタンを30秒程度押します。
LEDの点滅が変化し数分（10分弱）後に初期化されます。
この間に触ってはいけません。
# 注意事項
AITRIOS PortalとLocal Consoleを使用可能ですが、AITRIOS Portalにおいて __Facotry Resetの許可__ を必ずしてください。
これをしないと初期化が行えません。

https://qiita.com/Shibu-Shin/items/817b8eab41aa8a8f984a#%E6%8E%A5%E7%B6%9A%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%81%A8%E4%BB%8A%E5%BE%8C%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB
Amazon Q Developer CLIでAWSサービスのタイピングゲームを作成した

# はじめに
Amazon Q CLIを使ってゲームを作るとTシャツがもらえるキャンペーンが実施中とのことなので、ゲーム開発未経験（開発自体ほぼ未経験）の自分もチャレンジしてみました。

・キャンペーンページ

https://community.aws/content/2xIoduO0xhkhUApQpVUIqBFGmAc/build-games-with-amazon-q-cli-and-score-a-t-shirt

・日本語版

https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

どんなゲームにしようかなーと悩みましたが、どうせなら自分が利用しそうなものにしようと思い、1週間くらいぼんやり考えた結果タイピングゲームを作ることにしました。

私自身、自作キーボード勢で休みの日には寿司打などで時間を溶かしている人間なので、趣味として利用できそうだなということが理由として一つ。

あと英語のタイピングが苦手なので英語でAWSのサービスに関連した文字列を対象すれば実利もありそうだなということがもう一つの理由です。

実行の様子は以下のポスト参照。
英語タイピング慣れなくてむずかしい（大西配列）

https://x.com/WfallGo/status/1929188401481212217

# 制作過程

Amazon Qに対して自然言語でのプロンプトのみで全ての作業を行いました。

キャンペーンページ内でも例示があったpygameを利用することにしました。（本キャンペーンでは利用する技術の縛りはありません）

はじめに「pygameを利用してAWSのサービスについてのタイピングを作ってください」とお願いしたところ、以下のような画面が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945505/cc2be319-138c-4d1b-b5c6-1e4cc2c2a0cb.png)

文字がうまく表示されていないので、何をすればゲームが開始するかも謎です。
ちなみにspaceを押すことで、一応タイピングゲームっぽいものは動きました。



この後、日本語表示を修正して！、デザインをリッチにして！、AWSっぽい配色にして！など思いついたままにプロンプトを入力した結果、以下のような画面になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945505/8262e5ae-1438-442f-b8d7-3729c261edf1.png)

「〜を修正して」のような指示を何度もお願いしたのですが、迷宮に入り込むことなく対応してくれていました。

ただ、より具体的な指示を行った方が対処の精度は良く、対応時間も短いと感じたので、支持する人間が仕組みを理解しているに越したことはないと感じました。


タイピングの内容についても、初めはサービス名のみだったのですがあまり英語感がなかったので、各サービスにまつわる例文をQ Developerに考えてもらいました。


普通にサービスの解説だけでは面白くないので、ユーモアのある文をお願いしました。

その結果、たとえばSNSだと以下のような欧米味のある感じの文章に。
```
 "SNS notifies faster than office gossip": "SNSはオフィスの噂よりも速く通知します"
```
ちなみにGuardDutyは以下のような文に。睡眠中の検出は歓迎しがたい。
```
"GuardDuty detects threats in their sleep": "GuardDutyは睡眠中に脅威を検出します",
```

タイピングしたものについては、結果表示後に簡単なサービス説明とタイピングテキスト原文と日本語訳が確認できるようにしてもらいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945505/3a6bd724-28c9-4315-a2b9-092df7b1baa6.png)

たまにユーモアレベルが高すぎて意味が掴みにくい分もありますが、一旦そのままにしています。
人類には早すぎたのだ。。。


結果、作業完了までは4-5時間ほどかかりましたが、Q Devloperの応答待ちの時間がほとんどのため、実働でいうと1時間もかかっていない体感です。

ちょっとThinkingの時間が長いようにも感じましたが、待つ間に他の作業もできるので、手間はそこまで感じませんでした。


# GitHub
作成したgameは以下のリポジトリから取得できますので、よかったら評価Heroを目指してみてください。
私はProfessionalが限界でした。

https://github.com/okshn-yk/aws_typing

# まとめ
開発初心者の自分でもやりたいことのイメージがあれば、ある程度のものが作れてしまうことにはかなり感動しました。

今回は初期設定で頑張ったけれど、MCPやルールでカスタマイズして使い込むともっと色々なことができそうです。

他のコーディングエージェントも強いけれど、AWSに関連する部分であれば差別化できるくらいには強みがあると思うので、状況に応じて使い分けられれば一番かなと感じました。

以上です！
⏱️ useRef × useEffectで定期実行処理を実装する方法

# はじめに

Reactで**定期的に何かを実行したいとき**、あなたはどうしていますか？

```ts
setInterval(() => {
  console.log("毎秒実行");
}, 1000);
```

このような処理をコンポーネント内に直接書くと、**バグやメモリリーク**の原因になります。
そんなときに使えるのが、`useRef`と`useEffect`を組み合わせた**副作用の安全な制御方法**です。

🎯 本記事では以下をわかりやすく紹介します：

* `useRef`とは何か、なぜ使うのか
* `useEffect`との組み合わせ方
* 最小構成の「カウントアップタイマー」実装

# useRefとは？

`useRef` は主に **DOMを参照するためのフック**ですが、実はそれだけではありません。

```ts
const intervalRef = useRef<NodeJS.Timeout | null>(null);
```

このように書くことで、**再レンダリングされても値が保持される**「永続的な変数」として使えます。

* `useState`：変更すると再描画が走る
* `useRef`：変更しても再描画されない（非表示の箱）

# useEffectとは？

`useEffect` は「副作用（**Effect**）」を扱うためのフックです。

副作用とは、例えば以下のような処理です：

* データの取得（fetch）
* イベントリスナーの登録
* タイマー（setInterval, setTimeout）
* 外部ライブラリとの連携

Reactのレンダリングとは**直接関係ない処理**を、特定のタイミングで実行したいときに使います。

**✨ `[]` は「初期処理」**

```tsx
useEffect(() => {
  // この中の処理はコンポーネントが表示されたときに実行されるよ
}, []);
```

第二引数の「依存配列」が空（`[]`）だと、**初回マウント時のみ実行される**という意味になります。

**🧹 `return () => { ... }` は「お片付け処理」**

さらに、`useEffect` の中で `return` を書くと、

```tsx
useEffect(() => {
  return () => {
    // コンポーネントが画面から消える（アンマウントされる）ときに実行される
  };
}, []);
```

以下のようなタイマーを作っていたとします：

```tsx
intervalRef.current = setInterval(() => {
  setCount((c) => c + 1);
}, 1000);
```

これを放っておくと、コンポーネントが画面から消えても**ずっと裏で実行され続けてしまう**ため、**メモリリーク**や予期せぬ動作になります。

なので、「消えるときに止める（お片付け）」が必要になります。

```tsx
useEffect(() => {
  // mount（表示）時の処理：今回はなし

  return () => {
    // unmount（非表示になるとき）にやりたいことを書く
    stop(); // → タイマーを止めるなど
  };
}, []);
```
このように書くことで、

* コンポーネントが\*\*マウントされたとき（表示されたとき）\*\*は何もしない
* コンポーネントが\*\*アンマウントされるとき（画面から消えるとき）\*\*に `stop()` を呼んで、タイマーを止める

という安全な流れが完成します。
「使い終わったあとにちゃんと片付ける」が `useEffect` の `return` の役割です。

# useEffect × useRef 実装例

まずは、`setInterval` を安全に使う基本パターンを紹介します。

```tsx
import { useState, useRef, useEffect } from "react";

export default function Timer() {
  const [count, setCount] = useState(0);
  const intervalRef = useRef<NodeJS.Timeout | null>(null);

  const start = () => {
    if (intervalRef.current !== null) return; // 二重防止
    intervalRef.current = setInterval(() => {
      setCount((prev) => prev + 1);
    }, 1000);
  };

  const stop = () => {
    if (intervalRef.current !== null) {
      clearInterval(intervalRef.current);
      intervalRef.current = null;
    }
  };

  const reset = () => {
    stop();
    setCount(0);
  };

  useEffect(() => {
    return () => {
      stop(); // コンポーネントが消えるときに停止
    };
  }, []);

  return (
    <div>
      <p>⏱️ Count: {count}</p>
      <button onClick={start}>▶️ Start</button>
      <button onClick={stop}>⏹ Stop</button>
      <button onClick={reset}>🔁 Reset</button>
    </div>
  );
}
```

✅ **ポイント**

* `intervalRef.current` にタイマーIDを保存
* `useEffect` のクリーンアップで自動停止
* 状態と副作用を分離して管理できる

| 目的                | 適したフック      |
| ----------------- | ----------- |
| 値を保持したいが再描画は不要    | `useRef`    |
| 副作用の実行／終了タイミングを制御 | `useEffect` |
| 状態管理と画面更新         | `useState`  |

`setInterval` や `setTimeout` を扱うときは、**必ず`useRef`でIDを保持し、`useEffect`で開始・終了を管理**するのがベストプラクティスです。

# おわりに

* Reactでタイマーや自動再生を扱いたい方
* `useRef`の活用方法を知りたい方
* Game of Lifeのような**時間ベースのアプリ**を作りたい方

にとって、`useRef` + `useEffect` の組み合わせは非常に強力な武器になります。

ぜひ一度、実際に試してみてください！
type-challenges解いてみた 初級 3057 Push


# 問題

````md
Array.pushのジェネリックバージョンを実装します。

例えば：

```typescript
type Result = Push<[1, 2], '3'> // [1, 2, '3']
```

````



## 回答

```ts
type Push<T extends unknown[], U> = [...T, U]
```

### ちょっと解説

#### `T extends unknown[]`
こうかくことで、T を配列/タプルに限定することができます。
よって後続で`[...T, U]`スプレッドを使用することができます。

#### `...T`
**Variadic Tuple Types**と呼ばれるものです。
JSのスプレッド構文の型バージョンであり、ある要素を別のタプル型に埋め込むことができます。
PostgreSQL の psql コマンドでタブ区切りで select 結果を出力

PostgreSQL の psql コマンドでタブ区切りで select 結果を出力する方法のメモ。

# オプション
* -t: カラム名等を抑制
* -A: 整形を抑止
* -F $'\t': カラムの区切り文字をタブに変更

# コマンド
```bash
echo "select * from test1;" | psql -t -A -F $'\t' -d test1
```

# 実行結果
```text
id_001	name_001
id_002	name_002
id_003	name_003
id_004	name_004
id_005	name_005
```

# オプションを指定しない場合
```text
   id   |   name
--------+----------
 id_001 | name_001
 id_002 | name_002
 id_003 | name_003
 id_004 | name_004
 id_005 | name_005
(5 rows)
```
OpenAI GPT-4oで高品質な音声を生成する！Python×TTSの超入門（初心者でもOK）


こんにちは、せいやです。  
今回は「OpenAIの`gpt-4o-mini-tts`を使って、テキストから音声（MP3）を生成する方法」をステップバイステップで解説します。

---

## ✅ やりたいこと

- Pythonを使って、テキストを自然な日本語音声に変換する  
- 出力形式は `output.mp3`  
- VS Code環境で構築・実行  
- エラー解決例（UnicodeEncodeError）も紹介！

---

## 🧰 前提条件

| 必要なもの | 補足 |
|------------|------|
| Python（3.8以上） | [Python公式](https://www.python.org/downloads/) |
| OpenAIのAPIキー | [OpenAI APIキー取得](https://platform.openai.com/account/api-keys) |
| VS Code | [VS Code公式](https://code.visualstudio.com/) |
| `openai` ライブラリ | 後ほどインストールします |

---

## 🪜 ステップ1：プロジェクトフォルダを準備

1. VS Code を起動  
2. 任意のフォルダ（例：`TTSProject`）を作って開く  
3. 新規ファイル `tts_test.py` を作成  

---

## 🪜 ステップ2：パッケージをインストール

ターミナル（`Ctrl + Shift + \``）を開き、以下を実行：

```bash
pip install openai
````

---

## 🪜 ステップ3：コードを書いて実行

```python
import openai

openai.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

response = openai.audio.speech.create(
    model="tts-1",          # または "tts-1-hd"
    voice="nova",           # 他に "alloy", "echo", "onyx", "fable" などあり
    input="こんにちは、Mrポテトヘッド！"
)

with open("output.mp3", "wb") as f:
    f.write(response.content)
```

> 🎧 成功すると、カレントフォルダに `output.mp3` が生成され、音声が再生できます！
「こんにちは、Mrポテトヘッド」と話してくれます！

---

## 🧱 ありがちなエラー：UnicodeEncodeError

```bash
UnicodeEncodeError: 'ascii' codec can't encode character ...
```

これは、APIキーの中に **日本語や全角スペースなどが混入**していると起こるエラーです。

### ✅ 解決方法

* APIキーは `"sk-..."` のように **英数字のみ** にしてください。
* コメントに日本語を使っていても、ファイルの文字コードが `UTF-8` なら基本はOK。
* VS Code右下で「UTF-8」であることを確認！

---

## ✅ 応用アイデア

* 🎞 ChatGPT原稿 × TTS × ffmpeg で **YouTube動画自動生成**
* 🧑‍🏫 解説動画や講座用ナレーションを自動化

---

## 📌 おまけ：使用可能な音声（voice）一覧

| voice   | 特徴       |
| ------- | -------- |
| `nova`  | 女性風で自然   |
| `alloy` | 低めの男性風   |
| `echo`  | 少し速い語り口  |
| `onyx`  | 落ち着いた男性風 |
| `fable` | 明るく軽快    |

---

## 🙌 まとめ

OpenAIのTTS機能は、**音声品質が非常に高く、簡単に実装できる**のが魅力です。
APIキーさえあれば、5分でナレーション音声が作れます。

> GPT-4oをもっと活用して、業務効率やコンテンツ制作に役立てていきましょう！

---
再帰のヘルパー関数（Javascript）について

# はじめに
Recursionで中級のカリキュラムの中に再帰の項目があり、私は長い時間そこで躓いた記憶があります。。
現在はカリキュラムの2周目のなのですが、2周目にしてヘルパー関数の便利さに気づいたのでアウトプットしたいと思い記事にしようと思いました！！
# ヘルパー関数とは
ざっくりいうと再帰関数の補助的な関数のことを言います。
#### なぜヘルパー関数が便利なのか
私はカリキュラム1周目のときは、関数の中に関数を入れることがいまいち理解できていなくて、すでに書かれている一つの関数だけでコーディング問題を解いていました。
ですが、学習している中でヘルパー関数というものを知りました。私は基本情報で配列やfor文なども勉強していたためそれと似たヘルパー関数を知ったときは問題を解くスピードも上がり、成長を感じられました！！
#### 簡単な例
```javascript
function reverseString(s){
    // 関数を完成させてください
    return reverseStringHelper(s,s.length-1,"");
}

function reverseStringHelper(s,index,output) {
    if (index < 0) {
        return output;
    }
    return reverseStringHelper(s,index-1,output += s[index]);
}
```
このコードは与えられた文字列を逆表示にして返すヘルパー関数です。逆表示なのでインデックスが0より小さくなると返して出力するという風な書き方をします。ヘルパー関数を知ってから躓いていた再帰が少しずつ分かるようになってきました。
# さいごに
ヘルパー関数について説明しましたがこの関数にもデメリットはあると思います。でも学習初期なのでどんどんいろんなパターンを吸収してその中で最適解を出していけたら良いと思っています！引き続きカリキュラムを進めていきます！