OmniAICreator/Qiita-1.07M huggingface dataset:
Springでバラバラな数値キーのリクエストをMapで受け取る

## はじめに
@JsonAnySetterをセッターメソッドとして設定することで、SpringBoot REST APIで[key: number]: string;のように、固定フィールド（例えば field1）に加えて、バラバラな数値キー（例- 123, 456）を Map &lt; Integer, String &gt; として受け取る方法を紹介します。

## 1.TypeScript 側のJSON例

```TypeScript:Modeltype.ts

type Model = { 
field1: string;
[key: number]: string;
}

```



## 2.Spring側の受け取りエンティティの定義方法



```java:Model.java

public class Model {

private String field1;

private Map<Integer, String> extraFields = new HashMap<>();

public String getField1() {

return field1;

}

public void setField1(String field1) {

this.field1 = field1;

}

@JsonAnySetter

public void setExtraField(String key, String value) {

try {

Integer intKey = Integer.parseInt(key);

extraFields.put(intKey, value);

} catch (NumberFormatException e) {

// 非整数キーは無視するか、別の処理を追加可能

}

}

public Map<Integer, String> getExtraFields() {

return extraFields;

}

}

```


## 3.ポイント

@JsonAnySetter を使うことで、field1 以外の任意のプロパティをすべて Map に格納できます。

数値キーはJSON上では文字列（ "123"）なので、Java側で Integer に変換する必要があります。
Kyverno Chainsaw CRDを**敢えて**applyする方法

以下のコマンドでCRDがapplyできます。

```
kubectl apply -f https://raw.githubusercontent.com/kyverno/chainsaw/refs/heads/main/.crds/chainsaw.kyverno.io_configurations.yaml
kubectl apply -f https://raw.githubusercontent.com/kyverno/chainsaw/refs/heads/main/.crds/chainsaw.kyverno.io_steptemplates.yaml
kubectl apply -f https://raw.githubusercontent.com/kyverno/chainsaw/refs/heads/main/.crds/chainsaw.kyverno.io_tests.yaml 
```

Kyverno ChainsawはCRDをクラスターに適用しなくてもテストは行えます。あえて適用するのは、クラスターにCRDがあると便利なシーンがあるからです。例えば、

- JetBrains IDEがスキーマを認識してくれて補完やバリデーションが効く
- AptakubeなどのCRDビューアー(語弊)でドキュメントとして活用できる

などなど、エコシステムと連携することで開発体験が良くなるというわけです。
Power Queryエディターでのデータ加工手順

# はじめに

こんにちは！
記事をご覧いただきありがとうございます。
本記事では、Power BIにExcelデータを取り込んだ後に行うPower Queryエディターでのデータ加工について、実際のステップをベストプラクティスを交えて紹介します。
ぜひ最後までご覧ください！

# 目次
4.  [Power Queryエディターとは？](#power-queryエディターとは)
1. [加工前に確認しておくべきこと](#加工前に確認しておくべきこと)
1.  [Power Queryで行った加工ステップ](#power-queryで行った加工ステップ)
1.  [ベストプラクティス](#ベストプラクティス)
4.  [最後に](#最後に)

# Power Queryエディターとは？
Power Queryエディターは、Power BIに取り込んだデータを「使いやすく整えるための前処理エディタ」です。クリック操作だけでフィルターや並べ替え、データ型の変更、結合などができ、データ加工の重要な役割を果たします。

# 加工前に確認しておくべきこと

### データ構造の標準化
- ファイルに「ヘッダーが何行目にあるか」を把握する
- データの範囲に余白や不要な注釈が含まれていないかを確認

### 欲しいアウトプットをイメージする
- どの単位で集計したいか（例：月次・商品別など）
- データの粒度と整合しているか
- 主キーは存在するか

# Power Queryで行った加工ステップ
ここからは、実際に私が行った加工処理とその目的を、ステップ順に紹介します。

### 【Step 1】不要な行・列を削除
- 最初にノイズとなる説明行や空行を削除
- 1行目をヘッダーとして使用は不要行を削除した後に適用する

### 【Step 2】データ型の明示的な変換
- 必要に応じて「日付」「数値」「テキスト」などを手動で設定
- 自動で設定された型を鵜吞みにせず確認する

### 【Step 3】前の値で空欄を埋める
- 階層構造のデータなどで、カテゴリ名が一度だけ書かれている場合に使用
- データが「1セルにしか書かれていないカテゴリ名」を繰り返すことでピボットしやすくなる

### 【Step 4】カラムの分割・整理
- 1列に「年月＋商品名」などが混在していた場合区切り記号で分割する
- 余計な列が多い場合は「列の削除」→「列の並べ替え」で構造を整える

【Step 5】クレンジング
- 空白や改行が混ざっていたら整形する
- "￥", "%" など不要な記号は「値の置換」で消す
- フィルタやグループ化で「意図しない値」が混じるのを防ぐため、見えない空白にも注意する

# ベストプラクティス

- ステップに名前（コメント）を付けることで、何をしているかすぐ分かる
- ステップを細かく分けることで後から修正しやすい
- 「ファイル構造は変わるかもしれない」と想定して、柔軟な加工にする


# 最後に
Power Queryエディターでの操作は、Power BIでのデータ分析において非常に重要なステップです。Excel のデータを取り込むだけでは終わらず、「加工して使える形にする」ことで可視化がスタートします。今後も工夫しながらデータ加工をしていきたいと思います。
最後までお読みいただきありがとうございました！
Bookwormでの静的ルートの追加

Raspberry PiのRaspbianOSをBookwormにアップグレードしたら、静的ルーティング設定ができなくなりました。

というか静的IP設定でも毎回あれこれあるんだけれど、Debianてメジャーアップデートのたびに必ずこの辺をいじくりますよね。何回も同じ情報をぐぐってしまうので、備忘録として書いておきます。

Bookwormでは静的なネットワーク設定はNetworkManagerでやるようになってるそうです。コマンド的にはnmcliで。

今回は静的なルートの追加です。今までは
`# route add -net 192.168.121.0 netmask 255.255.255.0 gw 192.168.11.254 metric 100`
とか書いてたわけですが、Bookwormでこうしても何事もなくコマンドが実行終了する割には
`% ip route`
で見ても追加されてない。

調べてみたら、NetworkManagerにネットワーク管理が切り替わっているので、経路の追加はNetworkManagerのコマンドでやるのだそうです。動かないんだったらroute addはエラーにしとけよ！ということで、今では
`# nmcli connection modify enxaabbccddeeff +ipv4.routes "192.168.121.0/24 192.168.11.254`
という風に書く流儀らしい。ちなみに経路の削除は
`# nmcli connection modify enxaabbccddeeff -ipv4.routes "192.168.121.0/24 192.168.11.254`
とするそうです。

でもこうやっても
`%ip route`
でみると追加されてない。えーって調べたら、
`# nmcli c up enxaabbccddeeff`
として、再読み込みさせる必要があるらしいです。

しばらくここではまっちゃいました( ；∀；)
なぜAIがあっても熟練開発者が必要なのか

AIが進化しても、熟練開発者の存在は不可欠です。以下にその理由を簡潔にまとめました。

![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4075136/5b7c8cd8-2b4f-4437-858a-74adf1a2be22.jpeg)

### 1. システムアーキテクチャの設計

複雑なシステム設計には、全体を見渡す視点が必要です。AIは部分的な提案はできますが、拡張性や保守性を考慮した設計は開発者の経験が欠かせません。

### 2. セキュリティの確保

サイバー攻撃からシステムを守るには、セキュリティの知識が必須です。AIは脆弱性を指摘できますが、具体的な対策や優先順位付けは開発者の判断が必要です。

### 3. パフォーマンスの最適化

アプリの速度や効率を高めるには、ボトルネックを特定し最適化するスキルが必要です。AIは提案できますが、全体のバランスを取るのは開発者の役割です。

### 4. 複雑なデバッグ

データベースの問題や競合状態など、複雑なバグの解決には深い理解が必要です。AIは簡単なエラー修正はできますが、システム全体を見渡す能力は開発者に軍配が上がります。

### 5. AIの適切な活用

AIを効果的に使うには、適切な指示が必要です。開発者は技術的な背景を活かし、AIの出力を評価・修正して品質を確保します。

### 6. 適応力と革新性

新しい技術やトレンドに対応し、革新的な解決策を生み出すのは開発者の強みです。AIは既存のパターンを再現できますが、新しいアイデアを生み出すのは人間です。

### まとめ

AIは強力なツールですが、熟練開発者の経験と判断力は代替できません。システム設計からデバッグ、AIの活用まで、開発者はプロジェクトの成功に不可欠です。


関連リンク
詳細版（Zenn）: [こちら](https://zenn.dev/ken1618/articles/f789fa13d275de)
オリジナル（Medium）: [こちら](https://medium.200ok.io/why-you-still-need-a-qualified-developer-even-though-theres-ai-e2587b67ed94)
8x8上下逆転


いろいろ、注意
----

- UNOでの予定は、未定



プログラム
----

オンラインコンパイラ　paiza


```c++


#include <iostream>
using namespace std;


void font_data_out(unsigned char *font){
    for(int i=0;i<8;i++){
        printf("[%02x]\n",font[i]);
    }//for 
    printf("\n");
}//font_data_out


int main(void){
    // Your code here!
    
    unsigned char font[] = {
        0b10000000,
        0b01000000,
        0b00100000,
        0b00010000,
        0b00001000,
        0b00000100,
        0b00000010,
        0b00000001
    };    
    
    int c;
    c = font[0];
    font[0] = font[7];
    font[7] = c;

    c = font[1];
    font[1] = font[6];
    font[6] = c;

    c = font[2];
    font[2] = font[5];
    font[5] = c;

    c = font[3];
    font[3] = font[4];
    font[4] = c;

    
    
    font_data_out(font);

    
}




```

```

[01]
[02]
[04]
[08]
[10]
[20]
[40]
[80]

```
LLMへの敵対的攻撃に入門する～LLM adversarial example～

# はじめに
大規模言語モデル（LLM）は高い生成性能を背景に，実際のサービスや業務での利用が急速に進んでいます。しかし，その安全性を担保するメカニズムを巧みにすり抜ける「敵対的攻撃（adversarial attack）」の存在は看過できないリスクを孕んでいます。推論時に微小な入力改変を加えるだけで，有害な情報や誤情報を引き出せることが知られており，こうした攻撃手法の理解と防御策の整備は，LLMを実運用に乗せる上で最重要の課題と言えます。Lil’Logによる解説では，敵対的攻撃は「モデルの出力に望ましくない挙動を引き起こす入力」であり，生成タスクに対する研究が本格化している点が示されています。

# サーベイ論文
よさげなサーベイ論文をひとまず記載しておく．
『Survey of Vulnerabilities in Large Language Models Revealed by Adversarial Attacks』
https://arxiv.org/abs/2310.10844
またブログだが次もよい．
『Adversarial Attacks on LLMs』
https://lilianweng.github.io/posts/2023-10-25-adv-attack-llm/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357670/eba14bcb-0df6-47cf-9ca0-4d0dbd5afa81.png)
[Greshake+ 23]（ https://arxiv.org/abs/2302.12173 ）より引用．

# 具体的な攻撃手法
文章分類やテキスト生成モデルを誤動作させる代表的な攻撃として，まず入力の一部トークンを同義語や文脈対応語で置換する「トークン改変型」攻撃が挙げられます。Di JinらのTextFoolerは，分類タスクや推論タスクに対して，重要度スコアに基づいて語を選択し自然な同義語に置換することで，モデル精度を著しく劣化させます。人間の解釈では意味を保ちながらもBERTの分類精度を90％以上から数％にまで落とすことが可能です。これに対し，BERT-Attackはマスク言語モデル（MLM）を用いて文脈に適した語を生成し，より文法的・意味的に整合した置換によって攻撃効果を向上させています。

一方，White-box環境下で勾配情報を直接用いる「勾配ベース最適化」攻撃も存在します。Eric Wallaceらが提唱したUniversal Adversarial Triggersは，任意の入力文に付加しても特定の誤出力を誘発する「汎用トリガー」を勾配誘導により探索するもので，SNLIやSQuADタスクで成功率をほぼ100％近くまで高めました。この手法はモデル依存度が低く，検証済みのトリガーが他モデルに転移可能な点も問題視されています。

さらに，生成モデルに対する「脱獄プロンプト（Jailbreak）」では，プロンプト中に安全策を無視する指示を忍び込ませます。Shayeganiらの研究では，マルチモーダルモデルに対して敵対的画像とテキストを組み合わせる手法が示され，単なるテキスト攻撃を超えた強力な脱獄が実現されています。

## バックドア攻撃の脅威
推論時だけでなく，モデルのカスタマイズや微調整フェーズに「バックドア」を埋め込む手法も深刻なリスクです。Rui Zhangらは，GPTsのようなカスタマイズされたLLMに対する最初の「Instruction Backdoor Attacks」を提案し，事前定義したトリガーが含まれると攻撃者指定の応答を返す機能を目立たず忍び込ませる手法を示しました。これにより，fine-tuneやモデル改変なしにバックドアを仕込めることが確認されています。

さらに，近年ではHugging Faceのような共有プラットフォームを経由する「サプライチェーン型」のバックドアリスクも注目されています。公開モデルが第三者により改変され，悪意あるコードや重みが紛れ込むことで，ユーザーが意図せず悪質な挙動を引き出してしまう危険が指摘されています。信頼できる公開元かどうかの確認や，モデル取得時の署名検証・サンドボックス実行など，プラットフォーム起点のセキュリティ対策もますます重要になっています。

## 緩和策と防御技術
こうした攻撃に対して，最も古典的かつ有効なのは「敵対的訓練（Adversarial Training）」です。TextFoolerやUniversal Triggerのような攻撃例を学習データに組み込み，頑健性を高めるアプローチは多くの研究で効果を示しています。また，FireBERTのように，推論時に多様な語置換バリエーションを生成し投票によって頑健性を保つ技術も提案されており，MNLIやIMDB評価データセットで顕著な防御効果が記録されています。さらに，ランダムマスキングを組み合わせた検出手法や，入力前処理による異常検知アプローチも実用化が進んでいます。これらを組み合わせることで，単一の防御策では防ぎきれない高度な攻撃にも対応可能となります。

また，ここでは主に技術的防御策を挙げていますが，運用面（例: モデル監査，セキュリティポリシー，利用者教育）や法的・倫理的側面の強化も追加視点として重要です。

# おわりに
大規模言語モデルはその高性能ゆえに，敵対的・バックドア攻撃の標的となりやすいものです。一つ一つの手法を理解し，サーベイ論文に示された全体像を押さえた上で，実装フェーズでは複数の防御技術を組み合わせることが欠かせません。今後は，より自動化された攻撃検知・修復フローの確立と，モデル設計段階からのセキュリティ組み込みが急務です。さらに，将来的な課題として，AIモデル自体の設計思想（例: 解釈性を高める構造，権限分離の導入）を検討する視点や，標準化団体の取り組み動向への関心も加えるべきでしょう。
2025年のAIトレーニングの3つの方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4075136/792f28f2-6924-421a-8ad2-45a15e9b4203.png)


AIモデルをトレーニングするための簡潔なガイド：ハードウェア、クラウド、分散型コンピュート

AIトレーニングには膨大な計算能力が必要です。2025年、主な方法は自社ハードウェア、クラウド、ブロックチェーンを活用した分散型GPUネットワークの3つです。それぞれの特徴とトレードオフを紹介します。

## 1. 専用ハードウェアへの投資

頻繁に大規模モデルをトレーニングする場合、NVIDIA RTX 4090やH100を搭載したAIワークステーションが有効です。256GB以上のRAMとNVMe SSDを備え、PyTorchやTensorFlowに対応。初期コストは1万～1.5万ドルですが、制御性が高く、長期的にクラウドより経済的です。ただし、メンテナンスや消費電力の管理が必要です。

## 2. クラウドでのトレーニング

AWS、Google Cloud、Lambda Labsなどのクラウドは、H100やA100をオンデマンドで提供。1時間1.89ドルから高額な8GPU構成まで対応。短期間の実験やプロトタイピングに最適ですが、ストレージやネットワークの隠れたコストに注意。柔軟性と事前設定された環境が魅力です。

## 3. 分散型コンピュート（Web3 DePINs）

Akash NetworkやGPU.NETなどの分散型ネットワークは、未使用GPUを0.5～2ドル/時間で提供。クラウドより安価ですが、トークン価格の変動やハードウェアのばらつきが課題。オープンソースや実験向けに適しており、検閲耐性も特徴です。

## 最後に

トレーニング頻度や予算に応じて選択を。ハードウェアは制御性、クラウドは柔軟性、分散型は低コストを重視する場合に適します。多くの開発者はこれらを組み合わせて効率化しています。


関連リンク
[Zenn版記事 （より技術的な内容）](https://zenn.dev/ken1618/articles/0e3c17c29656dd)
[英語版オリジナル記事](https://medium.200ok.io/3-ways-to-train-ai-in-2025-87cfcc507baf)
PHP備忘録：Laravel + Docker 環境でセッションエラーが出たときのマイグレーション対処法

## はじめに

LaravelでPHPの学習をしている中で、セッション関連のエラーに遭遇したため、その対処法について記録しておきます。

**本記事は、個人的にPHPをキャッチアップしている初学者による備忘録です。**

---

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

Laravel環境をDocker上に構築し、フォームのPOST処理などを試していた際、`Internal Server Error` に遭遇しました。ブラウザ上には以下のようなエラーメッセージが表示されました：

```
Illuminate\Database\QueryException
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel.sessions' doesn't exist
```

このエラーは、`.env` にて `SESSION_DRIVER=database` が指定されている状態で `sessions` テーブルが存在しないときに発生します。

---

## 内容

### エラー原因

Laravelは、セッション情報を `sessions` テーブルに保存しようとしましたが、該当のテーブルが存在していなかったためエラーになりました。

### 解決手順（実際に行った対応）

```bash
make migrate
```

このコマンドは以下を実行してくれます：

```bash
docker compose exec php-app php artisan migrate
```

実行ログ：

```
INFO  Preparing database.  

Creating migration table .............................................................. 18.63ms DONE

INFO  Running migrations.  

0001_01_01_000000_create_users_table .................................................. 58.28ms DONE
0001_01_01_000001_create_cache_table .................................................. 18.64ms DONE
0001_01_01_000002_create_jobs_table ................................................... 44.38ms DONE
2025_05_05_010232_create_messages_table ................................................ 9.03ms DONE
```

この実行によって、`sessions` テーブルも含めてすべてのマイグレーションが処理され、エラーが解消されました。

---

## まとめ

このエラーはLaravelでセッションをDB管理しようとした際に非常によくあるもので、`php artisan session:table` → `php artisan migrate` の流れで解決できました。

:::note info
**今回は `make migrate` により一括実行したことで、全てのテーブルが作成され、`sessions` テーブル関連のエラーも無事解消されました。**
:::

Laravelのセッションは `.env` で `SESSION_DRIVER` を `file` や `database` に切り替えられるため、用途に応じて設定とマイグレーションを調整するのがポイントだと痛感しました...！
TsukuCTF 2025 Writeup

# TsukuCTF 2025
個人で参加してみました。
![スクリーンショット 2025-05-08 222251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4055936/35a134f4-536e-4349-8011-087d88b35390.png)

## Casca

![casca.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4055936/59e96463-bf22-4466-89c6-e1c5460d4675.jpeg)

Googleの画像検索で検索すると、すぐに熱海だとわかりました。
「ジャカランダ遊歩道 ポルトガル」で調べると以下のサイトが見つかりました(本番は違うサイトを見た気がする)。

https://resort-estate.com/info/12706/

記念碑？の写真があり、それに書いてある日付を!
入力するとクリアできました。

## curve

![curve.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4055936/d2bc541d-3fb2-495f-83dc-907711037737.jpeg)

スパイラルエスカレーターです。三菱の技術らしいです。

https://ameblo.jp/umaleeno/entry-12876405935.html

この記事をみて、地面のタイルが一致していた「横浜ランドマークタワー」であると判断しました。

## len_len

```javascript
const express = require("express");
const bodyParser = require("body-parser");
const process = require("node:process");

const app = express();
const HOST = process.env.HOST ?? "localhost";
const PORT = process.env.PORT ?? "28888";
const FLAG = process.env.FLAG ?? "TsukuCTF25{dummy_flag}";

app.use(bodyParser.urlencoded({ extended: true }));

function chall(str = "[1, 2, 3]") {
  const sanitized = str.replaceAll(" ", "");
  if (sanitized.length < 10) {
    return `error: no flag for you. sanitized string is ${sanitized}, length is ${sanitized.length.toString()}`;
  }
  const array = JSON.parse(sanitized);
  if (array.length < 0) {
    // hmm...??
    return FLAG;
  }
  return `error: no flag for you. array length is too long -> ${array.length}`;
}

app.get("/", (_, res) => {
  res.send(
    `How to use -> curl -X POST -d 'array=[1,2,3,4]' http://${HOST}:${PORT}\n`,
  );
});

app.post("/", (req, res) => {
  const array = req.body.array;
  res.send(chall(array));
});

app.listen(PORT, () => {
  console.log(`Server is running on http://${HOST}:${PORT}`);
});
```

コードを読むとFLAGが戻り値になっている部分があります。
```javascript
  if (array.length < 0) {
    // hmm...??
    return FLAG;
  }
  ```
  `const array = JSON.parse(sanitized);`が重要で、JSON方式で書かれた配列`sanitized`をJavaScript表現に変換しています。

例として以下のコードを示します。
```javascript
const json = '{"name": "Suzuki", "age": 20}';
const obj = JSON.parse(json);
console.log(obj.name);  // → "Suzuki"
console.log(obj.age);   // → 20
```
つまり、`array.length`はarray配列の長さを示すのではなく、arrayのlength(項目)の値を示します。
`'array={"length":-1}'`を引数として渡すとうまくいきました。

# 感想

実力不足であり、解くために十分な時間をとることができなかったです。精進します。
writeupを書くなら、解き方を明確に示して答えをメモしておくべきでした。
ChatGPTを使用したアプリ開発記【広告表示機能を実装】

## 実装コード

```App.js
　　　　　　　　{/* 広告を3件ごとに表示、配列は0からカウントされる為、1足されている。 */}
              {(index + 1) % 3 === 0 && (
                <div
                  style={{
                    padding: '1rem',
                    margin: '1rem 0',
                    backgroundColor: '#f9f9f9',
                    border: '1px solid #ccc',
                    textAlign: 'center',
                  }}
                >
                  <p style={{ fontWeight: 'bold' }}>スポンサーリンク</p>
                  <a href="https://qiita.com/Tomomitsu_Keruma" target="_blank" rel="noopener noreferrer">
                    <img
                      src="/Qiita_keruma_image.png"
                      alt="広告"
                      style={{ maxWidth: '100%', height: 'auto' }}
                    />
                  </a>
                </div>
              )}
```
## 広告バナー作成
ChatCPTにお願いしました。

![スクリーンショット 2025-05-08 9.01.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/f68c966b-733b-424c-b38c-33ab351bc119.png)

## UI

![スクリーンショット 2025-05-08 8.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/f2102102-7abe-4179-95ec-4cecadab1808.png)
【公ド読】GitHub Copilot Chat チート シート

【公式ドキュメントを読もうシリーズ】GitHub Copilot Chat チート シート

## シリーズ概要

[https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3](https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3)

## URL

[https://docs.github.com/ja/copilot/using-github-copilot/copilot-chat/github-copilot-chat-cheat-sheet](https://docs.github.com/ja/copilot/using-github-copilot/copilot-chat/github-copilot-chat-cheat-sheet)

## 説明

コマンドを使用方法について書かれている。公式ドキュメントと実際に叩けるコマンドで若干の差分があるように思われるため、気になる点をまとめてみようと思う。

### スラッシュコマンド

`/explain` ：コードを日本語で説明してくれる。前任者から引き継いだもののよくわからないコードに関しては、/explainで聞いちゃえば解決することも多くなりそう。

`/fix` ：修正箇所の提案をしてくれる。これも非常にいい。レビュー返してもらっている感じ。

`tests` ：このコマンドも良さそう。単体テストを作成してくれる。下地を作ってもらえるのは、相当な工数削減しながらも、安定したシステムの構築の一助になりそう。

`/new` ：指定したファイルを新規作成してくれる。新しいファイル作成するときは、便利そう。

#### スラッシュコマンドまとめ

新規作成～テストまで、すべてAIにやってもらえるんだと思った。

```
/new -> 新規作成
/fix -> 修正
/tests -> 単体テスト作成
```

を繰り返すことで、人間はプロンプトを入力して、確認する作業のみを担うことになりそう。

ほかにも`/help`を叩くことで、いろんなコマンドを提案してれるので、今後もやってみよう。

### チャット変数

`#changes` ：gitの変更点に関する質問やコード編集、レビューなどできる。変更点がプロジェクト内でどのように使われるかなど、使用する方法はたくさんありそう。

`#codebase` ：現在使用しているプロジェクト全体のコードをCopilotに参照させることができる模様。`#codebaseパスワード忘れた時のフロントエンドのページはどこですか？`など聞くと、パスや説明などしてくれる。これも知らないコード読むときとか、便利になりそう。

`#fetch` ：指定したURLの情報を取得することができる。

`#findTestFiles` ：指定したファイルがテストファイルだったら、そのテストの対象のコードのファイルを検索する。ソースコードのファイルだったら、テストファイルを探す。探すの面倒なときなどや既存プロジェクトへの参加で役に立ちそう。

`#problems` ：エラーメッセージの解決方法を教えてくれる。これ結構使えそう。先程の

```
/new -> 新規作成
#problems -> エラー修正
/fix -> 修正
/tests -> 単体テスト作成
```

とかでやってみてもいいかも。

`#usages` ：これでもコードの説明してくれる感じ。

`#testFailure` ：前回の単体テストの失敗に関する情報が入っている模様。

```
/new -> 新規作成
#problems -> エラー修正
/fix -> 修正
/tests -> 単体テスト作成
#testFailure -> テストエラーの確認
#problems ...
などで良いかも
```

#### チャット変数まとめ

より解像度の高いプロンプトエンジニアリングの方法が具体化されたようにも思う。どんどん使いたい。

### チャット参加者

`@`をCopilot Chatに入力することで、その専門知識を持つ専門家に質問できる模様。

`@github`
`@terminal`
`@vscode`
`@workspace`
`@remote-ssh`

などいろいろある。
remote-sshなど時間消費してしまう設定関係に関しても聞けるのが良さそう。
使い方とか聞けるのが、良いね。

## 所感

より具体的にGithub Copilot を使用する方法について学ぶことができた。
個人的備忘録：UIにやさしさを添える！bijyoモードのカラーコード一覧を整理してみた

## はじめに

本記事では、bijyoモード（スクールで作成中のアプリ）の実装における使用カラーコードとその役割について、実際のコードとともに整理します。

https://github.com/2025SpringTeamA/frontend/blob/main/src/app/beautiful-woman-mode/page.tsx

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

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

受講しているITスクールのハッカソンの開発の一環で忘れないように記事にまとめています。特にUI調整を行う際に、カラーコードの管理や統一が重要と感じたためです。

**こんな感じです**

![Screenshot 2025-05-09 at 7.19.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b350f3ce-2c15-4a70-a9b5-d6be9ea2355e.png)

## 内容

現在のbijyoモードでは、やさしく上品な印象を与えるピンク系を基調にした配色を採用しています。

以下は、bijyoモードの主要なUI構成とその該当部分の実装コードです。

### 入力欄・ボタン部分

```tsx
<div className="bg-[#fff0f5] border-[4px] border-[#d48fb1] rounded-xl shadow-md p-6 w-full max-w-xl">
  <h2 className="text-2xl font-bold mb-4">今日のつぶやき</h2>
  <textarea
    className="w-full h-32 border border-gray-300 rounded-md p-3 bg-[#fff7fa]"
    value={diaryMessage}
    onChange={(e) => setDiaryMessage(e.target.value)}
  ></textarea>
  <div className="flex justify-end mt-4">
    <button
      className="bg-pink-200 border-2 border-pink-500 shadow-md px-6 py-2 rounded-md font-bold"
      onClick={handleEnergy}
    >
      応援してもらう
    </button>
  </div>
</div>
```

### 応援表示欄

```tsx
<div className="bg-[#fff0f5] border-[4px] border-[#d48fb1] rounded-xl shadow-md p-6 w-full max-w-xl">
  <h2 className="text-2xl font-bold mb-4">美女からのやさしいエール</h2>
  <div className="w-full h-32 border border-gray-300 rounded-md p-3 bg-[#fff7fa] whitespace-pre-wrap overflow-y-auto">
    {cheerMessage || "ここに美女からの応援が表示されます"}
  </div>
</div>
```

### 使用カラーコード一覧

| 用途             | Tailwindクラス名              | カラーコード    | 色の説明              |
| -------------- | ------------------------- | --------- | ----------------- |
| 全体背景（フォーム枠など）  | `bg-[#fff0f5]`            | `#FFF0F5` | ラベンダーブラッシュ（淡いピンク） |
| 枠線色（フォームの外枠など） | `border-[#d48fb1]`        | `#D48FB1` | 明るいピンク系           |
| 入力欄の背景         | `bg-[#fff7fa]`            | `#FFF7FA` | ごく薄いピンク           |
| ボタン背景色         | `bg-pink-200`（Tailwind定義） | `#FBCFE8` | 優しいピンク            |
| ボタン枠線色         | `border-pink-500`         | `#EC4899` | 鮮やかなピンク           |
| 通常のグレー枠線       | `border-gray-300`         | `#D1D5DB` | 標準的なグレーボーダー       |

## まとめ

ピンク系の配色は感情的に穏やかで優しい印象を与えるため、応援メッセージを表示するbijyoモードとの相性が良いです。

今後もコンポーネント単位で背景色・枠線色などを分けて管理していくことで、スタイルの拡張や切り替えにも柔軟に対応していきます...！
8ビットの並びを逆転して遊ぶ その2


いろいろ、注意
----

- UNOでの予定は、未定


プログラム
----

オンラインコンパイラ　paiza

```c++

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    long a,b;
    
    a = 0b11110000;
    //a = 0b10000000;
    //a = 0b01000000;
    //a = 0b00100000;
    //a = 0b00010000;
    //a = 0b00001000;
    //a = 0b00000100;
    //a = 0b00000010;
    //a = 0b00000001;

    //printf("[%02x]\n",a);

    a = a << 7;
    b = 0b10000000 &  a;

    //printf("[%x]\n",b);
    
    a = a >> 2;
    b = b | (0b01000000 &  a);

    a = a >> 2;
    b = b | (0b00100000 &  a);
    
    a = a >> 2;
    b = b | (0b00010000 &  a);
    
    a = a >> 2;
    b = b | (0b00001000 &  a);
    
    a = a >> 2;
    b = b | (0b00000100 &  a);
    
    a = a >> 2;
    b = b | (0b00000010 &  a);
    
    a = a >> 2;
    b = b | (0b00000001 &  a);

    printf("[%02x]\n",b);

}


```

```

[0f]

```

おまけ


```


12345678901234567890
============12345678
            87654321
     87654321        <<7 =(1)
       87654321      >>2 =(2)
         87654321    >>2 =(3) 
           87654321  >>2 =(4)
            ********
             87654321       >>2 =(5)
               87654321     >>2 =(6)
                 87654321   >>2 =(7)
                   87654321 >>2 =(8)





```
asdfのバージョン違いで起こるpnpmコマンドが認識されない問題

## 経緯

先人の環境手順構築手順書を参考に、業務で使用するアプリの起動をしようとLinux環境（Ubuntu）でyarn devを実行したところコマンドが認識されない事象があった
→確認するとパッケージがyarnではなくpnpmに変更された
ので作業手順と、出てきた問題の対処法をメモとして残す。

## 実際の流れ
まずは、自分の環境でpnpm installを実行しようとするも、pnpmコマンドが認識されないので原因を調べた
結論としては構築手順書に記載の環境（0.16.0以前）から、最新のasdfのバージョン（0.16.0）で改修が加えられ手順やコマンドに変更が加わっていることが原因だった。


詳しく見てみると
>asdfはバージョン0.15.0以前まではBashで書かれていたが、
バージョン0.16.0はasdfをGoで完全に書き直した。

旨の文言が記載されていた。

自分の環境には最新のasdf、nodejsが入っていなかったため、最新版をダウンロードする
再度pnpm installを実行するもnodejsが見つからない旨のエラー（詳しいエラー内容は消えてしまった・・・）が出てきたのでその原因も調べる。
→nodejsが自分の環境に2種類インストールされていたため正常に動かなかった
なので、使用するnodejsを指定してあげる方法を探す。

## もう一つの問題点
調べた結果asdf globalコマンドが該当するとのことだったが、実際にコマンドを実行するも認識されない。
ので公式ドキュメントのほうを確認すると
>asdf global と asdf local コマンドが asdf set に変更された

また、それに伴いlistやplugin addのコマンドも変更されている。
>例）
asdf list-all -> asdf list all
asdf plugin-add -> asdf plugin add

あとは、asdf setでnodejsのバージョンを指定してあげてバージョンの前に(*)が付いてきちんと選択されたことを確認して再度pnpm installを実行すればpnpmコマンドが認識されるようになった


詳細な手順は以下の公式ドキュメントを参照
https://asdf-vm.com/ja-jp/guide/upgrading-to-v0-16.html
windows11で、sketchup6 その104

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題やってみた。

# 練習問題
九九をアニメーションせよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2c8fc649-5a04-4ba6-a686-d3205774c2fc.png)

# サンプルコード

```

class Kuku2
	def initialize
		model = Sketchup.active_model
		@entities = model.active_entities
		coordinates = [10, 10, 10]
		@point = Geom::Point3d.new coordinates
		@text = @entities.add_text "This is a Test", @point
		@group = @entities.add_group
		pts = []
		pts[0] = [0.5, 0.5, 0.5]
		pts[1] = [  1, 0.5, 0.5]
		pts[2] = [  1,   1, 0.5]
		pts[3] = [0.5,   1, 0.5]
		base = @group.entities.add_face pts
		base.pushpull 0.5
		@k = 0
		@tid = UI.start_timer(2.9, true) {
			tick
		}
	end
	def tick
		@text.erase!
		@group.erase!
		i = Integer(@k / 9) + 1
		j = @k % 9 + 1
		@text = @entities.add_text "#{i}x#{j}=#{i * j}", @point
		@group = @entities.add_group
		(1..i).each { |x| 
			(1..j).each { |y| 
				puts "#{x} #{y}"
				pts = []
				pts[0] = [x + 0.5, y + 0.5, 0.5]
				pts[1] = [x +   1, y + 0.5, 0.5]
				pts[2] = [x +   1, y +   1, 0.5]
				pts[3] = [x + 0.5, y +   1, 0.5]
				base = @group.entities.add_face pts
				base.pushpull 0.5
			}
		}
		@k += 1
	end
end


```

以上。
連続型確率分布_0

# <font color="Red">連続型分布の種類まとめ</font>

確率分布のロードマップで非常に分かり易い説明をされているページがあるので紹介。

https://academ-aid.com/statistics/summary-dists#index_id17
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800268/f8f56b0e-8a89-4ece-bbc0-35f6125b28f0.png)

連続型確率分布の一覧。

|連続一様分布| 特徴 | 特記事項|
|:-|:-|:-|
|[連続一様分布](https://qiita.com/SumMae/items/5497ec9263ce011b9ba1 "連続一様分布のページ")|全て等確率<br>サイコロなど|なし|
|[正規分布](https://qiita.com/SumMae/items/82bef53d45d0e4961a4f "正規分布のページ")|「自然な」バラつき|再生性あり|
|[標準正規分布](https://qiita.com/SumMae/items/82bef53d45d0e4961a4f "正規分布のページ")|標準化した正規分布|「標準正規分布表」から値を読み取って検定に利用される<br>標準化するという点で様々利用される|
|対数正規分布|年収額の分布<br>幾何ブラウン運動の分布|積について再生性あり(対数なので)|
|指数分布|事象が次に起こるまでの「時間」の分布<br>「周期」について述べる|ガンマ分布は「a回起こるまで」に拡張したもの<br>ポアソン分布は「回数（周波数）」について述べる<br>幾何分布は時間を「試行回数」に置き換えた離散分布<br>無記憶性あり|
|ガンマ分布|指数分布に「a回起こる」という拡張をしたもの|再生性あり(b共通の場合)<br>ベイズ統計で頻出（指数分布、ポアソン分布の共役事前分布として）|
|ベータ分布|コイントスで表：a回、裏：b回を得たときの「表が出る確率pの（事前）分布」|０～１の値を取り、ベイズ統計で頻出（ベルヌーイ分布、二項分布の共役事前分布として）|
|コーシー分布|ガウス分布に似ているが、期待値・分散が定義されない<br>強制振動の共振時の複素振幅がこれに従う|期待値・分散無し<br>（定義式の発散により。確率密度関数の積分値は1）|
|[χ2乗分布](https://qiita.com/SumMae/items/b0d452a3b8aa37231379 "χ2乗分布のページ")|「標準積分布の確率変数」の2乗和<br>分散に関する検定|再生性あり<br>理想曲線と実験値との乖離を評価（残差が正規分布に従うことを前提として）|
|[t分布](https://qiita.com/SumMae/items/d48c5f5f8fbf24c2500a "t分布のページ")|平均値に関する検定<br>小標本の実験データから高精度な検定ができる|詳細は追って記載したい|
|F分布|2つの分布の分散比の検定|詳細は追って記載したい|

追って、各記事作成して更新予定
【AI活用】プロンプト管理はSnippetsLabで決まり！最速呼び出し術【業務効率化】

日々の業務で繰り返し使うプロンプトや定型文、AI活用の指示文などを、どう効率的に管理・呼び出すかは生産性に直結します。テキストファイルからのコピペや、ユーザー辞書への登録も試しましたが、Macユーザーなら「SnippetsLab」を使うことで、より快適にプロンプト管理ができます。

![スクリーンショット 2025-05-09 5.28.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268351/b6f8f72c-8dce-4603-bdfe-f5b9c29d081f.png)

## この記事でわかること
- SnippetsLabを使ったプロンプト管理のメリット
- ショートカットや検索を活用した素早い呼び出し方法
- 業務効率を上げるための具体的な設定・運用Tips

## 対象読者・前提条件
- Macを業務で利用しているビジネスパーソン
- よく使うプロンプトや定型文を効率的に管理したい方
- SnippetsLab未経験～初心者

## SnippetsLabとは？
SnippetsLabは、コードや文章のスニペット（断片）を効率的に管理・呼び出せるMac専用アプリです。どちらかと言えばエンジニア向けのアプリですが、テキストをスピーディに呼び出すという機能は普遍的に使えるため、非エンジニアの方も入力の効率化に役立ちます。

主な特徴は以下の通りです。

- フォルダやタグで整理できる
- 420以上の言語に対応したシンタックスハイライト
- 検索・フィルタリングが高速
- ショートカットでどこからでも呼び出し可能
- iCloudやDropbox等での同期に対応
- Markdown・LaTeXにも対応し、業務用途にも最適

## 手順

### 1. インストール
App Storeから「SnippetsLab」をダウンロード・インストールします。  
[SnippetsLab（App Store）](https://apps.apple.com/jp/app/snippetslab/id1006087419?mt=12)

### 2. 初期設定
- 起動後、プロンプトを「スニペット」として登録します
- フォルダで分けておくと管理が楽になります
- プロンプトの頭に【要約】などキーワードをつけておくと、検索・選択時に便利です。例：【要約】一言で簡潔に表現してください
![スクリーンショット 2025-05-09 5.28.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268351/b6f8f72c-8dce-4603-bdfe-f5b9c29d081f.png)

### 3. プロンプトの呼び出し
- 設定したショートカットで「Assistant」を呼び出し（要設定）
- 検索窓にキーワードを入力し、目的のプロンプトを選択
![スクリーンショット 2025-05-09 5.21.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268351/4c008cc5-54d4-445e-a58b-8e3e54f234a6.png)
- プロンプトを選択するだけで、カーソルの位置に自動入力（要設定）
- 基本的にキーボードから手を離さずに入力することができます

### 4. ショートカットの設定
- メニューバーの「SnippetsLab」＞「設定」＞「Assistant」タブに移動
- 「Toggle Assistant:」で呼び出し用ショートカットを設定（例：Shift + Command + 2）
- 他のアプリと重複しないキーを選ぶのがコツです。
![スクリーンショット 2025-05-09 5.18.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268351/f0005fba-327c-4a79-8b40-163f4b8d1beb.png)

### 5. 選択／自動入力の設定
- メニューバーの「SnippetsLab」＞「設定」＞「Assistant」タブに移動
- 「Click / Return:」の設定で「Paste to Active App」を選択しておくと、選択したプロンプトがそのままカーソル位置に自動入力されます

## 注意点
- ショートカットは他アプリとの競合に注意して設定しましょう
- バックアップやiCloud同期設定（複数のMacで入力環境を統一できます）も忘れずに

## まとめ
SnippetsLabを活用することで、よく使うプロンプトや定型文を「素早く」「一貫性を持って」呼び出せるようになります。日々の業務効率化や、AI活用の幅を広げたい方はぜひ導入を検討してみてください。


## 参考資料
- [SnippetsLab公式マニュアル](https://www.renfei.org/snippets-lab/manual/mac/essentials.html)
- [SnippetsLab（App Store）](https://apps.apple.com/jp/app/snippetslab/)
- [SnippetsLabの使い方Tips（Sou-Lablog）](https://sou-lab.com/snippetslab/)
【Rails初学者】部分テンプレートでundefined local variable or method 'article'エラーが出た原因と解決方法

## 【Rails】エラーで、部分テンプレートでundefined local variable or method 'article'が出た原因と解決方法

こんにちは。
現役の看護師で、エンジニア転職を目指している者です。
Railsでブログアプリを作っていたとき、以下のようなエラーに遭遇しました。

```
NameError in Articles#index
Showing app/views/articles/_article.html.erb where line #1 raised:

undefined local variable or method `article' for an instance of #<Class:0x...>
```
`_article.html.erb`の先頭で定義されている変数articleが使えない、というエラーです。

## 問題のコード
まず、エラーが出ていた時点のコードはこちらでした。
### app/views/articles/index.html.erb
```erb
<div class="container">
  <%= render 'tabs' %>

  <% @articles.each do |article| %>
    <%= render 'article' %>
  <% end %>

  <%= link_to new_article_path do %>
    <div class="float_btn">
       <i class="fa fa-plus"></i>
    </div>
  <% end %>
</div>
```
### app/views/articles/_article.html.erb
```erb
<%= link_to article_path(article) do %>
  <div class="card">
    <div class="card_image">
      <%= image_tag 'eyecatch1.png' %>
    </div>
    <div class="card_content">
      <div class="card_title">
        <%= article.title %>
      </div>
      <div class="card_heart">
        <%= image_tag 'heart.svg' %>
        <span>23</span>
      </div>
      <div class="card_detail">
        <%= image_tag 'default-avatar.png' %>
        <div>
          <p>chibacity</p>
          <p><%= article.display_created_at %></p>
        </div>
      </div>
    </div>
  </div>
<% end %>
```

## エラーの原因
`render 'article'`と書いただけでは、`_article.html.erb`に`article`というローカル変数が渡されないらしいです。
`Rails`で部分テンプレートに変数を渡したい場合は、ローカル変数として明示的に渡す必要があります。

## 解決方法
以下のように修正しました
```erb
<% @articles.each do |article| %>
  <%= render 'article', article: article %>
<% end %>
```
このように書くことで、 `_article.html.erb`内で`article`というローカル変数が使えるようになります。

## 学び
- `render 'partial_name'`だけではローカル変数は渡らない
-  `undefined local variable or method`が出たら、まずローカル変数の渡し忘れを疑う
- Railsを触り始めたばかりだと見落としてしまいがちの、部分テンプレートの基本的な使い方を身につけると、ビューがずっと読みやすくなりそうです。

引き続き、学習を進めます。
旧RPGの目次


[新RPGの目次](https://qiita.com/hijpa/items/31900e327315fa8e4eea)

[pygameでRPG（戦闘画面）](https://qiita.com/hijpa/items/4725d4665229fc3e4d0d)

キーハンドラー　マウス操作　Zキーが押されたら数字が減る　隅が丸い枠
三角形の描画(カーソル風)　戦闘画面　枠の点滅　モンスター画像の点滅　

[pygameでRPG（タイトル画面）](https://qiita.com/hijpa/items/81caffd7a78cc0a9870b)

画面表示　テキスト表示　効果音を鳴らす　BGMを鳴らす　選択肢を作る
線の描画　 背景の描画　タイトル画面　画面切り替え　

[pygameでRPG（キャラクター移動）](https://qiita.com/hijpa/items/dd2aafa7fdae6c9cc720)

キャラクター描画　キャラクター移動　キャラアニメ　
向きを変えながら歩く　スクロール　セーブとロード　ファイルの中身を表示

[pygameでRPG（マップ作成）](https://qiita.com/hijpa/items/4720e39f7c322d1891f0)

リストでマップを作る　２次元配列でマップを作る　リストに画像を格納してマップを作る
テキストファイルをロードしてマップを作る

[pygameでRPG（マップエディター）](https://qiita.com/hijpa/items/2f1e25444cf2a6f15f53)

変更箇所の追加　変更箇所　８bitから１６bitへ　作業中の座標を記録する
mapchipをトリミング　マップ範囲外もdefaultで描画　defaultを変更
MapchipPaletteでID番号を表示 おおきめmapchip

[pygameでRPG(マップチップ追加の流れ)](https://qiita.com/hijpa/items/fe5215a97c708c0ddf10)

トリミング　ファイル名変更　貼り付け　mapchip.dat書き込み

[pygameでRPG(会話など)](https://qiita.com/hijpa/items/32c2fefb2f3a61374020)

図形　枠　テキスト改行　会話する　宝箱を開ける　宿屋

[pygameでRPG(お店)](https://qiita.com/hijpa/items/f904038928123b1a877a)

お店(買うだけ)　カーソル画像作成　お店(売り買い)

[pygameでRPG(メニュー画面)](https://qiita.com/hijpa/items/8b14b240b2b3b1d98dfe)

メニュー画面

-----------------------------------------------------------------------------

[pygameでRPG(画像追加)](https://qiita.com/hijpa/items/38158786126c63122023)

フォルダ内のすべてのファイルに追加　フォルダ内のすべてのファイルに追加２

[pygameでRPG（セーブ画面）](https://qiita.com/hijpa/items/5d551ec6cc3c2769d751)

時間の計測　年月日と時刻　セーブ画面

[pygameでRPG（透明）](https://qiita.com/hijpa/items/6ea010f88bbc4ab8bc0e)

半透明の図形　マウスで半透明の図形表示　フェードアウト　テキスト明滅
透明テキスト(マスク)　半透明の画像　画像にグラデーション
画像の一部を半透明

[pygameでRPG](https://qiita.com/hijpa/items/ea217d19f290535f583d)

ダメージアニメ HPゲージ

[pygameでRPG（アイテム）](https://qiita.com/hijpa/items/0ddc458aca5acff52f65)

選んで消す　アイテムリスト

[オープニング](https://qiita.com/hijpa/items/cbcc9c7b283a55e6544c)

流れるメッセージ　明滅するテキスト

[テキスト](https://qiita.com/hijpa/items/e3bfe4b61fb8869d611c)

中央寄せ　右寄せ　現れて消える

[exe化](https://qiita.com/hijpa/items/6c4788a001b21e86d656)

まとめてBGMを暗号化　BGMを複合化　exe化

[いろいろ](https://qiita.com/hijpa/items/fadcc3fb8a7cb62a2d4d)

画像の輪郭　アニメーション　カウントダウン　UIのサイズの変更



# 目次の目的

読者の方に記事全体を俯瞰してもらうためです。
(最近追加された項目に印がついています)
GTSAMのインストール方法 - Python Wrapper編

# GTSAMとは

GTSAMはFactor Graphベースの最適化ライブラリで、SLAM（Simultaneous Localization and Mapping）やロボティクス分野で広く使われています。この記事では、GTSAMのPython Wrapperをインストールする方法を紹介します。

## pipでのインストールができなかった
ネットで調べたり、chatgptによると以下のコマンドでインストールできると言われました。
```bash
pip install gtsam
```
しかし、自分の環境では上手くいかなかったです。そこでソースファイルからbuildしてインストールする方法を実行したので備忘録として記録しました。自分がビルドする際にエラーが出た際の解決方法も最後に載せているので、参考になったら幸いです。

## 参考リンク

基本的に公式ドキュメントに記載されている手順に従いますが、いくつか発生する可能性のあるエラーとその解決方法も合わせて紹介します。

- [Python Wrapper インストール手順](https://github.com/borglab/gtsam/blob/develop/python/README.md)
- [GTSAM 公式README](https://github.com/borglab/gtsam/blob/develop/README.md)

## 前提条件

Python Wrapperには以下のパッケージが必要です：
- pyparsing (>=2.4.2)
- pybind-stubgen (>=2.5.1)
- numpy (>=1.11.0)

これらは次のコマンドでインストールできます：

```bash
pip install -r <gtsam_folder>/python/dev_requirements.txt
```

> 注: `<gtsam_folder>`はクローンしたGTSAMリポジトリのパスに置き換えてください。

## インストール手順

### 1. リポジトリのクローンとビルド準備

```bash
# リポジトリをクローン
git clone https://github.com/borglab/gtsam.git

# クローンしたディレクトリに移動
cd gtsam

# ビルドディレクトリを作成
mkdir build
cd build

# CMakeの実行（Pythonラッパーを有効化）
cmake .. -DGTSAM_BUILD_PYTHON=1 -DGTSAM_PYTHON_VERSION=3.8.10
# ※ Pythonのバージョンは環境に合わせて適宜変更してください
```

> **重要**: buildディレクトリは必ずgit cloneした一番上のディレクトリ（gtsam/）に作成してください。Python wrapperだからといって`python/`ディレクトリ内に移動しないでください。

### 2. ビルドとインストール

```bash
# ビルド実行 (-jの後の数字はCPUコア数に応じて調整)
make -j12

# Pythonパッケージとしてインストール
make python-install
```

## 遭遇したエラーと解決方法

インストール中に以下のようなエラーが発生しました。

### makeコマンド実行時のエラー

```
#warning "IncrementalFixedLagSmoother was moved to the gtsam/nonlinear directory"
```

このエラーは、GCCの拡張として警告を発生させ、`-Werror`（警告をエラーとして扱う設定）によりビルドエラーになっています。C++23より前の仕様では`#warning`が正式には標準に含まれていないため発生します。

#### 解決方法
このファイルを編集します：
`gtsam/gtsam_unstable/nonlinear/IncrementalFixedLagSmoother.h`

問題の行をコメントアウトしても問題ありません。この警告はただ単にファイルが移動したことを伝えるメッセージなので、削除しても機能には影響しません。

### cmakeコマンド実行時のスタブ生成エラー

```
make[3]: *** [python/CMakeFiles/python-unstable-stubs.dir/build.make:107: python/CMakeFiles/python-unstable-stubs] Error 1
make[2]: *** [CMakeFiles/Makefile2:43395: python/CMakeFiles/python-unstable-stubs.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:43506: python/CMakeFiles/python-install.dir/rule] Error 2
```

#### 解決方法
スタブファイルはIDE補完や型チェッカー用であり、GTSAMのPythonラッパーを実行するだけなら必須ではありません。

`gtsam/python/CMakeLists.txt`を開き、以下の部分を：

```cmake
add_custom_target(
  python-unstable-stubs
  ...
)

add_custom_target(
  python-stubs
  ...
)
```

次のように書き換えます：

```cmake
add_custom_target(python-unstable-stubs
  COMMAND ${CMAKE_COMMAND} -E echo "Skipping stub generation for gtsam_unstable."
)

add_custom_target(python-stubs
  COMMAND ${CMAKE_COMMAND} -E echo "Skipping stub generation for gtsam."
)
```

これによってスタブ生成をスキップし、代わりにダミーコマンドを実行するようになります。

## インストール確認

インストールが完了したら、Pythonから次のようにインポートできることを確認します：

```python
import gtsam
print(gtsam.__version__)
```

## まとめ

GTSAMのPython Wrapperのインストールは基本的には簡単ですが、いくつかのエラーに遭遇することがあります。この記事で紹介した解決策を用いることで、スムーズにインストールできるはずです。

何か問題がありましたら、コメントでお知らせください！
8ビットの並びを逆転して遊ぶ その1


いろいろ、注意
----

- UNOでの予定は、未定



プログラム
----


```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    long a;
    
    a = 0b11110000;
    //a = 0b10000000;
    //a = 0b01000000;
    //a = 0b00100000;
    //a = 0b00010000;
    //a = 0b00001000;
    //a = 0b00000100;
    //a = 0b00000010;
    //a = 0b00000001;

    //printf("1[%x]\n",a);
    a = a | (a << 8);
    //printf("2[%x]\n",a);
    a = (a & 0b000110011000000 ) | ( (a << 4) & 0b011001100000000 );
    //printf("3[%x]\n",a);
    a = (a & 0b010101010000000 ) | ( (a << 2) & 0b101010100000000 );
    a = a >> 7;
    printf("[%02x]\n",a);

}

```

```

[0f]

```

おまけ
----

```


1234567890123456789012345
                 44332211
         44332211    <<8
        0b000111111110000      
             22114433 
        0b000110011000000       
         22114433    <<4
        0b011001100000000 
           11223344      
           badcfehg      
        0b010101010000000
         badcfehg    <<2 
        0b101010100000000
          abcdefgh      *
                 abcdefgh  >>7
                           


```
Geminiでユーフォニアムを使う魔法少女を描いてみた。

# 概要

Geminiでユーフォニアムを使う魔法少女を描いてみました。

# 実装

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

```
光のユーフォニアムを使う魔法少女を描いてください。
```

![光のユーフォニアムを使う魔法少女_20250509.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/470019f2-7639-46ca-a1bb-987d80be2a1a.png)


```
闇のユーフォニアムを使う魔法少女を描いてください。
```

![闇のユーフォニアムを使う魔法少女_20250509.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/c33f9d5b-703f-44cf-ab81-2481cebe481f.png)



```
聖なるユーフォニアムを使う魔法少女を描いてください。
```

![聖なるユーフォニアムを使う魔法少女_20250509.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/dcf8cdb8-5156-4bdc-9d42-ecb1951efec9.png)

# まとめ

聖の子は可愛い。
何かの役に立てばと。
マテリアルエクスプローラ

コバルト置換および空孔を含むニッケル構造（Ni-Co_Ni-Vac_Ni）、3×3×3 バルク超格子セル。

オンライン  in マテリアルバンクでオンライン公開中: https://platform.mat3ra.com/bank/materials

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022238/da8d4bcf-be9c-4d85-82ad-6aefb45acc1a.jpeg)
テキストデータから英単語を抽出するシェルスクリプト（ChatGPT）

こんにちは。
テキストデータから英単語を抽出するシェルスクリプトを作るよう ChatGPT へ依頼し、その回答を基にしてシェルスクリプトを編集し完成させました。満足できそうな水準かなと思いました。

### ChatGPT への質問
「与えたテキストデータから自然な英単語のみを全て抽出するシェルスクリプト、および、そのヘルプメッセージを作ってください。」

#### ChatGPT からの回答（抜粋）
了解しました！
```sh
# 入力ファイルが指定されていればそれを、なければ標準入力から読み込む
INPUT="${1:-/dev/stdin}"
# システム辞書を使って照合（辞書に存在する単語のみ表示）
tr -cs 'A-Za-z' '\n' < "$INPUT" | grep -iFx -f /usr/share/dict/words
```

### 完成させたシェルスクリプト
上記回答を基にして編集を加え、完成させました。

```extract_words.sh
#!/bin/sh

# constants
TRUE="true"
LF=$(printf '\n_');LF=${LF%_}

# messages
PROGNAME=$(basename "$0");
WARNING_HEAD="Warning: Type \"$PROGNAME --help\" for usage instructions."
USAGE="
Usage:
  $PROGNAME [INPUT_FILE]$LF
Description:
  Extracts all Latin-alphabet words (A–Z, a–z) from the input and filters out unnatural or invalid ones by comparing them against a system dictionary (/usr/share/dict/words).$LF
  If no input file is specified, standard input is used.$LF
Options:
  -h, --help    Show this help message and exit.$LF
Examples:
  echo \"Ths is an example text.\" | $PROGNAME | sort -u
"

# functions
append_warning_f() {
  [ -z "$warning" ] && warning="$1" || warning="$warning$LF""$1"
}

# parsing optional arguments
while [ $# -gt 0 ]; do
  case "$1" in
    -h|--help)   help_enabled=$TRUE;;
    -*)          append_warning_f "Unknown option: '$1'"; break;;
    *)           break;;
  esac
  shift
done

# confirmations
for file in "$@"; do [ -e $file ] || append_warning_f "file not found: '$file'"; done

# warn or print usage instruction
if [ -n "$warning" ]; then
  echo "$WARNING_HEAD" >&2
  echo "$warning" | sed -e 's/^/- /' >&2
  exit 1
elif [ -n "$help_enabled" ]; then
  echo "$USAGE" | fmt -w78
  exit
fi

# main
cat "$@" | tr -cs 'A-Za-z' '\n' | grep -iFx -f /usr/share/dict/words
```
商用車・モビリティなどまとめ

## トラックの重要用語
### キャブ(キャビン)
トラックの運転席部分のことを**キャブ**という

### シャシ(シャーシ)
走行可能状態において仮装部分を乗せるところを**シャシ**という。走行可能ではなく骨格のみの場合「**フレーム**」と呼ぶ
### ディーゼルエンジン
トラックの大半はディーゼルエンジン、軽油で動く

### アクスル
アクスルとは自動車の走行装置のなかの車軸のことである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3171994/65b1ea46-70c2-405d-b356-4bca97c478c2.png)
出典：https://www.presskogyo.co.jp/products/car/axle/

#### アクスルの種類
- フロントアクスル (車両荷重の分担と操舵の役割)
- リアドライブアクスル (車両荷重の分担と駆動力を車輪に伝達する役割)
- リアデッドアクスル (車両荷重の分担の役割のみ)

### PTO(Power Take Off)
PTOはさまざまな作業をするための動力をトラックのエンジンから取り出す装置である。
エンジンのトランスミッションなどに取り付けられており、エンジンの回転を油圧に変換することで、さまざまな作業の動力を生み出している。
トラックのエンジンは、普段は走行するために使用されるが、ミキサー車のドラムの回転、あるいは消防車の放水作業時など、大きな動力が必要となる。


## トラックの仮装メーカー
日本フルハーフ株式会社 ⇒ トレーラ・タンクローリ・ダンプ・バン／ウイングなど
新明和工業株式会社 ⇒ 様々な仮装
極東開発工業株式会社 ⇒ 様々な仮装
株式会社モリタ ⇒消防車の仮装など

## アメリカのトラックの車両分類用語
アメリカではGVWR(定格車両総重量)によってLD、MD、HDの3種類に対してClass1から8が割り当てられており、よく商用車業界で使われる分類である。
- **LD**(Light duty) 軽小型、小型
- **MD**(Medium duty) 中型S 中型L
- **HD**(Heavy duty)　大型及び特殊

Dutyは負荷や業務、用途といった意味合いで使われる用語である。
![トラック分類.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3171994/e166c6e7-0865-48ce-81eb-f18632a13b46.png)
出典：https://www.toishi.info/car/ld_md_hd.html
Databricks AI/BIダッシュボードのサンキー図を作ってみた

## 前提
・利用環境：Databricks

https://www.databricks.com/jp/try-databricks?scid=7018Y000001Fi15QAC&utm_medium=paid+search&utm_source=google&utm_campaign=17377047998&utm_adgroup=138148229998&utm_content=trial&utm_offer=try-databricks&utm_ad=732035937815&utm_term=databricks%20%E3%83%88%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%AB&gad_source=1&gclid=CjwKCAiA8Lu9BhA8EiwAag16b8b3zbkIb3V7gp-8VUwKukXnhtVZRQ-1RY8SbETmGVgNT4bQramYmRoCX5wQAvD_BwE#account

## 参考ドキュメント

https://www.databricks.com/jp/blog/whats-new-aibi-april-2025-roundup

https://docs.databricks.com/aws/ja/dashboards/visualizations/types#sankey-diagram

## 参考ブログ
https://qiita.com/taka_yayoi/items/90179db8406f518c39f5

## 操作手順（動画）
<iframe width="100%" height="315" src="https://www.youtube.com/embed/gPmho1kdXkY?si=ju1IJkcz2Y8cttmg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
取り急ぎ最低限の環境でProxmoxとCeph構築

前回です

https://qiita.com/shimeji_k/items/38644fea1500a246f3c3

ネットワークの見直しと配線がとりあえず完了
=========

DELL S4048-ON/HP DL380 Gen10用のFLRスロット用のSFP+拡張カード/HP DL380 Gen10用のリダンダント電源
が届きましたので、そろそろテストでは無くかなり本番に近い環境で構築を開始です。

ネットワークは色々試行錯誤しましたが
![ceph_proxmox_Network.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/953958a0-c9ec-4f18-b82b-4330a26f242a.jpeg)

前回の図のまま
VRRPなどは設定していなかったりしますけど

とりあえずはこんな感じ
![S__17825807.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/4a47d7bb-67e7-441c-91a5-a65db9294337.jpeg)

ネットワーク棚の中間にS4048-ON入れようとしたら奥行きが足らんかった・・・
仕方ないからその場所にRTX1200とGS924M V2とGS916Lを入れてあげよう


サーバー個体は2台だけとりあえずセットアップして
Proxmoxクラスタ組んで

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/8ae7b7b2-f0dd-482a-87c2-c886f9755bcb.png)

とうとう
クラスタとCephが組み上がりました！

Cephのノードが現在2台というリスキー仕様ですがまぁ暫定ということでw

各サーバーにSSD6本ずつ入れて計12台での稼働です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/32ffebb7-aeed-4691-a029-5aa788a9dbe8.png)

そして、、、HDDをベンチをとってみました
![スクリーンショット 2025-05-09 003031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/24ad59a5-7a8b-4046-90e4-eb4d40ccda7d.png)
![スクリーンショット 2025-05-09 002959.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/d6d17dcd-da5e-4937-9a7f-a194b8ca41fb.png)

お！やっぱり10Gbpsの恩恵うけてる！ネットワークをハブの物理量で分離しまくったのも良かったのかも？
これなら実用に耐える！？かも？

後は、2028TP-DC1Rの2台を追加してHDDプールを作ったらある程度は綺麗にまとまる感じかな？？

ケーブル作りすぎて疲れた

ちょっとだけ
S4048-ONをオークションで買って色々設定したんだけど
OS9めちゃくちゃ癖がある気がする
YAMAHAとアライドテレシスしか触ってこなかったから斬新で楽しかったけどほぼ1日潰れた
ハブのOS入れ替えて遊んでもいいかな？とも考え始めてます


続いた

https://qiita.com/shimeji_k/items/81a0dac0f33187b5f61e
ABC213

# ABC213

https://atcoder.jp/contests/abc213

灰 灰 茶 茶 水 黃 ？ 赤

## A - Bitwise Exclusive Or
`B xor A`を実装する
`^`を使えば良いので`(B ^ A)`とすれば良い
出力にそのまま`B ^ A`を入れると優先順位で負けるのでカッコを付ける

```cpp:ABC213_A
int A, B; cin >> A >> B;
cout << (B ^ A) << endl;
```

## B - Booby Prize
リストにpair方でスコアとナンバーを記録してソートをかけて(後ろから)2番めを出力

```cpp:ABC213_B
int N; cin >> N;
vector<pair<int, int>> A(N);
for (int i = 0; i < N; i++) {
    int x ; cin >> x;
    A[i] = make_pair(x, i);
}
sort(all(A));
cout << A[N - 2].second + 1 << endl;
```

## C - Reorder Cards
ザ座標圧縮

https://drken1215.hatenablog.com/entry/2021/08/09/235400

理解しきることはできなかったので自分なりにアレンジ
重複を削除したリストを作りソートをかける
小さい方から順に数字を割り当て、それをsetにいれる
setを経由することで番号を更新する

今回の問題はX軸Y軸があるが別々に独立で考えて良い

重複の処理に注意
eraseはソートをかけてから！（1敗

```cpp:ABC213_C
int H, W, N; cin >> H >> W >> N;
vector<int> X(N), Y(N);
for (int i = 0; i < N; i++) cin >> X[i] >> Y[i];
vector<int> x = X, y = Y;
sort(all(x));
x.erase(unique(all(x)), x.end());
sort(all(y));
y.erase(unique(all(y)), y.end());
map<int, int> Mx, My;
for (int i = 0; i < x.size(); i++) {
    Mx[x[i]] = i;
}
for (int i = 0; i < y.size(); i++) {
    My[y[i]] = i;
}
for (int i = 0; i < N; i++) {
    cout << Mx.at(X[i]) + 1 << ' ' << My.at(Y[i]) + 1 << endl;;
}
```

## まとめ
今日は3問だけ
4問目DFS中なんですけど関数でやるの苦手で避けてたら必須ぽかったのでやり直す事になってますー
時間ないので明日追記します
PowerShellでStarshipのプリセットを使用する方法

## はじめに

PowerShellにStarshipを導入している人向けに、
プリセットを適用する方法を紹介する。

## Starship とは

https://starship.rs/ja-JP/

```text
シェル用の最小限の、非常に高速で、無限にカスタマイズ可能なプロンプトです！
```

## 導入方法

### 前提

- Windows 11
- PowerShell
    - Nerd Font 推奨

## 手順

Starshipのバイナリをインストール

```shell
winget install starship
```

`Microsoft.PowerShell_profile.ps1` を開く

```shell
notepad $PROFILE
```

ps1ファイルの末尾に以下のコードを追加し、PowerShellを再起動

```shell
Invoke-Expression (&starship init powershell)
```

## プリセットを使用する方法

### 結論

`$HOME`を使用する。

```shell
starship preset nerd-font-symbols -o "$HOME\.config\starship.toml"
```

### エラーとなる理由

PowerShellでは、公式で紹介されているコマンドは、そのままでは実行できない。
`指定されたパスが見つかりません。 (os error 3)`というエラーがでる。

```shell
starship preset nerd-font-symbols -o ~/.config/starship.toml  # PowerShell ではエラーとなる
```

これは、PowerShell では `~` は自動で展開されないためである。

### プリセットの場所

https://starship.rs/ja-JP/presets/
Bubbleでブラウザバック時に一部要素を非表示にする方法【セッション維持時の表示制御】


現在、Bubbleで簡単なタスク管理ツールを開発しています。
その中で 「ブラウザの戻るボタンを押した際にログイン中の表示が残ってしまう」 という問題に当たりました。
やりたかったことと最終的な解決方法について備忘として残します。

## やりたいこと：ログイン時のみヘッダーリンクを表示したい
ログイン状態ではヘッダーにリンクを表示し、未ログイン状態ではそれらを非表示にしたい。

ログイン時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726233/4855dbf1-6408-4e44-8e49-1d3da5e7de85.png)

未ログイン時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726233/a6c4ec29-b2b1-4172-93a2-27224678a493.png)

## 発生した問題：ブラウザバックでリンクが残ってしまう
ログイン後の画面である /tasks に遷移したあと、ブラウザの「戻る」ボタンで /index に戻ると、本来非表示になるはずのリンクがそのまま表示された状態になってしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726233/ed9199f9-6583-493c-9fcd-749f6f67b598.png)

### 原因と元の実装
元々は、Reusable Header 内の Group Header Right に対して以下のような Conditional を設定していた

> When Current User is logged in

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726233/63bc9411-1f4a-4d44-a8d9-2a781854f885.png)

しかし、ブラウザバックではセッションは維持されたままになるため、Bubble上では引き続き「ログイン中」と判断されてしまった。
結果本来表示されるべきでないリンクが残ってしまった。

## 解決策：Current page name を使って非表示制御
最終的に「Current page name is index のときこの要素は非表示にする」制約をConditionalに設定することで解決。
アドレスバー上は /index に見えていても、Bubble内部的には /tasks にいる状態のままになるため、/index の場合は非表示にするという設定で解消できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726233/4114ede5-3778-44d8-9455-f0192e3a9fc3.png)

## そのほか試したこと
・Custome Event の作成
Bubbleではブラウザの「戻るボタン」などのブラウザネイティブ操作をトリガーにすることができないため、イベントが発火せず断念

・Java Script を組み込む
Run JSプラグインを使ってスクリプトを書くことは可能だったが、
Bubble内部のCustom State更新やイベントのトリガーをスクリプト側から制御するのが難しく、意図した条件分岐が実現できず断念

## ちなみに
むきになって戻るボタン押下時はヘッダーからリンクを消す、という実装にしましたが、
完了した後他のサイトどうなんだろうと思いRecoruで試してみたところ、戻るボタン押下時はログイン後の画面にリダイレクトしました。
それでもよかったなと少し後悔、、（勉強になったからいいですが涙）
OpenAI Agents SDKのサンプルコードを読む（エージェントの並列実行）

# 読んだサンプルコード
* [parallelization.py](https://github.com/openai/openai-agents-python/blob/main/examples/agent_patterns/parallelization.py)
    * OpenAI Agents SDKのCommon agentic patternsの[Parallelization](https://github.com/openai/openai-agents-python/blob/main/examples/agent_patterns/README.md#parallelization)のサンプル

# Parallelization（エージェントの並列実行）とは
* 複数のエージェントを並列で実行すること
* 以下のような点で役立つ
    * レイテンシーを小さくすることができる
    * その他の理由
        * 例）複数の回答を生成したうえで、そこからベストなものを選択する等


# parallelization.py

```python:parallelization.py
import asyncio

from agents import Agent, ItemHelpers, Runner, trace

"""
This example shows the parallelization pattern. We run the agent three times in parallel, and pick
the best result.
"""
```
* エージェントを3回並列で実行し、ベストな結果を選択するもの

```python:parallelization.py
spanish_agent = Agent(
    name="spanish_agent",
    instructions="You translate the user's message to Spanish",
)
```
* エージェントの生成
* ユーザーのメッセージをスペイン語に翻訳する

```python:parallelization.py
translation_picker = Agent(
    name="translation_picker",
    instructions="You pick the best Spanish translation from the given options.",
)
```
* 別のエージェントの生成
* ベストなスペイン語翻訳を選択するエージェント

```python:parallelization.py
async def main():
    msg = input("Hi! Enter a message, and we'll translate it to Spanish.\n\n")
```

* ユーザーからのキーボード入力を受け付ける

```python:parallelization.py
    # Ensure the entire workflow is a single trace
    with trace("Parallel translation"):
        res_1, res_2, res_3 = await asyncio.gather(
            Runner.run(
                spanish_agent,
                msg,
            ),
            Runner.run(
                spanish_agent,
                msg,
            ),
            Runner.run(
                spanish_agent,
                msg,
            ),
        )
```
* `await asyncio.gather()`でエージェントを3回並列で実行

```python:parallelization.py
        outputs = [
            ItemHelpers.text_message_outputs(res_1.new_items),
            ItemHelpers.text_message_outputs(res_2.new_items),
            ItemHelpers.text_message_outputs(res_3.new_items),
        ]
```
* `RunResult.new_items()`は、このrunで新しく生成された`RunItem`のリストを返す。新しいメッセージや、ツールコール、最終アウトプットなどを含む。
* `ItemHelpers.text_message_outputs()`は`list[RunItem]`からテキストメッセージだけを抽出し、結合した`str`を返す
* `outputs`は3つのスペイン語の翻訳文字列のリスト


```python:parallelization.py
        translations = "\n\n".join(outputs)
        print(f"\n\nTranslations:\n\n{translations}")
```
* 上記のリストを改行区切りで出力
 
```python:parallelization.py
        best_translation = await Runner.run(
            translation_picker,
            f"Input: {msg}\n\nTranslations:\n{translations}",
        )
```
* ユーザーが最初にキーボード入力したメッセージと、3つの翻訳結果をインプットとして2つ目のエージェント（ベストな翻訳を選ぶエージェント）を実行
```python:parallelization.py
    print("\n\n-----")

    print(f"Best translation: {best_translation.final_output}")
```
* 選択された翻訳を表示

```python:parallelization.py
if __name__ == "__main__":
    asyncio.run(main())
```