OmniAICreator/Qiita-1.07M huggingface dataset:
Gitの基本操作・コマンド＜初心者向け＞

# はじめに
今年度からほぼIT未経験の状態で、新卒としてこの業界に飛び込んできました。
4月から７月はインフラ関連や開発のための研修を受け、8月からはプロジェクトに参画し、業務に取り組んでいます。
個人だけではなく、プロジェクトで動く場合、必要となるのが**Gitの操作**です。
最初はGitの操作に慣れず困惑しました。
この記事は私と同様にGitの操作で困っている**超初心者向け**の記事になります。

# Gitは何のために必要？
Gitはソースコードの変更履歴を保存します。
これにより、過去の状態に戻ったり、どの変更が誰によって、いつ行われたか追跡することができます。
またブランチ機能によって個別の作業環境を確保しつつ、変更を統合（このことをmergeといいます）することが可能で、チームでの共同作業をスムーズに行うために必要なものとなっています。

# ローカルリポジトリからリモートリポジトリに反映してみる
まず前提としてローカルリポジトリ、リモートリポジトリについて確認します。
**・ローカルリポジトリ**
　自分自身が作業した内容を一時的に保存するための場所です。
 **・リモートリポジトリ**
 　別名共有リポジトリとも呼ばれ、ローカルで作業したものをプロジェクトチームで共有するための場所です。

  では本題に入ります。順序立てて説明していきます。

  ### ①リモートリポジトリからローカルリポジトリに最新情報を取り込む
  ```
    git pull origin [ブランチ名]
```
リモートリポジトリ（origin）から変更を取得し、現在のローカルブランチに統合するためのコマンドです。
この作業をしておかないと、後でリモートリポジトリに反映する際、エラーが起きてしまったり、作業の重複やミスが発生してしまいます。

### ②作業したいブランチに切り替える
  ```
    git checkout [ブランチ名]
```
上記のコマンドで、作業したいブランチに移動できます。
また、新しく作成したいブランチで作業を行う場合は
  ```
    git checkout -b [ブランチ名]
```
で行うことができます。

### ③作業後、ローカルリポジトリの変更をリモートリポジトリに反映する
 #### 1.ローカルでの変更を確認する
  ```
    git status
```
まずは状態確認を行い、修正したものが未コミットの場合は次に手順でコミットを行います。
#### 2.変更をステージング
  ```
git add <ファイル名>
```
もしくはすべての変更をステージングする場合
  ```
git add .
```
で行えます。変更を破棄する場合は以下のコマンドで行い、次に進みます。
 ```
git restore <ファイル名>
```
#### 3.コミットする
```
git commit -m "コミットメッセージ"
```
コミットとはGitのリポジトリに作業内容（ファイルの変更など）をセーブすることです。
コミットメッセージには、プロジェクトで指定されているメッセージに合わせたり、わかりやすいメッセージを入力することを求められます。
#### 4.リモートにプッシュする
```
git push origin <ブランチ名>
```
プッシュとは、ローカルリポジトリに保存された変更（コミット）をリモートリポジトリに送信し、反映させることです。
ブランチ名は現在作業しているブランチ名を指定します。
この作業によって、ソースコードをレビューしてもらったり、変更差分をマージできるようになります。

ローカルリポジトリからリモートリポジトリに反映してみる作業の一覧の流れはこのようになります。

# 覚えておくと便利なコマンド
#### 〇git stash
現在作業しているブランチから、別のブランチに移動して作業を行いたい場合があります。
そんな時にコミットはしたくないけど、一時的に変更したファイルを退避しておきたい場合に便利なコマンドがgit stashです。
```
git stash save "コメント" -u
```
上記のコマンドで一時的に退避することができました。
-u は付けなくても実行できますが、-u を使うことで、**新規に追加されたがまだGitに追跡されていない未追跡ファイル**も退避させることができます。
ですので私は-uを付けることを推奨します。


退避した変更の一覧を表示したい場合は次のコマンドで表示させます。
```
git stash list
```
退避された変更は、stash@{0}, stash@{1}, などの番号で表示されます。
退避した変更を再適用するには
```
git stash pop stash@{n} 
```
nは戻したいstashの番号です。このコマンドは退避リストから戻すと同時に削除してしまうので、もし退避リストに残したまま適用したい場合は
```
git stash apply stash@{n}
```
とすると、退避リストに残ったまま再適用できます。
私的には、再適用した場合はもう一度取り出す作業をあまりしないので、退避リストからその都度削除してくれるgit stash pop stash@{n} を推奨します。

#### 〇作業中のローカルリポジトリから最新のリモートリポジトリを取り込む
複数人で作業していると、別の人の作業内容がリモートリポジトリにマージされ、作業中のローカルリポジトリとリモートリポジトリに差分が発生し不都合が発生してしまう場合があります。
そのような場合の対処法をpush済みか未pushの場合にわけて説明します。

###### 【ローカルでブランチのマージ(ローカルリポジトリをpushしてない場合)】
①現在の作業中のブランチの変更分をstashする
```
git stash save "comment" -u
 ```
②ローカルリポジトリを最新化
```
git pull origin <作業しているブランチ名>
 ```
③マージの実行
```
git merge <作業しているブランチ名>
```
###### ローカルでのリベース(ローカルリポジトリをpushしている場合)】
①ローカルリポジトリを最新化
```
git pull origin <作業しているブランチ名>
 ```
 
②リベース実行
```
git rebase <作業しているブランチ名>
```

リベースの注意点は、リモートリポジトリにpushする場合、もしリベースによって履歴が変わっている場合、強制的にプッシュ（--force オプション）する必要があります。
```
git push origin <ブランチ名> --force
```

# おわりに
今回の記事で紹介した内容はほんの一部です。私もGitを使い始めて数ヶ月なので、日々勉強しながら業務に取り組んでいます。
もし他にも紹介した方がいいコマンドや知識があれば、随時追記したり、新たに投稿していきたいと考えています。

初めての投稿で拙い文章になってしまいましたが、ここまで読んでくださった方、ありがとうございました！
Javaを基礎から学ぶその3　配列とListとEnum

この記事は[JavaとPythonを基礎から学びたい私のための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/aruhitonocalendar)の3日目の記事です。
配列とlistが似ていてたまに間違えてしまうことがあるので、もう間違えないようにするための勉強です。
# 複数個のデータ
多くの数値や文字を扱うことができるのが配列やListのいいところです。多くの変数を作らなくて済むので、とても見やすくなります。ここでは、その２つの特徴や違いを確認していきます。
## 配列
型(今回はint)の横に[]をつけるだけで、たくさんのデータを入れておけます。
```
public class TEST{
 public static void main(String[] args){
	int[] A={0,2,3,5,8};
	for(int B:A){
	System.out.println(B);
	}
 }
}
```
昨日勉強した拡張for文を使って、配列の中身をひとつづつ取り出しています。ちなみにString型でも行けました。

# List
最初にArrayListとListのやつをimportしなければならないのを忘れそうです。必須です。
```
import java.util.ArrayList;
import java.util.List;

public class TEST{
 public static void main(String[] args){
	List<Integer> A=new ArrayList<Integer>();
	A.add(0);
	A.add(2);
	A.add(2);
	A.add(6);
	A.add(8);
	System.out.println(A);
	
 }
}
```
出力すると、[]に囲まれて中身が出てきました。
```
List<Integer> A =List.of(0,2,2,6,8);
```
Aという名前の空のListに、あとからaddで中身を加えています。ここには書いていませんが、Removeで要素を消すこともできるようです。
# Enum
```
public class TEST{
 public static void main(String[] args){
	
	Favorite B=Favorite.watchTV;
	System.out.println(B);
		
 }
public enum Favorite{
	Sushi,
	Pizza,
	Walking,
	watchTV
	};
	
}
```
好きなものやことを並べて、その中の一つを出力してみました。ここではwatchTVが出てきます。Bに、Favoriteという名前のEnumの中に入っているwatchTVを入れて、Bを出力しています。
Enumの中のものについてひとつひとつ別の名前を持たせることもできるようです。
```
public class TEST{
 public static void main(String[] args){
	
	Favorite B=Favorite.Sushi;
	System.out.println(B.getKanrenyougo());
		
 }
public enum Favorite{
	Sushi("Wa"),
	Pizza("You"),
	Walking("Undou"),
	watchTV("Himatubusi");
	private String Yakiimo;
	private Favorite(String Yakiimo){
		this.Yakiimo=Yakiimo;
	}
	public String getKanrenyougo(){
	
		return Yakiimo;
	}
	}
	
}
```
出力結果:Wa
結構長めのコードですが、呼び出す要素に対応した別の名前を呼び出すこともできるようです。また、各要素に数字を振ることもできるようです。
## それぞれの強みを考えてみる
Enum型は今見た通り、文字に対応する別の名前を関連付けられるのがほかにない強みです。関連させたい文字がある場合はEnumを使うのがベストだと感じました。
Listは要素を後から追加、削除できるようです。途中から中身をいじりたいときはこれが便利そうです。
そのほか、特に何もなければ配列を使うのがよさそうです。

# 感想(まとめ)
大量の数値や文字を扱うには様々な方法があり、それぞれ強みが分かれていた。それぞれの使う場面をしっかり見極めることが大切だと感じた。

今回勉強した配列やList、Enumについてはより詳しく見ていくといろいろできることがあるようです。

参考文献

https://www.bold.ne.jp/engineer-club/java-enum

https://jitera.com/ja/insights/26776

https://www.sejuku.net/blog/20355
NotionのデータベースIDがわからないあなたへ

# 問題
どこのページを見ても、NotionのデータベースIDとページIDの記述がよくわからん！

よくあるのは、こんな感じの表記でしょうか。
```
https://notion.so/<データベースID>/?v=<ビューID>
```

でもこれ、どこを見ればいいの？となっていたので備忘録として書いておきます。

# Notionアプリの場合
まず、データベースのページを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/e27cf704-b6e9-c15d-1a1e-49815f9c0095.png)

ここから、画像のようにビュー(テーブルビュー、ボードビューなど)の右側にある3点メニューを選択し、「ビューのリンクをコピー」しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/a00e20c4-a3c9-642a-213d-3c80c8d18dc3.png)

もしくは、ビューを直接右クリックすることでも、コピーできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/514da041-5e3d-22d0-9c29-3c3503828340.png)

**これの中に、データベースIDは含まれています。**
もっと具体的にいっておくと、32桁の文字列になっています。

これを踏まえて下記を見ると、わかりやすくなったのではないでしょうか。
```
https://notion.so/<データベースID>/?v=<ビューID>
```

***

:::note warn
よくある勘違い
データベースページの右上にある3点メニューから「リンクをコピー」しても、データベースIDは含まれていません！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/10284ce2-1669-ebd4-42ce-f800b71b6254.png)
:::

***

# ブラウザのNotionの場合
このようにデータベースのページを開いたところにあるURL**ではありません**。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/021f3454-ae76-432e-536c-55683e9d4e01.png)

アプリ同様、ビューを右クリックすることで、「ビューのリンクをコピー」したり、ビューのページのみを「フルページとして開く」ことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/52014450-f9a2-1bbf-087d-137f868b36fa.png)

フルページとして開くと、こんな感じでURLの中にデータベースIDが含まれて表示されます。
まさしく、「so/」から「?v」までの間ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/19053393-51f9-0259-1d27-a54706404cf0.png)


# 注意事項
このデータベースIDをNotion API内でそのまま使おうとすると、エラーになる可能性があります。
その理由は、**UUID形式で書いておく必要**があるため。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/5ca1cb5e-7522-35e3-6351-b0af0fd33ef9.png)

https://developers.notion.com/reference/database

現に私は以前、DifyからNotionのデータベースを操作するためにデータベースIDを用いて開発していたのですが、**UUID形式で書いていなかったために想定通りの動作にならない**ことがありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/823f9c57-0f01-88a1-8a33-d2344556228d.png)

したがって、このようにvalid uuidを求められた場合は、データベースIDを「**8桁-4桁-4桁-4桁-12桁**」としておきましょう。
Prismaで集計処理をしてみよう！

これは1人アドベントカレンダーの2日目の記事です。
1日目は個人ブログに書いてます↓

https://www.d0nchan.com/entry/2024/12/02/012846

早速ですが、下記のコードは、弊社のプロダクト[HCCloud](https://hcproduce.co.jp/hccloud-lp/)のコードの一部を説明用に改変したものです。

```typescript
   const average = await this.prisma.metricValue.groupBy({
      by: ['metricId', 'year', 'statementType'],
      _avg: { value: true },
      _count: { value: true },
      where: {
        company: {
          jpxIndustryCode: industryCode,
        },
      },
    });
    return average;
```

これはどのような処理かと言いますと、
指標ID(`metricId`)、年度(`year`)、報告タイプ(`statementType`)をグループ化した上で、グループ内の`value`の平均値と、グループ内の要素の総数(=平均を出すための母数ですね)を取得しています。


スキーマ的にはこんな感じのテーブルに対する処理です。

```typescript:MetricValue.prisma
model MetricValue {
  id            Int      @id @default(autoincrement())
  companyId     Int      @map("company_id")
  year          Int
  metricId      String   @map("metric_id")
  date          DateTime @db.Timestamptz(6)
  value         Float
  company       Company  @relation(fields: [companyId], references: [id], onDelete: Cascade)
  metric        Metric   @relation(fields: [metricId], references: [kind], onDelete: Cascade)
  statementType String   @default("UNCONSOLIDATED") @map("statement_type")

  @@unique([companyId, metricId, year, statementType])
  @@map("metric_value")
}
```

## PrismaのgroupByとaggregate関数の組み合わせ

Prismaではこのような集計関数(というかSQLを作ってくれるだけ)が用意されています。

https://www.prisma.io/docs/orm/prisma-client/queries/aggregation-grouping-summarizing

レスポンスはこのように返ってきます。
年数×指標数×報告タイプの数だけ要素が返却されます。

```typescript
  {
    _avg: { value: 22.5 },
    _count: { value: 2 },
    metricId: 'number_of_occupational_accidents_occurred',
    year: 2023,
    statementType: 'CONSOLIDATED'
  },
  {
    _avg: { value: 69 },
    _count: { value: 1 },
    metricId: 'number_of_people_with_disabilities_employed',
    year: 2022,
    statementType: 'CONSOLIDATED'
  },
  {
    _avg: { value: 15.69169398907105 },
    _count: { value: 183 },
    metricId: 'price_earnings_ratio',
    year: 2021,
    statementType: 'CONSOLIDATED'
  },
  {
    _avg: { value: 6615876885.057471 },
    _count: { value: 261 },
    metricId: 'net_income',
    year: 2017,
    statementType: 'UNCONSOLIDATED'
  },
  ... 584 more items
]
```

あとはこれをテーブルにインサートするなりして自由に使えます！

HCCloudではテーブルに格納し、自社データと平均値を比較する機能に使われています。

膨大なデータを集計するので、ユーザーから実行するのではなく運営側で必要に応じて実行してます。


HCプロデュースでは2人目のエンジニアを絶賛募集中です！

https://meetings-eu1.hubspot.com/suyama-daichi

https://arwrk.net/recruit/yaccdmcf2smnstb/2518879/
SBOMの専門家から見た いま時点のSBOM

# はじめに
2度目の登場になります、日立ソリューションズの渡邊です。OpenChain Japan Planningリーダーを担当しています。今年は、自社における本務(SBOM/OSS管理コンサルタント)と兼務(自社のOSSコンプライアンス関連)とOpenChainの活動に加えて、The Linux Foundation Japanエバンジェリストを拝命し、さらに12月から日立製作所のOSPOのメンバーにもなりまして、役割と名刺がどんどん増えています。ありがたいことに、各所から情報も集まってきますし、いろいろな立場で発信することもできるようになり、来年はさらに人と人、プロジェクトとプロジェクトを繋げる活動に力を入れていきたいと考えています。いろいろな立場はありますが、私のライフワークはOSSの利活用とSBOMとサプライチェーン・トラスト。今回は、SBOMの専門家から見た**いま時点のSBOM**について書かせていただきます。

# SBOMがなぜ必要なのか？
米国大統領令、EU CRA、PCI DSS v4.0や薬機法における医療機器の基本要件基準などの各種業界規格で要件になっているから、というのが直近の理由かもしれませんが、SBOMの本質は、対象のソフトウェアの構成要素を可視化し、安心・安全に使えるようにすることにあります。規格等でも、SBOMを用いて既知の脆弱性への対策を講じることが要件になっているように、SBOMを作成することはゴール(目的)ではなく、通過点(手段)に過ぎません。きちんと構成管理をおこない、正確なSBOMを作成・伝達してサプライチェーン全体として各種リスクへの対策を講じることが、性能や機能と同様に、自分が頒布(リリース)するソフトウェアに対する責任のひとつという理解が広がると良いなと考えます。

# SBOMとして整理するべき内容(項目)は？
米国大統領令を受けて2021年に発表された[NITAによるSBOMの最小要素の定義](https://www.ntia.doc.gov/files/ntia/publications/sbom_minimum_elements_report.pdf)が、これまでの議論の拠り所とされてきました。個人的には、あくまで最小要素という位置づけであることや、これだけではコンポーネントの特定やリスクの把握に十分でないと思われることなどから、最小要素**だけ**でプロセスやツールを固めないように、というメッセージを発信してきましたが、定義の発行から3年経ち、SBOMに関する検討が進んできたことを受けて、最小要素の定義の更新が検討されているという話も聞きます。今年9月に公開されたCISAのドキュメント[Framing Software Component Transparency: Establishing a Common Software Bill of Materials (SBOM) Third Edition](https://www.cisa.gov/sites/default/files/2024-10/SBOM%20Framing%20Software%20Component%20Transparency%202024.pdf)では、新しくBaseline Attributesが定義されました。これ自体はNTIAの最小要素の定義を更新するものではありませんが、今後の方向性を推察するのには重要なドキュメントです。Baseline AttributesをSPDX v2.2.1、SPDX 3.0、CycloneDX v1.6の項目と比較すると下図のようになります。

![BaselineAttributes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528217/8a3de3c5-8cb1-daa3-d190-891734b97636.png)
*図１　SBOM項目の比較 (CISAドキュメントより引用)*

# SBOMの「粒度」と「深さ」は？
実務でSBOMを作成する際、必ず直面するのが粒度(ひとつのコンポーネントとしてカウントする単位)の問題と深さ(管理するべき依存関係の階層)の問題です。ベストプラクティスはあるものの、「ここまで」という明確な定義が無いため迷いがちなポイントです。独BSIにより今年9月に発行されたドキュメント[Cyber Resilience Requirements for Manufacturers and Products Part 2: Software Bill of Materials (SBOM) v2.0.0](https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TR03183/BSI-TR-03183-2-2_0_0.pdf?__blob=publicationFile&v=3)では、SBOMの粒度や深さについて議論する際の共通言語となり得るLevel of SBOMの定義が発表されました。前述のBaseline Attributeの定義でも引用されています。

![SBOM level.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528217/03249329-2dd1-10d4-d1f8-874874b1db69.png)
*図2　Level of SBOM (BSIドキュメントより引用)*

このほか、SBOM Typesの定義を用いて議論されるシーンも見かけるようになってきました。SBOMという用語だけでは、人によってイメージするものが異なる場合がありますので、SBOM levelやSBOM Typeの定義を活用し、認識の相違を確認しながら議論すると良いと思います。

![SBOM type.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528217/42e03a72-1b22-e525-bd6d-c6637905825f.png)
*図3　SBOM Types*

# 2025年のSBOMは？
10月10日、EU CRAがEU理事会と欧州議会で正式採択され、11月20日の官報掲載をもって、12月10日から適用されることが確定しました。本規則による義務が発生するまであと3年(脆弱性報告義務は2026年9月11日開始)となり、各企業においてSBOMの実用化が急速に進むと予想されます。ベストプラクティスや実務的な検討がまだまだ足りていない分野ですので、コミュニティを通じた連携や情報共有がますます重要になってきます。OpenChain Japanとしても、私個人としても、皆さんの参考になる有用な情報をたくさん発信していきたいと思います。
【ML初心者アドベントカレンダー】混同行列について学ぶ


*最も Accuracy で最も Precision で、そして最も Recall なやり方でいかさせていただきます。*

# この記事の目的

混同行列についてプリミティブに説明できるようになる。
（MLとALの違いも判らない段階で学ぶものではないと思うが、機械学習を学ぶ過程で参考にしている書籍やサイトにすごくよく出てくるので気になってもう調べる。）

# 混同行列(Confusion Matrix)とは

クラス分類の精度評価の指標のこと。
この結果でモデルがどれくらい正確に働いたか、どれだけ間違えたかが一目でわかるので、調節がしやすくなる。

「不特定多数の人間の写真から、服装などの特徴をもとに一般人か地面師かを当てるモデル」を例に、以下の単語を説明する。

### 真陽性 (True Positive)

モデルが地面師と予測した写真のうち、実際に地面師だった写真の数。

### 偽陽性 (False Positive)

モデルが地面師と予測した写真のうち、実際には一般人だった写真の数。

### 真陰性 (True Negative)

実際には一般人で、モデルも一般人だと予想した写真の数。

### 偽陰性 (False Negative)

実際には一般人だが、モデルが地面師と予想した写真の数。

---

つまり…

モデルの予想があっていれば **真(True)**
間違っていれば **偽（False）**

そのうえで

モデルが見つけるべき対象（今回の例でいうと地面師）を指すなら **陽性（Positive）**
それ以外は **陰性（Negative）**

# 精度指標

各種スコアが存在し、上記で挙げた真陰性等を基に計算する

## 正解率（Accuracy）

その名前の通り、モデルの正解率

## 再現率（Recall）

実際の陽性のうち、陽性として検出されたデータの割合

## 適合率（Precision）

モデルが陽性と予測したデータのうち、実際に陽性だったデータの割合

## F値

再現率と適合率をいい感じに計算した値。
モデルがそれくらい優れているかを判断する指針になる。

# ざっくりまとめ

混同行列とは、クラス分類の精度評価の指標のこと。モデルの調節などに用いる。

下記のような表で見るとわかりやすい。
|  | 実際は地面師 | 実際は一般人 |
|:-----------|------------:|:------------:|
| モデルが地面師だと予測した       | 真陽性        | 偽陽性         |
| モデルが一般人だと予測した       | 偽陰性        | 真偽性         |
「結合テストは死んだのか？」

今回は、「結合テストは死んだのか？」というテーマになります。
エッセイですね。


X にて、以下のリクエストをいただきましたので、書いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156898/8a3cf94d-b02d-aaf9-da07-e9626351a7a8.png)
https://x.com/akiyama924/status/1863367270346711237



## Web系の結合テストとは何か
まずはこちらのモデルをどうぞ。
![Wmodelそとむけ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156898/c0d19178-0419-842c-f622-b29da93e528d.gif)

これは、あるSaaS製品を持つ開発チームで運用している、現行のWモデルです。
単体テスト、結合テスト（インテグレーションテスト）、
システムインテグレーションテスト、などの括りとはちょっと違っています。

通常のWモデルであれば、いろいろな呼び方はあれど、
これらのテストレベルは一般的ですが、
Web系は、OSやブラウザなど、プラットフォームが、他でテストされていて、
基本的に動作が担保されたものを使います。
ですので、この部分のテストはしないのが通常です。
（ブラウザのコンパチビリティテストはもちろんありますが。）

このため、OSI参照モデルで言うところの、アプリケーション層のテストに
集中できるという特性があります。
また、ブランチをマージする、という概念で、ローカル環境（エンジニアのPC）で
行うテストが単体テストと言えますが、単体テストと言えどもフィーチャーなので、
テストの範囲が組み込み系で行う単体テストのイメージよりは広くなります。
また、ここで行うローカルのテストは、結局製品全体が開発したコードとマージされた
ブランチで行うので、同時に結合テストと同様の環境でテストすることになります。

こうした事情で考えると、確かに、結合テストと呼べるものは、少なくとも、
Web製品開発では主流とは言えないと思っています。普段のテストに
包括されているイメージです。


## それでは、結合テストは死んだのか？
もしWeb製品の開発現場で結合テストをやっているところがあるとしたら、
相当な大規模のウォーターフォール開発だったり、古くからある企業などのように
思えますが、有名なショッピングサイトを持つ会社の開発においては、結合テスト、
かつ、システムインテグレーションテストを行った例がありました。
例えば、決済部分とサービス部分が、組織的にも分かれたチームで
開発された場合です。

ここでも、明確に結合テスト、という位置づけではなく、テスト、という括りでした。
実際に行っていたのは、結合テストが含まれたシステムインテグレーションテスト
でしたが、「結合テスト」という認識でのコミュニケーションはしておらず、
結合テストの概念は、Web製品開発において、一般的な項目、というわけでは
なさそうです。

## まとめ
ただし、結合テストで何をテストするかは、知っておくとテストセットを構成するのに
有利で、この辺の認識があいまいな状態でテストセットを組むのと、
知っていて作る場合とでは、テストの目的や性能、構成の抜け漏れなどに
差が出てくると考えています。

ですので、個人的な見解としては、「知識として知っておくべき」と思っています。


## 用語解説

#### テストレベル（JSTQB)
具体的にインスタンス化したテストプロセス。
https://glossary.istqb.org/ja_JP/term/test-level

#### OSI参照モデル
コンピューターネットワークのプロトコルについて、７つの層に分類したもの。
https://ja.wikipedia.org/wiki/OSI%E5%8F%82%E7%85%A7%E3%83%A2%E3%83%87%E3%83%AB
【Django】ログアウトページ遷移時に405エラーが発生した話

## 概要・目的

- Djangoの基礎的な教材に倣いながら、作成したWebサイトに「ログイン・ログアウト機能」を実装したが、いざログアウトを行おうとすると「405エラー」が発生してしまいました...
- 原因を探索したところ、DjangoにてWebサイトを実装する場合は今後も念頭に置かねばならないものであったため、こちらに備忘録として記載します。

## 事象の内容と当時の状況

### 事象

- ログインしている状態で表示されている「ログアウト」ボタンをクリックすると、「405 エラー」が表示されました。

### 記述したコード（template）

```python:template
{% extends "base.html" %}
{% load django_bootstrap5 %}

{% block content %}

{% if user.is_authenticated %}
<p>
    {{ user }}でログインしています
</p>
<p>
<a href="{% url 'logout' %}">
    {% csrf_token %}
    {% bootstrap_button button_type="submit" button_class="btn-danger" content="ログアウト" size="md" %}
</a>
</p>
{% else %}

{% endblock %}
```

## 原因と解決方法

### 原因

- コードにあるように、画面遷移に`<a>`タグを用いており、`<a>`タグによるリクエストは`GET`となります。
- 一方で、Djangoのデフォルトではログアウトビューは`POST`メソッドのみを受け付ける仕様になっており、このリクエスト方式の差により「405 エラー」が発生したようです。

### 解決方法

- 「ログアウト」ボタンクリック時に実行されるリクエスト方式が`POST`となるよう、`<a>`タグから`<form>`タグに修正します。
- また、`<form>`タグ内での`method`属性を`POST`に指定します。

```python:template
{% extends "base.html" %}
{% load django_bootstrap5 %}

{% block content %}

{% if user.is_authenticated %}
<p>
    {{ user }}でログインしています
</p>
<p>
<form action="{% url 'logout' %}" method="post">
    {% csrf_token %}
    {% bootstrap_button button_type="submit" button_class="btn-danger" content="ログアウト" size="md" %}
</form>
</p>
{% else %}

{% endblock %}

```

## 備考

- Djangoにおけるログアウトビューが`POST`のみを受け付けている理由は、`GET`よりもセキュリティ上安全であるためです。`GET`ではURLのクエリパラーメータとして情報が露出してしまいますが、`POST`では露出しません。
- 上記の理由から、ログアウトビューを呼び出す際のリクエスト方法は`POST`固定でよいかと思います。
年末の大掃除 - IBM Cloud アカウント/ユーザーの整理をしよう(ちょっとMFA)

アドベント・カレンダーには大掃除ネタを無理に突っ込む6onodaです。
今回はアカウントのユーザーの整理/ユーザー側からのアカウントの離脱です。
おまけとして、自分がどのアカウントに所属していて、どんなFMAが求められているかの話です。


# 管理者として自分の所有 IBM Cloud アカウントのユーザーの整理をする

これは、通常の管理者の仕事ですね。

トップから「管理」→「IAM」を選び、左側で「ユーザー」を選択します。
* https://cloud.ibm.com/iam/users


「所有者」「自分自身」が自分の行に表示されています。アカウント所有者で、ログインしてるのが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/568c1b73-6746-38cf-41f3-92653c6e8ad9.png)

対象のユーザーの「︙」を選ぶと、上位の権限を持っているので、削除以外にもユーザー管理ができることが分かります。
このユーザーをアカウントから除去したい場合は「ユーザーの削除」を選ぶだけです

# 自分でアカウントから離脱する

ユーザーが自分でアカウントから離脱することもできます。

やはり、下記にアクセスします。

* https://cloud.ibm.com/iam/users

自分はアカウント所有者ではないことが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/9a9a1bd0-da80-318e-15d1-3f8174c08e33.png)


自分の「︙」選ぶと、自分自身には「ユーザーの削除」が選べます。
アカウント・オーナーが「︙」を選んだ時より、選択肢が少ないことも分かります。

当然、ユーザーが特権を持っていない場合は、他のユーザーの削除は出来ません。
しかし、特権を持っていなくて自分でアカウントから離脱することはできるのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/6f07484a-a2ff-f39b-aaee-c57920141ca5.png)


# アカウントの一覧から離脱する

上記の方法ではいちいち、アカウントを切り替える必要があります。
下記、URLでアカウントの一覧を表示し、離脱を選択することもできます。

* https://iam.cloud.ibm.com/mysecurity/index.jsp

注) このサイトにアクセスするには、ユーザーに2要素認証が設定されている必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/a220e837-ad60-8e09-23b9-8196018b435c.png)

「Account membership」を展開すると、各アカウントの名前とオーナーが確認できます。

離脱したいアカウントの「︙」から「Leave Account」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/4814b692-de45-787d-9f71-0a9a8b5638c6.png)

なお、アカウント・オーナーの場合「Leave Account」は当然選べません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/717b4113-f78f-541d-210e-8b27fe3260a7.png)

## アカウントの一覧でMFAを確認する

通常、IBM Cloudでは、ログイン後に自由にアクセス可能なアカウント間で切り替えを行うことができます。
通常アカウント切り替える時に、再認証は求められません。
そのため、ログインする時に、最も制限されたFMAが求められます。
どのアカウントが、どんなFMAを求めているか、上記の、このURLで確認できます。

* https://iam.cloud.ibm.com/mysecurity/index.jsp

「MFA on Login」欄は、各アカウントがログイン時にもとめているFMAの種類を示します。
下記の例では、一番下のアカウントが、すべてのIBMidユーザーに TOTP(Time-based One-Time Password) を求めているので、ログイン時に「Google Authenticator」や「IBM Verify」を使ったFMAが求められます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/55a15091-9be6-515b-12db-4773806d7849.png)

「MFA on Account Select」は、そのアカウントに切り替えた時に必要なFMAです。
2行目のアカントには「TOTP」が設定されていて、そのアカウントに切り替えた時にFMA認証が求められます。
ただし、このFMAは非推奨となっているレガシーFMA用のもので、利用すべきではないでしょう。

表示されるFMAの種類には下記のものがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/858306bb-07a8-4dcd-dc9d-0bd2bbec128a.png)
URDF Preview でグリッドも表示されず真っ黒

# 症状
URDF Preview で表示されない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455423/9c8d0ef0-ed0b-925f-a2f1-2ba46b923080.png)

GPTに聞いたら、RobotWebTools.orgのダウンと言われ、確かにない。

[拡張機能 ROS](https://marketplace.visualstudio.com/items?itemName=ms-iot.vscode-ros#:~:text=ROS%20Web%20Tools)を見ると、
http://robotwebtools.github.io/ に代わってるけど。。。


# 原因
インストールしたROSの拡張機能が古い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455423/dd6e1b01-7568-19cc-0de9-65fab24a70a8.png)

なぜか、v0.9.2と古い。0.9.6まであるはずなのに。アップブレード方法がわからず、
とりあえず、プレリリース　バージョンへ切り替え、再起動したら表示された。

検索方法が悪いのか、そもそもこんなところでだれも引っかからないのか。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455423/4ad1190f-6dad-429c-3620-9b2e7b620edb.png)
(調査中)テストメソッド単位で、実行前にログ削除。実行後にテストメソッドのフォルダを作成し、そこに移動を繰り返す

JUnitを使って、以下のような処理をテストメソッド単位で行うことは可能です。

#### 各テストメソッドの実行前にログファイルを削除
これは、`@Before` アノテーションを使うことで実現できます。このアノテーションを付けたメソッドは、各テストメソッドの実行前に呼び出されます。

#### 各テストメソッドの実行後にフォルダを作成し、ログをそのフォルダに移動
これは、`@After` アノテーションを使うことで実現できます。このアノテーションを付けたメソッドは、各テストメソッドの実行後に呼び出されます。

#### JUnit4 実装例
以下はその処理を実現する例です：

```java
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class LogHandlingTest {

    private static final String LOG_FILE = "test.log";

    @Before
    public void deleteLogBeforeTest() throws IOException {
        Path logPath = Path.of(LOG_FILE);
        if (Files.exists(logPath)) {
            Files.delete(logPath);
            System.out.println("ログ削除: " + LOG_FILE);
        }
    }

    @After
    public void createFolderAndMoveLogAfterTest() throws IOException {
        String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
        Path folderPath = Path.of("logs/" + methodName);
        Files.createDirectories(folderPath);

        Path logPath = Path.of(LOG_FILE);
        if (Files.exists(logPath)) {
            Path destination = folderPath.resolve(LOG_FILE);
            Files.move(logPath, destination);
            System.out.println("ログ移動: " + destination);
        }
    }

    @Test
    public void testMethod1() throws IOException {
        // ダミーのログファイルを生成
        Files.writeString(Path.of(LOG_FILE), "This is a log for testMethod1");
        System.out.println("テストメソッド1 実行");
    }

    @Test
    public void testMethod2() throws IOException {
        // ダミーのログファイルを生成
        Files.writeString(Path.of(LOG_FILE), "This is a log for testMethod2");
        System.out.println("テストメソッド2 実行");
    }
}
```

説明
#### deleteLogBeforeTest:

各テストの実行前に、指定されたログファイル (test.log) を削除します。
#### createFolderAndMoveLogAfterTest:

テストメソッド名に基づいたフォルダを作成し、そのフォルダにログファイルを移動します。
#### テストメソッド (testMethod1 など):

各テストメソッドで、ダミーログを作成しています。
#### 実行結果例
テストを実行すると、以下のようなディレクトリ構成が生成されます：

```sh
logs/
  └── testMethod1/
      └── test.log
  └── testMethod2/
      └── test.log
```
IoT周りでこの一年学んだ単語をざっくりまとめてみる

既に25日もブログを書き続けれる気がしないので記事もみじかかなり粗々な感じになっていますがご容赦ください。
一年を振り返る Advent Calendar 2024の3日目です。

さて、転職してからIoTプラットフォームの開発に従事しているわけですが、IoTって結構スマートビルディングと関連することが多いなという気づきがあった一年でした。

「ちみ、ビルヂングでアイオーテーってのをやるのがいいらしいが知ってるかね」
「あ、アイオーテーですか？。。。」
「そうじゃ、ビルヂングでアイオーテーってのがいいらしいんじゃ」
（っていう会話をしてそうな画像を生成AIに作らせたらこんなのが出てきました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626174/6b3b44c8-3612-f106-8eb8-652e5fca39b7.png)

ということで、この一年で初めて聞いた単語を個人的にまとめてみようと思います。

## BACnet
ビル管理やってる人とかIoTとかエンベデッド周りのエンジニアさんにとっては当たり前の知識かもしれませんが、ビルに制御ネットワークのプロトコルがあるなんて知らなかったのでなかなかに驚きの単語でした。

https://www.watanabe-electric.co.jp/bacnet/about.html

Building Automation and Control Networking protocolの略で、空調、照明、アクセス制御、火気検出などの総合的制御に使われるインテリジェントビル用ネットワークのための通信プロトコル規格とのことです。BACnetの通信としてはUDP/IPを利用しているようです。

この記事が結構詳しく調べてくれててわかりやすかったです。

https://qiita.com/kzfrkw/items/7d94dbb6dbd45a66851c

## ZEB
これは直接ITの技術にかかわらないかもですが、ゼブって聞いたときに最初全く分からなかったです。ようはビルで使うエネルギーを効率的に運用してるようなビルのことをZEBっていうみたいです。

https://www.env.go.jp/earth/zeb/terms/index.html?id=term_01

ZEB（Net Zero Energy Building）

- 先進的な建築設計によるエネルギー負荷の抑制やパッシブ技術の採用による自然エネルギーの積極的な活用、高効率な設備システムの導入等により、室内環境の質を維持しつつ大幅な省エネルギー化を実現した上で、再生可能エネルギーを導入することにより、エネルギー自立度を極力高め、年間の一次エネルギー消費量の収支をゼロとすることを目指した建築物のことです。

## スマートビルディング
ZEBに関連して、スマートビルディングなる用語もあります。（前後関係逆かな。）これは一般的な用語で聞いたことはありましたが、この辺のガイドラインもIPAで策定されているのは初見だったのでこの辺も学びでした。

https://www.ipa.go.jp/digital/architecture/guidelines/smartbuilding-guideline.html
（ガイドラインのレビュワーリストに見たことのある名前が。。。すごい。。。）

## BACS 
Building Automation and Control Systemの略称。ビルにおける電気・照明・熱源・空調・給排水衛生・防災・防犯などの各設備を統合的に監視制御し、効率的で安全な設備管理や運用を実現するためのシステムやエンジニアリング技術の総称を表す。 

## まとめ
まとめなのか何なのか。とりあえず自分がかかわっているIoTがどうもスマートビルディングに寄っているのでこういった単語をよく目にしました。他にもスマートファクトリーとかにも触れる機会がありましたが、モノってなんでもIoTデバイスになれるんだなと思いました。
もっと色々勉強していきたいと思います。
(調査中)Excel VBA を使用して curl コマンドを実行し、結果から「Authorization」の値だけを抽出

Excel VBA を使用して curl コマンドを実行し、結果から「オーソリゼイション」の値だけを抽出し、後続の処理に渡すことは可能です。以下にその方法の概要を説明します。

## 方法の概要
#### Excel で入力欄を用意する

固定の入力欄（セル）に、curl コマンドに必要なパラメータ（URL、ヘッダー、データなど）を記載します。
#### VBA で Shell を使って curl を実行

VBA の Shell 関数を使って curl コマンドを外部で実行し、その結果をテキストファイルに出力します。
#### 結果を解析

テキストファイルを VBA で読み取り、Authorization ヘッダーの値を抽出します。
#### 後続処理

抽出した値を変数として他の処理に渡します。

#### 実装例
1. Excelのセルに入力
セル A1: URL（例: `https://api.example.com/endpoint`）
セル A2: ヘッダー情報（例: Authorization: Bearer <token>）
セル A3: POSTデータ（例: {"key": "value"}）

```vb
Sub ExecuteCurlAndExtractAuthorization()
    Dim curlCommand As String
    Dim url As String
    Dim headers As String
    Dim postData As String
    Dim outputFile As String
    Dim resultFile As String
    Dim authValue As String
    Dim fileContent As String
    Dim shellOutput As Double
    
    ' Excel から値を取得
    url = ThisWorkbook.Sheets(1).Range("A1").Value
    headers = ThisWorkbook.Sheets(1).Range("A2").Value
    postData = ThisWorkbook.Sheets(1).Range("A3").Value
    
    ' 出力ファイル
    resultFile = Environ("TEMP") & "\curl_result.txt"
    
    ' curl コマンドの作成
    curlCommand = "curl -X POST """ & url & """ -H """ & headers & """ -d """ & postData & """ -o """ & resultFile & """"
    
    ' curl 実行
    shellOutput = Shell("cmd.exe /c " & curlCommand, vbHide)
    DoEvents ' 実行完了を待つ
    
    ' テキストファイルを開き、Authorization ヘッダーを抽出
    On Error GoTo ErrorHandler
    fileContent = ""
    Open resultFile For Input As #1
    Do While Not EOF(1)
        Line Input #1, fileContent
        If InStr(fileContent, "Authorization") > 0 Then
            authValue = Trim(Split(fileContent, ":")(1)) ' "Authorization: ..." から値を抽出
            Exit Do
        End If
    Loop
    Close #1
    
    ' 後続処理に authValue を渡す
    MsgBox "Authorization Value: " & authValue
    
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description
    If Not EOF(1) Then Close #1
End Sub
```


#### 注意点
curl のインストール
curl コマンドが実行可能であることを確認してください。Windows の場合、コマンドプロンプトで curl が利用可能かを確認します。

#### 権限の設定
API の実行に必要な権限やトークンを適切に設定してください。

#### デバッグ
結果が期待通りでない場合、resultFile の内容を確認し、出力結果の解析が正しいかチェックしてください。

#### エラー処理
ネットワークエラーやコマンド実行エラーに備えたエラー処理を追加することをおすすめします。
Spring MVCのコントローラで、コンストラクタでのログキャプチャがうまく動作しないケース

コンストラクタ内でのログキャプチャが動作しないのは仕様と考えられます。これは、SpringコンテナのDIプロセス中にロガーやAppenderが正しく初期化されていないためです。
`@PostConstruct`または通常のメソッドにログ出力を移すことで、この問題を回避できます。
テスト環境でのログキャプチャには、LogbackのListAppenderを適切に設定してください。



## ロガーの初期化タイミング

SpringはBeanの初期化プロセスでDIを行います。このプロセス中にロガーを設定するAppender（例えばListAppender）が未初期化の状態であると、ログがキャプチャされないことがあります。
コンストラクタはDIが完了する前に呼び出されるため、コンストラクタ内でのログキャプチャが期待どおりに動作しない可能性があります。
## ログの遅延適用

Logbackでは、ログの設定（logback.xmlやlogback-test.xml）が完全に適用される前に出力されたログは、適切なAppenderに渡されない場合があります。
特にテスト環境では、Spring Test Contextの初期化がlogback-test.xmlの設定より先に行われることが原因となりえます。

## 解決策
#### 1.`@PostConstruct`を利用
Springの`@PostConstruct`アノテーションを利用すると、DIが完了した後に処理を実行できます。このタイミングではAppenderも利用可能です。

#### 2. Spring Test Contextを適切に設定
JUnitテストでは、Springのテストコンテキストとlogback-test.xmlの適用順序を確認します。必要に応じて、設定ファイルの適用タイミングを調整してください。

#### 3. コンストラクタログキャプチャの回避
ログキャプチャが必要な処理をコンストラクタから分離し、別のメソッド（例えばinitメソッド）に移動させます。
Ubuntu24.04 + Platformio(venv) + VSCode

# 目的
Ubuntu24.04のPythonのvenv上にpipで入れたPlatformioをPlatformioIDE for VSCodeで使用します。

# 方法
## Platformio用のvenvを作る
```bash:~/Documents/Platformio/とか
python -m venv venv
```
## venv内にPlatformioを入れる
```bash:~/Documents/Platformio/とか
. venv/bin/activate
python3 -m pip install -U platformio
```
## VSCodeにPlatformioIDE for VSCodeを入れる
拡張機能からInstallします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1398068/d7bdaa35-cfc4-1824-5440-c15bf273a59b.png)

## 拡張機能用のPATHを指定する
VSCodeのSettingsに`@ext:platformio.platformio-ide`と入力してPlatformioの設定を開きます。
ここで以下のの2つの設定をします。
- 拡張機能に同梱されたPIOCoreを使わないようにする
- venvのPlatformioのPATHを拡張機能に渡す
### 拡張機能同梱のPIOCoreを使わないようにする
`Platformio-ide: Use Builtin PIOCore`のチェックボックスを外します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1398068/33b081c0-de68-1f3c-8ad9-da758f650e97.png)

### venvのPlatformioのPATHを拡張機能に渡す
venvを有効化した状態で以下のコマンドを実行してPlatformioのPATHを探します。
```bash
echo $PATH
```
私の場合だと`home/{usrname}/Documents/Platformio/venv/bin`でした。
このPATHを`Platformio-ide: Custom PATH`から設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1398068/6ebd4acb-f2f8-9be3-86f8-fa0347c58624.png)
`Edit in settings.json`をクリックして開いた`settings.json`に以下のようにPlatformioのPATHを入力して保存します。
```json
{
    ...
    "platformio-ide.customPATH": "/home/{username}/Documents/Platformio/venv/bin",
    ...
}
```

以上で作業は完了です。
VSCodeでPlatformioのプロジェクトを開くとvenvのPIOCoreを使ってくれるようになりました。
お疲れ様でした。
status code: 404, request id: D! should retry true for imds error : EC2MetadataError: failed to make EC2Metadata request

## EC2のログで出たエラーの解決策

```
status code: 404, request id: D! should retry true for imds error : EC2MetadataError: failed to make EC2Metadata request
```

#### 解決策
EC2のインスタンスメタデータタグの有効化

AWSコンソール画面から有効化できる。


#### 原因
デプロイ時EC2を新規作成させた際に、デフォルトで設定されるIMDSのバージョンが変更されていた

IDMSv1　→ IDMSv2

EC2インスタンスの詳細で　「IDMSv2 required」　になっていると、IDMSv2のみ使用されている。
IDMSv2を使用する場合は、EC2のインスタンスメタデータタグの有効化が必要の模様。

```
2024 年半ば – 新しくリリースされた Amazon EC2 インスタンスタイプは、
デフォルトで IMDSv2 のみを使用します。
移行をサポートするために、これまで同様に、
インスタンス上での起動時または起動後に再起動や停止/開始を必要とせずに 
IMDSv1 を有効化できます。
```

#### 備考

cloudwatch agent　の特定バージョンから起こっているようす
v.1300049




#### 公式記事　AWS
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html#tools-for-transitioning-to-imdsv2

https://aws.amazon.com/jp/blogs/news/amazon-ec2-instance-metadata-service-imdsv2-by-default/

#### 参考記事
https://github.com/aws/amazon-cloudwatch-agent/issues/1435
競プロ日記#24/12/03

# A048_A-AtCoderxxxContest
- char同士で+演算したり"A" + char + "C"もエラーが発生するのでstringのstrに「AXB」という形で用意してstr[1]に入れるようにやり方を変えたら通った
- ちなみに解答例は「cout << a [0] << b [0] << c [0] << endl ;」演算子を使って連結するのではなく単純に一文字ずつ出力。
今年 1 年の個人的な MySQL 関連ネタ登壇を振り返る

これは **[MySQL Advent Calendar 2024](https://qiita.com/advent-calendar/2024/mysql)** 3 日目の記事です。

2 日目は meijik さんでした。

http://blog.kimuradb.com/?eid=877722

---

3 日目の枠が空いていたので（むりやり）埋めました。

特に有益な話はありません。

## 登壇スライド集

[Docswell](https://www.docswell.com/user/hmatsu47) に置いてあります。

https://www.docswell.com/user/hmatsu47

正直、今年の前半の登壇ネタはほとんど覚えていませんでした（これを見返して思い出しました）。

自社で AWS の Aurora MySQL を使っていて、HeatWave on AWS を検証中なので、Aurora と HeatWave が中心になっています。

### zero-ETL（with Redshift）関連

1 〜 3 月は Redshift との zero-ETL 統合ネタを中心に話していたようです。

https://www.docswell.com/s/hmatsu47/538Q3D-2024-01-05-011625

https://www.docswell.com/s/hmatsu47/KJLP8N-2024-01-25-221651

このあたりは Aurora MySQL / PostgreSQL の両方を対象に話していますね。

zero-ETL 統合（Redshift）でレプリケーションフィルタが使えない点は個人的に不満に感じていましたが、後から対応しました。

https://www.docswell.com/s/hmatsu47/KM1D48-2024-03-28-235143

### LLM（生成 AI）関連

[大昔に Aurora ML で Comprehend を扱ったことがありました](https://speakerdeck.com/hmatsu47/aurora-guan-lian-atupudeto?slide=11)が、新たに Bedrock にも対応したようなので試してネタにしました。

https://www.docswell.com/s/hmatsu47/KQ8D2V-2024-03-15-222627

前のときにも思いましたがちょっと微妙でした。

### Cloudflare（と MRS）関連

Cloudflare Workers から MySQL への接続対応の進捗状況と、MySQL Shell for VS Code と MySQL Router を使って MySQL Rest Service（MRS）経由での接続について扱いました。

https://www.docswell.com/s/hmatsu47/5DEPW6-2024-05-04-020050

前者（Node.js 用モジュール mysql2 の Cloudflare Workers 対応）についてはどうやらここからまともに進まなかったようなので、Cloudflare としては別の方向に舵を切った模様です。

MRS については（少なくともこの時点では）「まだまだ」な印象でした（VS Code での操作が不安定で辛かった）。

:::note
こちらの記事に書かれているとおり、MySQL Shell for VS Code は晴れて（？）GA になりました。

- **[第112回 MySQL Shell for VS Code GAリリース⁠⁠、PostgreSQLが2週連続で更新版リリース](https://gihyo.jp/article/2024/12/ossdb-various-news0112)（OSSデータベース取り取り時報）**
:::

### HeatWave on AWS 関連

「出るぞ出るぞ」と言われながら、なかなかリリースされなかった HeatWave on AWS の PrivateLink 対応が来たので。

https://www.docswell.com/s/hmatsu47/Z6VGX8-2024-10-15-220934

:::note
今年の re:Invent 期間にこれ↓が発表されたのですが、PrivateLink での接続方法は変えるのでしょうか？（NLB はそれなりにお値段が…）

- **[【アップデート】AWS PrivateLinkでNLBを介さずにVPC内リソースにアクセスできるようになりました！ #AWSreInvent](https://dev.classmethod.jp/articles/privatelink-vpc-endpoint-direct-access-update/)**

:::

いまこれを書いている時点では「HeatWave on AWS の HA 対応が出るぞ出るぞ（？）と言われながらリリースのアナウンスがない状態」ですが、果たして…？

### むかし話

とりあえず内容はノーコメントで（？）。

https://www.docswell.com/s/hmatsu47/5DNER6-2024-08-27-004817

大雨で東海道新幹線が止まる中、この登壇のために長野経由で東京に出て長野経由で（長野に一泊して）帰ったのは良い思い出です。

## 今後の予定

年内はこちらで MySQL 系を含む DB 関連のアップデートの話をする予定です。

https://jawsug-nagoya.connpass.com/event/336978/

そして年明けにはこちらで（おそらく）同じテーマの話をする予定です。

https://jawsug-yokohama.connpass.com/event/337180/

また、わたしの地元で 2025/2/22（土）に開催の [PHP カンファレンス名古屋 2025](https://phpcon.nagoya/2025/) でこちらの話をする予定です。

https://fortee.jp/phpcon-nagoya-2025/proposal/1decff64-5513-442b-848b-28d798b1fa8b

---

4 日目は yoku0825 さんです。

https://yoku0825.blogspot.com/2024/12/conoha-vpsmysql-2024.html
【AWS re:Invent2024】朝ヨガセッションで運動不足解消できた気がした

# はじめに

本日からいよいよAWS re:Invent2024スタートですね！今年はどんな5日間になるのかとても楽しみです！☺️

https://reinvent.awsevents.com/

今年もYogaセッションがあることに気づき、昨年に引き続き参加してきました！

# 今年もやっぱり早起き

若干寝坊して5時半に起きて、ホテルを出たのは5時45分ごろ、まだ薄暗い中出発しました🚶

まずはこの時間に起きることができた自分に拍手👏しました笑

開始時刻の20分ほど前に到着すると、すでに列ができていました。

![IMG_3803.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/05a06bfa-3e7e-03b4-b526-a429aa1f50f1.jpeg)

# 軽食で提供されたプロテインバーが美味しい

会場にはフルーツや飲み物が置かれていたのですが、中でもホームメイドプロテインバーが美味しくて早起きした甲斐がありました！

![IMG_3810.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/c08bb6f3-89ab-b4c8-8b6d-b99a2363ebd9.jpeg)

さらに可愛いボトルのお水もゲット！🌼

![IMG_3807.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/538043c7-14da-4870-8dc0-b53680ea0bde.jpeg)

# ゆるゆるだと思っていたヨガはハードだった

リラックスポーズだけではなく、体幹トレーニングのようなポーズも多く取り入れられており日頃運動不足の私は少し息があがりました笑

しかし、終わった後は身体がスッキリしていて参加してよかったです！

# 今回もマットは持ち帰りできた

昨年に引き続きヨガマットを頂けたのでホテルの部屋でのストレッチに活用したいと思います:relaxed:

![IMG_3816.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/b15b9065-274a-0cf8-1f8c-4e1a3af6813a.jpeg)
LLMの推論精度を劇的に向上！クリティカルトークンを活用した新手法cDPOの詳細解説

# Critical Tokens Matter: Token-Level Contrastive Estimation Enhances LLM’s Reasoning Capability

大規模言語モデル（LLM）の推論能力を根本的に向上させる新しい研究「Critical Tokens Matter: Token-Level Contrastive Estimation Enhances LLM’s Reasoning Capability」をご紹介します。本研究は、「クリティカルトークン」と呼ばれる推論誤差の原因となるトークンを特定し、それを活用してモデルの性能を劇的に向上させる革新的なアプローチを提案しています。

---

## 論文情報
- **タイトル**: Critical Tokens Matter: Token-Level Contrastive Estimation Enhances LLM’s Reasoning Capability
- **リンク**: [arXiv:2411.19951](https://arxiv.org/abs/2411.19951)
- **発表日**: 2024年11月29日
- **著者**: Zicheng Lin, Tian Liang, Jiahao Xu, Xing Wang, Ruilin Luo, Chufan Shi, Siheng Li, Yujiu Yang, Zhaopeng Tu
- **DOI**: 未記載

---

## 背景と目的

### LLMの推論タスクにおける課題
LLMは、自然言語処理の多くの分野で革新をもたらしましたが、特に数学的推論や複雑な論理的思考を要するタスクでは、依然として精度が不十分な場合があります。その主な原因の一つが「誤ったトークン生成」です。

例えば、以下のような問題があります：
- **クリティカルトークンの影響**: 
  「Mathildaが友人に借りたお金を返済しようとし、最初に$125を支払い、残りの75%を返済する必要がある場合、元々いくら借りていたか」という問題では、"owed"（借りた）と"paid"（支払った）を誤って解釈することで、誤答に繋がることが多いです。

### 従来手法の限界
#### DPO（Direct Preference Optimization）の課題
- ポジティブとネガティブな例を比較してモデルを調整する方法ですが、例全体の比較に基づくため、個々のトークンの重要性を考慮できない。
- 推論タスクでは、誤りの原因が特定のトークンに集中するため、このアプローチでは誤りの根本原因を特定できない。

### 研究目的
本研究は、以下の2つの課題に答えることを目的としています：
1. 推論タスクにおいて、どのトークンが結果を誤らせる原因となるのか？
2. そのトークンを活用してモデルの精度をどのように向上させられるか？

---

## 提案手法

### Contrastive Direct Preference Optimization（cDPO）
cDPOは、推論誤差の原因となるトークンを特定し、それをモデルの調整に反映させる新しい手法です。従来のDPOをトークンレベルに拡張し、より細かい調整を可能にしました。

#### コントラスト推定（Contrastive Estimation）の仕組み
cDPOでは、ポジティブモデル（正しい推論経路を学習）とネガティブモデル（誤った推論経路を学習）のトークン生成確率を比較し、クリティカルトークンを特定します。

**数式**:
$$
s_t = (1 + \beta) \log p(y_t | x, y_{<t}) - \beta \log q(y_t | x, y_{<t}) - \log Z
$$
ここで、$p$はポジティブモデル、$q$はネガティブモデルの生成確率を示し、$s_t$はトークン$t$のスコアを表します。

低い$s_t$を持つトークンは、誤りに寄与している可能性が高いとみなされ、クリティカルトークンとして分類されます。

#### トークンレベルの報酬最適化
cDPOでは、トークンレベルでのスコアリングを活用し、クリティカルトークンにペナルティを与える一方で、正しい推論を促進するトークンには正の報酬を与えます。

---

## 実験の概要と結果

### データセット
1. **GSM8K**: 小学生レベルの数学問題（例：割合計算、数列）。
2. **MATH500**: 大学レベルの高度な数学問題（例：微分積分、確率論）。

### ベースライン手法との比較
- **DPO**: 例全体を対象にした最適化手法。
- **Token-DPO**: トークンレベルでのKLダイバージェンスを導入。
- **RPO**: 繰り返し推論を考慮した最適化手法。

### 実験結果
1. **GSM8K**:
   - 提案手法（cDPO）は平均精度77.2%を達成。
   - ベースライン（DPO: 56.4%、RPO: 67.5%）を大きく上回りました。
2. **MATH500**:
   - 平均精度33.4%を記録し、特にLlama-3-70Bで45.6%の最高スコアを達成。

---

## 考察と今後の展望

### 提案手法の意義
- 推論誤差の原因をトークン単位で特定することで、精度向上が可能。
- 数学以外のタスク（法的文書、医療診断など）への応用可能性が高い。

### 今後の課題
1. 高い計算コストを要する点を改善。
2. 他のタスクでの一般化性能を検証する必要性。

---

この記事が皆さんの研究や実務に役立つことを願っています。ご質問やフィードバックがありましたら、コメント欄にお寄せください。
Clineを使って簡単なWebアプリを作る（Spring Boot3）

# 今日の目的
 - `Cline`を使って、`Spring Boot3`のWebアプリを作る
 - アプリは書籍管理システムとする
 - とりあえず簡単な１画面（書籍一覧）を作る 
# アプリの構成
 - `Java`：21
 - `Spring Boot`：3.4.0
 - `MyBatis`
 - `H2 Database`
# 実装作業と動作確認
[実演デモ動画](https://youtu.be/iqI2MJmwOvE)
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781232/0757bd90-e201-c568-6023-8228b3d91aa5.png)
```text:プロンプト
書籍管理システムを作成してください。ただし、アプリの動作確認は不要です。
# 機能
## 書籍一覧表示
## 書籍新規登録
## 書籍編集
## 書籍削除
## 書籍貸出
## 書籍返却
# 書籍データ項目
## 書籍ID：book_id
## タイトル：title
## 著者：author
## カテゴリ：category
## 出版日：publish_date
## 価格：price
## 貸出日：borrowed_date
## 借り手：borrower
## 返却予定日：expected_return_date
## ステータス（0:未貸出,1:貸出中）：status
# 要件
## JavaScriptのライブラリとしてjQueryを使用する。
## DB処理ではjpaは使用せず、MyBatisを使用する。
## ソースコードにはできるだけコメントを記載する。
## 画面のデザインは青色をベースとして、ポップなデザインとする。
## Spring SecurityのCSRF対策を適用する。
## 脆弱性に気をつけて実装する。
```
# わかったこと
 - `Spring Boot3`アプリの新規作成については`Cline`は苦手。それっぽい挙動はするが、完成しなかったため、手動で新規作成した
 - `Cline`はブラウザを起動して動作確認して修正することもできるが、動作確認の結果を適切に判断できないことがあり、意図しない方向に修正することがあった。このため、プロンプトに「アプリの動作確認は不要」をつけた
 - `Cline`はアプリの解析も得意
 - できあがったアプリは一部不完全（レイアウト崩れや未実装）であったが、そこそこ整合性がとれていた
 - 足りない部分や誤りを指摘することで、AIで修正できた
# 今後の予定
 - AIによる書籍管理システムの機能追加
 - AIによるテストコードの作成
 - AIによるテストの実施
 - AIによるコードレビューと修正
UUID の基本的なところについてまとめてみる

# はじめに

業務内で「UUID」という言葉が出てきたのですが、聞いたことあるけど何だこれは状態だったので、この「UUID」について基本的な部分を掘り下げてまとめていきたいと思います。

# UUID とは？

UUID とは Universally Unique Identifier の略です。

直訳すると「普遍的に重複しないID」になり、意味としてはほぼそのままで、将来にわたって重複や偶然の一致が起こらないという前提で使われるIDのことを言います。

UUID は RFC で仕様が規定されていて、生成方法の違いによりいくつかのバージョンが存在します。

今日、よく使用される UUID v4 は、疑似乱数によって生成されています。

UUID は 以下のような 128 ビットの値で、標準的には以下のようなハイフン 5 つに区切られた 16 進数の文字列です。

`123e4567-e89b-12d3-a456-426614174000`

# UUID は本当に重複しないのか？

UUID は普遍的に重複しない、そんなことは可能なのでしょうか？

可能性が低すぎて可能なのです。

どういうことかというと、理論的に重複する可能性はあるけど、実際には重複する確率が極めて低いため、実用上は重複しないと考えられています。

どれぐらい低いかというと、理想的な暗号学的乱数を使用した場合、衝突確率が 0.5 になるまでに約 230 京回の生成が必要となるぐらいです。（あくまで理論値）

とりあえず限りもなく小さい可能性であることは理解できるかなと思います。

# 他のバージョンや似たような概念について

使用頻度の高い UUID v4 について、上述しましたが他のバージョンや似たような概念があります。 

## UUID v7

UUID v4 と同様に 128 ビットのランダムな識別子です。

UUID v7 は現在時刻を表すナノ秒単位のタイムスタンプに基づいて生成されるので、生成時刻を基準にソートすることができるのが v4 との違いです。

## ULID（Universally Unique Lexicographically Sortable Identifier）

UUID の欠点を補う形で設計された一意識別子です。

先頭 48 ビットにタイムスタンプを置くことでソート可能となっています。

残りの80ビットがランダムな値になります。

識別子のフォーマットは以下のようになります

`01GWKR0SQ0KD0QZ3SHEEAM8YDJ` 

UUID よりも短く、可読性が高いことがわかります。

上記のように、UUID と ULID にはそれぞれ特徴があるので、この特徴を理解した上で適切なユースケースで使っていきたいものです。

# 最後に

UUID についてまとめていく中で、理論上絶対ではないが、現実にはまず発生しない、発生させようとしたら途方もない時間がかかる状態を作り上げることで「発生」しないとみなす考え方（計算量的安全性）を知ることができました。

言葉の意味を知るだけでなく、その裏にある考え方まで理解する意識をこれからも持ちたいと思いました。

# 参考文献

https://www.swisteria.com/posts/uuid/

https://giginc.co.jp/blog/giglab/uuid-ulid

https://gigazine.net/news/20201019-uuid-randomness/

https://zenn.dev/kazu1/articles/e8a668d1d27d6b

https://wa3.i-3-i.info/word13163.html

https://developer.mozilla.org/ja/docs/Glossary/UUID
Material UIでDividerの色を変更する

小ネタ記事になります

`Divider`を用いる際、色の変更するのにパッとcolorを指定するだけではダメだったので備忘録です。

## 対処法

```ts
<Divider sx={{ borderBottomWidth: '1px', borderColor: '#DADADA' }} />
```

以上です。根本原因はプロジェクトのテーマ設定や、`devias-kit`というものを用いていた都合もあるかもしれませんが、`color`とか`width`ではなく`borderBottomWidth`と`borderColor`で`Divider`に色をつけることに成功しました。

### devias-kitとは

MaterialUIの、さらにコンソール（管理）画面に特化した有料ライブラリです。

プランによってはFigmaデータがもらえたりするので管理画面の開発をする際は発生する開発コストと天秤にかけながらこういう有料ライブラリの検討もして良いと思います。

https://mui.com/store/items/devias-kit-pro/
ラズパイ　ＵＳＢ接続　＆　ＳＡＭＢＡで共有

１．ＵＳＢ接続は　以下で問題無
https://qiita.com/m_sunafukin77/items/ca0e8c26d5b7a47c2427
但し、アンマウントが難だったので
２．gpartedをインストール、起動してアンマウント
```
sudo apt update
sudo apt install gparted 
sudo gparted
```
３．アンマウントだけなので　gparted を削除
```
sudo apt remove gparted
```
４．ＳＡＭＢＡを導入　以下で問題無
https://qiita.com/m_sunafukin77/items/930317457a7c845b28cb

いよいよ　ＩＯＴでのＰＣ起動とかの設定をやるぞ。
モデリングの話

## なぜモデリングをするのか

「モデリングをする」というと、「どうしてモデリングをするのですか？」と
尋ねられることがあります。

仕様を整理し、抜け漏れを探すのに、モデルがあるとないでは大きな違いがあります。
理解を助け、抜けている処理る処理や条件を洗い出すのに、モデリングで可視化することは
非常に役立ちます。

また、可視化された情報は、議論のたたき台として、
ビジネスユーザーと、振る舞いを共有するときにも使えます。
CSの方がUMLで新機能の動きが理解できれば、適切なサポートになり、
これもまた、ユーザーが受ける品質に寄与します。

例えば、状態遷移図から状態遷移表を作って、抜けている箇所を見つけるのは
有名ですね。テストで使われるモデリングには、国際的に使われるものや、
主に国内で使われるものなど、様々なものがあります。


## モデリングをすると何が違うのか
モデリングがある場合、ステークホルダーが多い場合の情報共有に便利ですし、
レビューによって、認識のずれを訂正しやすくなります。
「出来上がったものが、思ってたのと違った」
というような行き違いを削減するのに寄与します。

また、モデリングによって洗い出された、エンティティのライフサイクルを
見通してCRUD条件を洗い出したり、操作のリピートのテストが必要であると判断したり、
いろいろな気付きを得ることができます。

なお、少し余談ですが、人の記憶タイプは、読み・書き・両方、などの
個人の特性がありますが、モデリングにも好き・嫌いや、得意・不得意がある傾向がみられます。
モデリングをする時間がもったいない、という現場もあるでしょうから、
適切に判断するのがよいでしょう。

個人的な経験としては、基本的な処理はUMLにしておき、新しいメンバーが入った時の
説明に使ったり、根幹の処理だけでも作って置き、抜け漏れ防止に使うなど
部分的に適用するのが、リソース的にもバランスが良いと思っています。

モデリングには多数の種類があり、それぞれ目的に応じて適切なものを選びたいですね

## いろいろなモデリング

#### UML
国際的に使われるモデリング言語。
現在も拡張されている。

#### マインドマップ
マインドマップをモデリングに数えていいのかは少し悩みますが、テスト設計には
欠かせないものです。下記の図は、軽いサンプルです。
Xmind というツールでかかれています。TabとEnterの操作だけおぼえれば、
すぐにでも書けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156898/39654436-736c-1598-8b3c-b01c27ddf6f1.png)

#### 状態遷移図
〇〇中、と書くのがコツで、目的によっても書き方が変わります。
書きあがったら、〇〇中（状態）をつなぐ線の部分にテスト条件を組み合わせて
テストを設計することができます。

いまはインターネットで調べれば、たくさんの凡例が出てきますね。

#### 特性要因図
別名「魚の骨」、「石川ダイアグラム」と、いろいろな呼び名がありますが、
古くから使われており、不具合の原因分析や、制作物のタスク分解などに便利です。
これも Xmind で、書くことができます。

#### あみだダイアグラム
はな丸が考案した、時系列のイベントと条件を整理するときに使っている、見た目があみだくじのようなダイアグラム。

以前はお刺身モデルと言っていましたが、海外ではSashimi modelという
ワークフロー(＝バックスラッシュモデル？）があるようですので、変えてみました。
T2Vid: 長文テキストを多画像化してビデオ理解を革新する新アプローチ

# T2Vid: Translating Long Text into Multi-Image is the Catalyst for Video-LLMs

今回は、「T2Vid: Translating Long Text into Multi-Image is the Catalyst for Video-LLMs」という論文をご紹介します。この研究は、ビデオ理解モデルにおける大きな進展を示すものであり、画像ベースの大規模言語モデル（Image-LLMs）を革新的に拡張した新しいアプローチです。

---

## 目次

1. 論文情報  
2. 背景と目的  
3. 提案手法の詳細  
   - 問題設定と目標  
   - 合成データ生成プロセス  
   - 時間的文脈のモデリング  
4. 実験と結果  
   - 実験デザイン  
   - ベンチマーク結果と解釈  
5. 関連研究との比較  
   - 他手法の限界とT2Vidの優位性  
6. 学術的意義と今後の展望  
   - 本研究の革新性  
   - 次の研究ステップ  

---

## 論文情報

- **タイトル**: T2Vid: Translating Long Text into Multi-Image is the Catalyst for Video-LLMs  
- **リンク**: [arXiv:2411.19951](https://arxiv.org/abs/2411.19951)  
- **発表日**: 2024年11月29日  
- **著者**: Shukang Yin, Chaoyou Fu, Sirui Zhao, Yunhang Shen, Chunjiang Ge, Yan Yang, Zuwei Long, Yuhan Dai, Tong Xu, Xing Sun, Ran He, Caifeng Shan, Enhong Chen  
- **DOI**: 10.48550/arXiv.2411.19951  

---

## 背景と目的

### ビデオ理解の現状
ビデオ理解は、膨大なデータ量と複雑な時間的構造を伴うため、AI研究における重要な課題となっています。しかし、従来の手法では以下の課題があります：

1. **時間的関係のモデリングが不十分**  
   - Image-LLMsは、単一フレームに基づく推論には優れるものの、フレーム間の因果関係や時間的文脈を学習する能力が限られています。  

2. **データセットの制約**  
   - ビデオデータセットの収集やアノテーションには高いコストが伴い、データ多様性が不足していることが多い。  

### 本研究の目的
T2Vidは、これらの課題を克服するために、長文テキストを利用してビデオライクな合成データを生成する革新的な手法を提案します。このアプローチにより、以下を達成することを目指します：  

1. 時間的文脈を明示的にモデル化する。  
2. 少量のデータで高い学習効率を実現する。  
3. 長文テキストを新たなデータソースとして活用する。  

---

## 提案手法の詳細

### 問題設定と目標
本研究では、長文テキストを以下の形式に変換することで、時間的文脈を持つビデオデータの生成を目指します：

$$
\text{ビデオ} \approx \text{長文テキスト} \rightarrow \text{複数の画像} \rightarrow \text{時系列データ}
$$

この式が示すように、長文テキストを画像形式に変換し、それらを時系列的に並べることでビデオライクなデータセットを生成します。

---

### 合成データ生成プロセス
1. **長文テキストの分割**  
   長文テキストをセグメントに分割し、各セグメントをビデオの1つのフレームとして扱います。

2. **画像生成**  
   セグメント化されたテキストを画像生成モデル（例：Stable Diffusion）を用いて視覚データに変換します。

3. **時間的文脈の統合**  
   生成された画像を時系列に並べ、時間的関係を保持したデータセットを構築します。

---

## 実験と結果

### 実験デザイン
- **使用モデル**:  
  - MiniCPM-8B, Idefics3-8BなどのImage-LLMs。  
- **評価データセット**:  
  1. Video-MME: 多様なシナリオを含むビデオデータセット。  
  2. MVBench: 視覚認知タスクを評価。  
  3. TempCompass: 時間的文脈理解を測定。  

---

### ベンチマーク結果と解釈
提案手法は以下の結果を示しました：

| モデル         | データ量 | 短尺ビデオ | 長尺ビデオ | 平均性能 | 学習時間 |  
|----------------|---------|-----------|-----------|---------|---------|  
| LLaMA-VID     | 200K    | 45.3      | 36.2      | 39.9    | 100時間  |  
| LongVA         | 200K    | 48.8      | 45.4      | 47.1    | 100時間  |  
| **T2Vid**     | 30K     | **67.0**  | **53.7**  | **60.3**| **12時間**|  

**解釈**:  
1. **データ効率の向上**:  
   T2Vidはわずか30Kのデータで、200Kサンプルのモデルを上回る性能を発揮しました。  

2. **時間的文脈の理解**:  
   長尺ビデオでの性能向上は、時間的文脈の明示的なモデリングが寄与しています。

---

## 関連研究との比較

### 他手法の限界
1. **LLaMA-VID**  
   - 長文テキストの理解に優れるが、時間的情報を扱う能力が限られている。  

2. **LongVA**  
   - 長尺ビデオへの適応性が高いが、データ形式が固定的で柔軟性に欠ける。  

### T2Vidの優位性
- 合成データ生成による多様性の向上。  
- ビデオ理解モデルへの低コストな適応。  

---

## 学術的意義と今後の展望

### 本研究の革新性
1. **新たなデータソースの活用**  
   長文テキストをビデオデータの代替として利用するという新しいアプローチを提示。  

2. **時間的文脈の明示的なモデリング**  
   従来のImage-LLMsでは困難だった課題を解決。  

### 次の研究ステップ
1. 合成データの品質向上。  
2. 他のモダリティ（例：音声や動きデータ）への適用。  
3. 実世界での応用例（教育、監視システムなど）での検証。  

---

この記事が、皆さんの研究や実務に役立つことを願っています。ご質問やフィードバックがありましたら、ぜひコメントでお知らせください！
アドカレ初参加の意気込み -はじめてのひとりアドカレ2024 by hayami

## はじめに
はじめまして、hayamiと申します。普段はSIerで3年目のエンジニアをやっています。
本記事は「[はじめてのひとりアドカレ2024 by hayami Advent Calendar 2024](https://qiita.com/advent-calendar/2024/adcale-hayami)」の1日目の記事となります。

今までは個人でのインプットが多く対外的にQiitaやブログ等を書いてこなかったのですが、3年目にもなり、少しずつ「あの時はありがとうございました」と各種技術記事に対して思うきもちがふつふつと湧いてきたため、恩返しもかねて書いてみようかという気になりました。
拙い文章で恐縮ですが、参考になりましたら幸いです。

## 方針
何事もはじめては勝手がわからないものですが、以下の方針で書いていこうと思います。
- 少なくとも自分は読む価値があると思える記事を書く（マス埋めにしない）
    - アドベントカレンダーとはいえ、書くために書いただけの記事では面白くない
    - 読んでくださる人がいる限り、読んでよかったなと思えるものにしたい
- できるだけ「なぜそう思ったのか」「なぜそうしたのか」の思考の部分をアウトプットする
    - 思考過程の正誤はともかく（より適切であるに越したことはないですが）、過程を文字にして共有することに個人的に意味があると思うため
    - また、「なぜ」の部分を辿ることで、記事を読んでくれた人にとって帰結が腹落ちしやすくなるから
- 2024/12/25(水) までに「[はじめてのひとりアドカレ2024 by hayami Advent Calendar 2024](https://qiita.com/advent-calendar/2024/adcale-hayami)」全25記事掲載することを目指す
    - せっかく技術記事を書いていくのなら、一気に書いて自分の中のアウトプットへの心理的ハードルを下げたい（今はやや緊張しながら書いています）
    - Qiitanのぬいぐるみをお迎えしたい、かわいい
- 書けるときに書けるものを書く
    - 別途アドベントカレンダーの案は書き出しているのですが、時間的制約・体力的制約と相談しながら、書けそうなものから書いていく
    - 固定ジャンルで書いていく人もおりますが、本アドベントカレンダーは技術について雑多に書いていく予定です
- 参考にさせていただいた記事・ブログ・SNS等はできる範囲で参考Linkとして残す
    - 敬意もかねて
    - 自分が見返したいときにも助かる

## アドカレを書く背中を押してくれた記事
アドカレを完走すると、Qiitaの年間投稿数上位7%になれるそうです(2022年調べ)

https://qiita.com/manzoku_bukuro/items/a21f72e9ef9f84d1c638

Qiita公式の2023年データを見ても、25記事投稿すると上位約8%に該当するとのこと。年間26記事以上Qiitaに投稿している人は年間では上位2%だそうです。
Qiita以外にもZennや自前の技術ブログ、Stack Overflowなど媒体さまざまなので一概には言えませんが、一定以上やり切った2024年にできたらいいなと思ったのもあり、やることにしました。

https://qiita.com/Qiita/items/d7b6c538545bfa922475

## 他に参加予定のアドベントカレンダー
Qiitaのアドベントカレンダーもはじめてなことながら、TECH PLAY女子部のアドベントカレンダーでも記事を書くことにしました（今のところ2記事書く予定）
そちらに関しても、Qiita Advent Calendarとは別で記事を書いていく予定です。

https://adventar.org/calendars/10099

同じく女子部のchihiroさんが作成くださったアドベントカレンダーにも参加予定です。
こちらはTECHとは別話題なので個人ブログかな？備忘・参考として書いておきます

https://adventar.org/calendars/10819

## がんばります
気負いすぎず、読みやすい記事を書いていく心づもりです。
よろしくお願いします。

<br>

## 🔗参考Link

https://qiita.com/hohe096/items/4c6f74614090f8150eaf

https://qiita.com/e99h2121/items/6e29230a51912bc1be29

https://qiita.com/Kanako9581/items/c41ddc14fa39d1c66c27

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

<br>

かわいいQiitanの絵文字、使えたらいいなと思ったのですが過去限定配布だったみたい

https://qiita.com/naomunaomu/items/0038f8c23fd5175f1205

https://qiita.com/yamamoto_hiroya/items/11e03c3c2beb6c363e80