OmniAICreator/Qiita-1.07M huggingface dataset:
個人開発ゲーム「メスガキクイズちゃれんじ！」について

私たちMQC制作委員会は現在「メスガキクイズちゃれんじ！！」を鋭意開発中です。「メスガキ」をコンセプトに前代未聞のメスガキ要素満載なゲームを開発しています。

プロモーション動画
https://www.youtube.com/watch?v=U_5ymgGszQI

![クラウドファンディング用素材.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993061/c108c8e3-b4bd-4b6c-a66f-0b9b3e6e6517.jpeg)


## 概要
「メスガキクイズちゃれんじ！」は、前代未聞の“メスガキ”モチーフのクイズゲームです！ プレイヤーは、挑発的なメスガキから出題されるクイズに挑戦し、正解していくことで彼女たちとの関係を深めていきます。

メスガキに罵られながらクイズを解いていく新感覚の体験を楽しもう！ 好感度を上げることで、彼女たちの態度が変化し、特別なイベントも……？ さらに、個性豊かなメスガキたちのかわいいボイスも収録予定です。
※下記はイメージとなります

![IMG_2651.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993061/866da6df-6573-49d9-b53e-d6f9f3e78d3e.png)
![IMG_2641.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993061/c9178593-3aa4-4501-b6de-1a2d47631abb.png)

## Concept
「メスガキ」をテーマに、前代未聞のメスガキ要素満載なゲームを開発しています。

新感覚！メスガキに試されちゃう全年齢向けクイズゲーム鋭意制作中！

メスガキ×クイズ×恋愛シミュレーションの融合！

罵られながらも解答していく独特のゲームシステム！

クイズの正解数に応じて、メスガキたちとの関係性が変化！

個性豊かなメスガキキャラクターたちが多数登場！

フルボイス対応で、リアルな掛け合いを楽しめる！

メスガキにいっぱい挑戦されながら、クイズに答えていく快感をぜひ体験してください！

## 技術スタック
Qiitaなので技術スタックのお話をすると、TypeScript+React+viteの構成で開発しています。
現在クイズのDBの準備が終わっている段階で、デザインのブラッシュアップや追加要素を実装しており、２０２５年中のリリースを目指しています。

## どうして開発しようと思ったのか
ずばり「メスガキコンテンツ」でありとあらゆるジャンルのクイズを出題する面白クイズを作りたいからです。

## 最後に
今後の進捗や追加情報も随時公開予定！
事前登録を受付中なのでぜひともご登録ください。
公式XやYoutubeおよびpatreonでの支援を現在募集中なので、こちらもチェックしてください！
公式X：https://twitter.com/mesugaki_game

patreon:https://www.patreon.com/c/darupu_tech?utm_medium=social&utm_source=twitter&utm_campaign=creatorshare_creator&utm_content=join_link
limaでnerdctlを試す

# 概要
limaでnerdctlを試すだけの記事

# 前提
手元のMacOS Monterey

# 手順
```
// インストール
$ brew install lima

// 下記でqemuプロセス等を起動。下記のdefaultはVM名です。
$ limactl start --name=default

// defaultの起動を確認する (psでもみれる)
$ limactl list
NAME       STATUS     SSH                VMTYPE    ARCH      CPUS    MEMORY    DISK      DIR
default    Running    127.0.0.1:60022    qemu      x86_64    4       4GiB      100GiB    ~/.lima/default

// nerdctl経由でnginxを起動します
$ lima nerdctl run -d --name nginx -p 8080:80 nginx
$ lima nerdctl ps
CONTAINER ID    IMAGE                             COMMAND                   CREATED           STATUS    PORTS                   NAMES
246bdb108cbd    docker.io/library/nginx:latest    "/docker-entrypoint.…"    27 seconds ago    Up        0.0.0.0:8080->80/tcp    nginx

// nginxから応答が返ってくることを確認します
$ curl -I localhost:8080
HTTP/1.1 200 OK
Server: nginx/1.27.4
Date: Mon, 24 Feb 2025 04:40:54 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Wed, 05 Feb 2025 11:06:32 GMT
Connection: keep-alive
ETag: "67a34638-267"
Accept-Ranges: bytes

// nginxコンテナを停止します。
$ lima nerdctl stop nginx
nginx
$ lima nerdctl ps
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES
$ 

// QEMUのプロセスを停止します。
$ limactl stop default

// stopだけだと作成したdefaultは残っています。
$ limactl list
NAME       STATUS     SSH            VMTYPE    ARCH      CPUS    MEMORY    DISK      DIR
default    Stopped    127.0.0.1:0    qemu      x86_64    4       4GiB      100GiB    ~/.lima/default

// 不要となったVM(default)を削除します
$ limactl delete default
INFO[0000] The qemu driver process seems already stopped 
INFO[0000] The host agent process seems already stopped 
INFO[0000] Removing *.pid *.sock *.tmp under "/Users/tsuyoshi/.lima/default" 
INFO[0000] Removing "/Users/tsuyoshi/.lima/default/ha.sock" 
INFO[0000] Deleted "default" ("/Users/tsuyoshi/.lima/default") 

// defaultが削除されたことを確認
$ limactl list
WARN[0000] No instance found. Run `limactl create` to create an instance. 
```
paizaでc#学習①

paiza問題集でつまずいた問題の備忘録をまとめていきます。
# 3つのデータの入力 C#編（paizaランク D 相当）
問題はこちらから▶︎[3つのデータの入力 C#編（paizaランク D 相当）](https://paiza.jp/works/mondai/stdin/stdin_3)
## ◼️つまずいたところ

- 入力されたスペースを改行に変換
    - line.Replace()で半角スペースを改行に変換

以下は、正解となったコードです。
```c#:c#
using System;

class Program
{
    static void Main()
    {
        string line = Console.ReadLine();
        string output = line.Replace(" ", "\n");
        Console.WriteLine(output);
    }
}
```
# N個のデータの入力 C#編（paizaランク C 相当）
問題はこちらから▶︎[N個のデータの入力 C#編（paizaランク C 相当）](https://paiza.jp/works/mondai/stdin/stdin_3)

```c#:c#
using System;

class Program
{
    static void Main()
    {
        int N = int.Parse(Console.ReadLine());
        string output;
        if (1<=N<=10)
        {
            for(i=1; 1<=i<=N; i++)
            {
                output = Console.ReadLine();
                Console.WriteLine(output);
            }
        }
    }
}
```
CS0019、CS0103のエラーコードが出力されました。
## ◼️つまずいたところ
- N個の文字列を配列として取得
    - .Split()で任意の文字で区切り、配列に格納
- 出力ループの記述
    - foreach()で配列の要素がなくなるまでループ

以下は、正解となったコードです。
```c#:c#
using System;

class Program
{
    static void Main()
    {
        //Nを取得
        int N = int.Parse(Console.ReadLine());
        //半角スペースで区切り、N個の文字列を取得
        string[] words = Console.ReadLine().Split(' ');
        //各文字列を改行区切りで出力
        foreach(string word in words)
        {
            Console.WriteLine(word);
        }
    }
}
```
(更新中)私のAI先生への代表？質問文例です。

・おすすめのページを教えて下さい。AI先生に聞いていません。


# 最新
・しばらく、コレで。
chatGPT先生用
(2025-06-19)

```
この記事中のすべての質問を含めた、Markdown形式の質問リストを出力して。
```
(旧)
```
```
(2025-0６-19)
私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。追番を追加して下さい。Markdownのテキスト形式で。
```
(2025-04-22)
私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。追番を追加して下さい。Markdown形式で。
```
```
(2025-02-24)
私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。  1行目に、# 質問リスト　の文字を出力して。
```
Gemini 2.0Flash先生用
```
以上の私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。  1行目に、# 質問リスト　の文字を出力して。追番をふって下さい。```
```
共通
```
最後のソースコードを出力するために、１回の質問で回答をもらうための、質問文を教えて下さい。
```

# 最新の不思議
(2025-05-35)

保存されたメモリを更新しました

Conversation not found





# あ
```
意味を教えて下さい。
```
```
以下を日本語で解答して下さい。
```
# か
```
結果も出力して下さい。
```
```
コンソールで、結果が出力されません。結果も出力して下さい。
```
# さ
```
上記で、全然だめです。が抜けています。全部出力して下さい。
```
・ChatGPT先生は、横着？されます。
　人間の先生に、私の質問を抽出してとは、とても言えません。

```
作図をお願いします。
```

```
sympy のシンボリックの結果を教えて下さい。
```
```
sympy のソースコードで教えて下さい。
```
```
上記をsympyのソースコードで。
```
```
上記の条件で、　　　　
```
文字「上記」が必要。上記がなくても忖度?される時あり。
```
上記の違いをsympy のソースコードで教えて下さい。
```
```
上記で、全然だめです。
```
# た
```
違いを教えて下さい。
```
```
(本日の?)ChatGPT先生へ。 xxxxx 3通りで。
```
・「(本日の?)ChatGPT先生へ。」不要です。???youtube コメント用
```
xxxxx 3通りで。
```
xxxxx:積分の時、数式



# は
```
本当ですか。
```
# ま

```
が間違っていませんか。
```
```
mathjaxを省略しないで、私の質問を最初から、Markdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。  1行目に、# 質問リスト　の文字を出力して。
```
・ChatGPT先生は、横着？されます。
　人間の先生に、私の質問を抽出してとは、とても言えません。
# わ
```
私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。  1行目に、# 質問リスト　の文字を出力して。
```
```
私の質問をMarkdown形式でリスト化して出力して。
```
# 代表回答集(ChatGPT先生)


```
GPT-4o. の Free プランの制限に達しました。
制限が xx:xx 以降. にリセットされるまで、回答では別のモデルが使用されます。
```




・ステキです。**次の行は、私がよく使う言葉です。** 最初からヤッとけよ。
```
実行時にエラーが発生しましたか？
考えられる問題点と解決策を以下にまとめます。
```

・調子悪いです。ChatGPT先生の開き直り。
```
ご指摘ありがとうございます！
改めて確認したところ、上記の piecewise_maximum は 意図した通りには動作しません。
```

＞??? 5回目
＞??? **今一度しっかりと検証し**...
```
ご指摘ありがとうございます！
今一度しっかりと検証し、数学的に正確な Piecewise の最大値を求める方法 を示します。
結論として、前回の関数も不完全 でした。申し訳ありません。
```

＞??? 8回目
＞??? **もう一度、慎重に考え直しました。**
```
ありがとうございます！
もう一度、慎重に考え直しました。
前回の関数も不完全 でした。申し訳ありません。
今回こそ 数学的に正しく Piecewise の最大値を求める関数 を示します。
```

# 代表回答集(Gemini先生)
＞??? 関数が見当たらない...
＞??? **大変失礼いたしました。**
```
ご指摘ありがとうございます。find_max_piecewise_symbolic 関数が見当たらないとのこと、大変失礼いたしました。以前の回答で関数を提示しましたが、説明が不足していたため、再度 find_max_piecewise_symbolic 関数を含めた完全なコードを提示します。
```




# いつもと違うおすすめです。

#### Qiita
自作???

https://qiita.com/mrrclb48z/items/fb9729e07dca0adf944b



@yusuke_s_yusuke 様へ　リンクしました。ありがとうございました。

https://qiita.com/yusuke_s_yusuke/items/9060b844f8db9d795edc
Fliki AI徹底レビュー：実際に使って分かったメリット・デメリット

Fliki AIはテキストから動画を自動生成するAIツールで、SNS向けコンテンツ作成や簡易的な説明動画制作に特化しています。Redditユーザーの実際の体験談を基に、日本語ユーザー向けに機能性と実用性を分析しました。

**主なメリット**  
- **操作の簡便性**：ドラッグ＆ドロップ式インターフェースで、動画編集未経験者でも3分で基本操作を習得可能[1][3]  
- **素材ライブラリの充実**：300万点以上のロイヤリティフリー画像/動画と50種類のBGMが即時利用可能[1][2]  
- **マルチボイス機能**：日本語を含む75言語のAI音声（男性/女性）でナレーション自動生成が可能[2][4]  
- **テンプレート活用**：YouTubeショートやTikTok向け縦型動画のプリセット20種類を用意[3][5]  

**注意すべきデメリット**  
- **画質制限**：無料版では720p出力に制限され、4K出力には有料プランが必要[1][6]  
- **編集自由度**：シーン遷移やエフェクトの細かい調整が不可能[1][5]  
- **音声の不自然さ**：長文ナレーションで抑揚に違和感が生じるケースあり[4][6]  
- **日本語対応課題**：日本語テキスト解析で誤変換が発生する場合あり[3][4]  

**比較表｜主要AI動画ツール**  
| 項目            | Fliki AI | Runway ML | InVideo   |
|-----------------|----------|-----------|-----------|
| 学習曲線        | ★★★★☆    | ★★☆☆☆     | ★★★☆☆     |
| 出力画質        | HD       | 4K        | Full HD   |
| テンプレート数  | 20+      | 5         | 50+       |
| 無料枠          | 5分/月   | 3プロジェクト | 10分/週  |

**適したユースケース**  
- Instagramストーリー用15秒動画の量産  
- 商品説明動画のプロトタイプ作成  
- ブログ記事の動画要約版制作  
- 多言語コンテンツの並行制作[2][5]

**日本ユーザー向け活用Tips**  
1. 漢字混じりのテキストは「ひらがな変換」でAI音声の自然さ向上  
2. 縦型動画作成時は「Smart Crop」機能で自動フレーミング調整  
3. 和風BGMが必要な場合は外部ファイルのアップロード推奨  

Redditユーザーからは「デジタルノマド向け手軽なツール」（u/taylorlistens）との評価がある一方、「プロ級のクオリティを求めるならAdobe Premiereが依然優位」（u/zhacker）という指摘も[5][6]。無料版で基本機能を試し、必要に応じて19ドル/月のスタンダードプランへのアップグレードが現実的な選択肢と言えます[1][3]。
access_tokenとrefresh_tokenの違い

## はじめに
JWT認証におけるaccess_tokenとrefresh_tokenの使い分けを見ながら、両者の違いを説明します。

**説明しないこと**
JWTはログイン機能でよく利用されます。
詳しいログイン機能の作成方法については解説しません。

## JWTとは
JWTは(Json Web Token)の略で、JSON形式のデータに情報を格納したものをtoken化したものです。Webアプリケーションの認証(JWT認証)によく使われます。

## JWTの仕組み
JWTはヘッダ.ペイロード.署名の3つに分けられ、.で区切られます。

```shell
# jwtの例
eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE3NDAyOTQ5MTd9.feyNR9Itzv-58R0U3TFFUCD5yTcn_z3ucClFCKJkyg8
```

ペイロード部分にユーザーidなどを格納して、認証が必要な通信でheadersのAuthorizationに含めて送信します。payload部分は誰でも簡単に複合化することが可能なので、password等の機密情報を入れたりしてはいけません。 悪意のあるユーザーがpayloadを書き換えても、署名部分が合わなくなるので、改ざんを検知することが可能です。

## access_tokenとrefresh_token
access_tokenとrefresh_tokenは使用されるタイミングが異なります。

tokenの構造等に違いがあるわけではありません。
JWTを使った認証方式の場合、access_tokenもrefresh_tokenもJWTです。
tokenを2つ使う理由はセキュリティの向上です。

※ refresh_tokenはuuidなどランダムな文字列を使用する場合もあります。JWTである必要はありません

## 2つのtokenを使用する理由

APIでやり取りをするアプリケーションの場合、リクエストの度にaccess_token(JWT)をサーバーに送信する必要があります。
つまりネットワーク上にaccess_tokenが流れる回数が増え、当然盗聴されるリスクも高まります。単純に盗聴する機会が増えるからです。

有効期限が1ヶ月のtokenが悪意のあるユーザに盗聴された場合、1ヶ月もの間不正ログインされる状態になります。頻繁にネットワーク上でやり取りされるaccess_tokenは有効期限を短く設定するのが望ましいです。

しかし、access_token単体の運用だと、頻繁にログインし直す必要があるため、ユーザー体験が悪くなります。

そこでrefresh tokenの登場です。

## 有効期限の考え方

例えば、refresh tokenの有効期限を1ヶ月。access_tokenの有効期限を1時間に設定します。

access_tokenの有効期限が切れた状態でアプリケーションを訪れた場合に、refresh_tokenを使用してaccess_tokenの再発行を行います。 以降のリクエストでは、access_tokenを利用して通信します。
再度access_tokenが切れた際にrefresh_tokenで再発行。 これを繰り返します。

これで、毎回の通信では有効期限の短いaccess_tokenを利用することでセキュリティリスクを下げ、access_tokenの有効期限が切れた時だけ、resresh_tokenによる再取得を実行することで、ユーザの利便性も確保することができます。

ユーザーが再度ログインする必要があるのはrefresh_tokenの有効期限が切れる1ヶ月後です。


## refresh_tokenの保存と検証ステップ
JWT(access_token)を使用したAPI通信では、JWTをサーバ側で保持しませんが、refresh_tokenはDBに保存します。
refresh_tokenを使用した再検証時には、以下2つのステップでaccess_tokenの再発行を行います。

1 該当のrefresh_tokenを保持するユーザデータはあるか
2 refresh_tokenの有効期限は切れていないか

refresh_tokenをDBに保持しておくと、万が一refresh_tokenが流出した可能性のあるユーザが発生した場合に、該当のユーザーに紐づくrefresh_tokenのDBから削除することで、流出したrefresh_tokenの有効期限が残っていても無効化させることが可能です。

仮のaccess_tokenだけの運用をしていた場合、secret_keyを変更する必要が出てきます。 その場合全てのユーザのaccess_tokenが無効になります。

※ refresh_tokenは漏洩リスクを考えハッシュ化するのが望ましいです

## refresh_tokenの取り扱い
access_tokenはJSONの戻り値として返したり、response headerとして返し、localStorageやRedux等の状態管理ライブラリで保存されます。

一方でrefresh_tokenはセキュアに管理するため、HTTPOnly Cookieで管理されます。
HTTPOnly CookieはJavaScriptからのアクセスできないCookieです。 XSSによる攻撃から守ることができます。

## クロスドメイン(HTTPOnly Cookie)
注意点として、クロスドメイン環境の場合、safariはデフォルトでサードパーティ製Cookieをブロックします。
つまりsafariユーザーはrefresh_tokenを利用できないので、最後にAPI通信を行ってから1時間経つと毎回ログインする必要があります。
これを回避するにはrefresh_tokenもaccess_tokenと同じようにJSONやresponse headersでやりとりし、Content Security Policy (CSP)を厳密にするなどして、可能な限りのXSS対策を行うなど、別の手が必要です。

## 結論
refresh_tokenはaccess_tokenの再取得のために使われる。
access_token: 頻繁にネットワークに晒されるため、有効期限設定して漏洩した時のリスクを抑える
refresh_token: 有効期限を長めに設定するが、ネットワークに晒される回数は少ないため漏洩する危険性は少ない


## 参考

https://zenn.dev/ayumukob/articles/640cbf4a1ff3ed
材料力学「はりの剛性マトリックスとトラスの剛性マトリックスの違いを教えて下さい。」をAI先生に聞きました。

**・おすすめのwebページを探しています。よろしくお願いします。**
・質問リストの追番は無視して下さい。
(2025-02-26再質問)
```
# 質問リスト
1. はりの剛性マトリックスとトラスの剛性マトリックスの違いを教えて下さい。  
2. 上記の違いをsympy のソースコードで教えて下さい。  
```
# ChatGPT先生へ

>ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。
>回答抜粋

**・以下、私は実行していません。**
```python
import sympy as sp

# 記号の定義
E, A, L, I = sp.symbols('E A L I')

# 1. トラス要素の剛性マトリックス (1D 2節点)
K_truss = (E*A/L) * sp.Matrix([
    [1, -1],
    [-1, 1]
])

# 2. はり要素の剛性マトリックス (2D 2節点, 曲げ考慮)
K_beam = (E*I/L**3) * sp.Matrix([
    [12,  6*L,  -12,  6*L],
    [6*L,  4*L**2, -6*L,  2*L**2],
    [-12, -6*L,  12, -6*L],
    [6*L,  2*L**2, -6*L,  4*L**2]
])

# 表示
print("トラス要素の剛性マトリックス:")
sp.pprint(K_truss)
print("\nはり要素の剛性マトリックス:")
sp.pprint(K_beam)
```
```python
import sympy as sp

# 記号の定義
E, A, L = sp.symbols('E A L')

# 角度 (水平, 垂直, 斜め)
theta_h = 0  # 水平方向
theta_v = sp.pi/2  # 垂直方向
theta_d = sp.pi/4  # 斜め方向

def truss_stiffness_matrix(theta):
    c = sp.cos(theta)
    s = sp.sin(theta)
    return (E * A / L) * sp.Matrix([
        [c**2, c*s, -c**2, -c*s],
        [c*s, s**2, -c*s, -s**2],
        [-c**2, -c*s, c**2, c*s],
        [-c*s, -s**2, c*s, s**2]
    ])

# 各要素の剛性マトリックス
K_h = truss_stiffness_matrix(theta_h)
K_v = truss_stiffness_matrix(theta_v)
K_d = truss_stiffness_matrix(theta_d)

# 表示
print("水平方向トラス要素の剛性マトリックス:")
sp.pprint(K_h)
print("\n垂直方向トラス要素の剛性マトリックス:")
sp.pprint(K_v)
print("\n斜め方向トラス要素の剛性マトリックス:")
sp.pprint(K_d)
```


# Gemini先生へ

# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)
# いつもと違うおすすめです。

#### wikipedia 
#### Qiita
#### Google検索
#### 文献
・旧い本です。
青木徹彦 『構造力学（土木系 大学講義シリーズ 5）』（コロナ社、1986年）200頁 など
https://www.coronasha.co.jp/np/isbn/9784339050448/
【無料で無制限のクラウド】私が感じている Github を使ってブログ原稿を保存するメリット


私は Qiita などに投稿するブログの原稿を Github 上で管理しています。

Github といえば、本来ソースコードを管理するものですが、実は文章の保存にも使える便利ツールです。

Github 上で管理することのメリットを紹介します。

## 無料でいくらでも保存できる

Github では無料プランでも無制限にデータを保存することができます。

下のリンクは Github のプラン比較ページです。

無料プランでもリポジトリを無制限に作ることができると説明があります。

<figure>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/81c71702-6fea-42e6-89a5-f81c7351b78f.png width=450 alt="github plans">
<br>
<figcaption>出典:https://github.co.jp/pricing.html </figcaption>
</figure>


https://github.co.jp/pricing.html

しかも、**プライベートリポジトリも無制限に作成できる**ため、まさに投稿前に見られたくない原稿データを保存するのに打って付けです!

https://docs.github.com/ja/get-started/start-your-journey/creating-an-account-on-github

## 変更した部分がわかりやすい
例えば、原稿を書き直してみたけど前の方が良かったのか迷ってしまうということありませんか?

そんな時に Github の変更履歴表示が便利です。

いちいちページ切り替えをしなくても、どこがどう変わったのか確認できるため、確認のスピードが上がり全体的な執筆効率もかなり上がります。

<figure>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/ffed2844-25c3-4f2e-9722-6dd58bbbcf68.png width=450>
<br>
<figcaption>変更履歴の例</figcaption>
</figure>


## VSCode と相性抜群
私は普段 VSCode を使って原稿を執筆しています。

その理由は、 markdown で原稿が書きやすくて、プラグインを入れれば即座に反映されるプレビューを表示できるようになるからです。

特に、見出しやコードにした部分などに色分けされるところが気に入っています。

またコミットした変更を VSCode 上で簡単に比較できるため、 Github と組み合わせることによって、さらに作業効率が上がる相性抜群のエディタです。


VSCode ダウンロードリンク

https://code.visualstudio.com/

プレビュープラグインについての記事

https://qiita.com/take_me/items/5ff5304b58d9feec21df

Github セットアップ方法

https://docs.github.com/ja/get-started/getting-started-with-git/set-up-git

## まとめ
Github は、無料で無制限にデータを保存でき、お財布に優しいツールです。

変更した部分の比較が簡単で、内容のセルフレビューをするときでも気軽にできます。

VSCode とGithub は相性抜群でこの二つを組み合わせて、さらに執筆効率を上げることができます。

ブログをスタートしたいけど、データの置き場所に悩んでいる方は Github も選択肢の一つとして検討してみてください。
トラス(その1)「建築士試験【構造063】構造力学/トラスの呪文(!?)のまとめ（vol.0211）」様をsympyのTrussで作図にチャレンジ。

・タイトルを変更予定です。
・作図は、sympyのTrussです。トラス(その2)を作成未定。

**パイソニスタの方へ**
・辞書の値へのsubsがわかりませんでした。ChatGPT先生に聞きました。
　おすすめのページを教えて下さい。
・Truss＜SymPy 1.13.3 のDoc
　https://docs.sympy.org/latest/modules/physics/continuum_mechanics/truss.html

# オリジナル Youtube

**・「建築士試験【構造063】構造力学/トラスの呪文(!?)のまとめ（vol.0211）」** 
建築士試験マニア/はまちゃん 様 
(0:00~19:52)　フル
https://youtu.be/v1cTRJzOoAI
(0:00~19:52)　途中から。反力をスキップ。トラスの呪文(!?)からです。
https://youtu.be/v1cTRJzOoAI?si=OXUozn2iKzfza_df&t=380

# ~~sympyのweb上での実行方法~~
・numpyのエラーがでます。
~~SymPy Live Shellで~~
~~https://qiita.com/mrrclb48z/items/00dd08b0317069be9342#web%E4%B8%8A%E3%81%AE%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95sympy-live-shell%E3%81%A7~~

# sympyで(オリジナル 様の方法を参考に)
・?切断法 

# sympyで(Trussで)
・縦横比が1:1に見えません。
・node,memberの名称は、表示されていません。

![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/69b6b79f-bdf5-4310-a9f4-b2a8892782ee.png)

#### ver0.1
**・var('L')　おいしく???なかったです。**
**・Pはできましたが、辞書の値へのsubsがわかりませんでした。**
・ノードの識別は整数でできます。　＜　ChatGPT先生より(省略) 
・（2025-02-27) 結果を直しました。申し訳ありません。
```python
# ver0.1
from sympy.physics.continuum_mechanics.truss import Truss
import math
from sympy import *
def myMember(member):
    return member,member[:1],member[1:]
P=3   # var('P')
L=2   # var('L')
t = Truss()
t.add_node     ((1,0,0),(2,1*L,0),(3,2*L,0),(4,3*L,0))    # 左下原点。反時計回り
t.add_node     (        (5,2*L,L),(6,1*L,L))               
t.add_member   ((1,1,2),(2,2,3),(3 ,3,4))                 # 外側:左下から。反時計回り|
t.add_member   ((5,4,5),(6,5,6),( 7,6,1))     
t.add_member   ((8,6,2),(9,2,5),(10,5,3))                 #　内側:一筆書き     
t.apply_support((1,"pinned"), (4,"roller"))
t.apply_load   ((6, P, 270))
p = t.draw()
p.show()
# 
t.solve()
print("#",t.reaction_loads )           
print("#",t.internal_forces)
# {'R_1_x': 0, 'R_1_y': 2, 'R_4_y': 1}
# {1: 2, 2: 1, 3: 1, 5: -sqrt(2), 6: -2, 7: -2*sqrt(2), 8: -1, 9: sqrt(2), 10: 0}
```

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342) 　

# いつもと違うおすすめです。

#### Qiita内の参考

https://qiita.com/mrrclb48z/items/3861f7a06b64842d15c8

#### ChatGPT先生へ
・追番は無視して下さい。
```
# 質問リスト
1. トラス部材の番号の標準の付け方はどのようにされていますか。  
2. 機械、建築、建設。業界によって違いますか。  
3. 機械の座標ベース: XYZ座標の意味を教えて下さい。  
```
>回答省略
```
# 質問リスト
1. sympyのtrussで apply_support(*args)の使い方を教えて下さい。
2. 水平方向もできますか。
3. 本当ですか。
4. 鉛直方向だけですか。
5. 逆だと思います。
6. ノード1は整数でもいいですか。文字列の必要がありますか。
```
>回答省略
Pipe Bending

https://www.rrenterprisescbe.com/blog/Pipe-Bending/pipe-bending-guide/
Pipe bending is a crucial process in various industries, including automotive, construction, HVAC, plumbing, and aerospace. It involves shaping pipes and tubes into specific angles or curves to meet the requirements of different applications. This guide covers everything you need to know about pipe bending, including methods, materials, applications, and best practices.

What is Pipe Bending?
Pipe bending is the process of reshaping pipes or tubes into desired angles or curves without compromising their structural integrity. It is used to create custom shapes for fluid transport, structural frameworks, and aesthetic designs.

Types of Pipe Bending Methods
Mandrel Bending

A mandrel (a solid rod) is inserted into the pipe to prevent collapsing or wrinkling during bending.

Ideal for: Thin-walled pipes, precision bends, and tight radii.

Roll Bending

Uses rollers to gradually curve the pipe into large-radius bends.

Ideal for: Spiral pipes, coils, and large-radius curves.

Compression Bending

The pipe is pressed against a die to create a bend.

Ideal for: Thicker pipes and simple bends.

Rotary Draw Bending

A die rotates to pull the pipe around it, creating precise bends.

Ideal for: Complex shapes, tight tolerances, and high-quality finishes.

CNC Pipe Bending

Computer-controlled machines ensure high precision and repeatability.

Ideal for: Mass production, custom designs, and complex geometries.![rr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019891/07f07ada-242c-43bd-b577-ee64abec7e01.jpeg)
ごめんね、ChatGPT o1 pro

こんばんは。座禅いぬです。
最近は有志で集まってLT会を開いて、アウトプット量を増やして学びを加速させよう！というチャレンジをみんなでやっています。


さて、プレゼンを読みやすく直感的に理解し易くするために、<strong>イラストの存在は重要</strong>ですよね。以前だったらぴったり合うイラストを探すだけで大変だったのですが、今は生成AI（自分だとDALL-E）にすぐ生成してもらえるので便利。

　

 

そこで今回もChatGPTのDALL-Eに作成してもらうことにしました。

　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850275/d1a7c82f-8721-45ae-825a-43ad27fdd6b1.png)

　

もう何度も繰り返してる作業なので、パッと依頼しちゃいます。雑でも結構結果が安定してるイメージ。

ところが、<strong>なんか様子がおかしい…？</strong>

　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850275/67eec7c7-bf73-450e-bca0-69c901fd55d8.png)

　

そう、<strong>間違えてGPT-4oではなくo1 pro-modeに依頼してしまったのです。</strong>みなさんご存じのように、o1には画像生成機能がついてないので、生成できるわけがないんですね。でも、そこはさすがのpro-mode。ちゃんと1分以上考えて彼なりの結論を出してくれました。
 
　
  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850275/93957e43-0e4b-4350-9c59-8b0e0234b6ee.png)

　

もうね、<strong>思わず鼻水でましたよ。</strong>（きたない）

　

<strong>まさかのAA。しかも</strong>

　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850275/5b798634-7b14-48be-b7a7-d36cc494a1d8.png)

　

どうしてこうなった。

　


 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850275/0f31c69c-a3cf-4b9f-9b20-e0f8083cd8a8.png)

　
 
<strong>ポイント解説まで。精一杯頑張った感が伝わってきます。</strong>思わず謝ってしまいました。思わず過ぎてtypoしてるし。

　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850275/acb1e307-159f-4d72-9a1d-6f1dcc585e45.png)

　

色々言われることもあるけど、こいついいやつなんだろうな。ほんとすいません。

それだけ。
Windows Server Hyper-Vクラスターのメモ

詳しく記事を書く時間がないのでメモだけ
・フェールオーバークラスターのノードにはデフォルトゲートウェイのIPを設定してないとクラスター構築で失敗する。（pingを返すならなんでもよい、クラスターの検証はエラーにならない）
・Hyper-Vの「保護されているネットワーク」はデフォルトだと6時間に1回しかフェールオーバーしない。仮想マシンをダブルクリックして「フェールオーバー」で期間内の回数を1、時間を0にすると何回でもする。
・「保護されているネットワーク」でフェールオーバーした後すぐにネットワークを正常に戻してまたネットワーク障害を起こすと何のエラーもなくフェールオーバーしないことがある。
「保護されているネットワーク」で仮想マシンの通信障害の検知は仮想マシンごとに行われており、Hyper-Vホストの「イベントビュアー」-「システム」にエラーが出たときにフェールオーバーする。通信障害検知の周期は今のところ不明。
AlpineのDockerイメージでHeadless Chromeのエラーを抑制する(D-Bus)

## 問題

こちらのDocker上のAlpine Linuxの場合になる。同様にD-Bus関連のエラーがたくさん沢山出る。

https://qiita.com/yugo-yamamoto/items/4b3286ab9c67c5f40080

https://qiita.com/rairaii/items/8f6f72802f90a55d8604

## 対応

最低限のDockerfileとentrypoint.shで示す。

上記の記事の通りD-Busが必要なのと、D-Busが電源管理に使うUPowerがないとエラーが出るのでそれらをインストールし、エントリーポイントでD-Busを起動させる。

```Dockerfile:Dockerfile
FROM alpine

RUN apk add --no-cache \
    chromium \
    dbus \
    upower

WORKDIR /tmp

COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["sh", "/entrypoint.sh"]
```
```sh:entrypoint.sh
#!/bin/sh

mkdir -p /var/run/dbus
dbus-daemon --system --fork --nopidfile --syslog-only
export XDG_RUNTIME_DIR=/run/user/$(id -u)
export DBUS_SESSION_BUS_ADDRESS=unix:path=$XDG_RUNTIME_DIR/bus
mkdir -p $XDG_RUNTIME_DIR
chmod 700 $XDG_RUNTIME_DIR
chown $(id -un):$(id -gn) $XDG_RUNTIME_DIR
dbus-daemon --session --address=$DBUS_SESSION_BUS_ADDRESS --fork --nopidfile --syslog-only

exec sh -c "$*"
```

ビルド(とりあえずイメージ名はhogeで…）

```sh
$ docker build -t hoge .
```

D-Busが動いているか？

```sh
$ docker run -it -v ${PWD}:/tmp hoge ps -e
PID   USER     TIME  COMMAND
    1 root      0:00 ps -e
    9 messageb  0:00 dbus-daemon --system --fork --nopidfile --syslog-only
   17 root      0:00 dbus-daemon --session --address=unix:path=/run/user/0/bus --fork --nopidfile --syslog-only
```

## スクリーンショットで試す

```sh
$ docker run -it -v ${PWD}:/tmp hoge \
  chromium-browser \
    --enable-logging \
    --headless \
    --disable-gpu \
    --disable-software-rasterizer \
    --no-sandbox \
    --screenshot \
    http://ifconfig.io
50635 bytes written to file screenshot.png
```

`Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory`他諸々のエラーは出なくなる。
【package.json】1つのリポジトリに複数のプロジェクトフォルダがある時の注意点

## はじめに
プロジェクトの概要→ディレクトリ構成→詳細の設定方法という流れで書いていきます
不要なところは飛ばしてみてください

## プロジェクト概要

今回アサインされた案件では、**管理画面**と**ホームページ**の2種類のサービスが存在し、両者で共通して利用する FirebaseのAPIやコンポーネントがありました。そこで、以下のようなディレクトリ構成にてプロジェクトを管理することにしました。
```json
project-root/
├── web/                # Next.js の雛形（ホームページ用）
│   ├── pages/
│   ├── public/
│   ├── package.json
│   └── ... その他のファイル
├── admin/              # Next.js の雛形（管理画面用）
│   ├── pages/
│   ├── public/
│   ├── package.json
│   └── ... その他のファイル
├── firebase/           # Firebase API 関連のファイル群
└── common-components/  # 共通コンポーネントのファイル群
```


## デプロイに関して

管理画面とホームページは、それぞれ別のGCPサービスにアップロードする予定です。  
例えば管理画面の場合、**admin/** ディレクトリ内の Dockerfileを用いてコンテナ化するため、  
プロジェクトルートにある Firebase APIやコンポーネントを正しく配置してpathを正確に指定してあげないと  
うまく動作しない問題が発生してしまいました



## ワークスペースの詳細設定

今回のプロジェクトでは、npm のワークスペース機能を利用して、ルートディレクトリから各サブプロジェクトの依存関係を一括で管理しています。以下、その仕組みと注意点について詳しく解説します。

### 1. npm install の挙動

ルートの package.json でワークスペース（例: web/, admin/, firebase/）を指定している場合、ルートで `npm install` を実行すると、各ワークスペースの依存関係も自動的にインストールされます。  
つまり、個別のフォルダで別々に `npm install` を実行する必要はなく、全体の依存関係が一括管理されるため、セットアップが非常に楽になります。

### 2. package.json の設定

ワークスペースを活用する上で重要なのが、各プロジェクト（読み込む側、読み込まれる側）の package.json の設定です。  
ここでは、**読み込まれる側**（共通で利用する Firebase API やコンポーネント）と、**読み込む側**（web や admin）での設定例を紹介します。

#### 2.1 ルートの package.json

まずはルートにおけるワークスペースの指定です。  
以下のように、各サブディレクトリを workspaces 配列に記載します。

```json
{
  "private": true,
  "workspaces": [
    "web",
    "admin",
    "firebase"
  ]
}
```
これでルートでnpm installするだけで個別のフォルダで別々に npm install を実行する必要はなくなりました

#### 2.2 読み込まれる側：共通コンポーネントの package.json

共通のコードは、例えば `common-components` ディレクトリにまとめ、package.json の `name` フィールドでモジュール名を定義します。  
また、`main` フィールドでエントリーポイントを指定しておくことで、読み込む側での参照が簡単になります。

```json
{
  "name": "common-components",
  "version": "1.0.0",
  "main": "index.ts"
}
```

共通モジュールのコード例（common/index.js）:

```ts
export { default as Production } from "./production/production";
```
自分の場合はProductionコンポーネントを作成しました
他にもコンポーネントを共有したい場合は都度作成し、ここでまとめてexportできるようにしていくイメージです

#### 2.3 読み込む側：web プロジェクトの package.json

読み込む側では、依存関係に共通モジュールを追加します。  
ここで指定するバージョンは、共通側の package.json と一致させる必要があります。

```json
{
  "name": "web",
  "version": "1.0.0",
  "dependencies": {
    "common": "1.0.0"
  }
}
```

#### 2.4 読み込み側のコード例

web プロジェクト内で、共通モジュールを読み込む例です。

```js
// web/pages/index.js
import { Production } from 'common';

export default function HomePage() {
  return <Production/ >;

```

### 3. 注意点（ここでめちゃくちゃ詰まった）

- **ワークスペースの指定:**  
こういったパスの指定の仕方があるのですが、
```json
"dependencies": {
  "file:../common-components"
}
  ```
  ディレクトリ構造や環境が変わると動作しなくなる可能性があるのでバージョンで指定してあげる方がいいです。
  

- **フォルダ名と package.json の name の一致:**  
  各ワークスペースのディレクトリ名と、その中の package.json に記載する `name` フィールドは一致させる必要があります。  
  自分はキャメルケースでフォルダ名を作成していたんですが、package.jsonではスネークケースが推奨されるらしく、ほなpackage.jsonはスネークケースで書くか...→謎のエラー発生で解決に時間がかかり辛かったです、、
  

この設定により、各サービスで共通のコードを効率的に共有・管理しつつ、デプロイ時は個別の GCP サービスにアップロードできる柔軟な環境を実現できます。
文字列から数値に変換 !

###
**Parseメソッドを使用して文字列から数値に変換**

文字列で日付を取得して、その日付を編集したい。

・取得した日付の年+1
・取得した日付の月-1
・取得した日付の日+1

```C#:C#
       // 取得した日付
        string dateGet = "2024-01-01";

        // Parseメソッドを使用して文字列をDateTime型に変換
        DateTime date = DateTime.Parse(dateGet);

        // 年を +1
        DateTime plusYear = date.AddYears(1);

        // 月を -1
        DateTime  plusMonth = date.AddMonths(-1);

        // 日を +1
        DateTime plusdate = date.AddDays(1);
```
##
**最後に**
ここまで読んでいただきありがとうございました。
AWS Certified AI Practitioner(AIF-C01)に合格体験記

## 初めに
AWS Certified AI Practitioner(AIF-C01)に満点合格しました。この試験は2024年に新たに追加されたAI系の資格でありまだそれほど情報が多くはないので今後受ける方の参考になればと思います。

![AI プラクティショナー合格画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010377/ad04ef26-7a87-480a-a815-213a27dacd0a.png)







## AWS Certified AI Practitioner(AIF-C01)の試験概要

AWS Certified AI Practitioner (AIF-C01) 試験は、特定の職務に関係なく、AI/ML、
生成 AI テクノロジー、関連する AWS のサービスとツールに関する総合的な知識を
効果的に実証できる個人を対象としています。
以下分野の割合に基づいて試験問題が出題されます。
1. AI と ML の基礎 (採点対象コンテンツの 20%)
2. 生成 AI の基礎 (採点対象コンテンツの 24%)
3. 基盤モデルの応用 (採点対象コンテンツの 28%)
4. 責任ある AI に関するガイドライン (採点対象コンテンツの 14%)
5. AI ソリューションのセキュリティ、コンプライアンス、ガバナンス(採点対象コンテンツの 14%)
試験時間は100分で65問です。実際にスコアに影響するのは50問で15問は採点対象外となります。
料金は100USDで、所持している方は半額バウチャーなどの適用も可能です。
詳しい試験ガイドは以下リンクを参照ください。
[AWS Certified AI Practitioner(AIF-C01)試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-ai-practitioner/AWS-Certified-AI-Practitioner_Exam-Guide.pdf)

### どのような人にお勧めか
この認定試験は、人工知能(AI)と、機械学習(ML)の基本概念を理解し、ビジネスや技術の場面で活用したい人向けの入門レベルの資格です。

1. AI/MLの基礎を学びたい初心者
・AIや機械学習に興味はあるが、技術的なバックグラウンドがない人
・プログラミング経験が浅くても、AIの基本的な考え方を理解したい人
2. ビジネス職・マネジメント職
・AIプロジェクトにかかわるマネージャーや意思決定者
・AIソリューションを導入する際に、基礎的な知識を持っておきたいビジネス担当者
3. AIを活用したプロジェクトに関与する人
・AIを活用したサービスや製品開発にかかわるプロジェクトメンバー
・データサイエンティストやエンジニアと効果的にコミュニケーションを取りたい非エンジニア
4. AIの社会的な倫理を学びたい人
・AIの利点だけでなく、リスクや倫理面を考慮して活用方法を学びたい人

上記のような方にお勧めです。

## 取得するメリット
・AIの基礎知識が身に付き、ビジネスや開発でのAI活用が理解できる
・AI関連のプロジェクトにおいて、コミュニケーションが円滑になる
・今後のキャリアにおいて基礎的なAIスキルの証明になる

取得するメリットとしては私が思いつくのが上記の3つです。近年生成AIとの発展により、AIというものがとても注目されているのでAIの基礎知識があるというのはとても大きな武器になると私は考えています。






## 受験方法
AWSの認定試験はテストセンターと自宅でのオンラインのどちらかで受験することができ、私はテストセンターで受験しました。通信障害等のリスクもあるため、直接テストセンターで受験することがお勧めです。また。土日はテストセンターの予約の埋まりが速いので、試験の予約は一か月以上前にしておくと、自分が受けたいテストセンターで受験することができると思います。

## 受験前の状態

AWS Certified Cloud Practitioner
AWS Certified Solutions Architect - Associate
AWS Certified Developer - Associate
AWS Certified SysOps Administrator - Associate
AWS Certified Solutions Architect - Professional
・上記5つの資格を取得済み
・自己学習でAWSのインフラ構築のハンズオンを実施
・業務等でAWSを触る機会あり(そんなに多くない)

使用した教材
・[CloudTeck](https://kws-cloud-tech.com/)
90日間4980円で全10種類のAWS認定資格の演習が利用できます。問題は本番試験レベルであり、問題の解説もイラスト付きなので視覚的にも理解しやすいです。また、90日間で9960円払えば問題演習だけでなく講義動画を視聴することもできます。私は4980円の資格会員のプランにしました。

## 勉強方法
1. CloudTeckの問題集(180)問を1周する
2. 不明なサービスなどをBlackBeltやQittaで調べてノートにまとめる
3. まとめたノートを読む
この1~3を2周しました。不正解の選択肢がなぜ不正解なのかを説明できるまでのレベルまで勉強するのが重要です。勉強期間としては2週間ほどです。

## 感想
AWSの資格というよりかはAIの重きを置いている認定試験だというように感じました。AWSの認定試験は持っていなくてもG検定等の資格を持っている方等の方が受かりやすいのではないかと思います。またAWSの認定試験で満点をとれたのは初めてなので嬉しかったです。新卒一年目でAWSに関する資格を6つも取得することができ、結果的には満足です。今後はハンズオンに重きを置いて引き続きAWSに関する勉強を続けようと思います。今後も生成AIを含むAIの需要は増えていくと個人的に思いますので、AIに興味がある方はぜひこの試験を受けてみてください。この投稿が合格のために役立てれば幸いです。
ここまで読んでくださりありがとうございました。
計算機実習Ⅰ：Hello, World!

新しくプログラミング言語を習得するには、実際に書いてみることが最も効率的。
プログラムの解説は最低限に抑えて、①手を動かしながら、②出力結果を見ながら、習得する方針で作成している。

# Hello world
```fortran:hello.f90
program hello
  implicit none

  print *, 'Hello, World!'
end program hello
```

- `program hello`
   プログラムの開始を宣言している。`hello`はプログラム名。
- `implicit none`
   全ての変数の型を明示的に宣言するようFortranに指示している。
- `print *, 'Hello, World!'`
   画面に`Hello, World!`と表示する命令。
- `end program hello`
   プログラムの終了を表している。

```bash
gfortran hello.f90 -o hello
```
- 作成したhello.f90をコンパイル（プログラムを機械語に変換）して、helloに出力する。
```bash
./hello
```
- コンパイルしたファイルを実行する
```bash
Hello, World!
```
- Hello, World!と表示される
ArchLinuxのライブ環境で並列低レベルフォーマット

# TL;DR
xargsでddコマンドを並列に走らせます。

# 低レベルフォーマットとは

https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88_(%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8)#%E7%89%A9%E7%90%86%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88

ディスク全体に書き込みを行ってリセットすることです。「ゼロフィリング」とか「物理フォーマット」という呼び方もあるそうです。今回はディスクの全てのビットに0を書き込む方法を使います。

# ライブ環境を起動する
isoをコピーしたUSBディスクなどから、ライブ環境を起動します。ループバックデバイスのサイズを見るに、メモリは900MB以上あれば足りそうです。インストールメディアの作り方は下記参照。

https://wiki.archlinux.jp/index.php/USB_%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2#.E5.9F.BA.E6.9C.AC.E7.9A.84.E3.81.AA.E3.82.B3.E3.83.9E.E3.83.B3.E3.83.89.E3.83.A9.E3.82.A4.E3.83.B3.E3.83.A6.E3.83.BC.E3.83.86.E3.82.A3.E3.83.AA.E3.83.86.E3.82.A3.E3.82.92.E4.BD.BF.E3.81.86

ライブ環境が起動したら、とりあえずキーボード配列を変更しておきましょう。
```
# loadkeys jp106
```

ディスクを確認します。
```
# fdisk -l
```
サイズなどをもとに、初期化するディスクのデバイス名を確認しておきましょう。USBであれば`/dev/sda`など、NVMeストレージであれば`/dev/nvme0n1`などです。

# ちょっとだけbashスクリプトを書く
vimが入っているので、それを使って少しbashスクリプトを書きます。
今回は、次のような低レベルフォーマットを考えましょう。
* デバイス名は`/dev/nvme1n1`
* サイズは32GB
* 512bytesのブロックごとに行う
* 8スレッドで並列実行する
```
# vim low_level_format.sh
```
```bash:low_level_format.sh
of=/dev/nvme1n1

thread=8

disk_size=$((32*(2**30)))
block_size=512

entire_blocks=$((disk_size/block_size))
blocks_per_thread=$((entire_blocks/thread)))

echo {0..$entire_blocks..blocks_per_thread} | \
xargs -n1 | \
xargs -t -P$thread -n1 \
dd if=/dev/zero of=$of bs=$block_size count=$blocks_per_thread seek={}

```
Linuxはデバイスをファイルとして抽象化しているので、出力は`of=/dev/nvme1n1`とします。その後、色々定数を計算します。
echoで出力しているのは、各スレッドが書き込みを始めるブロックが、先頭から何ブロック目か、という値です。
これは空白区切りで出てくるので、1つ目のxargsで行区切りに変換して、2つ目のxargsでddを実行するそれぞれのスレッドに`skip`という引数として与えます。

2つ目のxargsのオプションのそれぞれの意味は、次のとおりです。
* -t：実行するコマンドを表示
* -P：並行するスレッド数を指定
* -n：関数に渡す引数の数を指定

# 並列化で本当に早くなったのか
並列化する前のコマンドと、時間を比較してみます。
```
# time ( dd if=/dev/zero of=/dev/nvme1n1 bs=512 )
# time ( source low_level_format.sh )
```

|並列化前|並列化後|
|---|---|
|3分12秒83|52秒111|

確かに、高速になりましたが、8倍とまではいきませんでした。
データの書き込みのボトルネックがCPU側からSSD側に移ったものと考えられます。

この後、1TBのSSDの低レベルフォーマットを同様の方法で並列に行ってみたところ、42分17秒14というタイムでした。意外とすぐ終わりました。

# おわりに
かなり熱を持つので、ちゃんとPCを冷やしながら作業をしましょう。
執筆時点では冬で外気温が2℃ほどだったので、窓を開けながら作業していました。寒かったです。
【Teams電話】Teams 電話のサービス形態

# はじめに

Teams 電話は Teams を PSTN と接続し、外線電話を Teams に統合する機能です。PSTN との接続方法によって、Teams 電話には複数の構成があります。各構成の違いについてまとめました。

# SBC とは？

Teams 電話の構成を理解するためには、SBC について知っておく必要があります。SBC は Session Border Controller の略です。SBC は PSTN ゲートウェイとも呼ばれ、PSTN との境界に配置して異なるネットワーク間の相互接続を行います。

自社で PBX を運用しているような組織では、オンプレミスに SBC を配置して、PSTN と接続しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/7c75704d-2eae-4867-a1cf-839f6ef9687d.png)

# Teams 電話のサービス形態

Teams 電話の構成には以下の 4 つがあります。

| 名前 | 説明 |
|:-:|:-:|
| Direct Routing | オンプレミスの SBC を自分で Teams へ接続する方法です。既存の通信キャリアを変えずに、Teams 電話を利用することができます。  |
| Operator Connect | Microsoft のパートナー事業者が運用している SBC をマネージドサービスとして利用する方法です。SBC の管理が不要です。|
| Calling Plan | Microsoft 自身が通信キャリアとなる利用方法です。日本では提供されていません。|
| Teams Phone Mobile | スマホの SIM の電話番号を Teams に統合するサービスです。日本では提供されていません。この記事では割愛します。|

Calling Plan と Teams Phone Mobile は日本で提供されていないため、日本で Teams 電話を利用する場合は、Direct Routing か Operator Connect になります。

この 2 つの違いは、自分で運用している SBC を使用するのか、通信キャリアが提供しているものを使用するのかの違いです。

## Direct Routing

Direct Routing はオンプレミスの SBC を自分で Teams へ接続する方法です。既存の通信キャリアや PBX などの資産を活用して、Teams 電話を利用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/308495f7-8016-4b82-b736-3aa43f2f7695.png)

::: note
Direct Routing には、Hosted Direct Routing と呼ばれるサービスもあります。これは事業者が SBC のマネージドサービスとして販売しているものです。利用者は事業者の SBC を使用して Teams と接続し、Teams 電話を利用します。
:::
(参考：Direct Calling for Microsoft Teams)
https://www.ntt.com/business/services/voice-video/voip/directcalling.html
(参考：Cloud Calling for Microsoft Teams)
https://biz.kddi.com/service/cloud-calling/

## Operator Connect

Operator Connect は Microsoft と提携している Operator Connect パートナーの通信キャリアと契約し、Teams 電話を利用する方法です。通信キャリアが提供している SBC を利用するため、自身で Teams との接続を構成する必要がありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/1cc96e60-f893-48a0-9902-bb84423969b2.png)

選択できる通信キャリアは Operator Connect パートナーに限られます。以下のサイトから、Operator Connect パートナーとして登録されている通信キャリアを確認できます。
(参考：Operator Directory)
https://cloudpartners.transform.microsoft.com/partner-gtm/operators/directory

::: note
Softbank が提供している UniTalk は以前まで Operator Connect に含まれていませんでしたが、2024 年 4 月から Operator Connect に統合されました。
:::
(参考：UniTalk)
https://www.softbank.jp/biz/services/collaboration/unitalk/


## Calling Plan

Calling Plan は Microsoft が通信キャリアとしてのサービスも提供する構成です。日本では提供されていませんが、Microsoft が通信キャリアのサービスを提供している地域で利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/96b4ab37-0d6d-47a5-b167-c5b2e8c34390.png)

# おわりに

Direct Routing では自分で自由に SBC と Teams を接続することができます。そのため、自分で SBC を用意すれば、通信キャリアとの契約なしで Teams 電話を検証することもできます。ご参考までに、以下の関連記事に Azure 上で Direct Routing を構成して、Teams 電話を検証する手順を記載しています。

# 関連記事

https://qiita.com/atsmin77/items/31abd44100b6841c5818
食事を記録できるLINE公式アカウントを作ってみた【Express×Supabase×Vercel】

## どんなサービス？
- LINEで何をいつ食べたかを保存できる
- 食べた食材・料理名を保存し、いつ食べたかを教えてくれる
  - 1日未満の場合は何時間前か教えてくれる

:::note warn
LINE公式アカウントは無料プランのため、全体で月/200通までが送信制限です
超過した場合は反応しなくなるので、あくまでSampleのサービスです
:::


## システム構成
![TabeReco_システム構成_new.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728622/f89e6e86-36e6-4997-8fa6-0a8c43e53c74.png)


## 使用技術
- LINE Messaging API
- Supabase
- Express + Node.js + TypeScript
- Vercel

:::note
すべて無料の範囲で作成
:::


## QRコード
![S_gainfriends_2dbarcodes_BW.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728622/e457b722-def4-476a-9a35-02a40e7fd5f3.png)




## 作ってみた感想
- 意外と簡単に作れた（所要期間:2日）
- LINEデベロッパーコンソール使えばノーコードでもある程度運用できそう
- PrismaとSupabaseを使ってDB管理しようと思ったが、上手くいかなかったので諦めた。次何か作るときはリベンジしたい


## おわりに
- 公式アカウントの画像は、原神のキャラクター「香菱(しゃんりん)」です
    - 収益目的じゃないので好きなキャラを設定しました
- Issue作ってるけど実装するかは未定

https://github.com/sumikei/TabeReco

以上
Proxmoxで仮想マシンをバックアップする（zfs形式のノードから外付けSSDへ）

　前回は一通りの流れが見渡せるダイジェスト版を公開しました。今回は仮想マシンのバックアップ取得から、外付けSSDへ保存するところまでを公開します。
　外付けSSDをノードのストレージとしてマウントし、そのストレージをターゲットにしてバックアップを取得すれば済むだけのことと思われる方もいるかもしれませんが、当方のようにサーバにProxmoxをインストールする際に zfs(RAID) を組んだ場合、エラーが出てしまいバックアップが取得できません。ここでは、そのときにコテコテしたことを記録として残します。
　なお、ext4でインストールしたノードの場合、外付けSSDをノードのストレージとしてマウントし、そのストレージをターゲットにしてバックアップを取得できましたので、この記事のような手順を踏まなくても簡単に取得できます（この記事を読む必要はないと思います）。

### １　仮想マシンのバックアップを取る
　バックアップの取得方法は、下記のイラストを参考にしてください。
![Qiita Vmのバックアップをlocalに取る3 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832918/f113cd39-bca3-49c0-995d-7cdf13c79a65.png)
#### ここがポイント！
　バックアップ先のストレージは、仮想マシンが載っているノードのlocalストレージをバックアップ先として指定します。サーバに zfs(RAID) 形式でProxmoxをインストールした場合は、この方法を試してみてください。
 
### ２　SSDをホストマシン（ノード）に接続する
　ホストマシンにSSDをUSBで接続します。
![SSDconnected - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832918/0d9e6c6e-5f89-4da8-a3de-ff6954bf78d3.png)
　ここではSSDが、デバイス　/dev/sde　として認識されています。
### ３　SSDをノードにマウントする
 SSDを接続しているノードのシェルを起動し、マウント先を作成します。最後に削除することとなるので、どこでもよいと思います。ここではルート上に追加することとします。まずはルートディレクトリを確認。
```
# cd /
# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  rpool  run  sbin  srv  sys  tmp  usr  var
```
vmSSDという名称でディレクトリを作成。
```
# mkdir /vmSSD
# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  rpool  run  sbin  srv  sys  tmp  usr  var  vmSSD
```
vmSSDが追加されました。ここにデバイス　/dev/sde　として認識されているSSDをマウントします。
`# mount /dev/sde /vmSSD`
#### マウントしようとしたらエラーが出る場合
下記のようなエラーが出た場合には、SSDのフォーマットが必要です。
```
mount: /vmSSD: special device /dev/sde/ does not exist (a path prefix is not a directory).
       dmesg(1) may have more information after failed mount system call.
```
ext4形式でフォーマットをします。
```
# mkfs.ext4 /dev/sde
mke2fs 1.47.0 (5-Feb-2023)
Found a gpt partition table in /dev/sde
Proceed anyway? (y,N) y
Creating filesystem with 122096646 4k blocks and 30531584 inodes
Filesystem UUID: a8f8104f-350c-4f7f-a4c1-7cba89b753ec
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done     
```
　フォーマット後に、再度マウントしてみると、うまくいくはずです。
### ４　SSDへバックアップデータをコピーする
　仮想マシンのバックアップ先はlocalディスク上でした。local のディレクトリは、
`/var/lib/vz`
です。シェルから当該ディレクトリ内を見てみると、
```
# cd /var/lib/vz
# ls
dump  images  template
```
のように見えます。
　dumpディレクトリ内を見てみると、
```
vzdump-qemu-101-2025_02_11-20_36_26.log
vzdump-qemu-101-2025_02_11-20_36_26.vma.zst
vzdump-qemu-101-2025_02_11-20_36_26.vma.zst.notes
```
のような感じで、バックアップした仮想マシンが保存されていることがわかります。
　仮想マシンのデータをdumpディレクトリごと、SSDへコピーします。
`# cp -r /var/lib/vz/dump /vmSSD`
　コピーが完了したら、SSDをアンマウントしてノードから取り外します。
`# umount /vmSSD`

　次回は、SSDに保存した仮想マシンをリストアする手順を公開します。
　同じノードにリストアすれば、バックアップから仮想マシンを復元することとなりますし、異なるノードにリストアすればマイグレーションすることとなります。
M5Core2: タッチパネルの使い方

## プログラム

```text:touch_panel01.ino
// ---------------------------------------------------------------
//	touch_panel01.ino
//
//						Feb/24/2025
// ---------------------------------------------------------------
#include <M5Core2.h>

#define	RADIUS	50
#define	HANTEI	60
bool button_a = false;
bool button_b = false;

int pos_before[] = {0,0};
int count_omit = 0;
int nn = 0;
// ---------------------------------------------------------------
void setup() {
	M5.begin();
  
	M5.Lcd.fillScreen(TFT_BLACK);
	M5.Lcd.fillCircle(60, 120, RADIUS, GREEN);
	M5.Lcd.fillCircle(260, 120, RADIUS, GREEN);
}

// ---------------------------------------------------------------
void touch_proc(int xx_in, int yy_in)
{
	int ip = sq(xx_in - 60) + sq(yy_in - 120);
	double lla = sqrt(ip);
	int iq = sq(xx_in - 260) + sq(yy_in - 120);
	double llb = sqrt(iq);
	Serial.printf("nn = %d\t",nn);
	Serial.printf("lla = %f\t",lla);
	Serial.printf("llb = %f\n",llb);

	if (lla <= HANTEI)
		{
		if(button_a)
			{
			M5.Lcd.fillCircle(60, 120, RADIUS, GREEN);
			}
		else
			{
			M5.Lcd.fillCircle(60, 120, RADIUS, RED);
			}
		button_a = !button_a;
		}
	else if (llb <= HANTEI)
		{
		if(button_b)
			{
			M5.Lcd.fillCircle(260, 120, RADIUS, GREEN);
			}
		else
			{
			M5.Lcd.fillCircle(260, 120, RADIUS, RED);
			}
		button_b = !button_b;
		}

	nn++;
}

// ---------------------------------------------------------------
void loop() {
  M5.update();  // タッチ状態を更新
  
  if (M5.Touch.ispressed()) {
    Point touchPoint = M5.Touch.getPressPoint();
  
	if ((pos_before[0]!= touchPoint.x) && (pos_before[1] != touchPoint.y) 
		&& (70 <=touchPoint.y) && (touchPoint.y <= 170))
		{

		touch_proc(touchPoint.x, touchPoint.y);

		pos_before[0] = touchPoint.x;
		pos_before[1] = touchPoint.y;

		count_omit = 10;
		}
	}
  
	delay(100);  // ループの遅延

	if (0 < count_omit)
		{
		count_omit--;
		}
	else
		{
		pos_before[0] = 0;
		pos_before[1] = 0;
		}
}

// ---------------------------------------------------------------
```

## Arduino IDE 2.3.4

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/e308163b-5694-4ac5-80e0-90144365a3bd.png)

## 実行時の様子

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/3154eb94-ac55-469e-9a35-d0f46f78efe3.png)
良いコード／悪いコードで学ぶ設計入門 第６章

# 第6章 条件分岐 ─迷宮化した分岐処理を解きほぐす技法─

## 6.1 条件分岐のネストによる可読性低下

### ネストが深い場合の問題
- コードの見通しが悪くなる
  - どこからどこまでがその条件の処理か読み解くのが難しい
- 複雑なロジックを正しく読み解かないと重大なバグになる
- コードを読む人全てに負荷がかかる

### 早期リターンを用いるメリット
- ネストを浅くできる
- 条件ロジックと実行ロジックを分離できる
  - メソッドのはじめに条件ロジックの確認を行い、実行できない場合は return する
- 不要な else 句を除外できることもある
  - else if が多いと見通しが悪い

> **[NOTE]**
> - ガード節の考え方がもとになっている
> - ロジックをすばやく理解するためには、ロジックの見通しの良さが重要

## 6.2 switch文の重複

### 問題点
- case が増えた場合に case の追加が漏れる
- 同じ条件式の新しい概念の switch が生まれた際に気付けない
- 切り替え対象の数だけメソッドが増える
- 可読性が低下し、修正漏れのリスクが高まる

> **[NOTE]**
> - 重複コードを生まないために、コミュニケーションをしっかり取る
> - 複雑になりそうな箇所は、チームでしっかり議論する

### 対応策
#### 単一責任選択の原則に従う
- 同じ条件式の条件分岐を一箇所にまとめる
- Class にして Constructor 内部で switch 文を用い、全ての対象を一括で切り替える

#### interface を用いる
- クラス分割による関心事の分離
- 機能切り替えが簡単になる
- コンパイラが未実装のメソッドを警告

#### Map を用いる
- switch 文を利用せず、Map (Key: enum, Value: Interface) を活用
- **Strategy Pattern** の利用

## 6.3 条件分岐の重複とネスト

### Policy Pattern を用いる
- interface を用いて、類似した条件の確認ロジックの使い回しが可能
- 判定ロジックを Rule Class として定義し、可読性を向上
- 固定された Rule Set を設定できる Policy Class を活用

## 6.4 型チェックで分岐しないこと
- instanceof で条件分岐せず、リスコフの置換原則を遵守
- 適切な Method を作成し、型判定を避ける

> **[NOTE]**
> **リスコフの置換原則**: 基本型を継承型に置き換えても問題なく動作しなければならない

## 6.5 interface の使いこなしが中級者への第一歩

| - | 初級者 | 中級以上 |
| - | - | - |
| 分岐 | 迷わず if 文や switch 文を使う | interface 設計を試みる |
| 分岐ごとの処理 | ロジックをベタ書きする | クラス化を試みる |

## 6.6 フラグ引数

### フラグ引数を使わない
- 内部ロジックを見に行かないと動作がわからない
- フラグ引数付きメソッドは複数の機能を持ち、可読性が低下
- **メソッドは単機能になるように設計する**
  - **機能ごとに分けて、それぞれのメソッドにふさわしい命名をする**

### ストラテジパターンで切り替えを実現する
- 切り替えたいロジックを Interface にする
- enum と map で切り替える

## まとめ
- ネストをなくしていく
- switch の条件式を可能な限り一箇所で管理する
- interface は必要に応じて定義していく
- Interface 設計を意識する
- リスコフの置換原則を守る
- フラグ引数を減らし、名前を見てわかるようにする

## 方針
条件分岐の可読性を向上させ、コードの保守性を高めるために、以下の方針を採用する:
- **早期リターンを活用してネストを浅くする**
- **条件分岐の重複を避け、管理を一箇所に集約する**
- **interface を活用し、設計段階で拡張性を考慮する**
- **フラグ引数を廃止し、わかりやすいメソッド名をつける**

これにより、複雑な分岐処理を整理し、可読性と保守性を向上させることを目指す。
atcoder_水色精進記録6_ABC099d

# Atcoder水色精進記録
ABC099
D - Good Grid
https://atcoder.jp/contests/abc099/tasks/abc099_d

# アルゴリズム・データ構造
全探索

# 考察
N\*NのGridなのでマス数
500\*500=250,000 =2.5 \* 10\*\*5

%3での場合分けのため、3つのリストを作ることを考える。
各リストの長さは2.5\*10\*\*5/3→定数倍を無視して2.5\*10\*\*5
色の最大種類数は30のため、各リストに対して、全種類の色に対して、塗り替えた場合の違和感の総和を求めることは可能
違和感の総和をsortして、違和感が小さい物から選ぶ
→違和感が小さい色が重なった場合はどうなる?
→30種類なので、sortせずに、全探索でOK

# 提出
https://atcoder.jp/contests/abc099/submissions/63120061

# 感想
なし
Amazon Bedrock KnowledgeBase for Neptune Analytics (GraphRAG)  で関連性のある質問に回答させてみる

:::note info
2025/02 現在プレビュー
:::

:::note info
2025/03/07 GA

https://aws.amazon.com/jp/about-aws/whats-new/2025/03/amazon-bedrock-knowledge-bases-graphrag-generally-available/
:::

# 前回までのあらすじ

検証1と検証2をご覧ください。

https://qiita.com/leomaro7/items/45db1fa9957a4fc3f396

この時はベクトルデータベースに、Amazon Auroraを利用し検証しておりました。

今回は、Neptune Analytics (GraphRAG)を利用して関連性のある複数の質問に回答できるかを試してみたいと思います。


# Neptune Analytics (GraphRAG) とは

昨年、re:Invent 2024で発表されたナレッジベースの新機能です

RAG（検索拡張生成）技術とグラフデータを組み合わせることで、AI アプリケーションがより**関連性の高い**、説明可能な回答を提供できるようにするものです。

具体的には、Amazon Neptune Analytics を活用して、データ内のエンティティ（例えば、場所や人物）とその関係性を自動的に分析し、ユーザーの質問に対してより的確な情報を提供します。

(例)
- 通常: 「EC2のネットワークが遅い」と聞くと、一般的なネットワーク最適化の方法がリストアップされる
- GraphRAG: 「EC2のネットワークが遅い、VPCの設定も確認したい」と聞くと、
➡️ 「EC2」「VPC」「サブネット」「セキュリティグループ」などの関係性を分析
➡️ 「VPCフローログを確認」「セキュリティグループの制限をチェック」「ネットワークACLのルールを確認」など、状況に応じた具体的な対策を提案

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-bedrock-knowledge-bases-graphrag-preview/


# 料金

オレゴンリージョンで試していますが、Neptune Analyticsの料金がUSD 0.48/時で割りかし高めですので、個人で試す場合はある程度情報を収集してから試すことをおすすめします。

https://aws.amazon.com/jp/neptune/pricing/


# 設定

ナレッジベース作成時にAmazon Neptune Analytics(GrahRAG)を指定するだけでです

![スクリーンショット 2025-02-24 16.47.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/842c6398-e218-429a-be58-1fa40b4f9b55.png)

他は[前回の記事](https://qiita.com/leomaro7/items/45db1fa9957a4fc3f396)で書いた設定と同じです。

- 埋め込みモデル: Titan Text Embeddingsv2
- チャンキング戦略: Semantic chunking
- Parsing strategy: Claude 3.5 Sonnet v1 (Bedrock model parsing)
- LLM: anthropic.claude-3-5-sonnet-20241022-v2:0
- temperature: 0.1
- topP: 0.9


# 検証1

前回の検証1と同じ質問`「令和6年の邦画のランキング3位を教えて下さい。また、主演を演じた俳優と誕生日を教えて。」と質問してみます。`

期待する回答は前回と同じ以下の通りです。

①邦画のランキング3位であることは、「映画ランキング.pdf」
②主演が山崎賢人であることは、「キングダム_大将軍の帰還.pdf」
③山崎賢人の誕生日は、「山崎賢人.pdf」

## "numberOfResults":  10 に設定してみる

①までしか回答してくれません。

![スクリーンショット 2025-02-24 17.32.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/434cfdea-d2b1-4b14-8593-63dc3e2df542.png)

## "numberOfResults":  30 に設定してみる

①②③まで回答してくれました。前回の記事でAmazon Auroraを利用していた場合は、"numberOfResults":  100 までにしないとここまでの回答をしてくれませんでした。
そのため、関連性の高い質問を回答したい場合は、おそらくGraphRAGが有効であることわかります。

![スクリーンショット 2025-02-24 17.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b4986459-b620-4033-bc68-5c3970da0c74.png)


# 検証2

「令和6年の映画のランキング3位を教えて下さい。」と質問します。

期待する回答は前回と同じ以下の通りです。
　邦画では「キングダム 大将軍の帰還」
　洋画では「ウィッシュ」
の回答を期待します。

## "numberOfResults": 10 に設定してみる

この段階で邦画と洋画両方回答してくれました。

![スクリーンショット 2025-02-24 17.42.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/0cb66fce-21d1-4cfe-995a-3d4929887fac.png)

## "numberOfResults": 20 に設定してみる

この段階で、邦画した答えてくれなくなりました。これは前回の記事と同じで単純な質問は、"numberOfResults"を増やすと情報量が増え適切な回答をしてくれなくなりそうです

![スクリーンショット 2025-02-22 1.38.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/96638f52-de8b-41b1-b47a-ddde57a07b11.png)
多言語対応版の、ずんだもんを Google Colabで動かす

# 結論から先にいうと
下記のNotebookを実行する。
https://colab.research.google.com/drive/1Qt23xyPifuU2DeRGBLY8YU8xTqnPNEWA?usp=sharing

# 経緯
ずんだもんが、韓国語や、広東語、英語、中国語を喋れるようになりました。
かわいいですね。

https://www.nicovideo.jp/watch/sm44693829

ただ、VOICEVOXのようにお手軽ではなく、ある程度の開発系の知識が必要です。

下記のREADMEに沿って環境を構築していきます。
https://github.com/zunzun999/zundamon-speech-webui

# Google Colab上に構築してみる

Colabを扱うのも若干ハードルがありますが、共通の環境で動かせるので、ハードルが下がると思いますので、公開しました。
実際、Readmeの手順に沿ってやるだけですが、ちょこちょこ躓くところがありました。
最終的な手順は下記です。
https://colab.research.google.com/drive/1Qt23xyPifuU2DeRGBLY8YU8xTqnPNEWA?usp=sharing


# Google Colabで実行してみたところ、躓いた点

手元にGPU環境が無いのでGoogle Colabで実行してみることにしました。
いくつかわかりにくかったので、私が躓いた点、Notebook実行時に修正した点を示します。
具体的な修正方法はNotebookを参照してください。

- `zundamon-speech-webui` 配下に、 `https://github.com/zunzun999/GPT-SoVITS.git` リポジトリをcloneする必要がある
- Zundamon Speech WebUIで指定されている、 `numba==0.56`は現行(2025/02/24)ColabのPythonバージョンに対応していないので バージョンを上げる必要上がる。
- `https://huggingface.co/lj1995/GPT-SoVITS` は、指定されたディレクトリに中身を展開する必要がある。
- `https://huggingface.co/zunzunpj/zundamon_GPT-SoVITS` は、指定されたディレクトリに中身を展開する必要がある。
- `https://github.com/zunzun999/zundamon-speech-webui` の Troubleshootingに書かれている内容を `GPT-SoVITS/zundamon_webui.py` に適用する必要がある
  - ※ `GPT-SoVITS` は、先述の `https://github.com/zunzun999/GPT-SoVITS.git` で Cloneしたもの。
- Colab で動かしているWebサーバは直接アクセスできないので、トンネリングでアクセスする必要がある

# 動作環境

CPUのみのランタイムでも動くようですが結構遅いですね。

GPU対応のランタイムだと、ぼちぼち時間がかかりますが比較的高速に音声が帰ってきます。

# 結論

ずんだもんがかわいい。

これで英語や中国語を勉強したい。