OmniAICreator/Qiita-1.07M huggingface dataset:
effect-tsでHttp-Api

HTTP Server の ページがあることに気づいたので、記載している内容が動くところまで

# 参考

https://github.com/Effect-TS/effect/blob/main/packages/platform/README.md#http-api

# 書いてあるものをそのまままとめたもの

https://github.com/m-n-h/test-effect-http-server

1. npm i を実行する
1. npx tsx src/index.ts を実行する
1. http://localhost:3000/docs にアクセスする
1. api を試しに実行する ( /user/{id} )

まで動作確認した


## サーバー

* docsへのアクセスログ
* api /user/123 の実行　＝＞　成功
* api /user/aaa の実行　＝＞　失敗

```ts
> node-server@1.0.0 server-dev
> npx tsx src/index.ts

Debugger attached.
Debugger attached.
Debugger attached.
[01:15:33.363] INFO (#1): creating Logger middleware
[01:15:33.481] INFO (#1): Listening on http://0.0.0.0:3000
[01:15:42.576] INFO (#23) http.span.1=31ms: Sent HTTP response
  http.status: 200
  http.method: GET
  http.url: /docs
[01:15:49.381] INFO (#24) http.span.2=5ms: Sent HTTP response
  http.status: 200
  http.method: GET
  http.url: /user/123
[01:15:57.570] INFO (#25) http.span.3=13ms: Sent HTTP response
  http.status: 400
  http.method: GET
  http.url: /user/aaa
```


## Swaggerのページ

* api の実行ができる
* api の成功や失敗時のステータスコードや戻り値の確認ができる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3751407/e83863fd-d06d-4626-b91e-1e14f4ebd5c9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3751407/7d5fd54b-a9dc-4f9a-bd70-09254238c5fd.png)


## ソースで気になったところ

```ts
const usersGroup = HttpApiGroup.make("users").add(
  HttpApiEndpoint.get("getUser")`/user/${idParam}`.addSuccess(User)
)
```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Template_literals#%E3%82%BF%E3%82%B0%E4%BB%98%E3%81%8D%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88

おそらくタグ付きテンプレートを使用して、関数の簡素化を実現している


## サーバー側の記述がどうなるか？

https://github.com/m-n-h/test-effect-http-server/blob/master/src/api/get_user.ts

https://github.com/m-n-h/test-effect-http-server/blob/master/src/service/service_user_repository.ts

api の処理を記述している get_user.ts については サービスの呼び出しだけになり、サービスが変わった時だけ書き換えることになるためシンプルになる

api の実際の処理を担当している service_user_repository.ts については、モックの状態と実際のDBの状態などへの書き換えやテスト処理などを記述しないといけない。サンプルではここらへんの記述がなかったため、今後これらを調査するが、ここらへんもサービスの見える範囲だけ記述すればよいと思うため、シンプルになりそうではある。
shadcn/ui をインストールする方法（React・JavaScript・Vite）

## 1. 背景

Reactを利用してフロントエンドの開発をすることを決め、開発効率を上げるライブラリーについて調べていたところ、Tailwindcssをベースに作られたUIコンポーネント **shadcn/ui**（シャドシーエヌ・ユーアイ）に出会いました。shadcn/ui の公式ドキュメントに従いインストールを進めようと試みましたが、ドキュメントにはTypeScriptのプロジェクトが前提で記されていまいした。私と同様にReactで shadcn/ui を利用したいという方に向けて、JavaScriptの環境下でのインストール方法について調べて分かった方法を以下に記します。
※ 以下の手順は、Vite+React のプロジェクトが既に出来上がっていることを前提にしております。

## 2. 導入手順

### 2.1. Tailwind CSS をインスール

ターミナルを立ち上げ、以下のコマンドを実行して Tailwind CSS をインストールします。

```bash:bash
yarn add tailwindcss @tailwindcss/vite
```

### 2.2. index.css を編集

index.cssの内容を全て削除し、以下に置き換えます。

```css:index.css
@import "tailwindcss";
```

### 2.3. jsconfig.json を作成

プロジェクトフォルダの直下に`jsconfig.json`を**作成して**、以下の様に記述します。

```json:jsconfig.json
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  },
  "include": ["src"]
}
```

### 2.4. vite.config.js を編集

vite.config.js を編集する前に、以下のコマンドを実行します。

```bash:bash
yarn add -D @types/node
```

vite.config.js を以下に置き換えます。

```javascript:vite.config.js
import path from "path"
import tailwindcss from "@tailwindcss/vite"
import react from "@vitejs/plugin-react"
import { defineConfig } from "vite"

// https://vite.dev/config/
export default defineConfig({
  plugins: [react(), tailwindcss()],
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "./src"),
    },
  },
})
```

### 2.5. CLIの実行

以下のコマンドを実行して、shadcnプロジェクトをセットアップします。実行するとベースカラーを尋ねられるので、適切なものを選択します。
※ 特にこだわりのない人は`Neutural` を選択

```bash:bash
npx shadcn@latest init
```

### 2.6. コンポーネントの追加

使用するUIコンポーネントを追加します。以後、必要なコンポネントがあれば [shadcn/ui のドキュメント](https://www.shadcn.net/ja/docs/components/accordion)からコマンドを参照して追加します。
※ ここでは、`Button`のコンポーネントを追加します。

```bash:bash
npx shadcn@latest add button
```

```tsx:src/App.tsx
import { Button } from "@/components/ui/button"
 
function App() {
  return (
    <div className="flex flex-col items-center justify-center min-h-svh">
      <Button>Click me</Button>
    </div>
  )
}
 
export default App
```

上記のようにAppファイルを書き換えると、以下の様に追加したボタンが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760542/52b3a266-7eda-4192-9265-7f8b15a0b797.png)

## 3. 参考文献
- 【shadcn/ui】Install and configure shadcn/ui for Vite.（2025/05/18）
[https://ui.shadcn.com/docs/installation/vite](https://ui.shadcn.com/docs/installation/vite)

- 【Youtube】React、Javascript、Vite を使用して Shadcn UI をインストールする方法 | 2025（2025/05/18）
[https://www.youtube.com/watch?v=aMX_DYK5LAk](https://www.youtube.com/watch?v=aMX_DYK5LAk)
AWS Cloud Quest ソリューションアーキテクトをクリアした感想

こんにちは、以前クラウドプラクティショナーをクリアして
今回はソリューションアーキテクトに挑戦してクリアすることができたので、
その感想を書いていきたいと思います！

![スクリーンショット 2025-05-17 184348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194659/49741346-f754-4e29-a979-61511ffe5a40.png)

[1.Cloud_Questとは](#1-Cloud_Questとは)
[2.ソリューションアーキテクトって何を学ぶの](#2-ソリューションアーキテクトって何を学ぶの)
[3.クリアした感想](#3-クリアした感想)

# 1. Cloud_Questとは

https://aws.amazon.com/jp/training/digital/aws-cloud-quest/

システム課題に困ってる人（NPC）にAWSを使って解決していくゲームです。
課題に挑戦する際は、下記の順番に進んでいきます
①解決に使う機能の説明
②ハンズオンチュートリアル
③DIY（自身で課題解決を行う）

一部英語表記の部分もありますが、日本語対応しています。

# 2. ソリューションアーキテクトって何を学ぶの
サーバーレス基盤やセキュリティ、生成AIなど様々な機能をハンズオンで学ぶことができます。
覚えてる限りの機能は下記
・S3
・EC2
・Lambda
・API Gateway、VPC
・RDS、DynamoDB、EFS、SQS、SNS、Athena
・Docker、ECS、ECR
・ALB、CloudWatch、IAM
・Data Firehose、Glue、
・CDK、Amazon Q

# 3. クリアした感想
幅広く機能の０→１を実践的に学ぶことができました。
完璧に理解、というわけには行きませんでしたが、
こういった課題で使う機能は、この辺りを調査してみるといい…といった
抽象的な発想が少しはできるようになりました。

今まで資格取得だけで画面操作の経験はなかったので、資格で得た知識を踏まえて
より深くAWSについて理解することができるようになった気がします。

アーキテクトは有料会員にならないとプレイできませんが、
他の教材でたまにある、バージョンが古くて詰むといったことがなかったので
課金して正解だったなと思います。

ハンズオン学習でどの教材を使うか悩んでいる方は
一度Cloud Questを触ってみてほしいです。終わり。
Atcoder解いてみた ARC 096 C - Half and Half

# ARC 096 C - Half and Half 解いてみた
問題は[こちら](https://atcoder.jp/contests/arc096/tasks/arc096_a)

# 最初のコード  
```C++
#include <iostream>
#include <map>
#include <algorithm>
#include <vector>
#include <cmath>

using namespace std;

int main() {
    int A, B, C, X, Y;

    cin >> A;
    cin >> B;
    cin >> C;
    cin >> X;
    cin >> Y;

    // A, Bピザの枚数で全探索し、最小金額を求める
    // ABピザを買うことによって、必要な量を超えることはよい
    // → ABピザを買う枚数は、A,Bピザの枚数を元に算出可能

    // A, Bピザの枚数はそれぞれ、X,Y以下
    int value = 2147483647;

    for (int x = 0; x <= X; x++) { // Aの枚数の探索
        for (int y = 0; y <= Y; y++) { // Bの枚数の探索
            // ABピザの枚数を算出(ABは偶数枚)
            int diffX = X - x;
            int diffY = Y - y;
            int diffMax = max(diffX, diffY);
            int numAB = diffMax * 2; // ABピザの枚数

            int tmpValue = A * x + B * y + C * numAB;

            if (tmpValue <= value) {
                value = tmpValue;
            }
        }
    }

    std::cout << value << std::endl;


    return 0;
}
```  
結果はTLE  
模範回答を見て、ABピザの枚数で探索することで、ループを削れることが分かった  

# 修正後のコード
```C++
#include <iostream>
#include <map>
#include <algorithm>
#include <vector>
#include <cmath>

using namespace std;

int main() {
    int A, B, C, X, Y;

    cin >> A;
    cin >> B;
    cin >> C;
    cin >> X;
    cin >> Y;

    int numABMax = 200000;
    int value = 2147483647;

    for (int i = 0; i <= numABMax/2; i ++) {
        int numAB = i*2;

        // ABピザの倍数は2の倍数
        // ABピザが2枚あると、A,Bピザそれぞれ1枚ずつになることを考慮して、A,Bピザの枚数を求める
        int numX = max(X-i,0);
        int numY = max(Y-i,0);

        // A,Bのピザが用意すべき枚数以上ある
        if (i + numX >= X && i + numY >= Y) {
            int tmpVal = A*numX + B*numY + C*numAB;
            if (value >= tmpVal) {
                value = tmpVal;
            }
        }
    }

    std::cout << value << std::endl;


    return 0;
}
```
MongoDB移行時ノウハウ

RustやRustRoverを更新する際に、以前写経したMongoDBにアクセスするコードを検証に使用している
このMongoDBも時折最新化しており、それまでの8.0.4は、バージョンアップ前の7.3と互換性があった

しかし、今回、8.1.0にバージョンアップしたところ、起動できませんでした
ここでは、Geminiに確認したところ、メッセージやログを確認する必要があるとのこと

メッセージでは、起動する際のメッセージだけだったので、ログをプロンプトへ
そうすると、格納形式が8.0でないため、起動できないと判明

早速、Geminiに格納形式の移行方法を確認
前のバージョンへ戻したうえで、mongoshで形式を変更するとのこと
mongoDBには、各種ユーティリティが別途配布されているので、インストールする

インストールした"mongosh"は、VSCodeのMongoDB拡張機能から起動できるので、インストール後起動してみる
mongoshを起動後、下記を実行する

```js
db.adminCommand({ setFeatureCompatibilityVersion: "8.0" })
```

ただ、一旦移行すると、戻すことができないため、下記に変更して実行するように指示される

```js
db.adminCommand({ setFeatureCompatibilityVersion: "8.0", confirm: true })
```

これで晴れて、格納形式が"8.0"に変更できたので、再度、8.1.0にバージョンアップし、起動することができました。

今後、格納形式が変更されるのかを確認してからバージョンアップしていきます。
🔐【Docker】DOCKER_CONTENT_TRUST とは？

## ✅ はじめに
Docker でイメージの push/pull を行う際、以下のようなエラーに遭遇したことはありませんか？

```
Error: remote trust data does not exist for docker image
```

こんな時、よく見かける解決法として 
**export DOCKER_CONTENT_TRUST=0** を実行すると解決したりします。

:::note warn
#### ですが・・・
「この環境変数、何をしてるの？」
「無効化して大丈夫？」
「安全性はどうなの？」
:::

と疑問を持った方も多いのではないでしょうか。

Docker における Content Trust（DCT） の概要と、
それを制御する環境変数 **DOCKER_CONTENT_TRUST** の
仕組み・使い方・注意点について詳しく解説します。

## 🧠 DOCKER_CONTENT_TRUST とは？
DOCKER_CONTENT_TRUST（以下DCT）は、
Docker におけるイメージの「信頼性の保証（署名）」を有効・無効にする環境変数です。

Docker は Notary という仕組みを利用して、
イメージに署名をつけて 真正性（本物であること）や改ざん防止 を保証します。

<table>
  <thead>
    <tr>
      <th>設定値</th> <th>挙動の意味</th>
    </tr>
  </thead>
  <tr>
    <td> DOCKER_CONTENT_TRUST=1（デフォルト） </td> <td>pull/push 時に署名を必須にする（安全だが厳密）</td>
  </tr>
  <tr>
    <td> DOCKER_CONTENT_TRUST=0 </td> <td>署名なしでも pull/push 可能（柔軟だが検証なし）</td>
  </tr>
</table>

## 📦 署名が求められるシチュエーション
公開レジストリ（Docker Hub など）で、
署名が必要なイメージに対して pull しようとした場合を例に取ります。

署名付きで push しようとしたが、Notary にメタデータが存在しない場合
DCTが有効であれば、エラーになります。

## 🛠 実例：DOCKER_CONTENT_TRUST=0 を使った回避
例えばECR にコンテナイメージを push する場合、
署名不要で push したいケースがあります。

```bash
export DOCKER_CONTENT_TRUST=0
docker build -t my-ecr-repo:latest .
docker push my-ecr-repo:latest
```

:::note info
CI/CD や開発環境などでは、
毎回署名を付けずに push したい場合に有効です！
:::

## ⚠️ セキュリティ上の注意点
DOCKER_CONTENT_TRUST=0 を使うことで、
署名チェックが完全に無効化されるため、以下のリスクがあります。


<table>
  <thead>
    <tr>
      <th>リスク</th> <th>内容</th>
    </tr>
  </thead>
  <tr>
    <td> 改ざんの検知不可 </td> <td>pull したイメージが改ざんされていても検出できない</td>
  </tr>
  <tr>
    <td> なりすましや供給元の不明確 </td> <td>誰が作成したイメージか確認できない</td>
  </tr>
  <tr>
    <td> セキュリティポリシー違反 </td> <td>企業によっては署名必須のポリシーがあることも</td>
  </tr>
</table>


### ✅ ベストプラクティス
<table>
  <thead>
    <tr>
      <th>シーン</th> <th>推奨設定</th>
    </tr>
  </thead>
  <tr>
    <td> 本番環境の pull </td> <td>DOCKER_CONTENT_TRUST=1 を使用</td>
  </tr>
  <tr>
    <td> ローカル開発・CI/CD </td> <td>DOCKER_CONTENT_TRUST=0 を一時的に使用</td>
  </tr>
</table>

## 👩‍💻 CI/CD での利用例（GitHub Actions）
```yaml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Build and Push Docker Image without signing
        run: |
          export DOCKER_CONTENT_TRUST=0
          docker build -t ${{ secrets.ECR_URI }}:latest .
          docker push ${{ secrets.ECR_URI }}:latest
```

## 📝 まとめ
- **DOCKER_CONTENT_TRUST** は Docker の署名チェックを有効/無効にする環境変数
- 「=0」 にすると柔軟に push/pull できるが、セキュリティチェックを無効化するため注意
- 開発環境や CI/CD では有効だが、本番では署名チェックを有効にすべき

## 📚 参考リンク
- Docker公式ドキュメント - Content Trust
- Notary GitHub

## 🙌 最後に
「エラーが出たから仕方なく export DOCKER_CONTENT_TRUST=0 を書いてる…」という方に、
その意味とリスク、適切な使い方が伝われば嬉しいです！
Python の traceback で例外発生時の情報を取得

Python の traceback で例外発生時の情報を取得する方法のメモ。

# プログラム
以下で traceback で取得できる情報を確認する。

```python:traceback.py
import traceback


def func():
    print(f"func(): begin")
    raise "error"
    print(f"func(): end")


def main():
    print(f"main(): start")
    try:
        func()
    except Exception as e:
        print("\ntraceback.format_exception()")
        print(traceback.format_exception(e))

        print("\ntraceback.format_stack()")
        print(traceback.format_stack())

        print("\ntraceback.extract_tb(e.__traceback__)")
        print(traceback.extract_tb(e.__traceback__))

        print("\ne.__traceback__")
        print(e.__traceback__)

    print(f"main(): end")
    return 0


if __name__ == "__main__":
    res = main()
    exit(res)
```

# 実行結果

## traceback.format_exception()
```python:
['Traceback (most recent call last):\n', '  File "/.../traceback.py", line 18, in main\n    func()\n', '  File "/.../traceback.py", line 11, in func\n    raise "error"\n', 'TypeError: exceptions must derive from BaseException\n']
```


## traceback.format_stack()
```
python:
['  File "/.../traceback.py", line 37, in <module>\n    res = main()\n', '  File "/.../traceback.py", line 24, in main\n    print(traceback.format_stack())\n']
```


## traceback.extract_tb(e.__traceback__)
```python:
['  File "/.../traceback.py", line 37, in <module>\n    res = main()\n', '  File "/.../traceback.py", line 24, in main\n    print(traceback.format_stack())\n']
```


## e.__traceback__
```python:
<traceback object at 0x7fbf1770b740>
```
【SharePointLists】列は列名を英数字で作成してから日本語に変えるほうがいい

職場環境の画面キャプチャは掲載できないため文字が多くなります。ご容赦ください。

## 困ったこと
フローやアプリなどでSharePointリストの列を関数などで操作するときに、日本語列名だと「OData__98tu__・・・」という、長くてぱっと見では何の列かわからない列名にしなければならない。
「リストの設定」画面でひとつひとつ列の詳細ページを開いて、URLの「Field=」より後の部分（内部名）に「OData_」をつけて・・・って手間です。
フローやアプリなどで、わかりやすい内部名を扱いたい。

## 原因
日本語で作成した列名（＝表示名）は、エンコードされて内部名になるため。

## 解決方法
列を作成するときは英数字で作成してから、必要に応じて日本語に変更します。

フローやアプリなどで扱うときに必要な内部名は、列を作成したときのまま固定されるため、英数字（例「ReferenceURL」）で作成するとそのまま（「ReferenceURL」のまま）利用できます。
リスト１つを複数のフローやアプリで利用することを考えると、作成時のひと手間は必要ですが後がラクです。「OData__98tu__・・・」ではなく扱えます。
どうしても日本語読みしたいときはローマ字で作成しています。（例｜「親子」⇨「oyako」とか）

ただし、一意である必要がありますし、SharePointリストの「ID」など予約名をつけると末尾に連番がついたりします。

結局PowerPlatform関連は英数字で運用するほうがなんでもスムーズです
Capacitor で作ったアプリを実機デバッグでホットリロードしたい

忘れないうちにメモ
npm run devでLAN内アクセスができる(safariからアクセスできる)状態であることを確認する　viteなら vite dev --hostが必要　←重要1
capacitor.config.jsにserver.host と server.clearなんちゃらを追加
index.htmlが指定するjsのエントリポイントを http://なんかLAN内のアドレス/ でパスが通るようにする　←死ぬほど重要

これでなんと実機上でのデバッグ実行でもWebの部分だけならホットリロードができる
やったぜ
CCNetのIPv6について

# 1.はじめに
結論はCCNetの回線はIPv6非対応（昨今では珍しい気がする）。
ネットに情報なかった為，CCNetに問い合わせして確認。

以下は備忘録。

# 2.状況
引っ越し先のアパートに入居前から導入されていた。
エアコンダクトから光ファイバが引き込まれており、ONUと無線ルータが設置されていた。
なお，屋外の光ファイバー引き回しは芳しくない。結束バンドで固定している部分でかなり折れていたり，建物端の固定部からエアコンダクト部まで光ファイバーが垂れ下がっている部屋があったり。

# 3.機器類
導入されていた機器類は以下。

■ ONU
　メーカ：古河電工
　型番：[FITELwave AG20F](https://www.furukawa.co.jp/broadband/product/gepon/ag20f.html)
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/daefaf38-e90c-4ef7-96dd-16f5d13e12d7.png">

■ 無線ルータ
　メーカ：NEC
　型番：[Aterm WG1200DM4](https://www.aterm.jp/solution/product/wg1200dm4/index.html)
<img width="500" alt="image2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/6b13a593-3c6f-4221-9d6a-8ad8068c1272.png">

# 4.回線速度
■環境
　接続：PCへ有線接続
　測定サイト：[inonius](https://inonius.net/speedtest/)

IPアドレスは消している。
ルータの違いで速度等に差が出ているが，ほぼ誤差といえる。

　・8時
　　AG20F & WG1200DM4（元の環境）
<img width="500" alt="image3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/3cf5463a-635e-4176-b8df-c1de5982c4c9.png">
　　AG20F & RTX1210（自前のルータ YAMAHA製）
<img width="500" alt="image4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/9c45cfdb-7970-4efe-bc2b-cd678d904a1b.png">
  
　・24時
　　AG20F & RTX1210（Jitter大と小）
<img width="500" alt="image5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/84c8be8b-1a13-42ec-8622-05fbf73c825b.png">
<img width="500" alt="image6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992520/fb185e2c-fd83-4acb-bd75-c4346e0ad1e9.png">

# 5.回線品質
概ね1Gbpsは出ている。
昼時間帯は特に気になる点はなかった。
夜時間帯はJitterのバラツキが大きい傾向にあった。YouTubeで配信を見ているとカクついたり，時間が飛んだりすることが多かった。

# 6.最後に
適当に動画見る等なら問題なさそう。
回線品質が重要なゲーム等には不向きと思われる。
IPv6接続があれば配信見るときのカクつきは多少ましになると考えられる。
PyTorchビルドからコントリビュートのための注意

(この情報は2025/05/17の情報)
# PyTorchをビルドする
人にはPyTorchをビルドして編集しなければいけない時がある, 国際学会投稿のためとか, ボスに命令されたからなどである。
## Clone
まずcloneして現在の環境でinstallできることが確認できる(pipとかでinstallしてみる)PyTorchにcheckoutする。自分はenrootコンテナのpytorch:24.10-py3に合わせた。
```Bash
git clone --recursive https://github.com/pytorch/pytorch 
git checkout e000cf0ad9 # pytorch:24.10-py3用のリポジトリはこれ
git submodule sync
git submodule update --init --recursive
# ビルド前に一旦前のビルド結果が残ってないかを確認する
python setup.py clean
rm -rf build/
```
## Env
環境変数を設定する, 自分の環境ではcondaではなくコンテナ内のPythonを使っていることに注意
あとは諸事情で環境がArm CPUだったので, 推奨設定の```USE_PRIORITIZED_TEXT_FOR_LD=1```をつけている。正直ここはPyTorchのGitHubを眺めながら設定して欲しい
```Bash
export USE_CUDA=1
export CUDA_HOME=/usr/local/cuda
export CMAKE_PREFIX_PATH=$(dirname $(which python))/../
export USE_PRIORITIZED_TEXT_FOR_LD=1  
```
## Build
whlをビルドしてpipでいれる。初回はメモリ80GBで2時間以上かかるが, それ以降は小さな変更ならば10分程度で終わります。```build/```を消すとまた最初からなので注意
```
python setup.py bdist_wheel
pip install dist/torch-2.5.0a0+e000cf0-cp310-cp310-linux_aarch64.whl
```
## その他の注意
デバッガやGitHubで検索しつつ変更箇所を特定するようになるとは思いますが, 一部ビルド時に自動生成されるファイルなどがあります。```torchgen/gen.py```などがその自動生成用スクリプトで, おそらくですが```build/```の各デバイスに対する関数はこれで生成されています。
そのため, このようなファイルは一度ビルドした環境でないと追えないのでGitHubとかで追うことは難しいので注意してください。
![スクリーンショット 2025-05-18 0.05.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3311006/86579b7b-e0d2-437d-958f-4fec869bd673.png)

自動生成されたものは大体こういう感じです。```build/aten/src/ATen```以下のcppファイルなどが生成されています。

![スクリーンショット 2025-05-18 0.08.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3311006/fff34df5-c3a6-457e-a4c7-470f02b3b9f1.png)

主にデバイスの置き場所に関するassertionを出す```check_and_update_common_device```はこの自動生成経由でしか使われていないっぽいので最初に挙動を追う時に苦労しました。

![スクリーンショット 2025-05-18 0.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3311006/89c09b02-5b71-4eb0-984a-49066c790e04.png)
ABC212

# 問題
https://atcoder.jp/contests/abc212/tasks/abc212_c

# 解答
```c++
#include <iostream>  // 入出力を行うためのライブラリ（画面に表示したり、キーボードから入力を受け取るため）
#include <vector>    // 可変長の配列（ベクター）を使うためのライブラリ
#include <algorithm> // sortなどの便利なアルゴリズムを使うためのライブラリ
#include <cmath>     // 絶対値absなど、数学的な関数を使うためのライブラリ
using namespace std; // 「std::」という接頭辞を省略して書けるようにする

int main() {
    int N, M;
    cin >> N >> M; // キーボードから整数NとMを読み込む（N: 配列Aの要素数、M: 配列Bの要素数）

    vector<int> A(N), B(M); // 整数をN個持つ配列A、M個持つ配列Bを用意する
    for (int i = 0; i < N; ++i) cin >> A[i]; // 配列AにN個の値を読み込む
    for (int i = 0; i < M; ++i) cin >> B[i]; // 配列BにM個の値を読み込む

    sort(A.begin(), A.end()); // 配列Aを小さい順に並び替える
    sort(B.begin(), B.end()); // 配列Bも小さい順に並び替える

    int i = 0, j = 0; // 2つの配列AとBの現在の位置を表す変数iとj
    long long ans = 1e18; // 答えを入れる変数（最小の差を記録する）。初期値は非常に大きい数（10の18乗）

    // 配列AとBを同時に走査（それぞれの位置を動かしながら）
    while (i < N && j < M) {
        // A[i]とB[j]の差の絶対値を求めて、現在の最小値と比べて小さければ更新
        ans = min(ans, abs((long long)A[i] - B[j]));

        // より小さい方の配列の位置を1つ進めて、差を小さくできる可能性を探す
        if (A[i] < B[j]) ++i;
        else ++j;
    }

    cout << ans << endl; // 最小の差を表示する
    return 0; // プログラム終了
}
```

# 解説

## 問題概要

2つの数列 A（長さ N）と B（長さ M）が与えられる。
A から1つ、B から1つ要素を選んだときの絶対差 `|A[i] - B[j]|` の最小値を求める。



## 制約と難しさ

* N, M は最大 2×10⁵。
* 全ての組み合わせを試すと O(NM) となり、計算量が最大 4×10¹⁰ になる。
* 全探索では間に合わないため、高速なアルゴリズムが必要。


## 解法の方針

### 1. ソート

数列 A と B をそれぞれ昇順にソートする。
これにより、差を効率的に比較できるようになる。

### 2. [尺取り法](https://qiita.com/drken/items/ecd1a472d3a0e7db8dce)（二本のポインタ）

ポインタ i（A用）と j（B用）を用意し、以下のように進める。

* 現在の差 `|A[i] - B[j]|` を計算して最小値を更新する。
* A\[i] < B\[j] なら、A の値を大きくするため i を進める。
* A\[i] ≥ B\[j] なら、B の値を大きくするため j を進める。
* 一方の配列の末尾に到達するまで続ける。

## 計算量

* ソート：O(N log N + M log M)
* ポインタ走査：O(N + M)
* 合計：O(N log N + M log M) であり、制限時間内に収まる。


## 実装上の注意

* 差の絶対値は `abs(A[i] - B[j])` で求める。
* 競技プログラミングでは高速な入出力やオーバーフロー対策も意識する。



## まとめ

この問題は、2つの数列の要素間で最も近い値を探す典型問題であり、
ソートと尺取り法による効率的な探索が最適解となる。
【Mac】画面録画をGIFに変換する方法【Gifski】


## Gifskiをインストール

以下のコマンドでGifskiをインストールできます。

```terminal
brew install gifski
```

## MOVをGIFに変換

以下のコマンドでGifskiを使用してMOVをGIFに変換できます。


```terminal
gifski --fps 10 --width 320 -o output.gif input.mov
```

## ffmpegを併用する

ffmpegをインストールします。

```terminal
brew install ffmpeg
```

ffmpegを併用する場合には以下のように実行します。

```terminal
ffmpeg -i input.mov -progress pipe:2 -nostats -hide_banner -stats_period 0.1 -fpsmax 20 -f yuv4mpegpipe - | gifski -o output.gif --width 800 --fps 20 --quality 90 -
```

## 参考

https://gif.ski/
IT系エンジニアが開発業務を行ううえで必要なスキル

## プログラミングスキル

| スキル項目 | 内容 |
| ------------------- | ---------------------- |
| **言語知識**   | Python、JavaScript、Java、Go、TypeScriptなど。用途によって使い分ける（Web、API、バッチ、インフラなど）。 |
| **フレームワーク** | Flask、FastAPI、React、Vue、Spring Bootなど。効率的な開発や保守性向上に必須。   |
| **設計力（OOP・設計パターン）** | クラス設計、SOLID原則、MVCなど。保守性・拡張性のあるコードを書くための基本。|


## インフラ／クラウドスキル

| スキル項目                 | 内容                                               |
| --------------------- | ------------------------------------------------ |
| **Linux/Unixの基本操作**   | サーバー操作やシェルスクリプト、ログ確認、プロセス管理など。                   |
| **AWS / GCP / Azure** | サーバレス（Lambda）、EC2、RDS、S3、VPC、IAMなどを用いたクラウド設計・運用。 |
| **Docker / コンテナ**     | アプリを環境依存せず動かすための技術。開発〜本番で一貫性を保つ。                 |
| **Terraform / IaC**   | インフラをコードで管理する手法。再現性・レビュー性が高まる。                   |


## 開発プロセス管理スキル

| スキル項目                     | 内容                                                                   |
| ------------------------- | -------------------------------------------------------------------- |
| **Git / GitHub / GitLab** | バージョン管理。ブランチ運用、PRレビュー、コミットログの整理などが重要。                                |
| **CI/CD**                 | Jenkins、GitHub Actions、CircleCIなどを使った自動テスト・デプロイの構築。                  |
| **テスト自動化**                | 単体テスト（pytest、Jest）、統合テスト、自動E2Eテスト（Playwright、Selenium）。              |
| **コード品質管理**               | Linter（Flake8、ESLint）、Formatter（Black、Prettier）、静的解析ツール（SonarQubeなど） |


## 運用・監視・セキュリティ

| スキル項目         | 内容                                                          |
| ------------- | ----------------------------------------------------------- |
| **モニタリングツール** | CloudWatch、Datadog、Prometheus + Grafanaなど。障害検知・リソース監視。      |
| **ログ管理**      | ELK（Elasticsearch, Logstash, Kibana）、Fluentdなどによるログの収集・可視化。 |
| **アラート設計**    | 重要な異常を通知する設計。過剰なアラートは逆効果。                                   |
| **セキュリティ対策**  | IAM管理、CORS設定、XSS/CSRF対策、パッチ適用、脆弱性スキャン。                      |


## ソフトスキル・開発文化

| スキル項目            | 内容                                          |
| ---------------- | ------------------------------------------- |
| **チーム開発力**       | チケット管理（JIRA、Backlog）、レビュー文化、朝会・ふりかえりなど。     |
| **ドキュメンテーション**   | README、設計書、API仕様書（OpenAPI / Swagger）などの記述。  |
| **アジャイル / スクラム** | スプリント開発、ユーザーストーリー、見積もり（Story Point）など。      |
| **コミュニケーション**    | 非エンジニアとの調整、レビューコメント、報連相。SlackやNotionの活用も含む。 |


## その他役立つスキル

| スキル項目          | 内容                               |
| -------------- | -------------------------------- |
| **英語リテラシー**    | ドキュメント・エラーの読み解き、海外技術トレンドの把握。     |
| **DevOpsマインド** | 「開発だけ」「運用だけ」ではなく、継続的改善を意識した全体設計。 |
| **業務ドメイン理解**   | ビジネス要件の背景を知ることで、よりよい仕様提案が可能に。    |
sdctf2025 write up OSINT編

# はじめに

深夜の1時ごろに，おもむろにCTF timesを開いて始めたCTFがなかなかの好順位を取ることができたので，Write Upを書いておこうと思います．私（Hosi121）はCrypto 3問Pwn 1問を解きました．今回は友人らと解いたOSINTの解法を述べます

チームとしての総合順位は24/289 (8.3%) でした．

## 問題文

ACM USCDにpiotrという学生がいて，どっかに行ってしまった．day nにどこにいたのかがflagです．

## 解法

まずおもむろにGoogleで「ACM USCD "piotr"」と調べます．すると次のページがひっかります．

https://acmucsd.com/about

見るとメールアドレスと，Linkdinのアカウントがあるので，それを辿ります．

https://www.linkedin.com/in/piotr-sultanbekov/


次のGitHubリンクを見つけます．

https://github.com/sultangamer06/sultangamer06.github.io

ここのGitHub pagesのデプロイ履歴を見ると，怪しい履歴がありますね．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357670/883c57ed-dee3-42bf-91ec-2b96748f91ba.png)

ここを眺めると，Twitter IDが取れます．次のアカウントですね．

`https://x.com/su1tangam3r`

https://x.com/su1tangam3r

ここのアカウントのプロフには，Truth Socialのリンクが張られています．

`truthsocial.com/@sultangamer`

> i got stood up for the SECOND time. why don't any hot hacker chicks ever find me?? thats IT! im moving to a less woke website where i can finally speak my TRUTH

「Truthを話せる場所に行く」とツイートもしているので，次のヒントはここですね．ちなみにTwitterのフォロー関係はかなり重要な伏線回収になっています．

> @goplumeria
 nobody came to my star wars themed date. wtf🤬

またリプ欄を見ると，`https://x.com/goplumeria`というアカウントに期間中リプを飛ばしています．先のアカウントは作成日も含めてかなり怪しいです．

Truth Socialに行くと，一つ決定的な写真があります．写真は省きますが，結果的にガススタンドとチュニジアの銀行が映っており，geosintした結果がflagでした．

`https://bsky.app/profile/sultangamer.bsky.social`

https://bsky.app/profile/sultangamer.bsky.social

bskyの投稿の1つに

> oh mein gott im at my first in person smash tourney and they're playing magic die zusammenkunft!!!!

とあります．german smash tournament referenceの場所を特定するとFlagです．

ここらへんから普段チームで取り組んでいる友人が起きていることに気づき，連絡をとりました．3人で協力プレイです．

Yandexで本名を検索すると，次のアカウントを見つけます．

https://vk.com/sultangamer007

ここで宇宙に行くという演出があるのですが，その位置情報を特定することでFlagです．

同時にInstagramアカウントを見つけました．

https://www.instagram.com/sult4n_g4mer

ここの投稿を一つgeosintするとFlagになります．

----

本番に解けたのはここまでです．ここから先は後日のdisucssionで明らかになったことです．

結論を言うと，ここにflagが直接置いてありました．気づくわけがないですね．

https://somafm.com/chat/

では，どうやって辿り着くのか．実はInstagramにヒントがありました．Instagramの投稿の`#dontbullimywooli`というハッシュタグを見に行くと，Redditアカウントに辿り着きます．そして，その後に`https://imgur.com/user/sultangamer06`に辿り着きます．

そして，該当する音楽を探すと，次のサイトに行きつくらしいですね．

## まとめ

- day1 : 謎の音楽サイト
- day2 : Instagram の投稿からGeOsint
- day3 : Imgurの投稿から（`https://imgur.com/user/sultangamer06`）
- day4 : TruthSocialの投稿からGeOsint（`truthsocial.com/@sultangamer`）
- day5 : bskyの投稿からgerman smash tournament referenceを検索
- day6 : bskyの最後の投稿からvkアカウントを発見（yandexから見つけたもの）．それを追跡．

結果的に見つかったアカウントは

LinkdIn: `https://www.linkedin.com/in/piotr-sultanbekov/`
GitHub : `https://github.com/sultangamer06`
X : `https://x.com/su1tangam3r`
Instagram : `https://www.instagram.com/sult4n_g4mer`
Imgur : `https://imgur.com/user/sultangamer06`
TruthSocial : `truthsocial.com/@sultangamer`
bsky : `https://bsky.app/profile/sultangamer.bsky.social`
vk :  `https://vk.com/sultangamer007`
Reddit : （消された？）
? : `https://somafm.com/chat/`

という感じですね．

次回以降，Cryptoやpwnの問題の解説なども追加したいと考えています．
batで日付(yyyyMMdd)を取得

# はじめに
ファイル名の末尾に年月日(yyyyMMdd)を付けようと思います。

# batで作成
今日の日付を取得　⇒　%date%
```
C:\>echo %date%
2025/05/17
```
「%date%」は「yyyy/MM/dd」の形式になっています。
これを「yyyyMMdd」にするには
　年　⇒　1文字目から、4文字
　月　⇒　6文字目から、2文字
　日　⇒　9文字目から、2文字
を切り出して連結すれば良いです。

　1文字目から、4文字　⇒　%date:~0,4%
　6文字目から、2文字　⇒　%date:~5,2%
　9文字目から、2文字　⇒　%date:~8,2%
となるので、

```
C:\>echo %date:~0,4%%date:~5,2%%date:~8,2%
20250517
```

これで、現在日付を「yyyyMMdd」形式で取得することが出来ました。

・
・
・
・
・

とある人が実行するとファイルの末尾に「令和7年5月7日」が付きました。
和暦？
今日は17日のはずなのに7日？
>「%date%」は「yyyy/MM/dd」の形式になっています。

これがおかしいのでは？

該当のPCで「%date%」を確認してみました。
```
C:\>echo %date%
令和7年05月17日
```
やはり…

どうやら「%date%」の形式はwindowsの設定の「日付（短い形式）」になるようです。

**※上手くいった設定と上手くいかなかった設定**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/1aba1737-3a5f-40a1-985b-e21cac92bb69.png" width=40%>　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/80772fb7-f8e5-4668-92e2-8dc3ac027321.png" width=40%>

特定の環境でバッチを実行するのであれば「%date%」でも良いですが、PowerShellで取得するのが良さそうです。
（VB Scriptは非推奨になる予定なので…）

PowerShellで取得する方法は以下の通りです。
```
C:\>powershell -command "exit [DateTime]::Today.ToString('yyyyMMdd')"
C:\>echo %ERRORLEVEL%
20250517
```
batでPowerShellのコマンドを実行　⇒　powershell -command [PowerShellのコマンド]
戻り値の受け渡し　⇒　PowerShellの「exit」で返し、batの「%ERRORLEVEL%」で受ける

これで環境に因らず現在日付を「yyyyMMdd」形式で取得することが出来ました。
C++ エラー集

# CE
コンパイラルエラー


コーディング中にわかりそうなもの
- セミコロン忘れ

# RE
実行時エラー

- **ゼロ除算**
- **範囲外エラー**
    - 縦横のW,Hが逆ではないか
    - `>`と`>=`、`<`と`<=`を誤っていないか
    - if文で`==`を`=`としていないか

# WA
論理エラー

- スペルミス
- **コーナーケース**
    - 制約の最小値・最大値
    - 偶数・奇数
- 入力・出力形式の誤認
- **オーバーフロー**
- 添字ミス
- ネスト等で別スコープで同じ文字を使用し、間違いがないか
- `<` `<=` `>` `>=`は正しいか
- if文の`==`を`=`としていないか
- 浮動小数点数の誤差
    - 特にpowなどでも起こることがある
- 問題文の解釈ミス
    - グラフ問題なら[ビジュアライザ](https://csacademy.com/app/graph_editor/)
- 解法が違う
- 重複削除時など) ソートが行われていない
- 同じ値が複数あっても対応できるか
- 二分探索なら上限と下限を大きくする
- MODは正しいか

# TEL
実行時間制限超過
- 枝切り
- 上限が小さい制約を見よう
- 無駄なループ・配列はないか
- 累積和・いもす法・セグ期・平衡二分探索機・メモ化再起・優先度付きキュー
- 本当にギリッッッギリ間に合わないなら再提出でも間に合うかも？

# MLE
メモリ制限超過
- 変に大きなリストを作ってはいないか
    - 座標圧縮やset等

# OLE
ファイルサイズ超過
- ズルせずコーディングしてときましょ

# おすすめサイト

https://algo-logic.info/how-to-think-cp/
初心者向け機械学習手法ロードマップ

機械学習は今や様々な分野で活用されており、初心者に代表的なアルゴリズムを紹介します。

#### 教師あり学習（Supervised Learning）

ラベル付きデータから学び、入力に対して正しい出力（ラベル）を予測します。

* **分類（Classification）**
  　データをカテゴリに分ける。

  * 例：メールを「スパム」か「通常メール」に分類する
  * 主なアルゴリズム：ロジスティック回帰、決定木、ランダムフォレスト、SVM、k-NN

* **回帰（Regression）**
  　連続値を予測する。

  * 例：住宅価格の予測、株価の予測
  * 主なアルゴリズム：線形回帰、リッジ回帰、SVR

####  教師なし学習（Unsupervised Learning）

ラベルのないデータから構造やパターンを見つけます。

* **クラスタリング（Clustering）**
  　似たデータをグループにまとめる。

  * 例：顧客セグメンテーション、フェイクニュース検出
  * 主な手法：K-means、階層型クラスタリング、DBSCAN
  
* **次元削減（Dimensionality Reduction）**
  　高次元データの特徴を圧縮。

  * 例：テキストデータの特徴圧縮、画像特徴抽出
  * 主な手法：PCA、t-SNE、UMAP

* **アソシエーション分析（Association Analysis）**
  　データ間の関連性を抽出。

  * 例：マーケットバスケット分析（購買履歴の分析）
  * 主な手法：APRIORI、FP-Growth

* **異常検知（Anomaly Detection）**
  　正常パターンから逸脱した異常データを検出。

  * 例：クレジットカード不正利用検知、機械の故障予兆検知
  * 主な手法：Isolation Forest、LOF


#### 強化学習（Reinforcement Learning）

環境とエージェントの相互作用に基づき、最適な行動を学びます。

* **モデルフリー（Model Free）**
  　環境のモデルなしで直接学習。

  * 例：ゲームAI（囲碁、将棋）、ロボット制御
  * 主な手法：Qラーニング、SARSA、DQN


* **モデルベース（Model Based）**
  　環境モデルを利用して計画。

  * 例：自動運転、ロボットの経路計画


#### 半教師あり学習（Semi-supervised Learning）

一部ラベル付き、一部ラベルなしデータを活用。

* 例：医療画像診断（ラベル付けが高コストな場合に利用）
* 主な手法：自己学習（Self-training）、共訓練（Co-training）、グラフベース学習


#### 深層学習（Deep Learning）

多層ニューラルネットワークにより複雑な特徴を自動抽出。

* **CNN（畳み込みニューラルネットワーク）**

  * 例：画像認識（顔認証、物体検出）
* **RNN（リカレントニューラルネットワーク）**

  * 例：音声認識、文章生成
* **Transformer**

  * 例：機械翻訳、チャットボット（GPT系モデル）

#### 機械学習を始めるためのポイント

最初は難しく感じるかもしれませんが、まずは基本的なアルゴリズムを理解することが大切です。
- データの準備：質の良いデータが成果の鍵。前処理も大切。

- モデルの選択：目的に合った手法を選ぶこと。まずはシンプルなモデルから。

- 評価と改善：精度を測りながら、特徴量やモデルの調整を行う。

- ツール活用：Pythonのscikit-learnなど使いやすいライブラリが豊富。
Auto Scalingターゲットトラッキングポリシー

Auto Scaling の **ターゲットトラッキングポリシー（Target Tracking Scaling Policy）** は、
**特定のメトリクスの目標値（ターゲット）を維持するように、自動でスケーリング**を行う仕組みです。

---

## ✅ 概要

* **あらかじめ指定したメトリクスの目標値（ターゲット）** に基づいて、
  EC2 Auto Scaling グループの **インスタンス数を自動で増減**します。
* メトリクスが目標より上がるとスケールアウト（増加）し、
  下がるとスケールイン（減少）します。

---

## 🎯 代表的なターゲットメトリクス例

| メトリクス                      | 説明                      |
| -------------------------- | ----------------------- |
| **CPU使用率（CPUUtilization）** | 一般的に最もよく使われる指標          |
| アプリケーションロードバランサーのリクエスト数    | Target Group あたりのリクエスト量 |
| カスタムメトリクス（CloudWatch）      | 独自のメトリクス（例：メモリ使用率など）    |

---

## 🔧 設定項目の例

| 設定項目           | 説明                  |
| -------------- | ------------------- |
| メトリクスの種類       | CPU利用率やALBのリクエスト数など |
| ターゲット値         | 例：CPU使用率 60% を維持したい |
| クールダウン時間（推奨設定） | スケーリング直後の安定期間を指定    |

---

## 🔁 自動調整の仕組み

たとえば、以下のようなポリシーを設定したとします：

* ターゲット：**CPU使用率 60%**
* 現在：インスタンス数 2台で **CPU使用率が 80%**

この場合、CloudWatch のアラームがトリガーされてスケールアウトされ、
例えば 3台に増えることで CPU負荷が分散 → 60% 付近に近づきます。

---

## 📈 比較：他のスケーリングポリシーとの違い

| ポリシー名       | 特徴                     |
| ----------- | ---------------------- |
| ターゲットトラッキング | **目標を維持する**（自動制御）      |
| ステップスケーリング  | 閾値超過の「幅」に応じてスケール幅を手動設定 |
| シンプルスケーリング  | アラームを条件に一定数だけ増減        |

> → 通常は「ターゲットトラッキング」が最も簡単で精度も良いため **推奨** されています。

---

## 🛠️ 設定例（AWS CLI）

```bash
aws autoscaling put-scaling-policy \
  --policy-name keep-cpu-60 \
  --auto-scaling-group-name my-asg \
  --policy-type TargetTrackingScaling \
  --target-tracking-configuration file://config.json
```

`config.json` の例：

```json
{
  "PredefinedMetricSpecification": {
    "PredefinedMetricType": "ASGAverageCPUUtilization"
  },
  "TargetValue": 60.0,
  "DisableScaleIn": false
}
```

---

## ✅ メリット

* **設定が簡単**（メトリクスと目標値を決めるだけ）
* **過剰なスケーリングを防止**
* **需要に自動で追従しやすい**（コスト最適化）

---

## ✅ まとめ

| 項目   | 内容                     |
| ---- | ---------------------- |
| 概要   | メトリクスのターゲット値に自動調整      |
| 主な用途 | CPU使用率、リクエスト数などの自動負荷分散 |
| 推奨度  | 高（他のスケーリング方式より使いやすい）   |
#30.Terraformのmodule化でハマったところ

# はじめに
Terraformのmodule化を使用したディレクトリ構成を試していたところ、変数の値が呼び出せずエラーが発生してしまい、少し迷ったので備忘録として記事にしました。

# なぜ変数の値を渡せなかったか？
以下のディレクトリ構成を想定しています。
```
TechBull-project/
├── dev/
│ ├── main.tf
│ ├── variables.tf
│ └── terraform.tfvars 
│ 
├── modules/
│ ├── vpc/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ └── outputs.tf
│ ├── ec2/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ └── outputs.tf
```


当初、modules/配下にも.tfvarsファイルを作成して、各モジュールで変数の値を定義しようとしましたが、
Terraformの仕様上、.tfvarsファイルはルートモジュール（カレントディレクトリ）でのみ有効であり、
モジュール内のmain.tfなどからは参照されませんでした。

これは、.tfvarsはあくまでルートモジュールのvariables.tfに対して値を紐づけするためのファイルであり、
モジュール内部では、variables.tfに変数を宣言し、呼び出し元から値を渡す必要があるためでした。
また、Terraformには変数の優先順位があるらしく、variables.tfでdefaultを指定した値より、terraform.tfvarsの値が優先されるようです。

そのため、環境ごとに設定を切り替える場合は、terraform.tfvarsを活用することで、ルートモジュール（カレントディレクトリ）側で環境ごとの変数を切り替えられるため便利なのかなと感じました。

■公式ドキュメント

https://developer.hashicorp.com/terraform/language/values/variables#variable-definitions-tfvars-files

■以下抜粋

仕様について
>>以下のセクションでは、これらのオプションについて詳しく説明します。このセクションは子モジュールには適用されません。子モジュールでは、入力変数の値は親モジュールの設定で割り当てられます（ モジュールの説明を参照） 。
[省略]
変数定義（.tfvars）ファイル
多数の変数を設定するには、変数定義ファイル(ファイル名が または で終わる.tfvars )でそれらの値を指定し.tfvars.json、そのファイルをコマンド ラインで で指定すると 便利です-var-file。
[省略]
変数定義ファイルは、Terraform 言語ファイルと同じ基本構文を使用しますが、変数名の割り当てのみで構成されます。

優先順位について
>>変数定義の優先順位
上記の変数設定メカニズムは、任意の組み合わせで使用できます。同じ変数に複数の値が割り当てられている場合、Terraformは最後に見つかった値を使用し、それ以前の値は上書きされます。ただし、単一のソース内で同じ変数に複数の値を割り当てることはできません。
>>
>>Terraform は次の順序で変数をロードします。後のソースが前のソースよりも優先されます。
>>
>>- 環境変数(variablesのdefault設定等）
>>- ファイルterraform.tfvars（存在する場合）。
>>- ファイルterraform.tfvars.json（存在する場合）。
>>- 任意の*.auto.tfvarsまたは*.auto.tfvars.jsonファイルは、ファイル名の語句順に処理されます。
>>- コマンドライン上の任意-varのオプション（指定された順序で）。（これには、HCP Terraform ワークスペースによって設定された変数も含まれます。）-var-file

実際に試すとわかるのですが、.tfvars にのみ値を定義し、variables.tfなどで変数を宣言していない場合、apply時に次のようなエラーが発生します。

```
╷
│ Warning: Value for undeclared variable
│
│ The root module does not declare a variable named "ec2_name" but a value was found in file "terraform.tfvars". If you meant to use this value, add a "variable" block 
│ to the configuration.
│
│ To silence these warnings, use TF_VAR_... environment variables to provide certain "global" settings to all configurations in your organization. To reduce the        
│ verbosity of these warnings, use the -compact-warnings option.
╵
╷
│ Error: Reference to undeclared input variable
│
│   on main.tf line 75, in module "ec2":
│   75:   name                   = var.ec2_name
│
│ An input variable with the name "ec2_name" has not been declared. This variable can be declared with a variable "ec2_name" {} block.
╵
```

# まとめ
.tfvars ファイルで変数を管理すること自体は理解していたのですが、
今回のような細かいところまでは把握していなかったため、良い学びのきっかけになりました。
また、普段あまり意識していない部分でも、こういった思いがけないところでハマりポイントになってしまうことがあるので、今後は注意していきたいと感じました。

以上、ありがとうございました！
ブログで更新する内容について

皆さんにご説明したいのですが、こちらのブログで更新する内容は、以下の図に示すようなテーマを中心に進めてまいります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515709/1dbb192b-9f17-4dce-914e-b25ae6fe5376.png)

基本は論理と実操作をメインでコンテンツを作って、徐々に図に記載された内容を全部展開したいと思います。お楽しみに！！！
個人開発のDBは国産VPSが最強

# はじめに

個人開発でまず障壁となるのがDBのコストの高さである。ホスティングサービスだとVercelやCloudflare Pagesなどほぼノーコストで使えるサービスがあるにも関わらずDBになると安くても5000円以上は掛かる。所詮DBサーバー立ち上げるだけで済むとわかっていながらも情弱ながらゆえこのぐらい掛かるだろうと納得させていたが、最近になり国産VPSが安くて最高という結論になったので今までの経験からメリットデメリットをまとめる

# 国産VPSが最高

国産VPSは安くてスペックも担保できるので最高。さくらVPS、Conoha VPSと何でもよいが自分は安くて評判がよいConohaを利用した。Amazon Lightsailという海外VPSもあるがこれは最悪（後述）。メモリ1G、CPU2コア、SSD100Gで500円程度はパブリッククラウドが主流になった今のRDBと比較すると異常なぐらい安い

https://www.conoha.jp/vps/

https://vps.sakura.ad.jp/

## なぜ最高か

- 安い✅
- 早い✅
- 簡単✅
- 自由度が高い✅
- 手間がかかる🔺

前述した通り安い、スペックが高い（他のRDBクラウドサービスに比べ）。OSから選べるのでなんでも出来るのでむしろ出来ないことがない（MySQLでもPostgreSQLでも好きなものを入れられるし`cron`とか利用してもよいしなんでもできる）。また生成AIが利用できるようになった今、構築やメンテナンスは楽になったのでより一周回ってより利用しやすくなったと思う

## なぜ国産VPSは取り上げられないのか

- 構築やメンテナンスが大変
- インフラに関する深い知識が必要
- 流行りもんが良いという悪習
- 国産VPSとかダサい

とくに「流行りもんが良いという悪習」「国産VPSとかダサい」は大きいと感じる。現にちょっと使って記事書けばバズりやすいという目的で使ってる人も多いはず

https://qiita.com/ikuosaito1989/items/f90dc379bdfa3afa5799

# 他と比べる

他のサービスと比べないと国産VPSの良さが伝わらないと思うので自分が使ってみてサービスを完全主観で比べてみる。過去にサービスを運用して使っていたDBや現在[olcar](https://ol-car.com/)というサービスを数年運用して利用したものをピックアップして**完全主観**で比較する

## Cloud SQL

- 高すぎ❌
- 使いたい機能（メリット）がない❌
- 無料枠がない（無料枠期間なら大丈夫）🔺

正直これを個人で選定する理由が全く見当たらない。Query Insightsを特別見やすいとかないしスロークエリに対するサポート機能みたいなのもない。IAMやVPCを連携するために使うなら理解出来るぐらい。多分AWSも同じような感じだと思う。占有CPUだと最低でも月80ドル異常掛かるので普通に高すぎ

## Amazon Lightsail

- 安い（？）❌
- 制限ヤバすぎ❌

安いけどまったく使い物にならないのでお金をドブに捨てる覚悟がある人だけ使えば良いと思う。なにがダメかというとCPUバースト制限があり、ちょっと動かしただけでも制限掛かって何も出来なくなる。自分はDBをレストアしただけで使えなくなったので課金しなければ意味なし。月3.5ドルからだが、ストレスたまりすぎるのでマジでおすすめしない

## Azure SQL Database

- 安い✅
- SQLServerのみ🔺

オススメの部類に入る。安いし拡張性もある。SQLServerが嫌じゃなければいいと思う。DTUという単位がようわからんし、独自仕様を許容出来ればかなり優秀な部類。Azure Database for MySQL（PosgreSQLもあり）は全く別物で違う料金なので微妙だか多分Cloud SQLよりはコスパいい。月500円ぐらいから始められるので安いしグレード上げても1500円ぐらいなはず

https://azure.microsoft.com/ja-jp/products/azure-sql/database

# PlanetScale

- 開発体験良い✅
- チューニング体験良い✅
- ちょっと高い（無料枠なし）🔺
- MySQLのみ🔺

開発体験やチューニング体験は抜群に良い。Githubみたいなブランチ機能があり、`EXPLAIN`をGUIから確認できる、Recommendationsというチューニング提案の機能もある（チューニング出来るひとは別にいらんという機能ではあるが）。全体的には悪くないと思うのでおすすめな部類。気になる点としてPlanetScale社はレイオフしたりと経営は上手くいってないのでこれからまた動きはあるかもしれない。MySQLのみということと一番しょぼいプランで日本リージョンだと47ドルするので今のレートだと7000円ぐらいするので若干高め

https://planetscale.com/

# Railway

- 安い✅
- アプリケーションもデプロイ可能✅
- MySQLのみ🔺
- 日本リージョンなし❌

フルスタック開発向けのクラウドPaaSという位置付けだがMySQLのみ作成することも可能。5ドルから始められProでも20ドルなので安心かつスペックもそこそこ高い。コスパが良いのでおすすめ出来るが日本リージョンがないのでそれなりにちゃんとしたアプリケーションを作りたい場合は微妙かも

https://railway.com/

# Neon、Cloudflare D1など

これらは使ったことがないが、おそらくそこまで悪くない気がする。Cloudflare D1はSQLLiteのみなのでそこだけ許容できれば一番良い選択肢と言える可能性が高い

# 最強は国産VPS+生成AI

ちょっと前まではマネージドサービスでないとメンテナンスコストが掛かって辛いという風潮だったが今はChatGPTをはじめとした生成AIがあるのでトラブったときはすぐに対処できてさらに知識が少なくても簡単に構築できるようになったのでマネージドサービスで担っている利点が少なくなってきたと感じる。DBのメンテナンスコストといえば大体はインデックスなどのパフォーマンスチューニングなのでそれならVPSで十分じゃないかなという結論に至った

# VPSはスケーラビリティに弱い点について

スケールアップするならサービス止めれば良いと思う（強引）

# DB以外はどうなの

ホスティングやストレージなどに関しては価格もそこまで高くないし、証明書やらCICDやら色々面倒なことが多いのでAWSやGCPを使っても良いと思う（自分はCloud RunをはじめとしたGCPサービス使ってる）もちろんVPNでできることに越したことはないのでそこはケースバイケースで。

# まとめ

普通にAWSやGCP高すぎる。長い年月掛けたが、国産インフラが最高で品質も良い（Amazon Lightsailと比較すると涙出る）のでDBは国産VPSが最高という結論に至った。日本は品質に関しては異常なぐらい高いと実感。ビール一杯我慢してVPSを契約しよう
Metaが開発するPython型チェッカー「Pyrefly」

## はじめに

Pythonは動的型付け言語です。大規模なプロジェクトでは型の問題によるバグが発生しやすいという課題があります。このような課題に対応するため、Metaが新しいPython型チェッカー「Pyrefly」をオープンソースとして公開しました。

本記事では、2025年5月15日に発表されたばかりのPyreflyについて、その特徴や使用方法、従来ツールとの違いなどを初心者向けに解説します。

## Pyreflyとは

Pyreflyは、Rustで開発されたPythonの型チェッカーおよびIDE拡張機能です。主な特徴として以下が挙げられます：

- 静的型チェックによりコード実行前に型の不整合を検出
- VSCodeなどのIDEとの統合機能
- コマンドラインインターフェース（CLI）のサポート
- 高速なパフォーマンス（大規模コードベースで秒間180万行のコードをチェック可能）
- 型注釈がないコードでも自動的に型を推論する機能

現在はアルファ版としてリリースされており、MITライセンスでGitHubにて公開されています。

## 開発の背景

Pyreflyの開発はインスタグラムの大規模なPythonコードベースを管理するために始まりました。2017年にMetaは「Pyre」という型チェッカーを開発しましたが、時間の経過とともに型システムの進化とIDE応答性の要求が高まり、新しいアプローチが必要となりました。

Metaは代替ソリューションを探索する中で、コードナビゲーションにはMicrosoftの「Pyright」などコミュニティツールも活用していましたが、最終的にはコードナビゲーション、大規模チェック、他サービスへの型エクスポートができる拡張可能な型チェッカーの必要性から、Pyreflyを開発することにしました。

## Pyreflyの基本原則

Pyreflyの開発には以下の原則が適用されているそうです：

### 1. パフォーマンス

従来CIでのみ行われていたチェックをキーストローク毎に実行できるよう、高速な処理が重視されています。Rustで実装されており、あらゆるサイズのコードベースで高いパフォーマンスを発揮します。

### 2. IDE優先

IDEとコマンドラインで一貫した結果を得られるよう設計されています。これにより開発者は同じツールを異なる環境で使用しても同じ結果を得ることができます。

### 3. 型推論

多くのPythonプログラムは型注釈がありません。Pyreflyは型注釈がないコードでも自動的に戻り値やローカル変数の型を推論し、IDE上に表示します。さらにIDE上でダブルクリックするだけで、これらの推論された型を挿入することもできます。

### 4. オープンソース

MITライセンスでオープンソース化されており、コミュニティからの貢献を歓迎しています。


## 従来のツールとの比較

Pyreflyと他の主要なPython型チェッカーの比較です：

| 特徴 | Pyrefly | mypy | Pyright/Pylance |
|---|---|---|---|
| 実装言語 | Rust | Python | TypeScript |
| パフォーマンス | 非常に高速 | 中程度 | 高速 |
| IDE統合 | VSCode拡張 | 各種IDE対応 | VSCode内蔵 |
| 型推論 | 強力 | 基本的 | 強力 |
| コマンドライン | サポート | サポート | サポート |
| コミュニティ | 新興（Meta主導） | 成熟 | 成熟（Microsoft主導） |

## 将来の展望

Metaは今後Pyreflyをさらに発展させ、Pythonコミュニティと協力して言語の発展と開発者体験の向上に貢献する意向を示しています。2025年夏までにアルファラベルを外すことを目指しており、ユーザーからのフィードバックを募集しています。


## 参考リンク

- [Pyrefly公式サイト](https://pyrefly.org/)
FlutterをAndroid実機で動かす（with CLI）


最近の Android は、USBケーブルで繋がなくても実機デバッグができるらしいですよ！！
条件は同じローカルネットワーク内であることだけ！

https://developer.android.com/tools/adb

## ペア設定の方法

`android-tools-adb` ってのを使います。

```bash
$ apt install android-tools-adb
```

コマンドツールの準備ができたら、実機にPCを登録します。

「システム」＞「開発者向けオプション」＞「デバッグ：ワイヤレスデバッグ」を ON にします。
ON にしたら項目をタップします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/c2bbc864-a02d-43ef-9376-5a8cb9eec112.png" width="200px">

ワイヤレスデバッグのメニューが開いたら「ペア設定コードによるデバイスのペア設定」を開きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/c9f323b0-a3dc-4ebe-be5b-e3c48e685253.png" width="200px">

するとペア用の設定が出てきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/b3e5fd12-d378-4772-8d7c-442d1121c88a.png" width="200px">

これを元に PC でコマンドを打ちます。

```bash
$ adb pair 192.168.10.105:35465
Enter pairing code: 408805
Successfully paired to 192.168.10.105:35465 [guid=adb-XXXXXXXXXX-xxxxxx]
```

`Successfully` と出てくれば成功。




## 接続の方法

次に実際に接続します。
ペア設定を行っている状態で、ワイヤレスデバッグのメニューを開きます。
メニューに表示されているIPとポート番号を使います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/685a6edd-b308-4cb7-ab08-01c5734c5ec2.png" width="200px">

```bash
$ adb connect 192.168.10.105:35911
connected to 192.168.10.105:35911
```

`connected` と出てくれば成功。
そしたら `flutter run` を実行すれば、自動的に接続されます！

```bash
$ flutter run
Launching lib/main.dart on SO 53B in debug mode...

Flutter run key commands.
r Hot reload. 🔥🔥🔥
R Hot restart.
h List all available interactive commands.
d Detach (terminate "flutter run" but leave application running).
c Clear the screen
q Quit (terminate the application on the device).
```

画面が変わらないときは `R` を押すと強制リフレッシュがかけられるよ！
v0.devとvercelで作成した「宮古島台湾ヨットレース」ホームページ

# サービス
https://v0.dev/
https://vercel.com/

# 制作物（宮古島台湾ヨットレースHP）
https://tairyu.vercel.app/

# なぜこの記事を書こうと思ったのか？
協賛企業様募集のため🙇
https://tairyu.vercel.app/sponsors

▼ 過去大会
https://www.youtube.com/@TaiwanRyukyuRegattaMiyakojima

▼ 協賛企業様
https://www.instagram.com/tairyu.race/

## 制作者
元はシステムエンジニアとして
派遣社員 > 正社員 > フリーランスエンジニア
10年程、活動。

コロナ禍を期に実家の宮古島へ帰省
ITの世界から
実家の園芸店員 > 漁師 > マリンレジャー業（準備中）
そして、マリンレジャー業の師匠のお願いでHPを作成する事になる。

大事なことなので、もう一度言わせてください。

協賛企業様募集のため🙇
https://tairyu.vercel.app/sponsors
ECSタスク作成後に Error: Cannot find module '/app/.next/prerender-manifest.json' が出る場合の対応

AWSコンテナ設計・構築 本格入門 P288「フロントエンドアプリケーションからの一気通貫確認」で詰まったので備忘録。

https://www.sbcr.jp/product/4815607654/

元のDockerfiledのまま`docker bilid`、`docker image push`したイメージを使用してECSタスクを作成すると起動に失敗する。ECSタスクないのログを確認すると
```
Error: Cannot find module '/app/.next/prerender-manifest.json'
```
というエラーが発生していた。

Node.js 14だと`prerender-manifest.json`が作成されないようなので、16系に変更してbuildしたところECSタスクを起動できた。

### Dockerfile
不要なものも混じってると思うが、一応以下でECSタスクの起動とフロントからの疎通確認ができた。
```Dockerfile
FROM node:16-alpine AS builder
RUN apk add --no-cache libc6-compat
WORKDIR /app
RUN apk add --update --no-cache --virtual build-deps \
    python3 \
    py3-pip \
    g++ \
    git \
    libtool \
    automake \
    autoconf \
    make \
    openssl1.1-compat

# Install Python distutils
RUN python3 -m pip install setuptools

# Add libvips
RUN apk add --upgrade --no-cache vips-dev build-base --repository https://alpine.global.ssl.fastly.net/alpine/v3.10/community/
COPY . .

# Set environment variables for Next.js build
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV NEXT_STATIC_BUILD=true
ENV PYTHON=/usr/bin/python3

# install production dependencies
RUN yarn install --frozen-lockfile --production --network-timeout 600000

# Note also that prisma generate is automatically invoked when you're installing the @prisma/client npm package
RUN npx prisma generate

# Save production depenencies installed so we can later copy them in the production image
RUN cp -R node_modules /tmp/node_modules

# install all dependencies including devDependencies
RUN yarn install --frozen-lockfile --network-timeout 600000

# Build with explicit Next.js configuration
RUN yarn build && \
    yarn next export || true

# Verify .next directory contents
RUN ls -la .next/

###########
FROM node:16-alpine
WORKDIR /app

RUN apk add --no-cache curl tzdata openssl1.1-compat && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    apk del tzdata

COPY --from=builder /tmp/node_modules ./node_modules
COPY --from=builder /app/.blitz ./.blitz
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/package.json ./
COPY --from=builder /app/db ./

# Verify copied .next directory
RUN ls -la .next/

ENV PORT=80
EXPOSE 80

CMD [ "npm","run","start:prd" ]
# HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD curl
```
ABC406をPythonで（A～D）

パナソニックグループ プログラミングコンテスト2025（AtCoder Beginner Contest 406）の解答等の速報的まとめ

https://atcoder.jp/contests/abc406



# A問題
https://atcoder.jp/contests/abc406/tasks/abc406_a

大小比較をすればよい
時間を分に変換すれば確実にできる
$ \times 100$でも同じ
```python:A
a,b,c,d = map(int, input().split())
print("Yes" if a * 100 + b > c * 100 + d else "No")
```


# B問題
https://atcoder.jp/contests/abc406/tasks/abc406_b

シミュレーション
```python:B
n, k = map(int, input().split())
a = list(map(int, input().split()))

ans = 1
for a_i in a:
    ans *= a_i
    if ans >= 10 ** k:
        ans = 1

print(ans)
```


# C問題
https://atcoder.jp/contests/abc406/tasks/abc406_c

↗↘↗となる個所を探して、最初の増加箇所と後の増加箇所の積がこの個所にあるパターン数
```python:C
n = int(input())
p = list(map(int, input().split()))

ans = 0
start_count = 0
end_count = 0

for i in range(1, len(p) - 1):
    if p[i - 1] < p[i]:
        end_count += 1
        if p[i] > p[i + 1]:
            top = True
            ans += start_count * end_count
            start_count, end_count = end_count, 0

if len(p) >= 4 and p[-2] < p[-1]:
    ans += start_count * (end_count + 1)

print(ans)
```


# D問題
https://atcoder.jp/contests/abc406/tasks/abc406_d

縦と横をそれぞれsetで管理
捨てるときに他方もそれぞれ消していく
```python:D
h, w, n = map(int, input().split())

x = [set() for _ in range(h)]
y = [set() for _ in range(w)]

for _ in range(n):
    x_i, y_i = map(lambda x:int(x) - 1, input().split())
    x[x_i].add(y_i)
    y[y_i].add(x_i)

for _ in range(int(input())):
    com, target = map(lambda x:int(x) - 1, input().split())
    if com == 0:
        print(len(x[target]))
        for y_i in list(x[target]):
            y[y_i].discard(target)
        x[target] = set()
    else:
        print(len(y[target]))
        for x_i in list(y[target]):
            x[x_i].discard(target)
        y[target] = set()
```


# E問題
https://atcoder.jp/contests/abc406/tasks/abc406_e

bitDPで、各bit桁ごとで答えに関与する回数を計算すればよい
なおbitDPの遷移がわからなくなりスキップ

# F問題
https://atcoder.jp/contests/abc406/tasks/abc406_f

オイラーツアーで順番を決め、BinaryIndexTreeで区間和を取れるようにする。
あとは辺で分ける場所を指定して区間和を取得すればよい。
なおうまく取れず惨敗
ABC406振り返り


前回の振り返り

https://qiita.com/comet725/items/89b9da9aa74126ef10fe

今日はABC406開催日だったので参加結果を振り返る


https://atcoder.jp/contests/abc406

今週はA,Bの2完(1ペナ)


# A

2つめの条件に`A==C`をつけ忘れて1ペナ

## ソースコード

```python:main.py
from bisect import bisect_left, bisect_right, insort_left, insort_right
from collections import defaultdict, Counter, deque
from functools import reduce, lru_cache
from itertools import product, accumulate, groupby, combinations
import sys
import os
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
IS_LOCAL = int(os.getenv("ATCODER", "0"))==0
err = (lambda *args, **kwargs: print(*args, **kwargs, file=sys.stderr)) if IS_LOCAL else (lambda *args, **kwargs: None)

def main():
    A, B, C, D = rLI()

    ans = A > C or ((A == C)and(B > D))

    print('Yes' if ans else 'No')
    
if __name__ == '__main__':
    main()

```

# B

10**K 以上かどうかで判断できるpythonの多倍長整数に感謝

## ソースコード

```python:main.py
from bisect import bisect_left, bisect_right, insort_left, insort_right
from collections import defaultdict, Counter, deque
from functools import reduce, lru_cache
from itertools import product, accumulate, groupby, combinations
import sys
import os
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
IS_LOCAL = int(os.getenv("ATCODER", "0"))==0
err = (lambda *args, **kwargs: print(*args, **kwargs, file=sys.stderr)) if IS_LOCAL else (lambda *args, **kwargs: None)

def main():
    N, K = rLI()
    A = rLI()
    M = 10 ** K
    ans = A[0]
    for a in A[1:]:
        ans *= a
        if ans >= M:
            ans = 1
        err(ans)
    print(ans)
    
if __name__ == '__main__':
    main()

```

# C

差分と2階差分をだしたけど
どうやって数えるのって感じ。

# D

X座標別にまとめるのとY座標別にまとめようとして
X座標で消したあとにY座標別のまとめにどう反映するかわからんかった。

# E

コンビネーションからどう短縮するの？
bitDP?

# F

貴様、木様の問題をだすのか！

# G

有名なNP問題のオマージュですか…

# 感想

CとDが閃かなくてEも無理そうだったので逃亡しました。ごめんなさい