OmniAICreator/Qiita-1.07M huggingface dataset:
生成AI多すぎるから自分用も兼ねて厳選してみる【テキスト生成系】

生成AIが誕生してプログラミングだけでなく普段の事務作業まで格段に便利になりました。

様々な生成AIが誕生しているなか、自分はまだChatGPTとGithub Copilotくらいにしか知見がないことに危機感を感じ、今回勉強も兼ねてリサーチしてみることにしました。

あまり多すぎても読み飽きしてしまうと思うので、今回はテキスト生成系のAIのみをリサーチして記事にしました。

テキスト生成に関しては正直ChatGPTと他のツールにそこまで差はないと思い込んでいたのですが、各々に強い分野があるようで、二つ紹介します。

### Gemini
[Gemini](https://gemini.google.com/app?hl=ja)はGoogleが開発した生成AIで、Googleの他のサービス（Google検索、Gmailなど）と統合されているため、以下のような使い方が可能です。

・Gmailの内容を分析し、返信文を提案
・Google Driveのファイルを参照して情報をまとめる

ChatGPTとの大きな違いは、<b>情報の更新制</b>です。

ChatGPTの場合、情報がリアルタイムで更新されているわけではないので、古い情報を受け取ってしまうリスクがあります。

確かにプログラミング言語のように情報が常に変化する分野では、ChatGPTでは対応が難しい場合が多々あります。

Geminiであれば、その悩みはほぼ解消されそうです。

<b>Geminiの料金プラン
| **プラン名**         | **料金**                   | **主な機能**                                                                                          |
|-----------------------|---------------------------|-------------------------------------------------------------------------------------------------------|
| **Gemini（無料版）**  | 無料                      | - テキスト生成や編集<br>- ウェブ検索結果の要約<br>- 基本的なコード生成支援<br>- 最大 32,000 トークンのコンテキスト処理能力 |
| **Gemini Advanced**   | 月額 $20（初月無料トライアル） | - 高度なテキストおよび画像生成<br>- コードの生成、編集、実行機能<br>- Google ドキュメント、スプレッドシート、Gmail との統合<br>- 最大 100 万トークンのコンテキスト処理能力<br>- 2 TB の Google One ストレージ付属 |


### Claude
最近Xなどでよく目にすることが増えてきた[Claude](https://www.anthropic.com)

Claudeは「高度な推論能力」「多言語処理」「コード生成」の分野で高いパフォーマンスを発揮するとされています。そこで、具体的な使用方法についてまとめてみます。

①ファイルをアップロードして要約する
②Slackと連携して社内チャットボットのように利用する
③売上データや市場動向を分析し、プレゼン資料を作成する
④長文の要約をする
⑤図表の作成をしてもらう

特に⑤の図表の作成はめちゃくちゃ便利なようで複雑なフローチャートなども一瞬で作ってくれるようです。

参考記事：https://ai-gptopia.com/claude-artifacts/

<b>Claudeの料金プラン
| **プラン名**           | **月額料金**            | **主な機能**                                                                                                                                                                                                                   |
|------------------------|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Free（無料）**       | 無料                    | - **利用可能モデル**: Claude 3.5 Sonnet<br>- **メッセージ制限**: 約4～5時間ごとに10回程度の利用制限あり<br>- **特徴**: 画像やドキュメントについて質問可能                                                                                   |
| **Pro（個人向け）**    | $20（約2,990円）        | - **利用可能モデル**: Claude 3.5 Sonnet、Claude 3 Opus、Claude 3 Haiku<br>- **メッセージ制限**: 無料プランの5倍のメッセージ使用が可能<br>- **特徴**: 優先帯域幅と可用性、新機能の早期アクセス、プロジェクト機能の利用が可能 |
| **Team（法人向け）**   | $25（約3,738円）        | - **利用可能モデル**: Claude 3.5 Sonnet、Claude 3 Opus、Claude 3 Haiku<br>- **メッセージ制限**: Proプランよりさらに多くの使用が可能<br>- **特徴**: コラボレーション機能、中央請求および管理、プロジェクト機能の利用が可能        |
| **Enterprise（法人向け）** | 要問い合わせ             | - **利用可能モデル**: Claude 3.5 Sonnet、Claude 3 Opus、Claude 3 Haiku<br>- **メッセージ制限**: Teamプランよりさらに多くの使用が可能<br>- **特徴**: 拡張コンテキストウィンドウ、シングルサインオン（SSO）、ドメインキャプチャ、きめ細かな権限設定（ロールベース）、クロスドメインID管理（SCIM）、監査ログ、データソースの統合 |
【覚書】django バージョン確認

大体下記のコマンドで確認できなかったため（そもそもdjangoがインストールされていなかった、、）覚書。

```ruby:django ver確認cmd（コレでは確認できなかった）
python -m django --version
```

# これで行けた。〜Djangoの所在確認〜
python"3"をつけないといけないらしい。。

```ruby:djangoの所在確認
python3 -m django --version
```
OR

```ruby:djangoが入ってるかの確認
python3 -m pip show django
```

# おまけ：Pythonの所在確認

```ruby:python入ってるか確認
python3 --version
```

# Pythonは入ってたけどDjangoが入ってなかった場合

```ruby:djangoインストール
python3 -m pip install django
```

上記ではダイレクトにインストールされる。
仮想環境でダウンロードするには別途配慮が必要だ。


2025年、行動できない屍みたいな輩ですが、ゾンビ兼セルフネクロマンサーになりたい所存です。
えいえいおー。。（小声）

いや、巳年Qiitan可愛すぎやん
脱皮でも脱穀でもしますわ。

![スクリーンショット 2025-01-05 16.09.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/e6f0e710-eb94-b476-23cb-4522b301a2e1.png)
ABC387回答メモ

# 0.はじめに
　2025年最初のABCに挑戦。
　原因不明の肩痛はいまだ続き、集中力を欠いたせい・・・でもなく普通に
　Cが難しく、久々のABのみACとなりました。
　レートは-16の716と後退し、幸先の悪い年始となりましt。

　Ｃは解説を見ても今一しっくりこず、復習中です・・。

# 1. 	A - Happy New Year 2025
　珍しくA問題らしい簡単な問題。
　素直にAとBを入力し、足して2乗して出力してACとなりました。

　https://atcoder.jp/contests/abc387/submissions/61370018


# 2.B - 9x9 Sum
　こちらもB問題らしい簡単な問題。
　Nを入力したら、2重ループで九九を計算して足していき
　Ｎと一緒の時は足さないことでＡＣとなりました。

　https://atcoder.jp/contests/abc387/submissions/61374415


以上
Ubuntu+Nvidia GPUでサスペンド後の復帰ができない場合の対処

# 症状
- サスペンド後に復帰をしてもGPUファンなどは回るが、ディスプレイ入力がなく、キーボードやマウスも聞かない
# 環境
- Ubuntu：
    ````
    $ lsb_release -a
    No LSB modules are available.
    Distributor ID:	Ubuntu
    Description:	Ubuntu 22.04.2 LTS
    Release:	22.04
    Codename:	jammy
    ````
- GPU：
    ````
    $ nvidia-smi --query-gpu=name --format=csv
    name
    NVIDIA GeForce RTX 4070 Ti
    ````

# 対処
- 以下のリンクに倣って、サスペンドご復帰できるようにgrub情報を書き換えてやる
    - 参考：
        - https://qiita.com/ocean_f/items/60825042f10c7f43a4af
Laravel + Vue3 チーム開発を効率化！統一環境構築と品質向上の完全ガイド

# Laravel + Vue3 チーム開発を効率化！統一環境構築と品質向上の完全ガイド

チーム開発で重要なのは、環境やコード品質を一貫して保つことです。本ガイドでは、LaravelとVue3を使用したプロジェクトで効率的かつ品質を担保する開発フローを構築するための手順を紹介します。

以下の記事を順に進めることで、Dockerによる環境構築からテスト可能なアーキテクチャの実装、静的解析や自動チェックまで、チーム全体で統一された開発環境を作り上げることができます。

---

## **目次**

1. [DockerでPHP 8.4/Nginx + Node 22 + MySQL環境を構築する方法](#1-dockerでphp-84nginx--node-22--mysql環境を構築する方法)
2. [Laravel 11 + Inertia.js + Vue 3 + TypeScriptでモダンなフルスタック環境を構築](#2-laravel-11--inertiajs--vue-3--typescriptでモダンなフルスタック環境を構築)
3. [Laravel 11 + Vue 3プロジェクトにSassとBootstrap 5を導入する方法](#3-laravel-11--vue-3プロジェクトにsassとbootstrap-5を導入する方法)
4. [Laravelでテストコード込みのサービス・リポジトリパターンを実装する方法](#4-laravelでテストコード込みのサービスリポジトリパターンを実装する方法)
5. [DevContainerを使いVSCodeでPHPStan・ESLint・TypeScriptを統合して静的解析をエラー検知する方法](#5-devcontainerを使いvscodeでphpstaneslinttypescriptを統合して静的解析をエラー検知する方法)
6. [Gitコミット時に自動チェック！HuskyでESLint・PHPStan・ユニットテストを効率化する方法](#6-gitコミット時に自動チェックhuskyでeslintphpstanユニットテストを効率化する方法)

---

## **GitHubリポジトリ**

この記事で紹介した設定やアプリケーションコードのサンプルは以下のGitHubリポジトリで公開しています：

- **Docker環境設定リポジトリ**:  
  [https://github.com/keisuke2005/docker-php8.4-node22-mysql.git](https://github.com/keisuke2005/docker-php8.4-node22-mysql.git)

- **Laravel + Vue3 アプリケーションリポジトリ**:  
  [https://github.com/keisuke2005/laravel11-vue3ts-inertia.git](https://github.com/keisuke2005/laravel11-vue3ts-inertia.git)


---


## **1. DockerでPHP 8.4/Nginx + Node 22 + MySQL環境を構築する方法**
[→ 記事を読む](https://qiita.com/ukei2021/items/49eb61e4db221346dfe0)

Dockerを使用してチーム全体で同じ開発環境を構築します。PHP、Node.js、Nginx、MySQLを連携させたシンプルで強力な設定方法を解説します。

---

## **2. Laravel 11 + Inertia.js + Vue 3 + TypeScriptでモダンなフルスタック環境を構築**
[→ 記事を読む](https://qiita.com/ukei2021/items/ca36f47975e5fc5ff16e)

LaravelとInertia.jsを使ったモダンなフルスタック環境を構築します。Vue 3とTypeScriptを組み合わせ、効率的なアプリケーション開発を目指します。

---

## **3. Laravel 11 + Vue 3プロジェクトにSassとBootstrap 5を導入する方法**
[→ 記事を読む](https://qiita.com/ukei2021/items/2a0916ffc9c6ef900cb4)

チーム開発でのスタイル管理を効率化するため、SassとBootstrap 5をプロジェクトに導入する手順を紹介します。

---

## **4. Laravelでテストコード込みのサービス・リポジトリパターンを実装する方法**
[→ 記事を読む](https://qiita.com/ukei2021/items/53d3776f580cfd3a074b)

テスト可能な設計として注目されるサービス・リポジトリパターンの実装方法を解説します。Laravelでの具体的なコード例とテストコードを含めて説明します。

---

## **5. DevContainerを使いVSCodeでPHPStan・ESLint・TypeScriptを統合して静的解析をエラー検知する方法**
[→ 記事を読む](https://qiita.com/ukei2021/items/d3a91b0a34188529b6f6)

VSCodeとDevContainerを活用して、PHPStan、ESLint、TypeScriptの静的解析を効率化します。チーム全体で統一したコード品質チェック環境を構築します。

---

## **6. Gitコミット時に自動チェック！HuskyでESLint・PHPStan・ユニットテストを効率化する方法**
[→ 記事を読む](https://qiita.com/ukei2021/items/592b50cbe04aaeae575f)

Huskyを使ってGitフックを設定し、コミット時に自動でESLint、PHPStan、ユニットテストを実行する方法を解説します。エラーを未然に防ぐ開発フローを構築します。

---

## **まとめ**
このガイドを通じて、チーム全体で一貫した環境と高品質なコードを実現する方法を学ぶことができます。それぞれの記事を参考にしながら、自分たちのプロジェクトに最適な開発フローを構築してください。

「チーム開発を効率化したい」「コード品質を保ちながらスピード感を持ちたい」そんな方々にとって、この記事が役立つことを願っています。
MultiheadAttentionの出力の形状を確認する

MultiheadAttentionの出力の形状を確認してみます。
適当な設定で宣言をし、乱数をquery, key, valueとして入力します。
乱数が入力されているかつ学習もされていないので、出力の値には意味がありません。あくまでも、形状のチェックが目的です。
```python
import torch
import torch.nn as nn

# 設定
batch_size = 4      # バッチサイズ
seq_length = 10     # シーケンスの長さ
embedding_size = 32 # 埋め込みサイズ
num_heads = 2       # Attentionのヘッド数

# ランダムデータの生成
# バッチサイズ x シーケンス長さ x 埋め込みサイズ のランダムデータ
query = torch.randn(seq_length, batch_size, embedding_size)   # クエリ
key = torch.randn(seq_length, batch_size, embedding_size)     # キー
value = torch.randn(seq_length, batch_size, embedding_size)   # バリュー

# MultiheadAttentionの設定
multihead_attention = nn.MultiheadAttention(
    embed_dim=embedding_size,  # 埋め込みサイズ
    num_heads=num_heads,       # Attentionのヘッド数
    dropout=0.1                # ドロップアウト率
)

# アテンションの計算
# query, key, value はすべて (seq_length, batch_size, embedding_size) という形状です
output, attention_weights = multihead_attention(query, key, value)

# 出力のサイズを確認
print(f"Output shape: {output.shape}")
print(f"Attention weights shape: {attention_weights.shape}")

print(output)
```


```python
Output shape: torch.Size([10, 4, 32])
Attention weights shape: torch.Size([4, 10, 10])
tensor([[[ 0.1713, -0.2676, -0.0591,  ..., -0.0712, -0.0633,  0.1592],
         [-0.0424, -0.1004,  0.1188,  ...,  0.0526,  0.0797, -0.1483],
         [-0.0829, -0.1702,  0.0319,  ...,  0.1743,  0.0711,  0.1157],
         [-0.0258, -0.0024,  0.0192,  ..., -0.0217,  0.1270, -0.1470]],

        [[ 0.0273, -0.1164,  0.1897,  ...,  0.1240, -0.1581,  0.0513],
         [-0.0379,  0.0415,  0.1967,  ...,  0.0629,  0.0220, -0.1570],
         [-0.1271, -0.2191,  0.0715,  ..., -0.0848, -0.0655,  0.0260],
         [ 0.0506, -0.0920, -0.0293,  ...,  0.0104,  0.2500,  0.1290]],

        [[ 0.0452, -0.0528, -0.1012,  ..., -0.0429,  0.1069,  0.0166],
         [ 0.0841, -0.0791,  0.2010,  ..., -0.1204,  0.0417, -0.1295],
         [ 0.0679, -0.2161,  0.0100,  ..., -0.0142, -0.0047,  0.0991],
         [ 0.0333, -0.1052, -0.1009,  ..., -0.1023,  0.1071, -0.0949]],

        ...,

        [[ 0.1572, -0.2214,  0.0624,  ..., -0.0173, -0.0019,  0.1955],
         [ 0.0669, -0.1636,  0.2195,  ...,  0.0009, -0.0018, -0.1998],
         [-0.3079, -0.1937, -0.0058,  ..., -0.1234,  0.1939,  0.0098],
         [ 0.0121, -0.0515, -0.0999,  ..., -0.0573,  0.1333, -0.1043]],

        [[ 0.1728, -0.4110, -0.0294,  ..., -0.0683,  0.0476,  0.1301],
         [ 0.0846, -0.0632,  0.0253,  ..., -0.1755,  0.0539, -0.0639],
         [-0.1748, -0.1014,  0.0090,  ..., -0.0198, -0.0062, -0.0573],
         [-0.0305,  0.1544, -0.0525,  ..., -0.1008,  0.0284, -0.0273]],

        [[ 0.0601, -0.1530,  0.1416,  ...,  0.1298, -0.1676,  0.1102],
         [ 0.0972, -0.0521,  0.2555,  ..., -0.1308, -0.0005, -0.2223],
         [-0.0917, -0.3137,  0.1493,  ..., -0.0399,  0.0784,  0.0322],
         [ 0.0555, -0.0470, -0.0173,  ...,  0.0620,  0.0864, -0.0523]]],
       grad_fn=<ViewBackward0>)
```

より理解を進めるためには重みの形状だけではなく、こちらの記事なども参考にMultiheadAttentionの計算の中身を確認してみると良さそうです。
https://blog.amedama.jp/entry/pytorch-multi-head-attention-verify
WSLで動作するVivadoでJTAGを使う方法

# はじめに

WSLで動作するVivadoからJTAGを使う方法をメモしておきます。

# バージョン

Windows 11　23H2
Vitis/Vivado 2024.2
WSLのOS　Ubuntu 24.04

# 手順
HostのWindows側に、Vivado Lab ソリューションをインストールする。
通常のvivadoでもよいが、こっちの方がディスク容量が少ない。

https://japan.xilinx.com/member/forms/download/xef.html?filename=Vivado_Lab_Win_2024.2_1113_1001.tar

hw_serverを起動する。
-dをつけてデーモンとして起動してもよいです。
```
cd C:\Xilinx\Vivado_Lab\2024.2\bin
.\hw_server.bat
```

WSLで動作しているvivadoでOpenTargetを選択する。
AutoConnectを選択する
Connecting to server...の表示でつながるまで待つ（２～３分）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/5a41c15f-3204-b537-9995-954493281fe0.png)

AutoConnectでなく、localhostを指定してみたりいろいろ試してみましがた、つながるまでに時間がかかる状況に違いはありあせんでした。

つながるまでに時間がかかりますが、Program Deviceは遅延なく実行できました。

# うまく行かない時

hw_serverが動作してるか確認する方法

WSLのコンソールから、telnetなどで、3121に接続して応答があれば、hw_serverが動作している事を確認できます。

```
$ telnet localhost 3121
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
ELocatorHello["ZeroCopy","ContextPCIe","ArmDAP","JtagFpga","Dpc","MicroPython","ContextXvc","DebugCorePolling","DebugCore","XicomEverest","stapl","svf","XicomSysmon","zynqflash","XicomFlash","bpi","spi","xsdb","Xicom_v1.00","Xicom_v1.01","xicom_0","Xicom","XilinxReset","JtagDevice","JtagCable","Jtag","ContextParams","Diagnostics","Profiler","Disassembly","DPrintf","PathMap","Streams","Expressions","FileSystem","LineNumbers","SymbolsProxyV2","SymbolsProxyV1","Symbols","StackTrace","Registers","MemoryMap","Memory","Breakpoints","RunControl","ContextReset","ContextQuery","Locator"]
```

#　おまけ２

私のWSLは、```networkingMode = mirrored```にしています。


```ini:C:\Users\UserName\\.wslconfig
[wsl2]
networkingMode = mirrored
```
【Rustで学ぶWebAssembly】1-1-2 関数定義

[前回](https://qiita.com/neet244/items/5b757e78e629f135ebb1)の続き

# 関数

```rust
// u32型の値を返す関数
// u32型は符号なし32ビット整数型
fn greeting() -> u32 {
  println!("Hello, from WebAssembly!");
  42
}

// ユニット型を返す関数
// ユニット型は意味を持たない値を表す型
// 返り値がない場合に使われる
// 省略可能
fn greeting2() -> () {
  println!("Hello, from WebAssembly!");
}

```

# 構造体

```rust
struct HelloWorld {
  count: u32,
}

fn say(hello_world: HelloWorld) {
  println!("カウンター: {}", hello_world.count);
}

fn new_hello_world(count: u32) -> HelloWorld {
  HelloWorld { count }
}
```

# 所有権

```rust
  let hello_world = new_hello_world(42);
  say(hello_world);
  // エラーが発生する
  // 所有権が移動しているため
  // say(hello_world);
```

```
error[E0382]: use of moved value: `hello_world`
  --> src/main.rs:10:7
   |
8  |   let hello_world = new_hello_world(42);
   |       ----------- move occurs because `hello_world` has type `HelloWorld`, which does not implement the `Copy` trait
9  |   say(hello_world);
   |       ----------- value moved here
10 |   say(hello_world);
   |       ^^^^^^^^^^^ value used here after move
   |
note: consider changing this parameter type in function `say` to borrow instead if owning the value isn't necessary
  --> src/main.rs:32:21
   |
32 | fn say(hello_world: HelloWorld) {
   |    ---              ^^^^^^^^^^ this parameter takes ownership of the value
   |    |
   |    in this function
note: if `HelloWorld` implemented `Clone`, you could clone the value
  --> src/main.rs:28:1
   |
9  |   say(hello_world);
   |       ----------- you could clone this value
...
28 | struct HelloWorld {
   | ^^^^^^^^^^^^^^^^^ consider implementing `Clone` for this type

For more information about this error, try `rustc --explain E0382`.
error: could not compile `hello-rust` (bin "hello-rust") due to 1 previous error
```

owner から所有権がanother_ownerに移動する。つまり参照する値が存在しない状態になる。参照する値が存在しないにも関わらず値を参照しようとするためビルドエラーになる
```
  let owner = new_hello_world(43);
  let another_owner = owner;
  say(owner);
```

HelloWorldを返すように修正

```rust
  let owner = new_hello_world(43);
  let owner = say_and_return(owner);
  say_and_return(owner);

fn say_and_return(hello_world: HelloWorld) -> HelloWorld {
  println!("カウンター: {}", hello_world.count);
  hello_world
}
```

# 借用

所有権の移動をしたくない場合に利用する

```
  let hello_world = new_hello_world(0);
  let borrowed = &hello_world;
  say2(borrowed);

fn say2(hello_world: &HelloWorld) {
  println!("カウンター: {}", hello_world.count);
}
```
laravelでエクセル or PDFでダウンロード

## やりたいこと
laravelで請求書などの帳票を
・エクセル
・PDF
の形式でDLさせたい。

DLさせる帳票のテンプレートはエクセルで作成したい。
（前回htmlでテンプレートを作成したが微調整が大変だったため）

## 必要なライブラリのインストール
・Maatwebsite Laravel Excel
```console:コンソール
composer require maatwebsite/excel
```

・Dompdf (HTMLをPDF化するライブラリ)
```console:コンソール
composer require dompdf/dompdf
```

## 日本語フォントのインストール
[IPAフォント 4書体パック(Ver.003.03)](https://moji.or.jp/wp-content/ipafont/IPAfont/IPAfont00303.zip)
zipファイルとしてダウンロードされます。
その中にあるファイルをstorage/fonts/ディレクトリの下にコピー。

## ユーティリティツールをダウンロード
ttfファイルをcssのfont-familyから呼び出せる形式に変換してくれるユーティリティツール。
[load_font.php](https://github.com/dompdf/utils/blob/master/load_font.php)
これをDompdfのディレクトリに直接配置します。
vendor/dompdf/dompdf/

以下のようにしてフォントをロードさせる。

```console:コンソール
php vendor/dompdf/dompdf/load_font.php ipag storage\font\ipag.ttf    
```

## 帳票のテンプレートを設置
以下にテンプレートとなるエクセルファイルを設置
storage\app\private\templates
例）template.xlsx

一次ファイル置き場に以下のフォルダも作成しておく
storage\app\private\temp

## テンプレートに値を入れてDL
```php:
use Illuminate\Support\Facades\Storage;
use Maatwebsite\Excel\Facades\Excel;
use PhpOffice\PhpSpreadsheet\IOFactory;
use Dompdf\Dompdf;
use Barryvdh\DomPDF\Facade\Pdf;

// ストレージからテンプレートExcelを読み込む
$templatePath = Storage::path('templates/template.xlsx'); // ストレージのファイルパス
$spreadsheet = IOFactory::load($templatePath);

// フォントを明示的に設定
$spreadsheet->getDefaultStyle()->getFont()->setName('ipag');

// 必要な値を挿入 (例: シート1の特定のセルにデータを入れる)
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', '会社名: Example Inc.');
$sheet->setCellValue('B2', '2025-01-01'); // 日付
$sheet->setCellValue('C3', '製品名: Laravel Pro'); // 製品名
$sheet->setCellValue('D4', '数量: 100'); // 数量
$sheet->setCellValue('E5', '合計: ¥500,000'); // 合計

// 一時ファイルとして保存
$tempFilePath = Storage::path('temp/modified_template.xlsx');
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save($tempFilePath);

// ExcelをHTMLに変換
$html = IOFactory::createWriter($spreadsheet, 'Html');
ob_start();
$html->save('php://output');
$excelAsHtml = ob_get_clean();

// HTMLをPDFに変換
$dompdf = new Dompdf();
$dompdf->loadHtml($excelAsHtml);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();

// PDFをダウンロードとして出力
return response()->streamDownload(function () use ($dompdf) {
    echo $dompdf->output();
}, 'document.pdf');

// Excelを直接ダウンロードする場合
// return response()->download($tempFilePath)->deleteFileAfterSend(true); 
```


以上のようにして帳票をDLさせることができます。
Beam subjected to moment load はりの応力とSFD，BMD 基本例題4.21 P99 「材料力学演習(20221021)」をsympyでやってみたい。


モーメント荷重が作用するはり(端部)

:::note info
前　 [基本例題4.20 P98(中央部)
](https://qiita.com/mrrclb48z/items/47031559f851cf463532)
:::


# オリジナル
[基本例題4.21 P99](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=104)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
？？？タブレット等で、pdfを開く事ができないかも。？？？　

# sympyで
・ver0.1
```python
# ver0.1
# 基本例題4.21 P99
from sympy import *
var('MC,l,x,RB',real=True)
F =(MC/l).subs({MC:1000,l:1})     ;print("#",F)
RA=F
M =RA*x                           ;print("#",M)
print()
F =(MC/l).subs({MC:1000,l:1})     ;print("#",F)
RA=F
M =(RA*x-MC).subs({RA:F,MC:1000}) ;print("#",M)
RB=solve(Eq(RA+RB,0),RB)[0]       ;print("#",RB)
# 1000
# 1000*x

# 1000
# 1000*x - 1000
# -1000
```

# 作図
(省略)

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

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

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
＞単純ばり 12)
＞構造力学公式集 表5.2 単純ばりの公式　p138
LaTeXにて、図のrefの値がずれてしまう問題を解決する

## どんな問題

次のような図を挿入した。

```LaTeX
  \begin{figure}[htbp]
    \includegraphics[width=7cm]{img/capture.png}
    \label{fig:Viewerの画面キャプチャ}
    \caption{Viewerの画面キャプチャ}
  \end{figure}
```

次に、この画像を参照した。

```LaTeX
  Viewerは、ユーザがアプリケーションを直感的に操作できるフロントエンド部分を担う。
  (図.\ref{fig:Viewerの画面キャプチャ})
```

画像のキャプションは問題なく生成された。

![Screenshot 2025-01-05 at 15.13.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630841/5555d9bd-ca95-655d-33dd-45214be205f2.png)


しかし、生成された文章は次のようになった。

![Screenshot 2025-01-05 at 15.13.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630841/9c935082-b5ca-be53-82f0-b0532c5b4a69.png)

$ref$の値がずれてしまったのだ。何度確認しても、$label$の値は合っている。

## 解決

$label$を$caption$の次の行に記述する。

```LaTeX
  \begin{figure}[htbp]
    \includegraphics[width=7cm]{img/capture.png}
    \caption{Viewerの画面キャプチャ}
    \label{fig:Viewerの画面キャプチャ}
  \end{figure}
```

## 結果

![Screenshot 2025-01-05 at 15.16.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630841/9268abc3-0283-66c3-ed71-cf4d689f352e.png)

問題なく参照されるようになった。
2025年1月 cursor周りのキャッチアップ

cursorの最新機能や一部の便利で見つけにくい機能をキャッチアップできておらず使いこなせていないのでキャッチアップした内容のメモ。

## Comporser

複数のファイル編集や新規ファイル作成を行うことができます。また、Agent機能を利用してツールの呼び出しも可能です。

編集に加え、Agent機能を活用してルールに従っていないファイルを検出することもできます。ただし、Agent機能を利用するにはClaudeのモデルを使う必要があります。

[公式ドキュメント:Composer](https://docs.cursor.com/composer/overview)

## .cursorrules

プロジェクトのルートディレクトリに `.cursorrules` というテキストファイルを配置し、常にAIに意識させたいルールを記述します。

.cursorrules がキュレーションされたリポジトリ([awesome-cursorrules](https://github.com/PatrickJS/awesome-cursorrules))がありますので、プロジェクトに合わせてコピーして来てからカスタマイズするのが良いでしょう。

[公式ドキュメント:.cursorrules](https://docs.cursor.com/context/rules-for-ai#cursorrules)

## Notepads - ベータ

メモのように情報を整理して保存しておき、ChatやComposerで「@」を使用して参照することで、簡単にコンテキストに追加できます。ファイルエクスプローラ(左サイドバー)の「Notepads」セクションで作成します。

.cursorrules と異なり、内容にシンボル(@〜)を含めることができます。

[公式ドキュメント:Notepads](https://docs.cursor.com/features/beta/notepads#notepads)

残念ながら現時点ではNotepadsはファイルとして扱うことができず、git管理してチーム内で共有するといったことはできないようです。

ベータ機能なので、設定の「Beta」セクションから有効にする必要があります。

## Bug Finder - ベータ

メインブランチと現在のブランチの差分について不具合が含まれていないか分析してくれる機能です。PR提出前のチェックに便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6571/931adbdb-bddb-a835-fad2-2a7460a76f46.png)

Advanced Configurationでカスタムプロンプトの指定や比較するブランチの変更もできます。

「Run Fast」と「Run Smart」が選べますが「Run Smart」は非常にハイコストなので注意が必要。

設定の「Beta」セクションから有効にする必要があります。

## `@Git`

`@Git`シンボルを使うとDiff with main branch(メインブランチとの差分)やDiff of Working State(HEADとの差分)を指定できます。
コミットやPR提出前にAIからレビューしてもらいたい場合などに非常に便利です。


[公式ドキュメント:@Git](https://docs.cursor.com/context/@-symbols/@-git#git)

## Clineを使うべきか

ClineとはVSCode拡張として提供されるコーディング支援エージェントです。OSSとして開発されており、機能性においても高い評価を得ています。

実際にはClineのフォークであり機能追加された[Roo Cline](https://github.com/RooVetGit/Roo-Cline)という拡張を使う方が多いようです。

cursorがエージェント機能を拡充してきたことで現時点では大きな差はなく、どうしてもVSCodeでエージェントを使いたい人やOSSであることに拘りたい人でなければ、あえてcursorからVSCode+Clineに移行する必要はないというのが現時点での私の見解です。
関数のある引数(プロパティ名)から他のある引数にそのプロパティの型を入れる方法

React擬きのJSX関数を作る時のメモです。
## どういうことか
```ts:create_dom.ts(before)
export const CreateDOM = (tag: string, props: object): HTMLElement => {
    const el = document.createElement(tag);
    switch(tag){
        case "a":
            el.href = props.href;
        case "p":
            el.textContent = props.text;
            break;
        case "img":
            el.src = props.src;
            el.alt = props.alt;
            break;
    }
    return el;
}
```
```ts:index.ts
import { CreateDOM } from "./create_dom.ts";

CreateDOM("p", {text: "aaaa"})
//             ↑ここで型推論したい！！！
```
## 1.まず型を定義する
```ts:types.ts
export interface ElementProps{
    p: {text: string},
    a: {text: string, href: string},
    img: {src: string, alt: string},
    h2: {text: string}
}
```
## 2.型から空の実装(?)を作る
```ts:types.ts
export interface ElementProps{
    p: {text: string},
    a: {text: string, href: string},
    img: {src: string, alt: string},
    h2: {text: string}
}
//型を決めておく(ここ重要、XX|undefinedや?が効かなくなる。)
export const ImplementElementProps: ElementProps = {
    p: {text: ""},
    a: {text: "", href: ""},
    img: {src: "", alt: ""},
    h2: {text: ""}
}
```
## 2.プロパティ名になる部分をジェネリックにする
```ts:create_dom.ts(after)
import { type ElementProps, ImplementElementProps } from "./types.ts";
export const CreateDOM = <K extends keyof ElementProps>(tag: K, props: typeof ImplementElementProps[K]): HTMLElement => {
    const el = document.createElement(tag);
    switch(tag){
        case "a":
            el.href = props.href;
        case "p":
        case "h2"
            el.textContent = props.text;
            break;
        case "img":
            el.src = props.src;
            el.alt = props.alt;
            break;
    }
    return el;
}
```
## 解説(適当)
ジェネリックで前もってkeyofにして引数の型を固定しておけば型がしっかりすると思われる。
propsの部分はtypeofから変数を参照してtagをプロパティ名として使えるようにして[]でアクセスし型を取得できていると思われる。

TypeScriptの複雑な型の解決は難しいが解決出来た瞬間が非常に気持ちいいのである。Microsoftは神。
じゃんけんアプリを作成する

完全に復習用の初学者向けです！:raising_hand_tone1:
Chat GPTに質問しながら作成しています！
最後に気づきをまとめますので、最後までどうぞご覧ください！！

## 内容
・ユーザーがじゃんけんを選択する
・コンピュータがじゃんけんをランダムで選択する
・勝ち負けが表示される
・連勝記録が記録される
・戦績（勝ち・負け・引き分け）が記録される

## 実際にコードを書いてみる

### ターミナルで新規フォルダ作成・移動
```
rails new janken_app
cd janken_app
```

### ターミナルで「janken」コントローラー新規作成
```
rails generate controller Janken index
```

## config/routes.rbでアクション指定
```config/routes.rb
Rails.application.routes.draw do
  root 'janken#index'
  post 'janken/play', to: 'janken#play'
end
```

## コントローラーにコード記載
```app/controllers/janken_controller.rb
class JankenController < ApplicationController
  before_action :initialize_session

  def index
    # セッションから戦績データを取得してビューに渡す
    @streak = session[:streak]
    @user_score = session[:user_score]
    @computer_score = session[:computer_score]
    @result = session[:result]
    
  end

  def play
    user_choice = params[:choice]
    computer_choice = ["グー", "チョキ", "パー"].sample

    # 勝敗の判定
    if user_choice == computer_choice
      result = "引き分け"
    elsif win?(user_choice, computer_choice)
      result = "勝ち"
      session[:user_score] += 1
      session[:streak] += 1
    else
      result = "負け"
      session[:computer_score] += 1
      session[:streak] = 0
    end

    # 結果をセッションに保存
    session[:result] = {
      user_choice: user_choice,
      computer_choice: computer_choice,
      result: result
    }

    redirect_to root_path
  end

  private

  def initialize_session
    # セッションの初期化
    session[:user_score] ||= 0
    session[:computer_score] ||= 0
    session[:streak] ||= 0
    session[:result] ||= {}
  end

  def win?(user_choice, computer_choice)
      (user_choice == "グー" && computer_choice == "チョキ") ||
      (user_choice == "チョキ" && computer_choice == "パー") ||
      (user_choice == "パー" && computer_choice == "グー")
  end
end
```
## ビューにコード記載
```app/views/janken/index.html.erb
<h1>じゃんけんアプリ</h1>
<div>
  <h2>じゃんけんを選択:</h2>
  <form action="/janken/play" method="post">
  <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
  <button type="submit" name="choice" value="グー">グー</button>
  <button type="submit" name="choice" value="チョキ">チョキ</button>
  <button type="submit" name="choice" value="パー">パー</button>
</form>
</div>

<div>
  <h2>結果</h2>
  <% if @result.present? %>
    <p>あなたの選択: <%= @result[:user_choice] || @result["user_choice"] %></p>
    <p>コンピューターの選択: <%= @result[:computer_choice] || @result["computer_choice"] %></p>
    <p>結果: <%= @result[:result] || @result["result"] %></p>           
  <% else %>
    <p>じゃんけんを選択してください。</p>
  <% end %>
</div>

<div>
  <p><strong>現在の連勝数:</strong> <%= @streak %></p>
  <p><strong>戦績:</strong> 勝ち: <%= @user_score %>, 負け: <%= @computer_score %></p>
</div>

```

## ターミナル上で「rails server」を実行し、動かす
```
rails server
```

## 動かしてみた結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925638/a8aa9dcb-28d8-b596-4db4-8015863836d8.png)

・かなり簡素な仕上がりですが、動くので及第点

・ボタンを押して「結果」のみに勝敗が表示されるだけで
　あっけなさすぎるので、勝ち負け演出を足したい

・じゃんけんの選択欄も画像足したい

・有利カード（相手のじゃんけんを2択、相手はグーしか出せない）
　みたいなのも面白いかも

## 気づいた点

### CPU側のじゃんけんランダム選出
```
computer_choice = ["グー", "チョキ", "パー"].sample
```
配列のうしろに「.sample」だけでも動くんだなあと
（このsampleでランダム選出される）
Laravel11 苦戦

Laravel11のファイルがコンパクトになっており、いろいろ追加でファイル作成が必要だった


### api.phpを追加
Laravel Sanctumをインストール
これだけでもOKみたい　```php artisan install:api ```

手動の場合は↓
1 routes/api.phpを作成
2 bootstrap/app.phpに``` api: __DIR__.'/../routes/api.php' ```を追加
3 RouteProviderを作成して、bootstrap/provider.phpに追加
```
<?php

namespace App\Providers;

use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();
    }

    /**
     * Define the routes for the application.
     *
     * @return void
     */
    public function map()
    {
        $this->mapApiRoutes();
        $this->mapWebRoutes();
    }

    /**
     * Define the "web" routes for the application.
     *
     * These routes all receive session state, CSRF protection, etc.
     *
     * @return void
     */
    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    }

    /**
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapApiRoutes()
    {
        Route::prefix('api')
             ->middleware('api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
    }
}

```

### cors通信可能に
デフォルトで通信はできるがセキュリティ的にガバガバなので調整が必要
```
php artisan config:publish cors
```


#### API通信ができなくて苦戦
5時間くらい時間がかかってしまった
原因はengixのdefault.conf設定が原因だった



### Sanctumで認証
下を完全参考
https://qiita.com/genkaitoppa_programmer/items/dbf54c2cf9822a66bddd
【RAG】性質と勘違いされやすい点をまとめてみました

# はじめに
RAGが認知されて2024年は、多くのRAGを用いたシステムが世の中に生み出された年だったように感じます。2025年もまだまだ、成長を続け世の中で活躍すると思われるRAGについて改めて、その性質や勘違いされやすい点を整理したいと思います。

# こんな人にお勧めです
・RAGを用いたシステム開発を始める方
・RAGを用いたシステムを業務に取り入れる方

# RAGとは
RAGとは、Retrieval-augmented generation（検索拡張生成）の略です。
事前にデータベースに取り込んだ情報をAIで検索することで、意味として近いものを使用して回答を生成することができます。ChatGptと仕組みが異なるのは元情報がないと基本的には回答を生成できない点です。
メリットは、一般的に検索に利用できない情報を利用して回答の生成が可能です。
反してデメリットは、元情報を登録するのにヘッダーや目次、一覧情報などを事前に削除したりする必要があるなど情報を準備するのに一定の制約のようなものがあります。
そんなRAGという技術は、当然万能な魔法のツールではありません。
というのも、このRAGという技術、Googleなどのキーワード検索と異なり、LLMが意味としてこうだろうというベクトル（数値）に置き換えたうえでその位置関係で検索を行うセマンティック検索という手法を用いています。
その為、全然関係がない情報でもベクトルさえ近ければ、何でも検索してきてしまうという欠点を抱えており、実はただ実装すればOKでは使えないのが辛いところです。

# RAGの成果を出にくいよくある勘違い
**➀ キーワード検索と同じ入力を行う**
これは開発当初や利用者で多い勘違いなのですが、RAGを用いたシステムを実行する際、GooGleなどのキーワード検索するような入力をしてしまうことが多いです。
例えば、【コマンド　削除　コマンドプロンプト】など、キーワードを入力することでGoogleなどキーワード検索では求めている情報取得しようとします。
これが、RAGの場合はセマンティック検索という意味検索と呼ばれる生成AIを用いた文脈が理解できる文書を入力する必要があります。
先ほどの例でいえば、【コマンドプロンプトで削除する為のコマンドを教えてください】のように入力する必要があります。
この入力のやり方を間違えると、回答結果が出にくくなります。
また、抽出したい情報と同じキーワードを入力したからといって必ずその情報を抽出できるわけではありません。あくまで、抽出したい情報と意味として近い言葉を入力するという点を意識してください。

**➁ RAGはどんな情報も回答できる**
メリットばかりがフォーカスされて、社内規定など特定の団体しか持ちえない情報を取り込んで使用できるという点は知られていますが、デメリットとして知らない情報に関しては全く回答を生成できません。
その為、知らずになんでも質問をして、全然回答を生成できないと感じる場合があります。その場合は、必ず事前に取り込んだ情報なのかを確認する必要があります。
確認するイメージとしては、下の画像の一番左のデータベースの部分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875283/d2ca7a65-50de-3d51-63b9-727dd35b12b9.png)

RAGシステムは、データベースに取り込んだ資料データをセマンティック検索を行ってその情報を抽出することで、LLMへ連携するデータを得ることが出来ます。
そのデータベースに情報自体が無い場合は当然回答も出来ない、という結果になります。その点を気を付けてください。

**➂ 沢山情報を与えると回答精度が上がる** 
RAGの場合、情報量が多いほどハルシネーション（幻覚）が発生する可能性が高くなります。これには、与えられた情報の中から意味として近いものをLLMが抽出して回答を生成することに理由があります。情報が多いほど、ベクトルが近いと判断した誤った情報を抽出する可能性が上がり、結果想定していた正しい情報がLLMへ連携されなかったり、されたとしても無関係な情報が多いことで正しい回答を生成できない場合も増えます。

その為、RAGを利用する際は可能な限り、正しい情報を少ない情報でLLMへ連携させる必要があります。


**➃ 回答速度が早い**
うえの絵でも記載してありますが、セマンティック検索の場合は最初にセマンティック検索を行い、その抽出結果をLLMへ連携し、回答を生成してもらうため、GooGleなどのキーワードに比べて速度は遅くなります。
例えば、なんの工夫を行わずにただ実装した場合、1分はかかると考えていたほうがいいです。ただの検索としての利用を想定していた場合、この速度の遅さにがっかりして使えないと判断されがちです。

**➄ どのモデルでも性能は変わらない**
現行（令和7年1月時点）、ChatGptのGpt4o、CohereのCommand-R+、AnthropicのClaude3.5などいくつかのモデルがLLMには存在しています。それぞれに回答の精度や速度、API連携の金額、日本語の理解度が異なる為、どれが一番適しているかを試しながら実装してみることをお勧めします。

# 課題は解消できるのか？
これらの課題について、解消が可能なのか完璧ではないものの実用レベルでの解消は可能です、と回答致します。というのも、例えば回答精度を上げれば、回答速度が低下するなど二律背反となる部分が絶対に存在し、何を優先させるかを決めて開発することが求められるからです。

課題として解消したいものを定めて、それを解消できたところでその他にも着手していくことを最も重要となります。

# 終わりに
RAGは、その仕組みを知るともっと精度の高いシステムを構築したり、求めた回答を得ることが出来るようになります。どんな文章をLLMに与えたらよいのか、どのような質問をしたら良いのか、どのくらいの量に抑えたほうがLLMの回答精度が上がるのか、このようなことを意識しながら、RAGに触れて頂けたらと思います。
Go言語(プログラミング)入門メモ③-1

# 制御構文
## If文
if 条件式{}と書いて、{}内で条件に当てはまった際実行する処理を書く。
例えば、変数numの値を2で割った余りが0の場合、「by2」と表示するif文の処理は以下のように書く。
~~~
num := 4
if num%2 == 0{
    fmt.Println("by 2")
}
//by 2と出力される
~~~
また、if文の条件に当てはまらない場合の処理を作成するときは、if文のあとにelse節を書く。上記にif文の条件に当てはまらなかったとき、elseと表示させたい場合は以下のように書く。
~~~
num := 5
if num%2 == 0{
    fmt.Println("by 2")
}else{
    fmt.Println("else")
}
//elseと出力される
~~~

さらに、if文以外にも適用させたい条件がある場合はelse ifで条件と処理を記載する。
~~~
num := 9
if num%2 == 0{
    fmt.Println("by 2")
} else if num%3 == 0{
    fmt.Println("by 3")
} else {
    fmt.Println("else")
}
//by 3と出力される
~~~

## 複数の条件がある場合
And条件を示したいときは、&&を使用する。
Or条件を示したいときは、||

~~~
x, y := 10, 10
if x == 10, y == 10 {
    fmt.Println("&&")
}

if x == 10 || y == 10{
    fmt.Println("||")
}
//
&&
||
と出力される
~~~

## if文の条件式で変数を宣言する
変数numが2で割り切れればokを、割り切れなければnoを返すby2関数を作る。また、main関数の中でby2関数を使って、okが返ってきたときにgreatを出力する処理を作る。

~~~
func by2 (num int) string{
    if num%2 == 0{
        return "ok"
    }else {
        return "no"
        }    
}
func main () {
    result := by2(10)
    if result == "ok" {
        fmt.Println("great")
    }
}

//by2関数の引数は10のため、返り値がokとなる。そのため、main関数でgreatと出力される。
~~~

上記のコードでは、変数resultにby2関数の返り値を代入する処理と、if文の条件をそれぞれ分けて書いている。
このような変数への代入とif文の条件を1行にまとめて書く場合、if文のあとに変数を宣言し、;でつなげて条件を書く。
~~~
func by2 (num int) string{
    if num%2 == 0{
        return "ok"
    }else {
        return "no"
        }    
}
func main () {
    if result2 := by2(10); result2 == "ok" {  //変数への代入とif文をまとめて書いている
        fmt.Println("great2")
    }
}
~~~
1行にまとめて書く場合、変数の値を以降のプログラムで使用することはできない。そのため、変数の値をif文以降でも使うのであればまとめてかかないようにする必要がある。

## 学習に使用した教材
・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP

・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897
comelang version 12.0.5リリース

boehm gcを再びサポートしてます。-gcオプションでいけます。
あとはcomelang-str.h comelang-net.hがヘッダーをincludeするだけで使えます。
ライブラリを消してヘッダーに記述しました。boehm gcもその関係で加えることができました。
-net, -strオプションは必要かもしれませんが。
boehm gcを使うとデフォルトのリファレンスカウントGCを使う必要がありません。
まあ、Nimとかと一緒ですね。

あとはリファクタリングとGCにバグがあれば修正したいと思います。
AWSを用いたwebアプリケーションの作成　〜EC2の環境設定〜

# はじめに
前回の記事で初期段階の立ち上げまではうまくいったので、
今回はEC2の環境をセットアップしていきたいと思います。

### 〜おしながき〜
1.　nginxのインストール、起動
2.　GithubからEC2へのレポジトリのクローン
3.　パブリックIPアドレスを用いて、「Hello World」を表示させる


# 1. nginxのインストール、起動
そもそもnginxってなんぞやって最初の時は思っていたので、ざっとまとめたいと思います。

- 無料で使えるwebサーバソフトのこと
- リバースプロキシ、HTTPキャッシュ、ロードバランサの役割を持つ
- Apacheなども同じ役割を持つ

みたいな感じでしょうか。
あと読みは「エンジンエックス」です、初見じゃ読めなかった記憶があります。
詳しい内容は以下のサイトも参考にしてみてください。
- https://wa3.i-3-i.info/word12859.html
- https://cn.teldevice.co.jp/column/38275/


そうしたら、EC2にSSH接続をして進めていきます。
<br>
- インスタンスのアップデート
```bash:bash
sudo yum update
```
- nginxのインストール
```bash:bash
sudo yum -y install nginx
```
- インストールしたnginxのバージョンの確認
```bash:bash
nginx -v
```
- nginxを自動起動するための設定
```bash:bash
sudo systemctl enable nginx
```
- nginxの起動
```bash:bash
sudo systemctl start nginx.service
```

- nginxのステータス確認
このコマンドを実行した時に、`Active:active(running)` が返ってくると成功しています。

```bash:bash
sudo systemctl status nginx
```

<br>
他にも使ったコマンドがあったのでメモしておきます。

```bash:bash
# 構文チェックのコマンド
sudo nginx -t
# 更新後の再起動コマンド
sudo systemctl status nginx
```

# 2.GithubからEC2へのレポジトリのクローン
ここに関しては、
- GitHubのアカウント作成済み
- レポジトリ作成済み
を想定し、鍵作成から進んでいきたいと思います。
<br>

- EC2にgitをインストールする
```bash:bash
sudo yum install -y git
```

- SSHキーの作成
```bash:bash
ssh-keygen -t rsa -b 4096
```

- 作成されたキーをコピー
```bash: bash
cat ~/.ssh/id_rsa.pub
```

これを行うと、長い文字列が出てくると思うので、これをコピーしておきます。
<br>

次からはgithubでの作業です。
1. 画面右上のプロフィールマークをクリック
1. Settingsをクリック
1. 「SSH and GPG keys」をクリック
1. 「New SSH key」をクリック
![ec2_rsa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968393/d2848971-97cb-cbb0-9a2f-bcb8ea3525dc.png)

鍵に関しては、`ssh-rsa`から全部入れてもらって大丈夫です。
入力が終わったら「Add SSH key」をクリックします。
<br>
<br>


GitHubでの操作が済んだら、もう一度EC2のSSH接続の方に戻ります。
また、HTMLファイルは以下のようにしました。
簡単なもので大丈夫です。
```html:index.html
<!DOCTYPE html>
<html>
<head>
    <title>Hello World</title>
</head>
<body>
    <h1>Hello World!</h1>
</body>
</html>
```
<br>

- GitHubとの接続テスト
```bash:bash
ssh -T git@github.com
# 初回接続時は authenticity の確認が出るので yes と入力
```

- レポジトリのクローン
```bash:bash
git clone git@github.com:ユーザー名/レポジトリ名.git
```
:::note warn
クローンする際には以下に注意してください
- SSH URLを使用していること
（`https://`ではなく`git@github.com:`で始まるURL）
- クローンする前に、クローン先のディレクトリに移動していること
:::

- また、必要の応じてユーザー名とメールアドレスを設定
```bash:bash
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
```
<br>

その他に関しては、gitのコマンド`例 git push` と同じになりますので割愛します。
これでレポジトリを取り込むことができました。


# 3.パブリックIPアドレスを用いて、「Hello World」を表示させる
自分はここでつまずきました。クローンまでは済んでいるのは確認できていたのですが、
どうしてもnginxのデフォルトのページが出てしまいまして。

おそらくなのですが、~/nginx/htmlの配置下にhtmlファイルをおかないと起動しないようです。
.confファイルを書き換える方法もあるみたいですが、今回の目的とは違うので今度調べてみます。

- ドキュメントルートの権限を変更させる
```bash:bash
sudo chown -R ec2-user:ec2-user /usr/share/nginx/html
```

- nginxのルートに移動してクローンする
```bash:bash
cd /usr/share/nginx/html
git clone git@github.com:gitのユーザー名/レポジトリ名
```

最後に、EC2のコンソールに戻り、「パブリックIPv4アドレス」をコピーし、
`http://xxx.xxx.xxx.xxx`を検索すると`Hello World`が現れると思います。


# 次回に向けて
とりあえずnginxの設定は終了したので、
次回はS3あたりを触っていこうかなと思います。
RaspberryPi5にInfluxDB2をインストールする

## はじめに
Raspberrypi5にinfluxDBをインストールします。デフォルトリポジトリですとバージョン1.6ですがどうせなら最新版を入れたかったのでバージョン2をインストールしてみました。久々にDBのセットアップをしましたが最近のDBはGUIを使用したり昔に比べると色々と進化しましたね。

## 実行環境
|ハードウェア|OS|
|----------|--|
|Raspberrypi 5|Linux raspberrypi5 6.6.69-v8-16k+ #1835 SMP PREEMPT Thu Jan  2 11:29:01 GMT 2025 aarch64 GNU/Linux|

## 手順
1. インストールコマンドを調べる
    - https://www.influxdata.com/influxdata-downloads/にアクセス
    - InfluxDB OSS 2.xの項に以下の2つを指定する
        - Platform → Ubuntu & Debian(ARM 64-bit)
        - Version → InfluxDB v2.7.11
        - ※Versionは現時点のものであり今後変わっていくと思います
1. 表示されたコマンドを実行する

    ```bash:bash
    sudo wget -q https://repos.influxdata.com/influxdata-archive_compat.key
    sudo echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
    sudo echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list
    sudo apt-get update && sudo apt-get install influxdb2
    ```    
1. 起動
    ```bash:bash
    sudo systemctl start influxdb
    ```
1. 初期設定
    - ブラウザで接続し初期設定します
        ```http://<IPアドレス or 名前>:8086```
ひかり電話+IPoE環境でHGWを使わない設定方法 (ASUS RT-AX59U)

:::note info
インフォメーション
各プロバイダや無線LANルーター機器メーカーのサポートページでは解決できなかった問題があったため、記録として残します。同様の問題に遭遇した方の参考になれば幸いです。
:::

# 概要
- ひかり電話契約ありの環境でHGW(ホームゲートウェイ)を使用せずIPoE接続を行う方法について解説
- ASUS RT-AX59UのIPv6設定を「パススルー」から「ネイティブ」に変更することで解決
- 光回線のひかり電話契約の有無によってIPv6の設定方法が異なることを確認


# 前提条件
- 光コラボの回線を利用し、携帯電話とのセット割のためにひかり電話を契約しているが、実際にはひかり電話サービスは使用していない
- NTTから提供されたホームゲートウェイ(HGW)であるRX-600KIを使用せず、市販の無線LANルーター(ASUS RT-AX59U)のみでインターネット接続を確立したい
- 接続方式はIPoE(IPv6 over IPv4)を使用し、IPv6接続サービスはv6プラス(JPIX社提供)を利用している


# 発生した問題と切り分け
## 最初の症状と設定内容
ONUと無線LANルーター(ASUS RT-AX59U)を直接接続し、無線LANルーターでIPoE接続を試みたが、インターネットに接続できなかった。
PPPoE接続は問題なく確立できたため、ハードウェアの故障ではないと判断した。

```mermaid
graph LR
    光コンセント <-- 光ファイバー --> ONU
    ONU -- LANケーブル --> RT-AX59U
```
### 最初の設定内容
- WAN：`v6プラス`
- IPv6：`パススルー(Passthrough)`


## HGWでの動作確認
基本に立ち戻って、HGW(RX-600KI)をONUと無線LANルーターの間に接続したところ、無線LANルーターでIPoE接続を行うことでインターネット接続が確立した。
無線LANルーターの設定内容は「最初の設定内容」と同一で、HGW(RX-600KI)のIPoE自動接続は無効化している状態へ変更した

```mermaid
graph LR
    光コンセント <-- 光ファイバー --> ONU
    ONU -- LANケーブル --> RX-600KI
    RX-600KI -- LANケーブル --> RT-AX59U
```

# プロバイダと機器メーカーへの確認
- プロバイダのサポートに確認したところ、ONUと無線LANルーターを直接接続して適切な設定を行えばインターネット接続が可能であることを確認
- HGWでの接続が可能であったため、詳細な技術仕様の確認は省略した

# 解決方法
## 設定変更内容
ASUS RT-AX59Uの設定を以下のように変更することで、HGWを介さない直接接続でもIPoE接続が確立した。
### 変更後の設定
- WAN：`v6プラス`（変更なし）
- IPv6：`ネイティブ(Native)`

# 考察
IPv6の設定については、ひかり電話の契約有無によって適切な設定が異なることを確認できた。家庭用無線LANルーターでは詳細な設定項目が提供されていないため、`ネイティブ(Native)`設定を使用することで適切な設定が自動的に行われる。

設定画面には`ネイティブ(Native)`を推奨するメッセージが表示されているのみで詳細な説明はないが、この設定により以下の処理が自動的に行われていると推測される
- ひかり電話契約ありの環境に適したIPv6プレフィックス長の設定
- 適切なDHCPv6-PDの設定
- RA受信の設定


# 参考情報
- IPv6基本設定関連
    - [ひかり電話契約の有無による光回線からのIPv6配布方式の違い｜IP実践道場](https://note.com/noblehero0521/n/n6178786f2d12)
- ルーター設定関連
    - [設定例集#44: フレッツ 光ネクスト IPv6インターネット接続（IPv6 IPoE、DHCPv6 PD方式）](https://www.allied-telesis.co.jp/support/list/awp/rel/5.5.4-0.1/613-002735_AD/docs/overview-288.html)
    - [設定例集#45: フレッツ 光ネクスト IPv6インターネット接続（IPv6 IPoE、RA方式）](https://www.allied-telesis.co.jp/support/list/awp/rel/5.5.4-0.1/613-002735_AD/docs/overview-289.html)
【Web】パフォーマンス

# はじめに
こんにちは！アメリカで独学でソフトウェアエンジニアを目指しているものです。
現在webについて学んでいますが、本日はWebにおけるパフォーマンスについて見ていこうと思います

# なぜWebパフォーマンスが重要か
Webパフォーマンスについて、なぜそこまで気にする必要があるのでしょうか。あまり詳しくない方からすると「動けばいいでしょ」と思われるかもしれませんが、以下の3つが大きな理由として挙げられます。
* **ユーザー体験向上**
Webサイトの読み込み速度が遅いと、ユーザーはすぐに離脱してしまいます。ページの表示が遅いだけで、信頼感や満足度が下がるケースも多いです。逆にパフォーマンスが高いサイトはユーザーが快適に操作できるため、滞在時間やエンゲージメントが高まります。
* **検索エンジン最適化（SEO）**
Googleをはじめとした検索エンジンはページの読み込み速度をランキング要素として考慮しているので、パフォーマンスが良いサイトは検索結果上位に表示されやすくなります。
* **収益への直結**
ECサイトやSaaSなどのWebサービスでは、1秒の表示遅延がCVRや売上に大きく影響することが知られています。高速なページ表示により、ユーザーの離脱を防ぎ、売上や契約数が向上します。

# 代表的なWebパフォーマンス指標
続いてWebパフォーマンスの代表的な指標を見ていきたいと思います
### Time to First Byte（TTFB）
ユーザーがページをリクエストしてから、最初のバイトがブラウザに到達するまでの時間を指します。サーバー側の応答速度を示す指標であり、サーバーの性能やネットワークの遅延が影響します。

### First Contentful Paint（FCP）
ページ上で初めて何らかのテキストや画像が表示されるまでの時間を指します。ユーザーが最初に目にする内容の描画がどれだけ早いかを知ることができます。

### Largest Contentful Paint（LCP）
ページのメインコンテンツ（ヒーローイメージや見出しなど、ユーザーがもっとも注目する大きな要素）が描画されるまでの時間を指します。メインコンテンツの読み込みがどれだけ早いかを評価します。

### First Input Delay（FID）
ユーザーが初めてページ上の要素を操作（クリックやスクロールなど）した際、ブラウザが応答し始めるまでの待ち時間を指します。インタラクションの反応性を示します。

### Time to Interactive（TTI）
ページが操作可能な状態になるまでの時間を指します。バックグラウンドでJavaScriptの処理が重いと、ユーザーが見た目上はページを見れても、実際には操作できない時間が延びてしまいます。
### Cumulative Layout Shift（CLS）
ページを読み込む最中に要素のレイアウトがどの程度ずれるかを数値化したものです。ページを操作しているときにボタンやテキストが突然動いてクリックしづらくなる、あの問題を評価する指標です。

# パフォーマンス監視の手法とツール
Webパフォーマンスは、サイトが公開された後も新機能の追加やライブラリのアップデート、サーバー構成の変更などで絶えず変化します。
そのため、継続的に監視し、問題があればすぐに対処できる仕組みを整えることが重要です。以下は代表的な手法とツールの例です。

### Lighthouse（Chrome DevTools）
Googleが提供するオープンソースのツールです。ページを分析してパフォーマンス、アクセシビリティ、SEOなどのスコアを算出してくれます。ChromeブラウザのDevTools（F12キー）から利用可能で、簡単に分析レポートを取得できます。

### WebPageTest
詳細な読み込みプロセスや各リソースのロード時間、CPUの使用状況などをグラフ形式で確認できるサービス。ネットワーク帯域制限やデバイスの種類を設定して、さまざまなシナリオでテストすることができます。

### Google Analytics / GA4
ユーザーの実際の行動データを取得できます。ページビューやセッション計測だけでなく、平均読み込み時間などのサイトスピードレポートも用意されています（ただしより細かい計測には他ツールとの組み合わせが推奨）。

### New Relic / Datadog / Sentry などのAPMツール
APM（Application Performance Monitoring）ツールを使うと、サーバーサイドの処理、DBクエリのパフォーマンス、エラー発生状況などを詳細に把握できます。フロントエンドだけでなく、バックエンドのボトルネック特定に役立ちます。

# まとめ
今回はWebのパフォーマンスについてみていきました。私自身はバックエンドエンジニアとして勉強中ですが、フロントエンドやインフラを含むパフォーマンスの最適化は、ユーザー体験やビジネス成果に直結する非常に重要な領域です。
今後も継続的に学習と実践を重ね、より快適なWebサービスを提供できるよう頑張っていきたいと思います。
loadBalancerSourceRanges 設定下のAKSでApplication Insights可用性テストを実施する方法

# 概要
アクセス制限のないAzure Kubernetes Service環境のWebアプリであれば、単にApplication Insights 可用性テストを構成するだけで問題ありません。しかし、loadBalancerSourceRanges を設定して接続制限を行っている場合、単に可用性テストを構成しただけではエラーが発生し正常に動作しません。

本記事では、loadBalancerSourceRanges で制限がかけられた環境における対処方法について解説します。

- [対処方法](#対処方法)
- [有効ではない対処方法](#有効ではない対処方法)
- [まとめ](#まとめ)
- [関連情報](#関連情報)


# 対処方法
以下のリンクからJSONファイルをダウンロードし、JSONファイル内の "ApplicationInsightsAvailability" に含まれる "addressPrefixes" を、loadBalancerSourceRanges に追加してください。

- [Download Azure IP Ranges and Service Tags – Public Cloud from Official Microsoft Download Center](https://www.microsoft.com/en-us/download/details.aspx?id=56519)

# 有効ではない対処方法
以下の方法では、可用性テストは正常に動作しません。

- **NSGにてサービスタグ “ApplicationInsightsAvailability”を許可する方法**
  [プライベート環境への可用性テスト | Japan Azure Monitoring Support Blog](https://jpazmon-integ.github.io/blog/applicationInsights/aboutPrivateAvailabilityTest/)


- **Annotations にてサービスタグを指定し、“ApplicationInsightsAvailability”を許可する方法**
  以下のページのnoteに記載がありますが、loadBalancerSourceRanges が設定されている場合、`service.beta.kubernetes.io/azure-allowed-service-tags` は動作しません。

  [Azure LoadBalancer | Cloud Provider Azure](https://cloud-provider-azure.sigs.k8s.io/topics/loadbalancer/#loadbalancer-annotations)

  > 以下はnoteからの抜粋です。
  >
  > When `loadBalancerSourceRanges` have been set on service spec, `service.beta.kubernetes.io/azure-allowed-service-tags` won’t work because of DROP iptables rules from kube-proxy. The CIDRs from service tags should be merged into loadBalancerSourceRanges to make it work.

# まとめ
対処方法としては、IPアドレスを直接許可する形になりますが、サービスタグを使用する方法は有効でないため、他に選択肢がありません。なお、確認できた範囲では数年来 "ApplicationInsightsAvailability" に含まれる "addressPrefixes" は変更がなく、頻繁に設定を変更する必要はないと考えられます。

# 関連情報
- [Load Balancer Service にアクセス可能な IP アドレスを制限する | Japan Azure IaaS Core Support Blog](https://jpaztech.github.io/blog/containers/aks-load-balancer-source-ranges/)
Debian Bookworm で Gitコマンドの自動補完を有効化

## Debian Bookworm で gitのタブ補完が効かない

Debian 12 Bookworm のXfce版で作業中、Gitコマンドのタブ補完が効かないことに気づきました。Fedoraだと問題なく動くのですが...
例えば
git cl[tab]
としても git clone に展開してくれないのです。
ちなみに
```
$ sudo apt show bash-completion
```
としてみるとちゃんと bash-completionパッケージは入っていると言われました。

## ホームディレクトリ内の.bashrc の内容

ホームディレクトリにある .bashrc を眺めると一番最後に bash-completionを呼んでるらしいスクリプトがちゃんとあるのです。

```
$ tail ~/.bashrc
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi
```

上の `. /usr/share/bash-completion/bash_completion` でbash_completion スクリプトを呼んでるっぽいなあと思って調べてみたら,

```
$ ls /usr/share/bash-completion/
completions
```

あれ? /usr/share/bash-completion/bash_completion なんていうファイルが存在しないのです。
その上 /etc/bash_completion というファイルも存在しませんでした。

ただし bash自体のタブ補完は効いています。例えば his[タブキー] と入力すると history に展開されます。今の所調べた範囲では, どこからどこにある bash補完のスクリプトを呼んでいるのか解明できませんでした。

## /usr/share/bash-completion/completions/git

あちこち探しているうちに、`/usr/share/bash-completion/completions/git` というファイルが git のタブ補完用のスクリプトであることがわかりました。このファイルの最初の方に
```
# To use these routines:
#
#    1) Copy this file to somewhere (e.g. ~/.git-completion.bash).
#    2) Add the following line to your .bashrc/.zshrc:
#        source ~/.git-completion.bash
```

と使い方が明記されてました。

結局

```
$ cp /usr/share/bash-completion/completions/git ~/.git-completion.bash 
```
を実行して、gitのタブ補完用のファイルを、ホームディレクトリ直下の .git-completion.bash というファイルにコピーします。
このあとホームディレクトリの .bashrc ファイルの末尾に
```
. $HOME/.git-completion.bash
```
という記述を入れて、gitタブ補完ファイルを source コマンド (= 上では ドットコマンド)からホームディレクトリ直下の .git-completion.bash を実行します。これでgit のタブ補完が効くようになりました。

## 参考文献

https://stackoverflow.com/questions/12399002/how-to-configure-git-bash-command-line-completion
PHP処理速度改善の個人学習メモ

# 【環境】
■ 環境
・PHP8.2.4

## 【php.iniの設定】
・JITの設定
XAMPP8.2.4のphp.iniに以下を追記。
```php.ini
zend_extension = opcache
opcache.enable = 1
opcache.enable_cli = 1
opcache.jit = tracing
opcache.jit_buffer_size = 128M
```
上記の意味に関しては公式サイトを参考。
https://www.php.net/manual/ja/opcache.configuration.php

10万回、ループさせた計測結果
```test.php
<?php
    $time_start = microtime(true);
    for($val = 0; $val <= 100000; $val++){
    
    }
    $time_end = microtime(true);
    $time = $time_end - $time_start;
    var_dump($time);
```
・JITの設定なし：0.004501819610595703125
・JITの設定あり：0.0003719329833984375
※ マイクロ秒

結果：JITの設定で処理速度が上がった。


## 【実装の改善】
https://qiita.com/kapitan/items/47d89449f23bc7f7c9bb
JITを設定した状態で、こちらの記事のソースを参考に計測させて頂きました。
実際に多く使いそうなものをピックアップしました。
計測結果は実行毎に変わりますが、平均的な計測結果を記載しました。

①. 比較演算子
```
== → ===
```
・「==」：0.0004198551177978515625
・「===」：0.000235080718994140625

②. 文字列の置換
```
preg_replace()→str_replace()
```
・「preg_replace()」：0.0165960788726806640625
・「str_replace()」：0.010623931884765625

③. 文字列が含まれるか
```
preg_match()→strpos()
```
・「preg_match()」：0.008882045745849609375
・「strpos()」：0.003960132598876953125

④. 配列に代入
```
array_push()→$array[]で代入
```
・「array_push()」：0.005177021026611328125
・「$array[]」：0.00269985198974609375

※ 全てマイクロ秒

# 【所感】
前回書いたこちらの記事も併せて考えれば、クエリも含めた全体的な処理速度の改善を見込めるのではないかと思う。
https://qiita.com/pig_buhi555/items/6e5f729f836370d1664a


# 【参考】
ありがとうございました。
・JITの設定方法 参考
https://qiita.com/jkichi/items/7412a654cfefa0c45bc0

・処理の計測方法 参考
https://eclair.blog/php-microtime/

・PHP処理速度改善 参考
https://qiita.com/kapitan/items/47d89449f23bc7f7c9bb
量子コンパイラを作る。 その26

# 概要
量子コンパイラを作る。
elixirで論理回路アセンブラをコンパイルして、qiskitを生成できるが、結局、論理回路が書けるのかが、問題になる。（人材の問題、それなりの人の育成、、、）
そっちに、対策を取る。
論理回路アセンブラから、論理回路を生成して、ビジュアルでシュミレーションするエディタを開発する。どうだ。
フリップフロップ
書けない、手で修正して下さい。

# 成果物

https://embed.plnkr.co/plunk/52GcR7pMrjT1AKnk

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/06dafe49-c643-9391-ffbf-94066c8fb9d1.png)

# サンプルコード

```
make 4
in 0 1
nor 0 1 3
nor 1 0 2
out 2 3

```

# 修正手順
下記の様に、たすき掛け、願います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d87a938b-0b0a-aa7e-a0e4-5b51e644aaa2.png)

以上。