OmniAICreator/Qiita-1.07M huggingface dataset:
[競プロ][Python] zip関数活用術

Pythonのzip関数は、複数のリストやイテラブルを同時に処理するときに非常に便利です。競技プログラミングにおいても、以下のようなパターンで活用できます。

## 複数のリストの要素をペアリングして同時に処理

2つのリスト（またはそれ以上）を要素ごとに対応付けて処理する場合に便利です。

例題：
2つのリスト A と B が与えられ、それぞれのペアの和を計算せよ。
```python
A = [1, 2, 3]
B = [4, 5, 6]

result = [a + b for a, b in zip(A, B)]
print(result)  # 出力: [5, 7, 9]
```

## ソート時にインデックスを保持

enumerateとzipを組み合わせて、値とインデックスを同時に操作するパターン。

例題：
リストをインデックスを保持したままソートせよ。
```python
A = [3, 1, 4, 1, 5]

# zipでインデックスと値をペアにしてソート
indexed_A = list(zip(range(len(A)), A))
sorted_with_index = sorted(indexed_A, key=lambda x: x[1])

for idx, value in sorted_with_index:
    print(f"Index: {idx}, Value: {value}")
# 出力:
# Index: 1, Value: 1
# Index: 3, Value: 1
# Index: 0, Value: 3
# Index: 2, Value: 4
# Index: 4, Value: 5
```

## リストの転置

行列の転置や、入力形式の変換で役立つパターン。

例題：
2次元リストを転置せよ。
```python
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

transposed = list(map(list, zip(*matrix)))
print(transposed)
# 出力:
# [
#     [1, 4, 7],
#     [2, 5, 8],
#     [3, 6, 9]
# ]
```

## 複数のリストを辞書に変換

キーと値のリストから辞書を作成するパターン。

例題：
キーと値のリストが与えられる。辞書を作成せよ。
```python
keys = ['name', 'age', 'city']
values = ['Alice', 25, 'New York']

dictionary = dict(zip(keys, values))
print(dictionary)  # 出力: {'name': 'Alice', 'age': 25, 'city': 'New York'}
```

## 条件付きペアのフィルタリング

2つのリストの対応する要素を条件でフィルタリングするパターン。

例題：
リスト A と B の対応する要素のペアで、和が偶数になるものを選べ。
```python
A = [1, 2, 3, 4]
B = [5, 6, 7, 8]

filtered_pairs = [(a, b) for a, b in zip(A, B) if (a + b) % 2 == 0]
print(filtered_pairs)  # 出力: [(1, 5), (3, 7)]
```

## 差分計算

隣接する要素の差分を計算するパターン。

例題：
リストの隣接する要素の差分を計算せよ。
```python
A = [10, 20, 15, 30]

differences = [b - a for a, b in zip(A, A[1:])]
print(differences)  # 出力: [10, -5, 15]
```

## 一致するインデックスの抽出

複数のリストで対応する要素が条件を満たすインデックスを取得するパターン。

例題：
リスト A と B の対応する要素が同じ値であるインデックスを取得せよ。
```python
A = [1, 2, 3, 4]
B = [1, 3, 3, 5]

matching_indices = [i for i, (a, b) in enumerate(zip(A, B)) if a == b]
print(matching_indices)  # 出力: [0, 2]
```

## まとめ

これらのパターンは、zip関数を活用することで、競技プログラミングの効率化に直結します。zip関数を使いこなせば、コードの可読性と簡潔さが向上し、パフォーマンスを損なうことなく多くの問題を解くことができます。
廃止されているモジュールを集めてみました

**使っているクラウドなどの小ネタ Advent Calendar 2024 8日目**

# Error occurred when calling MVS Hawking Platform for [appId:0PpHp00000009WqKAI] errorMessage= Error calling Hawking Provision service API to deployApplication with ApplicationName= PredictionBuilder, target= 0PpHp00000009WqKAI, MVS Provision servic... applicationId= 0PpHp00000009WqKAI

+ [Einstein Prediction I got this Error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X8M6n)

プロジェクト「クイックスタート: Einstein 予測ビルダー」は現在廃止されているため、404 エラーが発生します。 

貴重なフィードバックを社内チームと共有し、新しいアップデートでアクセスできるようになった場合には、今後もお知らせします。

貴重なフィードバックを共有し、コンテンツの改善にご協力いただきましたことに感謝しており、今後も同様の取り組みを継続していただければ幸いです。

+ [Einstein Prediction Builder Error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007IfR2oSAF)
+ [Hi- I am getting below error while build the Einstein prediction Error occurred when calling MVS Hawking Platform for [appId:0Pp5j000000c5jtCAA] errorMessage= Error calling Hawking Provision service API to deployApplication with ApplicationName= Predictio](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X7TFnSAN)
+ [Einstein Prediction Error occurred when calling MVS Hawking Platform for errorMessage= Error calling Hawking Provision service API to deployApplication with](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIYDj)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f43e5ec8-7bde-9368-f508-ff081ae9ddca.png)


# Module Sales Cloud Einstein

+ [Module Sales Cloud Einstein](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J5UuZ0AV)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c539e6a6-9a8b-6770-627d-cc953531ade8.png)

:::note
The Sales Cloud Einstein module was retired and due to this you are unable to complete the course section. Please report it to your course admin to remove this module link from the course.
:::

# Build an Amazon Connect Integration

+ [Build an Amazon Connect Integration](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdSNs)

# Ingestion and Modeling in Data Cloud 

+ [am stuck on Ingestion and Modeling in Data Cloud module.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KfFRY0A3)

:::note
The Ingestion and Modeling badge was retired. New content, [Data Cloud Connectors and Integrations](https://trailhead.salesforce.com/en/content/learn/modules/data-cloud-connectors-and-integrations) was created to replace that badge. 

「取り込みとモデリング」バッジは廃止されました。 そのバッジに代わる 新しいコンテンツ「データ クラウド コネクタと統合」が作成されました。
:::
ACDLを提唱します。その19

# 概要
ACDLとは、アプリは、クラウド、大切なデータは、ローカルです。
アプリ作ったので、plunkerに上げてみた。

# 機能
HTMLをテストする。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5ea0483e-83d5-e7f6-7efa-b6fd30c7cca8.png)

# 成果物

https://embed.plnkr.co/plunk/SzURrAGCqEVk5A1B0dcI

以上。
AWS CDKでlamdba環境を作成する

# はじめに
<!-- 発端や概要を記載 -->
本記事ではcdkプロジェクトからlamdba環境を構築します。
他リソースとの作成方法とは違った流れでしたので、記事にまとめることにしました。

使用言語はTypescriptになります。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. ディレクトリ構成の把握
2. lambdaディレクトリの環境構築
3. まとめ

<!-- 各チャプター -->
# ディレクトリ構成の把握

環境構築を始める前に、ディレクトリの構成及びパッケージのダウンロードする場所を把握しておきましょう。

```
my-cdk-app/
├── bin/                # アプリケーションエントリポイント
│   └── my-cdk-app.ts   # Appインスタンスを作成しスタックをロード
├── lib/                # スタック定義を配置するディレクトリ
│   └── my-cdk-app-stack.ts
├── test/               # ユニットテスト用
├── lambdas/            # 各lambda環境を保存先となるディレクトリ(new)
│   └── lambda          # lambda環境(new)
│       └── src         # ソースファイル格納
├── cdk.json            # CDK設定ファイル
├── package.json        # npm設定ファイル
└── tsconfig.json       # TypeScript設定ファイル
```

cdkプロジェクトの配下に１つディレクトリ（lambdas）を用意し、lambdas配下にディレクトリを用意するといった流れになります。

# lambdaディレクトリの環境構築

#### node.jsプロジェクトの作成

まず最初に、lambdaディレクトリ配下にnode.jsプロジェクトを作成します。

```bash
npm init
```

Enterで進めていくと、package.jsonが作成されます。

#### lamdba開発のセットアップ

次に、必要なパッケージをインストールしていきましょう。

```bash
npm install -D typescript ts-node @types/node @types/aws-lambda
```

package.jsonにパッケージが追加されていることを確認します。
```json
{
  "name": "resize",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/aws-lambda": "^8.10.145",
    "@types/node": "^22.9.1",
    "ts-node": "^10.9.2",
    "typescript": "^5.6.3"
  }
}
```

追加で、パッケージをインストールしていきます。
```bash
npm install @aws-sdk/client-s3 @aws-sdk/client-sqs dotenv jimp
```

最後に、Typescriptのセットアップをしていきます。
```bash
npx tsc --init
```

tsconfig.jsonが作成されていましたら完了です。

#### ソースファイルを作成する

lamdba環境の作成ができましたので、試しにソースファイルを書いていこうと思います。
ソースはsrcディレクトリ配下に作成します。

```typescript:index.ts
import { Handler } from 'aws-lambda';

export const handler: Handler = async (event) => {
  console.log('Hello, world!');
  console.log('%o', event);
};
```

#### cdkプロジェクトにesbuildパッケージをインストール
最後に**cdkプロジェクト配下**でesbuildパッケージをインストールしましょう。
TypescriptをJavascriptに変換するパッケージになりまして、
lamdbaの実行環境はnode.jsになりますので変換する必要があります。

```bash
npm install esbuild
```

# まとめ
今回はcdkプロジェクトからlamdba環境構築してみました！
他リソースとは違い、アプリ制作寄りの環境構築が必要でしたね。
npmやnode.jsの理解が必要だなと思いました。

では、またノシ
Advent of code 2015 Day 6 Part 2 を Livebook で楽しむ

## はじめに

Advent of code 2024 の準備として、過去回の Advent of code 2015 を Livebook で楽しみます

本記事では Day 6 の Part 2 を解きます

問題文はこちら

https://adventofcode.com/2015/day/6

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day6_part2.livemd

Part 1 はこちら

https://qiita.com/RyoWakabayashi/private/86d380d456ae648c3309

## セットアップ

Kino AOC をインストールします

```elixir
Mix.install([
  {:kino_aoc, "~> 0.1"}
])
```

Kino AOC の使い方はこちらを参照

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

## 入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 6 の入力を取得します

![スクリーンショット 2024-11-20 7.59.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/e9d26382-cdc7-a872-16ef-aca090f0f20f.png)

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

<details><summary>回答</summary>

正規表現で操作内容を取得する部分は Part 1 と同じです

```elixir
Regex.named_captures(~r/(?<op>.+) (?<sx>\d+),(?<sy>\d+) through (?<ex>\d+),(?<ey>\d+)/, "turn on 0,0 through 999,999")
```

- `op`: ライトに対する操作（`"torn on" | "torn off" | "toggle"`）
- `sx`, `sy`: 操作開始位置の座標
- `ex`, `ey`: 操作終了位置の座標

Part 2 では操作内容が古代エルフ語での解釈に変わっています

- "torn on": 明度を 1 段階上げる
- "torn off": 明度を 1 段階下げる（ただし、下限は 0）
- "toggle": 明度を 2 段階上げる

Part 1 の点灯マップを明度マップとして、論理値ではなく明度の整数を保持します

`Enum.reduce` で各行の操作を順に実行して行きます

"torn off" 時には 0 未満にならないよう、 `brightness - 1` ではなく `max(0, brightness - 1)` という操作にします

最後に全ての明度を合計します

```elixir
puzzle_input
|> String.split("\n")
|> Enum.reduce(%{},fn instruction, map ->
  %{"op" => op, "sx" => sx, "sy" => sy, "ex" => ex, "ey" => ey} =
    Regex.named_captures(
      ~r/(?<op>.+) (?<sx>\d+),(?<sy>\d+) through (?<ex>\d+),(?<ey>\d+)/,
      instruction
    )

  [sx, sy, ex, ey] = Enum.map([sx, sy, ex, ey], &String.to_integer(&1))

  Enum.reduce(sx..ex, map, fn x, x_map ->
    Enum.reduce(sy..ey, x_map, fn y, y_map ->
      brightness = Map.get(y_map, {x, y}, 0)

      brightness =
        case op do
          "turn on" -> brightness + 1
          "turn off" -> max(0, brightness - 1)
          _ -> brightness + 2
        end

      Map.put(y_map, {x, y}, brightness)
    end)
  end)
end)
|> Enum.map(fn {_, brightness} -> brightness end)
|> Enum.sum()
```

</details>

## まとめ

問題文から ChatGPT に画像を生成してもらいました

![brightness.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/9e24cce5-a103-4d26-194f-7d22c41852b6.jpeg)

古代エルフ語は興味深いですね
cscの作法 その537

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
grayscaleなpngを作れ。

# 参考にしたページ

https://qiita.com/uni928/items/3f7c2d6d93c97c9ecb44

# サンプルコード

```


using System;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;

namespace app
{
	class test0 {
		static void Main() {
			int width = 1600;
			int height = 900;
			Bitmap img = new Bitmap(width, height);
			for (int i = 0; i < width; i++)
			{
				for (int j = 0; j < height; j++)
				{
					float posX = width * 1 / 4;
					float posY = height * 2 / 3;
					float f = (float) Math.Pow(Math.Pow(posX - i, 2) + Math.Pow(posY - j, 2), 0.5f);
					f = Math.Min(255, f / 5);
					int num = (int) f;
					Color c = Color.FromArgb(num, num, num);
					img.SetPixel(i, height - j - 1, c);
				}
			}
			img.Save("gr1.png", ImageFormat.Png);
			Console.WriteLine("ok");
		}
	}
}






```

# 実行結果

![gr1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b2f99c40-7b02-1d3a-7dee-c9b83ad086f4.png)


以上。
DeprecationWarning: The punycode module is deprecated. Please use a userland alternative instead.


+ ['Getting ready to develop' trailhead module and running into an error when I try validate CLI Install](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J5uVu0AJ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/99e3df0d-f443-17f9-510d-57660c396291.png)

Nodeの安定版をインストールしたらv22.4.1になったが、その際sf versionで上記エラーが発生した。
Nodeのバージョンをv20にすることで回避できるそう。

node-v20.18.0-x64ではダメだったらしい
【Cloudflare】Enforce HTTPS — Unavailable for your site because your domain is not properly configured to support HTTPS (example.com)

プロキシを解除しよう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/b1635a99-a561-f37c-3b83-e36465f8d245.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/334ec953-5f81-97b2-86d6-c611c2451aba.png)

プロキシ済みの行をチェックします。`レコードを編集`を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/4b853bb4-a521-7a5d-6514-489faad1ecca.png)

DNSのみにします。保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/00cf73ca-dd8d-1777-e87f-40d1b53c8ce3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/036629d6-5309-dc8e-233b-8f0ac7883054.png)

20分ほど待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/8fb39378-97de-57ff-b754-de510090c6a6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/2bca0df1-2c47-1d7b-2632-12e06ad4a1ff.png)

# 無事、Enforce HTTPSにできました🎉

https://github.com/orgs/community/discussions/23049#discussioncomment-3573123
Advent of code 2015 Day 6 Part 1 を Livebook で楽しむ

## はじめに

Advent of code 2024 の準備として、過去回の Advent of code 2015 を Livebook で楽しみます

本記事では Day 6 の Part 1 を解きます

問題文はこちら

https://adventofcode.com/2015/day/6

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day6_part1.livemd

## セットアップ

Kino AOC をインストールします

```elixir
Mix.install([
  {:kino_aoc, "~> 0.1"}
])
```

Kino AOC の使い方はこちらを参照

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

## 入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 6 の入力を取得します

![スクリーンショット 2024-11-20 7.59.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/e9d26382-cdc7-a872-16ef-aca090f0f20f.png)

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

<details><summary>回答</summary>

各行の指示を正規表現でパースします

`Regex.named_captures` を使うことで、正規表現内で `?<キー>` と指定した箇所に該当する文字列が取得できます

```elixir
Regex.named_captures(~r/(?<op>.+) (?<sx>\d+),(?<sy>\d+) through (?<ex>\d+),(?<ey>\d+)/, "turn on 0,0 through 999,999")
```

上記コードの実行結果は以下のようになります

```elixir
%{"ex" => "999", "ey" => "999", "op" => "turn on", "sx" => "0", "sy" => "0"}
```

- `op`: ライトに対する操作（`"torn on" | "torn off" | "toggle"`）
- `sx`, `sy`: 操作開始位置の座標
- `ex`, `ey`: 操作終了位置の座標

座標毎に点灯しているかどうかの論理値を点灯マップ保持します

例えば座標 `{0, 0}` (x方向0番目、y方向0番目) と `{1, 2}` だけが点灯している場合、 `%{{0, 0} => true, {1, 2} => true}` にします

`Enum.reduce` で空の点灯マップ（全て消灯状態）から順に操作を実行し、最終的に点灯している座標の数を数えます

```elixir
puzzle_input
|> String.split("\n")
|> Enum.reduce(%{},fn instruction, map ->
  %{"op" => op, "sx" => sx, "sy" => sy, "ex" => ex, "ey" => ey} =
    Regex.named_captures(
      ~r/(?<op>.+) (?<sx>\d+),(?<sy>\d+) through (?<ex>\d+),(?<ey>\d+)/,
      instruction
    )

  [sx, sy, ex, ey] = Enum.map([sx, sy, ex, ey], &String.to_integer(&1))

  Enum.reduce(sx..ex, map, fn x, x_map ->
    Enum.reduce(sy..ey, x_map, fn y, y_map ->
      lit = Map.get(y_map, {x, y}, false)

      new =
        case op do
          "turn on" -> true
          "turn off" -> false
          _ -> !lit
        end

      Map.put(y_map, {x, y}, new)
    end)
  end)
end)
|> Enum.count(fn {_, lit} -> lit end)
```

</details>

## まとめ

問題文から ChatGPT に画像を生成してもらいました

![lit.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/e59b9d9d-bb5b-821d-2272-36cfc9f596ad.jpeg)

特に工夫しないで書いたら実行に 90 秒くらい掛かってしまいました

AtCoder だと時間切れになりそうですが、 AOC は時間制限がないのでコレで良しとします

Part 2 はこちら

https://qiita.com/RyoWakabayashi/private/2e07c1dfa96e690a1d84
Tornado 初期化時のオプション

# はじめに
MH ソフトウェア & サービスが開発・公開している、Webアプリケーションサーバ AiRの便利かな?と思われるコードの紹介です。
Webアプリケーションサーバ AiRはPython、Tornado(Webフレームワーク、Webサーバ)、JavaScript、その他のモジュールで構成されています。
***
Tornadoを初期化する時、settingsに設定する値で、高速化・セキュリティの向上が望めます。
```
def __init__(self, hat: Hat):
    """Initialize.

    :sig: (Hat) -> None
    """
    handlers: tornado.routing._RuleList = self._handlers  # type: ignore
    settings: dict[str, Any] = self._settings　　# この値 propertyで呼び出されます
    tornado.web.Application.__init__(
        self,
        handlers,
        default_handler_class=Base,
        **settings,  # ここの値 propertyで呼び出された値です
    )
```

```
@property
def _settings(self) -> dict[str, Any]:
    """Retrun settings.

    :sig: () -> dict[str, Any]
    """
    return {
        "compress_response": True,
        """
        レスポンスを自動的に圧縮するかどうかの設定
        有効にすると、テキスト形式のレスポンスがgzip圧縮されます
        """

        "cookie_secret": tornado.options.options.cookie_secret,
        """
        署名付きクッキーを使用するための秘密鍵 クッキーの内容が改ざんされていない事を保証出来ます
        """

        "login_url": "/",
        "static_handler_class": StaticFileHandler,
        "static_path": os.path.join(os.path.dirname(__file__), "."),
        "template_path": os.path.join(os.path.dirname(__file__), "."),
        "xsrf_cookies": True,
        """
        クロスサイトリクエストフォージェリ(XSRFまたはCSRF)攻撃を防ぐための機能
        これを有効にすると、各リクエストに対してXSRFトークンを検証し、トークンが一致しない場合はリクエストを拒否します
        """
    }
```
***
[Webアプリケーションサーバ AiR](https://qiita.com/MH-SS/private/7a99e799e4988fdad2cc)
***
[弊社webページ: AiR](https://mhss.server-on.net/?f401c=Index&ae504=air)

<!-- https://qiita.com/MH-SS/items/98ca38fed3d29c1c7ac5 -->
6Gホワイトペーパー

# 6Gホワイトペーパー

次世代通信技術「6G」の研究が加速する中、企業や研究機関が発行するホワイトペーパーが注目されています。本記事では、国内外の主要ホワイトペーパーをまとめ、未来の通信技術を深く理解するための参考資料として紹介します。

情報の正確性については、公式サイトをご確認下さい。

---

## 📄 ドコモ 6Gホワイトペーパー

- **概要**  
  ドコモが提案する「5G evolution」と「6G」のユースケースや技術要素を詳細に解説。2030年代の通信社会を見据えた技術的展望を示しています。

- **リンク**  
  [ドコモ 6Gホワイトペーパー](https://www.docomo.ne.jp/technology/whitepaper_6g)

---

## 📄 情報通信研究機構（NICT） Beyond 5G/6Gホワイトペーパー

- **概要**  
  NICTが発表したホワイトペーパーは、未来の社会像をシナリオ形式で提示し、必要な技術要素や方向性を議論しています。特に「オーケストレータ」と「デジタルツイン」に焦点を当てています。

- **リンク**  
  [Beyond 5G/6Gホワイトペーパー（日本語3.0版）](https://beyond5g.nict.go.jp/news)

---

## 📄 KDDI総合研究所 Beyond 5G/6Gホワイトペーパー

- **概要**  
  「KDDI Accelerate 5.0」のビジョンを具現化する形で、2030年の未来社会に向けたエコシステム構築を提案しています。

- **リンク**  
  [Beyond 5G/6Gホワイトペーパー](https://www.kddi-research.jp/tech/whitepaper_b5g_6g)

---

## 📄 富士通 6Gネットワークホワイトペーパー

- **概要**  
  富士通は、6G時代のネットワーク技術を通じて、社会課題をどのように解決するかを詳細に記述しています。

- **リンク**  
  [6Gネットワークと要素技術 (PDF)](https://www.fujitsu.com/products/network)

---

## 📄 総務省 情報通信白書（Beyond 5G/6Gに向けて）

- **概要**  
  総務省が発行する情報通信白書では、6Gを次世代インフラとして位置づけ、産業や社会への影響を包括的に分析しています。

- **リンク**  
  [令和5年版 情報通信白書](https://www.soumu.go.jp/whitepaper/html)

---

## 📄 NTT 6G/IOWNホワイトペーパー

- **概要**  
  NTTは「インクルーシブコア」と呼ばれるネットワークアーキテクチャを提案し、6G/IOWN時代における融合・協調の重要性を解説しています。

- **リンク**  
  [6G/IOWN時代の融合・協調ネットワーク](https://www.rd.ntt/inclusivecore/whitepaper_ver1)

---

## 🔍 まとめ

6Gホワイトペーパーは、次世代通信技術がどのように社会を変革し、産業に影響を与えるかを理解するための貴重な資料です。それぞれの資料を通じて、2030年代の通信社会における課題と可能性を深く学ぶことができます。



これからの通信技術を見据え、最新情報を活用して未来に備えましょう！  
記事が役に立った場合は「いいね」や「ストック」をよろしくお願いします！

---

## 🔗 ホワイトペーパーの基礎を知るには？

ホワイトペーパーの意味や語源についてさらに詳しく知りたい方は、以下の記事をぜひご覧ください。  
[ホワイトペーパーとは？意味や語源を徹底解説！](https://www.marke-media.net/whitepaper/what-is-whitepaper/)

---
Identity for Customersトレイルヘッドのまとめ



https://trailhead.salesforce.com/content/learn/modules/identity_external

# Set Up an Experience Cloud Site for Salesforce Customer Identity

+ [ロゴがダウンロードできない](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000nKx2)

:::note
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f50ef491-b430-6901-658f-2397efd15072.png)
:::
【プログラミング言語】構文を理解する

# プログラミング言語の基本要素
プログラミング言語の基本要素として、`文`と`式`が挙げられる。この2つを区別できるようになりたい。以下にその具体的な例を記載する。
```
n = i*3;
if (n > 8) return 1;
return 0;
```
上のコードにおいて、文と式を区別すると以下のようになる。

・文→`n = i*3`，`if (n > 8) return 1;`，`return 1;`，`return 0;`

・式→`i*3`，`i`，`3`，`n > 8`，`n`，`8`，`1`，`0`

文は`;`で切れている一部分を指す。式は四則演算などの評価結果となる値を持つ要素を指す。そのため、上のコードの1行目の`n = i*3;`の左辺の`n`は式ではないことに注意。

注意：特別に`＜式＞ ";"`のものを式文と呼ぶ。（例 10;）

# 構文規則
### 文脈自由文法
文脈自由文法(context-free grammer，CF文法)について理解する。CF文法では定義::=の代わりに→が用いられる。ここでひとつCF文法の例を以下に挙げる。

```
G_0 = (
  N = {E},                          //非終端記号
  Σ = {num, +, *, (, )},            //終端記号
  P = {E → E+E | E*E | num | (E)},  //生成規則
  S = E                             //開始記号
)
```

以上のCF文法から得られる式を1つ挙げると`num + num * num`である。ここでCF文法の曖昧性を考える。`num + num * num`の解析木を描くと以下の2つが得られることがわかる。

![計算機言語-7](https://github.com/user-attachments/assets/35fc700f-a800-40a7-9bac-c90062c76700)

解析木Ⅰでは`*`が深い部分に存在している、すなわち`*`が優先して演算されていることがわかる。
反対に、解析木Ⅱでは、`+`が深い部分に存在している、すなわち`+`が優先して演算されていることがわかる。このとき、数学的に正しい演算順序は`解析木Ⅰ`である。

この曖昧さを無くすために`G_0`と等価でかつ、無曖昧な文法`G_1`を以下に示す。このとき、曖昧さを無くすために意識する3点は、
・`+`よりも`*`を優先して演算する。（`*`を深い位置で実行する）
・`+`は左結合が優先
・`*`は左結合が優先
である。これを基に作成した`G_1`は以下の通りである。
```
G_1 = {
  N = {E, T, F},
  Σ = {num, +, *, (, )},
  P = {
    E → E+T | T,
    T → T*F | F,
    F → num | (E) 
  }
  S = E
}
```
`P`の配列の内容に着目する。`P[0]`に`+`の演算が来た後、`P[1]`に`*`の演算が来ている。この順序により、`num + num * num`の解析木を書いた際に曖昧さが無くなっていることがわかる。
また、各生成規則で左結合を示していることにも注意。
Reactのpublicフォルダに配置したファイルを参照したい。

# 実現したいこと
- React(CRA)のビルドを挟まずにReactアプリ内から参照する値を手動で変更したい。
(詳細: ホーム画面のインフォメーションが時折変更されるが、アプリのビルドが手間なのでビルドせずに変更したい。DBに入れるほどの情報ではない。Webサーバ上で直接ファイルを書き換えてインフォメーションを更新できるようにしたい。)

# 解決方法
1. publicフォルダに対して、information.jsonのようにjsonファイルを配置
```
(root)
└── public/
    └── information.json
```
```json:information.json
{
    "informations": [
        "お知らせ1",
        "お知らせ2",
        "お知らせ3"
    ]
}
```

2.参照したいコンポーネントでinformation.jsonをfetchする
=>アプリのルートパスを指定する必要があると思ってたんですが、単純にpublicディレクトリからの相対パスで良いみたいです。
```jsx
const headers = { 
    'Content-Type': 'application/json',
    'Accept': 'application/json'
}
       
const info = fetch('information.json', { headers : headers})
      .then(res => res.json())
      .then(json => json.data?.informations)
```

こんな感じで無事にデータを取得することができました。
あとはJSONファイルを直接編集するなりなんなりして表示したい内容を切り替えることができます。

# 参考
https://stackoverflow.com/questions/46793310/fetch-local-json-file-from-public-folder-reactjs
【Ruby】ActiveRecordRelationクラスの値を取得する方法

# 記事概要
ActiveRecordRelationクラスの値を取得する方法について、記述する。
where句でレコードを取得した場合に活用できる。

# 言語やフレームワーク
|| 使用技術 |
| ---- | ---- |
| フロントエンド | - |
| バックエンド | Ruby 3.2.0 |
| データベース | - |
| インフラ | - |
| API | - |
| その他 | - |

# データ取得方法
## where句を使用した場合のデータ取得方法
### 成功
```ruby
irb(main):001> student = Student.where('id < 3')
  Student Load (2.3ms)  SELECT `students`.* FROM `students` WHERE (id < 3)
=> 
[#<Student:0x000000010c5a5908 id: 1, name: "Taro", age: 24, created_at: Sat, 16 Nov 2024 14:33:55.696305000 UTC +00:00, updated_at: Tue, 19 Nov 2024 16:34:25.414598000 UTC +00:00>,
 #<Student:0x000000010c5ea148 id: 2, name: "Jiro", age: 23, created_at: Sat, 16 Nov 2024 14:33:55.722352000 UTC +00:00, updated_at: Tue, 19 Nov 2024 16:34:25.434192000 UTC +00:00>]

irb(main):002> student.to_a[0].id
=> 1 
# 配列の0番目のidを取得

irb(main):003> student.to_a[0].name
=> "Taro"
# 配列の0番目のnameを取得

irb(main):004> student.to_a[1].name
=> "Jiro"
# 配列の1番目のnameを取得
```

### エラー
`student.id`で値を取得しようとした場合、エラーが発生する。
```ruby
irb(main):001> student = Student.where('id = 1')
  Student Load (2.0ms)  SELECT `students`.* FROM `students` WHERE (id = 1)
=> [#<Student:0x000000010713cfb0 id: 1, name: "Taro", age: 24, created_at: Sat, 16 Nov 2024 14:33:55.696305000 UTC +00:00, updated_at: Tue, 19 Nov 2024 16:34:25.414598000 UTC +00:00>]

irb(main):002> student.id
(irb):2:in `<main>': undefined method `id' for #<ActiveRecord::Relation [#<Student id: 1, name: "Taro", age: 24, created_at: "2024-11-16 14:33:55.696305000 +0000", updated_at: "2024-11-19 16:34:25.414598000 +0000">]> (NoMethodError)
Did you mean?  ids
```

## findメソッドを使用した場合のデータ取得方法
```ruby
irb(main):001> student = Student.find(1)
  Student Load (2.5ms)  SELECT `students`.* FROM `students` WHERE `students`.`id` = 1 LIMIT 1
=> #<Student:0x000000010e881328 id: 1, name: "Taro", age: 24, created_at: Sat, 16 Nov 2024 14:33:55.696305000 UTC +00:00, updated_at: Tue, 19 Nov 2024 16:34:25.414598000 UTC +00:00>

irb(main):002> student.id
=> 1

irb(main):003> student.name
=> "Taro"
```
【Chrome拡張機能開発】OpenAIAPIからのMarkdown形式の出力をHTMLに反映させる

## はじめに
openaiAPIって、いいですよね。

今回は、ChatGPT.comからの応答読み込みとGoogle検索機能を持つChrome拡張機能のチャットボットを作成した際の、出力をMarkdown形式に整える過程についてまとめました。実装を進める中で直面した問題や工夫した点を以下に記載します。

Chrome拡張機能の作成の部分についてはまた別の記事で紹介します。
## 概要
今回は下の写真の様な、Markdown形式ののAPIからのレスポンスについて、HTMLに反映させる方法をまとめます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929797/1660356e-3390-c894-ca26-f4ed9032e165.png)

## 環境
言語 : HTML/CSS/JS
ブラウザ：chromeで動作を確認済み

## marked.jsの使用
入力されたmarkdown形式のテキストを、HTML形式に変換し、出力してくれるハイパー便利なライブラリがあります。

ライセンスはMITです。

https://github.com/markedjs/marked


## 拡張機能の開発にCDNは非推奨らしい
ということでCDNの[リンク](https://cdn.jsdelivr.net/npm/marked/marked.min.js)からアクセスした先のコードをローカルにダウンロードして使うことにしました。

調べた限りではこの方法で大丈夫かとは思いますが、もしNGだった場合はコメントにて指摘していただけると幸いです

https://cdn.jsdelivr.net/npm/marked/marked.min.js

**参考**
https://qiita.com/sey323/items/2c68214f81be7b6d5cc9
https://note.com/churin_1116/n/n9155190204b3

## 実装手順
### 1.marked.jsをダウンロード
先ほどの[リンク先](https://cdn.jsdelivr.net/npm/marked/marked.min.js)に飛んだあと、右クリック→名前を付けて保存でmarked.min.jsファイルをダウンロードします。

::: note warn
min.js形式のJSファイルはサイズを小さくし、読み込み速度を向上させたものです。

そのままの形式で正常に使うことができます。
:::
※コードを空のJSファイルにコピペしてもOK
### 2. プロジェクトへの読み込み
今回はhtmlで拡張機能を作ったため、`default_popup`である`popup.html`に次のコードを追加します。

別の言語だったり、フレームワークを使う場合は適宜読み込んでください。
```html:popup.html
<script src="marked.min.js"></script>
```
### 3. 変換
`marked.parse()`でmarkdownからHTMLを出力することができます。

下のコードではmarked.jsで変換したHTML形式のものを新しく作成した要素に挿入しています。

```javascript:popup.js
const messageDiv = document.createElement('div');
messageDiv.className = 'message assistant';
messageDiv.innerHTML = marked.parse(message) //大事な部分
chatMessages.appendChild(messageDiv);
```

**👇こういう形式の出力を**
````markdown
以下のコードを使用して、Pythonで「Hello, World!」と出力できます。

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

このコードを実行すると、コンソールに「Hello, World!」が表示されます。
````
**👇こうしてくれます！！**

```html
<p>以下のコードを使用して、Pythonで「Hello, World!」と出力できます。</p>
<pre><code class="language-python">print("Hello, World!")
</code></pre>
<p>このコードを実行すると、コンソールに「Hello, World!」が表示されます。</p>
```

## 結果
見た目もすっきりした、使い心地の良いチャットボットが出来ました！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929797/5c7799b4-c803-6ae2-43d5-ee42d38a7c90.png)

## まとめ
以上になります。ライブラリって本当にすごいんだなとおもいました。


技術や倫理、セキュリティの観点から問題がある部分がありましたらコメントで指摘していただけると幸いです！😿
【Rails】フォームでのradio_buttonとselectの使い方


# 【Rails】フォームでのradio_buttonとselectの使い方

Railsでのフォーム作成では、ユーザーが簡単に選択肢を入力できるようにするためにradio_buttonやselectがよく使われます。それぞれの使い方や実装例について詳しく解説します。

### 1. radio_buttonの使い方

radio_buttonは、複数の選択肢の中から1つだけ選択可能な入力フォームを作成するために使用します。

基本的な構文
```erb
<%= form_with model: @model do |f| %>
  <%= f.radio_button :属性名, 値 %>
  <%= f.label :属性名, 'ラベル名' %>
<% end %>
```
##### 使用例

性別を選択するフォームを作成する場合：
```erb
<%= form_with model: @user, local: true do |f| %>
  <%= f.radio_button :gender, 'male' %>
  <%= f.label :gender_male, '男性' %>

  <%= f.radio_button :gender, 'female' %>
  <%= f.label :gender_female, '女性' %>

  <%= f.submit '送信' %>
<% end %>
```
```rb
f.radio_button :gender, 'male'
```
genderカラムに'male'の値を送信します。
```rb
f.label
```
選択肢の横に表示するラベルを設定します。

### 2. selectの使い方

selectは、ドロップダウン形式で複数の選択肢から1つを選択可能な入力フォームを作成します。

基本的な構文
```erb
<%= form_with model: @model do |f| %>
  <%= f.select :属性名, 選択肢の配列 %>
<% end %>
```
選択肢の配列は、[["表示名", "値"], ["表示名", "値"]]のように設定します。

##### 使用例

都道府県を選択するフォームを作成する場合
```erb
<%= form_with model: @user, local: true do |f| %>
  <%= f.select :prefecture, [['北海道', 'hokkaido'], ['東京都', 'tokyo'], ['大阪府', 'osaka']] %>
  <%= f.submit '送信' %>
<% end %>
```
```
[['北海道', 'hokkaido'], ['東京都', 'tokyo']]
```
['表示名', '値']の形式で選択肢を設定します。

:prefectureカラムに選択した値が送信されます。

実装時の注意点

##### 1.ラベルの対応
radio_buttonではlabelタグを使い、選択肢がどの値に対応しているかを明示するとユーザーにとって使いやすくなります。
##### 2.選択肢のデータ管理
selectやradio_buttonの選択肢を直接HTMLに記述する方法もありますが、頻繁に変わるデータはモデルやヘルパーメソッドで管理すると便利です。

応用例

動的に選択肢を生成する

選択肢がデータベースに依存する場合、次のように選択肢を動的に生成できます。

selectで動的選択肢
```erb
<%= form_with model: @user, local: true do |f| %>
  <%= f.select :city, City.all.pluck(:name, :id) %>
  <%= f.submit '送信' %>
<% end %>
```
	•	City.all.pluck(:name, :id)
データベースから都市名とIDを取得して選択肢を生成します。

radio_buttonで動的選択肢
```erb
<%= form_with model: @user, local: true do |f| %>
  <% City.all.each do |city| %>
    <%= f.radio_button :city_id, city.id %>
    <%= f.label "city_#{city.id}", city.name %>
  <% end %>
  <%= f.submit '送信' %>
<% end %>
```
	•	City.all.each
都市ごとにラジオボタンを作成します。

#### まとめ

•radio_button: 複数の選択肢から1つだけ選ぶ際に使用。
•select: ドロップダウン形式で1つの選択肢を選ぶ際に使用。
•選択肢が動的に変わる場合は、データベースやヘルパーメソッドを活用して効率的に管理するのがポイント。
標準出力、標準エラーのリダイレクトを理解する。

# 検証
下記のファイルを用意する。
`nonexistent_file.txt` というファイルが以降で登場するが、これは存在しないファイルである。
``` existent_file.txt
Hello!! This is existing file.

```
## リダイレクト元
### (1)
`1`(標準出力) を stdout.txt に、`2`(標準エラー出力)を stderr.txt にリダイレクトする。
※ `1`(標準出力)は省略することができるので、`1>stdout.txt`ではなくて、`>stdout.txt` のように書くこともできる。
```
$ (cat existent_file.txt && cat nonexistent_file.txt) 1>stdout.txt 2>stderr.txt
$
```

``` stdout.txt
Hello!! This is existing file.

```
``` stderr.txt
cat: nonexistent_file.txt: No such file or directory

```

### (2)
`&`(標準出力と標準エラー出力) を stdout_stderr.txt に出力する。
```
$ (cat existent_file.txt && cat nonexistent_file.txt)  &>stdout_stderr.txt
$
```

``` stdout_stderr.txt
Hello!! This is existing file.
cat: nonexistent_file.txt: No such file or directory

```

## リダイレクト先
### (1)
`1`(標準出力) を `&2`(標準エラー出力) にリダイレクトして、`2`(標準エラー出力) を stderr.txt にリダイレクトします。
```
$ (cat existent_file.txt 1>&2) 2>stderr.txt
$ 
```

``` stderr.txt
Hello!! This is existing file.

```

### (2)
`2>&-` によって、`2`(標準エラー出力) を破棄できます。
```
$ (cat existent_file.txt 1>&2) 2>&-
$
```

# おまけ
terraform コマンドは、エラーでなくても、標準エラー出力にログが残るようである。
※ docker, terragrunt とか使ってますが、実質的にやっていることは、`terraform validate` です。
## (1)
`tee` は、`1`(標準出力)をファイルに保存しつつ、元の出力も維持するコマンドです。
下記を見ると、debug_output.txt ファイルに何も表示されてないので、terraform コマンドは、標準出力ではなくて、標準エラー出力にログを出しているみたい。
```
$ docker exec terraformmy-tfcontainer-1 sh -c "(cd envs/dev && terragrunt validate)" | tee debug_output.txt
16:55:27.017 STDOUT terraform: Success! The configuration is valid.
16:55:27.017 STDOUT terraform: 
$
```
``` debug_output.txt

```

## (2)
下記のように、`2`(標準エラー出力) を `&1`(標準出力) にリダイレクトすることで、`tee`でファイルに保存することができる。
```
$ docker exec terraformmy-tfcontainer-1 sh -c "(cd envs/dev && terragrunt validate)" 2>&1 | tee debug_output.txt
16:57:03.589 STDOUT terraform: Success! The configuration is valid.
16:57:03.589 STDOUT terraform: 
$
```
``` debug_output.txt
[0;90m16:57:03.589 [0m[0;37mSTDOUT [0m[0;36mterraform: [0m[32m[1mSuccess![0m The configuration is valid.[0m
[0;90m16:57:03.589 [0m[0;37mSTDOUT [0m[0;36mterraform: [0m[0m[0m

```


# 参考

https://stackoverflow.com/questions/70079564/terraform-plan-output-redirection-to-file-does-not-capture-error-messages

https://www.cyberciti.biz/faq/how-to-redirect-standard-error-in-bash/
バッチファイルでサーバーのファイルを取得する

```bat
@echo off
setlocal

REM full path for teraterm macro
set TTMACRO_PATH="C:\Program Files (x86)\teraterm5\ttpmacro.exe"

REM full path for winscp
set WINSCP_PATH="C:\Program Files (x86)\WinSCP\WinSCP.com"

REM server address, account
set HOSTNAME=127.0.0.1
set PORT=22
set USERNAME=root
set PASSWORD=root

REM execute command on server
set COMMAND="echo 'abc' > /home/root/file_1234"


REM create output directory
setlocal enabledelayedexpansion
for /f "tokens=2 delims==" %%i in ('"wmic os get localdatetime /value"') do set datetime=%%in
set YEAR=!datetime:~0,4!
set MONTH=!datetime:~4,2!
set DAY=!datetime:~6,2!
set HOUR=!datetime:~8,2!
set MINUTE=!datetime:~10,2!
set SECOND=!datetime:~12,2!
set FORMAT_DATETIME=%YEAR%%MONTH%%DAY%_%HOUR%%MINUTE%%SECOND%
set WORKDIR=%~dp0
set OUTDIR=%WORKDIR%out_%FORMAT_DATETIME%\




REM connect ssh server and execute command
%TTMACRO_PATH% sshv2_login_and_command.ttl %HOSTNAME% %PORT% %USERNAME% %PASSWORD% %COMMAND%



REM params for winscp command
set REMOTE_PATH=/home/root/file*
set LOCAL_PATH=%OUTDIR%file*

If not exist %LOCAL_PATH% mkdir %LOCAL_PATH%

REM execution winscp command
%WINSCP_PATH% /command ^
    "open sftp://%USERNAME%:%PASSWORD%@%HOSTNAME%" ^
    "get %REMOTE_PATH% %LOCAL_PATH%" ^
    "exit"

start explorer "%OUTDIR%"

::set LOG_PATH=C:\work\workspace\tools\ssh_fileget\file.log
::%WINSCP_PATH% /log=%LOG_PATH% /command ^
::    "open sftp://%USERNAME%:%PASSWORD%@%HOSTNAME%" ^
::    "get %REMOTE_PATH% %LOCAL_PATH%" ^
::    "exit"

endlocal
```

```ttl
;=====================================================================
; connect information
HOSTADDR = params[2]
PORT     = params[3]
USERNAME = params[4]
PASSWORD = params[5]

; timeout for execution command
timeout = 3
;=====================================================================


; make connect command
CONNECT_CMD = HOSTADDR
strconcat CONNECT_CMD ':'
strconcat CONNECT_CMD PORT
strconcat CONNECT_CMD ' /ssh /2 /auth=password /user='
strconcat CONNECT_CMD USERNAME
strconcat CONNECT_CMD ' /passwd='
strconcat CONNECT_CMD PASSWORD

; connect to hostaddress
connect CONNECT_CMD
wait '#'

; execution command
sendln params[6]
wait '#'

; termination 
sendln 'exit'

end
```
ABC380-G-Another Shuffle Windowのめっちゃ詳しい文字の解説

**解説放送のG問題の解説を一通り見ていることを前提としています。** 解法の流れはなんとなくわかったけど、順列を並び替える的な話がどこに行ったんだ？とか、(全体の転倒数)が一回しか答えに加算されていないのはなぜ？みたいな感じの疑問を持った人用の解説だと思ってください。見やすさは皆無なので許してください。

#

まず愚直解を考えてΣを展開する、「rep(i,n-k+1)をして、選んだ区間をK!通り試して転倒数をもとめてその期待値を求める」という感じのTLE前提をちょっと高速化すると、差分だけを求めるみたいな感じの解法になる
式に表すと下のようになって、Σiは、シャッフルする一番左を試す、ΣK!はその区間内を実際にシャッフルする、ということをそれぞれ意味する。

```
(Σi(
       (ΣK!(
        シャッフル前の全体の転倒数-シャッフル前のシャッフルする区間の転倒数+現在のK!での転倒数
           )
       )/K!
    )
)/(n-k+1);
```

という形になっている。なお、Σiのループ回数は(n-k+1)回であることが後で重要なので注意(i=0,1,2,...n-kなのでn-k+1回)。

とりあえずΣの性質からΣK!をそれぞれに配る
そうしたときに一個ずつ見ていく

(ΣK!(シャッフル前の全体の転倒数))/K!　について考えると、中身は定数なので、Σの性質から (ΣK!(シャッフル前の全体の転倒数))/K!=(シャッフル前の全体の転倒数)となる。1a+2a+3a...ka= a*(1+2+3,...K)=a*K!なので問題なく/K!できる、K!のせいでややこしく感じるなら K!をちゃんとした整数として求めれば理解できるはず

(ΣK!(シャッフル前のシャッフルする区間の転倒数))/K! について考えると、これはiの値が決まっているとき、絶対に定数なのでその定数が上と同様にK!回繰り返されるだけなのでK!の話が消せる

(ΣK!(現在のK!での転倒数))/K!については、これはK!ごとに値が違うからだめ、だから何もできない？と思いきや違う。今の「(ΣK!(現在のK!での転倒数))/K!」は「順列の転倒数の期待値」と言葉で表せる
この「順列の転倒数の期待値」というのは、その順列サイズがkだったとき、kC2/2という形で表せる。どういうことかというと、まず今求めているのは「期待値」であるというのが重要で、今とある順列があったとき、転倒数として数えられるのは2つ選んだ時に左の方が大きい場合となる。ここで順列の中から二つを選んだ時に、選んだ2つにおいて左の方が大きい確率は1/2であり、各ペアでの期待値は、1*1/2+0*1/2=1/2が期待値となり、それがnC2通りのペアがあるから、nC2*(1/2)=nC2/2が答えとなる。なお、確率が1/2というのは、「対称性」というキーワードで説明できるらしい。i,jと仮に決めたとして、i<jならばa[i]>a[j]ならば転倒数として数えられる。ここで、a[i]>a[j]とa[i]<a[j]としてカウントできるような順列をそれぞれ数えることを想像してみると、どちらも同じ数の通りがあると想像できる。なぜならば、長さnの順列ならば、そのうち2つを今見ているペアに使用するとしたら、それ以外のペアはどの数字がどのような並びで入っても関係なく、その関係ないやつの配置を確定させたとしたなら、あとは今見ているペア用の二つの場所に対して、a[i]>a[j]と入れるか、a[i]<a[j]と入れるかという感じで、>と<それぞれに1通りずつ加算されるからa[i]>a[j]になる通りとa[i]<a[j]になる通りは等しく、全体の通りを半分半分しているから確率は1/2となる。(ChatGPTに教えてもらったのでこれでも理解できなければさらに質問してください)

よって現在のをまとめると

```
(Σi(
        シャッフル前の全体の転倒数-シャッフル前のシャッフルする区間の転倒数+(kC2/2)
    )
)/(n-k+1);
```

という感じで全てのK!が消せた。

次にΣiの方を考えていくためにΣiを配っていく

(Σi(シャッフル前の全体の転倒数))/(n-k+1) について考えると、中身は定数であり、Σiはi=0,1,2...n-kで、合計(n-k+1)回のループなので、さっきと同様に ((n-k+1)定数)/(n-k+1)だからx定数/xという感じでまた定数だけが一回分残る

(Σi(シャッフル前のシャッフルする区間の転倒数))/(n-k+1)について考えると、これはiが毎回違うと毎回数字が変わるから、定数じゃないのでΣを消せない。しかし長さkのをスライドしていけば求められて、その総和を/(n-k+1)すれば欲しい期待値が求まる、つまり純粋に求めるのをfenwciktreeで高速化すればOK

(Σi(kC2/2))/(n-k+1)について考えると、中身は定数なので二個上の行と同じように消せるので、kC2が一個だけ残る

よって最終結果は

**シャッフル前の全体の転倒数 は一個分**
**シャッフル前のシャッフルする区間の転倒数 は愚直に求めていくんだけど高速化はfenwick_treeを使えばよくて、最後に求めた内容を /(n-k+1) すればOK**
**(kC2/2)　は一個分**


よってこの問題をACできる
【PowerShell】Sort-Object で配列の並び替え


# はじめに

Azure CosmosDB の Rest API を利用してデータを取得する際に `ORDER BY` など一部のクエリが利用できないようでした。
そこで データ取得後に PowerShell の処理で並べ替えを実装することにしました。

# 環境

- macOS: `15.0.1`
- PowerShell: `7.4.0`

# Sort-Object とは？

プロパティの値などを利用して、配列などのオブジェクトを並べ替えができる PowerShell のメソッドです。
（PowerShell はメソッドという表現でいいのだろうか？）

# 使い方

```powershell
Sort-Object -Property <プロパティ> -Descending
```

オプションは色々とあるみたいですが、今回は -Property と -Descending のみ指定して実行します。
これで プロパティの値に基づいて、降順に並び替えることができます。

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/sort-object?view=powershell-7.4

# 実際に使ってみる

```powershell
$sampleData = @(
  {
    id: 25,
    name: "Pikachu"
  },
  {
    id: 151,
    name: "mewtwo"
  },
  {
    id: 6,
    name: "Charizard"
  }
)

$sampleData | Sort-Object -Property id -Descending

# 実行結果：
#
# id: 151,
#   name: "mewtwo"
#
#
#   id: 25,
#   name: "Pikachu"
#
#
#   id: 6,
#   name: "Charizard"
```

ちゃんと並び替えできました。

# さいごに

今回は、PowerShell で Sort-Object の配列の並び替えを記事にしてみました。
簡単な内容でも忘れそうなので、こういったものも記事にして記憶に残そうと思います。

最後まで見ていただきありがとうございました。
誰かの役に立てば幸いです。
選択中セルをVSCodeで開くマクロ

動作確認済み
バージョン次第だが、
本来、Ctrl＋Shift＋V ショートカットは「値のみ貼り付け」

```
' OpenInVSCode Macro
' 起動中のVSCodeでファイルを開く
' Keyboard Shortcut: Ctrl+Shift+V
Sub OpenInVSCode()
    Dim filePath As String
    Dim vscodePath As String

    ' 選択中セルのファイルパスを取得
    filePath = ActiveCell.Value

    ' VSCodeのインストールパス（パスを適宜変更してください）
    vscodePath = "C:\Program Files\Microsoft VS Code\Code.exe"
'    vscodePath = "C:\Users\ユーザー名\AppData\Local\Programs\Microsoft VS Code\Code.exe"

    ' VSCodeを起動してファイルを開く
    Shell """" & vscodePath & """ """ & filePath & """", vbNormalFocus
End Sub
```

あと、個人用マクロのコメント
```
'//////////////////////////////////////////////////////////////////////////
'// ■Index■
'// Module1: FontColor, BackColor, SheetColor
'// Module2: AddShape
'// Module3: Image
'// Module4: TextBox
'// Module5: Others
'// Module6: Unpublished Side
'// Module7: Draft
'//////////////////////////////////////////////////////////////////////////

'//////////////////////////////////////////////////////////////////////////
'// ■Keyboard Shortcut Management■
'// 日本語はデフォルトのショートカットコマンド
'// Ctrl＋Shift＋
'// A: InsertArrow
'// B: BackColorLightBlue
'// C: BackColorTransparent
'// D: FontColorDefault
'// E:
'// F: FloatingComment/セルの書式設定
'// G: BackColorGray
'// H:
'// I: InsertRedRectangle
'// J:
'// K: SheetColorKiiro
'// L:
'// M: SheetColorMushoku
'// N:
'// O: BackColorOrange
'// P: フォント設定
'// Q: BackColorYellow
'// R: FontColorRed
'// S: BackColorBeige
'// T: SearchTextInTextBoxes（一部機能未完成）
'// U:
'// V: OpenInVSCode/値のみ貼り付け
'// W: 数式バー開閉
'// X: FontColorBlue
'// Y:
'// Z: ImageSixtyPercent

'// 以下は参考用。Alt＋F8からのショートカット登録ができないので登録しない
'//（登録するなら、おそらくキーダウンイベントを定義）
'// 1: 書式_通貨 1,234
'// 2: 書式_上のセル値をコピー
'// 3: 書式_日付
'// 4: 書式_通貨 \1,234
'// 5: 書式_パーセンテージ
'// 6: 罫線_外枠
'// 7:
'// 8:
'// 9: セルの高さ？不明
'// 0:
'// @: 表示拡大？
'// [: 
'// ;: 挿入
'// :: 表示範囲を全選択
'// ]: 
'// ,: 
'// .: 
'// /:
'// \: 罫線_線なし
'//////////////////////////////////////////////////////////////////////////

```
地域防災サイトを作成する記録（第1回）

# 最初に
これまで学習してきた内容を一通りアウトプットするため、私は「防災」をテーマにしたウェブサイトを作成することに決めました。このプロジェクトを通して、学んだ技術や知識を実際の開発に活かしながら、課題を解決し成長していきたいと考えています。

また、プロジェクトの過程や成果物を記録し、記事としてまとめることで、振り返りと発信の両方に役立てたいと思います。

テーマを「防災」にした理由は、社会的に重要な課題であることに加え、地域コミュニティや情報共有を促進する仕組みを学びながら開発できる点に魅力を感じたからです。具体的には、防災情報を共有するプラットフォームとして、使いやすさや信頼性を重視した設計を心がけます。

これからの挑戦を記事を通して発信していきますので、応援よろしくお願いいたします！

# 具体的に実装する予定の機能
1.ユーザー認証
　・ユーザー登録（名前、住所、メールアドレス、パスワード）
　・ログイン/ログアウト
　・ユーザー情報編集
　・管理者権限（荒らしユーザーや誤情報投稿者の制限）
 
2.災害情報の投稿
　・タイトル、内容、画像、位置情報（任意）を含む投稿
　・投稿に「いいね」や「コメント」を付けられる
　・投稿の編集と削除（投稿者本人のみ可能）
 
3.避難所情報の地図表示
　・避難所名、住所、収容人数、設備情報（例: トイレ、食料、医療）
　・Google Maps APIを使用して地図にピンを表示
　・ピンをクリックすると避難所の詳細情報を表示
 
4.緊急通知機能
　・管理者が登録ユーザーに一斉通知（メールまたはアプリ内通知）
　・緊急情報の優先表示（例: 赤色で目立つように）

5.タグによる情報検索
　・投稿にタグを付与（例: #洪水, #避難所, #停電）
　・タグやキーワードでの検索

6.チャット・コミュニケーション
　・避難所ごとのグループチャット（避難所ごとに状況を共有）
　・1対1のDM機能（フォローしているユーザー間）

7.地域情報のフィルタリング
　・現在地付近の災害情報を表示
　・避難所を距離順で表示

8.防災ガイド
　・防災の基本情報（避難準備、非常食の用意、緊急連絡先など）
　・地域別の防災情報（例: 洪水リスクマップ、地震ハザードマップ）
 
9.避難所の混雑状況確認（仮）
　・避難所の現在の収容人数を表示
　・混雑状況（低、中、高）をビジュアル化（例: 色分け）

10.アクセシビリティ機能（仮）
　・フォントサイズや色の調整
ITパスポート試験は国語の問題を解くイメージでやると良いよという話　～令和6年問2　サイバーセキュリティ基本法ってなんだっけ？～

# 試験中に「サイバーセキュリティ基本法ってなんだっけ？」となってしまったら

勉強したことを試験中に思い出せないというのは割とありがちな話だと思います。
特にITパスポート試験は出題範囲が広く、全ての用語を正確に暗記して試験中に思い出すというのは至難の業です。

思い出せないものを無理やり思い出そうすると焦りに繋がったり、「あれもこれも正解に見える…」と疑心暗鬼になってしまいます。
そこで、いったん問題文と選択肢を冷静に眺めて、今ある知識と照らし合わせながら、消去法で選択肢を絞ってあげる方法を解説します。

国語の選択問題を解くイメージで読んでみてください。

:::note warn
本記事はITパスポート試験の問題を解くコツを解説したものであり、IT知識をインプットするのには適していません。
IT知識をこれから学習する方は、市販のテキストや[過去問道場](https://www.itpassportsiken.com/ipkakomon.php)で学習してから本記事を読むことをおすすめします。
:::

# 令和6年問2　問題文

> 情報システムに不正に侵入し，サービスを停止させて社会的混乱を生じさせるような行為に対して，国全体で体系的に防御施策を講じるための基本理念を定め，国の責務などを明らかにした法律はどれか。

>ア　公益通報者保護法
イ　サイバーセキュリティ基本法
ウ　不正アクセス禁止法
エ　プロバイダ責任制限法

出典：令和6年度 ITパスポート試験 問2

# 解答

<details><summary>正解はこちら</summary>

イ
</details>

# 解き方解説（今ある知識で選択肢を絞ろう）

この問題では、サイバーセキュリティ基本法が正確にわからなくても、選択肢の**公益通報者**・**プロバイダ**という言葉の意味をイメージできれば、選択肢を二つに絞ることができます。

## ア　公益通報者保護法について
まずは**公益通報者**についてですが、ざっくり言うと、「会社がしている悪いことを、会社内部から国に報告する労働者」のことです。
この労働者を**保護**するのが公益通報者保護法ですが、問題文とは全く関連がないので、選択肢アは不正解ということになります。

## エ　プロバイダ責任制限法について
次に**プロバイダ**についてです。**プロバイダ**は「回線とインターネットを繋げる事業者」のことで、「インターネットの管理人」みたいなイメージで良いでしょう。
そういった人たちの責任を制限する（何でもかんでもプロバイダのせいにはならないですよ）法律がプロバイダ責任制限法ですが、これは「国の責務」ではなくどちらかというと「プロバイダの責務」を明らかにしているものなので、選択肢エは不正解になります。

## 選択肢を絞った後は
上記2点で選択肢を二つに絞ることができました。
サイバーセキュリティ基本法が分からない中でここまで出来れば上出来です。

ここからは問題文と選択肢イ・ウを照らし合わせていきます。

問題文では「国全体で体系的に防御施策を講じるための基本理念」を定めている法律がどれかを問われています。
選択肢イの**サイバーセキュリティ**は「デジタル領域の悪いこと（情報漏洩・改ざん等）を防ぐ」ものであり、選択肢ウの**不正アクセス禁止**は「他人のID・パスワードを勝手に使ってアクセスすることを禁止すること」です。

どちらもデジタルな話であることは共通ですが、より基本的な内容なのは選択肢イの**サイバーセキュリティ基本法**になります。

選択肢ウの**不正アクセス禁止法**は不正アクセスという割と具体的な行為に対する法律のため、選択肢イと比較したときに、問題文の「基本理念」という部分にそぐわないということになります。


# まとめ
今回は「サイバーセキュリティ基本法を思い出せなくなったら」ということを想定した解説でしたが、「サイバーセキュリティ基本法」以外の断片的な知識と問題を紡いでいけば正解に近づけるということが分かると思います。

国語の問題のように、問題文の中に正解があるとまでは言いませんが、ITパスポート試験では問題文・選択肢の中にヒント（あるいはヒントに成り得る文言）があることが多いので、国語の問題を解くイメージが大事だと思います。

今後も解き方解説を執筆する予定なので、よろしくお願いします。
ESP32でSD_MMC.hを使用する方法

# 背景
ESP32-WROOM-32Eの開発ボード（秋月）を使用してSDMMCでmicroSDカードに読み書きをしようとしましたが、色々エラーが起きて大変だったためメモします。

# 環境
- PlatformIO
- Windows11 or macOS Sonoma
- pythonインストール済み

# 方法

## 1. コードを書く

`main.cpp`に以下のコードを書きます。

```c++:main.cpp
#include <Arduino.h>
#include <SD_MMC.h>

const char *filename = "/test.txt";
bool is_sd_initialized = false;

void setup() {
  Serial.begin(115200);
  Serial.println("SDMMC Initiating...");
  bool result = SD_MMC.begin("/root", true, false);
  if (result) {
    Serial.printf("SDMMC initialized successfully\n");
  } else {
    Serial.printf("SDMMC initialization failed\n");
  }
  is_sd_initialized = result;
}

void loop() {
  if (!is_sd_initialized) {
    return;
  }
  static int count = 0;
  Serial.printf("count: %d\n", count++);
  // SDカードにファイルを書き込む
  File file = SD_MMC.open(filename, FILE_APPEND);
  if (!file) {
    Serial.printf("Failed to open file for writing\n");
    return;
  }
  file.println(count);
  file.close();
  delay(1000);
}
```

## 2. ピンを接続する

次の表の様にピンを接続します。
| ESP32 pin | SD card pin | メモ           |
| --------- | ----------- | ------------- |
| IO14      | CLK         | 10kΩ プルアップ |
| IO15      | CMD         | 10kΩ プルアップ |
| IO2       | D0          | 10kΩ プルアップ |
| IO4       | D1          | 10kΩ プルアップ |
| IO12      | D2          | 10kΩ プルアップ |
| IO13      | D3          | 10kΩ プルアップ |
| 3.3V      | VDD         | 容量大きめのパスコンを配置 |
| GND       | VSS         |               |

この時、3.3VとGNDの間にパスコンを配置するのを忘れないでください。

https://github.com/espressif/esp-idf/issues/9187

## 3. 書き込み設定を変更する

ESP32は起動時のIO12の電圧で、フラッシュメモリの動作電圧を切り替える機能があるみたいです。

https://qiita.com/nichicon/items/43cc870701383fd14d53

この記事を参考に、IO12の電圧に関わらず、フラッシュメモリの動作電圧を3.3Vに固定するための設定をします。

### 3-1. esptoolのインストール
次のコマンドを実行してesptoolをインストールします。

```shell
pip install esptool
```

### 3-2. 設定の確認
現在の設定を確認します。

```shell
espefuse.py --port <ポート> summary
```

<ポート>には、使用しているポートの名称を入れてください。

(例）
- Windows：COM5
- Mac：/dev/tty.usbserial-3120

ここで、XPD_XXXXXの部分（下の方）が0になっていればOKです。

### 3-3. 設定を変更する

次のコマンドで、フラッシュメモリの動作電圧を3.3Vに設定します。

```shell
espefuse.py --port <ポート> set_flash_voltage 3.3V
```

## 4. 書き込む

IO2がプルアップされた状態だとESP32に書き込むことができないため、IO2のプルアップを一度外してください。
その後、PlatformIOで書き込みます。
書き込み終わったら再びIO2のプルアップを繋げてください。

## 5. 確認する
しばらくコードを実行した後、SDカードを外してPCに接続し確認すると、`text.txt`が作成され、その中に
```text
1
2
3
4
5
...
```
と書き込まれているはずです。

# 最後に
SDカードのパスコンがなかったり、容量が小さいと早い速度では読み書きができませんでした。
これに気づくまで時間がかかりました😢

初めてのQiitaでの記事なので、間違い等がありましたらコメントで教えてください。

## 参考にしたサイト等

https://qiita.com/nichicon/items/43cc870701383fd14d53

https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf

https://github.com/espressif/esp-idf/issues/9187
Chakra UI v3でアイコンボタンにハンバーガーアイコンを埋め込む

## 状況
Chakra UI v3でアイコンボタンにハンバーガーアイコンを埋め込もうとした。

```react
import { HamburgerIcon } from '@chakra-ui/icons';

<IconButton aria-label='メニューボタン' icon={<HamburgerIcon />}/>
```

しかしブラウザの表示が真っ白になってしまう。

## 解決法
公式ドキュメントによるとv3から`@chakra-ui/icons`が削除されたとのこと。（スクショは英語を日本語に訳したものです）

![スクリーンショット 2024-11-20 0.29.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/85bd9de7-42fd-0e84-6ec7-6a8cfc12dae4.png)

https://www.chakra-ui.com/docs/get-started/migration

今回はハンバーガーアイコンを使用したいので、`$ npm install react-icons`で`react-icons`をインストール後、下記のコードに修正。
```react
import { FaBars } from 'react-icons/fa';

<IconButton aria-label='メニューボタン'><FaBars /></IconButton>
```

アイコンボタンにハンバーガーアイコンが埋め込まれた状態で表示することが出来た。


![スクリーンショット 2024-11-20 0.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/9127b4ab-487e-517d-6d6d-33e723c3689f.png)

## まとめ
今までの`@chakra-ui/icons`を使った記述法ではハンバーガーアイコンが表示できず、公式ドキュメントを読むまで`@chakra-ui/icons`が使えなくなったことを知りませんでした。

現状、v3の情報のブログ記事などは少ないため公式ドキュメントを頼りにしていきたいです。
わりと使うけど忘れがちなGitコマンド集


<!-- 発端や概要を記載 -->
# はじめに
備忘としてわりと使うけど忘れがちなGitコマンドをまとめました。
(随時更新予定)


### リモートリポジトリ操作

* リモートリポジトリの参照
```
git remote -v
```

* リモートリポジトリを新規追加
```
git remote add origin <url>
```

* リモートリポジトリを変更
```
git remote set-url origin  <url>
```

* 削除されているリモートブランチを、ローカルブランチから削除
```
git fetch --prune
```

* リモートブランチの削除
```
git push --delete origin <branch>
```

* リモートブランチの一覧を表示
```
git ls-remote
```


### ローカルブランチ操作

* ローカルブランチ名を変更
```
git branch -m <old-name> <new-name>
```

* ローカルブランチを削除
```
git branch -d <branch>
```

* マージ済みのブランチを一覧表示
```
git branch --merged
```

* 未マージのブランチを一覧表示
```
git branch --no-merged
```

* 新規ブランチを作成して移動
```
git checkout -b <new-branch>
```

* 削除したブランチの復元
```
git reflog
git branch <deleted-branch> HEAD@{n}  # ブランチの復元
git checkout <deleted-branch>
```

* 他ブランチの差分を取り込む
```
git rebase <branch>
```


### コミット操作

* ステージングに追加
```
git add <file>
```

* コミットを作成
```
git commit -m "message"
```

* ステージングした変更を直前のコミットに追加
```
git commit --amend --no-edit
```

* 直前のコミットメッセージを修正
```
git commit --amend -m "new message"
```

* 過去のコミットを編集
```
git rebase -i HEAD~<n>
```

* 特定のコミットをブランチに取り込む
```
git cherry-pick <commit>
```

* 削除したコミットの復元
```
git log -- <filename>
git restore --source=commitID^ -- <filename>
git add <filename>
git commit -m "Restore filename"
```


### 履歴のリセット

* 直前の git add をすべて取り消し
```
git reset --mixed HEAD
```

* 直前のコミットを取り消し、変更は保持
```
git reset --soft HEAD^
```

* 直前のコミット・変更内容をすべて取り消し
```
git reset --hard HEAD^
```

* 直前のリセット操作を取り消し
```
git reset --hard ORIG_HEAD
```

* 一時的に変更を退避
```
git stash            # 変更内容を一時退避
git stash show       # スタッシュの内容を確認
git stash pop        # スタッシュから変更を復元
```

### 差分確認

* 変更のみを確認
```
git diff [--diff-filter=M]
```

* 直前のコミットの差分を確認
```
git diff HEAD^ HEAD
```

* 差分のあるファイル一覧を表示
```
git diff --name-only <commit>
```

* Git管理外のファイルを比較
```
git diff --no-index -- <path>
```

### ログ管理

* コミットメッセージを一行で表示
```
git log --oneline
```

* 差分付きのログを表示
```
git log -p
```

* ファイルごとの変更量を表示
```
git log --stat
```

* コミットログツリーを可視化
```
git log --graph
```

* 特定のコミットの詳細を表示
```
git show <commit>
```

* 各行の変更者を表示
```
git blame <file>
```

* ファイルの変更履歴を表示
```
git log -- <file>
```

### サブモジュール操作

* サブモジュール追加
```
git submodule add <url>
```

* サブモジュール初期化
```
git submodule init
```

* サブモジュール初期化 (git clone時に初期化)
```
git clone --recursive <url>
```

* サブモジュールも含めて一括で初期化 & 更新
```
git submodule update --init --recursive --remote
```

### オブジェクト整合性と不要データ削除

* オブジェクトの整合性をチェック
```
git fsck
```

* 差分の圧縮と不要オブジェクト削除
```
git gc --aggressive --prune=all
```

### その他

* Git追跡対象外ファイルを削除
```
git clean -f
```

* 指定バージョンのアーカイブを作成
```
git archive -o <file>.zip HEAD
```
【合格体験記】AWS Certified Cloud Practitionerに合格しました(2024/11/04)【CLF-C02】

# 目次
[#1.はじめに](#1はじめに)
[#2.筆者のスペック](#2筆者のスペック)
[#3.学習内容](#3学習内容)
[#4.試験当日](#4試験当日)
[#5.あとがき](#5あとがき)

# 1.はじめに

題名の通り、AWS Certified Cloud Practitioneに合格しました。

https://twitter.com/ss_IT_study/status/1853417951078256732

Xの投稿の通り同じ日にAIFも受験しています。AIFについては以下記事です。
[【合格体験記】AWS Certified AI Practitioner(正式版)に合格しました(2024/11/04)【AIF-C01】](https://qiita.com/ss_IT_study/items/46c1b065bf1d99442595)

# 2.筆者のスペック

* 大学は情報系
* SIerで10年程度勤務
* AWSの利用経験は2年程度
* AWS SAA取得済み([【合格体験記】AWS Certified Solutions Architect - Associateに合格しました(2022/11/19)【SAA-C03】](https://qiita.com/ss_IT_study/items/d14b81ea4c92ced86786))
* AWS DVA取得済み([合格体験記】AWS Certified Developer - Associateに合格しました(2023/02/23)【DVA-C01】](https://qiita.com/ss_IT_study/items/ae5e612f6f0affe7bf8a))
* AWS SAP取得済み([【合格体験記】AWS Certified Solutions Architect - Professionalに合格しました(2024/03/16)【SAP-C02】](https://qiita.com/ss_IT_study/items/3f9ba1321476e2b8bc9e))
* AWS SCS取得済み([【合格体験記】AWS Certified Security - Specialtyに合格しました(2024/06/30)【SCS-C02】](https://qiita.com/items/2cc0321223e0022e5b6e))
* AWS SOA取得済み([【合格体験記】AWS Certified SysOps Administrator - Associateに合格しました(2024/08/10)【SOA-C02】](https://qiita.com/ss_IT_study/items/816230059ad07d0679bc))

# 3.学習内容
①[AWS Certified Cloud Practitioner (CLF-C02) 試験ガイド ](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-cloud-practitioner/AWS-Certified-Cloud-Practitioner_Exam-Guide.pdf)

CIFはSAAやSAPで問われない一般的なクラウドの考え方や責任分界点の話が出ると聞いていたので、まずは試験ガイドを読み込み、範囲を把握しました。

②[AWS Certified Cloud Practitioner Official Practice Question Set (CLF-C02- Japanese)](https://explore.skillbuilder.aws/learn/course/16792/aws-certified-cloud-practitioner-official-practice-question-set-clf-c02-japanese)

こちらもSkillBuildersの無料コンテンツです。20問無料で問題演習ができます。
SAA,SAP取得済みでしたが公式問題集だけはやっておきました。


# 4.試験当日
過去の試験と同様にテストセンターを予約の上受験しました。
予約より少し早めに到着したところ、試験自体も少し早く開始できました。
正直手応えしかなかったので早めに退出しました。

CLFでは他の認定試験と異なり、受験後すぐに画面上に合格表示がありました。
点数や正式発表はしばらく経ってから試験履歴が更新されました。

# 5.あとがき
AWS CLF(CLF-C02)の合格体験記でした。
なめてかかっていたのは事実ですが、試験の手応えは結構あったので、
思ったより点数が伸びず少し驚きました。
※機械学習関連は同じ日に受験したAIFの対策がなかったら危なかったかもしれません

上位の認定を取得している方もある程度は対策してから受験するのがいいと思います。