OmniAICreator/Qiita-1.07M huggingface dataset:
OLMo-2–1124–7B-Instruct: 安全性と実用性を兼ね備えた次世代LLM

## OLMo-2–1124–7B-Instructとは？
OLMo-2–1124–7B-Instructは、7億パラメータを持つAI2の指示チューニングモデルの一つです。このモデルは、コード生成や対話型AI、高度な推論タスクに特化しています。また、AI2の「OLMoイニシアティブ」の一環として開発されており、オープンソースの利点を活かして研究者や開発者が自由に活用できるよう設計されています。

### 主な特徴：

1. 指示チューニング（Instruction Fine-Tuning）
高品質なタスク固有のデータセットを用いて、ユーザー指示に対応する能力を強化。

2. 対話最適化（Dialogue Preference Optimization, DPO）
ユーザーの好みに合わせた自然な応答を生成。

3. 価値正則化による強化学習（Reinforcement Learning with Value Regularization, RLVR）
安全で文脈に沿った出力を可能にする独自の技術。

## OLMo-2の重要性
### オープンソースモデルの意義
OLMo-2シリーズは、透明性を重視しており、学習データ、モデルのチェックポイント、ログがすべて公開されています。この取り組みにより、研究者や開発者はモデルの内部構造を詳細に解析でき、再現性を確保しつつさらなるイノベーションを促進できます。

また、OLMo-2はコード、データ、手法を共有することで、AI研究を少数の大企業に依存させない開かれたエコシステムを形成しています。

## 性能の概要
OLMo-2–1124–7B-Instructは、さまざまなタスクで優れた性能を発揮します。

主なベンチマーク結果：
1. GSM8K（数学問題解決）
強力な推論能力を発揮し、複雑な数学問題に対応可能。

2. MMLU（多タスク言語理解）
多岐にわたるタスクで競争力のある結果を達成。

3. 安全性ベンチマーク
有害な出力のリスクを軽減する改善が見られるが、さらなるフィルタリングが推奨される。

特に指示チューニングと強化学習のプロセスにより、構造化された会話や専門的なタスクで卓越した性能を発揮します。

## 導入手順
OLMo-2–1124–7B-Instructを活用するためには、以下の手順に従います：

1. ライブラリのインストール
まず、必要なライブラリをインストールします。

```bash
Copy code
!pip install torch
!pip install --upgrade git+https://github.com/huggingface/transformers.git
!pip install git+https://github.com/huggingface/accelerate
!pip install huggingface_hub
```

2. モデルの初期化
Hugging Faceのpipelineを使用して、モデルを初期化します。

```python
import torch
from transformers import pipeline

model_id = "allenai/OLMo-2-1124-7B-Instruct"
text_gen_pipeline = pipeline(
    "text-generation",
    model=model_id,
    model_kwargs={"torch_dtype": torch.bfloat16},
    device_map="auto",
)
```

3. プロンプトを使った応答生成
以下のように、プロンプトを提供して応答を生成できます。

```python
prompt = "Which of these objects is not like the others: apple, banana, potato, chair?"
messages = [
    {"role": "system", "content": "You are a helpful assistant!"},
    {"role": "user", "content": prompt},
]

outputs = text_gen_pipeline(messages, max_new_tokens=1024)
output_text = outputs[0]["generated_text"]
print(output_text)
```
アドベントカレンダー2024最終日の振り返り

## はじめに

こんにちは！ついにアドベントカレンダーの最終日となりました。今年ははじめて**1人アドベントカレンダー**に挑戦し、途中でインフルエンザにかかるなどのハプニングもありましたが、なんとか25日間書き切ることができました。
最後まで読んでくださった皆さん、本当にありがとうございます！:santa:

## 本文

### データベーススペシャリスト試験の学習を振り返る

今回のアドベントカレンダーでは、**データベーススペシャリスト試験**を中心に、関連する内容を1日1テーマでまとめてきました。25日間では書ききれないほどボリュームのある分野ですが、自分なりに整理するよい機会となりました。

以下が、各日の記事一覧です。リンク先にそれぞれの詳細なまとめがあります。

1. **2024/12/01**: [初めてのDBスペ試験 午前試験のまとめ](https://qiita.com/ken-1200/items/cbb7d80995c2c862bb77)
2. **2024/12/02**: [初めてのDBスペ試験 午後I試験のまとめ](https://qiita.com/ken-1200/items/462aaadc72fabc0b11df)
3. **2024/12/03**: [初めてのDBスペ試験 午後II試験のまとめ](https://qiita.com/ken-1200/items/31c46b0f5bc2ee0412c7)
4. **2024/12/04**: [データベースの基礎知識まとめ](https://qiita.com/ken-1200/items/1d70939703b0c960b9e3)
5. **2024/12/05**: [データベース基礎理論の正規化について](https://qiita.com/ken-1200/items/b258ca12ad16c9b40fb8)
6. **2024/12/06**: [データベース基礎理論の正規形と関係の分解](https://qiita.com/ken-1200/items/ff7cdcac4ba682cbec41)  
7. **2024/12/07**: [データベース基礎理論の関係演算](https://qiita.com/ken-1200/items/387717059c6db23ca3b0)
8. **2024/12/08**: [データベース基礎理論の結合演算](https://qiita.com/ken-1200/items/2beb8c3671dbfa9f7488)
9. **2024/12/09**: [データベース設計の2つのアプローチ](https://qiita.com/ken-1200/items/35710ae9be9c847cbcae)
10. **2024/12/10**: [正規化と非正規化のバランス](https://qiita.com/ken-1200/items/7e8c4579461b53f09ce9)
11. **2024/12/11**: [データベースシステム設計](https://qiita.com/ken-1200/items/afa5be47aef38600a3d9)
12. **2024/12/12**: [E-R図とデータモデルの表現](https://qiita.com/ken-1200/items/23c6984b11afe964b37f)
13. **2024/12/13**: [SQLの歴史と標準化](https://qiita.com/ken-1200/items/3ec3b9d99c8f9bd3fddc)
14. **2024/12/14**: [SQLの種類](https://qiita.com/ken-1200/items/3b017eb7683597fb56b4)
15. **2024/12/15**: [SQLのDDLについて](https://qiita.com/ken-1200/items/ada2c9eb254953c12978)
16. **2024/12/16**: [SQLのDCLについて](https://qiita.com/ken-1200/items/648c373ed97cf399dd7f)
17. **2024/12/17**: [SQLのDMLについて](https://qiita.com/ken-1200/items/054c3e116a5a741512ec)
18. **2024/12/18**: [データ分析のためのSQL](https://qiita.com/ken-1200/items/41934cb78b0277bcb249)
19. **2024/12/19**: [SQLのポイントまとめ](https://qiita.com/ken-1200/items/707269de7ce158dd852b)
20. **2024/12/20**: [SQLでできるさまざまなこと](https://qiita.com/ken-1200/items/d8f848a7c46f46409779)
21. **2024/12/21**: [DBMSとは何か](https://qiita.com/ken-1200/items/4ccc697c6a2ab904d7d6)
22. **2024/12/22**: [インデックスの基礎と設計](https://qiita.com/ken-1200/items/e382cf7d4554e05985f9)
23. **2024/12/23**: [テーブル結合のアルゴリズム](https://qiita.com/ken-1200/items/7837f83f23a0111cb5ac)
24. **2024/12/24**: [データベースシステムのハードウェア](https://qiita.com/ken-1200/items/8121a8ef6249c6f03abc)
25. **2024/12/25**: [アドベントカレンダー2024最終日の振り返り](https://qiita.com/ken-1200/items/51d749d5a35f10d2c6e3)

## まとめ

今年ははじめて1人でアドベントカレンダーに挑戦し、無事25日間完走できました！:santa:  
**データベーススペシャリスト試験**をテーマに学んだことを共有し、書ききる過程で自分自身の理解も深まったと感じています。来年以降もさらに内容を充実させたり、新たなトピックにチャレンジしてみたいと思います。

最後まで読んでいただき、ありがとうございました！  

**メリークリスマス & よいお年を！** ⭐️🎄🎍
MapLibreでも使える、GeoJSONマーカー関連処理Quyuan

年の瀬の先週末から、2回目のCovid19にやられてしまいました。
何とか熱は下がったので、あわててアドベントカレンダーの残を片付けています。

あと、Maplibreアドベントカレンダー2024にもともと投稿した記事が、後で精査すると全く的外れなのに投稿後気づきました[^1]。
なので前代未聞かもしれませんが、元の記事をFOSS4Gアドベントカレンダーの方に振り替えて、こっちをMapLibreアドベントカレンダーに置き換えます[^2]。

## GeoJSONからマーカー関連処理をまとめてみた

地図サイト作ってると、GeoJSONをループ回してマーカー立ててポップアップ表示して、そのポップアップの中身はマルチメディアビューア+メタデータの展開HTML、案件ごとに毎回同じようなポップアップの中身だけど対応する地図APIは違って…とかいうのを繰り返してました。
だったら、複数APIでも共通になる処理だけを切り出してライブラリ化しつつ、マーカーの設定自体を設定ファイルで管理すれば、微修正したければその設定を変更すれば、地図の表示場所やズームを変えるのと同じくらい簡単に、ポップアップも修正できるようにならないか？と思って、まずテンプレートエンジン化を考えました。
で、自分のユースケースで考えると、ひとつのポップアップに対し複数のマルチメディア、特に画像だけでなく、RICOH THETAなどでのパノラマ写真や、YouTube画像などをスライダー表示+クリックでビューア、というユースケースが多かったので、その部分はテンプレート化しにくいな、どうする? => WebComponents化して、テンプレートで動作制御できるようにするか、と思って、全然別の機能のような

* GeoJSONからのテンプレート展開
* WebComponentsでのマルチメディアビューア

をセットにしたライブラリ、Quyuanを作成しました。

* [Quyuan (屈原)](https://qiita.com/kochizufan/items/072d9bf3f62ab1c940e8)
* [quyuanjs](https://www.npmjs.com/package/quyuanjs)
* [動作デモ](https://code4history.dev/Quyuan/) - Leaflet、OpenLayers、MapLibre GL

作者の導入実績自体はLeaflet、OpenLayersでしかないのですが、MapLibre GLでのサンプルも今回を期に作成してみました。

これを使えば、

* マーカー/ポップアップのテンプレートを固定しつつ、他の地図APIにそのまま持って行ける
* 逆に、地図APIを固定して、特にコード的には変更をしないまま（再度トランスパイルなどを必要としないまま）テンプレートの差し替えで、別案件のユースケースに対応できる

ので、個人的には重宝しています。

[^1]:元々の記事は[こちら](https://qiita.com/kochizufan/items/072d9bf3f62ab1c940e8)だったのですが、このソリューションはcanvas/WebGLベースの地図エンジンで動画ピンを立てるというコンセプトだったのに、使い慣れていないMapLibreへの対応を生成AIに任せたら、HTML divベースのマーカーで実装されていました。
HTML divベースやったら、ややこしいことせんでもアニメーション画像置くだけでアニメーションマーカーできるやん…。
というわけで、当該ソリューションのMapLibre対応は、改めて挑戦の上、WebGLでコンテキストで画像更新のようなことができるのか、というかそもそもHTML divベースでマーカーが存在するMaplibreでこのソリューションが必要なのかまで確認したうえで、改めて行います。
[^2]:このソリューションも、MapLibreでどれだけ必要になるかわからない代物ですが、前の記事ほど本質的に意味がないわけではないので
データベースシステムのハードウェア

## はじめに

こんにちは！今回は、**データベースシステムにおけるハードウェア**に注目します。データベースの物理設計には、プロセッサ（CPU）、メモリ、ストレージなどのハードウェア理解が欠かせません。これらのリソースがどのように動作しているかを把握しておくと、システム全体のパフォーマンスを高めるうえでとても役立ちます。

## 本文

### 1. コンピュータの構成要素

コンピュータは、「プログラム」をあらかじめ記憶装置に格納しておき、**プロセッサ（CPU）**がそれを読み取りながら実行する**プログラム内蔵方式**で動作します。

- **プロセッサ（CPU）**: 制御装置と演算装置を含むコンピュータの心臓部
- **主記憶装置（メモリ）**: プログラムやデータを一時的に保持する
- **補助記憶装置（ストレージ）**: 電源を切ってもデータを保持する（HDDやSSDなど）

データベースシステムでも、CPUで実行されるDBMSプログラム、データを載せるメモリ、永続保存するストレージが必要となります。

### 2. プロセッサ（CPU）

プロセッサは、**コンピュータを動作させる命令の読み取り・解釈・実行**を行う装置。

- **クロック周波数**: 処理速度を表す基本指標（例: 3.0GHz）
- **パイプライン**: 命令実行を分割し、並列処理を実現する手法
- **マルチプロセッサ / マルチコア**: 複数の処理装置を搭載して同時並行に処理を進める技術

データベースは大量の計算やI/O操作を行うため、CPUの性能やコア数はシステム全体のスループットに大きく影響します。

### 3. メモリ

メモリ（主記憶装置）は、CPUが直接読み書きする領域で、アプリケーションやDBMSが動作するために必要です。

1. **RAM（Random Access Memory）**: 読み書き可能。電源が切れると内容が消える
   - **DRAM（Dynamic RAM）**: 安価で大容量。サーバのメインメモリとして一般的
   - **SRAM（Static RAM）**: 高速だが高価。キャッシュメモリなどに使用
2. **ROM（Read Only Memory）**: 読み出し専用（BIOSなどに使われる）

#### 3.1 ECCメモリ

サーバなどの重要なシステムでは、**ECC（Error-Correcting Code）** を搭載したメモリを使うことで1ビットの誤り訂正や2ビットの誤り検出を可能にし、信頼性を高めることが多いです。

### 4. キャッシュメモリ

**キャッシュメモリ**は、CPU内部またはCPUとメモリの間に配置される高速・小容量のメモリです。SRAMが用いられ、よくアクセスするデータをキャッシュに格納することでCPUとDRAM間の速度差を緩和します。

```text
実効アクセス時間 = (キャッシュアクセス時間 × ヒット率)
                 + (メモリアクセス時間 × (1 - ヒット率))
```

- **ヒット率**: CPUが必要とするデータがキャッシュに存在する確率
- ヒット率が高いほど全体のアクセス時間が短縮されます

### 5. ストレージ（補助記憶装置）

ストレージは主記憶装置の内容を永続的に保存するための装置で、電源が切れてもデータが消えません。

1. **ハードディスクドライブ（HDD）**
   - 磁気ディスクを回転させて読み書きする。大容量・安価が強み
2. **ソリッドステートドライブ（SSD）**
   - フラッシュメモリを用い、高速アクセス可能。回転部品がないため耐久性も高い。容量あたりの価格はHDDより高め
3. **USBメモリ/SDカード**  
   - フラッシュメモリを使った小型の補助記憶装置。DB用途にはあまり使われないが、バックアップや持ち運びには便利

### 6. データベースとハードウェアの関係

#### 6.1 プロセッサ

DBMSの並列処理やスレッド数が多いほどCPUリソースを消費します。

- マルチコアCPUやマルチCPU構成でトランザクション数を効率的に捌ける 
- キャッシュメモリが大きいほど、頻繁にアクセスするデータを高速に扱える

#### 6.2 メモリ

- DBMSはメモリをキャッシュやバッファプールとして用い、多数のページを保持する
- メモリが不足すると頻繁にディスクI/Oが発生して性能低下を起こす
- ECCメモリで信頼性を高めることが多い

#### 6.3 ストレージ

- I/O性能（ランダムアクセス速度など）はDBMSの性能に直結
- SSDを使うとランダムアクセスが速くなるため、ログ書き込みやインデックスアクセスが高速化しやすい
- HDDでもRAID構成（RAID1/RAID5/RAID10など）を利用し、信頼性と読み書き性能を向上させる方法が一般的

### 7. ハードウェア理解は不可欠

データベースの物理設計を行う際には、**CPUやメモリ、ストレージなどのハードウェア特性**を踏まえて最適化を図る必要があります。

- **プロセッサのコア数/パイプライン数**が多ければ同時実行能力が高まる
- **メモリ容量**が大きければ、DBMSバッファプールを潤沢に設定でき、ディスクI/Oを削減できる
- **ディスクI/O特性**（ランダムアクセス、シーケンシャルアクセス速度）を考慮し、インデックス設計やクラスタ化などの調整が可能になる

### 8. まとめ

コンピュータの**ハードウェア**（CPU、メモリ、ストレージなど）は、データベースシステムのパフォーマンスと信頼性に直結します。

- **CPU**: 並列処理、キャッシュメモリの大きさやパイプライン効果
- **メモリ**: バッファプールの大きさ、ECCによる信頼性向上
- **ストレージ**: IOPS（入出力性能）、アクセス速度、耐久性

これらの理解を踏まえて物理設計やチューニングを行うと、データベースが求められる**可用性・信頼性・性能**を満たすシステム構築がスムーズになります。システム規模や予算、求める応答速度などに合わせて、最適なハードウェア構成を選びましょう。
【脱AE】関数ポインタとラムダ式

# はじめに

みなさんこんにちは！
POTIです！🤗
Adobeを破壊するために日々奮闘しています。

:::note info
この記事は、[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)１７日目の記事です。
（前回は[こちら](https://qiita.com/drafts)）
:::

# なにをした

リファクタリングした際に、関数ポインタの扱いに迷ったので、備忘録として記します。
テーブル結合のアルゴリズム

## はじめに

こんにちは！今回は、**テーブルの結合**に焦点を当て、代表的な結合アルゴリズムを紹介します。普段の開発では、SQLのJOIN句を書くことが多いですが、データベース内部ではどのように行が突き合わされているのか、一度知っておくとパフォーマンスチューニングに役立ちます。

## 本文

### 1. テーブルの結合とは？

リレーショナルデータベースでは、複数のテーブルに分割されたデータを組み合わせて必要な情報を得るために**結合（JOIN）** を行います。結合対象となる列を比較し、**条件に適合する行同士を連結**するのが基本の流れです。

代表的な結合アルゴリズムには以下のようなものがあります。

### 2. 入れ子ループ法（ネストループ法）

#### 2.1 概要

**入れ子ループ法（Nested Loop Join）** は、単純に2つのテーブルを二重ループで回し、すべての行同士の組み合わせを比較する方法です。例えば、A表を外側のループ、B表を内側のループとして結合列が一致するか判定します。

```text
FOR each row in A:
    FOR each row in B:
        IF (結合条件に合致):
           結合結果に追加
```

#### 2.2 時間計算量

A表の行数を M、B表の行数を N とすると、M×N 回の比較が発生するため時間計算量は **O(n^2)** となります。行数が非常に多い場合は非効率ですが、小規模データや、**インデックスで外側ループを適切に絞り込める場合**などは一定の効果を発揮することもあります。

### 3. マージジョイン法

#### 3.1 概要

**マージジョイン（Sort Merge Join）** は、2つのテーブルが**結合列であらかじめソート（整列）** されていることを利用して、効率的に結合を行う手法です。両テーブルの先頭行から比較を始め、一致すれば結合結果へ、一致しなければ小さい方を次の行へ進め、という流れを繰り返します。

1. AとBを結合列でそれぞれソート
2. Aの先頭行とBの先頭行を比較
3. 条件合致→結果に追加し、どちらかまたは両方のカーソルを進める
4. 不合致→ソート順で小さい側のカーソルを進める
5. 繰り返し

#### 3.2 時間計算量

主にソートのコスト（一般的に **O(n log n)**）と、マージ自体のコスト（**O(M+N)** 程度）になります。大量データで結合キーにソートが適している場合や、一方のテーブルが既にソート済みのインデックスを持つ場合にメリットが大きいです

### 4. セミジョイン法

#### 4.1 概要

**セミジョイン（Semi Join）** は、**別の場所にあるデータベース同士で結合**するときに活用される手法です。  
1. 一方（A）の必要な列だけをもう一方（B）へ送る
2. Bで結合可能なキーを抽出し、合致するキーのみをAに返す  
3. 最終的にA側で最終結合を実行  

これにより、テーブル全体を丸ごと転送しなくても済むため、**通信量を抑えつつ結合を実施**できます。分散データベース環境などで有用です。

---

### 5. ハッシュジョイン法

#### 5.1 概要

**ハッシュジョイン（Hash Join）** では、結合対象の列をハッシュ関数で分類し、ハッシュ値をキーとして結合します。  
1. 小さい方のテーブルに対してハッシュテーブルを作成
2. 大きい方のテーブルを読み込み、同じハッシュ値を持つ行同士を結合

#### 5.2 特徴

- 等価結合（`=`条件）に強く、**大量データの結合を高速**に処理できる場合が多い
- 範囲指定など、ハッシュ値で扱えない条件は苦手
- メモリ使用量が大きくなることがある
- 時間計算量は O(n)

> セミジョイン法とハッシュを組み合わせる**ハッシュセミジョイン**も存在し、分散環境での負荷を抑えながら結合を行えます。

## まとめ

テーブル結合を内部でどう実装するかは、**DBMSのクエリオプティマイザ**が自動的に選択することが多いですが、下記の点を知っておくとチューニング時に役立ちます。

1. **入れ子ループ法**: 小規模or インデックスの効果が大きい場合に使われやすい。大規模データには向かない
2. **マージジョイン**: 結合列のソートがカギ。大量データでもソート後のマージ処理が高速
3. **セミジョイン**: 分散DBなど、通信量を減らすために必要な列だけ送受信し、最小限のやり取りで結合
4. **ハッシュジョイン**: 大量データの`=`結合に効果的。ハッシュテーブルを利用して結合を効率化

DBMSは、テーブルの行数やインデックス、統計情報などを基に最適なアルゴリズムを自動選択します。大規模データや分散システムでパフォーマンス問題が起こったときは、**実行計画（EXPLAINなど）** を参照し、「どの結合方式が使われているか」を確認することで、より的確なチューニングができるようになります。
Linuxでステガノグラフィ技術を使って画像ファイルの中にテキストファイル埋め込む

画像ステガノグラフィとは
--
画像ファイルの中に別の情報を隠す技術です。これにより、一見普通の画像ファイルに見えても、その中に秘密の情報を隠しておくことができます。

---
画像ステガノグラフィの仕組み
---
LSB（Least Significant Bit）置換・画像データは、ピクセル単位でRGB（赤・緑・青）の値で表現されていて、各色の値は通常8ビットで表されます。この8ビットのうちの最下位ビット（LSB）を、隠したい情報のビットに置き換えることで、画像に情報を埋め込むことができます。LSBのわずかな変化には人間の目では、変化を気づくことがまず不可能なのでばれずに情報を送れることができます。

Linuxにsteghideコマンドをインストール
--
```
$ sudo apt install steghide
```

$ steghideの使い方
--

```
$ steghide embed ～～～
```
# オプションコマンド
-ef <埋め込むファイル>	隠したいファイル（テキストなど）を指定します。textやpythonスクリプトなども可能です。
-cf <カバーファイル>	-efで指定したファイルを隠すための埋め込み用ファイル（画像など）を指定します。
-sf <埋め込み後画像>	steghideコマンドの出力ファイルを指定します。指定しない場合は元の埋め込みファイルに上書きします。
-p <パスワード>	パスワードを設定します。
-e	暗号化のタイプ指定します。指定しない場合はASE暗号化が使われます。

# 例
```
$ steghide embed -cf <埋め込み先のファイル> -ef <埋め込む秘密ファイル> -sf [出力ファイル] –p <password>
```

埋め込んだファイルの取り出し方
---
```
$ steghide extract ～～～
```
# オプションコマンド
-sf <埋め込み後画像>: 埋め込み後のファイルを指定 
-p <パスワード> : パスワードを入力します。 

# 例
```
$ steghide extract -sf <埋め込み後ファイル> –p <パスワード>
```

最後に
---
steghideコマンドにはもっといろいろなオプションがあり、いろいろなことができるので具体的な用途が決まったら調べてみるといいと思います。
DBMSとは何か

## はじめに

こんにちは！今回は**DBMS（データベース管理システム）** の概要についてまとめます。DBMSは、データベースの管理・運用に欠かせないソフトウェアで、さまざまな機能を備えています。特に重要とされるのが「三大機能」です。

## 本文

### 1. DBMSの三大機能

#### 1.1 メタデータ管理

**メタデータ**とは、データベースに存在するテーブル（関係）、各テーブルの列（属性）、インデックス、アクセス権限などの定義情報を指します。
- **データディクショナリ**（またはカタログ）と呼ばれる特別な領域に格納され、DBMS自身が参照します
    - 例: OracleではSYSTEM表領域に保存。PostgreSQLではpg_catalogスキーマに保存

このメタデータ管理により、**「どんなテーブルやビューがあり、どんな列やアクセス権があるか」** をDBMSが一元的に把握します。

#### 1.2 質問処理（クエリ処理）

ユーザやアプリケーションがSQLなどで行う**問合せ**に対して、

1. **構文解析**や**意味解析**を行う
2. **最適な実行計画を立て**（クエリオプティマイザ）
3. **データにアクセスし、結果を返す**  

がDBMSの仕事です。

処理コストを抑える最適化は、データの量やインデックスの有無によって大きく変わるため、DBMSが自動で計画を立てる「クエリオプティマイザ」が非常に重要です。

#### 1.3 トランザクション管理

**トランザクション**とは、データベースへ読み書きを行う一連の処理の単位です。
- 途中で障害が発生してもデータの整合性を保てるよう、**コミット**や**ロールバック**に対応する
- 複数のトランザクションを同時実行する際に、データの競合や不整合が起きないよう**ロック機構や同時実行制御**を行う

これにより、信頼性の高いデータベース運用が実現できます。

### 2. DBMSの必要性

1. **データの一貫性・整合性の確保**
   - 全てのユーザやアプリケーションが同じデータを共有し、DBMSが同時実行や障害回復を管理することで、更新ミスやデータ重複を防ぐ

2. **セキュリティ・アクセス制御**
   - ユーザやロール単位でアクセス権を設定し、必要最小限の権限のみを付与するなど、情報漏洩リスクを低減できる

3. **複数ユーザによる高効率アクセス**
   - 同時に多くのユーザが操作しても、DBMSが最適な処理を行い、高速な応答を実現できる

4. **拡張性・移植性**  
   - DBMSがデータとアプリケーションを分離しているため、アプリケーション変更時でもデータの再編が比較的容易

## まとめ

DBMSは単なるデータ収納場所ではなく、**メタデータ管理**, **クエリ処理の最適化**, **トランザクション管理**など、多機能を内包しています。これにより、
- **大量データを一元的に扱いやすく**
- **高度な同時実行制御やセキュリティを保ち**
- **効率よくアクセスを最適化する**

といったメリットを享受できます。

DBMSにはさまざまな製品（Oracle, MySQL, PostgreSQL, SQL Serverなど）があり、各製品ごとに最適化の手法や機能に違いがありますが、三大機能を中心とする根本的な役割は共通しています。開発するシステムの特性や規模に合わせて、最適なDBMSを選定・活用していきましょう。
【脱AE】After Effectsプラグインについて

# はじめに

みなさんこんにちは！
POTIです！🤗
Adobeを破壊するために日々奮闘しています。

:::note info
この記事は、[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)２日目の記事です。
（前回は[こちら](https://qiita.com/drafts)）
:::

# なにをした

After Effectsにとって重要なプラグインについて調べました。
一人暮らし役立つ便利グッズ

研究室で過ごす時間が長くなると、快適な環境を整えることが重要になります。ここでは、研究効率を高めたり、日常生活を楽にする便利グッズをいくつかご紹介します。

---

##  ノイズキャンセリングヘッドホン  
研究室の環境によっては、周囲の音が気になって集中できない場合があります。ノイズキャンセリング機能があるヘッドホンを使えば、静かな空間を作り出して作業効率を上げることができます。

### おすすめポイント
- 周囲の雑音を遮断して集中力アップ
- 長時間使用しても耳が疲れにくいモデルを選ぶのがおすすめ

---

##  電気ケトル  
研究に集中しているとき、すぐにお湯を使いたい場面があります。電気ケトルがあれば、短時間でコーヒーやお茶を準備できるので便利です。

### おすすめポイント
- 小型で省スペースのモデルが研究室向き
- 自動電源オフ機能付きなら安全性も高い

---

## ケーブル収納アイテム  
研究室のデスクはPCや周辺機器のケーブルで散らかりがちです。ケーブルオーガナイザーやマジックバンドを使えば、見た目がスッキリし、作業効率もアップします。

### おすすめポイント
- ケーブルクリップで簡単固定
- カラフルなものを選ぶとアクセントにもなる

---

##  スマート電源タップ  
研究室では、PCやスマホ、デスクライトなど、複数のデバイスを使うことが多いです。USBポート付きのスマート電源タップがあれば、効率よく充電ができます。

### おすすめポイント
- 過負荷防止機能付きモデルで安心
- USBポートの数が多いものを選ぶと便利

---

##  安全眼鏡  
別に化学実験で使うわけではないです。自転車通学なのですが、この時期は乾燥した空気で目がドライドライに。伊達メガネをしているだけで、目の渇きやごみが入ることがなくなります。

### おすすめポイント
- 軽量で幅広く、つけ心地の良いものがおすすめ
---

## まとめ  
研究室での生活を快適にするためには、環境を整えることが大切です。今回ご紹介した便利グッズを取り入れることで、研究効率を上げつつ、健康的に過ごせる環境を作ってみてはいかがでしょうか？
【脱AE】１日目

# はじめに

みなさんこんにちは！
１２月を信じられない、POTIです！🤗
Adobeを破壊するために日々奮闘しています。

脱After Effectsアドベントカレンダー１日目の記事です。
これからよろしくおねがいします。

# これはなに？

脱After Effectsとはズバリ！After Effectsから脱すること！
業界標準にまでなっています。
しかし、実際に使ってみると、まぁ確かに機能は豊富で怖いものなしかもしれませんが、

- 不安定
- 重い
- 互換性がない
- シンプルに高い

いかんせん操作性や最適化の面が致命的です。
以下に実際に見聞きした例をあげます。

- 空のコンポジションで平面レイヤーを触ってたらメモリ不足
- １エフェクトだけでメモリを8GB消費
- 溜まったキャッシュファイルが100GB以上（未使用）
- クラッシュするとモーダルウィンドウの無限ループで復帰できない

これらは氷山の一角に過ぎないかもしれません。
実際に私が遭遇したものもありますし、Twitterや知り合いでよく見かける症例たちです。

日誌のようになると思います。
また、脱AE自体は以前から進めていたプロジェクトなので、毎日作業しているわけではありません🙄
（ご了承ください）

# おわりに

かなり大規模になると思いますが、初学者なりに頑張りたいと思います💪
~~アドベントカレンダーのネタにもなるし~~
MicroK8s on IBM Z — 2024アプデと、おうちKubernetes

きっかけは「おうちKubernetes」で、"おうち" で扱いやすい軽量なK8s系はどれ？技術選定をする過程で見つけた、約50分の英語の動画記事（2021年）を全部視聴した。TechTarget／BriteTALK 内の動画のため翻訳無し。3人の方々のプレゼンとディスカッション。長めな英語動画なので、本稿が参考になれば幸いです。
＞ [MicroK8s on IBM Z — minimal footprint meets zero downtime](https://www.brighttalk.com/webcast/6793/519512) 現時点2024年末のアップデートも含め、情報共有します。

結果、MicroK8sを"おうち"にも使うことに。IBMの記事のために寄せて…ではなく、その理由も以下に説明します。

MicroK8sは、当初はよく知らずにCanonical/Ubuntu/Snapしばりが辛いのでは？とむしろ敬遠してたが、考えを改めるきっかけにもなった。

個人的にMacとUbuntu使い。iPhoneを含めたプライベートやデザインはMacが中心で、コーディングやIT系のテスト環境などは2台のUbuntuを使い分け。
Ubuntu使いだからこそ、SnapでしかインストールできないMicroK8s…ちょっとどうかな？と感じていた。逆説的だがここ数年CanonicalがSnapをより強力にプッシュしてくるのだが、時々使いづらい状況になっていた。肝心な時にバージョンが古いままだったり、何かが中途半端でこちらの手が止まったり。そしてまたAPT使いに戻ってしまう。
WaveCoder：LLMの性能を引き出す指示データ生成の新境地

## WaveCoderとは？
WaveCoderは、コードに関連するタスクにおけるLLMの性能を向上させるための新しいデータ生成フレームワークです。この研究の中心にあるのは、20,000件以上の指示データを収録した「CodeOcean」というデータセットです。このデータセットは以下の4つの代表的なコード関連タスクを網羅しています：

- コード要約（Code Summarization）
- コード生成（Code Generation）
- コード翻訳（Code Translation）
- コード修正（Code Repair）
WaveCoderの特長は、これらのタスクに対して多様で高品質なデータを生成するプロセスにあります。

## データ生成プロセスの仕組み
WaveCoderのデータ生成は、「生成フェーズ」と「判別フェーズ」という2つのステップで構成されています。

1. 生成フェーズ
このフェーズでは、LLMを活用して指示データを生成します。具体的には、以下の流れで進められます：

- タスク定義の生成
GPT-4を利用し、特定のシナリオに基づいたタスク定義と要件を生成。これをプロンプトに組み込みます。

- Few-Shotプロンプトの活用
GPT-3.5を用いて、未加工のコードを入力とし、良い例・悪い例を組み合わせてデータを生成します。このアプローチにより、生成されるデータの多様性が教師モデルの能力だけに依存しないよう工夫されています。

2. 判別フェーズ
生成されたデータの品質を評価するフェーズです。このステップでは、以下のプロセスが行われます：

- 評価基準の設定
データ品質を評価するための基準を設定し、それに基づいてGPT-4を使用して生成データを分類します。

- 良い例・悪い例の再利用
評価結果を次の生成フェーズに反映し、さらなる品質向上を図ります。

この「生成」と「判別」のループによって、WaveCoderは多様で高品質な指示データセットを実現しています。

## 性能
WaveCoderは、コード生成タスクの主要なベンチマークであるHumanEvalやMBPPでテストされました。その結果、以下のような優れた成果が確認されています：

- データの少なさを克服
WaveCoderモデルは、たった20,000件以下の指示データでも他のモデルを上回る性能を発揮しました。

- コード修正や要約タスクでの汎化性能
WaveCoderは、コード修正やコード要約といった複雑なタスクでも高い汎化性能を示しました。

- 効率的なファインチューニング
洗練された多様な指示データにより、モデルのファインチューニング効率が向上しました。

## 参考

https://arxiv.org/abs/2312.14187
【脱AE】After Effects SDKについて

# はじめに

みなさんこんにちは！
POTIです！🤗
Adobeを破壊するために日々奮闘しています。

:::note info
この記事は、[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)３日目の記事です。
（前回は[こちら](https://qiita.com/drafts)）
:::

# なにをした

After Effects SDKを眺めてました。
AppStoreConnect テスターの招待

リリース前の品質保証に不可欠なテスターですが、Appleは内部テスターと外部テスターの二種類を提供しています。
初めてテスターを招待するときに個人的に詰まったところを紹介します。

# **1. 必要な準備**

**TestFlight対応のビルドをアップロード**

1. **Xcodeでアプリをアーカイブ**:
    
    メニューから「Product」→「Archive」を選択します。
    
2. **App Store Connectにアップロード**:
    
    アーカイブ後、Distribute Appを選択してアップロードします。
    
3. **TestFlightにビルドを確認**:
    
    App Store Connectにログインし、「TestFlight」タブでアップロードしたビルドを確認します。


# 2. 内部テスターの招待方法
**内部テスターとは？**

内部テスターは、Apple Developer Programに登録されたメンバーで、最大100人まで招待可能です。

1.	App Store Connectにログイン:
    	App Store Connectにアクセスし、アカウントでログインします。
2.	TestFlightタブを選択:
    	対象アプリを選び、「TestFlight」タブを開きます。
3.	「内部テスター」セクションを開く:
    	グループを作成するには「内部テスター」の横にある「+」ボタンをクリック。または既存のグループにユーザー追加するにはグループ名をクリック。
     ![image(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/0d7f3c67-95a4-ef96-9e99-ec5441f30451.png)

4.	テスターを追加:
    	チームメンバーを選択し、招待します。
5.	通知を確認:
    	招待されたテスターは、Apple IDに登録されたメールアドレスに招待通知を受け取ります。

# 外部テスターについて
個人的に詰まったのはこの部分。というのも、外部テスターはアプリレビュー前には招待できないそうです。
以下公式ドキュメント。
https://developer.apple.com/jp/help/app-store-connect/test-a-beta-version/testflight-overview/
> 外部テスターを招待する場合、ベータ版ビルドに対して審査が必要となる場合があります。アプリの最初のビルドは、グループに追加されると App Review に送信されます。これは、「[App Review ガイドライン](https://developer.apple.com/jp/app-store/review/guidelines/)」への準拠を確認することを目的としたものです。審査が必須となるのは、そのバージョンの最初のビルドのみです。後続のビルドについては、場合によって一からの審査は不要となります。ビルドが承認されるとテストを開始できます。
> 
なので、ミニマムでの開発は先に内部テスターで行い、いよいよ外部公開するとなった段階でAppReviewをパスし、外部テスターに使っていただいてから公開という流れになるかと思います（外部テスターは未検証なので悪しからず）。
express-rate-limit でAPIのリクエスト制限を設定してみる

# はじめに
本記事では、express-rate-limitを利用してAPIのリクエスト制限を実装します。一定時間内のリクエスト数を制限し、制限を超えた場合はリクエスト制限に引っかかってエラーを返すところまで試してみます。


# 環境
- Node：v20.1
- express：4.21
- express-rate-limit：7.4.1

# インストール

パッケージをインストールします。

```
npm init -y
npm install express express-rate-limit
```

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

https://www.npmjs.com/package/express-rate-limit


# ソース

1分間に5回までのリクエストを許可し、それを超えるとエラーメッセージを返すように設定しています。

```javascript:index.js
const express = require('express');
const rateLimit = require('express-rate-limit');

const app = express();

const limiter = rateLimit({
  // 1分
  windowMs: 60 * 1000,
  // 1分間に最大5リクエスト
  max: 5,
  message: {
    // 429 Too Many Requests https://developer.mozilla.org/ja/docs/Web/HTTP/Status/429
    status: 429,
    error: 'リクエスト数が制限を超えました。しばらく待ってから再度お試しください。'
  }
});

// 全てのルートにリミッターを適用
app.use(limiter);

app.get('/', (req, res) => {
  res.send('Hello World!');
});

const PORT = 3000;
// listen：APIコールを受け付けつける入口
app.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});
```



# 実行

ターミナルで以下のコマンドを実行してサーバーを起動します。

```bash
node index.js
```

別のターミナルウィンドウを開き、curlコマンドを使って連続的にリクエストを送信します。

```bash
for i in {1..10}; do curl http://localhost:3000; echo; done
```

# 実行結果

最初の5回のリクエストは成功し、"Hello World!"が表示されます。6回目以降のリクエストは制限にかかり、エラーメッセージが表示されます。

```bash
$ for i in {1..10}; do curl http://localhost:3000; echo; done
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
{"status":429,"error":"リクエスト数が制限を超えました。しばらく待ってから再度お試しください。"}
{"status":429,"error":"リクエスト数が制限を超えました。しばらく待ってから再度お試しください。"}
{"status":429,"error":"リクエスト数が制限を超えました。しばらく待ってから再度お試しください。"}
{"status":429,"error":"リクエスト数が制限を超えました。しばらく待ってから再度お試しください。"}
{"status":429,"error":"リクエスト数が制限を超えました。しばらく待ってから再度お試しください。"}
```

想定通り5回のリクエスト制限が機能している事を確認できました。
レンダリングとクリティカルレンダリングパス

## はじめに
ブラウザのレンダリングとは、HTML、CSS、JavaScriptをユーザーが実際に画面上で見ることができるピクセルに変換するまでの一連の処理のことです。

この記事では、レンダリングやクリティカルレンダリングパスの流れについてみていきます。
## クリティカルレンダリングパス
レンダリングとは、ブラウザがHTML、CSS、JavaScriptをユーザーが実際に画面上で見ることができるピクセルに変換するまでの一連の処理のことです。

クリティカルレンダリングパスとは、ブラウザが最初のレンダリングを開始する前に行う手順のことです。
レンダリングと似ていますが、クリティカルレンダリングパスは最初の描画までに焦点を当てています。

クリティカルレンダリングパスを最適化することで、ページが初めてレンダリングされるまでの時間を短縮できます。

https://developer.mozilla.org/en-US/docs/Web/Performance/Critical_rendering_path

https://web.dev/learn/performance/understanding-the-critical-path?hl=ja

## レンダリング
ブラウザのレンダリングとは、HTML、CSS、JavaScriptをユーザーが実際に画面上で見ることができるピクセルに変換するまでの一連の処理のことです。

レンダリングは主に4つの工程があり、Loading工程、Scripting工程、Rendering工程、Painting工程の順で行われます。

この4工程についてみていきます。

https://developer.mozilla.org/ja/docs/Web/Performance/How_browsers_work#%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0

ちなみに、GoogleChromeのdevツールのパフォーマンスタブでは、この4工程それぞれにかかった時間を計測することも可能です。

### Loading工程
Loading工程はリソースの読み込みと解析を行う工程です。
URLからHTMLやCSSなどのリソースを取得し、構文解析を行なってDOMツリーとCSSOMツリーを構築します。

この工程については以下の記事で扱っています。

https://qiita.com/axoloto210/items/3208ba1446901fe43cae

https://qiita.com/axoloto210/items/e70b5418d96f7d03dcfe

### Scripting工程
Scripting工程ではJavaScriptの実行が行われます。
JavaScriptのソースコードが字句解析・構文解析・コンパイルを経て実行されます。
JavaScriptはDOMツリーやCSSOMツリーへの変更ができるため、この工程でもDOMツリーやCSSOMツリーへ変更が入ることがあります。

### Rendering工程
Rendering工程では、DOMツリーとCSSOMツリーからレイアウトツリーを構築します。
構築に際して、スタイルの計算を行います。
レイアウトツリーについては以下の記事で扱っています。

https://qiita.com/axoloto210/items/e70b5418d96f7d03dcfe

レイアウトツリー構築後には、レイアウトが行われます。

#### レイアウト
レイアウトは、レイアウトツリーの各要素の位置や大きさを決める処理で、レイアウトツリーが構築された直後に行われます。
レイアウトツリーには、計算済みのスタイルなどの情報も含まれますが、ビューポートの大きさなどはわからないため、実際に画面のどこに配置されるかはレイアウト処理によって決定されます。

レイアウト処理は、DOMやCSSの変更によって再度実行される場合があり、この再計算処理はリフローと呼ばれます。
リフローは要素の大きさや位置を変更した場合などに発生します。
リフローは計算コストが高く、パフォーマンスへ悪影響を与えるため、なるべく避けたい処理です。

リフローの他に、背景色や文字色の変更など位置や大きさによらないスタイル変更があった時には、リペイントが発生します。
リフローが発生すると必ずリペイントも発生します。

https://developer.mozilla.org/ja/docs/Glossary/Reflow

https://developer.mozilla.org/ja/docs/Glossary/Repaint

### Painting工程
Painting工程は目に見える画面の描画を行う工程で、ペイント、ラスタライズ、レイヤーの合成が行われます。
#### ペイント
ペイント工程では、ブラウザのグラフィックエンジンへの命令を生成します。
グラフィックエンジンは生成された命令に基づいてピクセルの描画を行います。

#### ラスタライズ
ラスタライズ工程は、生成された命令をもとにビットマップ（ピクセルの集合）へと描画します。
ビットマップはラスターとも呼ばれ、このラスターへと変換を行うことからラスタライズと呼ばれているわけですね。

ビットマップはレイヤーと呼ばれる単位で一枚ずつ描画され、これらのレイヤーが後ほど合成されることで画面への描画が完了します。
レイヤーは重ね合わせコンテキスト（stacking context）によって重なり順が制御されています。
重ね合わせコンテキストや関連するCSSプロパティである`z-index`については以下でも扱っています。

https://qiita.com/axoloto210/items/1d40f94acf4381cd7225

レイヤーは一度描画されたあとにも再利用されます。
スクロールを行ったときなどには、スクロールのたびに1から描画し直すのではなく、同じレイヤーの再利用によって効率的に描画がなされます。

#### レイヤーの合成
複数作成されたレイヤーを最後に合成して描画することで、ブラウザのレンダリングは完了し、画面上にコンテンツが表示されるようになります。

https://developer.mozilla.org/ja/docs/Web/Performance/How_browsers_work

https://developer.mozilla.org/en-US/docs/Web/Performance/Critical_rendering_path
【脱AE】SDKのサンプルについて

# はじめに

みなさんこんにちは！
POTIです！🤗
Adobeを破壊するために日々奮闘しています。

:::note info
この記事は、[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)４日目の記事です。
（前回は[こちら](https://qiita.com/drafts)）
:::

# なにをした

SDKについてくるサンプルプラグインをいじってました。
【脱AE】Node.jsアドオンについて

# はじめに

みなさんこんにちは！
<一言>、POTIです！🤗
Adobeを破壊するために日々奮闘しています。

:::note info
この記事は、[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)５日目の記事です。
（前回は[こちら](https://qiita.com/drafts)）
:::

# なにをした

Node.jsアドオンについて調べました。
【脱AE】ビルトインプラグインが読み込めない問題- 解決

# はじめに

みなさんこんにちは！
POTIです！🤗
Adobeを破壊するために日々奮闘しています。

:::note info
この記事は、[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)２３日目の記事です。
（前回は[こちら](https://qiita.com/drafts)）
:::

# 解決

前回の問題は解決できました。
どうやら、指定していたパスがやはり違ったようです
【脱AE】２０日目 - 合否

# はじめに

みなさんこんにちは！
朝風呂に目覚めました、POTIです！🤗
Adobeを破壊するために日々奮闘しています。

脱After Effectsアドベントカレンダー２０日目の記事です。
（前回の記事はこちら）

気になる結果は不合格でした。
作品重視型とのこともあり、やはりポートフォリオ４ページは足りなかったかな、と思っています。
面接の方は、それなりに話せたと思う印象も悪い方では無いと思うのので、

改善点は、

- ポートフォリオをもう少し盛る
- 学力テスト８割を超える

を目標に、次の募集に挑みたいと思います。
GASを活用してGoogleフォームを効率的に作る方法

# はじめに
この記事は [マナビDX Questで得たもの Advent Calendar 2024](https://qiita.com/advent-calendar/2024/manabi-dx-quest2024) の4日目の記事です。

マナビDXクエストを通じて、「学び続けることの大切さ」「教えて頂ける環境のありがたさ」を実感しました。
その中で、マナビDXクエストの受講終了後に自主勉強会を開く際、参加を呼びかけるフォームを効率よく作る方法があれば良いと考えました。

本記事では、ChatGPTとGoogle Apps Script（以下、GAS）を使って効率的にGoogleフォームを作成する手順についてご紹介します。


## 注意点
- ChatGPT
  - プロンプトに個人情報や機密情報を含めないよう十分注意してください。 
  - 日時や開催場所は「●●●」などで仮入力しておき、フォーム生成後に適宜修正してください。
- GAS
  - スクリプトを作成・実行するにはGoogleアカウントが必要です。
    - アカウントをお持ちでない場合、予め作成をお願いします。
  - スクリプト実行時にエラーが発生する可能性があります。
    - エラーが出た場合、エラーメッセージをChatGPTに送信し、スクリプトを再生成してください。

## ChatGPTとGASでGoogleフォームを生成する基本的な流れ
- プロンプトの作成
  - フォームの内容を考え、プロンプトを準備
- ChatGPTにプロンプトを入力
  - ChatGPTにプロンプトを入力して送信し、スクリプトを生成
- スクリプトエディタを開く
  - Googleドライブで新しいスクリプトプロジェクトを作成し、エディタを開く
- スクリプトの実行
  - エディタにスクリプトを貼り付けて実行
- 実行結果の確認
  - 実行後にログ出力されたURLをクリックし、Googleフォームを開く

## 今回使用したプロンプト
以下、ChatGPTに送信したプロンプトのサンプルです。
```
勉強会の出欠確認を目的としたGoogleフォームを生成するGASを作成して

＃勉強会のテーマ
GASの活用

＃開催日時
●●●●年●●月●●日（水）●●時

＃開催場所
「●●●」

＃冒頭
・勉強会の趣旨を簡潔に説明

＃確認内容
・出欠
・興味関心分野（IT関連）
・さらに確認すべき内容を３つ追加する
・ご意見ご要望

＃設問
・各設問に簡潔な説明
・必要に応じて回答例を提示
・必須にすべき設問を考慮
・適切な順番に並び替え
・適切な回答項目を選択（記述、段落、ラジオボタン、チェックボックス、プルダウン）

＃GAS
・実行時にエラーがでないようにする
・選択肢は「createChoice」ではなく、「setChoiceValues」を使用する
・使用した関数について使用例を交えて説明する
```

## 生成されたスクリプト（サンプル）
以下、生成されたスクリプトのサンプルです。
```
function createStudyGroupForm() {
  // Googleフォームの作成
  var form = FormApp.create("勉強会 出欠確認フォーム");

  // フォームの説明文を設定
  form.setDescription("GASを活用した勉強会の出欠確認フォームです。下記の設問にご回答ください。");

  // 基本情報の設問を追加
  form.addTextItem()
      .setTitle("お名前")
      .setRequired(true);

  // 出欠確認の設問を追加
  form.addMultipleChoiceItem()
      .setTitle("勉強会への参加予定")
      .setChoiceValues(["参加する", "参加しない", "未定"])
      .setRequired(true);

  // 興味関心分野の設問を追加
  form.addCheckboxItem()
      .setTitle("興味のあるIT関連分野")
      .setChoiceValues(["プログラミング", "データ分析", "AI・機械学習", "クラウド技術", "その他"]);

  // 追加の設問1: どのような内容を期待しますか？
  form.addParagraphTextItem()
      .setTitle("どのような内容を期待しますか？")
      .setHelpText("簡潔にご記入ください。");

  // 追加の設問2: 質問してみたい内容
  form.addParagraphTextItem()
      .setTitle("勉強会で質問してみたい内容")
      .setHelpText("事前に教えていただけると参考になります。");

  // 追加の設問3: 勉強会に期待する成果
  form.addParagraphTextItem()
      .setTitle("勉強会に期待する成果")
      .setHelpText("具体的に記入してください。");

  // ご意見ご要望
  form.addParagraphTextItem()
      .setTitle("ご意見・ご要望")
      .setHelpText("その他何かご意見があればお書きください。");

  // フォームのリンクをログに出力
  Logger.log("フォームのURL: " + form.getPublishedUrl());
}
```

## 実行結果の確認
スクリプト実行後、フォームのURLがログとして表示されます。
URLをクリックしてフォームを開き、意図した内容になっているか確認してください。

以下、生成されたフォームのサンプルです。

![フォームサンプル1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949409/38d82864-11bb-1757-c02c-51901d135d29.jpeg)

# 最後に
本記事では、ChatGPTとGASを使って、自主勉強会への参加を呼びかけるフォームを効率的に作る方法を説明しました。
生成されたフォームを改良し、目指す形を作ってみてください！

最後まで読んで頂き、本当にありがとうございました。
【脱AE】１７日目

# はじめに

みなさんこんにちは！
最近２２時にはもう眠い、POTIです！🤗
Adobeを破壊するために日々奮闘しています。

[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)１７日目の記事です。
（前回の記事は[こちら]()）

# なにをした？

１７日目は、エミュレータについて改めて調べ直しました。

- Androidエミュレータ
- iOSエミュレータ
- BIOSエミュレータ
- ゲームボーイエミュレータ
- スーファミエミュレータ
- CPUエミュレータ

などなど、たくさんのエミュレータが開発されています。

# おわりに

理論的には可能だと再確認でき、同時にすこし安心しました（笑）
いくら時間かかっても、いつか必ずv1.0をリリースしたいです💪
Dixon-Colesモデルを使いこなす！スポーツ解析の基本

## Dixon-Colesモデルとは？
Dixon-Colesモデルは1997年にMark DixonさんとStuart Colesさんが提案した、サッカーの試合結果を予測するためのモデルです。基本的には「ポアソン分布」という統計的手法をベースにしていますが、サッカー特有の低スコアや引き分けを考慮するための工夫が追加されています。

## Dixon-Colesモデルの特徴
1. ポアソン分布を活用
試合中に各チームが得点するゴール数は「ポアソン分布」でモデル化されます。簡単に言うと、ゴールは試合の中で「ランダム」に起こる独立したイベントと考えられるからです。

2. チームの攻撃力・守備力
モデルでは各チームに「攻撃力（α）」と「守備力（β）」を割り当てます。これを使って、それぞれの対戦相手に対してどれくらい得点を期待できるかを計算します。

例えば：
チームA（攻撃力：1.2、守備力：0.8）
チームB（攻撃力：1.0、守備力：1.0）
この場合、チームAがチームBと試合をするときの得点期待値は以下のように計算できます：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/e60a00ee-9cf3-a8b9-35fb-2828976f313c.png)

3. ホームアドバンテージ
サッカーではホームチームが有利とされていますよね。この「ホームアドバンテージ（γ）」もパラメータとして考慮されます。

4. 引き分けや低スコアの調整
「ポアソンモデル」は基本的に得点が独立して発生すると仮定しますが、実際にはサッカーのスコアには「引き分け」や「低スコア（1-1、0-0）」が多い傾向があります。Dixon-Colesモデルはこの点を補正する調整パラメータ（ρ）を追加し、予測精度を向上させています。

5. 時間変化への対応
シーズン中の選手の移籍や怪我、監督交代によるチーム力の変化を反映するため、「最近の試合結果をより重視する」という時間加重を取り入れることが可能です。

## 具体的な応用例
1. 試合結果の予測
Dixon-Colesモデルを用いることで、ホームチームの勝利、引き分け、アウェイチームの勝利の確率を算出できます。これを活用すれば、試合結果を視覚的に理解できます。

2. ベッティング市場での活用
試合結果や得点期待値を計算してオッズを評価することで、「価値のある賭け」が見つかります。

3. チームの分析
攻撃力と守備力を分けて計算するため、「このチームは守備が弱いけど攻撃は強い」といった具体的な特徴を明らかにできます。

## 参考
https://mathematicalfootballpredictions.com/dixon-coles/

https://dashee87.github.io/football/python/predicting-football-results-with-statistical-modelling-dixon-coles-and-time-weighting/

https://opisthokonta.net/?cat=48

https://arxiv.org/pdf/2307.02139.pdf
【脱AE】関数スイートとは

# はじめに

みなさんこんにちは！
POTIです！🤗
Adobeを破壊するために日々奮闘しています。

:::note info
この記事は、[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)１０日目の記事です。
（前回は[こちら](https://qiita.com/drafts)）
:::

# なにをした

AEXの基本概念である、関数スイートについて調べました。
【脱AE】値の整合性

# はじめに

みなさんこんにちは！
POTIです！🤗
Adobeを破壊するために日々奮闘しています。

:::note info
この記事は、[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)２５日目の記事です。
（前回は[こちら](https://qiita.com/drafts)）
:::

# なにをした

実際にプラグインに渡す値を、より本物近づけました。
Unity カメラギズモを独自実装したい

Unityでサブカメラを用いる場合、どこにあるか、どの方向を向いているか確認できるようにしたい場面があると思います（レーシングの俯瞰とか、RenderTextureに映すカメラ位置とか）。

本記事では、カメラギズモ（視錘台）を可視化する実装を備忘録がてら紹介。

結論、コードは以下。

```csharp
using UnityEngine;

public class CameraFrustumDrawer : MonoBehaviour
{
    [SerializeField]
    private Material lineMaterial; // 線を描画するためのマテリアル

    private void OnRenderObject()
    {
        if (lineMaterial == null)
        {
            Debug.LogWarning("Line Materialが設定されていません。");
            return;
        }

        Camera camera = GetComponent<Camera>();
        if (camera == null)
        {
            Debug.LogWarning("カメラコンポーネントが見つかりません。");
            return;
        }

        // 視錐台のコーナーポイントを計算
        Vector3[] nearCorners = new Vector3[4];
        Vector3[] farCorners = new Vector3[4];
        camera.CalculateFrustumCorners(new Rect(0, 0, 1, 1), camera.nearClipPlane * 0.99f, Camera.MonoOrStereoscopicEye.Mono, nearCorners);
        camera.CalculateFrustumCorners(new Rect(0, 0, 1, 1), camera.farClipPlane * 1.01f, Camera.MonoOrStereoscopicEye.Mono, farCorners);

        for (int i = 0; i < 4; i++)
        {
            nearCorners[i] = camera.transform.TransformPoint(nearCorners[i]);
            farCorners[i] = camera.transform.TransformPoint(farCorners[i]);
        }

        // 線の描画
        GL.PushMatrix();
        lineMaterial.SetPass(0);
        GL.Begin(GL.LINES);
        GL.Color(Color.green);

        // 近クリップ面の四辺
        DrawLine(nearCorners[0], nearCorners[1]);
        DrawLine(nearCorners[1], nearCorners[2]);
        DrawLine(nearCorners[2], nearCorners[3]);
        DrawLine(nearCorners[3], nearCorners[0]);

        // 遠クリップ面の四辺
        DrawLine(farCorners[0], farCorners[1]);
        DrawLine(farCorners[1], farCorners[2]);
        DrawLine(farCorners[2], farCorners[3]);
        DrawLine(farCorners[3], farCorners[0]);

        // 近クリップ面と遠クリップ面を結ぶ四辺
        for (int i = 0; i < 4; i++)
        {
            DrawLine(nearCorners[i], farCorners[i]);
        }

        GL.End();
        GL.PopMatrix();
    }

    private void DrawLine(Vector3 start, Vector3 end)
    {
        GL.Vertex(start);
        GL.Vertex(end);
    }
}

```

ポイントは以下です。

1. GLクラスでラインを描画
2. OnRenderObjectを使用
3. 視錘台のコーナーポイントを計算

1.GLクラスでラインを描画

`GL.PushMatrix()`と`GL.PopMatrix()`で行列を保存・復元。

`GL.Begin(GL.LINES)`で線描画モードを開始し、`GL.Vertex()`で線の始点・終点を指定。

https://docs.unity3d.com/6000.0/Documentation/ScriptReference/GL.html

2.OnRenderObject()を使用

OnRenderObject()は、カメラのレンダリング時に呼び出されます。これによってギズモをGameViewでも描画できます。

https://docs.unity3d.com/ja/2021.1/ScriptReference/MonoBehaviour.OnRenderObject.html

3.視錐台のコーナーポイント計算

`Camera.CalculateFrustumCorners`を使用して、カメラの近クリップ面と遠クリップ面の四隅を取得しています。
描画範囲の各コーナーは、cameraのプロパティ、`nearClipPlane`, `farClipPlane`
から取得。

ちなみに、本スクリプトをアタッチしたカメラ映像をRendererTextureに設定したい場合、Textureのふちと視錘台のラインがかぶります。

それを防ぐには以下に編集してください。

```csharp
camera.CalculateFrustumCorners(new Rect(0, 0, 1, 1), camera.nearClipPlane * 0.99f, Camera.MonoOrStereoscopicEye.Mono, nearCorners);
camera.CalculateFrustumCorners(new Rect(0, 0, 1, 1), camera.farClipPlane * 1.01f, Camera.MonoOrStereoscopicEye.Mono, farCorners);
```

`nearClipPlane`と`farClipPlane`に係数をかけて描画したいラインと実際の描画位置を微妙にずらしています。
【脱AE】C++から.aexを読み込む

# はじめに

みなさんこんにちは！
POTIです！🤗
Adobeを破壊するために日々奮闘しています。

:::note info
この記事は、[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)７日目の記事です。
（前回は[こちら](https://qiita.com/drafts)）
:::

# なにをした

C++から.aexを読み込めるようになりました。
【保存版】Web入力フォームについて

## なぜこの記事を書くのか
入力フォームはSaasを入れたり、ライブラリを入れたり、フルスクラッチで書いたりさまざまな実装方法があります。

今回は、基本的な実装方法について知っていればいつでも応用が効くと思ったので、記事にまとめてみようと思います。

## Web入力フォームとは
![FireShot Capture 155 - デジタル庁 ご意見・ご要望 - forms.office.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624902/f7205261-51ef-d973-5b25-db9530b9578c.png)
<sub>デジタル庁のお問い合わせフォームから引用</sub>

Web入力フォームは、ユーザーからデータを収集するためのUIコンポーネントです。
例えば以下のようなものがあります。
- ログインフォーム
- 会員登録フォーム
- お問い合わせフォーム
- 商品注文フォーム

### Web入力フォームについてさらに詳しくおかわり
Web入力フォームは基本的に以下のフローをたどります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624902/9019631a-e08b-4479-4679-b97ce02b6675.png)

ユーザー画面上の入力欄で入力したデータはクライアント側でJavaScriptの処理を受け、サーバー側でDBに保存されます。そうして最終的にはフィードバック表示として画面に結果が表示されます。
具体例を挙げると、ID登録のための入力フォームの場合は、登録完了表示やエラー表示などです。

このように全体像を覚えておくと、テキストや画像だけの静的コンテンツと違いがわかりやすいと思います。

## 良い入力フォームとは何か
さまざまな実装方法がありますが、いい入力フォームとはなんなのでしょうか？
諸説あると思いますが、個人的に以下を備えたものだと考えています。

**わかりやすさ**
- 明確なラベル表示（シンプルな文言でわかりやすい位置にある）
- 必須項目の明示（そもそも入力項目は減らした上で）
- 入力形式の説明（例：半角・英数字を使用してください）

**使いやすさ**
- 適切な入力タイプの使用（email, tel, numberなど）
- エラー表示のわかりやすさ（色が変わったり、エラーメッセージが出たり）
- タブ移動の自然な流れ（キーボード操作ができると尚いい）

**アクセシビリティ**
- スクリーンリーダー対応
- キーボード操作の対応
- 十分なコントラスト比

「エラー表示をリアルタイムにするのか、submit時にするのか」、「エラーテキストの文言はどうするのか」など正直考えるとキリがないほどにたくさんの要素があります。

## 実際に実装してみる
:::note
Vanilla.jsやReactを使用したバージョンも掲載予定なので、後ほど見比べてみてください。
:::
### HTML + CSS
最もシンプルな形式の入力フォームです。
送信ボタンを押した時に入力内容に対し、確認が行われます。
リアルタイムではないものの世の中に多く存在する仕様のため自然な感覚で操作できるかと思います。

<p class="codepen" data-height="400" data-default-tab="css,result" data-slug-hash="YPKQBVr"></p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

### HTML + CSS + Vanilla.js
リアルタイムチェックを入れた入力フォームです。
このフォームで満足できるユーザーは多いので気がします。
form要素にnovalidateを付与して、Web標準のバリデーション機能や表記を非表示にしているので、そこだけ心配ですが、その分JavaScriptでバリデーションやエラー機能を付与しています。ただ入力項目が多いとJSのコード量も当然増えるので、どうなのだろうか...

<p class="codepen" data-height="400" data-default-tab="css,result" data-slug-hash="qEWjgjr"></p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## まとめ
今回は、Web入力フォームについてまとめてきました。
クライアント側とサーバー側が繋がるUIでもあると思うので少々複雑ですが、理解しておくと役立つ思うので、私自身もしっかり理解を深めていきたいです。

本記事を読んでいただきありがとうございました！
【脱AE】エラーハンドリングについて

# はじめに

みなさんこんにちは！
POTIです！🤗
Adobeを破壊するために日々奮闘しています。

:::note info
この記事は、[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)８日目の記事です。
（前回は[こちら](https://qiita.com/drafts)）
:::

# なにをした

AEXにおけるエラーの扱い方について調べました。
Unity オブジェクトを周回する機能実装

RendererTexture記事の続き

「あるオブジェクトの周りをカメラが周回し、そのカメラ映像をモニターのオブジェクトを映したい」ということがありました。

主に対応する点が以下3点。

1. Render Textureを用いてカメラ映像をマテリアルとして投影
2. カメラに映したくないものを描画対象から除く
3. オブジェクトを中心に周回するカメラを設定

本記事は3.の内容です。

結論、以下のコードでミニマムな実装ができます。

```jsx
using UnityEngine;

namespace Unity.FantasyKingdom
{
	public class NewMonoBehaviourScript : MonoBehaviour
	{
		[SerializeField]
		Transform target;
		[SerializeField]
		float rotationSpeed = 20.0f;

		void Update()
		{
			// ターゲットの原点を中心にカメラを回転
			transform.RotateAround(target.position, Vector3.up, rotationSpeed * Time.deltaTime);

			// 常にターゲットの方向を向く
			transform.LookAt(target);
		}
	}
}
```

# Transform.RotateAroundとは

```jsx
RotateAround (Vector3 point, Vector3 axis, float angle)
```

https://docs.unity3d.com/jp/2021.3/ScriptReference/Transform.RotateAround.html

point: 回転の中心となる点（例: target.position）。
axis: 回転の軸（例: Vector3.up はY軸）。
angle: 回転させる角度（度単位）。

今回の実装では、「あるオブジェクト(point)の周りをカメラ(transform)がY軸回り(axis)に20.0°/sで(angle)回転する」という引数を設定しています。

# Transform.LookAtとは

```jsx
public void LookAt (Transform target);
```

https://docs.unity3d.com/ja/2020.1/ScriptReference/Transform.LookAt.html

transformのオブジェクトがtargetの方向を常に向きます。

（Screen Recording 2024-12-25 at 18.40.48）

ゲームでは自動ホーミング、プレゼンではシネマティックな視線誘導に使えますね。
【脱AE】プラグインのエントリーポイントについて

# はじめに

みなさんこんにちは！
POTIです！🤗
Adobeを破壊するために日々奮闘しています。

:::note info
この記事は、[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)９日目の記事です。
（前回は[こちら](https://qiita.com/drafts)）
:::

# なにをした

AEXプラグインの基礎概念である、エントリーポイントについて調べました。
Unity カメラに映したくないものがある場合の対応

Render Textureを設定したときに、「余計なものが映り込んでる！どうなってるの！（ヒス）」と慌てたことがあります。

結論、ただカメラ描画範囲にRender Textureを設定したオブジェクトが映り込んでいるだけです（初めて遭遇して先輩に指摘された時はほんとお恥ずかしい思いでした。。）

回避策は2点、カメラに映り込まないようにするか、Culling Maskを設定するか。

おそらく後者の方がメジャーだと思うので、備忘録として書いていきます。

なお、本記事の環境は以下です。
・MacOS Sequoia 15.1.1
・Unity 6000.0.23f1 URP

※前提として、カメラにRenderTextureが追加されていること、RenderTexture付きマテリアルがオブジェクトにアタッチされていることとします。要するに以下の状況。
![image(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/100f94e0-97ec-2b4c-30bb-6806c977f819.png)


PlaneにRenderTexture付きマテリアルをアタッチしていますが、カプセルの奥にまたPlaneが描画（無限ミラーリング）されていますね。まるでGoogle Meetで画面共有した時みたいに。
それでは細かく見ていきます。
# 手順

1. 描画しないオブジェクト用のLayer追加
    
    RenderTextureを設定しているカメラにて、Layer > Add Layer…を選択する。
    
    Layersリスト内の空いている箇所に、描画しないためのLayerを追加。今回はNoRenderと設定する。
    
![image(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/33db8cfa-59bd-6bf6-9b76-2361d7cdf9f0.png)
![image(3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/4e032a00-41b9-2e71-bba4-3b261b592fe1.png)

    
2. 描画しないオブジェクトでLayer変更
    
    今回はPlaneをカメラで描画したくないので、PlaneのLayerに1.で作成した”NoRender”を設定する。
    
![image(4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/164f019d-9630-9a4f-af93-710ae6d5d74f.png)

    
3. CullingMaskで描画する対象を変更
    
    カメラコンポーネントのRendering > CullingMask > NoRender（1.で追加したLayer）のチェックを外します。
    
![image(5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/8c4f8510-7206-c682-3019-02ea6582b617.png)


以上の作業で、冒頭述べたような無限ミラーリングは起きていないはずです。
![image(6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/238d9531-682a-5119-9d5a-c18916a31b0a.png)
デジタル社会形成基本の基本理念

2020年以降国内で広がったコロナ禍がデジタル化の遅れに起因する問題を浮き彫りにしたことを踏まえ、制定後20年を経過した高度情報通信ネットワーク社会形成基本法（IT基本法）を、「デジタル化の目的」、「デジタル化が実現する社会」、「取り組み事項」、「役割分担」および「国際的な協調と貢献」などの主要論点に関して見直す形で制定されました。[^1]

以下が10項目の基本理念です。

1. 全ての国民が情報通信技術の恩恵を享受できる社会の実現
1. 経済構造改革の推進と産業国際競争力の強化
1. ゆとりと豊かさを実感できる国民生活の実現
1. 活力ある地域社会の実現
1. 国民が安全で安心して暮らせる社会の実現
1. 利用の機会等の格差の是正
1. 国及び地方公共団体と民間との役割分担
1. 個人及び法人の権利利益の保護
1. 情報通信技術の進展への対応
1. 社会経済構造の変化に伴う新たな課題への対応

「誰一人取り残さない、人に優しいデジタル化」が目指すビジョンとして掲げられているようです。
ちなみに、1.は今回の応用情報の最後の問で出題されました。実は、IPAが今回の試験で最も伝えたかったメッセージなのではないかと思っています。

[^1]:[デジタル社会形成基本法 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%A4%BE%E4%BC%9A%E5%BD%A2%E6%88%90%E5%9F%BA%E6%9C%AC%E6%B3%95)
【脱AE】値をJSに返す

# はじめに

みなさんこんにちは！
POTIです！🤗
Adobeを破壊するために日々奮闘しています。

:::note info
この記事は、[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)２１日目の記事です。
（前回は[こちら](https://qiita.com/drafts)）
:::

# なにをした

リファクタリングも兼ねて、C++からの値をJSに返すようにしました。
オンプレミスからAWSへの動画管理システム移行

# オンプレミスからAWSへの動画管理システム移行

近年、多くのメディア企業が膨大な動画データを効率的に管理し、検索性を向上させるために、オンプレミス環境からクラウドへの移行を検討しています。本記事では、移行前後のシステムフロー図を用いて、課題と移行による改善点を具体的に解説します。

## 移行前のシステム

### フロー図：移行前

```mermaid
sequenceDiagram
participant ユーザー as ユーザー
participant オンプレMAM as オンプレMAMソリューション
participant テープライブラリ as テープライブラリ

ユーザー ->> オンプレMAM: 動画データの検索と参照
オンプレMAM ->> テープライブラリ: 動画データを取得
テープライブラリ -->> オンプレMAM: データ返却
```

### 現状の構成と課題
1. **オンプレミス環境**  
   - 動画データはオンプレミスのテープライブラリに保存され、MAMソリューションが管理。
   - 動画の参照や検索は可能ですが、メタデータがないため、検索性が限定的。
2. **課題**  
   - **検索性の低さ**：動画内容に基づく検索ができず、ユーザー体験に制約。
   - **収対速度の低下**：物理的なテープライブラリからデータを収対するため、リクエスト処理が遅い。
   - **拡張性の制約**：データ量が増えるにつれて物理ストレージの負担が大きくなる。

## 移行後のシステム

### フロー図：移行後

```mermaid
sequenceDiagram
participant ユーザー as ユーザー
participant ゲートウェイ as ファイルゲートウェイ (AWS Storage Gateway)
participant AWS as Amazon S3
participant Rekognition as Amazon Rekognition
participant MAM as 新しいMAMソリューション

ユーザー ->> ゲートウェイ: 動画データを移行
ゲートウェイ ->> AWS: 動画データを転送
AWS ->> Rekognition: 動画の解析
Rekognition ->> AWS: メタデータ生成
AWS ->> MAM: メタデータを新しいMAMシステムに統合
```

### 移行後の構成と改善点
1. **AWSクラウドへの移行**  
   - オンプレミスのデータをAWS Storage Gatewayを介してAmazon S3に移行。
   - Amazon Rekognitionで動画内容を自動解析し、モノ、人、テキスト、シーン、アクティビティなどを識別。
   - MAMソリューションに必要なメタデータを統合。
2. **メリット**  
   - **検索性の向上**：自動生成されたメタデータにより、動画内容に基づく高度な検索が可能に。
   - **高速なデータ収対**：AWS Direct Connectで安定した高速転送を実現。
   - **拡張性の確保**：クラウド環境でデータ容量に制約がなくなり、長期運用が可能。

## 移行前後の比較表

| No | 項目                 | 移行前（オンプレミス）                | 移行後（AWSクラウド）            |
|----|----------------------|--------------------------------------|---------------------------------|
| 1  | データ保存           | テープライブラリ                    | Amazon S3                      |
| 2  | 検索性               | メタデータなし（限定的）             | 自動生成されたメタデータで検索 |
| 3  | 収対速度             | 低速（物理的制約）                  | 高速（Direct Connect使用）     |
| 4  | 拡張性               | 容量制約あり                        | スケーラブル（クラウド利用）   |
| 5  | メンテナンス負荷     | テープライブラリの物理管理が必要      | クラウドにより管理負荷辻減     |

## 結論

AWSへの移行により、動画データの管理効率が飛躍的に向上します。特に、Amazon Rekognitionを活用したメタデータ解析によって、動画内容を精密に検索・分析することが可能になります。また、AWS Storage GatewayとDirect Connectを利用することで、オンプレミスからクラウドへのスムーズな移行が実現します。
季節のイベントの由来を子供に説明したい！易しい言葉で説明して～！

## 季節行事の説明ってなかなか難しい
こんにちは、やんちゃ男児の子育て奮闘中のワーママ、紺です。

クリスマスからは怒涛のイベントラッシュですよね。
クリスマス→お正月→節分→ひな祭り。
パーティーやごちそうがたくさんで子供は大喜びかな？と思いますが、意味や由来も知ったうえで楽しんでもらいたい！！…ですが、行事の説明って意外と難しい。
そもそも、自分自身もその行事の由来を知らなかったり知っていても子供に説明しようとなると、どう言えばわかりやすいのか結構悩んだりします。

### じゃぁ、生成AIに手伝ってもらおう！
そんな難しい説明も生成AIならパパっとやってくれちゃいます✨️

:::note
実際のプロンプト

4歳の子供に、行事の由来や理由について説明したいので、
分かり易く説明する文章を考えてください。
お正月について説明をお願いします。
:::

ChatGPTの回答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/ed705ada-00d4-c6f3-efb0-bb62f80d05bd.png)

Claudeの回答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/0548c1b0-b4ba-30e6-be34-d7eea0d820fc.png)

わかりやすい…！！
ちなみに3歳の子に説明するなら？と聞き直してみると

ChatGPTの回答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/53767eaa-ac81-3c45-21df-22d5b777c84d.png)

Claudeの回答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/f6df9120-92f4-8625-59e8-c640ee99599c.png)

ちゃんと、さらに易しい表現にまとめてくれています！
これなら子供にもしっかり伝わりそうです✨

### かわいいキャラクターに喋ってもらったら、もっと良い？
最近使ってみたいな～と気になっていた「AIアバター動画作成」ができる[Kn1ght](https://www.kn1ght.app/ja)！
かわいいアバターがたくさんあるので、キャラクターを作って行事説明をしてもらったらいいかも！と思い立ち早速作成してみました^^

参考にさせていただいた動画はコチラ↓↓↓

https://youtu.be/YFzIfEuNrWM?si=9OqedYs-kXH2FAG9

可愛く喋ってくれるアバター動画が完成しました。

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">カトリーナ先生の沖中塾アーカイブ見ながら即席動画作成、大成功✨<br>子供に行事を説明してもらう可愛い子ができました^^<a href="https://twitter.com/hashtag/%E3%81%93%E3%81%9D%E3%81%B7%E3%82%8D?src=hash&amp;ref_src=twsrc%5Etfw">#こそぷろ</a> <a href="https://twitter.com/hashtag/%E6%B2%96%E4%B8%AD%E5%A1%BE?src=hash&amp;ref_src=twsrc%5Etfw">#沖中塾</a> <a href="https://twitter.com/hashtag/Kn1ght?src=hash&amp;ref_src=twsrc%5Etfw">#Kn1ght</a> <a href="https://t.co/3WzxUxNajr">pic.twitter.com/3WzxUxNajr</a></p>&mdash; 紺 (@navy_blue919) <a href="https://twitter.com/navy_blue919/status/1871920662157353446?ref_src=twsrc%5Etfw">December 25, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

アバターを選択して
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/47b1de19-407c-34fb-49b6-bca3b2df75fd.png">

今回はAIに作成してもらうモードで生成してみました。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/1b92402f-a952-3dca-6907-b3b9a4aad482.png">
ChatGPTに作ってもらった文章をAI作成の「スクリプト」の欄に貼り付けます。
「送信」を押すと…それだけで完成です！

今回は動画内の背景や素材は編集しませんでしたが、必要な場合は簡単に編集もできちゃいます✨

かわいいキャラクターからの説明に息子も大喜びで聞いていました！
「おせち知ってるよ～！」「鏡餅、保育園にある！」
と一生懸命話しかけていて微笑ましかったです^^

### まとめ
せっかくたくさんある季節行事、由来や習わしを一緒に知ってみることでより一層行事を楽しんでいきたいです^^
【脱AE】ビルトインプラグインが読み込めない問題

# はじめに

みなさんこんにちは！
POTIです！🤗
Adobeを破壊するために日々奮闘しています。

:::note info
この記事は、[脱After Effectsアドベントカレンダー](https://qiita.com/advent-calendar/2024/no-more-ae)２２日目の記事です。
（前回は[こちら](https://qiita.com/drafts)）
:::

```
LoadLibrary (path.c_str());
```

こちらは、読み込みに失敗すると```null```を返すのですが、その後のnullチェックで、例外がスローされているようです。

> 関数がモジュールを見つけられない場合、関数は失敗します。 パスを指定するときは、スラッシュ (/) ではなく円記号 (\) を使用してください。 パスの詳細については、「ファイルまたはディレクトリの名前付け」を参照してください。

とのことで、パスの書式を確認しましたが、どうやらNode.jsでは、OSの差異を自動的に吸収してくれるらしいので、パスに問題はなさそうでした。

結局今日中に解決することは出来ず、謎が深まるまま終了です。
Unity RenderTextureについて

Unityで、カメラに投影された部分をプレーンなりキューブなりに貼り付けたい時があると思います（ミニマップやカーレースのライブ映像、監視カメラなどなど）。それを可能にするのがRenderTextureです。

ざっくり以下の手順になります。

1. Render Textureの作成
2. カメラにRender Textureを追加
3. Render Textureを用いたマテリアルを作成
4. 投影したいオブジェクトにマテリアルをアタッチ

なお、本記事の環境は以下です。

・MacOS Sequoia 15.1.1
・Unity 6000.0.23f1 URP

それでは細かく見ていきます。
# 手順

1. Render Textureの作成
    
    Projectウィンドウ内で右クリック > Create > Rendering > Render Texture
    
    作成しただけでは真っ暗ですが、この先変わるので問題ないです。
    
![image(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/26c74006-bd12-574b-f476-a5bc4c5f73b8.png)
![image(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/0cf69471-472e-759d-baf6-f670dc6075d4.png)

2. カメラにRender Textureを追加
    
    テクスチャに描画したいカメラのCameraコンポーネント > Output > Output Textureに1.で作成したRender Textureを追加する。
    
    すると、1.では真っ暗だったRender Textureにカメラで描画される部分が表示されていると思います。
    
![image(3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/c44289f8-1c65-0692-1157-08aa283954f7.png)
![image(4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/51a30e57-3eef-a2a7-f9e3-b1944fd6a2ec.png)

3. Render Textureを用いたマテリアルを作成
    
    一旦シンプルにMaterialを作成（Projectウィンドウ > Create > Material）した後、そのMaterialのInspectorからSurface Inputs > Base Mapに1.で作成したRender Textureを追加する。
    
![image(5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/ee731912-30b9-1df9-70d6-106ef42bd7d7.png)
![image(6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/5c6a46e2-8d99-bd5b-4a4d-9e2aabada310.png)

    
4. 投影したいオブジェクトにマテリアルをアタッチ
    
    今回はPlaneに投影したいので、HierarchyでPlaneを追加して3.で作成したMaterialをアタッチする。
    
    以上！これでPlaneにカメラの描画範囲が投影されていると思います。
    
 ![image(7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/71f241d3-ee30-e5c4-19ca-ce45c2229bf6.png)
![image(8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376078/0834adbe-86a1-c629-c992-b9b13a871462.png)

    

EX.) Planeに予期せぬものが映り込んでるんですけど？！ってパニクることがありますが、それはPlaneがカメラに映り込んでしまってるだけです。

回避策はカメラ描画範囲に描画したくないもの（今回でいうPlane）を入れないことか、カメラにCulling Maskを設定することです。

Culling Maskの設定は別記事で。