OmniAICreator/Qiita-1.07M huggingface dataset:
技術継承担当のAIキャラを作りたい！①

「LLM・LLM活用 Advent Calendar 2024」の22日目です！

https://qiita.com/advent-calendar/2024/large-language-model

# はじめに
私は科学部Robotics班でプログラマーとしてロボットサッカーをしている高校二年生です。来年には引退でそれまでに後輩に向けて技術継承をしなければいけません。ちょうどLLMを使った開発をしてみたいを思っていたので、私の世代の技術を持ったAIキャラクター「ノア」を作ってみようと考えました。

# ただのツールは愛されない
技術継承AIをツールではなくキャラクターとして作ることには、作っている私が楽しいということ以外にも意味があります。それは「**ただのツールは愛されない！！**」ということです。せっかくシステムを作っても使ってくれる人がいなければ意味がありません。キャラクター自体をまた次の世代まで残したいと思ってもらい後輩たちによる改良を重ねて技術と共に少しでも長く生き続けてくれたらいいなと考えています。

# 使用しているもの
- Llama-3-ELYZA-JP-8B
- Gemini2.0flash
- AivisSpeech
- VMagicMirror
- VRoidStudio

# 現在実装できているもの
実は部活がテレビ番組で取り上げてもらう機会がありそれにあたって急ぎで作ったため仮で組んでいる部分がかなりあります。

https://www.youtube.com/watch?v=r7xzzYnLYuw&t=7m55s


### 1\.キャラクターとしての設定を守った会話 
単純なプロンプトでのチューニングです。名前や役職に関しては問題ありませんが、口癖の設定が難しく関係のない文脈で暴発してしまうことが多々あります。長期の運用で保持しやすいようにローカルで動かそうと考えていましたが、生成に時間がかかってしまうとテレビ的に見栄えが悪そうだったので今回はGeminiで動かしました。
![スクリーンショット 2024-12-23 015703.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921462/99193819-563d-782a-b240-2bdcfe32f683.png)



### 2\.疑似的にRAGみたいな動作をさせること
時間がなかったのでとりあえずGeminiに部活に関する技術や情報を箇条書きでプロンプトとして与え、質問に関する情報だけを抜き出してそのまま出力するようにしました。与えた情報もそこまで多くなかったため問題なく動きましたが、ローカルだけでは処理速度やコンテキストウィンドウが足りなくなってしまうのでローカル移行に向けてRAGに変更する必要があります。
~~~
ユーザーの入力に対して関係のある事象思われる情報を以下の情報群の中からそのまま抜き出して出力して。該当するものが複数ある場合複数抜き出して。
もし関係のある事象がなかった場合は「なし」と出力して
※ユーザーの入力が人に尋ねるような文章の場合でも必要な情報だけを箇条書きのように出力してください。

【科学部Robotics班について】
・科学部Robotics班は主にRCJというロボットサッカーの競技を活動の主軸としている。
・科学部Robotics班の中でもteamShoun.AEdtionは2024年の大会において全国大会で2位、オランダでの世界大会で15位を記録している。
・日々の活動としてRCJで上位を目指し、大会のない閑散期には部員の気の向くままに作りたいものを作ったりする（AIキャラクター,金属探知機,音楽プレイヤーなど）
...
~~~

### 3\.AivisSpeechを使った音声出力
最近話題になっていたのでこれを機に使ってみました。llama3を使ったときは問題なく動作するのにGeminiを使用するとエラーを吐くという問題がありましたが印字可能な文字だけを取り出す処理を入れると正常に動くようになりました。
~~~
returnText = ''.join(c for c in returnText if c.isprintable())
~~~
### 4\.VRMで動かすこと
VMagicMirrorを使わせていただいたおかげでそこまで時間もかからずすぐに実装できました。がしかし結局ここが一番難しいところでした。**他の部員とビジュアルについての戦争が起きたのです。** 最初はテレビに映るしありふれた感じの見た目にしよう派閥が強かったのですが、結局「その派閥側の選んだモデルのキャラクターは絶対科学部に入らない！そんなTHE陽キャ真面目系の子が科学部なわけねえだろ！」という思想が広がり現在のデザインになりました。（一応髪色は大人しくなりました）

# これからやりたいこと
- #### 完全ローカル化
  - 現在APIを使用して動かしている部分をllaam-cppなどで軽量化しつつローカルで動くようにしたい。
- #### RAG
    - 後輩たちにメンテナンスや改良を重ねてもらうことも考えると簡単に情報を追加していけるように作りたい。
- #### 長期記憶能力
  - RAGの応用として実装するであろう機能。
  - 単純に知識だけ引き継ぐのにはいらない機能ですが、愛されるキャラクターにするためにはなくてはならない機能だと思っています。
- #### 一つのアプリとして統合すること
    - 現在は見かけがいい感じに動くように様々なツールを使っていますが使いにくいのでなるべく起動するソフトの数は減らしたいと思います。
    - 音声合成部分はともかく見た目の部分はそこまで強くないPCで動かすことも考えるとpyxelでいくつかの画像を切り替えるだけでも十分かなと考えています。（超てんちゃんみたいな感じにしたい...）

# 懺悔
本当は今回の記事とは別でLLMの推論の過程の様子を表現したクリスマスツリーを作りたかったのですが、時間もお金もなかったので断念しました。LLMの推論で動くオブジェつくりたかったなぁ…。
相対パスを絶対パスに変換する

> この記事は『JavaScript Advent Calendar 2024』シリーズ1 23日目の記事です

タイトルのとおりです
稀によく需要が発生するので、簡潔な回答を示しておきます。

## 結論

そういうことができる[`URL.parse()`](https://developer.mozilla.org/ja/docs/Web/API/URL/parse_static)というメソッドがあります

## 詳細

`URL.parse()`は以下のように引数を指定することができます。

```js
URL.parse(url, base)
```

返り値は[`URL`オブジェクト](https://developer.mozilla.org/ja/docs/Web/API/URL)なので、[`URL:toString()`](https://developer.mozilla.org/ja/docs/Web/API/URL/toString)とかを使って文字列に変換すればOK

```js
URL.parse("./../d.txt", "https://example.com/a/b/c.txt").toString()
// Expected Eval Value : <string> "https://example.com/a/d.txt"
```

---

Q. それだけ？
A. それだけ
Embarcadero Dev-C++ で DXライブラリ を使う

## そうだ、すっかり忘れてた
前に「Embarcadero Dev-C++ で TDM-GCC 10.3.0 を使う」という記事を書いたのですが、DxLib のセットアップの仕方もついでに書こうと思っていたのですが、すっかり忘れてました。

## 前提条件
https://qiita.com/ebifuryai/items/ddfbc5a63598d8af8519

本当は 10.3.0 にしなくとも動くのですが、DxLib とのバージョンを合わせておいたほうが気持ちいいので。

https://dxlib.xsrv.jp/use/dxuse_gcc.html#R3

基本的に上記URLの説明に沿って作業すれば大丈夫です。

## 1.DXライブラリを使うために必要なものを揃える
まずは、DxLibをダウンロードします。https://dxlib.xsrv.jp/dxdload.html より、「DXライブラリ Windows版 Gnu C++( MinGW )用」をダウンロードし展開します。

## 2.MinGW のバージョンに合った MinGW 用DXライブラリを使用する
展開したフォルダの「プロジェクトに追加すべきファイル_GCC(MinGW)用」から「10_3_0」フォルダを Dev-C++ 直下に「DxLib」とリネームしてコピーします。そして Dev-C++ のメニューから「ファイル→新規」としてプロジェクトを作成します。種類は「Windows Application」でいいでしょう。
![新規プロジェクト_2024-12-23_0-48-51_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842880/dd962878-38b7-7bde-9567-b384cf353151.png)

## 3.コンパイル時に必要なコンパイルオプション
プロジェクトを作成したら、「プロジェクト→プロジェクトオプション」とし、「パラメータ」タブを開きます。ここの「C用コンパイラ」及び「C++用コンパイラ」に下記のオプションを設定します。

```
-DDX_GCC_COMPILE
```
## 4.リンク時に必要なオプション
「リンカ」に下記のオプションを設定します。
```
-lDxLib
-lDxUseCLib
-lDxDrawFunc
-ljpeg
-lpng
-lzlib
-ltiff
-ltheora_static
-lvorbis_static
-lvorbisfile_static
-logg_static
-lbulletdynamics
-lbulletcollision
-lbulletmath
-lopusfile
-lopus
-lsilk_common
-lcelt
```
![プロジェクトオプション_2024-12-23_1-23-45_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842880/2d45b10c-c6e3-d643-003e-a9314bfa9876.png)

### ディレクトリの設定
次に「ディレクトリ」タブを開き、「ライブラリのディレクトリ」および「インクルードディレクトリ」に、コピーした「DxLib」フォルダを設定します。

![プロジェクトオプション_2024-12-23_1-28-22_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842880/ac0ab385-98bb-cbfc-32c1-826ed6d4d356.png)

## 5.DXライブラリを使用したプログラムの例
main.cpp の内容が表示されていると思うので、下記のサンプルに書き換えます。

```main.cpp
#include "DxLib.h"

// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	if( DxLib_Init() == -1 )	// ＤＸライブラリ初期化処理
	{
		return -1 ;			// エラーが起きたら直ちに終了
	}

	DrawPixel( 320 , 240 , GetColor( 255,255,255 ) ) ;	// 点を打つ

	WaitKey() ;				// キー入力待ち

	DxLib_End() ;			// ＤＸライブラリ使用の終了処理

	return 0 ;				// ソフトの終了 
}
```
### 実行
書き換えたら保存して「実行→コンパイルして実行」を行い、実際に画面に点が打てているか確認します。

## おわりに
よきプログラムライフを！
Vuforia Engineのマーカー認識精度を向上させる方法

# はじめに

投稿遅れて申し訳ありません！

卒論などに追われていたら、いつの間にかこんな時期に…

さて、今回はそんな卒論の研究で使用したARコンテンツ作成ソフト
**Vuforia Engine**において、認識精度を向上させる**マーカーの作り方**を紹介したいと思います！

かなりニッチですが、他のARマーカーでも同様の部分もあるかと思います。
よければ読んでいってください！

## ARとマーカーとは？
実際にマーカーの精度についてお話する前に、ARおよびマーカーとは？
というところについて話します。

まず、ARは皆さん知っての通り、
**カメラを通して認識した現実空間に、仮想のコンテンツを拡張・表示する**技術です。

では、マーカーとはなんでしょう？
マーカーは、**ARで表示する際の目印となるもの**のことです。

マーカーごとに対応するコンテンツを設定することで、応じた場所にコンテンツが表示されたりします。
マーカーは様々な情報を下に認識され、マーカーの内容によっては精度が増減します。

今回は、そんなマーカーの精度を上げることを目標とします。

## Vuforia Engineのマーカー認識方法
さて、マーカーの認識精度をあげるために、Vuforia Engineではどのようにマーカーが認識されているかを確認しましょう。

以下のサイトでは、Vuforia EngineのImage Targets（マーカー認識のこと）機能において、どのような変更がマーカーの認識精度に影響するかを紹介しています。
[Best Practices for Designing and Developing Image-Based Targets
](https://developer.vuforia.com/library/objects/best-practices-designing-and-developing-image-based-targets)

以上のサイトからわかることをまとめると、以下の条件を満たすことでマーカー認識精度が向上するということになります。

- 細かい
- コントラストが高い
- 繰り返しのパターンがない
- 鋭い/尖っている部分が多い
- 画像内の特徴の分布のバランスが取れている

このうち、体感では上2つの『細かい』と『コントラストが高い』という点が大事だと思います。

さて、次からはいよいよ実際にマーカーの精度を測っていきます。

## 実際のマーカーと精度
Vuforia Engineには、マーカーの認識精度を5段階で評価する機能があります。
その機能を使って様々なマーカーの認識精度をチェックしていきましょう。

今回は、『**1**』という番号をテーマにマーカーを作ります。

### 精度0のマーカー
まず、精度0のマーカーがこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473652/04f111f8-b58f-1cb6-12e1-9678375dd393.png)

こちらのマーカーは、先程挙げた条件をほぼ満たしていません。

この状態だと、精度0となっているのでほぼ機能しないマーカーとなっています。

### 精度2のマーカー
精度1のマーカーを作ろうとしたら、うっかり精度2のマーカーができてしまったので精度1は飛ばします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473652/7ae95972-ed74-3ef9-9dcc-4a7b350e8654.png)

さて、こちらのマーカーは先ほどの精度0のマーカーとほぼ同じです。
しかし、背景の色を**グレー→白**にすることでコントラストを高め、精度を向上させています。

コントラスを上げるだけで精度が上がりましたが、まだ不安なためさらに精度を上げていきます。

### 精度4のマーカー
更に精度3を飛ばし、精度4のマーカーがこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473652/53bfc1a8-b5c0-b38e-cc40-612dddd84672.png)

マーカー全体に模様が広がり、さらにマーカーの精度が上がったと考えられます。

### 精度5のマーカー
最後に精度5のマーカーがこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473652/2c857c6b-5c75-c906-cf9e-ba42d37129ff.png)

精度５のマーカーでは、模様を単一ではなく複数にしています。
また、更にマーカー全体に模様を広げることでマーカーの精度向上に努めています。

## おわりに

さて、今回はVuforia engineでのマーカー認識精度の向上方法について紹介しました。
みなさんもARマーカーの認識がうまくいかないな…ということがあれば是非参考にしてみてください。

では！！！
エンジニア一人で開発するときに意識していること


## はじめに

私は 2024 年 10 月に[株式会社FoundingBase](https://foundingbase.jp/) 一人目のエンジニアとして入社しました。
今日まで仕様を詰めたり、技術選定をし、実装を進めたりと様々進めてきましたが進める中で気をつけたり意識していることをまとめました。

https://foundingbase.jp/n/n18af1da0761d

## 意識していること

### (なるべく) インフラを持たない

1人で大きなインフラの面倒を見ることはもちろん可能です。
しかし、限られたリソースをインフラだけに割くのは望ましい状態ではありません。

最近は、 Firebase や Supabase, Convex 等 BaaS (Backend as a Service) が充実しており立ち上げ初期は BaaS を積極的に採用していきたいと考えています。

https://firebase.google.com

https://supabase.com

https://www.convex.dev

https://appwrite.io

BaaS を使用することでリソースを投下する場所を明確にし素早くプロダクトを立ち上げることを第一に進めています。

### ドキュメント、ログはしっかり残す

当たり前と言われる可能性もありますが、一人しか居ないからこそドキュメント、ログはしっかり残すようにしています。
事業、サービスが順調に成長、人の採用も進め様々なものがスケールしたとき、「仕様は私の頭の中です」となればボトルネックになるのは渡しになってしまいます。

もちろんコードを読めば現時点の処理を追うことは可能ですが、どういった背景で変更されたか。処理になっているかは Git の変更履歴から完全に追うことは少々困難です。

Git のコミット1つ1つはもちろん、GitHub の Issue やドキュメントツールなど必要な情報にたどり着くことができる環境を用意しようと思っています。

FoundingBase では (今のところ) GitHub の Issue (及び GitHub Project) でチケット管理し、 Docusaurus を使用してドキュメントを管理しています。

https://docs.github.com/ja/issues/tracking-your-work-with-issues/about-issues

https://docusaurus.io

### 凝った技術選定をしない

(今のところ予定はありませんが) エンジニア採用や委託する際に使用している技術が障壁とならないように技術選定をしています。
明確な線を引くことは難しいですが、今から数年(3~6年)、あわよくば10年は戦えるであろう技術。一定以上コミュニティ等成熟していること。必要となればパッチをあてたり、ライブラリを作れることを。を条件としています。

FoundingBase では (今のところ) React, Remix + TypeScript を利用しています。

### テストは (できる限り) 書く

基本的なテストを記述するようにしています。
もちろん人の手でテストする必要な場面はありますが、毎回手でテストすることは現実的でありません。加えてテストが無いことで後々様々な問題も発生しやすくなります。

### 繰り返し作業を回避する

開発中に実施する繰り返し作業は人の手を介すのではなく機械的に実行するようにしています。
繰り返し作業には、何も生み出さない(時間だけを使ってしまう)タスクが存在している場合があります。なるべくそのような時間を少なくすることでより生産的かつ効果的に動くことができると考えています。

エディタの設定はもちろん CI/CD で workflow を実行するなどできることは様々です。
過度な自動化は望ましくありませんが、定期実施にかかる時間を自動化の工数は常に比較し手を打てるようにすべきだと考えています。

## さいごに

弊社では一緒に地方共創を行う仲間を募集しています。ぜひ地域や事業に興味がある方はご覧ください。
今後エンジニアの採用もできるようにプロダクトづくり頑張ります :muscle:

https://hrmos.co/pages/foundingbase/jobs

https://www.wantedly.com/companies/foundingbase/projects
C言語プログラマがRustプログラマになってつまづいたこと

# はじめに
C言語プログラマがRustプログラマになってつまづいたことをメモります

# つまずかなかったこと
所有権、借用権、トレイトの考え方など
いろいろ本を読めばなんとかなりました。

# つまづいたこと
オブジェクト指向の考え方、マルチスレッドの考え方

# おわりに
Rustいっぱい覚えてたいへんなこといっぱいだけど楽しい
MudTable を使っているときにゼロ除算が発生

## はじめに
事例として記録しておきます。

### 環境

https://zenn.dev/tetr4lab/articles/ad947ade600764

### コード
https://github.com/tetr4lab/ExLibris10

## 発生した例外
`MudTable`でゼロ除算が生じました。

```
System.DivideByZeroException: Attempted to divide by zero.
   at MudBlazor.MudTable`1.get_CurrentPageItems()
   at MudBlazor.MudTable`1.<BuildRenderTree>b__172_0(RenderTreeBuilder __builder2)
   at Microsoft.AspNetCore.Components.CascadingValue`1.Render(RenderTreeBuilder builder)
   at Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment, Exception& renderFragmentException)
Microsoft.AspNetCore.Components.Server.Circuits.CircuitHost: Error: Unhandled exception in circuit '～'.
```

## 原因
`@bind-RowsPerPage`でバインドされた変数(初期値`0`)が明示的な初期化前に使われ、ページサイズがゼロになっていました。

```html
        <MudTable Items="items" Dense Hover Striped Breakpoint="Breakpoint.Xs" @ref="_table"
            OnRowClick="EventCallback.Factory.Create<TableRowClickEventArgs<Book>> (this, arg => EditItem (arg.Item))"
            Filter="new Func<Book, bool>(FilterFunc)"
            SortLabel="⇅"
            AllowUnsorted=true
            @bind-RowsPerPage="_rowsPerPage"
            @bind-SelectedItem="selectedItem"
            @bind-SelectedItems="selectedItems" MultiSelection="@(allowDeleteItems && isSingleSession)">
```

```csharp
    /// <summary>保存されたページ行数</summary>
    [CascadingParameter (Name = "RowsPerPage")]
    protected int RowsPerPage { get; set; }

    /// <summary>テーブルのページ行数</summary>
    protected int _rowsPerPage;

    /// <summary>初期化</summary>
    protected override async Task OnInitializedAsync () {
        await base.OnInitializedAsync ();
        _rowsPerPage = RowsPerPage;
    }
```

## おわりに
同じ例外に遭遇された方のお役に立てば幸いです。
Ableton Link が楽しい

遅刻しました。
ふたたびネタが思いつかなかったので触ってみよう系薄い記事です。よろしくお願いします。

# Ableton Link って？
https://www.ableton.com/ja/link/

公式サイトを見てみるのがいちばん早いのですが、Ableton Liveからはじまったテンポや再生情報を対応アプリや機器と同期させようという規格です。

> Ableton Linkで同期させてみた例
> Mac、Windows、iPhone間は同一ネットワークで繋がっているのみで、リズムが完全に同期されて再生できている
> <iframe width="560" height="380" src="https://www.youtube-nocookie.com/embed/r1FbvWscOGQ?controls=0" title="Ableton Link" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

で、このAbleton Link、なんと仕様やSDKが公開されており、自由に自前のアプリやデバイスに組み込んで利用することができます。

https://ableton.github.io/link/

# Node.js から扱ってみる
Node.js 用ライブラリを公開してくださっている方がおり、ものすごく簡単に扱えます。
```javascript
const abletonlink = require('abletonlink');
const link = new abletonlink();

let latestPhase = -1;

const main = (beat, phase, bpm) => {
    console.log("  Beat: " + beat);
    console.log(" Phase: " + phase);
    console.log("   BPM: " + bpm);
};

// Start Ableton Link
link.startUpdate(60, (beat, phase, bpm) => {
    if (Math.floor(phase) !== latestPhase) {
        latestPhase = Math.floor(phase);
        main(
            Math.floor(beat),
            Math.floor(phase) + 1,
            Math.floor(bpm)
        );
    }
});
```

Beat、Phase、BPMを更新のタイミングで（小数点切り捨てた上で）出力しているだけのコードです。
実際に実行してみるとAbleton Linkを有効にしたLogic Proと同期が取れていることが確認できました。

![実行例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3592296/69d546f5-2b31-a4f7-bee6-55dc936fc257.gif)

# おわりに
ものすごく短い触ってみた系となってしまいました。
本当は別の記事を投稿する予定だった（AWS IoT）のですが、突然証明書認証ができなくなってしまい…。
次書くことがあればAbleton Linkを活かして何か作ってみたいと思いました。
「o3」と「o3-mini」発表！さらに強力になった最先端推論モデル

「12 Days of OpenAI」の最終日 (Day 12) は、**o1** モデルに続く新世代モデル **「o3」** と、その軽量版である **「o3-mini」** の登場が明かされました。  
残念ながら今すぐ一般公開はされませんが、**安全性検証のための研究者向け先行アクセス**が用意され、来年初頭には o3-mini → o3 の順で順次リリースされる予定です。

この記事は[ChatGPT Advent Calendar 2024](https://qiita.com/advent-calendar/2024/chatgpt)の23日目です。今年は「12 Days of OpenAI」ということで毎日発表がありましたが、その内容を復習しながらまとめます

---

## o3：フロンティアを塗り替える高性能推論モデル

### 主な性能指標

1. **コード生成＆プログラミングタスク**
   - **CodeForces** 競技プログラミングにおいて、ELOが **最大 2727** 相当を記録（高推論設定時）  
   - **実運用コード** を対象とした SweetBench Verified やコンペティションコードでも **o1 より 20% 以上の精度向上**  

2. **数学分野のベンチマーク**
   - **AIME**（高校〜大学レベル数学コンテスト相当）で **96.7%** を達成（o1 は 83.3%）  
   - **PhD レベル科学問題 (GPQA Diamond)** でも **87.7%** (o1 は 78%)  

3. **次世代ベンチマーク**
   - **Epic AI Frontier Math**: 最先端の難問でも **25%超** の正答率（他モデルは 2% 未満）  
   - **ARC AGI**: フランスワ・ショレらが提唱する創造的推論力を問うベンチマークで、  
     - **低推論設定 (Low Compute)** で **75.7%**  
     - **高推論設定 (High Compute)** で **87.5%**  
     - 人間平均の 85% を上回り、**初のトップスコア** を記録

これらの結果から、**汎用的な推論・問題解決能力が大幅に進化**している様子がうかがえます。

---

## o3-mini：リーズナブルかつ強力な推論性能

### コスト＆推論時間が大幅ダウン

- **Reasoning Effort** パラメータ（Low / Medium / High）を調整可能
- **低推論設定 (Low)** ならコード生成で **o1-mini** 同等かそれ以上の性能を、**極めて低コストかつ高速**で実行
- **中推論設定 (Medium)** なら **o1** 相当を上回るケースも
- 実運用の推論レイテンシ（処理遅延）が **o1-mini** の半分以下になることもあり、**GPT-4.0** に近いレスポンス速度を実現

### 幅広いAPI機能に対応

- **Function Calling**、**Structured Outputs**、**Developer Messages** など **o1** 相当のAPI機能を網羅
- 例: 数学問題 (AIME) や競技プログラミング (CodeForces)、大規模知識問答 (GPQA) などで高い成果

---

## 安全性と「Public Safety Testing」

o3 / o3-mini のリリースにあたり、OpenAI は**安全性検証の新ステップ**を導入。  
研究者・開発者が事前にモデルの潜在リスクや脆弱性をテストできる仕組みを設け、  
- **o3-mini** → 来年1月末を目安に正式リリース  
- **o3** → その後 (2024年初頭〜) に順次一般公開予定

### 研究者向けテスト応募フォーム

- **2024年1月10日まで** 応募受付  
- 採択された研究者・セキュリティ専門家はモデルに早期アクセスし、  
  - **強度なテスト (アタックベクトルや不正利用検証)**  
  - **安全対策の改善提案**  
  - **モデル評価レポート**  
  などを実施可能

---

## 「Deliberative Alignment」の導入

OpenAIは、新しい安全性向上手法である **「Deliberative Alignment」** を公開。  
- モデル自身の「推論能力 (Chain-of-thought)」を活用し、ルール違反や不正リクエストを**より正確に検知**  
- 従来は学習用データから直接「安全／不安全」を判断していたが、  
  - **モデルが内部で推論** → 「これは一見安全そうに見えて、実はこういう動機を持つリクエストだ」と理由付け。  
  - 結果的に「不当な拒否」を減らしつつ「安全拒否」を正確化する (同時に改善が難しかった2つの指標を両立)。

---

## まとめ

**o3** と **o3-mini** は、  
- 競技プログラミングから数学オリンピック級の問題、  
- ARC AGI や Frontier Math といった前人未到のベンチマーク  
を大幅に塗り替える、**次世代の最先端推論モデル** です。

**一般公開** はもう少し先（1〜2ヶ月程度）が見込まれますが、  
- **安全性テスト** への早期参加  
- **Deliberative Alignment** による安全技術の進化  
を経て、2025年前後にはさらに**安心かつ革新的なAI** が誕生することでしょう。

**参考動画**: [OpenAI o3 and o3-mini—12 Days of OpenAI: Day 12 - YouTube](https://www.youtube.com/watch?v=SKBG1sqdyIU)
デスクトップアプリで「他のアプリ」と連携！ChatGPTがあなたの作業を一気に効率化

「12 Days of OpenAI」Day 11 では、**Mac用ChatGPTアプリ**（Windows版は後日対応）の新機能が大幅に拡充。  
もはやテキストをコピー＆ペーストするだけの存在ではなく、ChatGPTが**他のアプリ（IDE・ノート・ターミナルなど）と連携**して、あなたのコードや文書を直接編集・分析・提案してくれます。

この記事は[ChatGPT Advent Calendar 2024](https://qiita.com/advent-calendar/2024/chatgpt)の5日目です（空いていたので書いてみました）今年は「12 Days of OpenAI」ということで毎日発表がありましたが、その内容を復習しながらまとめます

## 今日のアップデート一覧

1. **Macデスクトップアプリがアプリ連携に対応**
   - **各アプリの画面内容やテキスト**をChatGPTが読み取る（ユーザーが選択した部分のみ）  
   - ChatGPTとのやり取りで生成したコマンドやコードを、そのまま該当アプリに貼り付け可能。  
   - ショートカット（Option + Spaceなど）で瞬時にChatGPT呼び出し → 連携アプリを選択するだけで使える。

2. **対応アプリが多数拡大**
   - **ターミナル**（Warpなど）、**IDE**（Xcode, VS Code, JetBrains系, MATLABなど）、**テキストエディタ**（TextMate, BBEditなど）  
   - **ノートアプリ**（Apple Notes, Notion, Quipなど）にも対応。  
   - 例: NotionドキュメントをChatGPTに直接読ませてリライト案を作ってもらう。

3. **音声モード（Advanced Voice）の導入**
   - デスクトップアプリ上で音声入力・会話が可能に。  
   - たとえばXcodeのコードを見ながら「ここのバグを直して」と**音声で**指示できる。  
   - サンタモードや他のボイスキャラとも連携、クリスマスコンサートのセットリストを修正するデモなども披露。

4. **例: ターミナル連携**  
   - Gitのコミット履歴をChatGPTが自動でコマンド生成 → 実行結果をさらにグラフ化 → プレビュー表示…といったフローがスムーズに。  
   - 「コピー＆ペースト」手間が大幅減、ChatGPTがコンソールの出力を直接解析してくれる。

5. **例: IDE連携（Xcode の場合）**  
   - Swiftコードの編集中に「コード修正案を出して → コピペで貼り付け → 実行」までのサイクルが即時完結。  
   - ChatGPTがローカルのコード内容を把握しているので、正確な補助が可能。

6. **例: ノートアプリ連携**  
   - NotionやApple Notesに書きかけの文章をChatGPTに見せ、内容を増補・リライトしてもらう。  
   - 既存のドキュメント全体の文体に合わせた統一感ある文章生成もお手の物。

## 安全・プライバシー面のポイント

- ChatGPTが**他のアプリの画面を勝手に読む**ことはない。  
- 明示的に「このアプリと連携する」と選択するか、ショートカットで起動したときに**最前面アプリ**を読み取る場合のみ。  
- 選択範囲やウィンドウ内のテキストだけがChatGPTに送信される形で、常時監視はされない。

## リリース状況

- **Mac向けデスクトップアプリ**: Day 11 発表時点で既にアップデート配信中（最新バージョンへの更新要）。  
- **Windows版**: 今後対応予定（具体的スケジュールは未定だが「間もなく」とのこと）。

## 今後の展望

- ChatGPTが**自動化**や**操作代行**を広範に担うエージェント化が進む見込み。  
- デスクトップアプリとして動作する利点を生かし、ファイル操作や画面操作などの支援も拡張されていく予定。  
- 開発者以外でも、**文章作成やリサーチ、クリエイティブワークの効率アップ**に期待大。

---

**参考動画**: [Work with Apps—12 Days of OpenAI: Day 11 - YouTube](https://www.youtube.com/watch?v=g_qxoznfa7E)
電話でもWhatsAppでもChatGPT！「1-800-CHAT-GPT」でさらに手軽にAIと会話

「12 Days of OpenAI」Day 10 では、**チャットGPT**がついに**電話回線**や**WhatsApp**で利用可能に。  
「スマホもPCもない」「データ通信の調子が悪い」といった状況でも、電話をかけるだけで ChatGPT と話せるのは画期的です。さらに WhatsApp なら国を問わず利用できるので、幅広いユーザーに嬉しいアップデートとなりました。

この記事は[ChatGPT Advent Calendar 2024](https://qiita.com/advent-calendar/2024/chatgpt)の3日目です（空いていたので書いてみました）今年は「12 Days of OpenAI」ということで毎日発表がありましたが、その内容を復習しながらまとめます

## 主な新機能

1. **電話で ChatGPT に話しかける (US限定)**  
   - **1-800-CHAT-GPT** (1-800-242-8478) にダイヤルするだけ。  
   - **15分/月** の無料通話が含まれ、アカウントを作ればそれ以上も利用可能。  
   - スマートフォンだけでなく、**古い折りたたみ携帯やロータリーフォン**でも動作するデモが披露された。

2. **WhatsApp で ChatGPT とテキストチャット**  
   - グローバルで利用可能。  
   - 連絡先に **「1-800-CHAT-GPT」** を登録し、WhatsApp で会話を開始。  
   - アカウント不要だが、将来的には**アカウントを連携することで画像送信やSearchなどの追加機能**も提供予定。

3. **いつもの使い勝手 + 翻訳やレシピ提案も**  
   - 電話では口頭で質問するだけ、WhatsAppではテキスト入力するだけ。  
   - 旅行中に見かけた建物を聞いたり、言語翻訳や料理のレシピなども、これまでの ChatGPT 同様に対応。

## 使い方のイメージ

- **電話の場合 (米国限定)**  
  1. 電話の連絡先アプリで「ChatGPT (1-800-242-8478)」を登録。  
  2. ダイヤルして質問を話しかける。  
  3. ChatGPTが音声で回答を返してくれる。  

- **WhatsAppの場合 (グローバル)**  
  1. WhatsApp で新規チャット → 連絡先「1-800-CHAT-GPT」へメッセージ送信。  
  2. テキストベースでやりとりがスタート。  
  3. 料理レシピ、旅行プラン、ちょっとした翻訳などを即座に入手。

## 今回のアップデートの意義

- **より多くのユーザーにアクセス可能**  
  スマホのモバイル通信が不安定な場所や、**そもそもスマホが使えない環境**でも固定電話などで気軽にAIを利用できる。  
- **新たなコミュニケーションチャンネル**  
  電話 × AIという意外性があり、**シニア層**や**スマートフォン非所持層**にも身近なサービスに。  
- **先行体験から正式サービスへ**  
  プロトタイプ的なハッカソン・プロジェクトが実現したスピーディーな導入事例としても注目。

## 今後の展望

- **アカウント連携による機能拡張**  
  電話やWhatsAppでも検索や画像送信を含む高度な機能が使えるよう、アカウント連携が計画中とのこと。  
- **「音声 x AI」の利便性の広がり**  
  音声のみでもレシピや地図情報を得られるなど、利用シーンは無限大。  
- **他国での電話対応も期待**  
  まずは米国内向けに提供開始されたが、**グローバル展開**に向けた取り組みにも期待が集まる。

---

**参考動画**: [1-800-CHAT-GPT—12 Days of OpenAI: Day 10 - YouTube](https://www.youtube.com/watch?v=LWa6OHeNK3s)
Dev Day Holiday Edition — 開発者向けアップデートが続々登場！

「12 Days of OpenAI」Day 9 は、**APIを使う開発者**や**スタートアップ**向けの機能が大幅に拡充されました。  
o1 モデルの本格API対応や WebRTC対応の**Realtime API**、さらに新しい**Preference Fine-Tuning**など、さまざまなアップデートが紹介されています。

この記事は[ChatGPT Advent Calendar 2024](https://qiita.com/advent-calendar/2024/chatgpt)の1日目です（空いていたので書いてみました）今年は「12 Days of OpenAI」ということで毎日発表がありましたが、その内容を復習しながらまとめます。

## 本日の発表ハイライト

- **o1をAPIで正式リリース**  
  - 従来の「o1 preview」を大幅に強化。  
  - **Function calling** や **構造化出力(Structured Outputs)**、**Developer Messages**（改良されたシステムメッセージ）など主要機能が利用可能に。  
  - **Vision入力**にも対応し、画像を使ったタスク（製造業・科学分野など）に役立つ。  
  - 「Reasoning Effort」パラメータで思考負荷を調整し、簡単なタスクは軽量に、難しいタスクはじっくり推論。

- **Realtime APIがWebRTCに対応 & 価格引き下げ**  
  - これまでのWebSocket方式に加え、**WebRTC** で音声ストリーミングをより簡単かつ低遅延に。  
  - **microcontroller** や **スマートトイ** への組み込みも容易にし、数十行のコードで実装可能。  
  - 料金改定で **GPT-4.0オーディオトークンが60%オフ**、さらに**4 mini**なら10倍安いトークン単価を実現。

- **Preference Fine-Tuningの追加**  
  - 既存の **Supervised Fine-Tuning**（模範回答を学習）や **Reinforcement Fine-Tuning**（強化学習）に加え、**Preference Fine-Tuning**（2つの回答のどちらを好むかを学習）が新登場。  
  - 「応答の簡潔さ」「独自の文体」など、より抽象的な好みをモデルに反映しやすい。  
  - GPT-4.0から利用開始、**トレーニングコストはSFTと同額**。

- **Go / Java SDKの正式提供**  
  - 既存の Python / Node.js SDK に加え、Go や Java でも OpenAI API を手軽に扱える公式ライブラリを公開。

- **ログイン & APIキー取得フローが簡単に**  
  - 新たなUIで数ステップの手続きだけで APIキーを取得可能。

- **Devs向けイベント動画も公開**  
  - 過去数カ月の “OpenAI Dev Days” 世界ツアーで収録された発表を YouTube で視聴可能。

## 今後の展望

- **o1 Pro モード（API版）は現在開発中**  
  発表では「エルフ（elves）が徹夜作業中」との表現も。近いうちに公開される見込み。  

- **AMA（Ask Me Anything）開催**  
  発表後1時間、OpenAIのフォーラムにて開発チームへの質問を募集。  

「Preference Fine-Tuning」や「Vision対応のo1」など、**高度なカスタマイズが可能になる機能**がまとめて投入された印象です。  
加えて、リアルタイム音声APIのハードルが一気に下がったことで、**“音声×IoT”** のアプリケーションがさらに増えそう。  
これらアップデートを活用しつつ、エキサイティングなAIサービスを作るチャンスがますます広がりますね。

こちら公開後、続々とWebRTCを使った開発を行っている方も𝕏上で急増しています。会話型のシステムだとリアルタイム性が求めることになるので、WebRTCは本当に嬉しいですね。

開発者向けの本日のアップデートでまた様々な可能性が見えてきてワクワクしますね

---

**参考動画**: [Dev Day Holiday Edition—12 Days of OpenAI: Day 9 - YouTube](https://www.youtube.com/watch?v=14leJ1fg4Pw)
バグの原因となったソースコードの変更を追うためのVSCodeの使い方

QAエンジニアをやっていると、不具合の根本原因となっているコードを探すことがちょいちょいあります。
エラーログから当たりをつけてすぐに見つかることもあれば、ロジック上の問題の場合、愚直にコードを追っていってようやく見つかるという場合もあります。

そんな作業でもすごく役に立っているのがVSCodeの拡張機能 __GitLens__ です。

どのようにログを追えばよいか、今回は [radix-ui](https://www.radix-ui.com/primitives)のリポジトリを仮に使って説明していきます。

## ログを見て直接原因を探る

まずはログを見ます。Railsの場合は `logs/error.log` あたりにあるか、あるいは自社のログ基盤でErrorで検索すれば引っかかると思います。NodeやNext.jsだとSentryあたりでしょうか。ここは環境によりけりだと思います。

ログにはエラーがおきた直接的な原因のコード行が表示されているはずなので、そこのコードを参照します。

例えば以下の41行目が問題の箇所だとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11128/9d829dac-e798-a5de-6bf2-181fa6f84e04.png)

見えづらいかもですがカーソルをフォーカスすると、コードの隣にコミットした日付とコミットしたユーザー名画表示されているのがわかるかと思います。

ここの処理自体は「3 years ago」なのでおそらく根本原因ではないことがわかりますね。

## ソースコードから処理の流れをひたすら追う

次に直接の問題となった処理の含まれるメソッドあるいはクラスの名前で検索します。
先程の例だと `DialogTriggerProps` が怪しいので単語をダブルクリックすると、色が変わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11128/71cd7604-e6b6-a0d0-363d-7bbd7b9caadf.png)

すぐ上にあるのでハイライトする必要もないのですね。また、Macなら Cmdを押しながら単語をクリック（タップ）すると定義ジャンプすることができま。こちらも活用すると良いでしょう。

## gitlensを使ってコードの変更を見る

定義ジャンプ、コードジャンプ、検索でようやく 2days ago なCommitを見つけたとします。最近の変更なので、おそらくこの修正が影響しているでしょう。

コードの右側に表示されているGitのコミットメッセージにカーソルを合わせると以下のような画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11128/d77683c9-5d26-3742-044f-6cd4c2f87ea2.png)

さらに詳しくコミット内容を見たい場合、地球儀マークにカーソルを合わせます。（Open Commit on Github」と表示される）そしてクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11128/9a286166-d666-7d60-e32a-2220610e335d.png)

Githubで当該コードの修正を含むコミットを閲覧することができます。
大抵の場合はこのコミットが根本原因なので、コミットメッセージと他のコード変更をみて内容を把握します。
できない場合は実装したエンジニアのユーザー名がわかっているので、直接確認しにいくと良いでしょう。

## GithubのPull Requestを確認する

コミットだけだとまれに「fix」とか「修正」だけのコミットの場合もあり、結局何を修正したのかわからないということもあります。そういうときは当該コミットが含まれているPull Requestを参照します。
この作業はGithub側で実施します。

開いたコミットのコミット番号をコピーします。以下の場合だと __06de2d4__ です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11128/4e2b7098-72a0-36ab-b73d-2e9f344c9e6a.png)

これをGithub右上の検索欄に貼り付けて検索します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11128/4b679886-2196-13d8-0d27-56789bb55029.png)

そうすると左側に「Pull requests」と表示されるのでこれをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11128/f330f015-7e5d-609c-5633-87bae1929e31.png)

これで該当するPull Requestをあぶり出すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11128/137e13a2-6422-4418-281f-f033d310a155.png)


## まとめ

不具合調査は時に地道で根気が必要な作業ですが、適切なツールを使うことで効率を大幅に向上させることができます。GitLensは、コードの変更履歴や開発の意図を把握する上で非常に便利な拡張機能です。

今後の調査作業でも引き続き活用して、より迅速かつ正確に問題を解決していきたいと思います。
キャッシュ使用時の一貫性の確保

みなさまこんにちは！エアークローゼットのグエン・バン・ティンです。この記事はエアークローゼットの[アドベントカレンダー2024](https://qiita.com/advent-calendar/2024/air-closet)の14日目の記事となってます。

## はじめに
現代のソフトウェアシステムにおいて、データアクセスのパフォーマンスを向上させるためにキャッシュを活用することは一般的な戦略です。しかし、このアプローチには重要な課題が伴います。それは、データベース内のデータとキャッシュに保存されたデータの一貫性をどのように確保するかという問題です。適切に管理されない場合、これら二つのデータソースの不整合は深刻なエラーを引き起こし、ユーザー体験やシステムの正確性に悪影響を及ぼす可能性があります。

本記事では、キャッシュ使用時における一貫性維持に関する誤った戦略を分析し、正しい戦略を提案することで、データベースとキャッシュの一貫性を確保するための手法を探ります。

## キャッシュと一貫性の重要性について
現代のソフトウェアシステムにおいて、キャッシュはデータアクセスの高速化やシステム全体のパフォーマンス向上において欠かせない要素です。特に、ユーザー数やデータ量が大規模なシステムでは、データベースへの直接アクセスを減らすことで、遅延を最小限に抑え、リソースの効率的な利用を可能にします。

しかし、キャッシュの利用には課題があります。その一つが「データベースとキャッシュ間の一貫性」です。キャッシュに保存されているデータがデータベースの最新データと異なる場合、システムは誤った結果を返すリスクがあります。この問題は、ユーザーエクスペリエンスやシステムの信頼性に深刻な影響を及ぼす可能性があります。そのため、キャッシュとデータベース間のデータ一貫性を確保することは、パフォーマンスの向上と同じくらい重要な課題です。

## キャッシュ利用時の誤った戦略
### 1. キャッシュに直接更新する
![スクリーンショット 2024-12-23 0.35.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3966535/4ec4a9a1-5350-53ec-4bed-49beab379f43.png)


上の図は、2人のユーザーが同時にキャッシュに直接更新を行う戦略を示しています。
```
データベースとキャッシュの間で一貫性が失われる原因となるフロー:
1. ユーザー1がキャッシュをData1に更新する
2. ユーザー2がキャッシュをData2に更新する（ユーザー1はまだデータベースを更新していない）
3. ユーザー2がデータベースをData2に更新する
4. ユーザー1がデータベースをData1に更新する
```
この時、キャッシュにはData2が保存されていますが、データベースにはまだData1が保持されている状態です。このような状況が発生すると、システム内でのデータの不整合が生じます。キャッシュが最新のデータを持っているにもかかわらず、データベースの内容が古いままになるため、後続のユーザーがデータベースから読み込んだ際に誤った情報を取得する可能性があります。

### 2. キャッシュを先に更新し、その後データベースを更新する
![スクリーンショット 2024-12-23 0.33.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3966535/8112d1bc-c8aa-8e73-8cb5-c2768145f23c.png)

上の図は、1つのデータ書き込みフローと1つのデータ読み込みフローが同時に行われる様子を示しており、その中でデータ書き込みフローは、キャッシュを先に更新し、その後データベースを更新する戦略を使用しています。
```
データベースとキャッシュの間で一貫性が失われる原因となるフロー（初期のデータベースのデータはData）:
1. ユーザー1がキャッシュを削除する
2. ユーザー2がキャッシュを読み取ろうとするが、キャッシュがミスしている（ユーザー1はまだデータベースを更新していない）
3. ユーザー2がデータベースを読み取ると、データはDataである
4. システムがキャッシュをDataで更新する
5. ユーザー1がデータベースにData1を更新する
```
この時、キャッシュにはDataが保存されていますが、データベースにはまだData1が保持されている状態です。

## 一貫性を確保するための正しい戦略
![スクリーンショット 2024-12-23 0.33.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3966535/f4160c7e-3036-4180-b9e3-eeea8e0be7ed.png)

上の図は、データの一貫性を確保するために正しいキャッシュの読み書きフローです。
```
初期のデータベースのデータはData:
1. ユーザー1がデータベースのデータをData1に更新する
2. ユーザー1がキャッシュを削除する
3. ユーザー2がキャッシュを読み取るが、キャッシュがミスしている
4. ユーザー2がデータベースを読み取ると、データはData1である
5. システムがキャッシュをData1で更新する
```
ユーザー1がデータベースを更新し、まだキャッシュを削除していない場合、ユーザー2は古いデータをキャッシュから読み取ることになります。しかし、この状況は完全に許容できます。なぜなら、ユーザー1がキャッシュを削除した後、次回ユーザー2は最新のデータを取得できるからです。

2人のユーザーが同時に書き込みを行う場合でも、データベースとキャッシュ間の一貫性は確保されます。なぜなら、ここではキャッシュを削除するだけであり、キャッシュの設定はユーザーの読み取りフローで行われるからです。

## まとめ
キャッシュの使用はシステムのパフォーマンスを最適化しますが、データベースとキャッシュ間の一貫性を確保するという課題も伴います。適切に管理されない場合、不整合が発生し、ユーザー体験に悪影響を与える可能性があります。

本記事では、キャッシュを更新する際の誤った戦略、特にキャッシュを先に更新し、その後データベースを更新する戦略について説明しました。一貫性を確保するための正しい戦略は、データベースを更新した後にキャッシュを削除し、読み取りフローでキャッシュを更新することです。

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

また、エアークローゼットはエンジニア採用活動も行っておりますので、興味のある方はぜひご覧ください！

https://corp.air-closet.com/recruiting/developers/

https://www.wantedly.com/companies/airCloset/projects
Windows Power Shell でフラットコピー

### windowsのファイルコピーであるフォルダ以下にあるすべてのファイルを、フォルダ構造なしに”ファイルのみ”別のフォルダへコピーするには? 


しばらくmac/linuxでWindowsは事務処理だけになってまして、初めてPowerShell使いました。
以下の方法で、有料アプリを使わずにスクリプトでフラットコピーできました。

 ## 1. 以下のスクリプトファイルを作成

flatcopy.ps1
```
$sourcePath = "D:\MEDIA_PICTURES\"
$destinationPath = ".\PICTURES\"

# コピー先フォルダが存在しない場合は作成
if (-not (Test-Path -Path $destinationPath)) {
    New-Item -ItemType Directory -Path $destinationPath | Out-Null
}

# ファイルを再帰的に取得して、フォルダ階層を無視してコピー
Get-ChildItem -Path $sourcePath -Recurse -File | ForEach-Object {
    $destinationFile = Join-Path -Path $destinationPath -ChildPath $_.Name
    Copy-Item -Path $_.FullName -Destination $destinationFile -Force
}
```

## 2. 実行
パーミッションエラーにならないように以下のように実行

```
>PowerShell -ExecutionPolicy RemoteSigned .\flatcopy.ps1
```


### 課題：

- 重複するファイル名の処理

(以上です）
RealforceのUS配列キーボードを買った件

# はじめに
RealforceのUSキーボードを買ったので記事を書いてみます。
技術ブログは時間がなくてかけないので

# なぜUSキーボードを買ったのか
もともと日本語配列キーボード使いでした。
転職先のPCがUSキーボードで使い続けていたらいつの間にか日本語配列が打てなくなりました。
日曜プログラミングにも支障をきたすことになり買い替えを決意。
# いくらで買ったのか
中古で1万です。メルカリで買いました。
せっかくなのでHHKBも試してみようかな、と思ったのですが中古市場は高い高い。。。
もし高級キーボードに興味があり中古に抵抗がない方はRealforceの中古から初めて見るといいかもしれません。

# ちなみにマウスは何使ってるの？
ロジクールのMX Anywhere 3Sです。
会社のマウスもこれを使っていて使いやすいので家にも導入してみました。サンタさんはいないので自費です。
ホイールマウスは自分には合わなかったです。
計画的偶発性理論について学ぶ

この記事は、[and factory.inc Advent Calendar 2024](https://qiita.com/advent-calendar/2024/andfactory) **23日目** の記事です。

# はじめに

みなさんは『計画的偶発性理論』というのを聞いたことがあるでしょうか？
私は、少し前にキャリア形成について調べていたときに『計画的偶発性理論』について知る機会があったのですが、会社のマネジメント研修でもたまたま紹介され、併せて『その幸運は偶然ではないんです！』という書籍が紹介されていたので読んでみました。

この記事では、計画的偶発性理論についての紹介と、上記の書籍に書かれていたことから重要そうなところをピックアップして紹介したいと思います。

# 計画的偶発性理論とは

キャリアの8割は、本人の予想しない偶然によって決まるというキャリア理論です。

この8割というのは、ビジネスに成功した人のキャリアを調べた結果、8割は本人が予想しなかった偶然の出来事がターニングポイントだったという調査結果によるものだそうです。

もちろん、ただ偶然なにかが起こるのを待っていれば良いというわけではなく、積極的にチャレンジ・行動をしていくことが必要です。
何かしらの出来事をチャンスと捉えるマインドと、そのチャンスを掴むために行動を起こすことで、それが後々のキャリアにつながっていくという考えです。

## 5つの行動原則

チャンスを掴むために、日々心掛けるべき5つの行動原則があります。

### 好奇心

新しい知識・経験・出会いなどに好奇心をもつ。

### 持続力

好奇心に向き合い、それに取り組み続ける。
失敗しても良い。失敗は学びの機会であり、次に繋げていくことが大事。

### 楽観性

自分の力や考え方を信じて前向きに可能性を追求する。

### チャレンジ

不確実なものや自分のできる範囲外のことでも、リスクを恐れずにチャレンジする。

### 柔軟性

アンラーニングやオープンマインドを大切にし、今までの価値観とは違う物事を受け入れる。

---

記事を書いていて、それぞれの行動原則は密接に関連していると感じました。
例えば、好奇心だけあっても今の自分のスキルに見合わないと判断してチャレンジしなければ結果として偶発的なチャンスを逃すことになります。他にも、柔軟性とチャレンジは規定の概念に囚われず新しいことを受け入れる／新しいことにチャレンジしていくという点で似ています。

柔軟性と持続性に関しては、新しいことを受け入れる／粘り強くチャレンジし続けるという点が、一見すると相反するところもあるように感じるかもしれません。

柔軟性は「一度決めたからといってそれに固執する必要はない」ということですが、コロコロとやることを変えれば良いというわけではなく、例えば「法律を学ぶ学校に行ったから法律家にならないといけない」というような発想は捨てるべきという考えです。
持続力は「最初はできなくて当たり前、スキルが身につくまでには相応の時間は掛かるものだし、失敗しながら学んでいこう」という感じなので相反しているわけではなさそうです。

# 書籍について

私が読んだのは以下の書籍です。

::: note
書籍名 : その幸運は偶然ではないんです!
著者 : J.D.クランボルツ、A.S.レヴィン
発売日 : 2005/11/17（第1刷）、2023/11/6（第19刷）
:::

まず前提として、書籍の中で『計画的偶発性理論』という言葉は使われておらず、あとがきで少しだけ『ハプンスタンス論』として記載されていました。調べてみたら『計画的偶発性理論』は『プランドハプンスタンス理論』とも言うみたいです。
同様に5つの行動原則についても、あとがきで少し紹介されていた程度で、きちんとした定義は書かれていませんでした。

またエンジニアに特化した書籍ではありません。

## 重要項目のピックアップ

前述のように計画的偶発性理論について、その理論を正しく学ぶという類の書籍ではなく、具体的な事例をもとに、良かった点や改善すべき点を解説するという構成でした。
その中で、重要だと感じた点をピックアップし、一部私の考え（エンジニア目線の考え）も交えながら紹介します。

### 将来のキャリアを柔軟に考える

その時々で目標を決めるのは良いが、目標は自分自身のスキルセット・興味関心や環境の変化によって変化していく可能性がある。
また、自分の今までの経歴に縛られることなく、いろいろな選択肢があることを認識しておくこと。
認識しておくだけでも、今まで無自覚で放棄していたことが実はチャンスだったかもしれないと気付けるかもしれない。

### 想定外の出来事に備える

想定外の出来事はいつやってくるか分からないので、いつでもそれを利用できるように準備する。

エンジニア目線で考えると、モダンな知識の習得や専門領域外の勉強などが挙げられると思います。
また周囲に自分の興味のあることを話しておくだけでも、プロジェクトのアサインを考えてもらう上で上司の参考になるかもしれません。（偶然を引き寄せる。）

### いろいろな活動に参加する

どんな活動でも積極的に参加することで、自身の人脈も広がるし、好きなこと・嫌いなことの発見にもつながる。

エンジニア目線で考えると、各種大規模カンファレンスの運営に参加してみるとか、勉強会に参加してみるとかが挙げられそうです。総じてモチベーションが高い人が多い傾向にあるので、良い刺激になるのではないでしょうか。

### たくさんの失敗を経験する

間違いや失敗は重要な学びの材料となる。
自分に足りないものが何なのかを客観的に判断する材料にもなるし、次に失敗しないために工夫することが総じて成長につながる。
学校や試験などの場においては間違いは減点対象となるが、仕事においては（もちろんマイナスな側面もあるが）経験が蓄積され、将来の自分のために活かせるはず。

### 能動的に行動する

受動的な行動ではなく、能動的に行動すること・積極的に活動することで想定外の出来事を作り出すことができる。
受動的な行動とは、人が教えてくれるのを待つとか、テレビをダラダラ見るとか、自身で何かを考えなくても勝手に物事が進む状態のこと。

### 内面的な障害を克服する

障害には外面的な障害と内面的な障害がある。自分の意志でコントロール可能な内面的な障害を克服するために、新しい考えや経験にオープンであり続ける。

# 皆さんはどうでしたか？

皆さんの今までのキャリア形成において、思い当たるフシはあったでしょうか？

私自身の経験をよくよく振り返ってみると、やっぱり偶然起こった出来事が自分のキャリアに影響しているなぁとしみじみ感じます。
特にエンジニアを目指そうとしたタイミングでスマートフォンというデバイスが登場したのは、自分にとっては大きな偶然だったと思います。
（とはいえ、スマートフォンがなくても別でエンジニアになっていたかもしれないので、こじつけ感はありますが:joy:）

ただ、やはり自分から行動を起こすことは本当に重要だと思いますので、皆さんも自分の興味の幅を広げて、いろいろなことにチャレンジしてみてください！
もしかしたら、そのチャレンジがきっかけで新しいキャリアにつながっていくかもしれませんよ。
Microsoft Power Fx の概要

業務でMicrosoft Power Apps を恒常的に利用するにあたり、Power Fx の概要を把握するためにこの記事を書いてみようと思います。

参考資料： 
https://github.com/microsoft/Power-Fx/blob/main/docs/overview.md  
https://learn.microsoft.com/en-us/power-platform/power-fx/overview

## Microsoft Power Fx の概要

Power Fx は、

- キャンバスアプリ（Power Apps）の数式言語（Formula language）の新しい名称
- Power Platform の他の製品と統合し、オープンソースとして利用できるよう進行中
- Power Platform 全体で使用されるローコード言語
- 汎用的ながらも強力な型付けがなされた宣言的な関数型プログラミング言語
- Excel のように簡単に記述することができる
- プログラミングをしたことがない人のための「ノーコード」から、熟練したプロのための「プロコード」まで、あらゆる開発範囲をカバー

例えば、文字を逆順に検索する数式は以下のようになります。  

Excel の場合： 
![reverse-search-excel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/7bff3cfd-5e8c-7e0b-bd3e-a852d8046279.png)

Power Fx の場合： 
![reverse-search-power-apps.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/f52b0ac7-cc32-6916-618e-512aa99cb002.gif)

Power Fx では、Input: のコントロールの値が変更されると、Label: のコントロールは自動的に計算式を再計算して新しい値を表示します。他の言語によくあるようなOnChangeイベントハンドラはありません。

スプレッドシートと同様にPower Fx は常に「ライブ」で、コンパイルモードや実行モードに変更することなく瞬時に反映され、エラーも瞬時に検出＆表面化されます。またPower Fx に実装されているインクリメンタルコンパイラによって、インテリセンス（IntelliSense）、提案、自動補完、型チェックもサポートされています。

Power Fx の式は非常に強力で、ほとんどのロジックを1行で記述することができます。

JavaScriptとの比較の例：
![low-code-javascript.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/6f8cdaa8-fb94-0997-919c-eba2561aa9c9.gif)


### Power Fx の設計原則
- シンプル：非プログラマー向けに設計され、学習負担が少ない。一方で開発者の生産性も向上
- Excelとの整合性：Excelの式をベースとしており、直感的な操作が可能。必要に応じてSQLの考え方も活用
- 宣言型：「何をしたいか」を記述し、処理順序やタイミングは自動的に最適化
- 関数型：副作用のない純粋な関数を優先。必要に応じて状態変更もサポート
- 機能的：機能を組み合わせて使いやすく設計
- 強い型付け：型はコンパイル時に確認され、エラーを早期発見
- 型推論：明示的な型宣言なしで、型を自動的に判断
- ローカライズされた小数点セパレータ：Excelと同様にロケール（地域）に応じた小数点表記
- 非オブジェクト指向：プロパティやメソッドではなく関数として操作
- 拡張性：独自のコンポーネントや関数を作成可能
- 開発者フレンドリー：コメントや互換性維持など、開発者に配慮
- 発展的言語：後方互換性を重視しつつ、柔軟に改善可能
- 未定義値なし：未初期化変数は空白値（a blank value）として扱い、エラーや曖昧さを回避
[Python] math : isqrt / prod / comb / perm / fsum

Pythonのmathについて、復習メモ。
[[Python] math : sqrt / pow / ceil / floor / fabs](https://qiita.com/yam_dev/items/4db71b30c04b9cf2eab7)
[[Python] math : factorial / log / gcd / degrees / radians](https://qiita.com/yam_dev/items/b33c7b1244b8695de1ad)
の続きです。

# math.isqrt(n)
nの平方根の整数部分を返す（n は正の整数である必要がある）

```python
import math

n = 25
result = math.isqrt(n)
print(f"isqrt({n}) = {result}")  # 出力: isqrt(25) = 5

n = 26
result = math.isqrt(n)
print(f"isqrt({n}) = {result}")  # 出力: isqrt(26) = 5
```

# math.prod(iterable, *, start=1)
iterableの要素の積を返す
startはオプションの開始値で、デフォルトは1

```python
import math

numbers = [2, 3, 4]
result = math.prod(numbers)
print(f"prod({numbers}) = {result}")  
# 出力: prod([2, 3, 4]) = 24

numbers = [2, 3, 4]
start = 5
result = math.prod(numbers, start=start)  # start値を指定
print(f"prod({numbers}, start={start}) = {result}")  
# 出力: prod([2, 3, 4], start=5) = 120
```

# math.comb(n, k)
nCk (n 個から k 個を選ぶ組み合わせの数) を返す。

```python
import math

n = 5
k = 2
result = math.comb(n, k)
print(f"comb({n}, {k}) = {result}")  # 出力: comb(5, 2) = 10
```

# math.perm(n, k=None)
nPk (n 個から k 個を選ぶ順列の数) を返す
kが指定されていない場合は、nPn (n!) を返す。

```python
import math

n = 5
k = 2
result = math.perm(n, k)
print(f"perm({n}, {k}) = {result}")  # 出力: perm(5, 2) = 20

n = 5
result = math.perm(n)  # kが指定されていない場合
print(f"perm({n}) = {result}")  # 出力: perm(5) = 120
```

# math.fsum(iterable)
iterableの要素の合計を正確に計算する
浮動小数点数の合計で発生する（可能性がある）、丸め誤差を軽減する場合など

```python
import math

numbers = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
result = sum(numbers)  # 通常のsum関数
print(f"sum({numbers}) = {result}")  
#(誤差が発生)
# 出力: sum([0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]) = 0.9999999999999999

result = math.fsum(numbers)
print(f"fsum({numbers}) = {result}")  
# 出力: fsum([0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]) = 1.0
```

# まとめ
今回は、mathモジュールの関数 isqrt, prod, comb, perm, fsum について紹介しました。
そろそろ、今まで紹介した 関数を使って、簡単な対話型ゲームを作ってみようかと思います。
FastAPI / DI（依存性注入）とValidator


こんにちは、依存性注入してますか！？　
っていうと、薬物依存症みたいですがweb APIを作るときのお話です。　

ちょっと分かりづらい概念だったり、自動でやってくれるので作業後には動作原理を忘れがち。　といことで、爆速APIフレームワークFastAPIで使われているデータ検証ライブラリ Pydanticの機能を解説します。

...（↓参照）


https://note.com/mz700/n/n92e20d9f3958
ChatGPTに「Search」機能が全面解禁！リアルタイムの情報取得がもっと手軽に

「12 Days of OpenAI」Day 8 のテーマは**Search**。すでにPlus/Proユーザー向けに先行提供されていたウェブ検索が、**ログインした無料ユーザー全員**に拡大されました。また、**モバイル版での地図表示**や**音声モード**との連携など、多数の改善・新機能が盛り込まれています。

この記事は[ChatGPT Advent Calendar 2024](https://qiita.com/advent-calendar/2024/chatgpt)の13日目です（空いていたので書いてみました）今年は「12 Days of OpenAI」ということで毎日発表がありましたが、その内容を復習しながらまとめます

## Search機能のポイント

1. **チャット画面から直接ウェブ検索**  
   - これまでと同じようにチャット欄へ質問を入力するだけでOK。  
   - ChatGPTが必要と判断すれば自動的にウェブを検索し、最新情報を回答。  
   - 検索ボタンを押せば、確実にリアルタイム情報を取得可能。

2. **リッチなビジュアルと会話継続**  
   - 検索結果には画像サムネイルや動画プレビューが表示され、**その場で再生**も可能。  
   - 「イベント情報→天気→地図で場所確認」といった一連のやりとりがシームレスに継続。

3. **モバイルに特化したUI改善**  
   - スマホ版アプリ上で、**Google Maps**風に地図を開き、住所・営業時間などが分かりやすいリスト表示に。  
   - 例：「近所で屋外ヒーターつきのメキシカンレストラン」といった要望にもスムーズに対応。

4. **音声モード（Advanced Voice）とも融合**  
   - 前回アップデートされた音声会話モードに、**リアルタイム検索**が統合。  
   - 旅行計画で「現地の天気は？」「現地語で挨拶を教えて」と話すだけで最新情報が返ってくる。

5. **ブラウザのデフォルト検索エンジンにも対応**  
   - ChatGPTをブラウザの検索として設定すれば、**アドレスバーに入力→サイト候補一覧→アクセス**の流れがスムーズ。  
   - 細かい絞り込みや最新ニュースを得たいときにはチャットに移行して深堀りできる。

## ログイン無料ユーザーにも順次解禁

- **日付**: Day 8（本日）よりリリース開始  
- **対象**: ログイン済みの無料ユーザーを含む全ユーザー（地域限定なし）  
- **注意点**: アカウントなしでもChatGPTの利用は可能だが、**SearchやCanvasなどの主要機能**を使うには無料アカウント作成が必要。

## まとめ

- **リアルタイム検索**がChatGPTに正式統合され、**文字・画像・動画**が混在する情報をわかりやすく提示。  
- **音声会話**や**モバイル地図表示**など、多角的な検索体験が実現。  
- ChatGPTを**デフォルト検索エンジン化**することで普段のブラウジングも一段と効率アップ。  

検索エンジンとしてだけでなく、**その後の会話まで踏まえて最適な情報を返してくれる**のがChatGPTの強み。  
「AIアシスタントがすべてをガイドしてくれる」次世代の検索体験が、誰でも手軽に使えるようになりました。

---

**参考動画**: [Search—12 Days of OpenAI: Day 8 - YouTube](https://www.youtube.com/watch?v=OzgNJJ2ErEE)
【Notion】Webhookを使ってDIscord通知をやってみた

# はじめに

今回は、Notion WebHookでDIscord通知をやってみた記事になります。

## Notion WebHookとは

割と最近追加された機能で、DBのオートメーションアクションの一つです。

NotionのDBにデータが追加されたり更新されたりした際に任意のWebHookを叩くことができるという機能で、これからかなりの活躍が期待される機能となります。

https://www.notion.com/ja/help/webhook-actions

注意として、現在(2024/12/23)時点では有料プランのみで利用可能です。

## やりたいこと

- NotionのDBにデータが追加されたらDiscordに通知を飛ばす
- 通知の中にURLを含めて簡単に確認できるようにする

## 使用技術

- Notion
- Discord
- GAS(Google Apps Script)

以上の技術を使って実装していきます。
NotionのWebHookを叩いて、GASで処理をしてDiscordに通知を飛ばすという流れになります。

```mermaid
graph LR
    Notion-->GAS
    GAS-->Discord
```

## GASの実装

GASの実装は以下のようになります。

```javascript
function doPost(e) {
  const json = JSON.parse(e.postData.getDataAsString()); // Notionからのデータを取得

  const url =
    'https://discord.com/api/webhooks/{discordで発行したWebHookのURL}'; // Discord WebHookのURL

  const message = 'DBにページが作成されました。→';
  const pageName = json.data.properties.name.title[0].text.content; // ページ名を取得
  const pageURL = json.data.url; // ページURLを取得

  const options = {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    payload: JSON.stringify({ content: message + `[${pageName}](${pageURL})` }),
  }; // Discordに送信するデータ

  return UrlFetchApp.fetch(url, options); // Discordにデータを送信
}
```

## Notionの設定

データベースの⚡️アイコンから「オートメーション」を選択しWebHookを追加します。

![スクリーンショット 2024-12-23 0.15.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778030/1074942b-047b-bff0-c5d2-5c198627cbee.png)

日時のトリガーは「ページが作成されたとき」を選択しアクションは「WebHookを送信する」を選択します。

URLには先ほどのGASをWEBアプリとしてデプロイしたURLを入力します。
コンテンツでは今回使用するページ名プロパティの`name`を選択しています。

## 完成!

実際にNotionにページを追加するとDiscordに通知が飛ぶようになります。

![スクリーンショット 2024-12-23 0.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778030/9b6804f4-4fe0-c443-03a0-ea0d68386d61.png)

![スクリーンショット 2024-12-23 0.18.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778030/7d6aed77-6092-1ee7-0bc1-0257cdf5e30f.png)

ちゃんとクリックでNotionのページに遷移することもできます。

## おわりに

最後まで読んでいただきありがとうございます。

Notion WebHookはかなり便利な機能で、今後どんどん活用例が増えていくと思うのでウォッチしていきたいですね。

できれば無料プランでも使えるようになるといいなと思います🫠

## 参考

https://www.notion.com/ja/help/webhook-actions

https://hkob.hatenablog.com/entry/2024/12/06/050000

https://pwe-tech.com/post/gas-gcp-cloud-logging/
Qiitaをポートフォリオにして転職活動した話

こんにちは、ぴえさんです。
普段はSalesforce関連の技術記事とか資格取得記を書いています。

今回はアドベントカレンダー用に
転職活動をしたときにQiitaをポートフォリオにした話を書きました('・ω・)

https://qiita.com/advent-calendar/2024/engineering-careers-2

Salesforceエンジニアの年収の話はこちらに載せてます。

https://qiita.com/piepie1231/items/f060fb167539b4a3530a


# 転職にいたったきっかけ

**会社がブラックになった**

がきっかけです。
なった、ということで前はそうでもなかったんですけど
いろいろと体制が変わるなかで
いつのまにか負担が大きくなっていました。

**仕事は生活を維持するためのお金を稼ぐ手段**
だと考えているので、時間も体力も削られている状態がすごくストレスでした。

このままじゃ無理です～と偉い人に何度か直談判したのですが、
改善されるどころかさらに悪化したので見切りをつけました。

# 転職活動スタート

転職活動を始めようにも業務が忙しくて平日は時間が取れず
土日もたまった家事用事を消化する日々でしたが
ある日の全社ミーティングで偉い人からのありがたいお言葉に
（心の中で）ぶちぎれて怒りのまま転職活動を開始することができました。

怒りのエネルギーというのはすごいものでその次の日には
・転職サイトの比較検討と登録
・職務経歴書の作成
・履歴書の写真撮影
まで済ませたのでした。ありがとう偉い人。

### 利用した転職サイト
今回が3回目の転職活動だったのですが
転職エージェントを使わないことだけは決めていました。
（エージェントに気を遣って受けたくないとこも受けるのが嫌だったので。笑）

「IT　転職サイト　おすすめ」とかで検索したと思います。
大手の求人もいいかと思いますが、最近はIT特化の転職サイトもあって
情報の入力もしやすくていい気がします。

ぴえが今回使ったのはGreenという転職サイトで
決め手は一番最初の入力工数が小さかったからでした。
スマホでも使いやすいUIで終始不便はありませんでした。

https://www.green-japan.com/

### Qiitaをポートフォリオにした話
Greenではマイページ？に経歴や資格を書けました。
もちろん選考の過程で履歴書や職務経歴書の提出はあるのですが
このマイページを見た企業の採用担当の人からスカウトを受けたりもします。

ぴえはSIerにいたのでその経歴とポートフォリオとしてQiitaのマイページを登録していました。

https://qiita.com/piepie1231

- 資格これだけ持っているよ！
- Salesforceのリリースノートも結構見ているよ！
- コードもこんくらい書けるよ！

というのを伝えるために置いたのですが
スカウトメッセージや面談でQiita見ました。と割と言われたので効果はあったと思います。

ただあまりリアルの知り合いにこのアカウントを言ってないので、この人ぴえのQiita投稿読んでるんだ、、とちょっとこっ恥ずかしい感じがしました。

あんまりふざけたこと書かないで真面目な文章を書けばよかったなと反省しています。

# 結果をさっくり
最初は自分から求人を探していたのですが多くて分からなくなったので
スカウトをいただいたうちの数社だけを受けました。

スカウトといっても選考はあるのですが
少しは気になって声かけてくれたということでこちらの気持ちのハードルも下がりました。

サイトに登録して内定承諾までは2か月ほどだったと思います。
条件も一緒に働く人もいい感じだったので、妥協せず本当にいいと思った会社に入社できてよかったです。

# 転職活動をこれから始める人へ
すごく実用的なアドバイスを2つ

### 1.スキルシートや職務経歴書は頻繁に更新しておく
やった案件の内容とかを結構忘れるので
半年に一度くらいは職務経歴書を更新していました。
これが地味に一番最初の面倒事を軽減できたと思います。

### 2.Qiitaに記事投稿する
職務経歴書で表現しきれない部分を分かりやすくアピールできるので
興味を持ってもらいやすくなると思います。
転職活動のためにQiitaを書けというわけではないですが、
書いてると転職活動の時に役に立ちます。

# さいごに
2024年はこんな感じで思いがけなく転職活動をしましたが後悔はしていません。
アドベントカレンダー探していて転職ドラフトを知ったので
今の会社を辞める予定は当分ないですが
いつかまた転職活動する機会があれば使ってみたいです（\*^U^*）

https://job-draft.jp/
コマンドラインからシーンをシミュレーションするときに学んだポイント

[PONOS Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ponos)の21日目の記事です。
昨日は@FW14Bさんの「[業務用ゲーム機の修理から学んだこと](https://qiita.com/FW14B/items/b4ff7e1b40d82a32cd76)」でした。

# はじめに

最近、コマンドラインからゲーム本編中のシーンをシミュレーションする仕組みを構築しようとしました。
これまでバイナリビルドのシステムを開発したりはしていましたが、ゲーム本編の処理を実行する経験はなかったので、初歩的ではありますが個人的に学びを得られたポイントをまとめたいと思います。

# コマンドからUnityエディタを立ち上げて特定メソッドを実行する

先述の通りバイナリビルドのシステムを開発した経験があったため、バッチモードでUnityを実行する方法は知っていましたが、Unityエディタを立ち上げる方法を経験したことがなかったので、改めてコマンドでUnityを起動する方法を調べながら実装しました。

公式のドキュメントは「[Unity エディターのコマンドライン引数 - Unity マニュアル](https://docs.unity3d.com/ja/2022.3/Manual/EditorCommandLineArguments.html)」にあります。

結論、バッチモードで実行する場合との差は`-batchmode`を省くだけであり、Unityエディタを起動して目的のメソッドを実行することができました。`-executeMethod`はUnityエディタを起動した直後に実行する静的メソッドの名前を指定しています。

```sh:start_simulation.sh
"** 使用しているUnityのパス（/Unity.app/Contents/MacOS/Unity） **" \
    -projectPath "** Unityプロジェクトのルートディレクトリのパス **" \
    -executeMethod GameSimulator.Simulate
```

```
sh start_simulation.sh
```

# Unityエディタのプレイモードを開始する / 終了する

シーンの挙動をシミュレーションしたい場合、Unityエディタでプレイモードを開始する必要があります。
また、目的のシミュレーションが終了したときにはプレイモードを終了する必要もあります。

これらのプレイモードの状態の切り替えには、`EditorApplication.isPlaying`の値を使用します。公式のドキュメントは「[EditorApplication-isPlaying - Unity スクリプトリファレンス](https://docs.unity3d.com/ja/2021.1/ScriptReference/EditorApplication-isPlaying.html)
」にあります。

使い方は簡単で、プレイモードを開始したいときには`true`を、終了したいときには`false`を設定するだけです。

```cs
// シミュレーションを開始するために、プレイモードを開始する。
EditorApplication.isPlaying = true;

// シミュレーションを終了するために、プレイモードを終了する。
EditorApplication.isPlaying = false;
```

# シミュレーション中の情報を保持する

シミュレーションの進行中の情報を保存したい場合、Unityエディタの起動時に使用した`static`なメソッドやクラスに保持させたいと考えますが、前述のプレイモードの開始をしていると容易に`static`フィールドが初期化されてしまうため、情報を保持することができません。

シリアライズされた値は初期化されることがないため、`EditorWindow`を用意して情報をシリアライズ可能にしておくことで保持することも可能ですが、基本的にシミュレーション中は人が操作・監視しないことを想定しているため、人の目に触れないウィンドウを作成するのは少し抵抗があります。

そこで今回自分は`EditorPrefs`を利用して情報を保持する方法を採用しました。
`EditorPrefs`に保存されていればプレイモードの切り替えでも情報が初期化される事はありませんし、シミュレーションの仕組みはエディタ拡張寄りの実装ですから、情報の置き場としても自然に感じます。

`EditorPrefs`については「[EditorPrefs - Unity スクリプトリファレンス](https://docs.unity3d.com/ja/2021.1/ScriptReference/EditorPrefs.html)」にあります。

```cs
// シミュレーションする回数を保存しておく。
EditorPrefs.SetInt("SimulationCountKey", simulationCount);

// シミュレーションを完了した回数を保存しておく。
EditorPrefs.SetInt("FinishCountKey", finishCount);

// シミュレーション回数が不足していたら次のシミュレーションを開始する。
var simulationCount = EditorPrefs.GetInt("SimulationCountKey");
var finishCount = EditorPrefs.GetInt("FinishCountKey");
if (finishCount < simulationCount)
{
    // 次のシミュレーションの処理。
}
```

シミュレーション時に保持するべき情報が多い場合、個別に保存していると管理コストが高くついてしまうので、シリアライズ可能なデータクラスを定義し、それをJSON形式にシリアライズして一度に保存してしまうのがおすすめです。

# Unityエディタ上でのシミュレーションを終了する

コマンドラインでの実行時に`-quit`を指定していない場合、シミュレーションを終了するタイミングで明示的にUnityエディタを終了させる必要があります。
Unityエディタの終了には`EditorApplication.Exit`を実行します。ドキュメントは「[Unity - Scripting API: EditorApplication.Exit](https://docs.unity3d.com/2022.3/Documentation/ScriptReference/EditorApplication.Exit.html)」です。

```cs
EditorApplication.Exit(0);
```

なお、シミュレーションの結果についてはこのメソッドで返すことは難しいため、別途テキストで書き出すのが良いと思います。

# まとめ

以上、簡単ではありますが、シミュレーションの機能を開発するうえで学んだポイントをまとめました。
ここで紹介した機能を利用することでシミュレーションの外枠については迷わず実行することができるようになると思います。

明日は@michel_mayonakaさんです！
Projects機能でチャットをもっと整理・カスタマイズ！ChatGPTが大進化

「12 Days of OpenAI」Day 7 は、待望の**Projects**機能が登場。  
これまでチャット履歴が増えていく一方で整理が大変だったところを、フォルダ感覚でまとめられるだけでなく、**ファイルアップロード**や**カスタムインストラクション**までプロジェクト単位で設定できます。  
ちょっとしたメモから大規模コード修正まで、複数のタスクをよりスムーズにこなせるようになるのがポイントです。

この記事は[ChatGPT Advent Calendar 2024](https://qiita.com/advent-calendar/2024/chatgpt)の12日目です（空いていたので書いてみました）今年は「12 Days of OpenAI」ということで毎日発表がありましたが、その内容を復習しながらまとめます

## Projectsの概要

- **会話やファイルを「プロジェクト」単位で整理**  
  例えば「Secret Santa企画」や「自宅メンテナンス」、「個人サイト制作」などテーマごとに区切って使える。  

- **アップロードファイルや独自インストラクションを紐づけ**  
  プロジェクト内にPDFや画像、コードなどをまとめて置き、ChatGPTに特定のトーンやスタイルで応答させる設定も可能。  

- **従来の機能（検索、Canvas、音声…）とも連携**  
  Conversation検索やCanvasを使った高度な文章・コード編集も、プロジェクト内部で完結させられる。

## 使い方と特徴

1. **新規プロジェクトを作成して会話開始**  
   - サイドバーの「+ (プロジェクト作成)」からタイトルやカラー設定をして作成。  
   - **アップロードファイル**や**カスタムインストラクション**を設定すると、チャットで一度に扱う文脈が拡張される。  
   - 従来のチャット形式と変わらない感覚で、プロジェクト専用のスレッドを増やせる。

2. **既存のチャットをドラッグ＆ドロップで移動・追加**  
   - 過去のチャットをまとめたくなったら、「会話検索」で該当スレを見つけてプロジェクトに移動。  
   - **ドラッグ＆ドロップ**やサイドバーからの「Add to project」も可能。  

3. **複数のスレッドで同時進行**  
   - 一つのプロジェクト内で、必要に応じて新規チャットをどんどん追加できる。  
   - 例：1つ目のスレッドでWebサイトのコードを編集、2つ目のスレッドでデザイン相談、3つ目のスレッドで文書の校正…など。

4. **アップロードファイルをChatGPTが活用**  
   - たとえば「secret_santa.csv」「home_maintenance.log」「web_template.astro」などを置いておき、  
   - 「XYZファイルの2行目を参照して」と指示すると、ChatGPTが内容を理解してサマリや編集案を出してくれる。  
   - PythonコードやJSONデータもまとめてアップロードし、**プロジェクト内で実行やエラー修正**が完結する。

5. **Canvasや検索、音声モードとも連携**  
   - ドキュメントやコードをCanvas編集に切り替えて、行ごとの差分を確認。  
   - 会話検索で過去の類似プロジェクトやメモを探して再利用。  
   - Advanced Voiceで「口頭で指示→そのままプロジェクトに反映」といったワークフローも実現。

## 活用例

- **Secret Santa企画の管理**  
  - 欲しいプレゼントのリストやルールをファイルとしてアップロード。  
  - ランダムマッチングのPythonコードを実行してもらい、結果をテーブル化。  
  - 参加者への招待メールはCanvas経由でテンプレート作成・編集。  

- **自宅メンテナンスの記録**  
  - 交換時期があるフィルターや家電の操作マニュアルをPDF/メモ形式でアップロード。  
  - 過去のログと照合して「そろそろフィルター変え時だよ」とChatGPTが教えてくれる。  
  - さらに「交換手順を教えて」と聞けば自分のメモに基づいた手順を返してくれる。  

- **個人サイト制作**  
  - HTML/CSS/アプリのテンプレートファイルをプロジェクトに入れる。  
  - AIがAstroやTailwind等の独自フォーマットを理解し、差分編集を提案。  
  - Canvasでコードをプレビューして、そのままVS Codeへコピペ→ブラウザで確認。

## リリース状況

- **本日（Day 7）よりPlus/Pro/Teamsユーザー**に順次公開  
  - フリー層にも早期に展開予定。  
  - Enterprise/EDUプランは年明け以降に対応見込み。  

- **リアルタイムでロールアウト中**  
  - 配信中にPMが「Ship it」ボタンを押し、段階的にリリース開始というデモが話題に。  

Projectsは**メタ情報やファイルを会話に結びつける**という新たな体験をもたらし、ChatGPTが単なるチャットツールから**“ドキュメント＆作業ハブ”**へと変貌する重要な一歩に感じられます。  
今後のアップデートでさらに洗練されていくのが楽しみですね。

---

**参考動画**: [Projects—12 Days of OpenAI: Day 7 - YouTube](https://www.youtube.com/watch?v=FcB97h3vrzk)
Emacs Lisp 超初心者がコマンドを作ってみる 〜 代入の評価 〜

C言語では代入するとその右辺値を返します。

````C
int a;
int b;
a=1;
b=1;
`````

を

````C
int a;
int b;
b=(a=1);
`````

と書くことができます。 (もっと言えば代入の場合は右から順に評価されるのでどうせ書くなら b=a=1; )

Emacs Lisp の setq も同様に代入結果を返します。

````elisp
(setq a 1)
(setq b 1)
````

を

````elisp
(setq b (setq a 1))
````

と書くことができます、まぁ、まぁわかりやすさのためにこういうのははそれぞれ書きますが、応用例

````elisp
(setq beg-A (point-min))
(setq end-A (point-max))
(goto-char beg-A)
(push-mark end-A t t)
````

を

````elisp
(goto-char (setq beg-A (point-min)))
(push-mark (setq end-A (point-max)) t t)
````

としてみました。

なので、 条件式の中に書く事もできます。 
C言語だと

````C
while ((c=getchar())!=EOF)
````

っていうフレーズが有名(K&Rとか)

Emacs Lisp だと、例えば builtin の calcalg2.el より

````elisp:/usr/share/emacs/29.3/lisp/calc/calcalg2.el
(while (>= (setq num (1- num)) 0)
  (setq expr (list func expr var)))
````
今回はここまで