OmniAICreator/Qiita-1.07M huggingface dataset:
【お試し】あなたもクラウドプラクティショナーに！？

## はじめに
あなたはクラウドプラクティショナー（CLF）というAWS認定試験を知っていますか？？
GPTがお試し試験を作成してくれたので、ぜひ解いてみてください！
（実際の試験はどんな感じで出るかわかりません！）


## 良問セット（全10問）
#### 問題1【責任共有モデル】
ある企業は、Amazon EC2 上の Web サーバーに対するパッチ適用が不要になると思い、インスタンスを AWS 上に移行しました。この考えに対するAWSの責任共有モデル上の正しい見解はどれですか？

a. AWSはEC2インスタンスのOSパッチを自動で管理する
b. パッチ適用はAWSサポートが行う
c. パッチ適用はユーザーの責任
d. マネージドサービスであればパッチは不要

<details><summary>ヒント&ポイント</summary> EC2はIaaS（インフラ）であり、OS以上はユーザー責任。 </details> <details><summary>答え</summary> c. パッチ適用はユーザーの責任 </details>

--- 
#### 問題2【料金・コスト】
Amazon S3 スタンダードストレージを利用する際、コストに影響する要素として含まれないものはどれですか？

a. 保存しているデータのサイズ
b. PUTおよびGETリクエストの回数
c. データの暗号化オプション
d. データのリージョン間転送

<details><summary>ヒント&ポイント</summary> 「保存」以外の観点、たとえば転送やリクエストコストを思い出しましょう。 </details> <details><summary>答え</summary> c. データの暗号化オプション </details>

--- 
#### 問題3【サービス選定：ストレージ】
頻繁にアクセスされないが、即時アクセス可能である必要があるデータをコスト効率よく保存したい。最適なストレージクラスは？

a. Amazon S3 One Zone-IA
b. Amazon S3 Standard
c. Amazon S3 Glacier Deep Archive
d. Amazon S3 Intelligent-Tiering

<details><summary>ヒント&ポイント</summary> 「すぐ取り出せる」と「安く保存」のバランス。 </details> <details><summary>答え</summary> d. Amazon S3 Intelligent-Tiering </details>

--- 
#### 問題4【セキュリティ】
ある会社は、AWS 上でのログイン時にユーザーが MFA を使用することを必須にしました。この設定に必要なサービスはどれですか？

a. Amazon Inspector
b. AWS IAM
c. AWS WAF
d. AWS Shield

<details><summary>ヒント&ポイント</summary> 「誰がログインできるか」に関わるサービスは？ </details> <details><summary>答え</summary> b. AWS IAM </details>

--- 
#### 問題5【コスト・無料枠】
AWS 無料利用枠に常に含まれるサービスはどれですか？（※一部のサービスは12か月限定）

a. Amazon EC2
b. AWS Lambda
c. Amazon RDS
d. Amazon SageMaker

<details><summary>ヒント&ポイント</summary> 「12か月限定」ではなく、「常に無料」の枠。 </details> <details><summary>答え</summary> b. AWS Lambda </details>

--- 
#### 問題6【サポートプラン】
AWS Business Support プランで提供される内容として含まれないものはどれですか？

a. Trusted Advisor の全チェック利用
b. 24時間365日対応のサポート
c. アカウントマネージャーの担当制
d. サードパーティ製ソフトウェアのサポート

<details><summary>ヒント&ポイント</summary> アカウントマネージャーはどのプランにしか含まれない？ </details> <details><summary>答え</summary> c. アカウントマネージャーの担当制 </details>

--- 
#### 問題7【責任共有モデル】
ある企業が Amazon RDS for PostgreSQL を使っています。このサービスに対するパッチ適用やバックアップ管理の責任は誰が負いますか？

a. ユーザー
b. AWS
c. パートナー企業
d. 管理者が手動で行う必要がある

<details><summary>ヒント&ポイント</summary> マネージドサービスとは何か。 </details> <details><summary>答え</summary> b. AWS </details>

--- 
#### 問題8【サービス選定：コンピューティング】
ある開発者が Docker コンテナを使ってアプリケーションを動かしたいが、サーバーの管理を一切したくない。最適なサービスはどれですか？

a. Amazon EC2
b. AWS Lambda
c. AWS Fargate
d. Amazon ECS on EC2

<details><summary>ヒント&ポイント</summary> 「サーバーレス」と「コンテナ」の組み合わせ。 </details> <details><summary>答え</summary> c. AWS Fargate </details>

--- 
#### 問題9【セキュリティ】
以下のうち、DDoS 攻撃から保護するためにAWSが提供するサービスはどれですか？

a. AWS IAM
b. Amazon Macie
c. AWS Shield
d. AWS Config

<details><summary>ヒント&ポイント</summary> WAFと並んでよく使われるあの防御ツール。 </details> <details><summary>答え</summary> c. AWS Shield </details>

--- 
#### 問題10【セキュリティ／サービス選定】
暗号化された機密データを Amazon S3 に保存する際、顧客がキーを完全に管理したい場合に最も適切な方法は？

a. SSE-S3 を使う
b. SSE-KMS を使い、AWSがキー管理
c. SSE-KMS を使い、カスタマー管理キー（CMK）を使用
d. SSE-C を使う

<details><summary>ヒント&ポイント</summary> KMSではなく、自前キー管理。 </details> <details><summary>答え</summary> d. SSE-C を使う </details>

## おわりに
あなたは何問正解できましたか？
ぜひ本番の試験にもチャレンジしてみてくださいね！
「あのログ、誰が読むの？」─ 見落とされがちなログの価値と設計ベストプラクティス

## はじめに

AWS Lambdaで開発をしていると、とりあえず `console.log()` や `print()` を使ってログを出力する機会が多いと思います。
（実際自分の現場では多用されてます。。泣）
しかし、**それらのログ、本当に後から役立っていますか？**

「誰が読むの？」と言いたくなるような、**読まれない・検索されない・使われないログ**になってしまっていないでしょうか。

この記事では、ログ（CloudWatch Logs）を **「見やすい」「後から使えるデータ」** に昇華するための設計・運用のベストプラクティスについてご紹介します。  
「そろそろログ、ちゃんと考えたい」と感じている方に読んでいただけたら嬉しいです。

---

## よくあるログ

以下のようなログ設計・運用になっていませんか？

- `console.log()` `print()` で文字列だけを吐いている  
- 必要な情報が入っておらず、あとから追えない  
- ログに一貫性がなく、検索や集計ができない  
- "〇〇成功" などの 固定文言

```python
# よくあるダメなログ例（Python）
print("ログイン成功")
```

このようなログは、トラブル時に役に立たないことはないですが、
- ログインが成功した。
- この部分まで処理が実行された。
ということしかわかりません。
---

## ログの秘めた可能性

ログは単なる「出力」ではありません。  
適切に設計されていれば、それは強力な **“システムの観測データ”** になります。

- バグや障害時の根本原因の特定  
- ユーザー行動の分析  
- 異常値の自動検出とアラートのトリガー  
- セキュリティ監査やリスク検知  
- モニタリング基盤（CloudWatch Logs Insights や Datadogなど）との連携  

そして今、**AI時代においては「ログ」は単なる調査ツールではなく、学習や最適化の源泉**でもあります。  
ログに蓄積されたデータは、将来のパフォーマンス予測やインテリジェントな障害回避、ユーザー体験のパーソナライズなど、  
**データ駆動型の意思決定や自動化の基盤**になります。

つまり、ログは **未来のトラブルを防ぎ、現在のプロダクトの健康状態を映し出す “資産”** であると同時に、  
**AIが価値を生み出すための「燃料」でもある**のです。


---

## 設計で差がつく！ログのベストプラクティス
ではどうすればいいのか。
ここからは、Lambdaログを「読まれる」「使える」「価値のある」ものにするためのベストプラクティスをご紹介します。

### ✅ 1. 構造化ログを使う
JSON形式で出力することで、CloudWatch Logs Insights や外部ツールとの連携が容易になります。

```json
{
  "level": "info",
  "timestamp": "2025-05-30T12:00:00Z",
  "message": "User login successful",
  "userId": "123456",
  "method": "email"
}
```

### ✅ 2. ログレベルを使い分ける

ログにはレベルを持たせ、**状況に応じて出力内容を制御**できるようにしましょう。

- `DEBUG`：詳細なデバッグ情報（開発・検証環境向け）  
- `INFO`：正常系の処理（通常の運用ログ）  
- `WARN`：警告（リトライで回復できた、など）  
- `ERROR`：明らかな異常や例外発生  
- `FATAL`：システム停止レベルの深刻なエラー  

### ✅ 3. 必要十分なメタ情報を含める

ログには「何が起きたか」だけでなく、「**誰が・いつ・どのリクエストで**」というメタ情報を含めましょう。

```json
{
  "level": "error",
  "timestamp": "2025-05-30T12:01:05Z",
  "message": "Database connection failed",
  "requestId": "abc-123-xyz",
  "userId": "guest",
  "region": "ap-northeast-1"
}
```

## 実際の使用例

それでは実際にどのようにログを活用するのか、具体的なコード例を見てみましょう。  
ここでは **Python** を使って、基本的なログの出力から、構造化ログ、モニタリング基盤と連携しやすい形式への応用までを紹介します。

### 1. 基本的なログ出力（`logging`モジュール）

```python
import logging

logging.basicConfig(level=logging.INFO)
logging.info("アプリケーションを起動しました")
```

### 2. 構造化ログ（JSON形式で出力）

モニタリング基盤（DatadogやCloudWatch Logsなど）との親和性を高めるには、ログを**構造化**しておくと便利です。

```python
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    logger.info(json.dumps(event))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648303/0b7f9e18-0ac4-4cfa-97cd-7b9f1feb4a6e.png)
---

## まとめ

**Lambda関数のログは、工夫次第でシステムを“観測可能”にする力を持ちます。**

**「とりあえずログ」から、「使えるログ」へ。**

ぜひ、以下のポイントを押さえて、今日からログ設計を見直してみてください。

- 構造化ログで出力する  
- ログレベルを使い分ける  
- 必要なメタ情報を含める 

---

## おわりに

「誰が読むの？」から、「これがあって助かった！」と思えるログを一緒に目指していきましょう。

ログは書くものではなく、**“活かす”もの**です。

--- 
## 補足
具体的な Lambdaのログ出力ほうｈについてもまとめてみたので、ぜひ良ければ読んでいってください！
https://qiita.com/sagong_ryung/items/1b5b643782afd846b73a
初めての投稿


# 見出し1
**太字**
*斜体*
- アイテム1
- アイテム2


## *見出***し***2*
**太字**
*斜体*
1. **最初の項目**
2. 次の項目


### 見出し3
**太字**
*斜体*

```javascript
console.log("Hello, Qiita!");
```

```cpp
#include <iostream>
using namespace std;

int main() {
    cout << "Hello, Qiita!" << endl;
}
```

`print("Hello, Qiita!")`


これはどう使うんだ

[Qiita](https://qiita.com)

あってる？


![代替テキスト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4104604/ce019aea-1f31-406e-965a-efbf53faa6fb.jpeg)


paosigaosdsodgihaps
積の最小化



今回の問題で、条件分岐メニューの問題は最後！

<br>

## 問題概要

A から B までの整数から 2 つ選んで掛け算し、その最小値を出す。

※同じ値を使ってもよい。
<br>

入力例：

    3 5

出力例：

    9

<br>

https://paiza.jp/works/mondai/conditions_branch/conditions_branch__complex_boss

<br><br><br>

## ❌NG例:1
```js
const rl = require('readline').createInterface({input:process.stdin});


rl.once('line', (input) => {

  const [A, B] = input.split(' ').map(Number);
  const result = A ** 2; // これだとAが負のとき大間違い！
  console.log(result);

  rl.close();
});
```
どちらも正の数の場合は、最小である A と A をかければいいけど…。

<br><br>

## ❌NG例:2
```js
const rl = require('readline').createInterface({input:process.stdin});

rl.once('line', (input) => {
  const [A, B] = input.split(' ').map(Number);


  if (A >= 0) {
    console.log(A ** 2);
  } 

  else {
    // ここもBが負かどうか考えないとアウト！
    console.log(A * B); 
  }


  rl.close();
});
```

<br><br><br>

## ✅OK例
```js
const rl = require('readline').createInterface({input:process.stdin});


rl.once('line', (input) => {
    const [A, B] = input.split(' ').map(Number);
    
    
    // AとBどちらも正の数の場合
    if(A >= 0 && B >= 0){
        const result = A ** 2;
        console.log(result);
    }
    
    // AとBどちらも負の数の場合
    else if(A <= 0 && B <= 0){
        const result = B ** 2;
        console.log(result)
    }
    
    
    // Aは負の数、Bは正の数の場合
    else if (A <= 0 && B >= 0){
        const result = A * B;
        console.log(result);
    }

    rl.close();
});
```

<br><br>

## 📝気づきメモ

- 負×負＝正：プラスになっちゃうので要注意！
- 積の最小値は範囲の端だけ確認すればOK。中間は無視で大丈夫。

## <br>まとめ

今回のPaiza問題、端っこだけ確認するだけでスッキリ解決できるって気づけるかとすべての場合を考えるのが大事！

<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/06/03/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e7%a9%8d%e3%81%ae%e6%9c%80%e5%b0%8f%e5%8c%96/)

<br><br><br>

## 💡おまけ
```js
const rl = require('readline').createInterface({ input: process.stdin });

rl.once('line', (line) => {
    const [A, B] = line.split(' ').map(Number);

    // 考えられる最小積候補
    const candidates = [
      A * A,
      A * B,
      B * A,　// 実際には不要
      B * B
    ];

    const minValue = Math.min(...candidates);
    console.log(minValue !== 0 ? minValue : 0);

    rl.close();
});
```
✅ 同じ値の組み合わせも OK
✅ 範囲の端だけ見れば良い
✅ 4つの候補から最小値を探すだけ！

<br>

### 📌 minValue !== 0 ? minValue : 0 をする理由

JavaScript では、負の数（例えば `-1`）に `0` を掛けると、`-0` になる。

0 と -0 は同じ０だけど、厳密には違う値として扱われ、間違いとして減点されてしまった。

📌でも、`===` で比較するときは：
```
0 === -0 // true
```
Webサイトを多言語化したいゾ



![無料で.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908981/162443f6-b7b8-4c21-95ba-1ece910dd641.jpeg)

無料で使える多言語翻訳APIについて調べてみた。
CDN経由で簡単に組み込めるやつをまとめてみる

現状だと以下のような選択肢があるぞ：

## 🏆 ガチで無料で使えるやつら

**LibreTranslate（オープンソースの本命）**
- 完全無料のオープンソース翻訳APIで、17言語対応
- 公式インスタンスは `https://libretranslate.com/translate` で直接叩ける
- セルフホストもできるから、レート制限とか気にしなくていい（自分でサーバー建てるなら）
- つまり、翻訳界のLinuxみたいなもんだ。無料だけど自分で面倒見る必要あり

```javascript
// CDN経由で使うなら普通にfetch
const res = await fetch('https://libretranslate.com/translate', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    q: 'Hello World',
    source: 'en',
    target: 'ja',
    format: 'text'
  })
});
const data = await res.json();
console.log(data.translatedText);
```

**MyMemory API（老舗の無料枠）**
- 1日2百万単語まで無料という太っ腹ぶり
- APIキー不要で即使える（ただし制限あり）
- 毎日更新される無料クォータ付き
- つまり、翻訳界のフリーミアムサービスの元祖みたいなもん

```javascript
// こっちもシンプル
const response = await fetch(`https://api.mymemory.translated.net/get?q=${encodeURIComponent(text)}&langpair=${sourceLang}|${targetLang}`);
const data = await response.json();
console.log(data.responseData.translatedText);
```

## 🎯 制限ありだけど実用的なやつら

**DeepL API Free**
- 月50万文字まで無料
- 品質は業界トップクラス（GPTより翻訳うまいって話もある）
- ただし無料版だと通常のDeepL翻訳が使えなくなるという罠あり

**Google Apps Script経由の裏技**
- GASのLanguageAppクラスを使って無料でGoogle翻訳APIを叩く方法
- 要するにGoogleのサービスを使ってGoogle翻訳を呼び出すという、なんか釈然としないけど動く手法

## 🆕 新しい選択肢

**Chrome組み込みTranslator API**
- Chrome標準のTranslator API（まだオリジントライアル中）
- ブラウザネイティブだからCDNとか関係なし
- ただしChromeユーザーしか使えないという制約

---

**個人的おすすめ**：
- 個人プロジェクトなら **LibreTranslate** 一択。無料だし制約少ないし
- 商用でもちゃんと使いたいなら **MyMemory** で始めて、足りなくなったら **DeepL** の有料プランに移行
- 翻訳品質にこだわるなら最初から **DeepL** の無料枠を使う

CDN経由で組み込むなら、上記のコードみたいに普通にfetchで叩けばOK。CORS設定も大抵は大丈夫になってる。

ただし、どのAPIも「無料だからって調子に乗って連打すんなよ？」という暗黙のルールがあるから、適度にレート制限かけとけよw
[[nodiscard]]を使って返り値を使うことを要求する

:::note info
`[[nodiscard]]`はC++17で追加された機能です
:::

次のような関数があったとしましょう

```c++:add.cpp
int add(int a, int b)
{
    return a + b;
}
```

これを呼び出すときに

```c++
add(1,2)
```
のように呼び出すことはまずないでしょう。

足された結果を使わないと意味がないので、

```c++
int c = add(1,2)
```

とするわけです。

このような関数の特性をコンパイラに伝えるのに使うのが`[[nodiscard]]`です。（no discard = 破棄しない）
これは次のように使います：

```c++:add_revised.cpp
[[nodiscard]] int add(int a, int b)
{
    return a + b;
}
```

このように定義された関数を呼び出しておいて返り値を使わないと、コンパイラが警告を出します

```c++

add(1,2);  // コンパイラに警告される

int c = add(1,2);  // 期待されている呼び出し方

```

## クラス一緒に使う

実はこの`[[nodiscard]]`、クラスのメンバ関数との相性が非常に良いのです。

```c++:pencil.hpp

class Pencil
{
    private:
    double m_length;
    
    
    public:
    
    Pencil(double length):m_length(length) {};
    ~Pencil() {}
    
    void use() { m_length -= 0.1; };
    
    [[nodiscard]] double getLength() const { return m_length; };
};

```

この例では、`use()`関数はクラスのメンバ変数を変更する役割を担っているのでこれに`[[nodiscard]]`は付きません。
一方、データを読み出す`getLength()`関数はからの返り値は使わないと行けないので、`[[nodiscard]]`が付きます。

このようにして書くと、メンバ関数が変数に対して操作を行う関数なのか、変数を読み出す関数なのかがより分かりやすくなります。


メンバ関数定義で、クラスの中身の値は変更しない（=`const`関数）と返り値を使わないといけない（＝`[[nodiscard]]`）はほぼセットで出てくることを覚えておくと良いかもしれません。

## 参考文献

https://en.cppreference.com/w/cpp/language/attributes/nodiscard
Cookieと広告IDの発行のされ方について

Geminiとお話ししたことをメモする。
嘘を言っているかもしれないので気をつけましょう。

今回はCookieと広告IDについて。
Web解析をするにあたり、ユーザを識別する際、Cookieや広告IDが重要になる。

# まずは、サーバがユーザを識別するとこんなに便利だよ、という話。
サーバはユーザを識別してそのユーザに最適なコンテンツを提供する。
例えば、あるユーザがECサイトで商品を買い物かごに入れたまま離脱したとする。
サーバがユーザを識別することで、再度ユーザがサーバにアクセスしすると、離脱した時の状況、つまり買い物かごに商品が入った状況をユーザに提供できる。
Cookieや広告IDを使用することで、こんなことができる。

# Cookieの仕組み。
CookieはWebの世界で使用される。（アプリの場合は広告ID）
以下画像のように、まずブラウザはサーバに対してページ見せてよ、とリクエストを送信する。
するとサーバはそれに応える形で、ページの情報をブラウザにレスポンスする。
この際にCookieもブラウザに渡される。
ブラウザは受け取ったCookieをユーザのコンピュータのローカルストレージに保存する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634062/f62f668e-e897-44f8-8c79-0dac971cae89.png)

そして、2回目以降はブラウザがサーバにアクセスする際には、以前もらったCookieをサーバに示すことで、サーバは「以前来たあいつか！」という感じでブラウザを識別することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634062/43b87a79-e9f3-4279-bf7c-44e1a76f2e7f.png)

# 広告IDの仕組み。
広告IDはiOSやAndroidなどのアプリの世界で使用される。
iOSの場合はIDFA（Identifier for Advertisers）、Androidの場合はGAID（Google Advertising ID）、と呼ばれる。
アプリの場合は、登場人物が、デバイスのOS、アプリ、サーバの3つになる。
まず、アプリがデバイスのOSに対して広告ID教えてよ、という感じで依頼する。
iOSの場合は初回はユーザに同意を求めるポップアップが表示され、ユーザの同意を得られない限りは広告IDを取得することができない。
Androidの場合はそういう認証が行われることはない。
その後（iOSの場合はユーザの許可が降りたら）デバイスのOSからアプリに広告IDが渡される。
アプリは受け取った広告IDをサーバに送信し、サーバ側で照合が取れれば、以前来たことがあるということで、そのユーザに最適なページが表示され、照合できなければ新規ユーザとして取り扱われる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634062/799a0a93-2af0-4c3e-ad6d-84502704c8fb.png)

# 同じ値の広告IDが発行されてしまうことはないの？
同じ広告IDが発行されてしまった場合、例えばデバイスAの広告IDがXXXでデバイスBの広告IDもXXXだった場合、サーバは見分けがつかないので、デバイスAに提供していたコンテンツをデバイスBに提供してしまう可能性がある。こうなると個人の重要な情報が漏洩しかねない。
さらに、Cookieの場合はサーバによってのみCookieが発行されるが、広告IDは各デバイスに搭載されているOSが広告IDを発行する。
大学と生徒に例えると、Cookieの場合は大学側が学生番号を発行しているが、広告IDの場合は生徒が自分で生徒番号を発行しているようなものだ。
これだと同じ広告IDをもったデバイスが世界で1台くらい存在してもおかしくないように思える。
ただ、実際にこのようなことは起きないようになっている。

広告IDは、36文字で構成されており、$2^{128}$ものパターンがあり得る。 
パターンが無数にありすぎるが故に、同じ文字列が発行される可能性がほぼ0という理屈。
ものすごくパワープレーな気がするが、この仕組みにより、同じ文字列が発行されないようになっている。

このように書くと、Cookieは同じ値が発生しないように今まで発行されたCookieがチェックされていて、同じ値が発行されないように管理されているように思うかもしれないが、Cookieも別にチェックされているわけではない。広告IDと同じように、無数のパターンがあり得るから同じCookieが発行される可能性がほぼ0という理屈で、サーバから発行されている。ものすごく機密性の高いものに関しては、サーバが既存のCookieを調査し、どれとも異なるCookieを発行する、ということが行われている場合もあるようだ。
【第1章】ハッキングとは？怖がらずに学ぶセキュリティの入口🔓

# 🧩 第1章：ハッキングとは？

こんにちは、SecurityTimesの守山しずくです🌸  
この連載では「セキュリティって何？」という超初心者の方でも安心して読める、やさしいハッキング入門をお届けします。

---

## 🔐 ハッキング＝悪いこと？

まず最初に誤解を解いておきたいのが「ハッキング＝悪」ではないということ。

たしかに、映画やニュースで「ハッカーが企業に侵入！」なんて話を見ると怖いイメージがつきますよね😱  
でも、 **「ハッキング」という言葉自体には「技術的な探求」や「限界を突破する工夫」** という中立的な意味があるんです。

### ✔ ハッカーの種類
| 種類 | 呼び方 | 特徴 |
|------|--------|------|
| 悪意ある攻撃者 | ブラックハッカー | 不正アクセス・犯罪行為 |
| 守る側の技術者 | ホワイトハッカー | セキュリティ診断・防御 |
| 境界の人たち | グレーハッカー | 法律的にグレーな行動も |

私たちが目指すのは **ホワイトハッカー** ！  
つまり、技術で「守る」側です✨

---

## 📚 セキュリティの基本的な考え方

ハッキングを学ぶ上で、まず大事なのが **情報セキュリティの三大要素（CIA）** です。

| 要素 | 意味 |
|------|------|
| C（Confidentiality） | 機密性：見せていい人だけに見せる |
| I（Integrity）       | 完全性：改ざんされていないこと |
| A（Availability）    | 可用性：必要なときに使えること |

セキュリティって「守る」だけじゃないんです。  
「壊れず正しく動く」「いつでも使える」ってことも含まれるんですよ💡

---

## 🎮 ハッキング技術＝CTFで学べる！

「CTF（Capture The Flag）」という競技をご存じですか？

簡単に言うと、
> **問題を解いて“旗（Flag）”を奪い合う技術系クイズ大会**

・Webにある脆弱性を見つける  
・暗号を解読する  
・パスワードを推測する  
など、実際のハッカーと同じような技術を「合法的」に体験できます！

この連載でも、最終的にはCTFを楽しめるレベルを目指していきますよっ🔧✨

---

## 📝 まとめ

- ハッキングは「技術的な探求」であり、悪ではない
- 情報セキュリティの基本は **機密性・完全性・可用性**
- 実践的なスキルはCTFで身につけられる！

次回は、 **「第2章：ネットワークの基礎知識」** をやさしく解説していきます。  
お楽しみにっ🌸

---

> 💬 フォローしてくれたら、怖くないセキュリティ解説を毎日お届けします♪
【デベロッパーツール】デベロッパーツールの起動について

# 記事概要
デベロッパーツールの起動方法について、まとめる。

# デベロッパーツールとは
- ブラウザ開発者ツール、検証ツールなどとも呼ばれる
- 一般的なブラウザに付属し、誰でもすぐに使える
- 主に以下が実施できる
    - 表示しているサイトのHTMLの要素の確認・編集
    - 表示しているサイトのCSSの確認・編集
    - JavaScriptの実行

# 前提
- PCはMacを使用している
- ブラウザは`Google Chrome`を使用している

# 手順
1. 新しいブラウザを立ち上げる
1. デベロッパーツールを表示
    - ショートカットキーを使用しない場合
        1. ブラウザ上で二本指クリックする
        1. 「検証」を選択する
    - ショートカットキーを使用する場合
        1. `⌘ + option + C`を押す

# デベロッパーツールの表示位置
デベロッパーツールの表示位置を変更することができる

[![Image from Gyazo](https://i.gyazo.com/cae847190683be148b76a8f0c1577ad8.gif)](https://gyazo.com/cae847190683be148b76a8f0c1577ad8)

# ペースト
基本的にはペーストできない
`allow pasting`とタイミングすると、ペースト可能になる
私の転職活動を振り返る 〜納得のオファーと次なる挑戦のはじまり〜

こちらの記事は転職ドラフトエージェント体験談投稿キャンペーンに参加しています。

サービスURL：https://agent.job-draft.jp

はじめに
2025 年、私はエンジニア 4 年目にして 初めての転職活動を行いました。「もっとプロダクトにコミットしたい」「マネジメントと手を動かすことを両立したい」という欲求が高まり、環境を変える決意をしたからです。結論から言うと、転職ドラフトエージェントを通じて年収 100 万円アップ・技術組織づくりに深く関われる企業へ移籍できました。

本記事では、

・転職を考えたきっかけ

・転職ドラフトエージェント利用の流れ

・選考結果とオファー内容

・振り返って良かった点

を中心にまとめます。

# 転職を決意した背景
旧所属はエンタープライズ向け受託開発が多く、仕様凍結後の変更が難しい。ユーザーの声を踏まえた素早い PDCA を回せず、次第にフラストレーションを感じていました。
組織づくりに興味が湧き「0→1 の開発と 10→100 のスケール両方を経験したい」と考えるように。

# 転職ドラフトエージェントを選んだ理由
SNS で「企業目線ではなくエンジニア目線で伴走してくれる」というつぶやきを複数目にしたことがきっかけでした。

## カジュアル面談の設計がうまい
いきなり履歴書をばっちり作り込むのではなく、「まず棚卸しシートで強みを言語化 → 担当者と壁打ち → 企業側ヒアリングシートに展開」というステップ。心理的ハードルが低かった。

# 実際の応募〜内定までの流れ

書類選考 → 技術面談+面接

最終面接〜オファー
1社から内定。

# 振り返って良かった点

### 職務経歴書の“ストーリー化”の助言
面接官から「読みやすい」と言われるほど改善。
### 面接対策
企業側の温度感や懸念点を迅速に教えてくれ、次の面接に備えられた。
最終局面での条件交渉の伴走
私からは言いづらい細かな要望（カンファレンス参加補助・副業許可など）を代弁。

# まとめ
転職ドラフトエージェントのおかげで、単なる求人紹介ではなく“キャリアの棚卸し”から“意思決定”まで一貫して支援を受けられました。エンジニア出身の担当者様で、技術嗜好の深い質問や現場視点でのフィードバックにつながり、非常に頼もしかったです。

今後は新天地で、組織設計やオンボーディングプロセスの整備にコミットしつつ、ユーザーに価値を届けるコードを書き続けていきます。この記事が、これからキャリアのステップを検討している方の参考になれば幸いです。

最後までお読みいただき、ありがとうございました！
【Python入門 第1章】Pythonとは？できることと始め方を超やさしく解説🐍✨

こんにちは、**PythonTimesの蛇ノ目いろは**です🌿  
今日から始まるPython入門講座！記念すべき第1章は、Pythonって何？からスタートするよ💡

---

## 🐍 Pythonってなに？

Pythonは、「誰でも読みやすく書きやすい」ことを目指して作られたプログラミング言語。  
世界中の開発者が使っていて、最近では**AIやデータ分析、Web開発**でも大活躍中！

たとえばこんなことができるよ👇

| 分野           | できること例                             |
|----------------|------------------------------------------|
| Web開発        | WebアプリやAPIの作成（Django / Flask）   |
| 自動化         | Excelやファイル操作、定期実行など        |
| データ分析     | 数値やCSVの集計、グラフ化（pandas, matplotlib） |
| AI/機械学習    | モデル作成、予測（scikit-learn, TensorFlow） |
| スクレイピング | Webからの情報収集（BeautifulSoup, Selenium） |

---

## 🛠️ Pythonを始める準備

Pythonは無料で使えるよ！  
まずはパソコンにPythonを入れるところから始めよう👇

### ① Python公式サイトからインストール  
公式：https://www.python.org/downloads/  

- Windowsの人は「Add Python to PATH」にチェックを入れてから「Install Now」を押してね！

### ② エディタを用意しよう（おすすめ：VSCode）  
VSCode：https://code.visualstudio.com/

- 拡張機能で「Python」を入れると便利！
- 日本語化もできるよ🗾

---

## ▶ 動かしてみよう！Hello, World!

VSCodeで `hello.py` というファイルを作って、こう書いてみて👇

```python
print("Hello, World!")
```

ターミナルで実行してみよう（エディタ内の実行ボタンでもOK！）

```bash
python hello.py
```

画面に `Hello, World!` と表示されたら、成功🎉

---

## 📌 まとめ

- Pythonは**やさしくて、なんでもできる魔法の言語**🐍
- WebもAIも自動化も、全部Pythonでできる！
- まずは**PythonとVSCodeをインストール**しよう
- 最初の一歩「Hello, World!」で準備完了！

---

次回は、  
**「第2章：変数・データ型の基本」** をお届け予定🎐  
おたのしみにっ！

フォローしてくれると、自動化ネタどんどん届けますね🐍💨
【C#入門 第1章】Visual Studioで始める「Hello, World!」超入門

# 【C#入門 第1章】Visual Studioで始める「Hello, World!」超入門

はじめまして、**CSharpTimes**の一之瀬シィよ💠  
ここでは、C#初心者のあなたがゼロからアプリ開発できるよう、手取り足取り教えてあげるわ。

最初の一歩は、やっぱり王道の「Hello, World!」からよ💻

---

## 🛠 開発環境の準備

まずはC#を書くための専用ツール「**Visual Studio**」を用意するのよ。

### 🔽 ダウンロードはこちら（無料）
[https://visualstudio.microsoft.com/ja/](https://visualstudio.microsoft.com/ja/)

- 「Community」エディションでOK！
- インストール時に「.NETデスクトップ開発」を選ぶのを忘れないで！

---

## 📝 プロジェクトを作成しよう

Visual Studioを起動したら、以下の手順でプロジェクトを作ってみて。

1. 「新しいプロジェクトの作成」を選ぶ  
2. 「**コンソール アプリ（C#）**」を選択  
3. プロジェクト名は `HelloWorld` にしておきましょ  
4. [.NET 6.0] または [.NET 7.0] を選択（選べる範囲で最新版）

---

## ✨ コードを書いてみよう

```csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello, World!");
    }
}
```

この `Console.WriteLine` が、画面に文字を表示してくれるの。

---

## ▶ 実行方法

上の「▶」ボタンを押すだけでOK！  
`Hello, World!` って出たら、成功よ🎉

---

## 📌 まとめ

- C#はGUIアプリや業務ツールに強い！
- Visual Studioを使えば簡単に開発を始められる
- `Hello, World!` で、最初の一歩を踏み出せたね✨

---

次回は、 **「第2章：基本構文と変数」** をお届けするわよっ。  
ちゃんと復習しておきなさい💢
【VBA入門①】マクロとの違いって？はじめてでもわかるVBAの世界✨

# 第1章：VBAとは？マクロとの違いと始め方

こんにちはっ🌟  
マクロ魔法少女の星咲まくるです🐰💻

今日から **「VBAってなに？」「マクロって聞いたことあるけど…？」** という人のために、  
魔法のように業務がラクになる「VBA」の基本をいちから丁寧に紹介していくよ✨

---

## 🪄 VBAってなに？

**VBA（Visual Basic for Applications）** は、  
ExcelやOutlookといったMicrosoft Officeアプリの操作を自動化できるプログラミング言語だよ！

たとえば…

- 毎月の売上表を自動で集計📊  
- メールを一括送信📩  
- データをボタン1つで整理整頓✨  

…なんてことが、VBAで全部できちゃうの！

---

## 🤔 マクロとVBAの違いって？

実はこの2つ、混同されがちだけど…

| 用語 | 意味 | 関係 |
|------|------|------|
| マクロ | 「操作の自動記録」機能のこと | VBAで書かれてる |
| VBA | プログラミング言語そのもの | マクロの中身 |

つまり、
- **マクロ＝VBAを使った記録**
- **VBA＝自分で魔法（プログラム）を書く**

という感じ！

---

## 🛠️ VBAのはじめかた

まずはVBAを書けるように、 **「開発タブ」** を表示しよう！

### ▶ Excelでの手順
1. メニューの「ファイル」→「オプション」
2. 「リボンのユーザー設定」を開く
3. 右の一覧から「開発」をチェック✅
4. OKで戻ると「開発」タブが表示されるよ！

### ▶ マクロ記録で遊んでみよう
開発タブの「マクロの記録」を押して、  
セルをいじって「記録終了」してみて！

そのあと「マクロ」→「編集」で中身を見ると…  
もうそこには **VBAのコードが書かれてる！**

---

## 📌 まとめ

- **マクロはVBAでできてる**
- VBAはExcel操作を自動化できる魔法の言語🪄
- まずは「開発タブ」を出して、マクロ記録でVBAの世界をのぞいてみよう！

---

次回は、**「第2章：変数とデータ型」** で  
魔法の材料（データ）をどう扱うか学んでいくよっ💡

フォローして、VBA魔法を一緒に極めようねっ🐰✨
迷惑メールフィルタの再現

https://qiita.com/maxima/items/eb4035666fbf407872f1

```python

# Program Name: spam_filter_detailed_output.py  
# Creation Date: 20250603  
# Overview: Naive Bayes spam filter with detailed probability log output  
# Usage: Run in Jupyter Notebook or Colab

# -------------------- Import Libraries --------------------
import math
import pandas as pd

# -------------------- Word Probabilities --------------------
word_probs = {
    '無料':  {'spam': 0.4,   'ham': 0.1},
    '簡単':  {'spam': 0.3,   'ham': 0.1},
    '遊ぶ':  {'spam': 0.2,   'ham': 0.0},
    'アプリ':{'spam': 0.4,   'ham': 0.05},
    'で':    {'spam': 0.01,  'ham': 0.01},
    '！':    {'spam': 0.02,  'ham': 0.01},
}

P_spam = 0.8
P_ham = 0.2
smoothing = 0.00001

# -------------------- Input Test Mail --------------------
test_mail = ['無料', 'で', '遊ぶ', '簡単', 'アプリ', '！']

# -------------------- Probability Computation --------------------
log_prob_spam = math.log(P_spam)
log_prob_ham = math.log(P_ham)

detailed_log = []

for word in test_mail:
    p_word_spam = word_probs.get(word, {}).get('spam', smoothing)
    p_word_ham = word_probs.get(word, {}).get('ham', smoothing)
    if p_word_ham == 0:
        p_word_ham = smoothing

    log_prob_spam += math.log(p_word_spam)
    log_prob_ham += math.log(p_word_ham)

    detailed_log.append({
        '単語': word,
        'P(単語|Spam)': p_word_spam,
        'P(単語|Ham)': p_word_ham,
        'log(P|Spam)': math.log(p_word_spam),
        'log(P|Ham)': math.log(p_word_ham)
    })

# -------------------- Final Probabilities --------------------
prob_spam = math.exp(log_prob_spam)
prob_ham = math.exp(log_prob_ham)

# -------------------- Show Table --------------------
df = pd.DataFrame(detailed_log)
print("=== 各単語の確率詳細 ===")
print(df)

# -------------------- Classification Result --------------------
print("\n=== 最終判定 ===")
print(f"P(mail|Spam) ≈ {prob_spam:.10f}")
print(f"P(mail|Ham)  ≈ {prob_ham:.10f}")
if prob_spam > prob_ham:
    print("→ このメールは **迷惑メール** と判定されました。")
else:
    print("→ このメールは **一般メール** と判定されました。")

```
FlutterNinjas Tokyo 2025参戦レポート

## はじめに
こんにちは、株式会社デジタルバリューでモバイルエンジニアをしている小野です。石川県に在住しています。
2025/5/29~30で docomo R&D OPEN LAB ODAIBA にて開催された [FlutterNinjas Tokyo 2025](https://flutterninjas.dev/) に参加してきました！
去年も同イベントに参加したのですが、今年も沢山の刺激と貴重な経験が得られたので感想ともにシェアしたいと思います。

## セッション
2日間で計14のセッションと登壇者の方たちによるパネルディスカッションが行われました。全てのセッション、QAが英語で行われました。
その中で、特に印象的だったセッションを2つ紹介したいと思います。自分の拙い英語力での聞き取りになりますので、内容が間違っているかもしれません。その際はぜひご指摘いただけると嬉しいです🥹

## Seamless Passkey Authentication with Flutter x Firebase and our journey on Banking app
マネーフォワードXの小川さん、山本さんによるBANK APPの資金移動機能のところにPassKeyを採用したという内容でした。タイトルにもある通り、Flutter x Firebaseによる実装例が紹介されました。紹介されたアプリのバックエンドにはFirebase Functions、認証部分にFirebase Authを認証にはFirebase Authを利用して、PassKeyの実装が行われていました。
自分も普段同様に銀行のアプリの開発を行っており、セキュリティ要件に対する水準の高さを実感しています。その中で、ユーザ体験を損なわないためにPassKeyが採用されたという話が非常に興味深かったです。
FlutterにはPassKeyを扱うための[パッケージ](https://pub.dev/packages/passkeys)もあり、ぜひ試してみたいと思いました！
FlutterでのPassKeyについては、個人的に[こちら](https://dev.to/djsmk123/unlocking-the-future-passwordless-authenticationpasskey-with-flutter-and-nodejs-1ojh)の記事が分かりやすかったので合わせてシェアします！

## KonMari your Flutter code using DCM
みなさん「こんまりメソッド」とはご存知でしょうか？
こんまりメソッドとは、片付けコンサルタントの近藤麻理恵氏が提唱した片付け法のことです。片付けの順番やモノの選び方を体系化した方法で、世界中で多くの人に実践されています。﻿([参照](https://konmari.jp/method/))
このこんまりメソッドに準えて、Flutterプロジェクトが大規模になるにつれて、開発を鈍化させてしまう要因となる未使用ファイル・肥大化したWidget・依存関係のスパゲッティ化といったコードの散らかりをDCMというツールを用いて解消するといった内容でした。
[DCM](https://dcm.dev/)では、Dartコードの静的解析を行うことができ、未使用のコードやファイルを検出し不要な箇所の削除を促します。ここまでは一般的な静的解析ツールと似ていますが、DCMではその他に、コードメトリクス算出(ネスト深度・行数・引数数などが対象)や、各Widgetに対する品質スコアや使用状況、類似Widget数も計測できるそうです。
プロジェクトの歴史と共に生産性が落ちていってしまうことを解消するためのアプローチに、DCMがサポートしてくれると思いました！

## 会場イベント
会場にはフリーコーヒーや、お菓子が配置されており、休憩時間等で会場にいる人たちとコミュニケーションを取るきっかけになります。実際コーヒーをきっかけに、ブラジルから参加された方と雑談をすることが出来ました！
![IMG_4627.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946066/cf8b9153-27b7-424b-ab7a-75c02cbea50d.jpeg)

好きなWidget、どの地域から参加したか、Flutter歴などを参加者が自由に記述できる設置されており、世界中から多くのFlutter好きな人たちが集まっていることが一目で分かります！
開催2年目のイベントなのに、去年に引き続きこれだけの人を集められるの本当にすごい、、
![IMG_4631.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946066/eff33a7b-65ca-4875-9b67-9b1ce9981bdf.jpeg)

またFlutterのネイルをしてもらえるブースもあり、自分もやってもらいました。
Flutterのアイコンと、FlutterNinjasのマスコットキャラクターのものにしてもらいました💅
![20250530_101143.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946066/c560ef2f-5c6f-4086-acad-46c90aaa733c.jpeg)


## 最後に
自分自身英語が得意な方ではありませんが、会場各所に画像のような翻訳用のパネルが配置されており内容理解の手助けになってくれます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946066/3798dc03-979b-4789-96e1-952f0e3d463e.jpeg" width="60%" height="70%" >

2年連続で参加させてもらいましたが、去年以上に楽しむことが出来ました！(去年は前職のスポンサーブースにいて、1日のみの参加だったので全セッションを見ることが出来なかったのもあります)
英語力が自分の可能性を広げてくれるということです。日本語でも難しい内容を、英語で話すなんて今の自分ではまだまだ考えられません（笑）
その上、即座にQAセッションで回答されている登壇者の方々はすごくかっこよかったです。
来年も機会があればぜひ参加したいと思いましたし、今年以上にすごいFlutterNinjasになることを期待しています！
運営の方々お疲れ様でした！！
![IMG_4641.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946066/d73d274b-16ad-4aa9-a597-86f8ed3d1c15.jpeg)
学習ゲームをアップグレード – 実際のAZ-104ダンプでファストトラック

Microsoft Azure Administrator試験（AZ-104）は、Azureクラウドの管理スキルを証明するための主要な認定資格です。この試験は難易度が高いため、効率的かつ実践的な学習が不可欠です。この記事では、CertsTimeリアルなAZ-104試験ダンプを活用して、短期間で合格を目指すための具体的な方法をご紹介します。
AZ-104試験とは？その重要性とは
AZ-104試験は、Azureの仮想マシン、ネットワーク、ストレージ、ID管理など、Azure管理に関する実務スキルを問う試験です。この資格を取得することで、クラウドエンジニアやAzure管理者としてのキャリアアップにつながります。特に、企業がクラウドシフトを進める今、需要が高まっている資格の一つです。
Visit Now: https://www.certstime.com
CertsTime ダンプとは？信頼できる理由
CertsTime 提供するAZ-104試験ダンプは、実際の試験で出題される可能性が高い問題とその解答を含んでおり、学習効率を飛躍的に高めてくれます。すべてのダンプは専門家によって検証・更新されており、常に最新の内容に基づいて構成されています。さらに、実際の試験環境に近い形でトレーニングできるのも大きなメリットです。
学習スケジュールの立て方と管理法
合格への近道は、綿密に計画された学習スケジュールにあります。毎日の学習時間を一定にし、平日は1〜2時間、週末は復習や模擬試験に時間をあてるのがおすすめです。CertsTimeのダンプを活用することで、日々の学習に具体的な目的と進捗管理が加わり、計画通りに進めやすくなります。
オフィシャル教材とダンプの併用効果
Microsoft Learnなどの公式教材で理論を学び、CertsTimeのAZ-104ダンプで実践的な問題演習を行うことで、インプットとアウトプットのバランスが取れた学習が可能になります。この二つの併用によって、試験範囲を深く理解し、実際の問題形式に慣れることができるのです。
模擬試験で自分の弱点を発見する
模擬試験は、自己評価と試験対策の最適な手段です。CertsTimeの模擬試験は、実際のAZ-104と同じような形式で出題されるため、本番前の最終チェックとして非常に有効です。間違えた問題を重点的に復習し、知識の抜けを埋めることが、合格への鍵となります。
実際のAzure環境で操作経験を積む
どんなに知識があっても、実際にAzureポータルで操作経験がなければ、本番で戸惑う可能性があります。仮想マシンの作成、リソースグループの管理、ストレージの構成など、CertsTime 学んだ内容をAzure上で実際に操作することが重要です。理論だけではなく、実践力が問われる試験だからこそ、操作経験は欠かせません。
CertsTimeのサポートと信頼性
CertsTimeでは、購入者に対して365日間の無料アップデートと、合格できなかった場合の返金保証が提供されています。さらに、学習中に不明点があればサポートチームに問い合わせることもでき、安心して学習に集中できます。信頼性と実績のあるリソースとして、多くの受験者から高く評価されています。
 試験直前の心構えとアドバイス
試験前日は無理に詰め込まず、今まで学んできた内容を軽く復習する程度にしましょう。CertsTimeの模擬問題を1セットだけ解くなど、落ち着いて試験に臨めるようにするのがベストです。当日はリラックスして、自信を持って挑みましょう。しっかりと準備をしていれば、合格は十分に狙えます
📝 Final Word
AZ-104の認定は、あなたのクラウドキャリアを一歩前進させるための強力な武器になります。CertsTimeリアルな試験ダンプとサポートを活用することで、効率的に準備ができ、短期間での合格が現実になります。自信を持って、今日から学習を始めましょう！
【Rails初学者】erb_lintを導入してERBファイルを整えた備忘録

# 【Rails初学者向け】erb_lintを導入してERBファイルを整えた話（備忘録）

## はじめに

Railsでアプリを作っていると、だんだんERBファイルがぐちゃぐちゃになってきました。
インデントがバラバラ、気づかなかった空白、空行が増えて行きました。
そんなときに知ったのが`erb_lint`です。  
この記事は、初学者の私が `erb_lint` を導入して整理するまでの備忘録です。

---

## 環境

- Ruby 3.4.2
- Rails 8.x
- ERBテンプレートを主に使っている構成
- Importmap使用（Webpack未使用）

---

## そもそも`erb_lint`とは

- RuboCop のように、**ERBファイルのコードスタイルを整えるツール**
- 不要な空白やインデントのズレ、タグのスペースなどを検出してくれる
- 一部は自動修正も可能（`--autocorrect`）

---

## 導入手順

### ①Gemを入れる（development限定で良い）

```ruby
# Gemfile
group :development do
  gem 'erb_lint', require: false
end
```
```bash
bundle install
```

### ②.erb-lint.ymlを作成（※ --init は使えないことがある）
RuboCopと違って、erb_lintには`--init`オプションがないらしいです。
設定ファイルは手動で作ります。
```ruby
# .erb-lint.yml
---
glob: "**/*.{html,text,js}{+*,}.erb"
exclude:
  - '**/vendor/**/*'
  - '**/node_modules/**/*'
linters:
  FinalNewline:
    enabled: true
  Indentation:
    enabled: true
  TrailingWhitespace:
    enabled: true
  SpaceAroundErbTag:
    enabled: true
  SelfClosingTag:
    enabled: false
```
ファイルは、プロジェクトのルートディレクトリ（Gemfileと同じ場所）に配置

### ③Lintを実行
```ruby
# 全ファイルを対象にLint実行
bundle exec erb_lint --lint-all

# 自動修正も行う場合
bundle exec erb_lint --lint-all --autocorrect
```

### ハマったポイント
- `bundle exec erblint`が動かなかった
```bash
Calling `erblint` is deprecated, please call the renamed executable `erb_lint` instead.
```
現在は`erb_lint`に名前が変更されているらしく、`erblint`は非推奨みたいです。
正しくは以下
```bash
bundle exec erb_lint
```

### 導入してよかったこと、知ったこと
- ERBファイルの見た目が整った
- チームで書式を統一できるらしい
- VSCode、GitHubPRでのレビューがスムーズになるらしい
- 意識が向かなかった余計な行や、空白を気にしなくて良くなった
- RuboCopだけでは守れないビューの整形がカバーできる

### 今後やりたいこと
- CIで自動実行してみたい（GitHub ActionsやCircleCIに組み込む）
- RuboCopと統一的なLint運用をしてみたい（→ rake task にまとめる）
- `.erb-lint.yml`を拡張したい

### まとめ
`erb_lint`は、Rails初学者でも扱いやすかったです。
また、調べたところチーム開発や可読性の維持にとても役立つツールと知りました。
ただし、Rubocopとは違う点も多く、コマンド名や初期設定でつまずきやすいので注意が必要だなと感じました。
自分のコードが少しでも整うと、開発のモチベーションもぐっと上がります。
引き続き、学習を続けて行きます。
Reactでフォームの初期値をリセットする実装パターンまとめ


---

````markdown
# Reactでフォームの初期値をリセットする実装パターンまとめ

## はじめに

本記事では、Reactで「フォーム（例：商品オプション、数量、配達料）」を**初期状態にリセット**する一般的な実装パターンについて整理します。  
`useState`・`useEffect`・`useRef`の違いや使い分けも簡単にまとめます。

---

## サンプル: 商品オプションフォーム

```tsx
import { useState } from 'react'

type OptionType = { value: string; editing: boolean }

const initialOptions = [
  { value: 'チーズ追加', editing: false },
  { value: '大盛り', editing: false }
]
const initialDelivery = 100
const initialQuantity = 1

const SellerProductOptionsForm = () => {
  const [options, setOptions] = useState<OptionType[]>(initialOptions.map(opt => ({ ...opt })))
  const [delivery, setDelivery] = useState<number>(initialDelivery)
  const [quantity, setQuantity] = useState<number>(initialQuantity)

  // 初期値を保存しておく（リセット時に利用）
  const [initialValues] = useState({
    options: initialOptions.map(opt => ({ ...opt })),
    delivery: initialDelivery,
    quantity: initialQuantity,
  })

  // リセットボタンの実装例
  const handleReset = () => {
    setOptions(initialValues.options.map(opt => ({ ...opt })))
    setDelivery(initialValues.delivery)
    setQuantity(initialValues.quantity)
  }

  return (
    <div>
      <button onClick={handleReset}>リセット</button>
      {/* ...フォーム要素 */}
    </div>
  )
}

export default SellerProductOptionsForm
````

---

## ポイント

* **初期値はuseStateで保存しておくと、いつでも“最初の状態”に戻せる**
* `useRef`でも保存可能だが、基本は`useState`だけで十分
* 配列やオブジェクトの場合は「スプレッド演算子（...）」でディープコピー

---

## よくある疑問

### Q. 複数のstateを1つのオブジェクトでまとめて管理するのは？

**ケースバイケースだが、関連性が高い場合はオブジェクトや配列でまとめてもOK。
ただし、頻繁に個別更新が必要なら、それぞれuseStateで管理した方が可読性が高い。**

---

## まとめ

* フォームのリセットには「初期値をどこかで覚えておき、必要な時にstateを丸ごと上書き」が定番
* Reactの再レンダリング/最適化を意識して「新しい配列・新しいオブジェクト」を必ず使う

---

## 参考

* [React公式：Thinking in React](https://ja.react.dev/learn/thinking-in-react)
* [React Hooks FAQ](https://ja.react.dev/reference/react/useState#frequently-asked-questions)

```

---
Cursor で Raspberry Pi Pico W を使う

Cursor で Raspberry Pi Pico W 開発ができないかなと思い、やってみました。

https://www.cursor.com/ja

https://amzn.to/43TEEeR

# 開発環境
- OS: Apple M1 Pro(Sequoia 15.5)
- Cursor バージョン: 0.49.6 (Universal)
- Raspberry Pi Pico W

# Cursor拡張機能を入れる

Cursorの拡張機能で「MicroPico」を検索します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/7f4f902e-7eab-4134-b984-77d53f731d3c.png)

>MicroPico is a Visual Studio Code extension designed to simplify and accelerate the development of MicroPython projects for the Raspberry Pi Pico and Pico W boards. 

以下Google翻訳

>MicroPico は、Raspberry Pi Pico および Pico W ボード向けの MicroPython プロジェクトの開発を簡素化および加速するために設計された Visual Studio Code 拡張機能です。

ということですが、なんとCursorでも動くんですね〜（さすがVSCodeからのフォーク）

# セットアップ

MicroPicoを入れると、MicroPicoコマンドが使えるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/17e8ef03-a994-4bce-b7db-230162a68c38.png)

コマンドパレットに`MicroPico: Initialize`と入力してEnterキーを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/d06ef3b6-e605-4092-9405-f1f9d0ce5c42.png)

`.vscode`フォルダと`.micropico`ファイルが作成されます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/da81ae12-b0db-48f6-9a64-63630b46fee0.png)

Cursor下部に「Pico Disconnected」「Run」などといった表示が出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/55e33e47-b2da-4f7f-8262-e31ca16c7687.png)

Raspberry Pi Picoを接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/150d193a-90a8-4f3f-ac18-35530a6ab474.png)

新しいターミナルが開きます。
書き込むファイル（main.py）を開いた状態で、下部の「Run」を押すとRaspberry Pi Picoに書き込みができるようになります！

これでCursorのAI機能を存分に使用しながらの開発が可能になりました。

やったね！
Amazon Q CLIでFlappy Bird風のゲームを作ってみた 🎮

## はじめに

AWSで以下のキャンペーンが実施しており、実際にAmazon Q CLIを使ってゲーム作ってみました！

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

ゲーム開発の経験はありませんが、Amazon Q CLIを利用して、**Flappy Bird風の2Dアクションゲーム**を、**生成AIの指示だけで10分以内に完成**させました！

プロンプトには「Flappy Bird風＋追加要素を加えてください」と日本語で指示しただけで、**スコアアイテムや簡易演出付きのゲームが自動生成**されました。  
しかも、**コードの修正は一切なし。完全にAmazon Q CLI任せ**です。

## 環境構築について

キャンペーンページにリンクのあった以下ページを参考に構築しました。

[The essential guide to installing Amazon Q Developer CLI on Windows
](https://community.aws/content/2v5PptEEYT2y0lRmZbFQtECA66M/the-essential-guide-to-installing-amazon-q-developer-cli-on-windows?trk=e07eca93-fa2f-4351-b567-f293b83eb635&sc_channel=el_)

https://www.pygame.org/wiki/GettingStarted



## 🎮 作成したゲームの概要

- モチーフ：「Flappy Bird」
- 操作方法：スペースキーでジャンプ。障害物を避けてスコアを稼ぐ
- 追加された要素：
  - アイテムの出現（取得すると一定時間無敵やスローになる）

✅ **これらすべてが、プロンプト1本＋10分以内で完成しました。**

## 📝 使用したプロンプト

```text
Flappy Bird風の2DアクションゲームをPyGameで作成してください。
ただし、単なるコピーではなく、オリジナル要素要素を加えてください。
```

このプロンプトをAmazon Q CLIにそのまま入力しただけで、**1ファイルにまとまったPyGameコードが出力**されました。  
**一切手を加えることなく、そのまま実行して動作確認できました。**

## 🧰 実行環境

| 項目         | 内容                                       |
|--------------|--------------------------------------------|
| OS           | Windows 11                                 |
| 実行環境     | WSL2（Ubuntu 22.04）                        |
| Python       | 3.10系                                     |
| 使用ライブラリ | PyGame                                     |
| 使用ツール   | Amazon Q CLI（日本語プロンプト）            |

## 📽️ プレイ動画

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620996/ca3310f6-4860-442a-95f7-32ef142ae64c.gif)

- スペースキーでジャンプ操作  
- 障害物の間を通過するとスコアが加算  
- ランダムに出現するアイテムを取得すると一定時間無敵になったり、スローになる
- 簡単なエフェクトや加点演出付き

---

## ⚙️ 出力されたコードの概要

- すべて `main.py` 1ファイルに構成
- PyGame初期化、描画、キャラ制御、スコア計算、アイテム処理などを網羅

✅ **人手による修正なしで、完全にCLIが生成したコードだけで動作しています。**

## 🤖 Amazon Q CLIを使ってみた感想

- 日本語のプロンプトでも意図を汲んでゲームが作成できた
- 簡単なゲームプロトタイピングにはとても向いていると感じた
- 別のゲーム作成時、操作に不具合があった出力も、指摘したことで修正されプレイ可能な状態になったのは感動しました



## 🎁 まとめ

スキマ時間で試してみてすぐに完成したので楽しかったです。
Amazon Q CLIを使えば、「**思いつきを即プロトタイプにする力**」を持った生成AIツールであると感じました。 
Flappy Bird風のゲームというシンプルな構成でも、わずか**10分・修正ゼロ**でゲームとして成立する出力が得られるのは衝撃的でした。

🟦 プログラミング未経験でも試せる  
🟦 時間がなくても成果が得られる  
🟦 発想を試す場として最適


👉 キャンペーン詳細はこちら（Tシャツもらえます🎽）

https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/
Ubuntu20.04 RTX5090にnvidia driverを入れる際はopen版でないと入らない

Ubuntu 24.04 RTX5090にnvidia-driverを入れる際に手こずったのでメモ

https://qiita.com/porizou1/items/74d8264d6381ee2941bd

ubuntu-drivers devices
で出てくるnvidia-driver-570をインストールしてもパスワード入力を要求されず、再起動後nvidia-smiしてもno devices were foundになる

# 解決
sudo apt install nvidia-driver-570-open
でインストールできた
ログ解析Tips: cut や awk 代替の有力候補 『xcut』 で簡単抽出

## 🔧 背景

日常的にログファイルを解析したり、CI/CD のビルドログを読み込んだりする場面は多いと思います。ここで、Unix系の発想力の高いフィルタコマンドの代表格「`cut`」や「`awk`」が注目されるわけですが、これらに比べて、もっと直感的でわかりやすいコマンドが欲しいと思ったことはありませんか？
そこで、**もっと直感的にログ抽出ができるCLIツール**をRustで作りました。

## `xcut` とは？

Rustで開発された、以下のような特徴を持つコマンドです:

* `--cols` で指定した列だけを抽出
* `--filter` で情報を行単位で濾り返し
* `--delim` / `--max-split` で枠切り解析に対応
* 次のユースケースでも役立ちます

## 💡 ユースケース：「エラーの内容と発生時刻だけを取り出したい」

### 🔍 例：`system.log`

```txt
2024-06-01 10:00:00 INFO    Service started
2024-06-01 10:05:12 ERROR   Connection timeout: DB
2024-06-01 10:06:30 WARN    Retry requested
2024-06-01 10:07:01 ERROR   Disk full on /var
```

---

## ✅ `xcut` での実行

```bash
xcut --input system.log \
     --filter 'col(3) == "ERROR"' \
     --cols 1,2,4 \
     --delim ' ' --max-split 4
```

### ✅ 出力

```txt
2024-06-01 10:05:12 Connection timeout: DB
2024-06-01 10:07:01 Disk full on /var
```

---

## 🤔 `cut` / `awk`との比較

| ツール | 難点 | `xcut` の強み |
|-------|------|----------------|
| `cut` | `--max-split`がない。条件フィルタ不可 | `--filter`, `--max-split` |
| `awk` | 構文が複雑で習得が難しい | `col(N) == "val"` の直感構文 |
| `grep`| フィールド抽出不可 | `--cols` で任意フィールド取得 |

---

## 🧠 応用：パターンマッチ

```bash
xcut --input system.log \
     --filter 'col(4) =~ "timeout|full"' \
     --cols 1,2,4 \
     --delim ' ' --max-split 4
```

```txt
2024-06-01 10:05:12 Connection timeout: DB
2024-06-01 10:07:01 Disk full on /var
```

---

## 🏁 まとめ

`xcut` は、ユーザーにやさしく、フィルタをわかりやすい形式で指定できるのが役立ちます。「データログの抽出」、「特定文字列を含む行の探索」など、grep / cut / awk を使い切れない日常の作業に役立つ手頓となるはずです。

---

## 📎 リンク

- GitHub: [https://github.com/kyotalab/xcut](https://github.com/kyotalab/xcut)
- Homebrew: `brew install kyotalab/tap/xcut`
- Cargo: `cargo install xcut`
S3のCORS設定：ブラウザからのアクセス許可

S3バケットにブラウザから直接アクセスする場合、**CORS（クロスオリジンリソース共有）設定**が必要です。

### ✅ 全ドメインからのGETアクセスを許可する（例：画像・JS・動画など）

```json
[
  {
    "AllowedHeaders": ["*"],
    "AllowedMethods": ["GET"],
    "AllowedOrigins": ["*"],
    "ExposeHeaders": [],
    "MaxAgeSeconds": 3000
  }
]
````

この設定は、外部サイトから `https://your-bucket.s3.amazonaws.com/filename.jpg` などにアクセスする際に必要です。

---

### 🔐 特定ドメインからのみ許可したい場合（推奨）

```json
[
  {
    "AllowedHeaders": ["*"],
    "AllowedMethods": ["GET"],
    "AllowedOrigins": ["https://example.com"],
    "ExposeHeaders": [],
    "MaxAgeSeconds": 3000
  }
]
```

> `AllowedOrigins` を `"*"` にするのは便利ですが、セキュリティ上のリスクもあるため、本番環境では **ドメインを明示的に指定する**ことを推奨します。

---

S3マネジメントコンソールの「バケット」→「アクセス許可」→「CORS設定」欄に上記をそのまま貼り付けて設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730521/c77d1f57-7f28-4122-9842-5b244a07cc58.png)
flask タグ機能

## [models.py]

```php:
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

# 中間テーブル
todo_tags = db.Table('todo_tags',
    db.Column('todo_id', db.Integer, db.ForeignKey('todo.id')),
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)

class Todo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.String(100))
    tags = db.relationship('Tag', secondary=todo_tags, backref='todos')

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True)
```

### [app.py]

```php:
from flask import Flask, render_template, request, redirect
from models import db, Todo, Tag

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todos.db'
db.init_app(app)

@app.route('/')
def index():
    tag_filter = request.args.get('tag')
    if tag_filter:
        todos = Todo.query.join(Todo.tags).filter(Tag.name == tag_filter).all()
    else:
        todos = Todo.query.all()
    tags = Tag.query.all()
    return render_template('index.html', todos=todos, tags=tags)

@app.route('/add', methods=['POST'])
def add():
    content = request.form['content']
    tag_names = [name.strip() for name in request.form['tags'].split(',') if name.strip()]
    todo = Todo(content=content)
    for name in tag_names:
        tag = Tag.query.filter_by(name=name).first()
        if not tag:
            tag = Tag(name=name)
        todo.tags.append(tag)
    db.session.add(todo)
    db.session.commit()
    return redirect('/')
```

### [index.html]

```php:
<form action="/add" method="POST">
  <input name="content" placeholder="Todo内容">
  <input name="tags" placeholder="タグ（カンマ区切り）">
  <button type="submit">追加</button>
</form>

<h3>タグ一覧：</h3>
{% for tag in tags %}
  <a href="/?tag={{ tag.name }}">{{ tag.name }}</a>
{% endfor %}

<ul>
  {% for todo in todos %}
    <li>{{ todo.content }} - 
      {% for tag in todo.tags %}
        <span>[{{ tag.name }}]</span>
      {% endfor %}
    </li>
  {% endfor %}
</ul>
```
Railsの_wasメソッドについて

# Railsの`_was`メソッドについて知っておきたいこと

## はじめに

RailsのActiveRecordには`_was`という便利なメソッドがあります。このメソッドは、モデルの属性値の変更を追跡する際に非常に役立ちます。

## `_was`メソッドとは

`_was`メソッドは、ActiveRecordの属性の変更を追跡する機能の一部です。データベースから読み込まれた時点での値（元の値）を保持し、その属性が変更された後でも元の値を参照することができます。

## 使用できる場面

### 1. バリデーションでの使用

購入日時の変更を検証する例：

```ruby
class Order < ApplicationRecord
  validate :purchase_date_changed?, on: :update

  private

  def purchase_date_changed?
    if purchased_at_was == purchased_at
      errors.add(:purchased_at, '購入日時が変更されていません')
    end
  end
end
```

### 2. コールバックでの使用

商品の価格変更を記録する例：

```ruby
class Product < ApplicationRecord
  before_save :log_price_change

  private

  def log_price_change
    if price_was != price
      PriceChangeLog.create!(
        product_id: id,
        old_price: price_was,
        new_price: price,
        changed_at: Time.current
      )
    end
  end
end
```

### 3. 変更の追跡

注文ステータスの変更を通知する例：

```ruby
class Order < ApplicationRecord
  after_save :notify_status_change

  private

  def notify_status_change
    if status_was != status
      NotificationService.status_changed(
        order_id: id,
        old_status: status_was,
        new_status: status,
        user_id: user_id
      )
    end
  end
end
```

## 使用例：配送システム

配送予定日の変更を管理する例：

```ruby
class Delivery < ApplicationRecord
  validate :validate_delivery_date_change

  private

  def validate_delivery_date_change
    if scheduled_date_was.present? && scheduled_date_was > Date.current
      if scheduled_date < scheduled_date_was
        errors.add(:scheduled_date, '配送予定日は前倒しできません')
      end
    end
  end
end
```

## まとめ

`_was`メソッドは以下のような場面で特に有用です：

- 属性値の変更を検証する必要がある場合
- 変更履歴を記録する必要がある場合
- 変更前後の値に基づいて処理を分岐させる必要がある場合

このメソッドを活用することで、より堅牢なアプリケーションの開発が可能になります。
いや、もっと早く教えてよと思ったエディタの中でのショートカットキー（VSCode）Alt + (→ or ←)

# ソースコード、どう読めばいいの？
こんにちは、こんばんは。
普段はバックエンドエンジニアでWebアプリ開発をしているiniです。

会社に入社してしばらくしてから、
２～３年稼働している社内プロジェクトに途中参加することになりました。
そこで先輩に言われたのが、
>「ソースコードを読みたまえ」

でも、当時の私は「どう読めばいいのか？」もわからず、
上から下までただひたすら読んで、時間を浪費していました……。

そんな経験をもとに、この記事ではコードを読みやすくするショートカットキーをまとめておきます！

---
## この記事を読むにあたっておすすめな人
- 駆け出しエンジニア
- VSCode / Windsurf を使ってる人
- ショートカットキーを網羅してみたい人
---

## ショートカットキー集
@12345 さんの
[VS Code の便利なショートカットキー](https://qiita.com/12345/items/64f4372fbca041e949d0)

@TakahiRoyte さんの
[【Windows版】VS Code キーボードショートカット一覧 （オススメ付き）](https://qiita.com/TakahiRoyte/items/cdab6fca64da386a690b)

を参考にしていただければ全体を通してわかると思います。

## ファイル間で使えるジャンプ機能
### 戻る・進む（ジャンプ履歴）
上の記事にはあまり触れられていなかったのですが、
| 操作内容    | Windows / Linux | Mac                 |
| ------- | --------------- | ---------------------- |
| 定義へジャンプ | `Ctrl` + `クリック` | `Cmd` + `クリック` |
| 前に戻る    | `Alt` + `←`     | `Ctrl` + `-`           |
| 次に進む    | `Alt` + `→`     | `Ctrl` + `Shift` + `-` |

この「戻る／進む」は、複雑なプロジェクトで関数をたどった後に元の位置に戻るのに超便利です。

### ファイル例
utils.py, main.py というファイルがあるとします：

```python
# utils.py

def calculate_tax(price: float) -> float:
    return price * 0.1
```
```python
# main.py

from utils import calculate_tax

def show_price():
    print(calculate_tax(1000))
```
#### 実際の操作
`calculate_tax(1000)` にカーソルを置いて `Ctrl` + `クリック`（または F12） → `utils.py` に飛びます。
中身確認したあと、`Alt` + `←` で `main.py` に戻ります。
そのあと、再度`calculate_tax(1000)`から`utils.py`に飛んでもいいですし、直前のファイル（定義された場所）に戻りたい場合は`Alt` + `→` を使うと楽です。


## まとめ
最初は `Ctrl + F` や `Ctrl + Shift + F` を使ってましたが、
このジャンプショートカットを覚えてから、読むスピードがめちゃ上がりました。


※再掲
| 操作内容    | Windows / Linux | Mac                 |
| ------- | --------------- | ---------------------- |
| 定義へジャンプ | `Ctrl` + `クリック` | `Cmd` + `クリック` |
| 前に戻る    | `Alt` + `←`     | `Ctrl` + `-`           |
| 次に進む    | `Alt` + `→`     | `Ctrl` + `Shift` + `-` |

慣れれば、
コード探索のストレスが激減し、コードリーディングのスピードが2倍近くになります！

次回は「コードの追い方・読み方」についても書く予定ですのでお楽しみに！
AIキャリア進路チェックリスト(日本語訳)

Brij Kishore Pendeyさんの秀逸なインフォグラフィックの日本語訳です。

引用元

https://www.instagram.com/p/DKKr62TT7jB/?igsh=MWs4eHZpeHdiM3dsMg==

# AI/MLエンジニア

モデルを構築し、アルゴリズムを訓練し、インテリジェントなシステムを展開する職種。
- Python、NumPy、Pandas、scikit-learn を習得する
- 教師あり学習と教師なし学習を深く理解する
- PyTorch または TensorFlow の実践経験
- モデルのデプロイ（Docker、FastAPI、AWS/GCP）
- MLOps ワークフローの理解

# AIリサーチサイエンティスト

AI/ML分野で最先端の手法を探求し、分野を前進させる職種。
- 線形代数、微積分、確率論など強固な数学的基礎
- 主要な研究論文を読む（arXiv, NeurIPSなど）
- カスタムのモデルアーキテクチャを試す
- 論文を執筆、またはオープンリサーチに貢献する
- PyTorch または JAX を使ってプロトタイプを作成する

# データサイエンティスト

データを使って洞察を得たり、予測モデルを構築する職種。
- データの可視化と操作に熟練（Pandas, Seaborn）
- 統計と確率の基礎が強い
- 探索的データ分析（EDA）のスキル
- モデル評価と特徴量エンジニアリング
- 使用ツール：Jupyter、SQL、MLflow

# AIプロダクトマネージャー

AI技術とビジネスの要求の橋渡しをする職種。
- LLM（大規模言語モデル）の能力、制限を理解する
- AIシステムの成功指標を定義する
- AIチームとステークホルダーと効果的にコミュニケーションを取る
- 倫理的かつ責任あるAIの実践を優先する
- ライブラリを構築し、モデル出力を評価する

# NLPエンジニア

自然言語を理解・生成するシステムを構築する職種。
- トークナイゼーション、埋め込み、言語モデリングを習得
- Hugging Face Transformers、spaCy、NLTKを使用
- チャットボット、QA、要約向けにLLMを微調整する
- RAG（Retrieval-Augmented Generation）を実装する
- プロンプトエンジニアリングとLLM APIを活用する

# AIオートメーションスペシャリスト

AI技術と業務の自動化をつなぐ役割。
- Make.com、Zapier、LangChain、Flowsise を学ぶ
- OpenAI APIやCrewAIなどのツールでビルド
- LLMをデータベースやAPIに接続
- ノーコードでオートメーションワークフローを設計
- エラー処理とパフォーマンスを追跡

# コンピュータビジョンエンジニア

画像や映像を処理するAIシステムに特化した職種。
- OpenCV、YOLO、Detector2 を習得
- CNN、物体検出、セグメンテーションをマスター
- 顔認識、OCRなどのタスクにディープラーニングモデルを適用
- トレーニングデータ（COCO、ImageNet）を使用
- エッジデバイスへの展開やリアルタイム推論を実施

# AIエージェント開発者

実世界のタスクを実行する自律型AIエージェントを構築する職種。
- LangGraph、CrewAI、AutoGen などのフレームワークを理解する
- ReAct、A2A、MCPなどのメモリ/推論手法を学ぶ
- マルチエージェントワークフローを実装
- 計画＋反省を組み合わせた使用例に対応
- 実際のビジネスユースケースに対応したスタックを構築する
AWS SDK for PHPでS3アップロード時の「おまじない」【EC2編】

今回は、**EC2 上の PHP から S3 にファイルをアップロードするときに出てくる警告**を抑制する「おまじない」について紹介します。

---

## 🌀 現象

AWS SDK for PHP を使っていると、以下のような警告が出ることがあります。

```

This installation of the SDK is using PHP version 8.0.30, which will be deprecated on January 13th, 2025.
Please upgrade your PHP version to a minimum of 8.1.x to continue receiving updates for the AWS SDK for PHP.

````

まだ PHP 8.0 を使っていると、SDK がサポート終了を知らせてきます。  
でも、ちょっと試すだけのときや、バージョンを上げられない状況ではこの警告が鬱陶しいですよね。

---

## ✅ 解決策：「おまじない」で警告を黙らせる

環境変数に以下を設定するだけでOKです！

```bash
export AWS_SUPPRESS_PHP_DEPRECATION_WARNING=true
````

または、`.env` や Apache/Nginx 経由で以下のように設定できます。

```ini
# .envなど
AWS_SUPPRESS_PHP_DEPRECATION_WARNING=true
```

**これで PHP 8.0 系でも警告が出なくなります。**

---

## 🔧 補足：コード内で設定する方法

環境変数以外に、SDK クライアントの生成時にも suppress オプションを渡せます。

```php
use Aws\S3\S3Client;

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'ap-northeast-1',
    'suppress_php_deprecation_warning' => true,
]);
```

---

## ⚠️ 注意

これはあくまで**一時的な対処**です。
長期的には PHP のバージョンアップ（8.1以上）を検討してください！

---

## 📝 まとめ

| 項目   | 内容                                              |
| ---- | ----------------------------------------------- |
| 警告内容 | PHP 8.0 は SDK 非対応になるという警告                       |
| 解決策  | `AWS_SUPPRESS_PHP_DEPRECATION_WARNING=true` を設定 |
| 設定場所 | `.env`, shell環境変数, SDKクライアント構成                  |
| 注意点  | 根本的には PHP を 8.1 以上にアップグレードすべき                   |

---

## 🙋‍♂️ 最後に

この記事が同じ状況の誰かの役に立てばうれしいです！
「おまじない」は便利ですが、根本治療（PHPのアップデート）も忘れずに！
AtCoder ABC408 振り返り #C++

# はじめに
ABC408に参加したので振り返ります。
結果は1冠でした。

# [A - Timeout](https://atcoder.jp/contests/abc408/tasks/abc408_a)
### 解法
簡単な条件分岐でした。

### 実装例

```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, S;
    cin >> N >> S;
    int T[N];
    for (int i = 0; i < N; i++) {
        cin >> T[i];
    }

    if (T[0] > S) {
        cout << "No" << endl;
        return 0;
    }

    for (int i = 0; i < N - 1; i++) {
        if (T[i + 1] - T[i] > S) {
            cout << "No" << endl;
            return 0;
        }
    }
    cout << "Yes" << endl;
}
```

# [B - Compression](https://atcoder.jp/contests/abc408/tasks/abc408_b)
### 解法
ソートと重複の排除を行いました。

### 実装例

```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;

    bool appeared[101] = {false};

    for (int i = 0; i < N; i++) {
        int val;
        cin >> val;
        if (val >= 1 && val <= 100) {
            appeared[val] = true;
        }
    }

    int M = 0;
    for (int i = 1; i <= 100; i++) {
        if (appeared[i]) {
            M++;
        }
    }

    cout << M << endl;

    bool first_element_printed = false;
    for (int i = 1; i <= 100; i++) {
        if (appeared[i]) {
            if (first_element_printed) {
                cout << " ";
            }
            cout << i;
            first_element_printed = true;
        }
    }
    cout << endl;
}
```

# おわりに
ソートのアルゴリズムがあやふやだったので精進頑張ります。