OmniAICreator/Qiita-1.07M huggingface dataset:
XIAO ESP32C6+SSD1306で46と表示して遊ぶ。(Adafruit GFX)


いろいろ、注意
----

- 過去ログをみよ
- I2Cで接続
- Adafruit_GFX.hとAdafruit_SSD1306.hをインストール
- 変更箇所

```c++

  //I2Cの初期化
  Wire.begin(D9,D10); //XIAO ESP32C6+SSD1306
  //Wire.begin(D10,D9); //XIAO ESP32C6+GROVE

```

結果
----

![o_coq873.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ec6679c1-1423-4c64-a8c6-932ae3894ec2.jpeg)


プログラム
----


```c++



//ssd1306_46_2_XIAO_ESP32C6_1


//ヘッダーファイル
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


//定義
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


//初期化
void setup() {

  //I2Cの初期化
  Wire.begin(D9,D10); //XIAO ESP32C6+SSD1306
  //Wire.begin(D10,D9); //XIAO ESP32C6+GROVE

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.clearDisplay();

  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(0, 10);

  //46を設定
  int tempval = 46;

  // 1行目に46を表示
  display.println(tempval);

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000); //1秒待つ

}//loop



```
個人的備忘録：CloudFormationのOutputsとは？不要な時と使うべき時の判断ポイントを整理してみた

## はじめに

CloudFormation テンプレートを作成する際に、「Outputs セクションは絶対に必要なのか？」という疑問を持つ方も多いと思います。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

この記事では、その疑問に答えるとともに、Outputs セクションの役割や、使うべきケースについて**個人の備忘録**としてまとめました。

## Outputs は必須？

結論から言うと、**Outputs セクションは必須ではありません**。

CloudFormation テンプレートを実行（スタック作成）する上で、Outputs がなくてもスタックの作成やリソースの動作には一切影響しません。

## 使うべきケースは？

Outputs セクションは、以下のような場面で便利です：

- CloudFront のドメイン名を後から AWS マネジメントコンソールで確認したい
- S3 バケット名やエンドポイント URL を外部のツールや他スタックに引き渡したい
- CloudFormation スタックをクロススタック参照する際に値を export したい

```yaml
Outputs:
  CloudFrontURL:
    Value: !GetAtt CloudFrontDistribution.DomainName
    Description: "CloudFront のドメイン名"
```

**参考文献**

https://dev.classmethod.jp/articles/cloudformation-tips-focused-on-refs/

## いらないなら削除してOK

Outputs セクションはあくまで**補助的な機能**です。不要であれば削除してまったく問題ありません。

特に開発中やテスト用のテンプレートでは、Outputs を省略してシンプルに保つのも良い選択です。

## まとめ

- Outputs セクションは CloudFormation の動作には不要
- 後から値を確認したいときや、他スタックと連携したい場合に便利
- 不要であれば削除しても OK（特に開発中や小規模構成）

***必要に応じて柔軟に使い分けてみてください！***
IntelのLinuxアプリケーションをRISC-Vでも動かしたい(戦略）

では、IntelのLinuxアプリケーションをRISC-Vにポートするときに使う戦略を考えていこう。

１，Intel Intrinsic Guideから、ポートするIntrinsic関数を選択する。

https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html

上のサイトより、ポートするIntrinsic関数を選択する。最初は副作用がないものが良いかもしれない。

2、選んだIntrinsic関数を使用したほんの小さなIntelで動くLinuxアプリケーションをC言語などで作成する。

副作用があるとテストなどが複雑になるので、最初は副作用のないものを選ぶ。

３，GCC、Intelのドキュメント、RISC-Vのドキュメント、Andes（RISC-Vのメーカー）のドキュメント、Linux on Power Porting Guideなどを読んで、選んだIntel Intrinsic関数をポートするためのRISC-V上で動くラップ構造を持つ移植ソースコードを作成する。

```c
extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__,__artificial__))
_mm_add_pd (__m128d __A, __m128d __B)
{
   return (__m128d) ((__v2df)__A + (__v2df)__B);
}
```

４，Intel Intrinsic関数とそれをRISC-Vにポートしたもののインプットとアウトプットのペアが同じであることを確認するためのテストフレームワークを作成する。

５，最初に作ったIntelで動くLinuxアプリケーションがRISC-Vにポートされ、RISC-Vで動くことを確認する。

６，すべてのIntel Intrinsic関数がポートされるまでこのプロセスを繰り返す。

７，世界のすべてのAWSやAzureのIntel Xeon　CPUがRISC-Vに変更される。エネルギー消費が抑えられ、CO2排出量が減る。

必要な条件がいくつかある。

１，Intel Intrinsic関数を使用しているLinuxアプリケーションのオリジナルのソースコードを変更してはならない。あくまでexternなどの使われたファイルを追加するか、GCCを改修して対処する。なぜなら、Intel Intrinsic関数を使用したLinuxアプリケーションはプロプライエタリやオープンソースを含めて大量にあり、すべてを変更してテストすることは現実的ではない。

２，振る舞いやインプットとアウトプットのペアはIntel Intrinsic関数とそれをRISC-Vにポートしたものが同じである必要がある。

３，Intel　Intrinsic関数とそれをRISC-Vにポートしたものでは、同じインプットなら同じ例外が起きる必要がある。

４，パフォーマンスはもちろん重要である。
SQLで行→列に変換！`kind`ごとの値を1行にまとめる方法【初心者向け】

# はじめに

こんにちは。  
**フルスタックエンジニア歴10年**、Webアプリを中心に、IoTやAI開発にも携わっています。  
要件定義などの上流工程から、実装・運用の下流工程まで幅広く対応し、  
常に新しい技術を追求しながら、効率的で使いやすいソリューションの提供を目指しています。

本記事は、自作のAIエージェントフレームワーク **PengentAI** によって自動生成された技術ノートです。  
実際の業務や学習の中で出てきた小さな疑問・課題を、AIと共に素早く解決し、ナレッジ化しています。

---

## 今回のテーマ：行→列に変換して1行にまとめたい！

SQLで、複数の行に分かれたデータを「列」にまとめて1行で扱いたいことってありませんか？

今回は、以下のようなテーブルデータを：

```csv
uid, kind, type
aaa, back, 1
bbb, side, 1
ccc, top,  1
```

このような形式に変換する方法をご紹介します：

```csv
back_uid, side_uid, top_uid, type
aaa      , bbb     , ccc    , 1
```

初心者でも実行できるように、MySQLを使ってステップごとに解説します！

---

## ステップ1：テーブルとデータを用意する

まずはテスト用のテーブルとデータを作成しましょう。

```sql
DROP TABLE IF EXISTS test_table;

CREATE TABLE test_table (
  uid VARCHAR(10),
  kind VARCHAR(10),
  type INT
);

INSERT INTO test_table (uid, kind, type) VALUES
  ('aaa', 'back', 1),
  ('bbb', 'side', 1),
  ('ccc', 'top', 1);
```

---

## ステップ2：行を列に変換するSQL

`kind` の値ごとに `uid` を列として取り出すために、`CASE` 文と `MAX()` 関数を組み合わせて使います。

```sql
SELECT
  MAX(CASE WHEN kind = 'back' THEN uid END) AS back_uid,
  MAX(CASE WHEN kind = 'side' THEN uid END) AS side_uid,
  MAX(CASE WHEN kind = 'top' THEN uid END) AS top_uid,
  type
FROM
  test_table
GROUP BY
  type;
```

---

## なぜ `MAX(CASE WHEN ...)` を使うの？

- `CASE WHEN kind = '...' THEN uid` で、条件に一致する値だけ取り出します。
- そのままだと NULL を含む複数行が返ってしまうため、`MAX()` で1つに絞ります（`kind` ごとに1つの uid 前提）。
- `GROUP BY type` で、`type` ごとに1レコードにまとめます。

---

## 応用：列の種類が増えたら？

`kind` の値が `front` や `bottom` など増えた場合でも、以下のように同じ形式で追加するだけです：

```sql
MAX(CASE WHEN kind = 'front' THEN uid END) AS front_uid,
MAX(CASE WHEN kind = 'bottom' THEN uid END) AS bottom_uid,
```

---

## おわりに

このような「行→列」の変換は、BIツールや集計レポートなどでよく使われる基本的なテクニックです。  
シンプルながら応用も効くので、ぜひ手元の環境で試してみてください！

---

> この記事は、自作のAIエージェントフレームワーク **PengentAI** によって提案・構成され、自動で出力されたナレッジ記事です。

Qiitaの「いいね」やフォローも励みになります！  
次回はさらに発展的なSQL Tipsや、AIを活用した自動化ノウハウも紹介していきます。
```
個人的備忘録：CloudFrontOriginAccessIdentityId が存在しない？CloudFormationエラーの原因と対処法

## はじめに

本記事では、AWS CloudFormation を用いて CloudFront ディストリビューションを作成する際に発生したエラー：

```
リソース CloudFrontDistribution は CREATE_FAILED 状態です
Requested attribute CloudFrontOriginAccessIdentityId does not exist in schema for AWS::CloudFront::CloudFrontOriginAccessIdentity
```

について、その原因と修正方法を**個人の備忘録**として記録しています。

## 書こうと思ったきっかけ

CloudFront + S3 の構成を CloudFormation でコード化していた際に、CloudFront の OAI（Origin Access Identity）を指定する部分でエラーが発生しました。

https://github.com/free-honda/honda-sr-office_20250323/tree/main/infra

エラー内容から、リソースの属性指定に誤りがあることが判明したため、備忘録として整理しました。

## エラーの原因

CloudFront の OAI に対して、以下のように属性を指定していたことが原因です：

```yaml
!Sub "origin-access-identity/cloudfront/${CloudFrontOAI.CloudFrontOriginAccessIdentityId}"
```

しかし、`AWS::CloudFront::CloudFrontOriginAccessIdentity` リソースには `CloudFrontOriginAccessIdentityId` という属性は存在しません。

## 正しい指定方法

CloudFormation では、CloudFront の `OriginAccessIdentity` に対して **論理ID** を指定するだけで CloudFormation が内部的に適切な形式に変換してくれます。以下のように修正します：

```yaml
S3OriginConfig:
  OriginAccessIdentity: !Sub "origin-access-identity/cloudfront/${CloudFrontOAI}"
```

## 修正後のテンプレート例（該当箇所）

```yaml
Origins:
  - Id: S3Origin
    DomainName: !GetAtt S3Bucket.RegionalDomainName
    S3OriginConfig:
      OriginAccessIdentity: !Sub "origin-access-identity/cloudfront/${CloudFrontOAI}"
```

## 補足

`AWS::CloudFront::CloudFrontOriginAccessIdentity` には以下の2つの属性があります：

- `S3CanonicalUserId`（バケットポリシーで使用）
- 実際の OAI ID（例: `E***********`） → CloudFormation からは直接取得不可

そのため、CloudFront 側では論理IDベースでの指定がベストプラクティスです。

## まとめ

CloudFormation で CloudFront OAI を指定する際は、リソースの論理IDを `${}` で埋め込む形で `!Sub` を使ってみてください！

:::note info
**NG：** `${CloudFrontOAI.CloudFrontOriginAccessIdentityId}`

**OK：** `${CloudFrontOAI}`
:::

エラーが出た際は、公式ドキュメントやスキーマに存在する属性かどうかも確認すると、解決への近道になります。
n.times.xxx の構文

## n.times.map
例：0から4までの数を２倍した配列を作る
```ruby
result = 5.times.map{ |i| i * 2 }
p result 
# [0, 2, 4, 6, 8]
```


## n.times.sum
例：0から9までの合計を求める
```ruby
sum = 10.times.sum{|i| i}
puts sum 
 #  45
```
cscの作法 その579

# 概要
cscの作法、調べてみた。
OpenRCF v2.8、見つけたので、windows11で、MSbuildしてみた。
練習問題やってみた。

# 練習問題
プリミティブを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a3ce28e5-674a-4597-a95d-366afc955802.png)

# サンプルコード

```
using System;
using System.Windows;
using OpenRCF;
using Vector = OpenRCF.Vector;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;

    class Traiangle {
		private float radius = 0.2f;
		public Vector Position = new Vector(3);
		public RotationMatrix Rotate = new RotationMatrix();
		public Color Color = new Color();
		public float SizeX = 0.5f,
			SizeY = 0.5f;
		public float Radius {
			get {
				return radius;
			}
			set {
				radius = value;
			}
		}
		public Traiangle(float sizeX = 0.5f, float sizeY = 0.5f) {
			SizeX = sizeX;
			SizeY = sizeY;
			Radius = sizeX;
		}
		private float[][] Vertex = new float[3][];
		private static class BaseVertex {
			public static float[][] Vertex = new float[3][];
			static BaseVertex() {
				Vertex[0] = new float[3] { -0.5f,  0.3f, 0 };
				Vertex[1] = new float[3] { -0.5f, -0.5f, 0 };
				Vertex[2] = new float[3] {  0.3f, -0.5f, 0 };
			}
		}
		public void Draw() {
			VertexUpdate();
			Color.EnableBodyColor();
			DrawVertex(PrimitiveType.Polygon);
		}
		private void DrawVertex(PrimitiveType primitiveType) {
			GL.Begin(primitiveType);
			GL.Normal3(Rotate[0, 2], Rotate[1, 2], Rotate[2, 2]);
			for (int i = 0; i < Vertex.GetLength(0); i++)
			{
				GL.Vertex3(Vertex[i]);
			}
			GL.End();
		}
		private void VertexUpdate() {
			float[] vector = new float[3];
			for (int i = 0; i < Vertex.GetLength(0); i++)
			{
				vector[0] = SizeX * BaseVertex.Vertex[i][0];
				vector[1] = SizeY * BaseVertex.Vertex[i][1];
				vector[2] = 0;
				Vertex[i] = Position.Plus(Rotate * vector);
			}
		}
	}

```

以上。
【AWS API Gateway Tips】カスタムドメインのAPIマッピング

# はじめに
AWS API Gatewayで、カスタムドメインを利用している場合の、APIマッピング方法を紹介する。複数バージョンを管理する場合などに有用。

# 前提条件
* API Gateway
  * API構築済み
    * 本番用ステージ```prod```構築済み
    * 開発用ステージ```dev```構築済み 
  * ドメイン取得済みで、カスタムドメイン名を設定済み

# 方法

APIマッピングとは、カスタムドメイン名でのアクセスにおいて、どのAPIにマッピングするかの設定である。

詳細な手順は、[こちらの記事](https://dev.classmethod.jp/articles/api-gateway-with-custom-domain/)を参照。

ここでは、APIに設定したステージとのマッピングについて、上記記事からAWSでの設定UIが変更されているので解説する。

APIマッピングを設定したいカスタムドメイン名を選択し、APIマッピングの設定ページに移動する。

「APIマッピングを設定」を押して、APIマッピングを設定する。

ここでは、APIに、本番用ステージ```prod```と開発用ステージ```dev```が構築済みであるとする。今回は2つのAPIマッピングを設定する。カスタムドメイン名から、これらのステージにアクセスできるようにマッピング設定すると以下のように設定できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/4411fdb7-e96c-4a46-80d9-8f82e36c2049.png)

* API
  * カスタムドメイン名からアクセスしたい構築済みAPIを選択する
* ステージ
  * APIのステージを選択する（本番用、開発用など）
* パス（オプション）
  * カスタムドメインに続くパスを設定する

設定が完了したら「保存」ボタンを押して終了。以下のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/4d47360e-5f4c-4fa0-98f4-942da6792df0.png)

APIへアクセスするためのアドレスは、つまりAPIエンドポイントは以下のようになる。

| ステージ | パス | APIエンドポイント|
|:-|:-|:-|
|prod|-|https://{your.custom.domain}/{api-name}|
|dev|dev|https://{your.custom.domain}/dev/{api-name}|

本番用ステージ```prod```では、マッピングでパスを設定していないので、カスタムドメインに、REST APIで設定したAPI名がそのまま続く形となる。
一方、開発用ステージ```dev```では、マッピングでパスを```dev```に設定したので、カスタムドメインの後に```dev```が入り、その後に、REST APIで設定したAPI名が続く形となる。

# まとめ

AWS API Gatewayで、カスタムドメインを利用している場合の、APIマッピング方法を紹介した。複数バージョンを管理する場合などに有用。

# 参考

https://dev.classmethod.jp/articles/api-gateway-with-custom-domain/
Denoで@discordjs/opusを使ってprism-mediaをimportする

# 経緯
Denoを使い，DiscordのVCを横流しにするBotを作っていた．
[Mori-chan](https://qiita.com/Mori-chan/items/e9ced87c0d68a9eb2a9a)氏の記事を参考にprism-mediaでVCのデータをOpusからRawデータにDecodeしようとしたところ，
```
error: Uncaught (in promise) Error: Cannot find module 'C:\Users\kazum\Desktop\discord_deno\node_modules\.deno\@discordjs+opus@0.10.0\node_modules\@discordjs\opus\prebuild\node-v108-napi-v3-win32-x64-unknown-unknown\opus.node
```
とimport関連のエラーが出た．
denoから
```
    hint: Add `"nodeModulesDir": "auto" option to `deno.json`, and then run 
          `deno install --allow-scripts=npm:<package> --entrypoint <script>` to setup `node_modules` directory.
```
とHintを提示されて試してもうまく解決できなかった．

# 解決法
Debugを進めていくと，`@discordjs/opus`のdynamic requireでエラーが出ていた．
```javascript:index.js
const { resolve } = require('node:path');
const { find } = require('@discordjs/node-pre-gyp');

// eslint-disable-next-line import/no-dynamic-require
module.exports = require(find(resolve(__dirname, '..', 'package.json')));
```
prebuildはbuild時に生成される([GitHub](https://github.com/discordjs/opus/blob/679ff3f58e6804b80becc166c7214deb2ca026e2/.github/workflows/build.yml#L37d))ので，`require`の引数に与えられている`Path`をDebugして，そのディレクトリ上で
```bash
npm run build
```
を実行したところ，無事prebuildのファイルが生成された．

# まとめ
Denoはlintとかfmtとかがコンパクトに収まっていてとても使いやすいけど，npm対応はまだ難しいのかな...
OpenAIのo3を試してみる

出たばかりのo3の評価のために、以下の文章を翻訳させてさらに論考を加えさせてみました

![20250417_034541.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/aae19b38-7e70-41ae-8c1d-4c865494d1f1.jpeg)


### 1. 日本語訳（原文の意図をできる限り正確かつ読みやすい形で再構成）

> **OpenAI の使命**は **AGI（汎用人工知能）** が人類すべての利益になることを確実にすることです。  
> その使命を追求するため、私たちは高度な能力をもつ AI システムを**安全に開発し、展開**することに取り組んでいます。これらのシステムは大きな恩恵を生む一方で、同時に新たなリスクももたらします。私たちは**開発のあらゆる段階で安全性を組み込み**、学びを共有することで、社会がフロンティア AI による新しいリスクを適切に管理できるようにします。  

> **Preparedness Framework（備えの枠組み）**は、**重大な被害を引き起こし得るフロンティア能力**を追跡し、準備するための OpenAI のアプローチです。現在、この枠組みでは 3 つの「Tracked Categories（追跡カテゴリー）」に焦点を当てています。  
> 
> • **生物学・化学分野の能力** – 新たな発見や治療法をもたらす一方で、バイオ・ケミカル兵器の作成や利用の障壁を下げてしまう。  
> • **サイバーセキュリティ分野の能力** – 脆弱なシステムを保護する助けになる一方、大規模なサイバー攻撃や脆弱性悪用の新しいリスクを生む。  
> • **AI 自己改善能力** – 有用な機能をより速く解禁する一方で、人間が AI システムを制御する上で新たな課題を引き起こし得る。 citeturn0search0

---

### 2. 今後の AI 発展に関する論考

#### 2‑1. フロンティア能力の「三本柱」は何を示唆するか
1. **Bio/Chem リスク**  
   モデルの高度化に伴い、未熟な研究者でも有害な病原体や化学剤を設計できる「参照テンプレート」として AI を悪用する懸念が増大する。OpenAI が「素人でも武器を作れるライン」を検出し閾値管理を行う方向に踏み切ったのは、2010 年代後半から議論されてきた「デュアルユース」問題に対する現実的な防波堤である。国家レベルだけでなく、非国家主体・個人ハッカーまでもがアクセス可能という“権力の非対称化”が最大のリスクになる。  

2. **Cyber リスク**  
   攻撃側にとってのコスト削減・自動化・質的向上を同時にもたらす。特に Large‑Scale Social Engineering、Zero‑Day 生成、AI メイドマルウェアの自律アップデートなどが、従来の「人海戦術 → ボットネット → AI 主導」の第三段階へ進化する可能性が指摘される。OpenAI は“防御側での利用”もトラッキング対象に含めることで、攻守の“二面性”評価を制度に組み込んだ点が特徴的である。  

3. **Self‑Improvement リスク**  
   もっとも抽象的だが、長期的インパクトは最大級。モデル自身が研究開発や最適化パイプラインを高速化し、「連続的能力跳躍（iterative capability gain）」を引き起こすシナリオは、制御理論・社会制度の両面で未踏領域だ。既に「研究者 1 人あたりミッドキャリア開発者を無限雇用するのと同等」というベンチマークが提案されている citeturn0search5。  

#### 2‑2. 技術的トレンド
| 時期 | 主なブレイクスルー | 予想される追加リスク | 必要なガバナンス |
|------|--------------------|----------------------|------------------|
| 2025‑2027 | マルチモーダル AGI プロトタイプ、自己 RLHF・自己修正ループ | 複合ドメイン攻撃パッケージの自動生成 | フロンティアモデルの**ケイパビリティ等級制度**と第三者監査 |
| 2028‑2030 | 自動科学研究エージェント、分散 AI ワークフォース | 知財・データオリエンタルな「情報集中リスク」 | **国際的モデル登録簿**＋API 認証レイヤ |
| 2030 以降 | 部分的自律意思決定 AI（経済・安全保障） | システム同士の**目的関数競合**と予期せぬ最適化 | **多層的オーバーライド機構**と合意形成 AI |

#### 2‑3. 競争ダイナミクスと「安全速度」
最新の報道によれば、OpenAI は「競合他社が高リスクモデルを無警戒に出す場合、安全プロトコルを柔軟化しうる」との余白を残す文言を追加した citeturn0news9。  
これは **安全・競争のジレンマ** を公式に認めたものでもある。今後は、

* **準拠規格の国際標準化**（例：ISO/IEC JTC 42 における“Frontier‑AI Safety Standard”）
* **“最小限公開”という第三の選択肢**  
  （完全非公開 vs. 完全オープンの二分法を避け、API 公開＋厳格な使用ログ監査＋階層的権限管理）

が安全速度を担保する要となるだろう。

#### 2‑4. 日本の立ち位置と提言
* **基礎研究の開放性**と**危険能力の非拡散**を両立させる枠組み――特にバイオ領域では、内閣府の生物盾技術プログラムと連携し、API レベルで“バイオ危険度評価モジュール”を義務化。  
* **産官学連携でのシミュレーション演習**（レッドチーム演習 + 政策意思決定訓練）を定期開催し、人材・プロセス・技術の統合的備えを進める。  
* **AI‐AI 監査**の国産実装：大規模モデルによる“ハイロード・メタ監査”を用いた継続的自己査定フレームを研究開発し、外資系プラットフォームへの要求交渉力を確保する。

---

### 3. 結論
Preparedness Framework が示す 3 つの追跡カテゴリーは、単なるリスク一覧ではなく **「未来の AI 競争地図」** そのものだ。  
安全性をイノベーションの**制約条件**ではなく**設計要件**として組み込み、**自己改善・自己規制・多主体協調**を同時に実装できるかが、次世代 AGI の成否を左右する。日本を含むグローバルコミュニティは、技術のスピードと安全速度のバランスを取る「追い越し車線の限速標準」を策定する局面に入っている。
競プロ日記#25/04/16

# AtCoder
## [ABC156_B-Digits](https://atcoder.jp/contests/abc156/tasks/abc156_b)
- 記数法の問題。カウンタを持たせたwhileでpow(N,カウンタ)をしたのだが微妙に答えが合わなかった。
- 解説によるとNが0になるまでNをKで割った時の商で置き換える
```
int main() {
    int N,K;
    cin >> N >> K;

    int ans = 0;
    int total = 0;
    
    while(N > 0){
        N /= K;
        ans++;
    }
    cout << ans << endl;
}
```

## [ABC156_C-Rally](https://atcoder.jp/contests/abc156/tasks/abc156_c)

- X1~XNの間から探すために昇順でソートしてその間からPを探す。
- 今回はあくまで最小値を探すのでmin変数に対して0で初期化すると0が常に答えになってしまうことに気を付ける（INT_MAXを使った）
- あとはN == 1やN > 1だけどXが全て同じ値の時は上手くfor文を回せなくて詰むので例外パターンとして列挙するのを忘れない。
```
int main() {
    int N;
    cin >> N;

    vector<int> A(N);
    for (int i = 0; i < N; i++) {
        cin >> A[i];
    }
    
    int min = INT_MAX;
    sort(A.begin(), A.end());
    if (N == 1) {
        cout << 0 << endl;
        return 0;
    }
    if (A[0] == A[N - 1]) {
        cout << 0 << endl;
        return 0;
    }
    for (int i = A[0]; i < A[N - 1]; i++) {
        int sum = 0;
        for (int j = 0; j < N; j++) {
            
            sum += (i - A[j]) * (i - A[j]); 
            
        }
        if (min > sum){
            min = sum;
        }
    
    }

    cout << min << endl;
        
}
```

# アルゴ式-[ボールと箱 (2)](https://algo-method.com/tasks/739)
- 階乗を実装すればいい。
- 階乗も含めた順列の関数を実装。
```
// nPmの順列(階乗や0!にも対応)
long long funcPermutation(int N,int M){
    if (N == 0 & M == 0){
        return 1;
    }
    long long ans = 1;
    for (int i = 0;i < M;i++){
        
        ans = ans * (N - i);
        
    }
    return ans;
}
```

# アルゴ式-[駅と駅の距離](https://algo-method.com/tasks/585WM5q)
- 累積和の応用
```
int N;
cin >> N;
vector<int> d(N-1)
for (int = 0;i < N - 1;i++){
    cin >> d[i];
}

int Q;
cin >> Q;

vector<int> acc(N);
for (int i=0; i<N-1; ++i) {
    acc[i+1] = acc[i] + d[i];
}
for (int i=0; i<Q; ++i) {
    int l, r;
    cin >> l >> r;
    int result = acc[r] - acc[l];
    cout << result << endl;
}
```
VS Code の GitHub Copilot エージェントモードで様々なモデル・ローカルLLMなどを使える「Bring your own language model key」

## はじめに

現状、プレビュー版として「GitHub Copilot Free」と「GitHub Copilot Pro」のユーザー向けに提供されている「Bring your own language model key」の話です。

### 公式の説明

公式の説明は、以下に書かれています。

●AI language models in VS Code
　https://code.visualstudio.com/docs/copilot/language-models#_bring-your-own-language-model-key

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3468287b-5a00-4939-a9e6-a5e31a542aa2.png)


これを使うと、VS Code の GitHub Copilot エージェントモードで、デフォルトで提供されているモデル以外も扱えるようです。

今回、内容を少し見てみました。


## Bring your own language model key

### VS Code で確認してみる

VS Code で「Bring your own language model key」の設定を確認してみます。

GitHub Copilot エージェントモードで、利用するモデルのメニューの中の「Manage Models」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/666280c5-4489-44b2-a3fe-39a10141a643.png)

#### プロバイダーの選択

そうすると、画面上部に以下の選択肢が出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3d4a75ff-d040-4b9b-9fb9-e9005ea8ad2d.png)

#### APIキーの入力

例えば、Gemini・OpenAI を選ぶと、さらに以下の入力画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ba641b55-2d5b-4326-9eb0-302fb393133f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1ae7afaa-a587-400d-9369-1d50e41e56bc.png)


#### モデルの選択

Gemini・OpenAI を選んだ後に APIキーを入力すると、それぞれ以下のモデル設定の画面が出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b3140a4f-14bd-43ff-9fc1-ce15e10e3fc1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a4a34d57-de33-43f4-a0cc-fd0c08c48fa0.png)

一番下に表示されている「Add custom model」という選択肢も気になるところです。


デフォルトで用意されているもの以外で、モデルの選択肢が増えるのはありがたいです。あと、デフォルト以外のモデルで、無料枠があるものが使えそうなので、それを試してみたいところです。


### ローカルLLM

ローカルLLM も使えるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/653cd052-4fce-4292-85c4-bcfcd3d01301.png)

このあたりも試してみたいところです。


## 【追記】 余談

記事を公開した直後、こんな話が

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f3b9bc35-c0ef-4e18-b2bb-f0f371eeb840.png)


https://x.com/OpenAI/status/1912549344978645199

https://x.com/github/status/1912551942376600041

●OpenAI o3 and o4-mini are now available in public preview for GitHub Copilot and GitHub Models - GitHub Changelog
　https://github.blog/changelog/2025-04-16-openai-o3-and-o4-mini-are-now-available-in-public-preview-for-github-copilot-and-github-models/


新しく追加されたモデルも、試してみたいところです。
Geminiでレイピアを使う魔法少女を描いてみた。

# 概要

Geminiでレイピアを使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りです。

```
炎のレイピアを使う魔法少女を描いてみてください。
```

![炎のレイピアを使う魔法少女_20250417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/bc809905-f2f5-4c8f-b64c-773098a8dc82.png)

```
氷のレイピアを使う魔法少女を描いてみてください。
```

![氷のレイピアを使う魔法少女_20250417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/10c28221-b64c-4707-81e3-05d2f2c45e49.png)


```
電撃のレイピアを使う魔法少女を描いてみてください。
```

![電撃のレイピアを使う魔法少女_20250417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/a569a8df-c857-4607-b0c7-9bd13f136aef.png)

# まとめ

炎の子がいいかも。
何かの役に立てばと。
作ったものの記録なさすぎ問題とqiitaによるその解決に向けて

# 経緯と概略
この記事は著者がどういった分野に興味があるか、何をしてきたかを一覧できるようなものになる(予定)。

学部を通して4年もﾊﾟｿｺﾝｶﾀｶﾀしてるのにポートフォリオになりうるものがない！困った！！就活にも使えねぇ！！
ついでに普段自分が何かしらコーディングしたときに何を参考にして、何を考え、どう実装したかをまとめる習慣をつけるべき。ついでに未完成のプロジェクトの管理もしていきたい。

なので、今まで書いたものについてをこれから書いていくであろうものとあわせてまとめ始めることにした。
この記事はその手始めに概略だけまとめていってあとから個別の記事が書けるようにするためのものになる。
(要望調査も兼ねる)

半分くらいはtodoリストかブログの、いわゆる良くないqiita記事だがMDに慣れる意味もあるのでどうか見逃してほしい。記事は書き上がり次第このページにリンクしていく予定。

# 過去に完成させたもの
ここに箇条書きしたものは実用できているものなので比較的書きやすそう。覚えているうちに早く書くべし。
概略だけ書き連ねているがそのうち個別記事にしていく。

- keyball44用のファームウェア
    - kamidai氏のものから改変している
    - トラックボールを矢印キーとして扱えるようにした
    - qmkなどで各方向のキーをプログラムし直せるようにする展望がある
- blender用のDinputデバイスの軸による視点操作アドオン
    - タイトルがすべてのアドオン
    - pygameのI/Oを利用
        - 内蔵のpythonにpipで入れているので非エンジニアには導入するのが難しいかも？
    - ワークスペース切り替えにより動作が停止する、致命的な問題がある
        - これで完成っていうのは怪しいかも……
        - これの修正で大部分の処理の順番を入れ替えないといけない気がして放棄した
    - 上記の修正に加え、シフトボタンや他のショートカットをblender内で割当可能にするまでしないと公開まで行けないかも
- 卒論で学習したpytorch関連
    - これは公開するかどうかは少し怪しい
    - 身バレもそうだし、正直もう触りたくない
    - 詰まった要素別のみの公開とし、全体については投稿しない手もある
        - いうてもほとんどチュートリアルに該当するだろうしやっぱり記事にならないかも
- obsidianの環境整備とか
    - これはエンジニアっぽいことしてないので記事にできるか怪しい


# これから作りうるもの
喜ばしいことに3D系の研究室に入れたのでそれ系が多くなるかも。
現段階で取り掛かっていなくても興味あることもここにまとめる。
- OpenGL関連
    - 環境構築 -完了
    - チュートリアル(learnOpenGL)を走る -始まった
    - 躓いたところの解説
    - なんか書いたら都度記事にするかも
- 研究室内外で読んだ論文の論文読み
    - わかりやすさの観点からパワポ以外の形でも残すべき
    - OpenGLと一部かぶるかもだが理論の部分の解説
- 自作キーボード設計
    - 完全に趣味のもの
    - keyballやcharybdisライクに、ポインティングデバイス+左右分割+無線でなにかしたい
- Wallpaper Engine向けのUE or Unityプロジェクト
    - そもそもできるのか？
    - せいぜいmp4までしか対応してないかもだが、その調査結果を記事にするつもり










# 長すぎる方の経緯
<details><summary>こっちから書き始めたけど正直全部ノイズ</summary>

## 記録がなくて困る
これまでのプログラミング経験を、振り返ってみれば外部に公開できるような状態のプロジェクトが全然存在していないことに気づいた。

どう公開できないかというと、githubの先達のつぎはぎをしておきながらそのリポジトリを覚えていなかったり、そもそもgithubの仕組みに疎くforkなりcloneなりすればいいところをソースをそのままctrl+C/Vしてきたりしていたのが山程ある。

自分の環境で動けばよかろうで公開することを一切考えてないプロジェクトなんてこんなものではあるのだろうが、流石に勿体ない。

更には作ってる途中で問題にブチ当たって放置しているものもあり、これらの整理をしようにも何をしていたか忘れ始めている。



## 就活に向けて
というか、キャリア形成/就活においてポートフォリオは本当に重要そうだという偏見がある。
修士1年となった現段階で就活の準備が一切できていない焦燥感もある。よっこらせと準備を始めるのは遅すぎるかもしれないが、やらないよりは遥かにマシだろう。


今用意すべきだろう、ポートフォリオになりうる作ったものまとめと、そこで自らが何を参考にし、何を考えていたかを。


</details>
「Codeの別のインスタンスが既に管理者として実行されています。」を表示させない

# 解決したいこと

WindowsでVSCodeを管理者として実行している最中に、エクスプローラからいつもVSCodeで開いているファイルをダブルクリックすると、こんなダイアログが出てきます。

![Codeの別のインスタンスが既に管理者として実行されています。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/71dfc74d-b176-4de7-983a-e531d4da6f39.png)

良いから開かせてくれよ！

# 解決策

これは、常に管理者としてVSCodeを実行するようにすることで解決できました。

1. `Code.exe`の場所を探して左クリック
1. プロパティ
1. 互換性
1. 「管理者としてこのプログラムを実行する」にチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/a82dfc01-2e22-4cb9-9414-48a78ad4d77c.png)
アラフォー未経験でも採用されたい

試しに記事を書いてみる。
Pythonと基本情報技術者試験の勉強はしてる。ZEN StudyとProgateで興味のあるコースは一通りこなしてみた。
未経験なので面接での説得力を持つために、資格取得とポートフォリオの作成が必要だろう。
やってみる。
Fortranをめぐる言説（discourse）について

# Fortranをめぐる言説（discourse）について

現在の計算機科学（Computer Science、以下CS）の主流的な言説（discourse）において、Fortranや、それが長らく担ってきた数値計算の領域は、しばしば周縁化（marginalized）された位置に置かれています。

## 弁証法的進歩史観と優生思想

特にコンピュータに強い関心を持つ学生ほど、ネットやメディアにあふれる言説や語り（narrative）の影響を強く受けがちです。
「プログラミングのパラダイムは時間とともに進化し、新しい優れたプログラミング言語が古い劣った言語を駆逐する」──こうした信念は、弁証法的な進歩史観と、そこに接続された優生思想の無意識の反映と見ることができます。

## 周縁化という構造的な暴力

その結果、Fortranや数値計算を「古い」「すでに滅んだ」と断じ、周縁化に無自覚に加担してしまう事態が生じます。この構造は、植民者が先住民の文化や伝統を意図的に軽視する状況と類似しており、無意識的であっても、「進歩」の名のもとに、ある知的伝統を消し去る暴力的な運動に加担していることになります。

## CSの教育構造と連続量の排除

現代のCS教育では、離散数学を基盤とした代数的構造やアルゴリズム設計が中心に据えられており、実数・複素数などの連続量や、それを扱う数値解析は「周辺的」な位置に追いやられています。事実、数値解析は多くのカリキュラムにおいて必修ですらありません。

## 浮動小数点と例外領域

しかし、計算機上では連続量は浮動小数点数として近似的に表現され、その振る舞いはCSの理論が前提とする離散的整合性とは本質的に異なります。そして、CSの方法論がそのままではうまく機能しない**例外的な領域**に、理工学において最も重要な現象がしばしば発生します。

*例：数学的・数値的に不安定だったり発散するところで、共鳴・異常分散・相転移などの現象*

## 科学とソフトウェアの文化の違い

ソフトウェア分野では、利用者を増やすことがその存続に直結するため、言説や語りが**政治的・興行的**になりやすい傾向があります。これは、再現性や蓄積を重視する**自然科学の文化**とは構造的に異なる点です。

## 結論：言説の空間に自覚的であること

このような社会構造を理解せずに、安易に「古い言語を排除すべき」「Fortranは就職に役立たない」などと言って切り捨ててしまうのは、実は言説に流された非理性的視点であることに注意すべきです。

> **どのような語りが何を正当化し、何を忘却してきたのか──**  
> **自分は今どのような言説の空間にいるのか、よく考えてみる必要があると思います。**
RTX1210下でmitmproxyが使えないときの対応

# 1. 事象
メインルータをNEC製「PA-WX3600HP」からYAMAHA製「RTX1210」に変更後，mitmproxyが使えない。

# 2. 対応策
configを出力後，以下を消す。
なお，セキュリティ低下に繋がるので終わったら元に戻すこと。

ip filter 400003 reject 192.168.100.0/24 * * * *
ip filter 400013 reject * 192.168.100.0/24 * * *
（デフォルトなら上記になっている）

# 3. 原因
ローカルネットワーク内の端末同士（192.168.100.x同士）の通信をブロックするように設定されている。
対応策で消した部分は「192.168.100.0～192.168.100.24宛てのアクセス（in outそれぞれ）をブロックする」という内容になっている。
【C言語入門】合計と平均を求める方法をわかりやすく解説！

# C言語で合計と平均を求める方法と型変換の使い方（intとdouble）

C言語では、数値の合計や平均を計算するのに `int` と `double` を使います。今回は、その方法をわかりやすく解説します。

## 合計と平均の計算方法

まず、整数型 `int` を使って合計と平均を計算する方法を見ていきましょう。

### 合計を計算する

```c
#include <stdio.h>

int main() {
    int a = 10, b = 20, c = 30;
    int sum = a + b + c;
    printf("合計: %d\n", sum);
    return 0;
}
```

**解説**  
a, b, c の値を足して sum に代入しています。  
`%d` は整数の出力に使います。

### 平均を計算する

```c
#include <stdio.h>

int main() {
    int a = 10, b = 20, c = 30;
    int sum = a + b + c;
    double average = sum / 3.0;  // 3.0 として double にキャストする
    printf("平均: %f\n", average);
    return 0;
}
```

**解説**  
合計 sum を 3.0 で割ることで、小数点以下の計算が可能になります。  
double 型にキャストすることで、整数型の割り算で失われる小数を保ったまま計算できます。

---

## intとdoubleの型変換（キャスト）

C言語では、**異なる型（intとdoubleなど）を混ぜて計算する場合、意図的に型変換（キャスト）**をすることで、より正確な結果が得られます。

### キャスト（型変換）のやり方

```c
int a = 5, b = 2;
double result;

result = (double)a / b;
printf("結果: %f\n", result); // → 結果: 2.500000
```

**解説**  
- a は int 型 → (double)a で 5.0 に変換  
- 5.0 / 2 の計算になるので、結果も double 型になって小数点以下も正しく表示される

#### キャストしなかった場合

```c
result = a / b;
printf("結果: %f\n", result); // → 結果: 2.000000
```

- a / b は整数同士の割り算になるため、2.5 ではなく 2 になってしまう
- result は double 型でも、計算の時点で小数が失われている！

---

## ポイントまとめ

- `int / int` → 結果はint（小数点以下は切り捨て）
- 小数を出したいときは、少なくともどちらか一方をdoubleにキャストする！

---

## 実際に使ってみよう：合計と平均を計算するプログラム

実際に3つの数値を使って合計と平均を計算してみましょう。

```c
#include <stdio.h>

int main() {
    int a, b, c;
    printf("3つの整数を入力してください（例：10 20 30）: ");
    if (scanf("%d %d %d", &a, &b, &c) != 3) {
        printf("入力エラーです。\n");
        return 1;
    }

    int sum = a + b + c;
    double average = sum / 3.0;

    printf("合計: %d\n", sum);
    printf("平均: %f\n", average);

    return 0;
}
```

### 入力例と出力例

**入力例 1**  
10 20 30

**出力例 1**  
合計: 60  
平均: 20.000000

**入力例 2（入力エラー）**  
10 20 abc

**出力例 2**  
入力エラーです。

---

:::note info
## まとめ

- int 型は整数を扱うときに使用し、double 型は小数を扱うときに使用します。
- 合計や平均を求めるとき、型に注意して適切にキャストを行うことが大切です。
- int 型のまま計算すると小数が切り捨てられてしまうので、少なくとも一方を double にキャストして計算しましょう。

この基本を押さえることで、合計と平均の計算だけでなく、さまざまな計算が正確に行えるようになります！
:::
---
:::note warn
## 注意点

- 整数同士の割り算（int / int）は必ず小数点以下が切り捨てられます。小数点以下も必要な場合は、必ずどちらか一方を`double`型にキャストしましょう。
- `scanf`での入力時、想定外の値（例：文字列や小数点付きの数値）を入力すると、正しく読み取れずエラーになります。入力値の検証やエラー処理をしっかり行いましょう。
- `printf`で`%f`を使う場合、対応する変数は`double`型である必要があります。`int`型や`float`型をそのまま渡すと予期しない動作になることがあります。
- 計算結果を`int`型の変数に代入すると、小数点以下は自動的に切り捨てられます。平均値など小数が必要な場合は`double`型を使いましょう。

---
こんにちはマイクラを自作MODで楽しむ系vliberです！

◆自己紹介◆
こんにちは、あかはら。と申します🦎
世界でただひとり（たぶん）のイモリVTuberです。

TikTokでMinecraftを配信しながら、自分で作ったMODを使って、
毎日ちょっと変でちょっと奇跡っぽいことを起こしています。

MODは全部**Java＋Forge（1.20.6）**で開発しています。
視聴者からのコメントに反応して、配信中にコードを書くこともあります。

◆配信媒体
・メイン配信(TIKTOK)：https://www.tiktok.com/@akahara_genious
・通常の連絡：https://x.com/akaponpon440/

◆開発環境
Minecraft バージョン：1.20.6

Forge：1.20.6-forge-50.1.0

開発言語：Java（vscode → IntelliJ IDEA移行済）

モデリング：Blockbench

ビルド：Gradle＋自動ビルド用PowerShellスクリプト

動作確認：サブPC（家庭内）、MOD統合配信対応済、 StreamToEarnにてサーバー実行およびコメント取得

◆自作MODの一部紹介（変で奇跡なやつ）
🔥【火の斧MOD】
斧を空振りすると、巨大な火の玉が前方に飛んでいきます。
よく自爆する、熱い

🐔【卵MOD】
鶏が沸きます
たまにアレイが沸きます
爆発するので、頑張るとMOBが倒せます

🦎【ウーパールーパーMOD】
ダメージを受けるとウーパールーパーが助けに来ます
地上だとそのまま星になります。

✍️あとがき
今後は、MOD開発の裏側や導入方法の記事も順次アップ予定です。
「このMOD作りたい」「一緒にふざけたい」という人も大歓迎！
エンジニアが簿記３級受けてきた話

# 背景
次のプロジェクトが商業関係のソフトウェアということで、取得してくるように指示がありました。
高校生の時に全商受けて落ちたことがあり、実務は、個人事業主の頃に弥生会計を触っていた程度です。
応用情報でもストラテジ分野で出題があるので、そちらの対策にもなるかなと思いました。

# CBT方式
現在は、基本情報と同じくCBT方式になっており、CPAラーニングというサイトで高品質な教材を無料で利用可能です。
このレベルの資格は２週間で取れると思ったので、２週間後に申し込み。遠方の試験地で予約して、気分を盛り上げました。

# 勉強内容
### １週間目
+ ダイソーで300円の電卓購入
+ CPAラーニングの動画（約15時間）を１周視聴（半分以上寝ながら）
+ 練習問題は動画を止めてすべて解答、わからなかったらすぐ答え見る
+ 間違えたら見直し、ChatGPTに相談
### ２週間目
+ 模擬試験を３回分
+ 間違えたところはできるまでやり直し
+ 寝落ちした動画を１〜２時間、再視聴
+ 試験前日の夜は、３０分ほど復習

# 試験当日
試験前に電車の中で２０分復習
第１問、仕訳は自信ありましたが、意外と間違いが多かったです。
第２問、補助簿への記入をほとんど覚えておらず、後回しにして部分点のみ獲得。
第３問、残高試算表の貸借がまったく合いませんでした。
切手が租税公課なのか、通信費なのか、５分以上悩み、最終的に通信費にしておきました。
結果はギリギリ合格でした。

# 感想
会社でも勉強時間はもらいましたが、エンジニアに直接関係ない周辺知識を勉強するのは正直テンション低かったです。試験を意識して電卓を使い、手書きで仕訳するのも苦痛で仕方ありませんでした。

一方で、簿記は「完成された学問」とも呼ばれているそうで、プログラミングしているような心地よさがありました。CPAラーニングの動画はかなり長く、１つ１つ丁寧な解説なので人によっては冗長に感じるかもしれませんが、講師の方がいい人柄でして、簿記に慣れ親しむという観点では全部見てよかったと思います。ちょっとしたワンポイントアドバイスが役に立ちました。
Web系とSIerで違いを感じたこと

## Why
「Web系」と「SIer」は同じIT企業でも対照的としてよく比較されがちですが、存在意義は違うものの、現場目線でどう違うのかは生の声を聞かないと分からない気がします。

実際に私もSIer→Web系に転職してカルチャーショックを受けました。

企業選びでは、仕事内容やキャリアだけでなく、会社の雰囲気や企業文化が自分に合っているかどうかも重要ですが、体験しないとわからないですよね。

私が感じた「Web系」と「SIer」の違いを忘れないうちに書きます。

裏を取ったわけではないのであくまで個人の感想として読んでください。
(必ずしも全ての企業がそうではなくて偏見が入ります。主語が大きくなることはありますが、あくまで個人の意見として捉えてください)

## Who
- 金融系SIerで6年勤めた後、Web系に転職して2年目
- 職種は開発兼SRE

## WHAT
どこが違うのかWeb系の目線で書きますが、SIerを否定するつもりは全くないです。

### 年功序列ではない
SIerは殆どが年功序列です。これに対して比較的新しいWeb系は年齢によって年収は決まらない傾向にあります。

これはNewsPicksの記事でも取り上げられていて、データで示されてるので傾向としては合っていると思います。

https://newspicks.com/news/14005592/body/?invoker=np_urlshare_uid11013128&utm_campaign=np_urlshare&utm_medium=urlshare&utm_source=newspicks

とにかく成果を出してキャリアを描きたい人にとっては、Web系が向いていると思います。

逆に年収を上げたいとなると年齢に関係なく成果を求められるので、仕事とプライベートを完全に切り離したい人が長く働くのは難しいかもしれません。

### チャンスを与えてくれる
SIerに比べると良くも悪くも代謝が良いです。
向上心のある人が多いというのもあるかもしれないですが、退職に対してとても寛容さを感じます。

私がSIerを退職したときは、引き継ぎをちゃんとしてくれという圧しか感じられず、マイナスな印象を持たれていました。

話が逸れましたが、やめる人も多いのでチャンスが回ってくるのが早いです。

それだけでなく、SIerは仕方ないことですが人の成長よりも稼働率に目を向けがちな印象です。

若いうちに難易度の高い仕事や役割を与えてもらって、爆速で経験を積みたいという人には良いかもしれません。

下積みをちゃんと経験してから着々と成果を上げる人にはSIerが向いてるかもしれません。


### チャレンジングなことができる
SIerは受注開発がメインなので保守的な企業が多いのではないでしょうか。

客先システムだから障害は絶対に起こせないという守りの姿勢から入るのは仕方ないです。

Web系は自社サービス開発ができるので、意思決定者さえ納得させたらモダンなアーキテクチャえお比較的取り入れやすいです。

攻めたシステムは、サービス成長に欠かせないことを理解してもらいやすいです。事業とシステム開発の距離が近いことがそうさせているのだと思います。

### アウトプットが多い
成果主義という文化がそうさせているのかもですが、社内でのLTやナレッジ共有がとても盛んに広範囲で行われてます。

ただ、こちらに関しては前職が単純に少なかっただけな気がしています...

Web系・SIerに関係なく、エンジニアの技術力を強みにしている企業は、外部イベントだけでなく、きっと社内でのナレッジ横展開やLTは盛んに行われているでしょう。

このアウトプット文化はとても好きで、部門横断でも情報交換されるので、インプットの量も増えますし、自らがアウトプットする場としても活用できるので、知識量を増やす良いサイクルが回っています。

### 風通しの良さ
これも企業によりますね

ただ、なんとなく年功序列じゃないことが風通しを良くしていると思ってます。

年齢に関係なく実力で役割が決まるので、忖度せずに意見を言い合える本当の意味の風通しの良さがあります。

## おわり
最後の方はWeb系とSIerの比較では無くなりましたが、、特徴が分かれるのは確かだと思います。

何かの参考になれば嬉しいです。
DuckDuckGoのMCPサーバーをDockerで立ち上げる

# はじめに

AIエージェントに検索機能を追加する場合、`Brave Search`が有名です。
しかし、これにはAPIキーが必要であるため、環境によってはキー保存にちょっと気が引けるかもしれません。
DuckDuckGoのMCPサーバーは、APIキー無しでAIエージェントに検索機能を提供するために使えます。
ただ、`https://github.com/nickclyde/duckduckgo-mcp-server`のREADMEにある導入方法では`npx`や`uv`を使用しますが、セキュリティや権限の都合などでこれらのコマンドが使用できないこともあると思います。
そこで、同リポジトリにあるDockerfileを利用することで、これを利用してMCPサーバーの立ち上げと、クライント側の設定でサーバーとして利用ができるようになります。
この記事では、クライアントとしてはVisual Studio CodeのAgentモードやRoo Code(Cline)などでの利用方法について解説します。

# MCPサーバーとは

MCP（Machine Cognition Protocol）サーバーは、AIエージェントが外部サービスと連携するための標準プロトコルを提供します。DuckDuckGoのMCPサーバーを使用することで、AIエージェントはインターネット検索を行い、最新の情報を取得できるようになります。

# なぜDockerを使うのか

標準のインストール方法では、`npx`や`uv`といったツールが必要です

```bash
# Smitheryを使用した方法
npx -y @smithery/cli install @nickclyde/duckduckgo-mcp-server --client claude

# uvを使用した方法
uv pip install duckduckgo-mcp-server
```

しかし、以下のような環境では、これらのツールが使用できない場合があります

- 企業の制限されたネットワーク環境
- npm/Pythonのインストールが許可されていないシステム
- 外部パッケージマネージャーの使用が制限されている環境
- クロスプラットフォームで統一した環境を用意したい場合

このような場合、Dockerを使用することで、これらの制約を回避しつつ、MCPサーバーを簡単に立ち上げることができます。

# Dockerでの構築手順

## 1. リポジトリのクローン

まず、GitHubからリポジトリをクローンします。

```bash
git clone https://github.com/nickclyde/duckduckgo-mcp-server.git
cd duckduckgo-mcp-server
```

## 2. Dockerイメージのビルド

リポジトリのディレクトリ内で、次のコマンドを実行してDockerイメージをビルドします。

```bash
docker build -t mcp/duckduckgo-mcp-server -f Dockerfile .
```

これにより、`mcp/duckduckgo-mcp-server`という名前のDockerイメージが作成されます。

## 3. Visual Studio Codeでの設定

VSCodeのAgentモードでMCPサーバーを使用するには、`.vscode/mcp.json`ファイルを作成または編集し、次の内容を追加します。

```json
// .vscode/mcp.json
{
    "servers": {
      "ddg-search": {
        "command": "docker",
        "args": [
          "run",
          "-i",
          "mcp/duckduckgo-mcp-server"
        ]
      }
    }
  }
```

## 4. Roo Codeでの設定

Roo Codeでエージェントにmcpサーバーを使用させるには、`mcp_settings.json`ファイルに次の設定を追加します。

```json
// mcp_settings.json
{
  "mcpServers": {
    "ddg-search": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "mcp/duckduckgo-mcp-server"
      ]
    }
  }
}
```


## 5. Claude Desktopでの設定

！Claude Desktopでも同様にjsonファイルを設定すれば使えると思いますが、動作未確認です。
恐らく下記のようにするとできると思います。

```json
{
    "mcpServers": {
        "ddg-search": {
            "command": "docker",
            "args": [
                "run",
                "-i",
                "mcp/duckduckgo-mcp-server"
            ]
        }
    }
}
```

# 動作確認

設定が完了したら、Visual Studio CodeのAgentモード、Roo Codeでエージェントに検索を含むタスクを依頼してみましょう。
プロンプトは下記などにするとMCP検索を利用してくれるはずです。
```
インターネット検索し、MCPについての情報を収集してください。
```

# 注意点と制限事項

- Dockerがインストールされている必要があります

- レート制限があるため、短時間に多数のリクエストを送信しないようにしてください
  - 検索: 1分間に30リクエストまで
  - コンテンツ取得: 1分間に20リクエストまで

# まとめ

Dockerを使用することで、`npx`や`uv`が使用できない環境でも、DuckDuckGoのMCPサーバーを簡単に導入できます。
これにより、Dockerしか利用できない環境でｍAIエージェントに検索機能を提供することが可能になります。
【kintone標準機能】商品コード/商品名/型番いずれかで簡単にルックアップしたい

# はじめに
こんにちわ、バンコクのオンヌット駅近くでワーケーションしてる、ノベルワークスのまとっち（[@matoi_thai](https://x.com/matoi_thai)）です。

お客様と一緒に開発してた時に出てきた話ですが、ルックアップで手間のかかる操作を、標準機能で簡単な操作に変更したので、他の方にも参考になると思い、記事にまとめておきます。

## こんな人に見てほしい👀
- kintone標準機能だけでうまく構築したい
- kintoneのルックアップ取得に手間を感じている

# 注文明細の商品ルックアップ
元々は商品コードをルックアップキーにして注文明細を作っていたのですが、商品名や型番で検索することが多いお客様だったので、ルックアップキーにちょっと工夫を加えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/9e68569e-956f-4278-8a77-088f95da7d33.png)

## 改善前💭
- <b>「商品コード」</b>をルックアップキーにしていた
:::note warn
商品名や型番で検索したいことが多く、ルックアップの取得ボタンを押して、一覧から探す必要があり、手間が掛かっていた。（実際のお客様は商品数が3,000近くあり、ルックアップの絞り込み機能で検索する必要があった）
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/0b947f71-9148-4c9b-bb7f-e11793be4225.png)

こんな感じで手間が掛かる・・・💦
![改善前.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/f641c31b-c2ca-43a1-8551-69be0b9a0325.gif)


## 改善後✨
- 商品コード・商品名・型番を文字列結合した<b>「商品検索キー」</b>をルックアップキーにした
:::note info
商品コード・商品名・型番のどれかを覚えていれば、それを直接入力するだけでルックアップできる。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/3e6f2814-d284-476c-a607-066ae71a962b.png)

こんな感じではやい！！😆
![改善後.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/c7310f69-19c8-435a-92df-a76bdd1b0c38.gif)

# おわりに
標準機能で簡単にできる設定ですが、この設定をしないで、手間の掛かる運用をし続けてしまってる人は多いと思うので、参考になればと思って記事を書きました。以上！
Agent SDKでTTSする方法

## 概要
公式ドキュメントにはVoicePipelineを使ってspeach-to-speachのchain型の音声対話エージェントを作る方法は載っていますが、純粋なTTS/STTを使う方法が紹介されていません！

Agents SDKでTTSを使う方法を紹介します。おそらく同様の方法でSTTもできると思いますが確かめていません。

## TTS

```python
import os 
import io
import wave
from agents.voice import TTSModelSettings, OpenAITTSModel
from openai import AsyncOpenAI
from pathlib import Path
from dotenv import load_dotenv

async def main() :
    
    load_dotenv(dotenv_path=dotenv_path)

    OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")

    custom_tts_settings = TTSModelSettings(
        instructions="あなたは音声案内エージェントです。"
        "音声: 日本語の女性の声で、明るく親しみやすいトーンを持つ。"
        "トーン: 親しみやすく、明瞭で安心感のある話し方で、聞き手が自信を持ち、落ち着ける雰囲気を作る。"
        "発音: はっきりと明瞭に、安定したリズムで話し、自然な会話の流れを保ちながらも指示がわかりやすく伝わるようにする。"
        "テンポ: 比較的速めに話し、質問の前後に短い間を挟む。"
        "感情: 温かく支えとなるような話し方で、共感と気遣いを込め、聞き手が安心してガイドを受けられるようにする。",
        voice="sage"
    )

    tts_model = OpenAITTSModel(
        model="gpt-4o-mini-tts",
        openai_client=AsyncOpenAI(
            api_key=OPENAI_API_KEY
            ),
        )
    text = "こんにちは、私はあなたの音声案内エージェントです。"
    response_chunks = []
    async for chunk in tts_model.run(text, custom_tts_settings):
        response_chunks.append(chunk)
    response_audio = b"".join(response_chunks)

    wav_buffer = io.BytesIO()
    with wave.open(wav_buffer, "wb") as wf:
        wf.setnchannels(1) # モノラル
        wf.setsampwidth(2) # 16ビットPCM
        wf.setframerate(24000) # 24kHz
        wf.writeframes(response_audio)
    
    wav_buffer.seek(0)
    with open("output.wav", "wb") as f:
        f.write(wav_buffer.read())
    wav_buffer.close()
    print("Audio saved as output.wav")
    
if __name__ == "__main__":
    import asyncio
    asyncio.run(main())

```

こちらの例はAgents SDKでTTSし、wav音声ファイルとして保存するプログラムです。
VoicePipelineのような音声を再生する方法はおそらく使えないです。そのためwavファイルに変換する方法をとっています。プログラムを少し修正すればプログラムからの再生もできるはずです。

## VoicePipeline
VoicePipelineの使い方に関しては以下の公式ドキュメントを参考にすると良いと思います。

OpenAI 公式ドキュメント
* 使い方の説明: https://openai.github.io/openai-agents-python/voice/pipeline/
* リファレンス: https://openai.github.io/openai-agents-python/ref/voice/pipeline/
* github: https://github.com/openai/openai-agents-python


### Github
こちらのサンプルプログラムのGithubです。
https://github.com/tetra-mix/agents-sdk-tts-sample
脅威モデリングナイト#8に参加してきた

①アジャイル脅威モデリング
スクラムやXPから共通項を抽出したのが、アジャイルマニフェスト。

スクラムは一番有名なフレームワーク。テスト駆動開発も同じ粒度のフレームワーク。
デイリースクラムとOODAループ。

クリティカル・ラテラル・ロジカル　帰納・演繹・アブダクションなどの推論　仮説思考
制約理論　マーケ戦略フレームワーク　ECRS


・脅威モデリングの振り返り
セキュリティは後から考えると指数関数的にコストかかる　⇒　企画段階から脅威モデリングをやってもいい　匠メソッド×脅威モデリング

なぜセキュリティを実装するのか？の共通認識を取るため。RDRAみたいなもの

脅威モデリングマニフェスト、定期的に復習する。

※振り返りの際に、その結果を脆弱性診断⇒SWOTモデルの方に必ず反映する。各事業に閉じてしまって、経営の方までボトムアップできていない。
会社の文化の常識にしてしまう。　それができているのが、freeeのようなテスト再利用とかだと思う。


・脅威モデリングの罠

※　前提条件ツリーを作成し、事前に副作用を１企業というレベルからSWOTモデルまで反映。　⇒　脅威モデリングの方針に反映するのでは？

フレームワークの罠は、現状問題ツリーの負のサイクルを表現している。
これっていまの〇案件の、表面上のデータの一貫性がないから、一元管理基盤を作成するという案件のことを表している。


罠にはまらないようにするには？
⇒　アジャイル脅威モデリング

・アジャイル脅威モデリング
価値と原則も交わっている　マインドマップ

似ているからわなから逃れる方法も一緒というアナロジー展開をしている。

ゴールは常に変化する、でも目的は変化しない。　ゴールを５フォースやSWOT、7Sから変化させていく。そのロードマップを描く。

①意義のあるものにする　ATTに全く似ている　メカニズムは全く一緒
真因への打ち手として、脅威モデリングが効果的なら行ってみる。
(目的ドリブン　×　TOC　仮説行動で真因を見つけることが大事)

②自分のものにする
１　顧客から始める
２　早期から頻繁にコラボ　チートポ
３　不確実性を計画する　仮説マップの作成

Q & A 
	・業務委託など雇用形態の文脈の違いで、アジャイルモデリングでの密な連携が難しい。　⇒　動かせないものは定数と見なして、ハイブリッド型連携アーキテクチャを考える。

	・PBIに起こした際に、どういう形で受け入れ条件定義するのか　レビューしていくのか？


・アジャイル脅威モデリングの実践例
どのステークホルダーの価値を最優先しようかの計画をスプリント計画で考えている
要は、イシューと考えられるステークホルダー脅威を定義している。

１，顧客から始める　
ユーザーストーリの書き方　の工夫　価値記述と一緒に脅威記述をしている。
誰が　何をしたい　なぜそれを必要か　　without その際に避けたいリスク

２、早期から頻繁にコラボレーション
軽量な脅威モデリング

３、脅威モデリングのやり方自体の振り返りもする
バックログも外部環境変化などに合わせて柔軟に変えていく　柔軟に変えられやすい仕組みを盛り込んでおく。　関心分離×脅モデリング　RDRA脅威モデリング

SECIモデル　×　リスクナレッジ　👈　freeeのリスク対策再利用


・最初は小さく　イシューのみに　ビジネス目標に繋げるためにセキュリティ戦略
セキュリティチャンピオンプログラム　評価制度に脅威モデリングで貢献した者への成果報酬などの仕組みを盛り込む

セキュリティ専門家は、脅威イネイブリングモデラーとして、ストリームアラインドチームをファシリテーション支援する(ティーチング、コーチング)


脅威モデリング×価値デザイン　ストーリテリング

価値記述×脅威ストーリの部分、自分たちが優先的に価値を届けたいと思っているエンドユーザーさんにとっての価値を起点に、
それを実現する際のwithoutを定義し、その要求に対してwithoutにかかるコストが大きすぎるのなら(自社のアーキテクチャ大幅に変えるとか)、
一旦はその中で優先度も実現ども高いものだけにするなどを計画段階で考えるとかする。それがセキュリティ戦略。



個人メモ：illitiesによって、基盤に求められるアーキテクチャは異なってくる。illitiesは、あらゆる構成アプリコンポーネントにまたがっている。



②PESTEL分析と脅威モデリング　わたしの様々な視点の脅威モデリングと関係性が密
絞り込み思考×PESTEL　

日経市場という具体なPESTELと、世界というマクロなPESTELとの行き来による外部環境分析

・Legal Factors：個人情報保護法などの法律系、エンタメとかならR指定とか

PESTELは、互いに独立したものではなく、関連しあっているもの。
だから、多角的に評価した上で。脅威への対策が、他の要素に対して反していてはいけない。
刺激的な面白さを強く求めるニーズを持つエンドユーザーさんに対して、強く刺さるものであっても、それが法律に反してたらダメとか。

業界標準のセキュリティポリシー　←　それを継承した企業独自のセキュリティポリシー　←　事業のセキュリティポリシーがそれに反していてはいけない。


※Webで脅威モデリングを行うことによって起こる脅威
デイジーチェーンのディスプレイを使ってみたら凄すぎた

使っていたディスプレイがそろそろ寿命かなと思い、デイジーチェーン対応のディスプレイを買ってみたら凄すぎたのでご紹介します。

## 読んでほしい人
- ガジェット好き
- ディスプレイの買い替えを検討している
- 作業デスクをすっきりさせたい
- マルチディスプレイで作業したい

## デイジーチェーンって何？
デイジーチェーンは電子機器の接続方式で、今回は特にディスプレイを数珠繋ぎに接続できるものを指します。
各メーカーでデイジーチェーンの説明ページがあったので適当に貼っておきます。

[Dellさん]
https://www.dell.com/support/contents/ja-jp/article/product-support/self-support-knowledgebase/monitor-screen-video/guide-daisy-chain-monitors

[EIZOさん]
https://www.eizo.co.jp/support/compati/monitor/daisychain_guide/

[I-O Dataさん]
https://www.iodata.jp/support/qanda/answer/s31561.htm

ディスプレイポートないしはUSB Type-Cを使い、まずはPC本体とディスプレイを繋ぎます。
通常は2枚目のディスプレイを使う場合は、またPC本体とディスプレイを繋ぎますが、デイジーチェーンの場合は1枚目のディスプレイのアウトプットから2枚目のディスプレイのインプットに繋ぐことでディスプレイの拡張が可能です。
接続の構成はPC本体のOSやCPUによります。
我が家を例に出すと、windows11のノートPCで、全部で4つのディスプレイを表示する事が出来るため、本体のディスプレイと外付けディスプレイ3枚の構成で設置しています。

## USBハブの機能によるデスクの整頓
自宅の作業環境には複数のUSB接続製品が繋がっている事が多々あります。
我が家のPCにも、キーボード、マウスをはじめ、カメラ、マイク、テンキー用のトングルといった複数のUSB接続に加えてLANケーブルも繋いでいました。
時にはゲーム用のコントローラーを付けたりRaspberry PiやArduino、SDカードリーダーや外付けHDD等々、繋げたいものはたくさんあります。
これらの製品を繋ぐためにUSBハブを使っている人もいると思いますが、USBハブ対応のディスプレイを使えば、これら全てをディスプレイに繋いでしまえば良いのです。
デスク上やデスク下にPC目掛けて大量の配線を這わせる必要はありません。デスク裏から全てディスプレイに繋いでしまえば良いのです。
ただしこの場合は、PC本体との接続をUSB Type-Cで行わなければなりません。デイジーチェーン対応ディスプレイの中にはディスプレイポートのみの対応の場合がありますので、ここは注意が必要です。
PC本体、ディスプレイの双方が対応していればUSB Type-Cケーブルでの接続でPC本体の充電も出来ちゃいます。
これはもう買うしかないですね！

## 注意点
もちろん良いことばかりではありません。良い製品かどうかは自分の使い方にマッチするかどうかにかかっています。
一番の問題は高い解像度だと使えない可能性がある事です。
特に4K、8Kの解像度や120Hz以上のリフレッシュレートを求めている人は難しい可能性があります。
この辺りは製品仕様によるのでよく調べて選定をしてください。
高解像度にも対応しているけど、デイジーチェーン接続の場合は対応していない、みたいな場合もあるので、不明な場合は各メーカー様へお問い合わせください。
あとは優秀な機能がついているので、デイジーチェーン非搭載のモデルよりは少し値が張ります。便利な機能にはお金がかかるのは仕方ないですね。

## それで何を買ったの？
I-O DataさんのBizCrystaシリーズの24インチのものを3枚購入しました。
https://www.iodata.jp/product/lcd/bizwide/lcd-bc241d-f/index.htm

うちでは元々24インチ3枚対応のディスプレイアームを使っていたので、今回のタイミングですべて入れ替えを行いました。
USB Type-C接続でのデイジーチェーン対応でUSBハブの機能もついています。
欲しい機能が全て詰まっていて値段も予算内になったのでこちらを選びました。

## まとめ
デスクがきれいになると作業が捗ります。特にノートPCをメインにしている人にとって、ノートPCが持ち運びしやすいのはとても大切なことです。接続しているケーブルが多いとなかなか持ち運びの準備が大変ですし、持って帰ってきた後に作業場へ戻すのも大変です。
今年の私は勉強会などで外出する機会を増やしているので、取り回しが良いのは大変ありがたいですね。
仕事仲間に話したところ、意外と知っている人が少なかったので記事にしてみました。
誰かの助けになれば幸いです。
[Julia][Python]PythonからJuliaの呼び出し

## はじめに

　データ分析や機械学習などに利用できるプログラムとして、Juliaがあると知った。
　以下３点のメリットから今後利用することがあるかもしれないので、備忘録として初歩的なことから欲しかった資料をまとめていく。
　[1]Pythonと同じようにライブラリを利用できる
　[2]実行速度がC言語よりも速い
　[3]PythonやC言語と連携することもできる

## 実行環境
　参考資料[1]で構築したVSCにおけるWSL2で実行している。

## PythonCall / juliacall 採用の理由
　実行速度が速いJuliaによる計算処理部分の実行を想定し、PythonとJuliaを連携するためのパッケージ・ライブラリとして、PythonCall・juliacallを利用した。
　PyJuliaを利用した事例もあるが、Pyjulia実行用の環境整備に手間がかかることに加え、自分のJuliaとのバージョン差異による警告メッセージが表示され続けてしまうため、利用を控えた。Pyjuliaは過去作成されたものなので、ライブラリ自体が古いJuliaのための記載があるらしい。参考資料[2]にある公式情報でも、Python-Julia間の連携のパッケージ・ライブラリはPythonCallを推奨している。

## モジュール・ライブラリ準備
### Julia
 Julia側でも予めインストールする必要があり、PythonCallが導入されている必要がある。

 ```
using Pkg
Pkg.add("PythonCall")
 ```

 ### python
 python==3.12.8のCondaによる仮想環境上で、以下のライブラリをインストールした。
 
 ```requirements.txt
filelock==3.18.0
juliacall==0.9.24
juliapkg==0.1.16
semver==3.0.4
setuptools==75.8.0
wheel==0.45.1
 ```

## 検証したプログラム
### 構造
 .juliaにある２つのプログラムについて、call.pyから呼び出す。
```
./
├─.julia
|  └─test.jl
|  └─test2.jl
└─.python
   └─call.py

```

### プログラム
``` test.jl
function calc(x)
    y = 10
    result = x * y

    return result
end


function array()
    arr = [1,3,5]
    
    return arr
end
```

```test2.jl
function message()
    
    message = "Hello World"

    return message
end

function dict()
    books = Dict{String, String}(
        "ハリー・ポッター" => "ファンタジー",
        "ドラえもん" => "漫画",
    )
    return books

end

```

``` call.py
from juliacall import Main as jl
import os

# Juliaに渡すための .jl ファイルの絶対パスを取得
jl_file = os.path.abspath("../julia/test.jl").replace("\\", "/")
jl_file2 = os.path.abspath("../julia/test2.jl").replace("\\", "/")

# Juliaで include
jl.seval(f'include("{jl_file}")')
jl.seval(f'include("{jl_file2}")')

# 関数呼び出し
numeric = jl.calc(5)
array = jl.array()
dictionary = jl.dict()
message = jl.message()

print(f"numeric     = {numeric}    ({type(numeric)})")
print(f"array       = {array}      ({type(array)})")
print(f"dictionary  = {dictionary} ({type(dictionary)})")
print(f"message     = {message}    ({type(message)})")

```

## 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/506ef699-2131-4991-b593-b14411b670e9.png)
 PythonからJuliaを呼び出すことに成功し,以下２点が判明した。
 
①関数を呼び出すにあたり、名前が重複していない限りは単純に関数名を指定するだけで利用することができている。
　※複数ファイルで関数名が重複する場合、Julia側でモジュール化する必要があるらしいが、関数名を別名にすることで避けることができるので、今回は試していない。
②jl.sevalで呼び出すJuliaファイルについて、使用する関数などの順番に依存していない。
　※複数ファイルで同一関数がある場合、最後に呼び出したものが適用されるらしい。
③Juliaで実行した結果をPython側に取得しているが、Pythonに存在しない型の場合はJuliaの型として取得されてしまっているので、Python側で利用する際に型修正が必要。

 ## 参考資料
[1]svoboda, 『[Julia]VSCにおけるWSL2でのJulia　環境構築～サンプルコード実行まで』, https://qiita.com/svoboda/items/6a0ad624bc58a354edb3
[2]MilesCranmer, 『JuliaPy/pyjulia: python interface to julia』, https://github.com/JuliaPy/pyjulia?tab=readme-ov-file
[3]cjdoris, 『JuliaPy/PythonCall.jl』, https://github.com/JuliaPy/PythonCall.jl
[4]Rahban1, 『The Julia module PythonCall』, https://juliapy.github.io/PythonCall.jl/stable/pythoncall/#Installation
[5]Krypf(Krypf), 『【Julia】 基礎: 型』, https://qiita.com/Krypf/items/145ad24911ca51117e29#7-array-%E5%9E%8B
イネイブリングモデラーとしての心得(編集途中)

# 仮説をもって司会する
相手の言動からコンテキストを立体的に把握する。
相手は自分が置いているコンテキストを正確に理解できている確率は5%にも届かない。

大抵の人は、自覚できていると思い込んでいるケースが大半である。
では、どうやってコンテキストを理解できているといえるのか？

わたしは以下の本で扱っている、3Sというフレームワークを用いて図解できるか？
で検証できると主張したい。

## 仮定を作る
ファシリテーションする際には、常にこのコンテキストモデルをもとに、
「いま相手はこんなコンテキスト境界という認知バイアススコープの中で会話に参加している」という仮定を設ける。
この仮定は相手からは見えないように可視化しておきましょう。
結構失礼な内容が書かれていてもいいです。
あくまでも「相手はこんなバイアスの中にいるだろう」という仮説を持つことが重要なんです。

## 演繹法で結果を類推する
次に、その仮定のもとで
「こんな問いかけをすれば、こんな回答が来るはずだ」という結果を予測します。
ここには演繹法が使われています。
この予測モデルを作ってから問いかけをしましょう。

## 返答結果をもとに仮定の検証する
返答結果が予測モデルと整合していれば、先ほど立てた
「相手はこんなバイアスの中にいるだろう」という仮説は正しいと言えます。

:::note warn
ただし、その時点ではまだ正しいといえる
:::

程度の話です。
この問いかけを繰り返すことによって、相手のバイアス境界を浮き彫りにする
というのが、共同でもデイｒンぐを行う醍醐味とも言えます。

# コンテキスト理解にお勧めの本
コンテキスト思考
Oracle Cloud メモ３

Oracle Cloud Infrastructure（OCI）のFile Storageは、クラウドベースのスケーラブルなNFS（Network File System）ファイルストレージサービスです。エンタープライズ向けのアプリケーションや高パフォーマンスなワークロードに対応できるよう設計されています。

機能	内容
NFSv3準拠	UNIX/Linux環境と互換性のあるNFSプロトコルに対応。
スケーラブル	必要に応じて自動的にスケーリングし、ペタバイト級まで対応可能。
高可用性	自動的に冗長性を持たせ、障害発生時にも高い可用性を維持。
セキュリティ	Oracle IAMとの統合、暗号化（転送中・保存時両方）対応。
パフォーマンス	最大数十万IOPSと高スループットを提供。
マネージドサービス	管理作業不要で、運用負荷を軽減。



NFSv3エンドポイント　とは？

「NFSv3エンドポイント」という言葉は、Oracle Cloud Infrastructure（OCI）やその他のクラウド環境でNFS（Network File System）バージョン3を使ってファイルシステムにアクセスするためのネットワーク上の接続先（IPアドレス＋パス）のことを指します。


OCLのall_squashオプションとは？
ChatGPT:
OCI（Oracle Cloud Infrastructure）における all_squash オプション は、NFS（特にNFSv3）でエクスポートされたファイルシステムにアクセスする際のユーザーIDマッピングに関わる設定です。

all_squash は、NFSクライアントから接続してくる**すべてのユーザー（rootを含む）を、指定した匿名ユーザー（通常は nobody）**として扱うNFSのマウントオプションです。

意味？
通常、NFSはクライアント側のユーザーID（UID）やグループID（GID）をそのまま使ってサーバー上のファイルにアクセスします。

all_squash を有効にすると、すべてのユーザーのUID/GIDが匿名ユーザー（nobody）に変換される。

これにより、サーバー側でファイルの読み書きを制限できます。

🔐 目的は「セキュリティ」
all_squash を使うことで：

状況	動作
通常のNFSアクセス	クライアント側のUIDでファイル操作
all_squash 有効時	すべて nobody ユーザー扱いになる
つまり、「クライアントのrootユーザーでも、ファイルシステムに勝手にフルアクセスさせたくない！」という時に有効です。


nfsnobody
ChatGPT:
「nfsnobody」は、Linux や UNIX 系OSで NFS（Network File System）を使うときによく登場する**匿名ユーザー（anonymous user）**のことです。

🔹nfsnobody とは？
NFSクライアントが接続してきたとき、サーバー側で「このユーザー誰か分からん…」ってなった場合に、

セキュリティのため、そのユーザーを**"nfsnobody"（または単に nobody）**として扱います。


Oracle Cloud Infrastructure（OCI）の Object Storage とは？
OCIの Object Storage は、あらゆる種類の非構造化データを安全に保存・取得できるクラウドストレージサービス です。Amazon S3のような「オブジェクトストレージ」で、画像、動画、ログファイル、バックアップ、ビッグデータなど、大量のデータを保存するのに適しています。


BUCKET_UPDATE権限はOCIだけの考え？

いい質問！結論から言うと：
 はい、BUCKET_UPDATE という名前の権限は OCI（Oracle Cloud Infrastructure）独自のIAM権限の一部です。


 Oracle Cloud Infrastructure (OCI) の Block Volumes サービス とは？
🔹 一言で言うと：
OCI上のコンピュートインスタンス（VMやBare Metal）に接続できる、クラウド上の高性能な仮想ディスクです。



Oracle Cloud Infrastructure Vault　とは？


ChatGPT:
Oracle Cloud Infrastructure（OCI）Vault は、機密情報（シークレット）や暗号鍵を安全に保存・管理するためのサービスです。具体的には、以下のような用途に使われます：

🔐 OCI Vaultの主な機能
1. 暗号鍵の管理（Key Management）
データの暗号化や復号に使用する**暗号鍵（AES鍵やRSA鍵など）**を安全に保管。

ハードウェアセキュリティモジュール（HSM） により、高レベルなセキュリティで鍵を保護。

暗号鍵の**ローテーション（定期的な更新）**にも対応。

2. シークレットの管理（Secrets Management）
APIキー、パスワード、DB認証情報などの機密情報を保存。

これらのシークレットは、アプリケーションやサービスから安全に取得可能。

3. アクセス制御と監査ログ
OCIの**IAM（Identity and Access Management）**と連携し、誰がどの鍵・シークレットにアクセスできるかを厳格に制御。

監査ログにより、使用履歴を確認可能。

4. 統合されたセキュリティ
OCI Vaultは、オブジェクトストレージ、データベース、コンピュート、ファンクションなど他のOCIサービスと簡単に統合可能。

たとえば、暗号化されたオブジェクトストレージのキー管理をVaultで行うことができます。

🔎 どんなときに使うの？
アプリケーションで使用するDBの接続情報を安全に保管したいとき。

顧客データを暗号化するための鍵をクラウド上で安全に管理したいとき。

システムがセキュリティ認証（ISO 27001、SOC 1, 2, 3など）に準拠する必要があるとき。