OmniAICreator/Qiita-1.07M huggingface dataset:
[pdfcpu] pdf-cpuでbinaryからpdfをうまく読み込めない

# サマリ
* [pdf-cpu](https://github.com/pdfcpu/pdfcpu)でctxを生成するときはOptimizeを実行することを忘れないようにすること。
 * OKな例: [ReadValidateAndOptimize](https://pkg.go.dev/github.com/pdfcpu/pdfcpu/pkg/api#ReadValidateAndOptimize) を呼び出す。
 * NGな例: [ReadContext](https://pkg.go.dev/github.com/pdfcpu/pdfcpu/pkg/api#ReadContext) だけ呼び出す。エラーは返ってこないが、`ctx.PageCount`などを実行するとエラーになる。


# 内容
* golangでpdf操作ができるライブラリ。一通りの機能は備わっている。
  * https://github.com/pdfcpu/pdfcpu
* interfaceが2つある
  1. CommandFiles: 入出力pathを受け取り、入力pathのファイルを読み取り、出力pathにファイル生成するタイプ
  2. Command: reader, writerを受け取り、readerからwriterに書き出すタイプ
* 今回対象するのは2つ目。
* 2つ目の場合入力はreaderを渡すタイプとctxを渡すタイプがあり、それぞれ利用したいAPIで異なる。
  * 例1: [extractPage](https://pkg.go.dev/github.com/pdfcpu/pdfcpu/pkg/api#ExtractPage): page切り取りAPI。contextを渡す。
  * 例2: [crop](https://pkg.go.dev/github.com/pdfcpu/pdfcpu/pkg/api#Crop): pageを切り取るAPI。
* Contextを生成できるAPIは3種類（methods名末尾にFilesがついているものはpathを受け取るものであるため、省略）
  * [ReadContext](https://pkg.go.dev/github.com/pdfcpu/pdfcpu/pkg/api#ReadContext)
  * [ReadAndValidate](https://pkg.go.dev/github.com/pdfcpu/pdfcpu/pkg/api#ReadAndValidate)
  * [ReadValidateAndOptimize](https://pkg.go.dev/github.com/pdfcpu/pdfcpu/pkg/api#ReadValidateAndOptimize)
* `ReadContext` や `ReadAndValidate` を利用すると、うまくPDFを読み取ることができない。（以下コード例）
```go
ctx, err := api.ReadValidateAndOptimize(reader2, model.NewDefaultConfiguration())
if err != nil {
    return nil, errors.Wrap(err, "model.NewContext") // errorはraiseされない
}
fmt.Println(ctx.PageCount) // page数に関わらず0が出力される。
```
* よって `ReadValidateAndOptimize` を利用するように気をつけること。
  * `NewOptimize` を別途呼び出して対応することも可能
Grokは数学に強いのか？

# Grokの解析学、線形代数の実力を試してみた

## そもそもGrokのスペックは？

[Grok3 Launch](https://x.com/i/broadcasts/1gqGvjeBljOGB)によると

![Grok3 benchmark](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/ea0c3357-5e64-44f4-8343-294252e99d6b.png)

とのことらしいので実験してみた

## まずは解析学

```math
\int_{0}^{2π} 1/(2+cos(x))dx
```

グラフにすると以下のグレーの部分の面積を計算する問題
![area](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/0bdea9cb-da37-4679-8cca-ceb1df68bcbe.png)

### Grokの回答は？
![answer](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/54c74fa6-1551-4870-9578-c52d3d7c061a.png)


長いので途中を省いて

![answer](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/58f1b28e-d5e3-4066-a6bd-53e766461fe9.png)


留数定理を使った解法は

![answer](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/adc3d635-9379-4226-b1b8-55befb9b1e1c.png)

途中省略して

![answer](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/0e5fe8b7-bfaf-4f4d-8447-2c433f5c5a8a.png)

ステップ3 : 極の特定，この推論プロセスは抜け目ない!!!.

![answer](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/592cbf99-a7b0-4991-a1e2-8cbbd8996bb6.png)

自分には非の打ちどころがない回答に見えます.

## 次は線形代数

```math
\mathrm{rank}
\begin{vmatrix}
a & b & c\\
b & c & a\\
c & a & b\\
\end{vmatrix}
```

ポイントはa,b,cの値によってrankが0から3まで変化する点です.
### Grokの回答は？

![answer](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/15daae81-ab27-4911-adb3-3cb4b3b4661b.png)

![answer](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/ab374e07-2fa8-4b66-b66a-082d377f68ce.png)

![answer](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/ab1bdadd-21f5-48ca-8dec-6c0c299773a5.png)

途中省略して

![answer](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/dd8535c7-d7f7-46d4-b4bb-2f694897f267.png)

一か所日本語的にややこしい表現があり
a,b,c がすべて 0 でない場合 ⇔ not (a=b=c=0) と解釈するとこの回答は自分的にはperfectです.

※「すべて 0 でない場合」 は 「a≠0 かつ b≠0 かつ c≠0」 という解釈もできなくはない

## 感想

ChatGPTが登場したころは生成AIは数学が苦手？という噂を耳にしましたが最近の生成AIは少しづつ苦手を克服しつつあるように感じました.
【OCI】アカウント作成＆コンソールログイン

## 1. はじめに
**📌 参考:**  
本記事は OCI 公式ドキュメントを参考にしています。  
- 👉[Oracle Cloud Infrastructureドキュメント](https://docs.oracle.com/ja-jp/iaas/Content/home.htm)  

### 1.1 執筆の動機
- そのうちOCIに触れることになりそうだから。
- OCIアカウントの作成からコンソールログインまでの流れを確認しておきたい。

### 1.2 想定読者
- OCIの学習用途でアカウント作成をやっておきたい人

### 1.3 OCIとは？
- Oracle社が提供するクラウドサービスのこと。
採用する企業が増えてきているとかで、ニュースで聞く機会が増えた印象。

## 2. OCIアカウントの作成
### 2.1 OCI公式サイトへのアクセス
[https://signup.oraclecloud.com/](https://signup.oraclecloud.com/) に移動します。 

### 2.2 メール認証
メール認証に必要な情報を入力する。

| 項目 | 入力内容 |
|------|----------|
| **国/地域** | 日本 |
| **名前/性** | 任意の漢字 |
| **電子メール** | メールアドレス |

**私は人間です**の画像認証後に、**電子メールの検証**をクリックする。  
![CleanShot 2025-02-24 at 13.30.17@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007885/b280fbd3-3049-4323-87eb-2167b0f307cc.png)

メールを受信後に、**Verifyemail** をクリックする。
![CleanShot 2025-02-24 at 13.54.32@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007885/e72406cc-efe2-42a1-9c56-24bbfc5d8490.png)

### 2.3 アカウント情報登録
| 項目                  | 入力内容 |
|-----------------------|---------------------------|
| 別名                  | 英字 |
| パスワード            | パスワードポリシーに基づいて入力する |
| Customer type        | 個人利用なので `Individual` を選択した |
| クラウドアカウント名  | 任意の文字列（小文字） |
| ホームリージョン      | 任意で選択 |
| 使用条件の確認        | 確認したら **続行** をクリックする |

![CleanShot 2025-02-24 at 14.40.52@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007885/ead0a013-fc6f-45ee-ac1d-73f93165e4c5.png)

### 2.4 クレジットカード情報登録
クレジットカードを情報を入力する。（特に難しい点はないので、画面の指示に従って入力すればOK）
![CleanShot 2025-02-24 at 15.16.17@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007885/bf674852-bf96-4bf7-8be7-9310ca264022.png)

### 2.5 無料トライアルの開始
クレジットカード情報登録の完了後、**無料トライアルの開始**をクリックする。
![CleanShot 2025-02-24 at 15.20.56@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007885/1b729bb5-a71c-445e-9450-43ad11417c49.png)

:::note alert
ここでエラーが表示された☹️
私はここで**認証エラー**のメッセージが出て次に進めませんでした。（2回失敗）
時間をおいて3回目のやり直しで次に進むことができました。原因は不明ですが、もし同じエラーが出た場合は、数分待ってから再試行すると解決するかもしれません。
:::


エラーが発生しなければ以下画面に遷移します😋
![CleanShot 2025-02-24 at 15.51.19@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007885/59fc1ca5-e010-47a6-9269-5d08321469c7.png)

その後、サインイン画面が表示されました
![CleanShot 2025-02-24 at 15.51.50@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007885/2cf0a3c1-c5d7-4a1a-9b09-eeafe2627924.png)

サインインするとコンソールが表示されました。
![CleanShot 2025-02-24 at 17.23.43@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007885/a6fadfd8-e229-414f-89a4-d1512682c531.png)

---
MFA設定だけ実施して、今日はここまでにしました！
今後も色々と触っていこうと思います。
この記事がどなたかの参考になれば幸いです 😊💡
【個人開発】名刺アプリ開発の振り返り (React、TypeScript、Jest、Firebase、Supabase、GitHub Actions)

# はじめに
開発が以前より楽になっています。
少しずつですが、技術力が上がっている実感があります。

# 成果物
### デジタル名刺アプリの作成

### 機能
- 名刺登録
- 名刺表示
    - アイコンにリンクを貼る
- supabaseで中間テーブルを利用してデータ管理
- GitHub actionsでcronを使って指定時刻にデータ削除
- Jestを使ってテスト(非同期処理含む)

### 画面
<img width="30%" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881019/5c2a3ede-d566-4b46-b184-f9c098328fb3.png">

<br/>
<br/>

<img width="30%" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881019/0deef92c-378e-4f89-b90c-b666af8d56b0.png">

<br/>
<br/>

<img width="30%" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881019/9b9561ee-1e5f-4dfa-aa0c-3aef9a8c0fae.png">


### GitHub
https://github.com/box-7/digital-name-card/blob/main/README.md

### Qiitaへの記事投稿5本

[ChakraUI version 3.5.1 ナビゲーションを配列(map)を使って利用する方法](https://qiita.com/like-mountain/items/25ab167c57a820b3c377)

[ChakraUI version 3.5.1 Fieldset(Form機能)を使って、送信する方法](https://qiita.com/like-mountain/items/b443b78671aa723ad6a6)

[【React, Jest】 map関数で回転させる時のルート要素の記述方法 ](https://qiita.com/like-mountain/items/cb4facd465be903565e5)

[【Jest】Reactの選択肢の入力フォームで、GitHub Actionsでの非同期処理テストの問題解決](https://qiita.com/like-mountain/items/3e90b1d939604c0b87b2)

[Visual Studio Codeの拡張機能「Code Spell Checker」（cSpell）で、「Unknown word」（未知の単語のアラート）が出る](https://qiita.com/like-mountain/items/7583a595c38fa2ba6ca6)


# 気づき

AIに使用する際、以下を注意しました。

- AIに聞いた後、何をやっているかを理解した上で使用する
- まず何をしたいか明確にする
- AIに指示されるまま無制限にトライアンドエラーをするのではなく以下を確認するようにした
    - 「やりたいこと」に沿っているか確認
	- コードがある場合、自分なりにおかしいと思われる箇所を特定した上で質問する(何も考えていないと、AIに言われるままトライアンドエラーをし続けて時間を溶かしてしまう)

上記を実行した結果、以前より答えに至るスピードが上がったと思います。

# 使用技術
React
TypeScript
Firebase
Supabase
GitHub Actions
Jest
Prettier
ESLint
vite
ChakraUI
Makefile

# 終わりに
少しずつですが、技術力が上がっている実感が出てきたので良かったです。

今までは時間をあまり気にせず問題を解決していましたが、これからはスピードも意識します。
問題に対して必要時間を予想し、実際にかかった時間を確認しながら進めていきます。

課題5は自由課題なので楽しみです。
引き続きがんばります。
Arc ブラウザに後からブックマークをインポートする方法

# 概要
Arc に Chrome のブックマークを後からインポートする手順についてまとめる

# 動作環境
- macOS

# 手順
1. Arc を立ち上げる
1. 画面上部のアップルアイコン右隣の「Arc」を選択
1. 「Import from another browser」を選択
    1. ![スクリーンショット 2025-02-24 17.21.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575599/07104749-6c80-4c98-bb50-7f7aa7c0002c.png)

1. ポップアップにてインポート元のブラウザとユーザを選択する
1. ポップアップにてインポート先のユーザを選択する
1. ポップアップにてインポートするブックマークを選択する
    1. 全てを取り込む場合は最上部にある「Select All 」
1. 「Imported From Chrome」というピンが追加されるので整理して完了
Web会議で画面共有しながら話す時に使ってるツール（ZoomIt、PowerToys）

# はじめに
タイ行ってない期間が２ヶ月を超えて、そろそろ元気がなくなってきたノベルワークスのまとっち（[@matoi_thai](https://x.com/matoi_thai)）です。

本記事では僕がWeb会議で使ってるツールと使いどころを紹介します。（ツールは有名過ぎてみんな知ってると思います）

## こんな人に見てほしい
- Web会議で画面共有しながらファシリテートする人

# 僕がWeb会議で使ってるツール
<b>ZoomIt</b>と<b>PowerToys</b>です。どちらもMicrosoftが開発・提供してるツールです。

## ZoomItとは
<b>Microsoftのプレゼンテーション補助ツールです。</b>

https://learn.microsoft.com/ja-jp/sysinternals/downloads/zoomit

※👇この記事で全ての機能が分かりやすく説明されてます。

https://zenn.dev/yamad365/books/b31e233d608c49/viewer

### 僕が使ってるZoomItの機能

画面のズーム・ペン色変更・文字入力・タイマー表示とか色々できるんだけど、なんだかんだで、本当に必要な下記４つの機能に落ち着きました。むしろ、誤作動しないように、その他の機能はほとんど無効にしてます。

| ショートカット | 機能 |
|:-:|:-:|
| Ctrl + 2 | 描画を開始 |
| ドラッグ | 手書き |
| Shift + ドラッグ | 直線|
| Ctrl + ドラッグ | 四角形 |

### こんな感じでZoomIt使ってます

:::note info
視覚的に理解してもらいたい時に、簡単な絵を描く。
:::

![ZoomIt-1-_1_.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/345d99aa-e49d-49cc-ab92-46f64e98dedc.gif)

## PowerToysとは
<b>Windowsを便利にカスタマイズできるツールの集合体です。</b>

https://learn.microsoft.com/ja-jp/windows/powertoys/

※👇この記事で全ての機能が分かりやすく説明されてます。

https://qiita.com/taqumo/items/184d8608cd83b4906d96

### 僕が使ってるPowerToysの機能

マウスポインタ強調・ウィンドウ配置・サムネイル表示・画像サイズ変更とか色々できて、最初のうちは楽しいんだけど、他のツールで代用できたり、使用頻度が少ないとかで、今は下記の機能しか使っておりません。

| ショートカット | 機能 |
|:-:|:-:|
| Win + Ctrl + T | 特定のウィンドウを常に上に表示 |

### こんな感じでPowerToys使ってます

:::note info
認識間違いが無いように、常に相手に議事メモが見えるようにする。
:::

![PowerToys-_1_.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/6b2b4ff1-c669-4397-bb5e-8166f170f77d.gif)


# おわり！
この２つのツールをここ１年で知ったので、僕は遅れている方かと思いますが、まだ知らない方の参考になればと思い、書いてみました。
モノリシックから MSA への移行時の主な課題

### **モノリシックから MSA への移行時の主な課題と解決策**  

モノリシックアーキテクチャから **MSA（マイクロサービスアーキテクチャ）** へ移行する際、  
主な課題として **ネットワーク遅延、分散トランザクション、可用性の問題** が発生します。  
それぞれの問題点と解決策を簡潔にまとめます。  

---

## ネットワーク遅延 (Network Latency)
### **問題点**  
- モノリシックでは、メソッド呼び出しによる**高速なデータ処理**が可能  
- MSAでは、**マイクロサービス間の API 通信**が発生し、**レスポンス遅延**のリスクがある  
- **N+1 クエリ問題** や **多段階リクエスト** によるオーバーヘッドが発生  

### **解決策**  
 **非同期通信とイベント駆動アーキテクチャの導入**  
- Kafka、RabbitMQ などのメッセージブローカーを活用し、**非同期イベント処理**を実装  
- **重要な処理は同期（HTTP, gRPC）、補助的な処理は非同期（Kafka, Pub/Sub）** に分ける  

 **API Gateway & BFF（Backend for Frontend）パターンの活用**  
- API Gateway を導入し、**複数のマイクロサービスのデータを統合して返却**（レスポンスの最適化）  

 **データキャッシュ（Redis, CDN など）の活用**  
- **頻繁にアクセスされるデータをキャッシュ化**し、API 呼び出し回数を削減  


## **トランザクション (Transactions)**  
### **問題点**  
- モノリシックでは、**単一データベースで ACID トランザクションを保証**可能  
- MSAでは、複数のデータベースにまたがる **一貫性の確保が困難**  
- 例：注文は作成されたが、決済が失敗した場合 → **データ不整合が発生**  

### **解決策**  
**SAGA パターンの適用（オーケストレーション vs コレオグラフィ）**  
- **オーケストレーション（Orchestration）**：中央の管理サービス（Temporal, Camunda など）がワークフローを制御  
- **コレオグラフィ（Choreography）**：各サービスがイベントベースで連携（Kafka, RabbitMQ など）  

**補償トランザクション（Compensating Transactions）を実装**  
- トランザクションが失敗した場合、ロールバック用の**補償処理**を実行  
- 例：決済に失敗したら、注文データを自動キャンセル  

**最終的な一貫性（Eventual Consistency）を考慮**  
- **リアルタイムの整合性ではなく、一定時間後にデータを同期する設計**を採用  

## **可用性の問題 (Availability & Fault Tolerance)**  
### **問題点**  
- モノリシックでは、**単一システムの稼働が維持されていれば問題なし**  
- MSAでは、**1つのサービスの障害が全体のシステムダウンにつながるリスク**がある  
- サービス間の依存関係が増えると、**障害が連鎖的に拡大**する可能性がある  

### **解決策**  
**サーキットブレーカー（Circuit Breaker）の導入**  
- 障害が発生したサービスへのリクエストを**一定時間ブロック**し、システムを保護  
- Netflix Hystrix, Resilience4j を活用  

**リトライ（Retry）& タイムアウト（Timeout）の設定**  
- API 呼び出しの際に **リトライ制御と適切なタイムアウトを設定**し、障害の影響を最小化  

**オートスケーリング（Auto-Scaling）& 負荷分散（Load Balancing）**  
- トラフィックの増加に応じて**自動スケールアウト**（Kubernetes, AWS Auto Scaling）  
- 負荷を分散するために **ロードバランサーを活用**（NGINX, AWS ALB）  

**フェイルオーバー & レプリケーション**  
- **DB・サービスインスタンスの冗長化（Replication）を実施**し、障害時も継続稼働  
- 例：**プライマリ-レプリカ構成、マルチリージョンデプロイ**  


### まとめ：MSA 移行時の課題と解決策**  
| 課題 | 解決策 |  
|------|--------|  
| **ネットワーク遅延** | **非同期通信（Kafka）、API Gateway、キャッシュ（Redis）** |  
| **分散トランザクション** | **SAGA パターン、補償トランザクション、最終的な一貫性** |  
| **可用性の問題** | **サーキットブレーカー、Auto-Scaling、フェイルオーバー** |  

**MSA はスケーラビリティに優れるが、ネットワーク遅延やデータ整合性を考慮した設計が不可欠！**  
→ **非同期イベント駆動 & 障害復旧戦略の適用**で、安定した MSA の構築が可能
Kotlin Koans やってみた 9

# Classes
## Smart casts
### 問題
以下の Java コードを スマートキャストと when 式 を使用して書き換えてください。
```java
public int eval(Expr expr) {
    if (expr instanceof Num) {
        return ((Num) expr).getValue();
    }
    if (expr instanceof Sum) {
        Sum sum = (Sum) expr;
        return eval(sum.getLeft()) + eval(sum.getRight());
    }
    throw new IllegalArgumentException("Unknown expression");
}
```

### 解答
```kotlin
fun eval(expr: Expr): Int =
        when (expr) {
            is Num -> expr.value
            is Sum -> eval(expr.left) + eval(expr.right)
            else -> throw IllegalArgumentException("Unknown expression")
        }

interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr
```

### 解説
[Kotlin 公式ドキュメント > Smart casts](https://kotlinlang.org/docs/typecasts.html#smart-casts)

#### Smart casts
ほとんどの場合、明示的なキャスト演算子を使用する必要はありません。コンパイラが自動的にオブジェクトをキャストしてくれるからです。これをスマートキャストと言います。コンパイラは、イミュータブルな値に対する型チェックと明示的キャストを追跡し、必要に応じて暗黙的な（安全な）キャストを自動的に挿入します。

```kotlin
fun demo(x: Any) {
    if (x is String) {
        print(x.length) // x は自動的に String 型にキャストされる
    }
}
```
<br>
コンパイラは、否定的なチェックが返り値に繋がる場合、キャストが安全であることも認識できるほど賢いです。

```kotlin
if (x !is String) return

print(x.length) // x は自動的に String 型にキャストされる
```
<br>

##### Control flow
スマートキャストは、`if` 条件式だけでなく、`when` 式や `while` ループでも機能します。

```kotlin
when (x) {
    is Int -> print(x + 1)
    is String -> print(x.length + 1)
    is IntArray -> print(x.sum())
}
```
<br>

`if`、`when`、または `while` の条件で変数を `Boolean` 型として宣言すると、コンパイラがその変数について収集した情報が対応するブロック内でスマートキャストのために利用できるようになります。
<br>

これは、ブール条件を変数に抽出するような操作に役立ちます。変数に意味のある名前を付けることで、コードの可読性が向上し、後でその変数を再利用できるようになります。

```kotlin
class Cat {
    fun purr() {
        println("Purr purr")
    }
}

fun petAnimal(animal: Any) {
    val isCat = animal is Cat
    if (isCat) {
        // コンパイラは isCat に関する情報にアクセスできるため、
        // animal が Cat 型にスマートキャストされたことを認識します。
        // そのため、purr() 関数を呼び出せます。
        animal.purr()
    }
}

fun main(){
    val kitty = Cat()
    petAnimal(kitty)
    // Purr purr
}
```


# おわりに
スマートキャストは、型チェックをしたあとに、その型を自動的に適切に型キャストしてくれる仕組みなんですね。難しく感じるのは Java を知らないからなんだろうなー。
`is` はプリミティブ型でもオブジェクト型でも型チェックに使える点は JavaScript より便利そうだなって感じる。

---

[← 前回の記事](https://qiita.com/b-yuko/items/5d3ad8151276d98b73fe)
Windowsでフォルダのサムネイル(アイコン)を変更する方法

# はじめに
こんにちは、ただのぶたぁです。
個人開発をしている中でパソコン内のフォルダにサムネイル(アイコン)を設定する方法を探していたのですが、あまり情報が出なかったため書きました。

# ディレクトリ構成
```
├── sample
│    ├── desktop.ini    フォルダのアイコンを設定するファイル
│    └── image.ico    アイコン画像
│
├── main.py     Pythonでアイコンを設定するスクリプト
└── main.go     Goでアイコンを設定するスクリプト
```
# 手順
**コマンドプロンプトを操作できる言語であればGo, Pythonにかかわらずできます。**

1\. `desktop.ini`を作成する
2\. `desktop.ini`に必要なことを書き込む
3\. `desktop.ini`を隠しフォルダにする (`attrib +h`)
4\. 親ディレクトリ(今回では`sample`フォルダ)に対してシステム権限を付与する (`attrib +s`)

### desktop.iniの内容
```desktop.ini
[.ShellClassInfo]
IconResource = image.ico,0
```
- IconResource = { アイコンのパス },0
  - { アイコンのパス } の部分に image.ico の絶対パスまたは相対パスを指定
  - 0 はアイコンのインデックス（ 通常は 0 でOK ）

# 実装例
### Go
```main.go
package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	// desktop.iniのパスとアイコンのパスを指定
	desktopIniPath := "./sample/desktop.ini"
	imageIcoPath := "image.ico" // desktop.iniから見たアイコンのパス

	// desktop.iniを作成して内容を書き込む
	file, err := os.Create(desktopIniPath)
	if err != nil {
		fmt.Println("desktop.iniを作成できませんでした:", err)
		return
	}
	defer file.Close()

	// .ShellClassInfo の設定を書き込む
	_, err = file.WriteString(fmt.Sprintf("[.ShellClassInfo]\nIconResource=%s,0\n", imageIcoPath))
	if err != nil {
		fmt.Println("desktop.iniに書き込みができませんでした:", err)
		return
	}

	// attribコマンドでdesktop.iniを隠しファイルにする
	cmd := exec.Command("attrib", "+h", desktopIniPath)
	err = cmd.Run()
	if err != nil {
		fmt.Println("desktop.iniを隠しファイルにできませんでした:", err)
		return
	}

	// sampleフォルダにシステム属性を付与
	cmd = exec.Command("attrib", "+s", "./sample")
	err = cmd.Run()
	if err != nil {
		fmt.Println("sampleフォルダにシステム属性を付与できませんでした", err)
		return
	}

	fmt.Println("処理が終わりました")
}

```
### Python
```main.py
import subprocess

# desktop.iniのパスを指定
desktopIniPath = "./sample/desktop.ini"
imageIcoPath = "image.ico"  # desktop.iniから見たアイコンのパス

# desktop.iniを作成し、アイコンの設定を書き込む
with open(desktopIniPath, 'w') as f:
    f.write(f'[.ShellClassInfo]\nIconResource="{imageIcoPath}",0\n')

# コマンドプロンプトでattribコマンドを実行して、desktop.iniを隠しファイルにする
subprocess.run(['attrib', '+h', desktopIniPath])

# sampleフォルダにシステム属性を付与
subprocess.run(['attrib', '+s', './sample'])

print("処理が終わりました")
```
# 反映までに時間がかかる問題
プログラムを実行して、ある程度の時間がたたないとサムネイル(アイコン)が反映されない場合があります。
おそらく原因は、Windowsのキャッシュが影響して、変更がすぐに反映されないためだと思われます。

**基本的には、しばらく時間が経てば自動的に反映されるので、特に気にする必要はありません。**

もし長時間経っても反映されない場合は、**パソコン** や **エクスプローラー** を再起動する ことでキャッシュがリフレッシュされ、反映される可能性があります。
# 参考サイト
https://teratail.com/questions/132j6pym2ic60w

https://learn.microsoft.com/ja-jp/windows/win32/shell/how-to-customize-folders-with-desktop-ini

https://www.bugbugnow.net/2020/09/desktopini.html
Graph API でユーザーの作成

1.はじめに
Entra ID に Graph Explorer を使ってユーザーを作成する記事がなかったので自分の備忘として残します。

この辺を参考にしてます。
https://learn.microsoft.com/ja-jp/graph/api/user-post-users?view=graph-rest-1.0&tabs=http

2.Entra ID にアプリを登録する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/e14b0314-4240-401d-a8ee-74ceda14c74b.png)

3.任意の名前でアプリを登録する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/0b6068c1-9533-43ec-a385-25e0ee46ccbe.png)

4.証明書とシークレットから新しいクライアントシークレットを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/eaf6cb44-1742-4c23-8a45-700981228b0d.png)

任意の名前を設定し追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/87cfdca1-695e-49f9-90ee-980e9b31c0e0.png)

5.API のアクセス許可からアクセス許可を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/a7dc32fa-db7d-4bb1-b344-d8d24c6ee922.png)

MS Graph を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/aad614d0-bff0-40eb-a556-efa00632fb53.png)

アプリケーションの許可を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/a9d88ca2-bcd9-44da-943c-5e2b4d523476.png)

User.ReadWrite.All 権限を付与する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/536d538b-d434-4952-9ad3-6051f1123a4c.png)

6.管理者の同意を付与
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/680eb8fd-0919-4ab4-887d-0741e4f67a09.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/9228dfe7-ef16-4df0-8346-d12cf875ec73.png)

付与されました となっていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/cf9a3b69-f1ca-45af-9b4e-2be654387949.png)

7.Graph Explorer でログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/673adbf6-1c4c-4c5f-8627-12fcee5f0a7d.png)

グローバル管理者権限でログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/cf75a9ff-62a3-414f-b01d-434ea7e5d233.png)

8.権限を要求する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/a1b8080a-f1c8-41d6-83c2-2c4b2ae81412.png)

任意で組織の～にチェックを入れ、Acceptを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/d0c5d42f-67a8-489b-9194-10e6f9c64247.png)

9.サンプルクエリから create user を検索し選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/8831ad07-1531-497c-9ef3-470eb69e9baf.png)

10.POST を選択し、Body 内のデータを任意に変更し、Run Query を選択
※userPrincipalName のドメイン名は利用テナントのドメインを要設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/74ec756c-dc93-4084-bdd6-5b27439d45d7.png)

HTTP ステータス201が返ってきたら成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016871/dd4159dd-c38e-40b9-a8b7-307ed97fc640.png)


まとめ
Graph API を使ったユーザー作成は API駆動型インバウンドプロビジョニングのようにまとめてユーザー作成できず、ステータス201が返ってきたら次作成の流れなので一括でユーザー作成とかには向かないのかも
並列で作れば行けるかも？でもEntra側のスロットリングにはじかれそう

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。
固定グローバルアドレスも外部ポート開放することなくローカルの管理ツールにインターネットからアクセスしてみた

ZabbixやNagiosなど、現場のネットワーク機器やサーバーを監視するためのソフトウェアをインターネット越しに操作する場合、固定グローバルアドレスやダイナミックDNSなどを利用する事を考えますが、インターネット側にZabbixなどの監視ツールを公開することはセキュリティ上のリスクが発生するため、躊躇する場合もあるかと思います。

#### KUROKO Connectは、現地環境をインターネットに晒すことなく（ポート開放することなく）、現地のZabbixなどの監視ツールに安全にアクセスする手段を提供しています。

今回は、ログ収集、監視ツールとして「LogStare Collector（以下LSC)」を使用して、インターネット越しにLSCへ接続してみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/ecfe631d-8230-40db-b344-7c68d056067a.png)

LSCについての詳細はこちらのサイトを参照ください。
[LogStare Collector ダウンロード](https://www.logstare.com/lsc_free_download/?rfr=ksside)
[KnowledgeStare](https://www.secuavail.com/kb/)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/7dbc3a19-e80e-43f8-b8f0-c2b2386745bb.png)

今回の構成イメージです。
Linuxサーバー上でLSCが稼働しています。
インターネットとはファイアウォールでPPPoE接続しており、固定のグローバルIPアドレスはありません。
また、ファイアウォールで、外部へのポート開放もしていないので、直接LSCの画面にアクセスすることはできません。

# 1. LinuxサーバーにKUROKO Appsをインストールする
KUROKO Connectコンソール画面にログインして、Linuxサーバー用のインストーラーをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/167d8d00-0937-4f8c-91f9-9baa710a5aed.png)

KUROKO Appsのインストール方法は、こちらの記事を参照してください。
[インストール方法](https://qiita.com/MCREST/items/29fc6b567801c081deca)

# 2. 接続先設定をする
LSCは、インストール後は　HTTP（TCP80）で動作します。
インストールした KUROKO AppsのActionsをクリックし、「接続先一覧」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/24635a29-c670-4e35-8735-cde38155e78b.png)

接続先一覧画面から「新規登録」ボタンを押し、LSCの情報を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/f43d67cd-a76f-4a60-95fe-a1bc875898be.png)


:::note info
**ポイント**
KUROKO Connectでは、HTTP（TCP80）の暗号化されていないWebアプリケーションの接続はHTTPSの暗号化した通信でラッピングされます。
:::

これでLSCにインターネットからアクセスする準備はできました。

# 3. LSCにアクセスしてみる
KUROKO  Connectコンソール画面から、該当Appsを選択し、
接続先で先ほど登録した「LSC」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/1e177327-4af0-44fe-a7dd-d0d224cb7f75.png)

「接続」ボタンをクリックして、LSCへの接続情報を取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/a4c912ee-cca8-4b1d-ac9a-c6274005fd2d.png)

生成されたURLをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/b90c50ba-1238-44f2-830f-d7bef31d424f.png)

ローカル環境にインストールしたLSCへインターネット越しからアクセスできました。
HTTPSで暗号化もされているので、安心して操作できますね。

今回はKUROKO Connectを活用して、ローカルで動く監視ツールを安全にインターネット越しにアクセスする方法を実際に試してみました。
ローカルで動く暗号化されていないHTTPの管理システムなどもKUROKO Connectを使用すれば、HTTPS化してアクセスできるので安心して利用できることがわかりました。
SQL

## Db2の場合

```
$ db2

list db directory

connect to データベース名

describe table GOALS

select distinct(HEIGHT) from PLAYERS

Db2の場合　時刻取得

db2 => values current timestamp

1
--------------------------
2025-02-24-16.47.05.196813

db2 => SELECT current date FROM sysibm.sysdummy1;

1
----------
2025-02-24


```


https://blog1.mammb.com/entry/20091223/1261929230
Vueで"Vue app aliases are not allowed in server routes."のエラー

## 以下のコードでVue app aliases are not allowed in server routes.のエラーが出る
Vueのアプリでnuxt.config.jsonで設定したsecretを読み取ろうとしたところ、エラーになりました。
app/server/api/hoge.ts
```TS
import { useRuntimeConfig } from '#app';

export default defineEventHandler((event) => {
  console.log(runtimeConfig.public.secret);

  return {
    hello: 'hello'
  }
})
```

## 修正方法
useRunTimeConfigのインポートの仕方がサーバーサイドだと#importsになるようです。
```TS
import { useRuntimeConfig } from '#imports'; // ここを修正

export default defineEventHandler((event) => {
  console.log(runtimeConfig.public.secret);

  return {
    hello: 'hello'
  }
})
```

正常にログが出力されました。
Nuxt のサーバールートでは #app ではなく #imports を使う必要がありました。
Data Cloud Enrichments データクラウドエンリッチメント


Sales Cloud のレイアウトに Data Cloud 関連オブジェクトを追加します

https://trailhead.salesforce.com/content/learn/modules/data-cloud-enrichments

# アカウントのケースを計算するためにデータクラウドを構成する

+ Salesforce CRM データ用のデータ ストリームを作成します。
+ データ マッピングを確認します。
+ 計算されたインサイトを使用して、参照関係を持つオブジェクトのロールアップ サマリーを作成します。

### コピー フィールド エンリッチメントとは何ですか?

コピー フィールドのエンリッチメントを使用すると、貴重な Data Cloud の分析情報を CRM に直接コピーして、コードを記述することなく、すべてのデータ ソースから関連性のある最新の分析情報をユーザーに提供できます。たとえば、すべての事業部門のアカウントの合計生涯価値を Sales のカスタム Total LifeTime Value フィールドにコピーして、営業チームに主要顧客に関する貴重な分析情報を提供できます。

### 営業担当者が自分のアカウントの未解決ケースをすぐに確認できるようにする

あなたは Data Cloud 管理者で、営業担当者がアカウントのサービスエスカレーションについてより詳しく知ることができるようにしたいと考えています。この情報があれば、営業担当者はすぐに連絡を取り、代替製品やサポートパッケージを宣伝できます。営業担当者の Wataru は、アカウントとつながり、新しいソフトウェアパックのプロモーションについて知らせたいと考えています。一部のアカウントには未解決のケースがいくつかあることはわかっていますが、新しいソフトウェアパックによって顧客の問題が解決されます。

+ プロモーションに関する素晴らしいニュースを共有できるように、オープンケースの数が多い取引先をすぐに確認する必要があります。
+ 会社のすべてのサービス組織のケースの合計とオープンケースの合計を表示するコピー フィールド強化を取引先に作成します。

上記から考えると複数のSalesforceの組織がある？１つしかなければ、別にこの機能を使わなくてもフローなどの自動化処理を使って同じことができそう。

### 計算された洞察力を生み出す

ケース情報の概要でアカウントを充実させるには、以下の手順に従って、アカウントのケースの合計数とオープンケースの合計を計算する計算されたインサイトを作成しましょう。このタイプの計算は、ロールアップ サマリーと呼ばれます。

>計算されたインサイトを使用して、多次元メトリックを定義および計算できます。コピー フィールド エンリッチメントで計算されたインサイトを使用するには、計算されたインサイトに単一のディメンションが必要です。

:::note
計算されたインサイトとは、データから特定の計算や分析を行って得られる情報のことです。これを使うことで、複数の異なる指標（メトリック）を組み合わせて、より複雑な分析が可能になります。

例えば、売上データと顧客データを組み合わせて、特定の顧客セグメントごとの売上を計算することができます。これにより、どの顧客層が最も利益をもたらしているかを把握することができます。
:::

:::note
コピー フィールド エンリッチメントとは、既存のデータフィールドに新しい情報を追加するプロセスです。計算されたインサイトをこのプロセスで使用する場合、インサイトには単一のディメンション（次元）が必要です。

例えば、顧客の年齢というフィールドに対して、計算されたインサイトとして「平均購入額」を追加する場合、年齢という単一のディメンションに基づいて計算されたインサイトを使用します。

これにより、特定の年齢層の顧客が平均してどれくらいの金額を購入しているかを簡単に把握することができます。
:::

+ 管理者は、個人または組織に関する一般的な情報を使用するエンリッチメントを Sales Cloud に作成したいと考えています。データ ストリームを設定するときに、どのカテゴリを使用すればよいですか。

プロファイル

+ 計算されたインサイトからコピー フィールドのエンリッチメントを強化したい場合、計算されたインサイトにはいくつのディメンションが必要ですか?

ひとつ


# 設定方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/173907ef-be6a-4e09-bd74-d52ab8678fcc.png)

実際には... やっぱり最初にはデフォルトはないなぁ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/431c5122-9104-4a78-b8bd-629197096434.png)

編集ボタンをクリックしてみるとデフォルトがあるなぁ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a54318a6-98de-4b29-baaa-63fdc90fd657.png)

確認？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e8701095-b84d-4bb2-9377-c5766ff5de6f.png)

この組織ではどうも管理者でないみたい？

この権限セットを割り当てるとエラーになるなぁ

:::note alert
Failure : entity type cannot be inserted: Permission Set Assignment
:::

HOC Data Cloud UserのプロファイルでSalesforceライセンスはあるけど...

この環境ではシステム管理者になれん... 使えない
React.FCとは？

## React.FC を使うパターン

コンポーネントが受け取るpropsとReact.FCを使ってコンポーネントの型を定義する。
```TypeScript
import React from 'react'

type Props = {
  name: string;
};

const Component: React.FC<Props> = ({ name }) => {
  return <h1>Hello {name}</h1>;
};

export default Hoge
```


## React.FC を使わない書き方

関数の引数と戻り値の型を個別にしていした関数としてコンポーネントを定義する。
```TypeScript
type Props = {
  name: string;
};

const Component = ({ name }: Props): React.JSX.Element => {
  return <h1>Hello {name}</h1>;
};

export default Hoge

```
最近では、React.FC の使用を避けることが推奨されている。
・ジェネリクス(型パラメーター)が使えないから。
・children を含めたい場合は明示的に定義した方が良い。
・関数の戻り値が JSX.Element だと明示的にできる。
【論文まとめ】STN(Spatial Transformer Network)

## 前提の確認
### STNの概要
![STN_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936087/f573bb06-327f-4e86-a38b-5bc8eeb6dfa2.png)
[STN(Spatial Transformer Network)論文](https://arxiv.org/abs/1506.02025v3) Figure 1

STN(Spatial Transformer Network)は上図の(a)のようにランダムな変形・サイズ変更・回転などによって歪められた入力の取り扱いができるようにAffine変換のような変換の学習をCNNに導入することを試みた研究です。STNは主に下記の3つのステップから構成されます。

![STN_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936087/8429bb3e-7d5b-4fa5-9cf9-36daa5eea811.png)
[STN(Spatial Transformer Network)論文](https://arxiv.org/abs/1506.02025v3) Figure 2

```
1. Localisation Network
2. Parameterised Sampling Grid
3. Differentiable Image Sampling
```

1〜3の詳細については次節で詳しく確認します。


### Affine変換とパラメータ行列
2DのAffine変換は下記のような式で表されます。

```math
\begin{align}
\left(\begin{array}{c} x' \\ y' \end{array} \right) &= A_{\theta} \left(\begin{array}{c} x \\ y \\ 1 \end{array} \right) \\
  &= \left(\begin{array}{ccc} \theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21} & \theta_{22} & \theta_{23} \end{array} \right) \left(\begin{array}{c} x \\ y \\ 1 \end{array} \right)
\end{align}
```


## STNの詳細
### Localisation Network
Localisation Networkは特徴マップ(Feature map)からAffine変換に用いるパラメータの$\theta$の計算を行うニューラルネットワークです。入力となる特徴マップ$U \in \mathbb{R}^{H \times W \times C}$に対し、下記のように定義されます。

```math
\begin{align}
\theta = f_{\mathrm{loc}}(U) \in \mathbb{R}^{d}
\end{align}
```

たとえば2Dのアフィン変換は下記のように6個のパラメータで表されるので基本的には$d=6$です。

```math
\begin{align}
\left(\begin{array}{c} x' \\ y' \end{array} \right) &= A_{\theta} \left(\begin{array}{c} x \\ y \\ 1 \end{array} \right) \\
  &= \left(\begin{array}{ccc} \theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21} & \theta_{22} & \theta_{23} \end{array} \right) \left(\begin{array}{c} x \\ y \\ 1 \end{array} \right)
\end{align}
```

一方で変換によってはパラメータに制約がある(たとえば拡大の場合は$\theta_{11}=\theta_{22}=s, \theta_{12}=\theta_{13}=\theta_{21}=\theta_{23}=0$)ので、$\theta$の次元は問題によって調整が必要です。


### Parameterised Sampling Grid
![STN_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936087/594a302f-33df-4918-861f-e1fd4fddec74.png)
[STN(Spatial Transformer Network)論文](https://arxiv.org/abs/1506.02025v3) Figure 3

Parameterised Sampling Gridの概要は上図を元に掴むと良いです。output(target)の$V$の網目状のグリッド$G=\{ G_{i} \}$に対し、$\mathcal{T}_{\theta}$に基づく下記のようなアフィン変換を行って「output(target)のグリッドに対応するinput(source)上の位置を得る」と理解すれば良いです。

```math
\begin{align}
\left(\begin{array}{c} x_{i}^{s} \\ y_{i}^{s} \end{array} \right) &= \mathcal{T}_{\theta}(G_{i}) \\
  &= A_{\theta} \left(\begin{array}{c} x_{i}^{t} \\ y_{i}^{t} \\ 1 \end{array} \right) \\
  &= \left(\begin{array}{ccc} \theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21} & \theta_{22} & \theta_{23} \end{array} \right) \left(\begin{array}{c} x_{i}^{t} \\ y_{i}^{t} \\ 1 \end{array} \right)
\end{align}
```


### Differentiable Image Sampling
前項で得たoutput(target)のグリッドに対応するinput(source)の位置からサンプリングを行います。
jakarta.validationでカスタムアノテーションを作ってみる

jakarta.validationを使った簡単なバリデーションのアノテーションを作ってみます。

まずはアノテーションを作ります。
これ　@Constraint(validatedBy = NameValidator.class)　が肝で、NameValidatortというクラス内でバリデーションのチェックをします。
```java
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = NameValidator.class)
public @interface ValidateName {
    String message() default "Invalid name: must start with uppercase";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
```

isValid関数内で値のチェックを行います。
```java
public class NameValidator implements ConstraintValidator<ValidateName, String> {
    @Override
    public void initialize(ValidateName constraintAnnotation) {}

    @Override
    public boolean isValid(String name, ConstraintValidatorContext context) {
        return  name.matches("^[A-Z]");
    }
}
```

コントローラーなどを書いて実行してみます。
できたもの
https://github.com/pbogawa/sampleValidate


ポストマンから呼び出してみました。
正常系
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920773/07e495cb-6181-4ce2-94ad-99ffa6f4471d.png)


異常系
勝手に400番エラーにしてくれるみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920773/5926ebe7-33fb-4378-9613-5e59f5779463.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920773/58ef1120-11a0-4322-b2fd-ee3b7efbab19.png)
"GitAuto"というAIツールを活用してブロック崩しゲームを自動作成した際の備忘メモです

"GitAuto"というAIツールを活用してブロック崩しゲームを自動作成した際の備忘メモです

# "GitAuto"というAIツールについて

現状、Githubのプラグインとして提供されております
GithubのIssueから、生成AIを活用してPull Requestを自動作成して貰えます

https://gitauto.ai/
> Have GitAuto create pull requests.
> GitAuto writes code and opens pull requests from GitHub & Jira issues for automated test case creation.


# ブロック崩しゲームを自動作成

GitAutoをインストールし、Github Issueに課題を記載
今回の課題：「ブロック崩しゲームを自動作成したい」

![スクリーンショット 2025-02-23 16.23.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/5f923210-b0d4-4f4e-b976-87398a9f6679.png)

→ しばらくするとAIによるコード生成が完了する

実行

```
python brick_breaker.py
```

ブロック崩しゲームが出現

![スクリーンショット 2025-02-23 15.50.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/5ed7d82b-1185-4024-b06f-6209ffe48196.png)

面白いエフェクト（？）の実装もちゃんとあり


# 更なる自動化

・ゲーム手動操作を自動化したい
・スコアも表示したい

![スクリーンショット 2025-02-23 23.12.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/a34d821e-8b39-44bc-a38a-6fa2b14a8546.png)

出力プログラムの実行動画
[Yotubeリンク](https://youtu.be/hnn6X7wvCWg
)
https://youtu.be/hnn6X7wvCWg

![スクリーンショット 2025-02-23 23.17.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/da42e0fc-c157-4b60-86b3-f3e177723dae.png)

ブロックを跳ね返す棒（パドル）の操作を自動化することができました

# （追記）

ブロック崩しの背景をスケジュールにしたバージョンも作成しました。短時間で作成できましt
https://youtu.be/REvnfxmnngQ

---
上手く活用すれば、他のゲームアプリ開発など効率化できそうですね！


# エラー：`ModuleNotFoundError: No module named 'pygame'`

`ModuleNotFoundError: No module named 'pygame'`
→ 
pygameをインストールして解決
素の環境だと競合が発生するかもしれないのでvenvを活用する。
https://qiita.com/seigot/items/256e04d326dc009313f2

```sh
python -m venv venv
source venv/bin/activate
pip install pygame
```

# 備考

https://gitauto.ai/

https://qiita.com/seigot/items/256e04d326dc009313f2
AtCoder ABC394 振り返り(緑コーダーがPythonでABCD問題)

## ABC 394振り返り

[鹿島建設プログラミングコンテスト2025（AtCoder Beginner Contest 394） - AtCoder](https://atcoder.jp/contests/abc394)

ABCD4問解答、レーティングは微減でした。

今回もD問題の難易度が低かった(Diff 253)ようで、水色問題解けない勢は問題を解くスピード勝負になってしまった模様。元々早解きは得意でない上に、途中でMacが固まってしまったアクシデントもあり、あまり良くない結果でした。

まあ、E問題(Diff 1403)を解ければよかったんですけどね...。Eは難しかったです。


## [A - 22222](https://atcoder.jp/contests/abc394/tasks/abc394_a)

2/22 開催なので、2を集める問題なのでしょうか。
入力文字列 ``` S ``` を調べて、もし ``` S[i] == '2' ``` なら答えに加えていく...という考えで解きました。

``` python 
S = input()
answers = []
for i in range(len(S)):
    # 文字が '2' だったら、答えの配列に追加
    if S[i] == '2':
        answers.append(S[i])
# 配列を文字列にして出力
print("".join(answers))
```

## [B - cat](https://atcoder.jp/contests/abc394/tasks/abc394_b)

2/22 が猫の日なので、このタイトルなのでしょうか。
{key: 文字列の長さ, value: 文字列} のdictionary を作り、keyをsortすることで、文字列の長さ順で文字列を連結できるようにしました。

``` python
N = int(input()) 

# 入力文字列をdictionaryで保持
S = defaultdict(str)
for i in range(N):
    current_s = input()
    S[len(current_s)] = current_s

# keyをソート
sorted_key = list(S)
sorted_key.sort()

# keyの順番(=文字数順)で文字列を連結し、出力
answer = []
for key in sorted_key:
    answer.append(S[key])
print("".join(answer))
```

## [C - Debug](https://atcoder.jp/contests/abc394/tasks/abc394_c)

問題文・入力例を見ると、以下のように変更すれば良いことがわかる。

> WA → AC
> WWA → ACC
> ....
> WWWWWWWWWWA → ACCCCCCCCCC

つまり、文字列 S の中に[Wの連続 + A] があれば、[A + Cの連続] に変換すれば良い。

``` python
S = list(input())

w_sequence = 0 # Wの連続個数
answer = []
for i in range(len(S)):
    # W だったらカウント
    if S[i] == "W":
        w_sequence += 1
        continue

    if w_sequence > 0 and S[i] == "A":
        # [Wの連続 + A] なら、[A + Cの連続] に変換
        start = i - w_sequence
        S[start] = "A"
        for j in range(start + 1, i + 1):
            S[j] = "C"
        w_sequence = 0
    
    if S[i] != "W":
        w_sequence = 0
        
print("".join(S))
```

## [D - Colorful Bracket Sequence](https://atcoder.jp/contests/abc394/tasks/abc394_d)

スタック (``` deque ```) を使用するとうまく解けます。


例として、入力例1を処理するときはこんな感じです。

```
1文字目: 空Stack ← ( # カッコが対応していないのでStackに追加
2文字目: ( ← [ # カッコが対応していないのでStackに追加
3文字目: ([ ← ] # ［］が対応しているので、一文字消去
4文字目: ( ← )  # () が対応しているので、一文字消去
...
```

``` python
from collections import deque

# 入力
S = list(input())

dq = deque() # 文字列を保持するスタック

# Sを一文字ずつ処理
for i in range(len(S)):
    # スタックの一番最後の一文字と、今の文字列が対応するカッコだったら、スタックから取り除く
    c = S[i]
    if len(dq) == 0:
        dq.append(c)
        continue
    if dq[-1] == "(" and c == ")":
        dq.pop()
        continue
    if dq[-1] == "[" and c == "]":
        dq.pop()
        continue
    if dq[-1] == "<" and c == ">":
        dq.pop()
        continue

    # カッコが対応していない場合、文字をスタックに追加
    dq.append(c)

# スタックが空ならYes
print("Yes" if len(dq) == 0 else "No")
```
情報セキュリティマネジメント試験を受けてみた！


## はじめに
2025年の1月に情報セキュリティマネジメント試験を受験しました。
今月に合格発表がされ無事合格することが出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019599/e27a51f3-1d73-43dd-ac20-b10016c54596.png)

著者のスペック
- 情報系の修士卒
- 社会人一年目(機械学習系の案件を担当)
- ITパスポート、基本情報技術者に合格

備忘録として合格するためにどのような勉強を行ったか紹介していきます

## 受験理由
本資格を受験しようとした理由は以下の通りです。
- 会社の資格手当対象資格だったため
- 社内で情報セキュリティを強化する方針を示したため、情報セキュリティに関する体系的な知識を身に着ける必要があると感じたから

## 使用したテキストやサイト
①[情報処理教科書 出るとこだけ！情報セキュリティマネジメント［科目A］［科目B］2025年版](https://www.seshop.com/product/detail/26561?gad_source=1&gclid=Cj0KCQiAq-u9BhCjARIsANLj-s3K2YkeUd5b8KkizesSN4RLbvRak9EdweEgOuvS99MyqVoHkD9SRdMaApMREALw_wcB)
②[情報セキュリティマネジメント過去問道場](https://www.sg-siken.com/sgkakomon.php)

インプットの教材として①はかなり最適でした。また科目B試験の虎の巻は科目Bの読解方法について明確なアドバイスを示していました。

## 勉強時間
15~20時間くらいだったと思います

## 勉強法
### 1. インプット用の教材を1周進める
出るとこだけ！の参考書は数十ページごとに問題があるので理解できているか確認することが出来ます。個人的にはインプットを出来るだけ早めに終わらせてアウトプットを実施すべきだと思います。

### 2. 過去問道場でアウトプットを実施する
今思うと過去問題よりも予想問題を重点的にやればよかったかなぁと思いました。というのも予想問題のLv3以上の問題を行えなかったので、ここらへんをきちんとやっていれば科目Aの正答率が上がると思います。

### 3. 間違えた部分を中心に弱点のインプットを実施
2で間違えた分野を中心に1の教材を読み込みましょう。インプット、アウトプットを繰り返せば過去問道場の正答率が上がっていくと思います。


## 受験の感想
予想問題のLv3以上の問題をあまり行えなかったので科目Aでいくつか曖昧な問題がありました。またセキュリティに関係ない問題もいくつかありました。ただ問題文の指示に従えば解ける問題だと思います。自分は十分な見直しを行い10分くらい余ったので、時間が足りなくなるということはないと思います。合格率が高い試験ですがきちんとした対策は必須だと思います。

## おわりに
これでIPAのレベル2までの試験を全て合格しました。秋の応用情報技術者試験まで時間があるため、6月くらいまではIPA以外の試験を受けて様々な知識を身に着けようと考えています。
コードを生成しないコレクションと例外処理が期待通り動くようになりました

まあ、どうでもいいですかね。
とりあえずやってます。
一応成果宣伝しておきます。
mapでもコードを生成しないコレクションできました。
30万行くらいの規模だったのが25万行くらいまでになりました。
マイコンでは重要かと思います。
あとは例外が割と普通のインタプリタみたいに期待通り動く感じです。
まあ、いいじゃないでしょうか。

# Exception

```C
#include <comelang.h>

exception int fun(int a)
{
    printf("%d\n", a);
    
    return none(s"ERR");
}

int main(int argc, char** argv)
{
    int b = fun(a:111).rescue {
        puts("RESCUE");
        111
    }
    
    printf("b %d\n", b);
    
    return 0;
}
```

```
111
RESCUE
b 111
```

```C
#include <comelang.h>

exception int fun(int a)
{
    printf("%d\n", a);
    
    return none(s"ERR");
}

int main(int argc, char** argv)
{
    int b = fun(a:111);
    
    printf("b %d\n", b);
    
    return 0;
}
```

```
111
ERR
```

```
#include <comelang.h>

exception int fun(int a)
{
    printf("in fun %d\n", a);
    
    return none(s"Err");
}

exception int fun2(int a)
{
    printf("in fun2 a %d\n", a);
    
    fun(a);
    
    return 1;
}

int main(int argc, char** argv)
{
    int b = fun2(a:111);
    
    printf("b %d\n", b);
    
    return 0;
}
```

```
#include <comelang.h>

dynamic struct sData
{
    int a;
    string b;
};

int main(int argc, char** argv)
{
    list<sData~>*% li = new list<sData~>();
    
    li.add(new sData { b:s"ABC" });
    
    puts(li[0].b);
    
    return 0;
}
```

list<sData~>はvoid*としてコード生成される。
「電脳少女プログラミング2088」競プロに興味がある初心者がDランク問題(ネオン街の裏路地)やってみた

## はじめに
Python初心者がDランク問題に挑戦してみました。
自分で解いた後にChatGPTで以下の点を修正してもらったコードも載せてます。
1\.**コードのリファクタリング**
2\.**効率の良いアルゴリズムがあれば採用**

## 自己紹介
* プログラマーを目指す会社員
* 競技プログラミングには1年前に1回参加した程度
* **Qiita初投稿**

# 問題

https://ppg.paiza.jp/denno2088/challenges/denno2088_c_d_01

### 自分の回答
```python:解答.py
n = int(input())#n回出力される
door_number = [int(input()) for i in range(n)]
max_number = 0

for j in range(len(door_number)):
	if max_number <= door_number[j]:
		max_number = door_number[j]

print(max_number)
```
### ChatGPTでリファクタリングと修正してもらったコード
```ChatGPT.py
n = int(input())  # n回出力される
door_number = [int(input()) for _ in range(n)]

# 組み込み関数 max() を使って最大値を求める↓
print(max(door_number))
```
# 反省点
* 組み込み関数の存在を忘れており、リスト内数値の比較部分で冗長な書き方になっている
* リスト内包表記の変数で`_`を使用している→変数の値を使わずに捨てることを明示するためだとか
↓参考記事

https://qiita.com/yusuke_s_yusuke/items/3fc2430a22a2714197e4

# 感想
リスト内包表記で`_`という書き方があることを知り、使えるところでは使っていきたい
Qwen RAGアプリ開発体験

2025年2月18日、株式会社レッジ オフィスにて「Qwenで実現するAIエージェント開発ハンズオン」に参加せてもらいました[[リンク](https://ledge.ai/articles/alibaba_cloud_hands-on_2025)]。これはそのレポートです。なお、レポートを書いたらちょっとした謝礼をいただけるというので、この記事はちょっとだけプロモーションになります。

Qwen はAlibaba Cloudが開発したオープンソースLLM。様々な規模が選択でき、小規模のものはスマートフォンやPCで動かすことができ、大規模なものは他の大規模LLMに匹敵する性能を持つ。
→ Alibaba Cloud 2024/08/07 [Llama3を超えた？4兆円超予算のアリババの研究所が開発したオープンソースLLM「Qwen」](https://www.alibabacloud.com/blog/llama3%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%EF%BC%9F4%E5%85%86%E5%86%86%E8%B6%85%E4%BA%88%E7%AE%97%E3%81%AE%E3%82%A2%E3%83%AA%E3%83%90%E3%83%90%E3%81%AE%E7%A0%94%E7%A9%B6%E6%89%80%E3%81%8C%E9%96%8B%E7%99%BA%E3%81%97%E3%81%9F%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9llm%E3%80%8Cqwen%E3%80%8D_601477)

このハンズオンでは、ノーコードAIアプリ開発ツールであるModelStudioを使う。ModelStudioはQwenだけでなく、様々なLLMを使うことができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126576/362a34a8-5bab-44c4-89c4-7929924ae828.png)


以下、ハンズオンでは、RAGを使った質問応答システムのAPIをAlibaba Cloudにデプロイするまでを作成する。行われた手順を辿ってみる。

1. まずベースモデルで同作確認
ベースモデルはiPhone 16が発売される前に構築されたもので、iPhone 16について質問しても、想定される仕様しか答えない。
2. 対応するファイルをアップロード
サイドバーメニューData ManagementのImport Dataを用いてファイルアップロード。ここではiPhone 16の技術仕様 ([リンク](https://support.apple.com/ja-jp/121029)) をPDF化したものをアップロードする。
→ これだけではまだまだiPhone 16に関する情報は質問応答に反映されない。
3. アップロードしたファイルの知識化
サイドバーメニューData Application > Knowledge Index から “Create Knowledge Index” 実行
アップロードしたファイルを選択し、インポート
→ まだiPhone 16に関する情報は質問応答に反映されない。
4. RAGアプリケーション作成
My Application で”Create Application”
Agent Application の中から “Knowledge Base Retrieval Augmentation”を選択(今見たら “Create RAG Application” を選択
モデル選択： Max/Plus/Turbo/Open がある (どれを使ったか忘れた)
Select Knowledge Base： 2で作成したKnowledge Indexを選択
Prompt Sample LibraryをON
→ iPhone 16に関する質問が回答可能になる。
5. その他改良
アップロードした仕様書にはiPhoneの価格は書かれていない → 「iPhoneの価格」という変数をセットすることができる。
複数台のiPhoneの価格を計算させると正しくない値を出す。→ Plug-in GalleryでCalculatorを選択すると、正しい値を出すことができるようになる。
6. Publish
API Keyを発行する
呼び出し方が示されているので、上記発行したAPI Keyを使って呼び出し側のアプリケーションに組み込む

Publishはしたものの、時間の関係でAPIの呼び出し側まで作るまでには至っていない。今後、(別のファイルを使って) アプリケーションを作るまで進めてみたい。

ここまで確かにノーコードで進めることができた。生成AIを使うのにプロンプトエンジニアリングに止まっているところにとっては、背中を押してくれる存在になりうると思う。

なお、「Qwenで実現するAIエージェント開発ハンズオン」という表題から、対話を行うだけではなく、人の命令または自主的な判断で  (他のアプリケーションと連動して) 処理を実行するものを期待していた。ステップ3でRAGアプリケーションを作るときにAgent Applicationから選んだが、Alibaba Cloudにおいては対話の相手をLLMを使うエージェントと位置付けていることがわかる。

ただし、Agent Application以外に Workflow Application および Agent Orchestration Application という種類がある。これらを用いれば、なんでも任せられるエージェントまでは行かなくとも、例えば旅行代理店のようなある業務に特化したアプリケーションが作れるのではないか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126576/371a9a41-046c-4bb6-bbb3-987cf775d068.png)

最後に料金に関して。このハンズオンの最後にインスタンスを削除したので、実質1時間使ったわけだが、料金は発生していない (100ドル分のクレジットをもらったが全く減っていない)。この記事を書くにあたって再度ハンズオンを再実行しているが、その間も減っていない。このインスタンスをもうしばらく生かしておいて、どれくらい消費されるのかをモニターしてみようと思う。
next/imageの画像最適化を独自実装してみた

# next/imageとは？
reactのフレームワークであるNext.jsが標準で提供している画像用のコンポーネント。

https://nextjs.org/docs/pages/api-reference/components/image

画像のパフォーマスを上げる機能が色々と付いており、この中に画像最適化というものがある。

# 画像最適化とは？
色々ありますが、主に以下が自動で行われる。
- ①webpへの変換
    - pngに比べてファイルサイズが半分になる
    - 見た目もほぼ変わらない
- ②圧縮してファイルサイズの削減
    - quality：0~100で指定可能、値が0に近いほど圧縮される（圧縮される分画質も悪くはなる）
    - https://nextjs.org/docs/pages/api-reference/components/image#quality
- ③指定された画像サイズ、またはレスポンシブの場合画面幅によって自動で表示する画像サイズを変更
    - 画面サイズが小さいスマホでは小さいサイズの画像、画面サイズが大きいPCでは大きいサイズの画像を表示してくれる。例えばスマホであまりに大きいサイズの画像を表示してしまうと不必要に表示まで時間がかかってしまうため

より詳細は以下記事参照

https://zenn.dev/reiwatravel/articles/fb1586ea9463a1

# 独自実装した理由
vercelの無料プランだと画像最適化が1000枚までの制限があったため。有料プランだと5,000枚になるが、上げるのは難しったので独自実装できないか？と試してみた。

![CleanShot 2025-02-04 at 16.40.24@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520261/8e74e575-ae13-8ac9-4884-610d7718ac87.png)


ref：https://vercel.com/docs/pricing/image-optimization

# 独自実装した方法
## ①sharpパッケージで画像変換
画像のリサイズなど様々な処理をできるsharpパッケージを使用する。next/imageも内部的にはこのsharpパッケージを使用している。

https://www.npmjs.com/package/sharp

今回はnext/imageで行われている以下の処理をする。

- webpへの変換
- qualityによる圧縮
- 各サイズの画像を作成

以下コード例
```ts
import sharp from 'sharp'

const deviceSizes = [475, 640, 750, 828, 1080, 1200, 1920]
const imageUrl = 'https://placehold.jp/1920x1920.png'
const response = await axios({
    responseType: 'arraybuffer',
    url: imageUrl,
})

for (const size of deviceSizes) {
    const outputPath = `image-${size}.webp`

    const image = await sharp(Buffer.from(response.data))
      .resize(size, null, {
        fit: 'inside',
      })
      .webp({
        quality: 75,
      })
      .toFile(outputPath)
  }
```
サイズの配列でループ処理して、sharpのresize関数にサイズを指定して画像サイズを変更。
sharpのwebp関数でwebpに変換。
webp関数のオプションのqualityでnext/image同様に圧縮できる

自分の場合はsharpで変換した画像をaws s3に保存しておき、画像キャッシュもしたいのでcloudfrontを経由して画像を配信しています。

![CleanShot 2025-02-24 at 15.32.45@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520261/09147a77-c953-4d58-b7b1-d9e815ae38bc.png)


## ②imgタグのsrc、srcsetにsharpで変換した画像を指定する
画像URLは例です。
```html
<img 
    src="https://placehold.jp/1920x1920-1920.webp" 
    srcset="
        https://placehold.jp/1920x1920-475.webp 475w, 
        https://placehold.jp/1920x1920-640.webp 640w, 
        https://placehold.jp/1920x1920-750.webp 750w, 
        https://placehold.jp/1920x1920-828.webp 828w, 
        https://placehold.jp/1920x1920-1080.webp 1080w, 
        https://placehold.jp/1920x1920-1200.webp 1200w, 
        https://placehold.jp/1920x1920-1920.webp 1920w
    " 
    sizes="(max-width: 768px) 100vw, 50vw"
    loading="lazy"
>
```
next/imageも内部的にはこのsrcsetが使用されている

https://developer.mozilla.org/ja/docs/Web/API/HTMLImageElement/srcset

レスポンシブ画像の場合はsizesの指定も重要になります。srcsetとsizesの書き方は以下記事を参考にしください

https://qiita.com/dowanna6/items/b9e132b4c56e67491027

# 最後に
独自実装してみて、これらを全て自動で行ってくれるnext/imageが便利だなと改めて実感しました。Next.jsを使っておらずnext/imageが使えない場合や、自分と同じように無料プランの1,000枚を越えそうなときにぜひ独自実装をお試しください
URL欄からpostできるブックマークレット作った

## 準備
以下を、それぞれブックマークのURLに貼り付けて保存する。
- postmanにpost
```
javascript:var form = document.createElement('form');document.body.appendChild(form);form.setAttribute('action', 'https://postman-echo.com/post');form.setAttribute('method','POST');form.submit();
```
- 指定したURLにpost
```
javascript:var form = document.createElement('form');document.body.appendChild(form);form.setAttribute('action', window.prompt(%27任意のURLを入力してください%27,%27https://postman-echo.com/post%27));form.setAttribute('method','POST');form.submit();
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610591/0a8c3695-a753-407e-ae4c-5250fa978672.png)

## 実行
実行時に押下するだけ。
## 今後の展望
送信データも設定できるようにしたい。
バンドル・コンパイルの意味といつされるか。

# バンドル・コンパイル
### バンドル
たくさんあるjsやcssのファイルを少数ののファイルに集約して、読み込みやすくすること

ツール：webpack

### コンパイル
jsx,scss,tsなどの拡張子をjs,cssに変換してブラウザで読み込めるようにすること


## この変換はいつされるの？サーバーに上げる時？
⇨開発環境などでビルドした時
npm run dev してる時にファイルの変更を行った時にビルドしてる

ビルドツールの主流
Next.js、vite
elm327の研究 その16

# 概要
elm327の研究やってみた。
目標は、スキャンツールなので、買ってみた。

# 購入した中古スキャンツール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/08b80b59-3aea-487f-9d0b-01f095acf5d7.png)

autel製 AL319
バージョン V1.02.09 日本語

# スキャンツールは、何ができるのか。
- トラブルコード（DTC）の取得
- トラブルコード（DTC）の消去
- ライブデータの表示
- フリーズフレームデータの表示
- I/M 準備状況の取得
- vin番号の取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4558e781-4f42-4a49-a4ae-b6bd17db29ad.png)


# I/M 準備状況とは、何か
I/Mは、Inspection/Maintenanceだと思う。
この表示があるボタンは、OBDⅡ準備状況モニターボタン
排ガス制御部品や主要な構成部品をチェックし、これらが正しく許容範囲内の状態で走行できる準備ができていることを確認する。
DTC　故障コード (Diagnostic Trouble Codes) ５桁の英数字で構成
PdDTC　保留故障コード (Pending DTC) 連続して発生していないヤツ
モジュールは、１１個ある。
|番号 | モジュール|内容|
|:-|:-|:-|
|1 |MIL|故障警告灯 (Malfunction Indicator Lamp)
|2 |MIS|失火(単気筒／複数気筒失火) (mis fire)
|3 |FUE|燃料系 (fuel system)
|4 |CCM|統合的な構成要素に分類される構成部品→メーカによって異なるが、排ガス制御系の監視センサー等が含まれる (Comprehensive Components)
|5 |CAT|キャタライザー(触媒装置) (Catalyst)
|6 |HCAT|ヒーター加熱型触媒 (Heated Catalyst)
|7 |EVAP|燃料蒸発ガス排出抑制装置 (Evaporative System)、ﾁｬｺｰﾙｷｬﾆｽﾀ、ﾊﾟｰｼﾞﾊﾞﾙﾌﾞ
|8 |AIR|(Secondary Air)
|9 |O2S|O2センサー (O2 Sensors)
|10 |HRT|(O2 Sensor Heater)
|11 |EGR|排ガス再循環システム (Exhaust Gas Recirculation)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4fdaf9d2-11b8-4e7b-bbc3-5dda22962f4d.png)

# ポルシェ　カイエン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d4e12535-2a51-4caf-9fff-cd78b1587bfc.png)


# 理解を深めるビデオ


<iframe width="560" height="315" src="https://www.youtube.com/embed/a9uP8A94VsQ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" loading="lazy" allowfullscreen></iframe>

以上。