OmniAICreator/Qiita-1.07M huggingface dataset:
Typescript コンパイルエラーが発生していないのに、実行時のみメソッドやフィールドが存在しないと言われる時の解決法

## 発生したこと

以下のコードの`expendedAt`の`getMonth()`メソッドを使用しようとした際、エディタ上ではエラーが出ていないが、実際に動かすとメソッドが存在しなというエラーになった。

```ts
export class ExpenditureHistory {
	id: string;
	name: string;
	categoryId: string;
	categoryName: string;
	amount: number;
	expendedAt: Date;
    
	constructor(
		id: string,
		name: string,
		categoryId: string,
		categoryName: string,
		amount: number,
		expendedAt: Date,
	) {
		this.id = id;
		this.name = name;
		this.categoryId = categoryId;
		this.categoryName = categoryName;
		this.amount = amount;
		this.expendedAt = expendedAt;
	}
}
```

## 原因

コンストラクタに渡している引数が`any`型だったため、実際の実行時には`string`型が入ってしまっていた。

## 対処法

コンストラクタに渡す際、型変換を追加した

```ts
    new ExpenditureHistory(
        x.id,
        x.name,
        x.category_id,
        categoryName
        x.amount,
        new Date(x.expended_at),
    ),
```

## 結論

SQLでデータベースから受け取った値は、基本的に`any[]`型になるが、最初に使用するより前の時点で、明確に型変換をしておくべきだった。

また、Typescriptが型エラーを検出してくれるのは、jsにコンパイルされる前までなので、指定した型と違う型の値が入ってしまうこともあるということに気づいた。
【待望の機能】1つのブラウザで複数のAWSアカウントにサインイン出来るようになりました ～AWS100本ノック～ 27/100

# はじめに

みなさん、今まで複数のAWSアカウントで並行作業する場合は、どうしていましたか？
おそらく、以下のどちらかでやっている人が多いと思います。

- 複数のWebブラウザで作業する 例：ChromeでアカウントA、SafariでアカウントBにサインイン
- シークレットモードで作業する

これって結構手間ですよね...
何とかならないかなーとずっと思っていましたが、1/16にAWSで以下の機能が発表されました:smile:
> AWS マネジメントコンソールは、複数の AWS アカウントへの同時サインインをサポートするようになりました。
投稿日: 2025年1月16日
本日、AWS はマルチセッションのサポートを発表しました。これにより、AWS のお客様は AWS コンソールで複数の AWS アカウントに同時にアクセスできるようになります。AWS のお客様は、1 つのブラウザで最大 5 つのセッションにサインインできます。これは、異なるアカウントまたは同じアカウントのルート、IAM、またはフェデレーションロールの任意の組み合わせにすることができます。

これを使えば、なんか今までの手間が解消されそう！！！
ってことで、試してみました。
今回は、Identity Centerを利用している場合について、試してみました。
IAMユーザを複数切り替えるのは、[こちらの記事](https://dev.classmethod.jp/articles/aws-consol-multisession/)でクラメソさんが試しています。

# 試してみた

まず、SSOのログイン画面でログインし、適当なAWSアカウントにサインインします！
右上のメニューを開くと、以前までなかった`マルチセッションサポートをオンにする`というボタンが表示されていると思うので、こちらをクリックします。
![①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/793244e2-be06-4f2f-8da2-906888021d69.png)

すると、マルチセッションサポートについての説明が表示されるので、オンにするをクリックします。
![②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/94f25119-f371-42b6-8dc6-6b644888864f.png)

するとURLが以下のように変わるはずです！
`https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1#`
👇
`https://${AWSアカウントID}-${ランダムなID}.ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1#`

後は、アクセスしたいAWSアカウントに今まで通りSSOでアクセスすれば、以下のようにアクティブなセッションのリストに追加されていきます。
アカウントを切替えたくなったら、リストのアカウントをクリックすれば、そのAWSアカウントにサインインできます、簡単ですね:smile:

もし、セッションサポートをオフに戻したい場合は、`マルチセッションサポートをオフにする`をクリックします。

また、`すべてのセッション or 特定のセッション`からサインアウトすることも可能です。

![③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/1a797614-264d-47cb-9acf-e942242e6000.png)


# アクティブなセッションの上限
この機能で無限にアクティブなセッションを作れるかと思いましたが、現状5つまでしかアクティブなセッションは作ることが出来ません。
それ以上作ろうとすると、以下のような画面が表示されるので、いずれかのセッションをサインアウトする必要があります。
![④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/4cd5b6cf-ce8f-4644-b12d-39d974c2bef4.png)


# おわりに
今回は、`1つのブラウザで複数のAWSアカウントにサインイン`する新機能について紹介しました。
ありそうでなかった機能なので、みなさんのインフラ構築が加速しそうですね！
※個人的には、アカウント名もセッションリストに表示されるとより分かりやすくていいとは思いました...
個人的備忘録：ECS で migrate を動かすために Dockerfile を修正し、migrate 専用コンテナを立ち上げてみた

## はじめに
本記事では、**Dockerfile.prod に migrate のビルドと実行を組み込む方法** について解説します。  

:::note info
**ECS 上で migrate を適切に動作させるために、**Docker イメージ内に migrate を含める設定** を行いました。**
:::

また、`aws ecs execute-command` や `aws ecs run-task` を用いた migrate の実行方法についても説明します。  

**本番環境でのマイグレーション管理をスムーズに行うための参考になれば幸いです。**

## 書こうと思ったきっかけ
ECS でアプリケーションをデプロイする際、**データベースのマイグレーションをどのように管理するか** が課題になりました。  
特に、  
- **migrate をコンテナに含めるか**
- **専用の migrate コンテナを作成するか**  

の選択に迷い、整理する必要がありました。  

:::note warn
***また、`aws ecs execute-command` や `run-task` を活用した migrate の実行方法についても知見をまとめたかったためです。***
:::

実際に設定を試しながら学んだことを整理し、今後の運用に活かせるように記事にしました。

**ざっくりと、こんなイメージです👇**

![Screenshot 2025-02-21 at 6.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/0edb6874-76cb-4219-bfad-384af8846cf7.png)

## 1. `Dockerfile.prod` の修正内容
現在の `Dockerfile.prod` では、`migrate` のビルドとコンテナへのコピーが適切に行われるよう修正済みです。

```dockerfile
FROM golang:1.23.5-alpine3.21 AS builder
WORKDIR /usr/src/app

# 依存関係を取得
COPY go.mod go.sum ./
RUN go mod download && go mod tidy

# ソースコードをコピー
COPY . .

# `server` と `migrate` の両方をビルド
RUN CGO_ENABLED=0 GOOS=linux go build -o server .
RUN CGO_ENABLED=0 GOOS=linux go build -o migrate ./migrate/migrate.go

# 本番環境用の軽量コンテナ
FROM alpine:3.21

# `server` と `migrate` をコンテナにコピー
COPY --from=builder /usr/src/app/server .
COPY --from=builder /usr/src/app/migrate .

# デフォルトの CMD は `server`
CMD ["./server"]
```

## 2. `migrate` のバイナリをコンテナに含める理由
- **ECS で `migrate` を実行できるようにするため**。
- **アプリケーション (`server`) とデータベースのマイグレーション (`migrate`) を分離できる**。
- **ECS の `execute-command` や `run-task` を使用して `migrate` を手動または自動で実行可能**。

## 3. `ECS` で `migrate` を実行する方法
### **3.1 `aws ecs execute-command` を使用する方法**
ECS のコンテナ内で `migrate` を実行するには、以下のコマンドを使用します。
```sh
aws ecs execute-command --cluster my-ecs-cluster \
  --task <TASK_ID> \
  --container app \
  --command "/migrate"
```

### **3.2 `aws ecs run-task` を使用する方法**
タスクを作成し `migrate` を実行するには、以下のコマンドを使用します。
```sh
aws ecs run-task --cluster my-ecs-cluster \
  --task-definition my-ecs-task \
  --launch-type FARGATE \
  --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxxx],securityGroups=[sg-xxxxx],assignPublicIp=ENABLED}" \
  --overrides '{"containerOverrides":[{"name":"app","command":["/migrate"]}]}'
```

## まとめ
- `Dockerfile.prod` に `migrate` のビルドを追加し、ECS で実行可能に修正。
- `migrate` のバイナリをコンテナに含めることで、ECS で `execute-command` や `run-task` を使用して実行可能。
- 本番環境では `migrate` コンテナを別途作成し、マイグレーションを確実に管理するのが推奨。

ECS でのマイグレーションを効率的に管理するために、適切な戦略を選択していきたいです！
個人的備忘録：Go アプリのマイグレーション戦略として、main.go・migrate コンテナ・手動実行をまとめてみた

## はじめに
ECS 上でのマイグレーション管理について、さまざまな方法を試して比較する機会があったため、整理することにしました。

:::note info
**どの方法が適しているかは環境や運用方針によって異なるため、それぞれのメリット・デメリットを明確にしておきたいと考えました。**
:::

このまとめが、自分自身の備忘録としてだけでなく、同じ課題に直面する方の参考になればと思います。

## 1. **Go アプリの `main.go` でマイグレーション**
### メリット
- シンプルで管理しやすい。
- `main.go` にマイグレーション処理を組み込むだけでOK。
- 追加の設定が不要で、すぐに実装可能。

### デメリット
- アプリが起動するたびにマイグレーションが実行される。
- アプリがクラッシュすると、マイグレーションの途中で止まる可能性がある。
- コンテナをスケールアウトすると、複数のコンテナが同時にマイグレーションを実行する可能性がある。

### 実装例 (`main.go` にマイグレーションを追加)
```go
package main

import (
    "log"
    "skill-typing-back/db"
    "skill-typing-back/model"
)

func main() {
    dbConn := db.NewDB()
    if dbConn == nil {
        log.Fatal("データベースの初期化に失敗しました")
    }

    log.Println("マイグレーションを実行中...")
    err := dbConn.AutoMigrate(
        &model.User{},
        &model.Category{},
        &model.Question{},
        &model.Answer{},
        &model.Choice{},
        &model.Score{},
    )
    if err != nil {
        log.Fatal("マイグレーションに失敗しました: ", err)
    }

    log.Println("マイグレーション完了")
    // アプリの通常の処理に進む
}
```

## 2. **ECS の `migrate` コンテナを使う**
### メリット
- 本番環境に最適。マイグレーション完了後にアプリが起動するよう制御可能 (`dependsOn` を使用)。
- マイグレーションの管理が分離される。アプリとマイグレーションの実行タイミングを分けられる。
- Terraform でインフラをコード化できる。

### デメリット
- `Terraform` の設定が少し増える。
- マイグレーション用のコンテナを別途作成する必要がある。

### Terraform の `migrate` タスク定義例
```hcl
resource "aws_ecs_task_definition" "migrate" {
  family                   = "my-app-migrate"
  requires_compatibilities = ["FARGATE"]
  network_mode             = "awsvpc"
  cpu                      = "256"
  memory                   = "512"
  execution_role_arn       = aws_iam_role.ecs_task_execution_role.arn
  task_role_arn            = aws_iam_role.ecs_task_execution_role.arn

  container_definitions = jsonencode([
    {
      "name": "migrate",
      "image": "my-ecr-repo:latest",
      "command": ["/migrate"],
      "essential": true,
      "networkMode": "awsvpc"
    }
  ])
}
```

### ECS の `migrate` コンテナを手動実行する方法
```sh
aws ecs run-task --cluster my-ecs-cluster \
  --task-definition my-app-migrate \
  --launch-type FARGATE \
  --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxxx],securityGroups=[sg-xxxxx],assignPublicIp=ENABLED}"
```

## 3. **`aws ecs execute-command` で手動実行**
### メリット
- 簡単に試せる。
- 追加の `migrate` コンテナや `Terraform` の設定が不要。

### デメリット
- 自動化されない。毎回手動で実行する必要がある。
- 複数環境での管理が難しい。本番環境での適用ミスが起こる可能性がある。

### マイグレーションを実行するコマンド
```sh
aws ecs execute-command --cluster my-ecs-cluster \
  --task <TASK_ID> \
  --container app \
  --command "/migrate"
```

## まとめ: どの方法を選ぶべきか?

| 方法 | メリット | デメリット |
|------|----------|------------|
| **Go の `main.go` でマイグレーション** | シンプルで管理しやすい | アプリが起動するたびにマイグレーションが実行される |
| **ECS の `migrate` コンテナを使う** | マイグレーション後にアプリ起動 (`dependsOn`) | `Terraform` の設定が少し増える |
| **手動で `aws ecs execute-command` を実行** | 簡単に試せる | 自動化されない |

### 最適な選択肢
- **本番環境なら → `ECS の migrate コンテナを作成して、自動化`**
- **開発環境なら → `aws ecs execute-command` で手動実行**
- **シンプルにしたいなら → `Go の main.go でマイグレーションを組み込む`**

プロジェクトの要件に応じて適切な方法を選択していきたいと思いました。
PHPで「演算の際の型変換」の動作を確認してみた。

# 概要

PHPで「演算の際の型変換」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/php/num/index4.html

# 実装

以下のファイルを作成しました。

```sample.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
<?php
echo "5 + 2.4 = ", 5 + 2.4, '<br />';
echo "5 + '8year' = ", 5 + '8year', '<br />';
echo "5 + '東京' = ", 5 + '東京';
?>
</p>

</body>
</html>
```

以下のコマンドを実行しました。

```
$ php sample.php 
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
5 + 2.4 = 7.4<br />5 + '8year' = PHP Warning:  A non-numeric value encountered in sample.php on line 14
13<br />5 + '東京' = PHP Fatal error:  Uncaught TypeError: Unsupported operand types: int + string in sample.php:15
Stack trace:
#0 {main}
  thrown in sample.php on line 15
```

# まとめ

何かの役に立てばと。
scanf関数の'&'

scanf関数は、第2引数で受け取ったアドレスに、読み込んだ値を書き込む。
うっかり変数を渡すと、そこに格納されている値をアドレスとして認識してしまう。

```C:scanf関数の'&'
#include <stdio.h>

int main()
{
    // 変数にscanfで読み込んだ値を格納
    // nはint型の整数なので、scanfに渡すときには&が必要
    int n;
    scanf("%d", &n);
    printf("読み込んだ値は%d\n", n);

    // 配列にscanfで読み込んだ値を格納
    // array[i]は配列要素であり、int型の整数なので、scanfに渡すときには&が必要
    int array[5];
    for (int i=0; i<5; i++){
        printf("array[%d] : ", i);
        scanf("%d", &array[i]);
    }
    for(int i=0; i<5; i++)
        printf("array[%d] = %d\n", i, array[i]);

    // 配列に文字列を格納
    // ここで渡したいのは配列変数の先頭アドレス。
    // 「添え字なしの配列名」は先頭のアドレスを直接表すので、ここでは&は不要
    char str[10];
    printf("文字列を入力 : ");
    scanf("%9s", str);
    printf("入力されたのは%s\n", str);
    
    return 0;
}

```

「配列だから&は不要」というわけではなく、配列全体なのか、配列の個別要素なのかを考える必要がありますね。
COLMAPのインストール方法

# はじめに
本記事では，COLMAPのインストール方法について詳しく解説します

# 前提として
* OSはWindowsを想定しています．
* Visual Studioがインストールされており，「C++によるデスクトップ開発」が有効になっている必要があります．
* GPUを使用してCOLMAPを動かしたい場合はCUDAのインストールが必要です．

# インストール方法
インストールの流れ
1. githubからZipファイルを取得する
1. Zipファイルを解凍する
1. 環境変数「Path」に登録する
1. インストールの完了確認

## 1. Zipファイルの取得

### 1-1. COLMAPのgithubへ移動
下記のリンクからCOLMAPのgithubへ移動します
https://github.com/colmap/colmap/

### 1-2. githubページ内からDownloadの見出しを見つける
リンク先のページを下にスクロールしていくとDownloadと書かれた部分があります．
![COLMAP_github_download_link.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4015820/cb585462-552f-4d08-92f9-2d336bc45fc2.jpeg)

### 1-3. OSに対応するリンクをクリック
今回はWindowsのため，[Windows用ダウンロードページ](https://github.com/colmap/colmap/releases)をクリックする．
![COLMAP_github_download_link_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4015820/8cb96ea9-fc25-4fbd-a022-9b860c6a00c4.jpeg)

### 1-4. CUDAの有無を確認してZipファイルを選択しダウンロードする．
* CUDAがある場合は，"colmap-x64-windows-**cuda**.zip" をダウンロード
* CUDAがない場合は，"colmap-x64-windows-**nocuda**.zip" をダウンロード
:::note info[
※ CUDAとはNVIDIA製GPUを用いた高速計算技術です．
GPUを使用する場合にはCUDAのインストールが必要です．
:::
今回はCUDAがあるため，[colmap-x64-windows-cuda.zip](https://github.com/colmap/colmap/releases/download/3.11.1/colmap-x64-windows-cuda.zip)をダウンロードする．


![COLMAP_github_download_zip.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4015820/622ce2f9-6646-499b-9ca8-f19d61e82087.jpeg)

## 2. Zipファイルの解凍
先ほどダウンロードしたZipファイルを任意の場所を選択して解凍する．
今回は新たに「COLMAP」というフォルダを作成し，そこへ解凍する．
![kaitou.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4015820/3f1234a7-c63d-4a41-8fbf-2f92e4664124.jpeg)

解凍されたファイルが次の写真の通りなら問題ありません．
![COLMAP_downloaded.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4015820/dd0806da-2a82-462b-87c5-20e1d575ced6.jpeg)

## 3. 環境変数「Path」の登録
3-1. windowsの検索窓に「env」と入力し，検索結果から「環境変数を編集」を選択する．
![env.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4015820/3692e4b8-81f5-4720-b425-d6078a298d60.jpeg)

3-2. ユーザー環境変数のリスト内にある「Path」を選択し，編集をクリックする．
![user_env.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4015820/4f84392c-67a3-400e-9a18-95b2d7379e27.jpeg)

3-3. ダウンロードしたファイルから「colmap.exe」が入っているフォルダを見つける
![colmap_exe.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4015820/122b3d2b-1627-4c06-8d7c-a4f70c552c9b.jpeg)

3-4. 新規を選択し，3-3で確認したフォルダのパスを入力し，OKを押す．
今回の場合は「bin」フォルダの絶対パスを入力する．
※ 環境変数「Path」を変更した後，反映されない場合はPCを再起動してください．
![user_env_edit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4015820/180ab333-786b-42aa-afec-8c950a5b8e35.jpeg)

## 4. インストールの完了確認
コマンドプロンプト(PowerShellも可)を起動し，`COLMAP -h` コマンドを実行する．
このように表示されたら，COLMAPのインストールは完了です．
![COLMAP_CMD.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4015820/a2b608bf-4f6b-4d56-bb05-962ca679ecf6.jpeg)
Pythonで効率的なコードを書くためのベストプラクティス

My website: https://todayshomebuyersguide.com/

こんにちは、Kevinです！最近プログラミングを始め、Qiitaで学びをアウトプットしています。今回は、Pythonで効率的かつ可読性の高いコードを書くためのベストプラクティスを紹介します。  

## **1. 変数・関数名は明確に**  
```python
# 悪い例
def f(x):
    return x * 2

# 良い例
def double_number(number: int) -> int:
    return number * 2
```
変数や関数の名前は、コードを読む人に意図を伝える重要な要素です。省略せずに、意味が明確な名前を付けましょう。  

## **2. リスト内包表記を活用する**  
Pythonではリスト内包表記を使うことで、シンプルかつ高速なコードが書けます。  
```python
# 通常のループ
numbers = [1, 2, 3, 4, 5]
squared_numbers = []
for num in numbers:
    squared_numbers.append(num ** 2)

# リスト内包表記を使うと
squared_numbers = [num ** 2 for num in numbers]
```
リスト内包表記を使うと、コードが簡潔になり、処理速度も向上します。  

## **3. f-stringを使って文字列をフォーマット**  
Python 3.6以降では、`f-string` を使うと可読性が向上します。  
```python
name = "Kevin"
age = 25

# 旧スタイル（非推奨）
print("My name is {} and I am {} years old.".format(name, age))

# f-string（推奨）
print(f"My name is {name} and I am {age} years old.")
```
`f-string` を使うと、コードが直感的でミスも減ります。  

## **4. `enumerate()` を使ってループ処理を最適化**  
リストのインデックスと要素を同時に取得する場合、`enumerate()` を使うのがベストです。  
```python
fruits = ["apple", "banana", "cherry"]

# 悪い例
for i in range(len(fruits)):
    print(i, fruits[i])

# 良い例
for i, fruit in enumerate(fruits):
    print(i, fruit)
```
これにより、コードがスッキリし、バグも減らせます。  

## **5. `zip()` で複数のリストを同時に処理**  
複数のリストを同時にループ処理するときは、`zip()` を使うと簡潔になります。  
```python
names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 78]

# `zip()` を使う
for name, score in zip(names, scores):
    print(f"{name}: {score}")
```
複数のリストをスマートに扱えるので、ぜひ活用してください！  

## **まとめ**  
今回はPythonで効率的なコードを書くためのテクニックを紹介しました。  

✅ **明確な変数・関数名を使う**  
✅ **リスト内包表記で簡潔に**  
✅ **f-stringで可読性UP**  
✅ **enumerate() や zip() でループを最適化**  

こうしたテクニックを活用すると、可読性が高く、メンテナンスしやすいコードが書けます。ぜひ試してみてください！🚀  

Qiitaでは今後も初心者向けの解説記事を書いていきますので、ぜひフォローよろしくお願いします！🙌
Autellix: LLMエージェントのための次世代サービングエンジン

# **Autellix: LLMエージェントのための高効率なサービングエンジン**

本記事では、最新の研究 **"Autellix: An Efficient Serving Engine for LLM Agents as General Programs"** を詳しく紹介し、既存の LLM サービングエンジン（vLLM、MLFQ など）と比較しながら、Autellix の革新性とその意義を明らかにします。

---

## **1. 背景と目的**
近年、大規模言語モデル（LLM）は **チャットボットを超えた汎用エージェントプログラム** に進化しています。これにより、以下のような **高度な推論タスク** をリアルタイムで実行することが求められています。

- **LLMエージェントの連携による問題解決**（例: Monte Carlo Tree Search）
- **自律的なウェブ操作と情報収集**（例: OpenAI Operator）
- **関数呼び出しと動的推論を伴うタスク**（例: ReAct）

### **課題: 既存のLLMサービングエンジンのボトルネック**
従来のLLMサービングエンジン（例: vLLM）には、以下の 2 つの主要な課題があります。

1. **ヘッド・オブ・ライン・ブロッキング（HoL Blocking）**
   - 長いLLMコールが短いコールをブロックし、全体のスループットを低下させる。
  
2. **プログラム全体の最適化が欠如**
   - LLMエージェントのプログラムは、**複数のLLMコールの依存関係（DAG構造）** を持つが、既存のエンジンはこれを考慮しないため、非効率な処理が発生する。

### **Autellixの目的**
Autellix は、**プログラムレベルのスケジューリング** と **データローカリティを考慮した負荷分散** により、LLM エージェントのスループットを大幅に向上させます。

---

## **2. Autellix の設計**
### **2.1 プログラムレベルのスケジューリング**
Autellix は、**個々の LLM コール単位ではなく、プログラム全体を考慮したスケジューリング** を実施します。以下の 2 つのアルゴリズムを導入しました。

| スケジューリング手法 | 適用範囲 | 動作原理 |
|----------------|--------|----------------|
| **PLAS (Program-Level Attained Service)** | シングルスレッド | **短いプログラムの優先度を高くし、長いプログラムのスケジュールを遅延** |
| **ATLAS (Adaptive Thread-Level Attained Service)** | マルチスレッド | **クリティカルパスを優先的に実行し、依存関係のあるタスクを最適化** |

### **PLAS の動作**
$$
\
p(c_j) = \sum_{k<j} t_k
\
$$

#### **擬似コード**
```python
def PLAS_scheduler(LLM_calls, process_table):
    for call in LLM_calls:
        call.priority = process_table[call.program_id].cumulative_runtime
    return sorted(LLM_calls, key=lambda x: x.priority)
```
## **3. 実験結果**
### **3.1 ベンチマークワークロード**
Autellix の性能を評価するため、以下の 4 つのエージェントワークロードで実験を行いました。

| ワークロード | 平均 LLM コール数 | 平均デコードトークン数 |
|-------------|----------------|----------------|
| **ShareGPT（チャットボット）** | 6.66 | 277 |
| **BFCL（ReAct エージェント）** | 10.75 | 34 |
| **LATS（MCTS プログラム）** | 159.7 | 72 |
| **Mixed（混合ワークロード）** | - | - |

### **3.2 実験結果**
#### **スループットの向上**
- **Autellix は vLLM に対して 4～15 倍のスループット向上を達成**
- **待ち時間を最大 33% 削減**
- **マルチエンジン環境では 1.4 倍のスループット向上**

---

## **4. まとめと今後の展望**
Autellix は、LLM エージェントのための新しいサービングエンジンとして **プログラムレベルの最適化とデータローカリティの活用** により、高いスループットを実現しました。

### **4.1 主要な貢献**
- **プログラム全体のスケジューリングの最適化**
  - PLAS（Program-Level Attained Service） により、短いプログラムが長いプログラムによってブロックされる問題を解決。
  - ATLAS（Adaptive Thread-Level Attained Service） により、マルチスレッド環境での並列処理を最適化。

- **データローカリティを考慮した負荷分散**
  - **キャッシュヒット率を向上** させ、メモリの再計算コストを削減。
  - **短いリクエストは負荷の低いエンジンに分散、長いリクエストは同じエンジンに固定** することで処理効率を改善。

- **既存のLLMサービングエンジンとの比較**
  - vLLM に比べて **最大15倍のスループット向上**。
  - MLFQ に比べて **待ち時間を33%削減**。
  - **複数エンジン環境では1.4倍のスループット向上**。

### **4.2 今後の展望**
Autellix の今後の発展として、以下の分野への適用が期待されます。

1. **分散環境（Kubernetes + LLMクラスタ）への適用**
   - マルチノード・マルチGPU環境での負荷分散最適化。
   - クラウド環境での動的なリソース配分戦略の実装。

2. **LLM の自己最適化（メタラーニング + RLHF）**
   - 強化学習（Reinforcement Learning with Human Feedback, RLHF）を組み合わせて、エージェントの動的最適化を可能にする。
   - 実行時に最適なスケジューリングパターンを学習する仕組みを導入。

3. **異種 LLM エンジンの統合**
   - さまざまな LLM モデル（GPT、LLaMA、Claude など）を統合し、最適な推論エンジンを選択するハイブリッドアプローチの研究。

4. **LLM マルチエージェント最適化**
   - 複数のLLMエージェントが協調してタスクを処理する環境において、最適なエージェント間通信を実現。

**Autellix の今後の進展に注目しつつ、さらなる応用に期待しましょう！**
Brazeって何ができるの？

# はじめに
Brazeを業務で初めて触ったのでどのようなことができるのかまとめます

# そもそもBrazeとは？
自分も最近初めて触ったもので理解が浅いのですが、**カスタマーエンゲージメントプラットフォーム**というサービスらしいです。

https://www.braze.com

カスタマーエンゲージメントとは、企業と顧客が継続的に良好な関係を構築することです。

# Brazeでできること
自分の働いている会社では、Brazeの機能を使いこなしているという感じではないですが、メッセージ送信サービスとして主に使用しています。

**やっていること**
- メールの送信
- アプリのプッシュ通知
- アプリのポップアップを送信

上記のメッセージ送信をbrazeでは、定期的、手動、APIトリガーなどから行うことができます。


# Brazeの利点
利点を語れるほど利用していないのですが、使っていて良かったと思う部分があったので書いておきます。
- Brazeは画面からメールの設定や送信トリガーを発火することができるので、非エンジニアの人でも簡単に使えます
    - 最近、ビジネスの方と一緒にアプリにポップアップを出す作業をやりました
- 特定の人やグループに簡単にメッセージを送れます <- 当たり前のことかもしれないですが...w
- Brazeが記録しているログを使ってユーザーの行動分析などが行える（これは全然使っていない機能なのですが、便利だと思ったので書きました。弊社では別に記録しているログがあるのでそちらを使用してます）

# 最後に
初めてBrazeを触ってみて、こんなサービスがあるんだなぁと思ったので、この記事を書いてみました。
Brazeをこれから触る人や導入に悩んでいる方の役に少しでも立てたら幸いです。
内容がめちゃめちゃ薄い記事になってしまいましたが、久しぶりの記事投稿ということでこのくらいで良いと思ってますw
現在、Brazeに送るリクエストに少し手を加える実装をしていて、そこで出た問題点についても記事にしようと思ってます。
もっと詳しくBraze知りたい！という方は以下の記事を読んでみると良いかもです。

https://dev.classmethod.jp/articles/introducing-braze/
🔍 Bug Attention Probe (BAP): LLM を活用したスケーラブルなバグ特定手法

# Where’s the Bug? Attention Probing for Scalable Fault Localization

今回は、最新の研究成果である **「Where’s the Bug? Attention Probing for Scalable Fault Localization」** という論文をご紹介します。本研究では、**大規模言語モデル (LLM) の注意機構を活用し、既存の手法に依存せずに効率的かつ高精度なバグ特定 (Fault Localization, FL) を実現する新手法** を提案しています。BAP (Bug Attention Probe) は、**テストケース不要、強い教師ラベル不要、小型 LLM でも高精度** という特長を持ち、従来の手法を大幅に上回る性能を達成しました。

---

## 論文情報
- **タイトル**: Where’s the Bug? Attention Probing for Scalable Fault Localization
- **リンク**: [arXiv:2502.13966](https://arxiv.org/abs/2502.13966)
- **発表日**: 2025年2月19日
- **著者**: Adam Stein, Arthur Wayne, Aaditya Naik, Mayur Naik, Eric Wong
- **DOI**: 未記載

---

## 背景と目的
ソフトウェア開発において、バグの特定と修正は極めて重要ですが、多くの開発者にとって依然として課題です。特に、**Fault Localization (FL)** は、ソフトウェアの不具合の原因となるコードを特定するプロセスですが、以下のような課題が存在します。

### **既存手法の課題**
1. **テストケース依存 (DeepFL など)**  
   - 実行可能なテストが必要であり、テストの準備や管理に大きなコストがかかる。
  
2. **計算コストが高い (GPT-4o などの LLM プロンプティング)**  
   - 大規模 LLM を活用する FL は計算資源を大量に消費し、実用化が難しい。

3. **高精度なバグラベル (行レベル) が必要**  
   - 一般的な FL モデルは行単位のバグラベルを必要とし、データ収集のコストが高い。

このような課題を解決するため、本研究では **Bug Attention Probe (BAP)** を提案しました。

---

## 研究の焦点
本研究では、LLM の内部注意機構を活用し、**ラベルなしの弱教師学習 (Weak Supervision) を用いた新しいバグ特定手法** を開発しました。BAP は次の 3 つの特性を備えています。

### **1. ラベルなしの学習 (Weak Supervision)**
- バグの有無のみを学習データとし、**行レベルのバグ位置データ不要**。
- データ収集コストを削減し、実環境への適用性を向上。

### **2. コードレベルのバグ特定**
- LLM の **トークンレベルの処理をコードレベルに拡張** し、文・行単位でバグを特定。
- ソフトウェア開発者が解釈しやすい出力を提供。

### **3. マルチラインバグの特定**
- **複数行にまたがるバグ (Multi-line Bug) を高精度で特定可能**。
- 実際のソフトウェアでは複数行に影響を及ぼすバグが多く、これまでの手法より実用的。

特に、BAP は **Llama-3.2-1B などの小型 LLM でも高精度なバグ特定が可能** であり、計算コストを大幅に削減しつつ、従来の FL 手法を上回る性能を発揮しました。

---

## 実験の概要と結果
BAP の性能を評価するため、以下の **8 つの多様なデータセット** で実験を行いました。

- **Defects4J** (Java)
- **GitHub-Python** (Python)
- **GitHub-Java** (Java)
- **DeepFix** (C)
- **TSSB-3M** (Java)
- **ManySStuBs4J** (Java)
- **Juliet-Java** (Java)
- **Juliet-C** (C)

### **評価指標**
- **トップ 1 精度 (Top-1 Accuracy)**: バグのある行を正確に特定できた割合
- **計算コスト (FLOPs)**: 推論時の計算負荷
- **長いコードへの適用性**: 50 行以上のコードに対する FL 性能

### **主な結果**
- **平均 34.6% のトップ 1 精度向上**
- **GPT-4o のゼロショット FL に対して 93.4% の性能向上**
- **マルチラインバグの特定性能向上 (P@2 で 28.9%)**
- **計算コストが 10 倍以上削減**
- **70B 以上の LLM を用いた FL よりも、小規模 BAP の方が高精度**

特に、Defects4J において **BAP は従来手法より 24.2% 向上 (トップ 1 精度: 33.4%)** し、DeepFix では **50.5% の改善** を達成しました。

また、以下の点が確認されました。
- **70B 以上の LLM を用いた FL よりも、小規模 BAP の方が精度が高い**
- **バグが 50 行以上の長いコードでは精度が低下**
- **既存の LLM にプロンプトを適用するよりも効率的**

---

## まとめと今後の展望
本研究では、**LLM の注意機構を活用した新しいバグ特定手法 (BAP)** を提案し、**従来手法よりも効率的かつ高精度な Fault Localization (FL)** を実現しました。特に、**マルチラインバグの特定、コスト削減、小型モデルでの高精度化** という点で大きな進展を遂げています。

今後の課題として、以下の点が挙げられます。
- **50 行以上の長いコードへの適用**: 長いコードでも高精度にバグを特定できるよう改良が必要。
- **大規模データセットでの評価**: より多様なプログラム言語・バグタイプへの適用検証。
- **実環境での適用**: IDE や CI/CD への統合を進め、開発者向けの実用ツールとして活用。

BAP は、**実用的なソフトウェア開発環境でのバグ特定を革新する可能性を持つ技術** であり、今後の発展が期待されます。
MIT App Inventorでルート検索を行う方法（Google Map Directions API）

## MIT App InventorでGoogle Map Directions APIを使用する
ここでは，MIT App InventorでGoogleMap Directions APIを使用する方法についてメモする．
うまく使えばナビを作れるのでは？

[GoogleMap Directions API ドキュメント](https://developers.google.com/maps/documentation/directions/get-directions?hl=ja)

### 押しポイント！
・移動手段（車，徒歩，自転車）を指定できる．
・通貨地点を指定できる．
・最適なルートを提案してくれる．

## デザイナー画面
![スクリーンショット 2025-02-21 010922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/066d5a6f-4214-4e8f-9f33-7fe0fa25413e.png)

|機能|内容|
|:-:|:-:|
|TextBox_出発|出発地点の入力|
|TextBox_目的|目的地点の入力|
|Button1|実行|
|Button2|リセット|
|Label_距離|距離の表示|
|Label_移動時間|移動時間の表示|
|Label_移動経路|ラベル|
|ListView1|移動経路の表示|
|Web1|Directions APIへのアクセス|

## ブロック
### 変数
沢山あるので重要なのだけ
![blocks (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/e02091c5-776f-488b-a5d5-6f18f330c57f.png)
![blocks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/f6d3fcb7-06a0-4f1d-a1bb-1e48b9badb39.png)

```url
https://maps.googleapis.com/maps/api/directions/json
```

### Button1
![blocks (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/f51a1285-b714-4862-a960-4665257f13e7.png)

ボタンクリックにより，Directions APIへアクセスを行う．


### web1 got. Text
![blocks (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/653cdcfd-3c1e-4e34-9937-5eeb51c5d30c.png)

レスポンスから距離，時間，経路を抽出する．

### Button2
![blocks (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/18fceda7-4430-4477-93ab-1b6b92f70a20.png)
Labelをきれいにする

## 実行画面
![Screenshot_20250221-011149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/57b52b75-c61f-4f48-a62b-92964caed96d.png)

## おわりに
googleMapを表示するのもいいが，移動時間や距離のみを取得したいときに便利だろう．．．
M5NanoC6、アナログジョイスティックの0点の偏差値を求めて遊ぶ。


参考
----

https://qiita.com/k28/items/e3b526b1cd6c4ab25bcc


https://qiita.com/k28/items/ca29b1fbb223ac684e8b

注意
----

- 過去ログを見よ!!!
- ESP32 Arduino 3.1.2
- 片側

目的
----

ADC(アナログ-デジタル-コンバータ)にアナログジョイスティックをつなぎ、中心点の時のバラツキを求める。


結果
----

![o_coq824.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1c77840e-d803-46f2-9531-5c88a547a75d.jpeg)




イメージ


![o_coq818.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ad376901-75e8-458c-abb8-a69c81f51b4c.jpeg)


プログラム
----

```c++



//ser_0ten_test1_nanoc6


#define CP (uint8_t *)
#define G_X 2
#define G_Y 1

float o_yl = 0; //L側の0(ゼロ)点
float o_yr = 0; //R側の0(ゼロ)点

void setup() {
  // put your setup code here, to run once:

  //シリアルの初期化 //debug(1)
  Serial.begin(9600);
  Serial.println();
  //シリアルの待ちが0.5*9
  for (int i = 0; i < 9; i++) {
    Serial.print('.'); delay(500); //接続待ち
  } //for
  Serial.println();


  //gpio inte
  pinMode(G_X, ANALOG);  //gpio init
  pinMode(G_Y, ANALOG);  //gpio init

    
    int al;  //一時
    int ave; //平均
    int die; //偏差
    int n;   //個数
    int y[20];
    
    int i_sqrt[] = {
        0,1,1,1,2,2,2,2,2,3,
        3,3,3,3,3,3,4,4,4,4,
        4,4,4,4,4,5,5,5,5,5,
        5,5,5,5,5,5,6,6,6,6,
        6,6,6,6,6,6,6,6,6,7,
        7,7,7,7,7,7,7,7,7,7,
        7,7,7,7,8,8,8,8,8,8,
        8,8,8,8,8,8,8,8,8,8,
        8,9,9,9,9,9,9,9,9,9,
        9,9,9,9,9,9,9,9,9,9,
        10
    };
    
    n = 10;
    
    //R START
    int s = 0;   //input
    for (int i = 1; i <= n; i++) {
    //センサー入力する
    s = s + (y[i]=analogRead(G_X)); //センサーの値
    } //for
    o_yl = ((float)s) * 0.0001;
    Serial.printf("%f\n",o_yl);
    ave = s / n;
    Serial.printf("%d\n",ave);

    
    die = 0;
    for(int i = 1;i<=n;i++ ){
        al = (y[i] - ave);
        al = al * al;
        Serial.printf("= %d , %d\n",y[i],al);
        die  = die + al;
    }
    die = die / n;
    if(die > 100) {die = 100;}
    die = i_sqrt[ die ];
    Serial.printf("die = %d\n",die);
    Serial.printf("...\n");

}


void loop() {
  // put your main code here, to run repeatedly:

  delay(300);  //0.3秒待つ

}



```
30分記事＜2025/02/21＞

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

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

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


# 30分アウトプット開始
さて、今日は何かこう。

今日は外部LT会。
あまり勉強はせずに家を出たので特に勉強内容はなし。
（そして乗り換えジョルダンをみて「乗り換えなし一本で、一番早く到着。」で信用し切ったアホをしました。）

初のオフラインでの外部LT会でしたので、登壇をするわけでもなく、しどろもどろ。

正直LT会中に話してもらった内容を覚えてるほど、記憶力が鳥すぎたので、盛大にメモをしたくなった。

「PCを使っていいのかなー。失礼じゃないかなー？」と思い、最初はPC使わないようにしようしてたけど、盛大にPCいじってる方がいたので、全力で自分も使おうと決心。

＜けど打っていて他の人に見られるのやだなとか思って画面を少し閉じてブライングタッチ。笑＞

やっぱり帰ってきたら結構話がすっぽ抜けることが多いからメモしてよかった。（それでもまだまだ浅いけど。）
今日のメモはこんな感じになった。

```
初のLT会。

ワークショップ：
複数のチームをごちゃ混ぜして、何かを作る。
→どんな人？性格？：特徴を捉えてどんなことができる？
　→　 仕事の何に反映できる？


スプリント期間
リリース頻度重視
開発速度重視
この二つを使って期間を長くしたら短くしたりする。

スプリントとは？

学習ペースを自分で考える
・ゴールを示した上絵あるべき姿とは？
・搬送する立場で、教えてもらうことは必要最低限で。

振り返りしようねKPT

ハッカソン

作っていく中でのたくさんの懸賞右作るゴールが会丸

もっと良くする事を考える。

（作っていく中で）
ｒｂ

SPJAM
```

側から見ればなんじゃこりゃぁΣ('◉⌓◉’)ｗｗ

ひとまず、スマホにもメモを書いているが、人に見せるのも恥ずかしくなってくるほどのメモ。
（ほぼブラインドタッチだから許してｗｗ）

コレらの情報は、自分にとって有用か、もしくはわからなかった単語、いろいろとある。

情報をまとめて、自分で活用していければ相当な力になっていくんじゃないかなと思う。

ここまで10分。



```
 - 会社の他のチームとのワークショップ：
 ただただ他のチームとの会話をすればいいわけではない。
→複数のチームをごちゃ混ぜして、何かを作ることによりその人がどんな人？性格か？を特徴を捉えてどんなことができる？と言った「他己評価」を加えることにより、その人の良さ、強みを教えてあげることができる。かつ、その人の強みを活かした仕事を渡すことができるようになったと思われる。
```
→RUNTEQでは自己分析をやろうという話もあるが、他己評価といった内容はやっていない。
　そういったワークショップもやってみるのもありかもしれない。

```
・スプリント期間
リリース頻度重視
開発速度重視
この二つを使って期間を長くしたら短くしたりする。

スプリントとは？
```
→スプリント・・・発表途中に「なんだったっけ。。。」という状態。調べよう。


```
振り返りしようねKPT
```
振り返り・・・
やらねばやられる
エンジニア
（何俳句しとんねん）

振り返り頑張ります。。。そしてKPTやろうねいさみん。

```
ハッカソン

作っていく中でのたくさんの懸賞右作るゴールが会丸

もっと良くする事を考える。

（作っていく中で）
ｒｂ

SPAJAM
```
(SPAJAM)[https://spajam.jp/] <URLの貼り方忘れた。30分で書き方調べる暇ないから許して
温泉地でのアプリ開発イベント（大会）の紹介があった。

（書いていることがはちゃめちゃな気がしてきたーーーー）

その大会で惜しくも優勝とれず、優秀賞をとった方が登壇されており、
その時に思ったことが「作っていく中で、沢山の検証を行ったことによって、ゴールが見えた」
また、作っていく中でもっと良くすることを考えていく

現在、ミニアプリから少しずつ前に進もうとしている所なので、
沢山のミニアプリを作って、より多くの検証をしていくことを第一にやっていこうと思う。

残り5分。意外と時間残った。

ひとまず、やっぱり勉強より実際に実務をやった方がエンジニアとしては強いんだなぁ、と思った１日でもあった。

30分なのだからどうしようと考えたけど、一旦夜遅くなのでここまでとする。

（内容浅い気がしてならないなぁ。。。）

終了〜〜〜
各DBMSのコマンドラインツールの出力(SQL実行結果)をPowerShellで扱う

どうもこんばんは、PowerShellはいいぞおじさんです。
仕事でやりたかったことを元ネタにして

https://qiita.com/noobow/items/25efab18a2836abb668d

この記事を書いたところ、Oracle以外でもできるのか試してみようと思い、主要なDBMSについて調べて実践してみて記事を書きました。
本記事はまとめ記事(リンク集)となります。
なお、Oracle版で流れを詳細に書いており、それがわかっている前提でほかのDBMS版はやや簡略的に書いていますのでご了承ください。Oracle版から読み始めることをお勧めします。

大まかな流れはとしては
1. コマンドラインツールの出力をXMLまたはJSONにする
1. コマンドラインツールの出力が純粋にXMLまたはJSONのみの文字列となるようにする
1. 以上で得られた出力をPowerShellのXML型またはJSON型に変換する

となります。

PowerShellで結果を扱いたいSQLに変更を加えずXMLまたはJSONを得るわけですが、どちらが簡単に出力できるかはDBMSによって違いました。今回、あくまでも元々のSQLをそのまま使えるということを重視しました。SELECT句を書き換えたりするともう少し選択の幅が広がるのですが、元々PowerShellを使わず手動で行っていた作業を自動化したいというのがモチベーションですので、元々使っていたSQLをPowerShellの変数に放り込めばいいようにしたかったらです。
各記事へのリンクとともに掲載します。

|DBMS  |XML/JSON  |記事  |
|---|---|---|
|Oracle  |XML  |[リンク](https://qiita.com/noobow/items/25efab18a2836abb668d)  |
|SQLite  |JSON  |[リンク](https://qiita.com/noobow/items/1eafaed9f1ddf6380741)  |
|MySQL  |XML  |[リンク](https://qiita.com/noobow/items/f472eca0dc483366f023)  |
|PostgreSQL  |JSON  |[リンク](https://qiita.com/noobow/items/450503b9451cca6018c9)  |
|SQL Server  |XML  |[リンク](https://qiita.com/noobow/items/de20fb16ad26eb47b8f8)  |

https://qiita.com/noobow/items/25efab18a2836abb668d

https://qiita.com/noobow/items/1eafaed9f1ddf6380741

https://qiita.com/noobow/items/f472eca0dc483366f023

https://qiita.com/noobow/items/450503b9451cca6018c9

https://qiita.com/noobow/items/de20fb16ad26eb47b8f8
【読書メモ】世界一流エンジニアの思考法

# はじめに

今回、米マイクロソフトでシニアエンジニアとして働かれている牛尾剛さん著の『世界一流エンジニアの思考法』を読みました。

出版直後から人気の本という記憶で、今更感はあるかもしれませんが読んでみました。

感想としては、「めちゃくちゃ読みやすい」「エンジニアじゃなくても学びがある」というところで、読んでよかった本でした！

以降では、私がこの本を読んで思ったことをツラツラとメモ程度に書いていきます。

# 試行錯誤は「悪」

本書では、デバッグする際にとりあえず手を動かして時間を浪費していた筆者だが、同僚エンジニアは「ログ（事実）から仮説を立てて検証するために手を動かす」ということをしており、時間の浪費がなかったというエピソードが書かれています。

自分もちょっとわかるなぁというところがあり、エラーが出た際など「この辺か？」「それともこの辺か？」みたいな感じで手を動かし始めちゃう時があります。

些細なエラーならそれで解決することも多いですが、場合によっては結構時間を浪費した記憶もあります。

しかし、ログというエラー解消のための手がかりがあるのならば、闇雲に手を動かすよりまずはそこを見た方が良いなと改めて感じました。

正直ログを見てもなんのこっちゃの時もありますが、今はChatGPTなどもあるので、前提・理想・現状・エラー内容を送って壁打ちしたら、大体のエラーに対しては解像度を上げられる気がしています。

心強いAIをパートナーにログと向き合うのが近道かなと感じました。

# 理解には時間がかかる

本書では、同僚のスーパーエンジニアでも、コードを読んだり仕様を理解したりするのには時間がかかっているというエピソードがあげられていました。

時間がかかるとはいえ、今の自分とは比にならないとは思いますが、それでもパッと見聞きしてパッと理解している感じではないとのことです。

マイクロソフトで働いているようなスーパーエンジニアでも、時間をかけて丁寧に理解を深める。

ただこれを愚直にやっているそうです。

本書では「『基礎』練習は『誰でもできる』ことだが、習得には『時間がかかる』ものだ」と言っていました。

つまり、「コードも理解には時間がかかるけど、日頃から誰にでもできる基礎を着実に行えばちゃんと理解できるよ」ということだと思います。

マイクロソフトで働いているようなスーパーエンジニアでもこのように仕事と向き合っているので、自分なんかがパッと理解できるわけはないと改めて感じ、最近はより一層「認知不可から逃げない」と仕事に取り組んでいます。

振り返ると、普段一緒に働いている頼れるエンジニア達もその傾向があるなと感じます。

# アメリカで見つけたマインドセット

本書では「優先順位をつける」と聞いた時に、日本では「やるべきことの全てに優先順位をつけて、優先順位の高いものから着手し、基本的には全てに着手する」というイメージだがアメリカでは「最も重要なものをピックアップして、それ以外のものはやらない」というイメージだというエピソードがあげられていました。

そして、「『納期は絶対』の神話は捨てよう」「品質・コスト・納期・スコープはトレードオフにある」「進捗が想定と異なった場合はスコープを出し入れすることが現実的」とも書かれていました。

「何かを得るためには何かを捨てる必要がある」ということだと思いますが、私が経験してきた開発業務でも、ギリギリまで全てを取りにいこうとして参画メンバーが皆疲弊し切ってしまい、プロジェクトとして好ましい雰囲気ではなくなってしまう　みたいなことが何度かあったなぁと感じます。

私は受託開発メインの開発経験なので依頼先の社内事情は分からないことも多いですが、長期的に見たら当初計画より実装機能が少なくなったとしても、実装者がちゃんと考えたコードを反映させて、皆がプロジェクトに前向きな気持ちを継続させた方がメリットが大きい気がしています。

# コードリーディングのコツは極力読まないこと

本書では、コードリーディングに悩む筆者が同僚から「コードリーディングのコツは極力読まないこと。実装はちゃんと動くものとして、ダイヤグラムや関係性のグラフを書いたりしながら、インターフェースと構造を理解するようにする」とアドバイスいただいたエピソードがあげられていました。

現在私も日々のコードレビューの際に実装者の書いたコードを読んでいるのですが、最初は人のコードを読むのに慣れておらず、とても時間がかかっていました（結局今も時間はかかっているのですが）。

主にレビュー相手が未経験スタートのエンジニアが書いたコードなので、正直本項のタイトルのように「極力読まないこと」とはいきません（細かく見ないと変なコードが混ざっていたりするので）笑

一方で、一時期ヘルプで入ってくれていたバリバリできるエンジニアのコードもレビューしていたのですが、その時は本書に倣って「もう細かな実装はできているってことにして、パラメータの受け渡しや関数の役割とかを追っていこう」と思ったら、細かく見ていたそれまでと比べてずっとコードが読みやすかったことを覚えています（ちゃんとおかしな点は指摘しています）。

時と場合によってちゃんと細かくコードを読まないといけない場合もありますが、この考え方はちゃんと自分のものにしたいなと思いました。

# 日米のエンジニアを取り巻く文化の違い
本書では、「日本にとって致命的な足枷になりかねないのが『批判文化』である」とエピソードがあげられています。

まずアメリカでは「アプリケーションはどんなに優秀なチームが開発しようが、必ず何かしらの不具合は存在する」という考えがあり、不具合があったとしても「ここからどうしていくか」という建設的な意見が飛んでくるそうです（コントリビュートする文化）。
そんなアメリカと対比した日本の話として、本書ではコロナ禍にリリースされた接触確認アプリ「COCOA」の例があげられています。「COCOA」はスマートフォンのBluetooth機能を使って、一定時間スマホを持つもの同士が近くにいた場合に、情報を個々の端末に記録するアプリです。
日本マイクロソフトの方が個人的に始めたプロジェクトでしたが、世界各国から理念に共感した方々が開発を手伝ってくださり、非常に短期間でリリースされました。
未曾有の危機の手助けになればと必死に開発そしてリリースされたアプリでしたが、少しの不具合に対してTwitter等で大量の罵詈雑言が飛んできたそうです。皆のためを思って善意で初めて額に汗を流しながら開発を進めたアプリケーションなのに。
このような罵詈雑言を受け、開発者の方々はメンタルをやられてしまったそうです。

不具合があったら解消すれば良いのですが、完璧を求めて少しのミスも許さない批判文化。
決して説教くさく書かれているわけではないのですが、両方の国を経験した筆者からすると、有望なエンジニアは海外企業に行ってしまうのもわかるとのことでした。

勿論ないに越したことはないですが、「不具合が見つかってよかった」くらいの気持ちでいるのが良さそうに感じました。


# おわりに

「はじめに」でも記載しましたが、本書は非常に読みやすい本でした。

また、チームビルディングの話や体調面の話も書かれており、現場で手を動かすエンジニアだけではなくPM等の管理職の方にも読んでほしい本だなと感じました。

読んで損はない一冊です。7章構成なので1日1章、1週間で読めてしまうのでぜひ。
視覚的にGitを学べるサイト

# はじめに
Gitの使い方を丁寧に説明した記事などがたくさんあります。
それと共にGitのコマンドを使って、その動作を視覚的に確認できれば、もっと理解できると思います。
今回は、Gitコマンドを試し、その動作を視覚的に見られるサイトを紹介します。

# Visualizing GIT
http://git-school.github.io/visualizing-git/

https://github.com/git-school/visualizing-git

Gitコマンドの動作をグラフィックで見せるサイトです。

# Learn Git Branching
https://learngitbranching.js.org/

視覚的かつインタラクティブにGitを学ぶことができるサイトです。
Gitの課題に解けながら、段階的にGitを学べることができます。

# おわりに
紹介したサイトで、すべてのGitのコマンドを使えるわけではありませんが、気軽くGitコマンドを試してみて、Gitを学ぶことができそうです。
環境内にある Power Automate のフローをチェックする方法

環境管理者、グローバル管理者（システム管理者）、または Power Platform 管理者は、テナントで作成されたフローをチェックできる。

Power Platform 管理センターの画面左上にある「環境」メニューから環境に入り、リソース欄にある「フロー」からチェックできる。

![スクリーンショット 2025-02-20 234713.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/38f1fe10-347f-429c-8631-c8e6cce4a777.png)

リソースの「フロー」をクリックして開いた画面に「さらに読み込む」ボタンが表示されていたら、それは要クリック。

![スクリーンショット 2025-02-20 235158.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/c13b2b29-2297-4134-afeb-823d1d3c8fa5.png)

フローが非ソリューションの場合、フローの編集画面を開くためには所有者になる必要があるが、ここで自分または環境内の他ユーザーを所有者に組み込める

情報がやや古い気がするけど、公開情報がある。

https://learn.microsoft.com/ja-jp/power-platform/admin/manage-power-automate
【Docker】docker compose logsの使い方

## `docker compose logs`とは

`docker compose logs`は、Docker Composeで管理しているサービスのログを表示するためのコマンドです。これにより、各サービスが生成する出力を確認できます。

## 使い方

### 全サービスのログを確認する

以下のコマンドで全てのサービスのログを表示できます。

```bash
docker compose logs
```

### 指定した行数のみ表示する

`--tail`オプションで最後の数行だけを表示することも可能です。
以下の場合には最後の50行のみ表示されます。

```bash
docker compose logs --tail=50
```

### 特定のサービスのログを確認する

特定のサービス名を指定して、そのサービスのログのみを表示する場合は、以下のようにサービス名を追加します。

```bash
docker compose logs <サービス名>
```

以下の場合には`web`サービスのログが確認できます。

```bash
docker compose logs web
```

## ログの追跡モード

ログをリアルタイムで追跡したい場合は、`--follow`オプションを利用します。これにより、新たに生成されたログをリアルタイムで表示できます。

```bash
docker compose logs --follow
```

また、特定のサービスに対して追跡を行う場合も同様です。

```bash
docker compose logs --follow web
```

### タイムスタンプの表示

ログにタイムスタンプを付与して出力するには、`--timestamps`オプションを使用します。

```bash
docker compose logs --timestamps
```

## 参考

https://docs.docker.com/reference/cli/docker/compose/logs/
【kintone】Chobiit（外部公開）フォームから入力され、レコードが追加されたときの通知をメールで受け取りたい

# はじめに
こんにちは！ノベルワークスの[つつみん](https://x.com/tsutsumin_38)です！
今回は、「Chobiitの外部公開で、フォームから入力され、レコードが追加されたときの通知をメールで受け取る方法」について書いていこうと思います。

# どんな人向けの記事か
Chobiitの外部公開で、フォームから入力され、レコードが追加されたときの通知をメールで受け取りたい方

# 前提

- 問い合わせアプリにChobiitの外部公開機能を設定している。
- 「担当者」（メールでの通知を受け取りたいユーザー）は、kintoneの個人設定で、メールの通知を以下のように設定している
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/64b156e2-7c02-4aba-827d-b80cace472dd.png">


# 要望
- Chobiitの外部公開機能によってフォームから入力され、問い合わせアプリにレコードが追加されたときに、「担当者」にメールで通知をとばしたい
## 検証
### 操作
- アプリの条件通知で以下のように設定する

![2025-02-19_23h08_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/0c6ec80d-3f5a-4c4d-a3b7-365a5b7c777b.png)

- フォームを入力し、問い合わせアプリにレコードが追加されたことを確認

### 結果
問い合わせアプリにレコードが追加されているのに「担当者」に通知されない

### 理由
Chobiitのフォーム入力によるレコード追加は、REST APIの呼び出しで実行された操作であるため、通知されない

### 解決方法

#### kintoneシステム管理の利用する機能の選択で、REST APIの通知をメールで送信にチェックをいれる
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/5b68e4fe-7989-44dc-8fd1-eaf7257638a0.png">

:::note warn
注意
注意事項にもありますが、このチェックを有効にすると、REST APIの呼び出しで実行された操作もメール通知されます。REST APIを使ってデータの追加や更新を自動化している場合、大量のメール送信に注意してください。

:::


この設定をすると以下のように通知された！
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/2a4ff612-6dce-4f8b-a0de-2065f3cb85fd.png">

しかし、これでは、「すべて」の通知なので、ベルマークに件数が付かないし、メールが届かない:disappointed_relieved:！！！

「すべて」の通知ではなく「自分宛」の通知にしたい！

以下の記事を参考に「すべて」から「自分宛」の通知になるように設定。

https://qiita.com/Banchan_k12/items/b159bf517bed2f5d5ff1

#### 「すべて」の通知ではなく「自分宛」の通知に設定する
- フォームの設定で、ユーザー選択フィールド追加　初期値に「担当者」を設定
![2025-02-19_23h54_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/e161f199-14ef-4df4-949d-53f1245c2a6c.png)


- アプリの条件通知で以下のように設定

![2025-02-19_23h55_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/74226f7d-d5cb-4314-b91f-5e190df9af72.png)

これらの設定をすると、「自分宛」の通知になったので
ベルマークに件数が表示され、メールも届く！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/c06a9b27-11a3-433a-949a-17d84e709582.png)

解決！
Chobiitの外部公開で、フォームから入力され、レコードが追加されたときの通知をメールで受け取ることができる！

# まとめ
今回は、「Chobiitの外部公開で、フォームから入力され、レコードが追加されたときの通知をメールで受け取る方法」についてまとめました！ポイントは、kintoneシステム管理の利用する機能の選択で、REST APIの通知をメールで送信にチェックをいれること、レコード追加の際の通知を自分宛にすることです！
たまにしか入ってこないお問い合わせにkintoneを開くことなく、メールで気づきたい方、ぜひ試してみてください！
レンタルサーバでcoesiteレポジトリを使用する

# はじめに
[こちらの記事](https://qiita.com/k96mz/items/5847b68d89e5b832f525)ではレンタルサーバでcoesiteレポジトリを使用してベクトルタイルをホスティングしました。リバースプロキシを使用していましたが、ふとリバースプロキシを使用しないパターンでは適切に認証出来るのか気になり試してみました。

# コードの設定をする
まずは[こちらのcoesiteのコード](https://github.com/un-vector-tile-toolkit/coesite)をクローンしてきます。

### default.hjsonの一部を修正
```
 privkeyPath: ./key/privkey.pem
 fullchainPath: ./key/cert.pem
 port: 3000
 tz:{
  naturalEarth: 6
  produce-gsc-un: 6
 }
 sTileName:{
  naturalEarth: 0-0-0naturalEarth
  produce-gsc-un: 6-35-31
 }
```

### .envの設定
OAUTH_REDIRECT_URI=https://k96mz.com:3000/auth/callback
とします。

Entra IDにも上記URLをRedirect URIsとして登録しておきます。

### keyフォルダ
keyフォルダを作成し、その中にcert.pemとprivkey.pemを格納します。

### ファイルの追加等
[こちらの編集されたcoesiteレポジトリ](https://github.com/k96mz/coesite/blob/main/views/index.hbs)の以下のコードをコピーして持ってきます。

- views/index.hbs
- public/map以下の６つのファイル

そして、
naturalEarth.json
などのベクトルタイルのURLの設定を以下の通りとします。

「k96mz.com」から「k96mz.com:3000」に変更し、さらに、
「vtile-open」から「vtile-m」に修正します。






# 認証を試してみる
node app.jsとして
https://k96mz.com:3000/
としてみましたが、以下のエラーが発生しました。
(failed)net::ERR_HTTP2_PROTOCOL_ERROR	

![スクリーンショット 2025-02-19 14.16.00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/43c7f743-3ad3-4d6f-ad2e-c0631f31bac0.jpeg)

[こちらの記事](https://qiita.com/k96mz/items/6e80215e1b50f752248f#routesindexjs)のように、routes/index.jsを変更してみます。

そうすると、うまくいきました。

![スクリーンショット 2025-02-19 14.39.23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/ceb63444-b44b-4943-a6aa-1b0daa47b295.jpeg)

その後の認証もうまくいきました。

![スクリーンショット 2025-02-19 15.07.37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/64a84e0d-e54e-46dd-947c-bc7839242b9d.jpeg)


map/naturalEarth.html
をクリックしてみてみると、以下のようなエラーがやはり発生しました。
(failed)net::ERR_HTTP2_PROTOCOL_ERROR	

![スクリーンショット 2025-02-19 15.12.28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/0ce2b217-e4ab-49f1-bfad-e30545db57de.jpeg)

# まとめ
リバースプロキシを使用せずに、レンタルサーバでcoesiteレポジトリを使用してベクトルタイルをホスティングしました。
routes/index.jsを変更すると、Entra IDの認証がうまくいくことが分かりましたが、リバースプロキシを使用すると変更せずにうまくいったりするので、結局謎のままです。
また、リバースプロキシを使用しないと、やはり「(failed)net::ERR_HTTP2_PROTOCOL_ERROR」というエラーが発生することが確かめられました。

# Reference
https://qiita.com/k96mz/items/5847b68d89e5b832f525

https://github.com/un-vector-tile-toolkit/coesite

https://github.com/k96mz/coesite

https://qiita.com/k96mz/items/6e80215e1b50f752248f

https://qiita.com/k96mz/items/ba983b4d34e94aafa4c2
AWS VPCネットワーク-パブリック構成

# はじめに
VPCネットワーク構成を組んで通信の流れを書いていく。
今回は、シンプルにパブリック構成。

## やること・やらないこと
  - やること  
    VPC-EC2インスタンスのパプリック構成の作成とネットワーク周りの設定 
    
    構成要件
    - インターネットからEC2にHTTP通信でのアクセスが可能なこと
    - ルートテーブル、セキュリティグループの設定値と通信の流れを図にする
    - 最終的に、EC2に対して作業PCから「curl」コマンドなどでHTTP 80でアクセスするまでの設定を行う  

  - やらないこと  
    コンソール操作の手順の記載（UIがコロコロ変わるため）  
    各サービスの細かい解説（EC2とは、VPCとは）とか  
    EC2接続のSGなどの設定

# 構成図

![no1_pulic-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994667/e3978a4f-54bc-6ad1-38ca-fbde48f72528.png)

VPCを作成し、そのVPCにサブネットを作成  
その後、インターネットゲートウェイ（以後IGW）を作成してアタッチ

### 設定値
<!-- <img width="50" src="001-aws-network/img/no1_pulic-2.png"> -->
VPCとサブネット1:1なのでデフォルトルートテーブルにそのまま書いてもいいのですが、どうせなら専用のものを作ります


構成図の下部　セキュリティグループ、ルートテーブルついての解説
  - セキュリティグループ  
    EC2インスタンスにアタッチ  
    インバウンドルールにて構成図下部に記載の通り、作業端末IPからのHTTP(80)通信を許可  
    アウトバウンドはデフォルトのため記載を省略  

  - ルートテーブル  
    パブリックサブネットに関連付け  
  
    ルールは上から
    - IGWからのIPv4通信のルート
    - IGWからのIPv6通信のルート
    - デフォルトルート

これでインターネットから、パブリックサブネットに配置したサービスにアクセスが可能になります

# ネットワークルート
![no1_pulic-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994667/c270906f-768f-19ed-5532-8f5117d3d27e.png)

1. 作業用PCからEC2インスタンスのIP（EIPまたはIPv6）に向けてHTTP通信を行う  
作業用PC-インターネット-VPC.IGW-EC2
2. 戻りのルートは1の逆
EC2-VPC.IGW-インターネット-作業用PC

# 今回作成した成果物
terraformとCloudFormationスタックとして作成
それぞれのGitリンクを貼り付け  
IPv4、IPv6それぞれで作っていますが、お金がかかるEC2インスタンス、EIPは入れておりません  

### terraform　
- [IPv4](https://github.com/lamne-kiba-gaeru/aws-network/blob/main/001-aws-network/trraform-ipv4/main.tf)
- [IPv6(デュアルスタック)](https://github.com/lamne-kiba-gaeru/aws-network/blob/main/001-aws-network/trraform-ipv6/main.tf)

### Cloudformation
- [IPv4](https://github.com/lamne-kiba-gaeru/aws-network/blob/main/001-aws-network/cloudformation-ipv4/ipv4-cfn-template.yaml)
- [IPv6(デュアルスタック)](https://github.com/lamne-kiba-gaeru/aws-network/blob/main/001-aws-network/cloudformation-ipv6/ipv6-cfn-template.yaml)
未経験からフロントエンドを目指す

引き続き、プロゲートによる学習でHTMLとCSSの初級編について学びました。
今日の学習内容は、HTMLではリストの作成、親要素、ご要素の理解を学習しました。
CSSでは、文字の色の変更、文字の大きさ、種類について学びました。
【React】ルーティング設定が正しいのにコンポーネントが表示されない

# 状況

https://www.udemy.com/course/react_stepup/

上記の教材での学習中、画面遷移のためにReact Router v6を使用してルーティング設定を行ったところ、/usersにてHeaderOnlyを含む全てのコンポーネントが表示されない状態になった。

```react:Router.jsx
import { BrowserRouter, Routes, Route } from "react-router-dom";
import { Top } from "../components/pages/Top";
import { Users } from "../components/pages/Users";
import { DefaultLayout } from "../components/templates/DefaultLayout";
import HeaderOnly from "../components/templates/HeaderOnly";

export const Router = () => {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<DefaultLayout />}>
          <Route index element={<Top />} />
        </Route>
        <Route path="/users" element={<HeaderOnly />}>
          <Route index element={<Users />} />
        </Route>
      </Routes>
    </BrowserRouter>
  );
};
```

# 原因・解決

既に気付いている人はいると思いますが、HeaderOnlyコンポーネントをnamed exportしていたのに括弧を忘れていました。

```diff_javascript:Router.jsx
import { BrowserRouter, Routes, Route } from "react-router-dom";
import { Top } from "../components/pages/Top";
import { Users } from "../components/pages/Users";
import { DefaultLayout } from "../components/templates/DefaultLayout";
- import HeaderOnly from "../components/templates/HeaderOnly";
+ import { HeaderOnly } from "../components/templates/HeaderOnly";


export const Router = () => {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<DefaultLayout />}>
          <Route index element={<Top />} />
        </Route>
        <Route path="/users" element={<HeaderOnly />}>
          <Route index element={<Users />} />
        </Route>
      </Routes>
    </BrowserRouter>
  );
};
```

このとき、なぜかCodeSandBoxの自動インポートが効かなくなっており、インポート文を手入力したのが徒となりました。

ちゃんとエラーも出ていたのですが、括弧なしでも大丈夫だと勘違いしており、スルーしてしまいました。
![そのとき表示されていたエラーメッセージ（再現）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941608/981fa7f6-23ec-732b-0c80-485633375bfb.png)

## 教訓
- （特に初学者のうちは）エラーメッセージが出たら素直な気持ちかつダメ元で対処すべし
OpenCV インポートエラー

## OpenCV インポートエラーメモ
```
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
```

- GUIを使わない場合は`opencv-python-headless`を使用すると`libGL.so.1`に依存しない
```bash
pip uninstall opencv-python
pip install opencv-python-headless
```

```bash
python
>>>import cv2
>>>
```

- スタンダードな解決方法
```bash
sudo apt update
sudo apt install -y libgl1-mesa-glx
# apt-get install -y libglib2.0-0 libsm6 libxrender1 libxext6
```
【AWS】ECS Fargateコンテナの中に入る方法と注意点2点

# 概要
ECS Fargateのコンテナ（タスク）に入る方法およびそれに伴う注意点を紹介します。

# 注意点
注意点は２点あります。

１点目は、ECSタスクロールに、SSMアクセス関連のポリシーをアタッチすること。ECSコンテナへの接続の際に「SSMセッションマネージャー」を使用するためです。

私が作成したECSのIAM Roleは以下です。ご参考までに。

```yaml
EcsRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: "Allow"
            Principal:
              Service:
                - "ec2.amazonaws.com"
                - "ecs.amazonaws.com"
                - "ecs-tasks.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      RoleName: EcsRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess
        - arn:aws:iam::aws:policy/AmazonECS_FullAccess
        ## - arn:aws:iam::aws:policy/etc...
      Policies:
        - PolicyName: SSMCommunicationsPolicy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: "Allow"
                Action:
                  - "ssmmessages:CreateControlChannel"
                  - "ssmmessages:CreateDataChannel"
                  - "ssmmessages:OpenControlChannel"
                  - "ssmmessages:OpenDataChannel"
                Resource: "*"
```

２点目は、`--enable-execute-command`フラグを`True`にしておくことです。
以下のCLIコマンドで可能です（CLIの設定がまだの場合は、AWS Cloudshellから実行するのが一番早いと思います）。

```
$ aws ecs update-service --cluster <クラスター名> --service <サービス名> --enable-execute-command
```

ただし、現在起動中のECSコンテナには適用されません。
有効になるのは、作り直されたECSからですので、すぐコンテナにアクセスしたい場合は再起動が必要です。

# Fargateコンテナの中に入るCLIコマンド
- ECS -> Service -> Task へ進み、稼働中のコンテナのIDをコピーする
- AWS Cloudshellへアクセスし、以下のコマンド(ECS Exec)を実行
    - `cluster`や`container`はそれぞれECSクラスタ名やコンテナ名を入れる
    - `--task`は上記でコピーしたコンテナIDを貼り付ける

```
aws ecs execute-command  \
    --region ap-northeast-1 \
    --cluster <クラスター名> \
    --task <コンテナID>\
    --container <コンテナ名> \
    --command "/bin/bash" \
    --interactive
```

これで実行中のコンテナの中にはいることができました。
以上です！

## AWS doc
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-exec.html
【電脳少女プログラミング2088 ─壊レタ君を再構築─】B：ギャングのアジト

# 目的
[電脳少女プログラミング2088 ─壊レタ君を再構築─](https://ppg.paiza.jp/denno2088)の問題「ギャングのアジト」をC++で解いたのでその解説を行う。

読者の方へ、
他の考え方をして解いた方は教えていただきたいです。

# コード
```c++
#include <iostream>
#include <vector>

using namespace std;

int main(void){
    // 入力
    int n;
    cin >> n;
    vector<vector<int>> b(n,vector<int>(n));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) cin >> b[i][j];
    }

    // 縦横半分だけ調べて、都度反対と同じかを確認する
    // i:縦方向, j:横方向
    for (int i = 0; i < n/2; ++i) {
        for (int j = 0; j < n/2; ++j) {
            // 左右対称の確認
            // 対象でない場合、"No"を出力してreturnする
            if (b[i][j] != b[i][n-1-j]) {
                cout << "No" << endl;
                return 0;
            }
        }
    }
    
    cout << "Yes" << endl;
    return 0;
}
```

# 計算量
上記コードの計算量は二重forループなのでO((n/2)^2)となる。
入力Nの条件が***1 ≤ N ≤ 50***なので10^3くらい？になる。
今回、実行時間は問われていないので関係ないが、一応考慮してみた。