OmniAICreator/Qiita-1.07M huggingface dataset:
【C#】ASP.NET CoreアプリでSwaggerがつながらなくなる

## はじめに


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783169/0ab6bc2d-10e1-3468-f33f-6576594583ce.png)

Asp.net CoreのWebAPIに対して単体テストプロジェクトとテストコードを追加したところ、デバッグ実行で上記が表示されるように。。。

## 原因

挙動確認用に`Controller`クラスにHTTPコマンドに対応していないpublicメソッドを追加したことが原因。

```diff_c_sharp
[ApiController]
[Route("api/[controller]")]
public class TodoListController : ControllerBase
{
    private readonly ILogger<TodoListController> _logger;
    private readonly TempDbContext _context;

    public TodoListController(ILogger<TodoListController> logger, TempDbContext context)
    {
        _logger = logger;
        _context = context;
    }

    [HttpGet(Name = "GetRecords")]
    public async Task<ActionResult<IEnumerable<StudyRecord>>> GetAllStudyRecords()
    {
        return await _context.Records.ToListAsync();
    }

+    public int TestMethod(int id)// <-このメソッドが追加されていることが原因
+   {
+        return id;
+    }
}
```

継承元の`ControllerBase`クラスの公式リファレンスやMVCの説明を見てみたのですがどうしてこのような挙動になっているかはわからなかったです。そのためさらに深い位置に原因がある可能性はあります。

WebAPIとしてのコントローラーにAPI以外のパブリックメソッドはいらないということでしょうか？

## おわりに

単体テストプロジェクトとGithub actionsのCI/CD追加作業をしていたため、デバッグ実行する機会がなく問題のメソッド追加から発覚まで少々ラグがありました。

結果何が原因か全くわからずかなり焦りました。。。
デュアルブート環境下でのファイルの受け渡し

# はじめに

この記事は、Qiita Advent Calendar 10日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/2b60d47a2d0e64a273c3

# 本編

以前いくつかの記事で示しました通り、僕のMacはデュアルブート環境にしています。そしてパーティション問題で格闘していたこともその記事で記しています。

https://qiita.com/0_terarin_0/items/44c446f09f682b57227b

さて、ここでできてきた問題は、どうやって共同ファイルを管理するかです。

## 外部経由か内部経由か

ここで考えたのは外部経由でのファイルの共有か内部経由でのファイルの共有かです。ちなみに結果的には僕は後者を選びました。

- そこそこ大きなファイルを共有したい
- MacとLinux間での共有なので互換性問題はそこまでシビアにならなくてもいい
- 必ず元のファイルから変換されてはならない

これらのことから考えるに、おそらく外部経由でのファイルの共有は慣れていないだろうということで内部経由でしました。また、この内部経由の中でもどちらか一方のファイルにアクセスする形ではなくパーティションを分割してファイル共有用のパーティションを作ることにしました。

以下に掲載しているスクリーンショットが僕の	ディスクユーテリティの画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/62dbf1b0-3331-f7a0-9d6c-462141d2eaba.png)

さて、このディスクユーティリティの画面から分かる通りに僕がひとつ悩んだのがフォーマット形式でした。

## APFSかExFATか

ここで悩んだ一つがAPFSかExFATか。僕はAPFSで最初やろうと思っていました。というのも、まあAPFSぐらいにはLinuxも対応しているだろうよ〜なんていう感じで考えていました。

そんなことはなかったです。

まあ、どこかしらに対応するためのモジュールがあるでしょう〜って思っていました。

https://github.com/sgan81/apfs-fuse

ありました。が、結構リスキーだなと改めて。これをすることによって例えばこのパーティションが壊れるだけで済むなら問題はないのですが、万が一にも操作を間違えるとこれ全部のパーティションが吹き飛ぶ可能性があります。Linuxのパーティションが飛ぶならともかく、Macのパーティションが飛ぶのは結構命に関わるのでおとなしくExFATに決めました。

## 容量問題

さて、ここまで来て無事に夢を叶えました！というのが理想だったのですが、これの問題はすぐに明らかになりました。というのも、デュアルブートやこのパーティションを切ったりすることによって結構MacOS側のパーティションをくってしましました。ので、結局SSDを買うことになったというのは、また別の話、、、。


# 最後に

やっぱりNASが欲しい！
GitFlow解説

# この記事の目的
GitHubを使ってチーム開発を行う場合、GitFlowを正しく理解しておくことは大切です。
この記事では以下の2点を理解することができます。
- GitFlowとは何か
- GitFlowの要素

そこまで複雑ではないので、流れを抑えられればOKです。

---

## GitFlowとは何か
GitFlowとは**Gitを使用してチーム開発する際のブランチの運用ルール**です。
6種類のブランチを作成し運用するというルールが決まっています。
各ブランチの役割とマージの関係性を理解しておきましょう。

基本ルールは存在しますが、プロジェクトごとに調整されることがあります。その違いがあっても、基本を理解していれば対応可能です。

GitFlowではプロジェクトで作成するブランチの種類が決まっているので、その種類に沿ってブランチを作成し、開発を行っていくことになります。

## GitFlowの要素（ブランチの種類）
**1\.main**
- 「本番用の常に最新で安定しているブランチ」です
- このブランチには直接コミットせず、`release`(後述)や`hotfix`(後述)からマージされることで更新されます

**2\.develop**
- 「開発ブランチとも呼ばれ、機能ブランチ(後述)の変更をマージする」ブランチです
- `develop`はチーム開発の「開発中のコードの集約点」です
- 機能開発が完了した`feature`ブランチ(後述)は必ず`develop`にマージされます
- シンプルなプロジェクトでは省略されることもあり、その場合は`feature`ブランチから直接`main`にマージする場合もあります
- 大規模プロジェクトでは必須のブランチです

**3\.feature**
- 「機能ブランチとも呼ばれ、機能ごとにいくつも作成されるブランチ」です
- ログイン画面、記事一覧画面、お問合せ画面など、パーツごとにいくつも作成されます
- ブランチ名には通常「`feature/ログイン画面`」など、何の作業をするかが分かる名前をつけます
- 開発者は主にこのブランチで作業することになります

**4\.hotfix**
- 「本番（`main`）で発生した緊急のバグを修正するブランチ」です
- 修正完了後は、`main`だけでなく`develop`にもマージします
- これにより、`develop`が`main`と同期され、次回のリリースに影響を与えないようにします

**5\.release**
- 「リリース準備用のブランチ」です
- `release`ブランチでは以下のような作業が行われます：
・バージョン番号の更新（例: `1.0.0` → `1.0.1`）
・軽微なバグ修正
・リリースノートの準備
- 作業完了後は、`main`と`develop`の両方にマージされます

**6\.support**
- 「リリース後に行うサポート作業用のブランチ」です
- `support`ブランチは必須ではなく、長期的なサポートが必要なプロジェクトで使用される場合があります
- 例: 旧バージョンのバグ修正や互換性対応

---

## まとめ
**GitFlowの全体像**

1\.`main`→ 本番環境用。
2\.`develop` → 開発中の変更を統合し、次回リリースの基盤。
3\.`feature/` → 新機能や改善作業用。
4\.`hotfix/` → 緊急バグ修正用。
5\.`release/` → リリース準備用。
6\.`support/` → 過去バージョンのサポート用（必要に応じて）。
私はすっかりユニットテストを書かなくなった。

いつかの飲み会での話。
急にTDDに関する信念を誰かと語りたくなっていた。

## ユニットテスト無用なのでは？

:relaxed:shypk :
急な話ですけどUnittestって必要ですか？
私も昔からTDDとかうるさい方でunittestとかintegration testとかいっぱい書いていたんですけど実際にその周りのコードの修正することなく次のバージョンとかを作る羽目になって<font color="LightSalmon">無駄が多い</font>なと思いましたね。なので今はintegrationかe2e testだけ書くようにしているんです。

https://qiita.com/riekure/items/a58f6845821fc876af1d

:santa:monamour555さん :
規模と目的によって違うんですけど基本はつけた方がいいです。TDDを考えても開発してる過程で<font color="LightSalmon">安定</font>できるじゃないですかそれだけでも十分価値はあります。
もしshypkさんが部長になって触ることがなくなるとします。後任の方が一行だけ修正するとしましょう。そのときの<font color="LightSalmon">動きの保証</font>になるじゃないですか。

:relaxed:shypk :
その為に動きの保証はintegration testでカーバすればいいじゃないでしょうか。

:santa:monamour555さん :
それでは他のモジュールと結合した後の話になるので不具合が起きた場合に<font color="LightSalmon">追跡が難し</font>くなります。

:relaxed:shypk :
まぁそういうところはありますね。でもintegration testだと基幹コードが変わっても同じ動きを目的としているなら<font color="LightSalmon">簡単にテストを適用</font>できますよ。

:santa:monamour555さん :
こう考えてみたらいかがでしょう。会社はすごく大きいプロジェクトのなかで一つのモジュールを担当を任されたとしましょう。結合するモジュールは他社のものとします。このときに何らかのテストが失敗した場合どうなりますか？

:relaxed:shypk :
なるほど。それは<font color="LightSalmon">問題点を探しにくく</font>なりますね。どこの責任なのかもはっきりしませんし。

:santa:monamour555さん :
それもそうですし、すくなくともこちらが担当のモジュールではこういったテストが通っているので、ってことで話が進められます。

:relaxed:shypk :
なるほど、他社との協業経験が豊富な@monamour555さんからこそのいい例でした。

## それではユニットテストをどう付ければ？


:relaxed:shypk :
それではぶっちゃけ以前話していたpongoは入れた方がいいですか?

https://github.com/Kong/kong-pongo


:santa:monamour555さん :
はい、絶対入れた方がいいと思います。

:relaxed:shypk :
すでにe2eテストでpytestいれてるのにですか?それって<font color="LightSalmon">coverage的な理由</font>でですか？

:santa:monamour555さん :
現状のpytestもe2eとして残しずつやるといいですよ。
もちろんcoverage100を目指せ。ともいえるんですけど、それが負担でしたら<font color="LightSalmon">最初はたとえば60を目指す</font>のです。

:relaxed:shypk :
というと？

:santa:monamour555さん :
で次そのファイルをさわるときは<font color="LightSalmon">coverageが下がらないようにするだけ</font>です。

:relaxed:shypk :
なるほどう。修正があって下がるならテストを追加する。そうなると右肩上がりになりますし、そこまで負担にもならないですね。

:santa:monamour555さん :
それです。
SRLAというファイル形式

# はじめに

この記事は、Qiita Advent Calendar 9日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/2b60d47a2d0e64a273c3

# 本編

10月に下の記事を見ました。

https://av.watch.impress.co.jp/docs/series/dal/1634695.html

正直詳しいことを僕が説明するのは間違ったことしか言わない気がするのでしません。僕がここでするのは、実際にじゃあどれぐらい違うのだろうというのを検証します。

## 検証

GitHubのリリースページから実行ファイルをダウンロードします。または、ソースコードをダウンロードしてビルドします。

```zsh
git clone https://github.com/aikiriao/SRLA

cd SRLA/tools/srla_codec

#Code

cmake -B build
cmake --build build

cd ../srla_player/

# Player
cmake -B build
cmake --build build
```

これでバイナリビルドは完成です。```SRLA/tools/srla_player/build/srlaplayer```が再生用の実行ファイル、```SRLA/tools/srla_codec/build/srla```がエンコードやデーコードをするためのファイルです。

さて、ここで検証に使う音楽ですが、下記のサイトからFlacの音源をダウンロードしました。

http://yung.aki.gs/

とりあえず、flacからwavにエンコードしましょう。

```zsh
ffmpeg -i sample.flac sample.wav
```

これをあとはエンコードしたらいいだけです。パスは各自変更してください。

```zsh
./srla -e sample.flac sample_srla.srla
```

ちなみに、再生したかったら```srla_player```の方を使ってください。

```zsh
./srlaplayer sample_srla.srla
```

さて、実際の違いは以下のとおりです。

![Screenshot 2024-12-14 at 17.09.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/19a53349-27ed-1445-f266-2268823ca15a.png)

![Screenshot 2024-12-14 at 17.09.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/aef84f66-ef6d-f849-ca1f-437c57629d42.png)

![Screenshot 2024-12-14 at 17.09.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/5969eeef-40d7-9d0f-36f5-ce35fa735288.png)

確かにSRLAの方が若干圧縮率は高いものの、まあそこまで、、、って感じではあります。ただ、以前に僕がやった時は確かもっと圧縮されてた気もするのでもしかしたら環境や音源の問題かもしれないですね。

# 最後に

こういう取り組み、個人的にはとても好きでなんでも試したくなる癖があります。どうかこの技術が将来世界中で役立っていることを祈っております。
イベントとリスナー：Laravel特有の機能をRails視点で学ぶ

### はじめに
プログラミング初学者の方に向けて、Laravelの"イベントとリスナー"機能について解説します。この記事では、Rails経験者がLaravelを学ぶ際に感じる疑問点に注目しながら、この機能の仕組みと利用方法を分かりやすく説明します。

### イベントとリスナーとは？

#### Laravelにおけるイベントとリスナー

Laravelのイベントとリスナーは、特定の処理が発生した際に、関連する処理を別のクラスに分離して実行するための仕組みです。これにより、コードの保守性が向上し、処理の流れを簡潔に保つことができます。

**イベント (Event):** 何か特定の動作を表すクラスです。例えば、"ユーザーが登録された"という状況。

**リスナー (Listener):** 特定のイベントが発生した際に実行される処理を記述したクラスです。

#### Railsでの類似機能

Railsでは、`ActiveSupport::Notifications`や`Observerパターン`が類似の役割を果たします。ただし、Laravelのイベントとリスナーは、公式に組み込まれた使いやすい仕組みである点が大きな特徴です。

### イベントとリスナーの基本構成

#### 1. イベントの作成

まず、イベントを作成します。`php artisan make:event`コマンドを使用します。

```
php artisan make:event UserRegistered
```

これにより、`app/Events/UserRegistered.php`というクラスが作成されます。このクラスには、イベント発生時に必要なデータを保持するためのプロパティを定義します。

```php
<?php

namespace App\Events;

use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class UserRegistered
{
    use Dispatchable, SerializesModels;

    public $user;

    public function __construct($user)
    {
        $this->user = $user;
    }
}
```

#### 2. リスナーの作成

リスナーは`php artisan make:listener`コマンドで作成します。

```
php artisan make:listener SendWelcomeEmail
```

リスナーは、対応するイベントを受け取り、そのデータを利用して処理を実行します。

```php
<?php

namespace App\Listeners;

use App\Events\UserRegistered;

class SendWelcomeEmail
{
    public function handle(UserRegistered $event)
    {
        // メール送信ロジック
        \Mail::to($event->user->email)->send(new \App\Mail\WelcomeEmail($event->user));
    }
}
```

#### 3. イベントとリスナーの登録

`EventServiceProvider`にイベントとリスナーの対応関係を登録します。

```php
protected $listen = [
    UserRegistered::class => [
        SendWelcomeEmail::class,
    ],
];
```

### 実際にイベントを発生させる

イベントを発生させるには、`event()`関数を使用します。

```php
use App\Events\UserRegistered;

$user = User::create([...]);
event(new UserRegistered($user));
```

### Rails視点で理解する

Railsユーザーにとって、Laravelのイベントとリスナーは次のような特徴があります。

**コード分離の徹底:** リスナーに処理を分離することで、コントローラーやモデルが肥大化しません。

**同期・非同期の切り替え:** Laravelでは、リスナーを簡単に非同期処理に変更できます。これは、ジョブキューと連携しているためです。

RailsではObserverやActive Jobを組み合わせて同様の処理を実現できますが、Laravelの方が構造化されている印象です。

### まとめ

Laravelのイベントとリスナーは、コードの保守性を高め、特定の処理を再利用可能にする便利な機能です。Rails経験者にとっても学びやすい仕組みであり、アプリケーションの設計をより洗練されたものにする助けとなるでしょう。

公式ドキュメントを参照しながら、自分のプロジェクトに取り入れてみてください。

Laravel公式ドキュメント: [Events](https://laravel.com/docs/11.x/events)
Kolmogorov-Arnold Networks（KAN）について

## はじめに
　今年4月、Kolmogorov-Arnold Networks（KAN）という新しい機械学習手法が発表されました。この記事では、KANがどんなものか、これまでの深層学習とどう違うかを説明したいと思います。

## 一般的な深層学習
　現在深層学習と呼ばれている手法は多層パーセプトロン（MLP）という手法が用いられています。$L$層の隠れ層と入力層（$l = 0$）を含むある層（$l = \lbrace 0, 1, 2, ..., l \rbrace$）に$J_l$個のニューロンを持つMLPにおいて，第$l$層$j_l$番目のニューロンの状態$h_{l, j_l}$から第$l + 1$層$j_{j + 1}$番目のニューロンの状態$h_{l + 1, j_{l + 1}}$への計算は重み$w_{j_l, j_{l + 1}}$と層全体のバイアス$b_l$、各層$l$について固定された活性化関数$\phi_l$を用いて以下のように表されます。

```math
h_{l + 1, j_{l + 1}} = \phi \left( \sum_{j_l = 1}^{J_l} w_{j_l, j_{l + 1}} h_{l, j_l} + b_l \right)
```

簡単に言うと、MLPは線形関数（$y = ax + b$）をたくさん配置し複雑な関数をフィッティングしようという考え方です。線形関数だけでは複雑な関数をフィッティングできませんが、活性化関数を非線形にすることで複雑な関数もフィッテングすることができます。

## KANの概要
　KANはKolmogorov-Arnold表現定理という理論が基になっています。これは「特定の条件を満たす多変量関数は、1変量関数だけで表現することができる」というものです。まず、$J_0$個の入力$\boldsymbol{x} = (x_1, x2, ..., x_{J_0})$を取る滑らかな多変数連続関数$f$があるとします。この関数$f$の基礎的な構造は次式のようになります。

```math
f(\boldsymbol{x}) = \sum_{q = 1}^{2 J_0 + 1} \Phi_q \left(\sum_{p = 1}^{J_0} \phi_{q, p} (x_p) \right)
```

つまり、内部関数$\phi_{q, p}$と外部関数$\Phi_q$の合成関数で$f$が表現できるということで$p$および$q$は元の入力変数の数$J_0$に依存して上限が決定されます。
　KANは上記の理論をベースにMLPを発展させた手法と言えます。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691433/71ad10c4-3163-db6f-ecbd-b9ba41d3ec88.png "KANのアーキテクチャの例")

KANのアーキテクチャは上図[^1]のようになっています。先程の数式では内部関数と外部関数は元の入力変数の数$J_0$に依存すると言いましたが、MLPがパーセプトロンを多層化させたように、Kolmogorov-Arnold表現定理のネットワークを多層化させたことがKANの大きな特徴です。
　MLPとの違いを説明すると、MLPは非線形の活性化関数を用いて線形関数の重みを学習しますが、KANでは活性化関数そのもの学習します。なお、活性化関数の学習にはB-splineを用います。

## KANでSymbolic regressionしてみた
　Symbolic regressionは関数同定、すなわちデータから数式を推定することです。今回はKANのライブラリであるpykanのExampleに習ってscikit-learnのmake_moonsを用いました。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691433/40512e0e-16bb-d369-851f-9c07a8e8f6d0.png)

結果は以下の通りです。

```math
-0.9652x_2 + 0.4782 \sin(3.0488x_1 + 1.5835) + 0.7081 \quad sample = 1000, noise = 0.0
```
```math
-0.8437x_2 + 0.3822 \sin(3.1058x_1 + 1.6229) + 0.7081 \quad sample = 1000, noise = 0.1
```
```math
-0.8437x_2 − 0.6781x_1 + 0.5915 \quad sample = 1000, noise = 0.2
```
```math
-0.9627x_2 - 0.5081 \sin(3.0488x_1 + 7.8304) + 0.7081 \quad sample = 100, noise = 0.0
```

ノイズとデータ数を変えていくつか計算してみました。特にノイズが大きくなると数式がガラッと変わってしまいます。データ整理の大切さはKANに対しても変わらないのでしょう。
　ひとまず、KANを用いて関数同定ができることを確認しました。今後は自然現象のデータを用いて関数同定を行ってみたいと思います。

[^1]: 新美潤一郎：Kolmogorov–Arnold Networkのマーケティング解析への応用可能性の検討、10.51094/jxiv.893、2024.
Goのエラーハンドリング

**Goのエラーハンドリングは、他の言語（例：例外ベースのハンドリング）とは異なり、シンプルで明示的な方法が採用されています。Goではエラー処理が設計上非常に重要視されており、エラーをコード内で直接扱うのが特徴です。**

以下に、Goのエラーハンドリングの仕組みと基本的な使い方を説明します。

# 1. エラーの返却
Goでは、多くの関数が返り値としてエラー型（error）を返します。error型は標準ライブラリに定義されており、エラーメッセージを格納します。

例:

```go
package main

import (
	"fmt"
	"errors"
)

func divide(a, b int) (int, error) {
	if b == 0 {
		return 0, errors.New("cannot divide by zero")
	}
	return a / b, nil
}

func main() {
	result, err := divide(10, 0)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("Result:", result)
}
```
この例では、divide関数が成功時には計算結果とnil（エラーなし）を返し、エラー時には0とエラーメッセージを返します。

# 2. エラーチェック
関数を呼び出した後、返り値のエラーをチェックするのが一般的です。Goの開発者は、エラーが発生した場合に常に明示的に確認し、適切に処理することを推奨しています。

エラー処理の例:

```go
file, err := os.Open("file.txt")
if err != nil {
    fmt.Println("Error:", err)
    return
}
defer file.Close()
// ファイル操作を実行
```

# 3. エラー型（error）のカスタマイズ
Goでは、独自のエラー型を作成できます。これにより、より詳細なエラー情報を提供できます。

例:

```go
type MyError struct {
	Code    int
	Message string
}

func (e *MyError) Error() string {
	return fmt.Sprintf("Code: %d, Message: %s", e.Code, e.Message)
}

func riskyOperation() error {
	return &MyError{Code: 404, Message: "Resource not found"}
}

func main() {
	err := riskyOperation()
	if err != nil {
		fmt.Println("Error occurred:", err)
	}
}
```
この例では、エラー情報としてコードやメッセージを含むカスタムエラーを作成しています。

# 4. errors.Is と errors.As
Go 1.13以降では、エラーをラップして扱うための機能が追加されました。エラーの原因を判定したり、特定のエラー型にキャストすることができます。

例:

```go
コードをコピーする
import (
	"errors"
	"fmt"
)

var ErrNotFound = errors.New("not found")

func findItem() error {
	return fmt.Errorf("database error: %w", ErrNotFound)
}

func main() {
	err := findItem()
	if errors.Is(err, ErrNotFound) {
		fmt.Println("The item was not found.")
	}
}
```

# 5. ベストプラクティス
**エラーの即時チェック**
エラーが発生した場合、その場で処理を行いましょう。

**エラーのラップ**
エラーが発生した箇所を追跡するため、ラップして情報を追加するのが推奨されます。

**ユーザーフレンドリーなエラーメッセージ**
エラーメッセージは適切に記述し、問題解決のヒントを提供しましょう。

# まとめ
Goのエラーハンドリングは明示的で、開発者にエラーのチェックと管理を促す設計となっています。このシンプルな仕組みは、コードの可読性や信頼性を向上させる助けとなります。
Bluesky、ATProtocolのあれこれ

とりあえずわかったことからあれこれ書き足していこうかと思います。
## 実行環境
|ハードウェア|OS|Python|
|----------|--|------|
|RaspberryPi4|Linux raspberrypi 6.6.62+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.62-1+rpt1 (2024-11-25) aarch64 GNU/Linux|3.11.2|


## atprotoのインストール
```bash:bash
$ pip install atproto
```

## Clientライブラリの呼び出しと初期化
```Python:Python
from atproto import Client
client = Client()
```

## ログイン
```Python:Python
client.login("XXXX.bsky.social", "XXXX-XXXX-XXXX-XXXX")
```
loginメソッドの引数は第一引数がログインID、第二引数がアプリパスワードです（通常のログイン時のパスワードではないことに注意してください）。アプリパスワードは現時点（2024/12/14）で設定のプライバシーとセキュリティから発行してください。

## セッションストリングの取得
```Python:Python
client.export_session_string()
```
セッション分けたい時とかに使いそうですね。

## ポストする
```Python:Python
client.send_post('Hello World')
```

## 自分のポストを取得する
```Python:Python
posts = client.app.bsky.feed.post.list(client.me.did, limit=1)
for uri, post in posts.records.items():
    print(uri, post.text)
```
postのurlと内容が返ってきます。
limit=の部分で取得数を調整できます。

## 任意のアカウントのポストを取得する
```Python:Python
res = client.app.bsky.feed.search_posts({"q":"from:XXXX.bsky.social","limit":1})
print(res.posts)
```
これもlimitの部分で取得数を調整できます。返り値にはメタデータも含まれているので綺麗に出るよう整形が必要ですね。
[番外編 #9] よく「○○キー」を使ってます　~ HOME END PGUP PGON~

<!--
<font color="c00000"></font> 赤
-->
## はじめに
皆様お疲れ様です。
昨日参加した忘年会で誰よりも食べた自信があると思っている者です。:hamburger::sushi::sake:

今回は私が普段Qiitaの作成やコードの作成などでよく使う **「○○キー」** を挙げていきます。

:::note warn
:keyboard: 機種やモノによっては**キー名称や配置が異なります**
:::

## 「HOME」と「END」キー
私が使用しているWindows10のノートパソコンでは図のように「HOME」と「END」キーがあります
![S__10715159.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/c4d245de-f5ab-1118-74ea-b7976968649a.jpeg)
よく使う理由は
**「ブラウザページで一番上と下までスクロールできる」**
**「行の先頭や末尾に移動したり選択ができる」**
私は主にこの２つが理由で使用してます

### ブラウザページなどで一番上と下までスクロールできる
もうこれはそのままです。
スクロールが可能なウインドウで「END」キーを入力すると一発で一番下までいき、「HOME」ボタンで一発で一番上にいきます。

Qiitaで記事作成している時にエディタ上で一番上、下に一発でいきたい時は
**「Ctrl」** ＋「HOME」or「END」キーを活用してます。これにより**マウスが無くてもパパっと移動できます。**（そこまで長くなければスクロールバーでも良いんですけど。。）

### 行の先頭や末尾に移動したり選択ができる
これが結構良い意味で癖ついてます。文字を入力する際にカーソルの位置を瞬時に移動できるのが魅力的です。
![bangai0801.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/4d284136-d47a-59c3-8b2d-18e17329dc3d.png)
上図を例にしました。
エディタページで「初期位置」のカーソルの位置を基準とした際に

「HOMEキー」を入力すると **「今いる行の先頭」に移動**
「ENDキー」を入力すると **「今いる行の末尾」に移動**
「Ctrl + HOME」を入力すると **「一番上の行の先頭」に移動**
「Ctrl + END」を入力すると **「一番下の行の末尾」に移動**
..となるので図のような位置にカーソルが移動されます。わざわざマウスでカーソル移動させなくてもこのキー入力で完結できるということですね。

## 「PGUP」「PGON」キー
![S__10715161.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/4b09d542-905c-31f7-193e-712972695a76.jpeg)
こちらの図のキーもよく使います。
エディタ上でこのキーを使うと **「PGUP」は「一番上の行の先頭」** に、**「PGON」は「一番下の行の末尾」** に移動ができます。

またこのキーも「Ctrl」を合わせると.. **「ページの切替が瞬時にできます」**
![bangai0802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/c41d7584-41c2-41b4-8e58-b793ea98f669.png)
図のように今開いているページを切り替えたい時にマウスでカーソル移動させてクリックしなくても「Ctrl」+「PGON」または「PGUP」で切り替えることができます。これは便利すな

### ちなみに
私が現在現場先から貸与されている社用PCは「DELL　Windows11」です。
先ほど紹介した「HOME」「END」キーは下図の赤で囲った「home」「end」キーになります（私物用のでは全然配置が違うので慣れるのに時間はかかりましたが..）
![スクリーンショット 2024-12-14 163041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/4e4be3ea-b65c-db93-fb55-c4529637858e.png)

参考例▼

https://it-note.stylemap.co.jp/hardware/home-key%E2%86%92-what-it-is-and-how-to-use-it/

最後まで読んで頂きありがとうございました！

>>過去の番外編はこちら

https://qiita.com/aoiku/items/bebee0d898a4971a3146

https://qiita.com/aoiku/items/19cf51605f80c60d4004

https://qiita.com/aoiku/items/c500c4cb65499d11027a

https://qiita.com/aoiku/items/24a63ba63349c07a235c

https://qiita.com/aoiku/items/586f74ac39e1c9e3f816

https://qiita.com/aoiku/items/06059f13aa6782cb7ab8

https://qiita.com/aoiku/items/02b1e4ba816e4910d488

https://qiita.com/aoiku/items/8185c15c75d864586cbc

https://qiita.com/aoiku/items/d8736673b2a65f54fc93
【Google AdSense】審査、何故か通った

## 始めに

お久しぶりです、るんるんです。

私が運営しているブログサイトに表示されるようになった Google 広告の配給元、Google AdSense の審査について実体験に基づいて語っていきます。

ちなみに以下が私のブログサイトです。
どのようなサイトが通るのか、参考までに見てみてください。
また、こちらにも様々な記事を公開しています。ぜひご覧ください！！

https://runtech-blog.netlify.app/


## 審査期間

**約2週間**

- 申請を出した日: 2024/11/10
- 審査が通った日: 2024/11/26


## 甘く見ていた審査

どうやら広告収入を得られるらしいぞ！と思って、何も考えずに申請を出してみた。
そして申請を出してから「あ、通らない」と思った。

調べてみると、どうやら中々審査が厳しいらしい。
審査が通るために、以下のことが必要と出てきた...

- 独自ドメイン: やってない
- プライバシーポリシーの設置: やってない
- 自己紹介(About Me) の設置: やってない
- お問い合わせフォームの設置: やってない
- サイト内マップ: ちょっとだけやってる
- オリジナリティ: あるのかないのか分からない
- 10本以上の記事投稿 : 2本だけ

これらをやる前に意気揚々と審査に出してしまった...

「絶対落ちるやん...」

しかし、ここで朗報。どうやら何回でも審査にだせるらしい！

「なんだ〜、なら安心。」

この審査は落ちても次に向けて準備すれば良いだけか。

## 審査中に申し訳ないけど、サイトの改修させてもらうよ〜！

まぁどっちみちやるし、できることは今やっちゃおうということで、
以下、審査中にやったこと

### プライバシーポリシーページの追加
ChatGPT にたたきを作ってもらって、そこから自分流に仕上げる

### About Me ページの追加
顔出しはしていないが、出来るだけ話せる部分は公表して、透明性を持たせた

### お問い合わせフォームの追加
Netlify の Form 機能を使用した。使いやすい！
以下実装。

```
<form name="contact" method="POST" data-netlify="true" netlify-honeypot="bot-field">
    <input type="hidden" name="bot-field" />
    <input type="hidden" name="form-name" value="contact" />
    <p>
        <label>Name <input type="text" name="name" placeholder="お名前を入力してください" /></label>
    </p>
    <p>
        <label>Email <input type="email" name="email" placeholder="アドレスを入力してください" /></label>
    </p>
    <p>
        <label>Content</label>
        <textarea name="content" rows="4" cols="50" placeholder="お問い合わせ内容を入力してください..."></textarea>
    </p>
    <p>
        <button type="submit">Send</button>
    </p>
</form>
```

form タグの中に、`data-netlify="true"` と `netlify-honeypot="bot-field"` を指定する。
input タグに `type="hidden" name="bot-field"` と指定するのと、`type="hidden" name="form-name" value="contact"` を指定してあげる。

これだけで実装できてしまう。簡単！

### 独自ドメインにはしてない

というのも申請するときに URL を指定するため、独自ドメインを用意してURLを変更してしまうとえらい事になりそうな気がしたので、審査が終わるまで待っていた。

## 結果はまさかの...

2週間が経ち、「サイトに AdSense 広告を配信する準備ができました」というタイトルのメールが届く。

![スクリーンショット 2024-12-14 16.58.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518711/102f9a60-b90a-79f8-bcc6-e153c125e8db.png)


え、良いの！？という率直な言葉が口から漏れた
実際に自分のサイトを見に行くと、広告がびっしりと設置されているではないか。
晴れて、広告収入を得られる術を手に入れた。(あくまでも術)

## 分かったこと

- 独自ドメインじゃなくても審査は通る。
    - 「Google Adsense 審査」で検索して出てくる色々な記事で、独自ドメインは取得するよう促しているのが多いが、なくてもいけることが分かった
    - ただ、突破率で考えると独自ドメインの方が良いことは間違い無いだろう。
    - (あと独自ドメインの方がなんかかっこいいし)
- 記事は10本なくても良い
    - これは他の記事でもたまに散見された
- 結局有益かどうかをみてる可能性が高い
    - ブログに訪れた人に対して、有益な情報を提供しているかを審査していると筆者は思う。
    - つまりそう、[runTech Blog](https://runtech-blog.netlify.app/) は有益な情報源なのだ！

## 総括

如何だったでしょうか。

Google Adsense に通ったときは素直に嬉しかったし、モチベーションが爆増した。
もっとこの runTech を育てて、より良いブログサイトにしたいと思えた。

次課題として、UI をもっともっと磨いていきたい。
記事のページングやカテゴライズなどなど、まだまだやることは沢山！
#7.README.mdファイルの画像をGit上で表示する方法

# はじめに
こんにちは～nayaaaaです。

README.mdファイルに画像ファイルを添付してGitHubにプッシュしたのですが、
画像が表示されないということがあったので、原因と対処について記事にしてみました。

# やったこと
➀VSCodeを使用してREADME.mdファイルを開く
➁画像ファイルを添付（画像ファイルをドラッグ＆ドロップ）
➂GitコマンドでGithubへプッシュ

という感じで➀～➂まで行ってみたのですが、
以下のように、画像が表示されないということがありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/e68a51af-3f65-c685-0f12-ddec17397663.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/b3d48ff4-c1e6-feb7-9ee4-75ce2a78e598.png)


# 原因
なんでかなぁと思い確認してみたのですが
確認した結果としては、
参照先に画像がそもそも配置されていなかったため、コメントのみの表示となっていました....
# 対処
原因に記載したとおり、指定フォルダの配下に画像を保存してみます。
また、インターネットで調べているうちに知ったのですが、
Githubのコメント欄などに画像をドラッグ&ドロップすると
Gitで管理しているサーバに画像をアップロードし、そこを参照するようにリンクを生成します。
生成されたリンクを記述することで画像を表示することも可能、ということなのでこちらも試してみます。

まず、Githubのコメント欄に画像をドラッグ&ドロップします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/3a6e8f16-118a-0ea2-4eb2-4e68699addcd.png)

するとリンクが生成されるのでこちらをREADME.mdに追記します。

■README.mdの編集画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/c9edebfd-4c2a-9f0b-a897-8743b87ce790.png)


あとは、指定されたディレクトリに画像を配置してGithubにpushします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/add1f22f-14d9-888e-8d1b-b26620aaa86b.png)

これで画像の投稿について設定完了したので確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/6c9cc29d-70b9-2627-b014-11ce416199c9.png)
コードは上の画像のようになるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/57ffc879-0d53-cb72-48c1-d0a23c604c57.png)

確認のために同じ画像を使用しているので見栄えはって感じですが表示できましたね！　

# まとめ
今回はGithubに画像が投稿される仕組みについて学ぶことができました。
こういった画像が表示される仕組みや画像がどのように投稿されるかといった仕組みについては、
「こういう操作したら画像が投稿されるんだぁ～」という感覚的なものでしかなかったので、
これを機会に学ぶことができて良かったです。
SSL/TLSについて

- SSL（Secure Sockets Layer）
- TLS（Transport Layer Security）

## SSL/TLSが提供する3つの機能
- ウェブサイトのセキュア通信/暗号化：通信データを暗号化することによって、第三者による盗聴を防ぐ。
    - これにより、個人情報やクレジットカード番号、ログイン情報などの重要なデータが盗聴や改ざんから保護される。
- 認証：クライアントとサーバーが互いに信頼できるかどうかを確認する。通常はサーバー側がデジタル証明書を使用して認証を行う。
- データ完全性：データが転送中に、改ざんされていないことを確認する。

## キーワード
- SSL/TLS証明書
- 暗号化プロセス
mui/materialの Menuコンポーネント「'PaperProps' is deprecated.」メッセージ解消


## 事象

過去バージョン想定で書かれたMUI(Material UI)のコンポーネントに対して、VSCode上で以下のメッセージが表示されていた

### メッセージ内容

```txt
'PaperProps' is deprecated.ts(6385)
Popover.d.ts(144, 6): The declaration was marked as deprecated here.
(property) PaperProps?: Partial<PaperProps<React.ElementType<any, keyof React.JSX.IntrinsicElements>>> | undefined
Props applied to the Paper element.

This prop is an alias for slotProps.paper and will be overriden by it if both are used.

@deprecated — Use slotProps.paper instead.

@default

{}
```

### 対象コンポーネントの実装

```typescript
        <Menu
            anchorEl={mobileMenuAnchor}
            open={Boolean(mobileMenuAnchor)}
            onClose={handleMobileMenuClose}
            PaperProps={{   // ここでメッセージが出る
                style: {
                    maxHeight: '100%',
                    width: '250px',
                },
            }}
        >
```

## 事象発生時のバージョン

- mui/material: 6.1.10

## 対策

メッセージ内容に従い、deprecatedとなったPaperProps をslotPropsに書き換え、メッセージが消えることを確認(動作も問題なし)

```typescript
        <Menu
            anchorEl={mobileMenuAnchor}
            open={Boolean(mobileMenuAnchor)}
            onClose={handleMobileMenuClose}
            slotProps={{
                paper: {
                    style: {
                        maxHeight: '100%',
                        width: '250px',
                    }
                },
            }}
```

slotPropsの詳細は下の公式ドキュメントを参照
[React Menu components and hooks - Base UI](https://mui.com/base-ui/react-menu/#custom-structure)
音楽の本質を掴んでいこう

この記事はLife is Tech ! Advent Calendar 2024 用に書いたものです。

# はじめに
こんちわ〜👋

LiT! DTM・初音ミクメンターのぐっちゃんです

最近GooglepixelWatch3を購入して通知のバイブが腕に伝わるたびにココロオドルしてます💃

生活にリズムがあるってアツいですね

そんなこんなで、音楽と向き合い始めて10年近く、DTMを始めてもうすぐ5年。
今回は「音楽制作・表現」について、私が学んできたこと、気づいたことを少しシェアしたいと思います。

# 突然ですが…
みなさん、DTMを始める前にこんな風に思ったこと、ありませんか？

「音楽理論とかコードがわからんし…」
「絶対音感なんて持ってないし…」
「センスもない気がするし…」

**「いい音楽作れる気がしないからやめとこう。」**

…ちょっと待ってください。それ、すごくもったいないです＞＜！
もちろん理論や知識があれば音楽制作の幅は広がります。でも「いい音楽」を作るのに、理論や知識だけが全てではないんです。

実は、「いい音楽」にはもう1ピース、欠かせない要素があるんです。
今日はその「もう1ピース」について、お話ししていきます。

# 音楽の本質
結論からいきましょう。
その「もう1ピース」とは 『音楽の本質』 です。

「音楽の本質」とは、曲に込められた思いや背景のこと。
学校の音楽の授業で「もっと気持ちを込めて演奏して！」って言われたこと、ありますよね？
でも「気持ちを込める」ってどういうこと？実際、すごく難しいと思います。

ただ、この「気持ち」や「背景」を理解することこそが、音楽や芸術を作る上でとても大事な要素なんです。

たとえば…

- ベートーヴェンは「苦悩と歓喜」を表現し続けていたが、これはシラーの思想から着想を得ている
- ソナタ形式の構造は、もともと文学の構成方法が基になっている
- いよわさんの「きゅうくらりん」は、ドキドキ文芸部!から発想を得たといわれている


こうした事例を見ると、音楽というのは、その人が感じた感情や概念を「音」に変換して表現するものだと分かります。

普段音楽を聴いているとき、そんな背景や本質について考えたことはありますか？
私は、この「音楽の本質」を学び、自分の感情や考えを音に落とし込むことが、音楽表現のトレーニングになると考えています。

# 音楽の本質の掴み方
さてここからは実践のターンです

では、どうやってこの「音楽の本質」を掴むことができるのでしょうか？

**既存曲から学ぶ場合**

- 作曲者が発信している情報（SNSやインタビュー）をチェックする
- 作曲当時の時代背景や文化を学ぶ

こうして背景を知ったうえで、「こんな思いが、この音になっているんだ」と耳で感じる作業が大切です

もう１つ

**自分の感情を音にする場合**

まぁ〜これがむずい！

普段から感じたことや思ったことを音や詩や絵…つまり『芸術』に転換したらいいって話なんですけど，ここではそのためのトレーニングを紹介します

# 五感と表現の横断
トレーニングは五感と表現の横断活動です

人には五感…視・聴・嗅(きゅう)・味・触の五つの感覚があります(辛さは痛覚らしいですね)

表現は音楽，絵，詞，オノマトペ，彫刻…芸術という大きなひとくくりになりそうなものとしましょう

さて，例えば今回は味に着目してみましょうか

**用意するもの**

- 好きなチョコレート
- 紙やペン（またはデジタルツール）
- 楽器やDAW

**作業**

１.チョコレートを食べる

甘さにもいろんな甘さがあります。

ゆっくりと舌で味わって溶かすように食べてみてください。

２.紙，イラレといった自由に記述できる媒体に**甘さ**を表現する

その甘さ，あなたならまず何色のペンを選びますか？

描く線はまっすぐ？それとも丸みを帯びている？

紙いっぱいに描く？それとも余白を残す？

３.出来上がった絵から音を作る

絵の色，線，形，大きさ，数，図形，模様etc…

この線の丸みはこの楽器でこんなふうに表現しよう

色の重なりはこうやって表現しよう

音を作るのが難しかったら，まずはそのチョコの包み紙をくしゃくしゃとしたり破いたりして生まれる音を感じて甘さを表現してみてください

なんとも幼稚園のような活動でしたが…音楽，できあがりましたか？

といってもカチャポコ鳴ってるだけの，世の完成された音楽とは随分かけ離れたものになったかもしれません。

今はそれでいいんです


## トレーニングの狙い
実はこのトレーニングでは，味覚⇔美術⇔音楽　と身体活動を２つの表現活動で表現していました

２と３の間に，出来上がった絵を言葉・オノマトペで表現する。コラージュを貼ってみる。なんて活動を取り入れたら表現活動は３〜４活動になりますね

この横断・往復こそが芸術的感覚＝音楽の本質を少しずつ開くミソです

言葉や絵や音楽といった表現活動をしたうえにさらに別の方法で表現活動をする

こうした五感を様々な表現方法で表現し，横断・往復することで感情のアウトプットは磨かれていきます

こういうの，総合的・領域横断的な芸術教育って呼んでる人もいるみたいです

# おわりに
いかがでしたか？

今回は味覚に着目しましたが，お気に入りのぬいぐるみを触る触覚，コロンを香る嗅覚なんかも似たような方法で試せます

これがもっともっと成長したら，絵や自然・音楽・人etc…に感動して自分でも何か表現活動をする！ってことになるかと

よく多くのクリエイターが1人の時間を大事にしたりさんぽがやたら好きなのは，こうして自分の感情と見つめ合う時間を大事にしてるからなんじゃないかな。ってぐっちゃんは思います。

スピリチュアルくさい文章ですけど，

自分の感覚と対話して，音楽に限らずいろんな表現を試してみて，出来上がったものをまた別の表現で表現してみる。このいったりきたり深掘りが，音楽性…芸術性につながるんじゃないかなって思ってます。

クリエイティブは終わりのない活動です。どこまでも冒険できる楽しさをたくさん味わって航海を続けてください。

　すべてのクリエイターに幸あれ！ばいばーい！
sudoについて

これは自分向けの学習メモです

## 概要
- sudo（スード）は、Unix系のオペレーティングシステム（LinuxやmacOSなど）で使用されるコマンドの1つ。
- 管理者権限（root権限）を一時的に借りて、通常のユーザーがシステムの設定変更や管理作業を実行できるようにするためのもの。
- 「superuser do」の略で、通常のユーザーが実行するには権限が必要なコマンドを実行するために使用される。

## 特徴
- root権限の付与: sudoを使うことで、root（スーパーユーザー）権限を一時的に取得し、システムの重要な操作（例えば、ソフトウェアのインストールや設定変更など）を実行できる。
- セキュリティ: sudoを使うことで、rootアカウントに直接ログインする必要がなくなり、ユーザーごとに権限を細かく設定できるため、セキュリティが向上する。
- ログ機能: sudoで実行したコマンドはログに記録されるため、誰がどのコマンドを実行したかを追跡できる。
aptコマンド一覧

自分用学習メモです。

# そもそもaptとは何か？
- apt（Advanced Package Toolの略）は、DebianやUbuntuなどのLinuxディストリビューションで採用されているパッケージ管理システム
- パッケージのインストールやバージョンアップ、削除などの基本機能を備え、ソフトウェアの管理を簡単に行うことができる

- Debian：Linuxディストリビューション（Linuxカーネルに必要なアプリケーションやユーティリティを含めたパッケージのこと）の1つ。
    - Debian系の特徴：安定性とセキュリティを重視。初心者にも扱いやすい。

# どのようなことができるのか？
- パッケージを導入する際に必要なパッケージを調べる
- パッケージの導入で障害となるパッケージを調べる
- パッケージのアップデートや情報の調べ方を行う﻿

## 目的：追加・ダウンロード
- 新しいソフトウェアのインストール（root権限が必要）
apt install パッケージ名 
- ソースパッケージのダウンロード
apt source パッケージ名 
- ソースパッケージをコンパイルする為に必要なパッケージのインストール（root権限が必要）
apt build-dep パッケージ名 

## 目的：更新（アップデート）
- リポジトリの更新（root権限が必要）
apt update 
- インストール済みのソフトウェアの更新（root権限が必要）
apt upgrade 
- ディストリビューションのアップグレード（root権限が必要）
apt full-upgrade 

## 目的：検索・情報表示
- パッケージの検索
apt search 検索キーワード
- 特定パッケージの情報表示
apt show パッケージ名

## 目的：削除
- 特定パッケージの削除（root権限が必要）
apt remove パッケージ名 
- 特定パッケージの設定ファイルを含めた削除（root権限が必要）
apt purge パッケージ名 
- 不要なパッケージの自動削除(依存されていないライブラリ等)（root権限が必要）
apt autoremove
raiseの引数

>引数を渡した場合は、例外メッセージ message を持った error_type の示す例外(省略時 RuntimeError)を発生させます。

https://docs.ruby-lang.org/ja/latest/method/Kernel/m/raise.html#:~:text=%E5%BC%95%E6%95%B0%E3%82%92%E6%B8%A1%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%E4%BE%8B%E5%A4%96%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%20message%20%E3%82%92%E6%8C%81%E3%81%A3%E3%81%9F%20error_type%20%E3%81%AE%E7%A4%BA%E3%81%99%E4%BE%8B%E5%A4%96(%E7%9C%81%E7%95%A5%E6%99%82%20RuntimeError)%E3%82%92%E7%99%BA%E7%94%9F%E3%81%95%E3%81%9B%E3%81%BE%E3%81%99%E3%80%82

>raise(error_type, message, traceback) -> ()[permalink][rdoc][edit]
自身が表すスレッドで強制的に例外を発生させます。

>[PARAM] error_type:
Kernel.#raise を参照してください。
[PARAM] message:
Kernel.#raise を参照してください。
[PARAM] traceback:
Kernel.#raise を参照してください。

https://docs.ruby-lang.org/ja/latest/method/Thread/i/raise.html#:~:text=method%20Thread%23raise-,raise(error_type%2C%20message%2C%20traceback)%20%2D%3E%20(),Kernel.%23raise%20%E3%82%92%E5%8F%82%E7%85%A7%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82,-Thread.new%20%7B%0A%20%20sleep

>[PARAM] error_type:
発生させる例外を例外クラスまたは例外クラスのインスタンスで指定します。
[PARAM] message:
例外のメッセージとなる文字列です。
[PARAM] backtrace:
例外発生時のスタックトレースで、Kernel.#caller の戻り値と同じ形式で指定しなければいけません。
[PARAM] cause:
現在の例外($!)の代わりに Exception#cause に設定する例外を指定します。 Exception オブジェクトまたは nil を指定できます。
[EXCEPTION] TypeError:
exception メソッドが例外オブジェクトを返さなかった場合に発生します。
例外の捕捉の例を示します。

例1
```rb
begin
  raise NameError,"!!error!!"
rescue ArgumentError => err
rescue NameError => err
rescue TypeError => err
ensure
  p err #=> #<NameError: !!error!!>
end
```
https://docs.ruby-lang.org/ja/latest/method/Kernel/m/raise.html#:~:text=%5BPARAM%5D%20error_type%3A,NameError%3A%20!!error!!%3E%0Aend

### 条件に合えば、例外が強制的に発動する
例外メッセージ "respond_to takes either types or a block, never both" を持った ArgumentError の示す例外を起こさせる
```rb
raise ArgumentError, "respond_to takes either types or a block, never both" if mimes.any? && block_given?
```
https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/actionpack/lib/action_controller/metal/mime_responds.rb#L202
ブラウザ拡張機能でアドレスバーボタンを作る

# 概要

これは[初心者のブラウザ拡張機能 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/browser-extension)の13日目の記事です。

アドレスバーボタンを作る方法を記載します。

# アドレスバーボタンとは

ブラウザのアドレスバーのなかに表示されるボタンのことです。
このボタンはページ固有の機能を実装するために使われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/f87c750d-673a-1e0c-18b5-2f82b0697cdd.png)

# 具体的なコード

サンプルとして`qiita.com`のページを表示した際にアドレスバーボタンを作り、ボタンを押すとOSの通知が出るようにします。

```json:manifest.json
{
    "browser_specific_settings": {
        "gecko": {
          "id": "the-town-sample-addressbarbutton@example.com"
        }
    },
    "manifest_version": 2,
    "name": "init-extention",
    "version": "0.1",
  
    "description": "アドレスバーボタンサンプル",
  
    "icons": {
      "48": "icons/icon-48.png"
    },
  
    "page_action": {
      "browser_style": true,
      "default_icon": {
        "38": "icons/icon-48.png"
      },
      "show_matches": ["https://qiita.com/*"],
      "default_title": "sample?"
    },

    "background": {
      "scripts": ["background.js"]
    },

    "permissions": [
      "tabs",
      "notifications"
    ]
}
```

`manifest.json`内で重要なのは`page_action`です。
ここにアドレスバーボタンの設定を入れます。

| 設定項目 | 値 | 説明 |
| ---- | ---- | ---- |
| browser_style | true または false | ブラウザーのスタイルを適用して統一感を出すかどうかを決める設定。デフォルトはfalseだが、統一感を出す場合はtrueにするのが推奨 |
| default_icon | ボタンのアイコン | アドレスバーボタンに表示したいアイコンを入れる |
| show_matches | URL | アドレスバーボタンを表示するページを指定する。デフォルトではどのページでも非表示 |
| default_title | ボタンのタイトル | ボタンの名前を入れる |

```javascript:background.js
function handleClick() {
    browser.notifications.create({
        type: "basic",
        iconUrl: browser.runtime.getURL("icons/icon-48.png"),
        title: "Clicked!",
        message: "クリックしました",
    });
}

browser.pageAction.onClicked.addListener(handleClick);
```

`browser.pageAction.onClicked`でボタンが押されたときのイベントをキャッチします。

# 参考

[アドレスバーボタン](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/user_interface/Page_actions)
歴史的文字入力用のWeb IME作成しました ～龍樹(Nagarjuna)～

ただでさえほぼ1人でヒストリーテックアドベントカレンダー書いてるのに、4日以上書くの貯めたまま、他の事やってました。
別にこれやらなくてもネタは（書く分量はでかくなりますが）ないわけではないのですが、一度始めると完成させないと、気がかりで他の事に気を払えなくて…。
なんとかこれができたんで、頑張って他の記事書きます。
というか、俺程度の技術者が、数日でほぼゼロから新しいnpmモジュール完成させられるとか、生成AIパワーすごいっすね。

## 歴史的文字の表示/入力用Web環境

今はあまり使われないが、歴史的に使われる文字というのはよくあります。
仏教の石造物によく使われる梵字（悉曇文字）や、漢字の異体字、古文書によく使われる変体仮名などです。
このような文字は、ユニコードで整備されフォントも少ないながら用意されて、材料としては使える環境がそろってきていながら、ラストワンマイルともいえる入力するためのツールと、それを確認したり、表示したりする環境が整備されていないために、まだ完全に使われる状況にはなっていないと思います。

そこで、歴史調査のWebツールなどで、歴史的文字の入力や表示用の環境を作れるJavaScriptライブラリを作りました。
ツール名は[龍樹(Nagarjuna)](https://github.com/code4history/Nagarjuna)です。

* [動作デモ](https://code4history.dev/Nagarjuna/)
* [npmパッケージページ](https://www.npmjs.com/package/nagarjuna)

[![動作デモ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/51a4c867-db0b-eb0e-c713-db49d9a9a937.png)](https://code4history.dev/Nagarjuna/)

## 特徴

- 変体仮名（NINJAL変体仮名フォント使用）
- 悉曇文字（Noto Sans Siddham使用）
- 漢字異体字（Noto Sans JP使用）
- フォントの自動読み込み
- モバイル対応IME機能

## 使い方

### 表示用途のみ（フォントローダー）

特殊文字の表示のみが必要な場合:

```javascript
import { FontLoader } from 'nagarjuna';

const fontLoader = new FontLoader();

// 必要なフォントのみを読み込み
await fontLoader.loadFonts({
  hentaigana: true,  // 変体仮名を使用
  siddham: true,     // 悉曇文字を使用
  itaiji: true       // 異体字を使用
});

// フォントファミリーの設定
const element = document.getElementById('target');
element.style.fontFamily = fontLoader.getFontFamilyString({
  hentaigana: true,
  siddham: true,
  itaiji: true
});
```

### IME機能を使用

入力機能が必要な場合:

```javascript
import { IMEManager } from 'nagarjuna/ime';

// IMEマネージャーの初期化
const manager = IMEManager.getInstance();

// 入力フィールドへのIME機能の追加
const input = document.querySelector('input');
manager.attach(input, {
  options: {
    enabledTypes: {
      hentaigana: true,  // 変体仮名変換を有効化
      siddham: true,     // 悉曇文字変換を有効化
      itaiji: true,      // 異体字変換を有効化
      buddha_name: true  // 仏名変換を有効化（悉曇文字の一部）
    }
  }
});

// IMEオプションの動的更新
manager.updateOptions({
  enabledTypes: {
    hentaigana: true,
    siddham: false,
    itaiji: true,
    buddha_name: false
  }
});
```

## 使ってみてください

まだ作ったばかりで、自分でもどこのプロジェクトにも投入していないツールですが、これまでになかったプロジェクトだと自負しています。
ぜひ使ってみて、改善点や追加機能など寄せてください。
将来的には、[大谷正幸](https://fjska.sakura.ne.jp/)さんの許可を得られれば、富士講の[角行系文字フォント](https://fjska.sakura.ne.jp/kkgkf.html)などにも対応してみたいです。
C# WPFでウィンドウ拡大時にウィンドウを崩さずに表示させるのを苦戦した話

# 対象の方
僕の場合、WPFでやりましたが、Winformでもできると思います。

#### HorizontalAlignmentとVerticalAlignmentで普通に表示できると思ってた
実際にやってみましたが、水平方向の配置と垂直配置なので、関係ありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3897258/e112857e-c5b1-30d8-de81-1ddf3169a0ae.png)

#### 直接指定
これは普通に画面の解像度、拡大率によって普通に崩れます。

#### ウィンドウサイズを取得
僕の場合、1:1のウィンドウなので、ウィンドウサイズを取得して、それの1/2を取得すれば、そのままきれいに表示できました。
これは画面サイズではなく、ウィンドウサイズを取得しているので、真四角でも崩れずに表示できるようになりました。


```cs:MainWindow.xml.cs
  private void window_main_SizeChanged(object sender, SizeChangedEventArgs e)
  {
    // ウィンドウの幅を半分にする
    double newWidth = window_main.Width / 2;
    left_con.Width = newWidth;
    }
```


僕の場合、WindowStateがnormalに戻った時はなんか崩れたので、初期サイズを指定しました。
```cs:MainWindow.xml.cs

            if (this.WindowState == WindowState.Normal)
            {
                //左側
                left_content.Width = 575;
                left_content.Height = 652
                
                //右側
                right_content.Width = 575;
                right_content.Height = 652;

            }
```
【Spring Initializr 読解】initializr 特有の資材

[【Spring Initializr 読解】採用技術スタック特有の資材](https://qiita.com/nimzo6689/items/afed2bb15d4af938cf9a) の続編です。

この記事では、 initializr 特有の資材について確認していきます。

https://github.com/spring-io/initializr

# 各モジュールについて

README と `pom.xml` を参考に、各モジュールの概要を整理します。また、なるべく他のモジュールから依存されている順で記載していきます。

## Java の実装を持たない POM（= 親 POM）

まずは、親 POM から各モジュールの役割を見ていきます。

### initializr

プロジェクト直下に配置されている `pom.xml` のプロジェクトです。
子 POMが11個定義されています。子POMごとにディレクトリが作成され、それがプロジェクト直下に配置されている構成になっています。

この親 POM 内では、Maven の基本的なプラグインやフォーマットに関するライブラリの依存性のみが定義されています。

### initializr-bom

唯一、プロジェクト直下の `pom.xml` を直接継承しているモジュールです。
Spring Initializr プロジェクト全体での依存関係バージョンの一元管理をしています。

また、Maven のプラグインで以下の設定をしています。

**flatten-maven-plugin**
必要最小限の情報を含むPOMを生成。
また、`${revision}` に具体的なバージョン名を付与する。

**xml-maven-plugin**
上記のプラグインで生成したPOMを整形する。

### initializr-parent

唯一、initializr-bom を直接継承しているモジュールです。

以下の項目において、 initializr 全体のプロジェクト設定の共通化をしています。

**依存関係バージョンの一元管理**
Spring Boot Dependencies, Apache Commons（compress, text）, Maven関連ライブラリ, など。

**プラグイン設定の共通化**
maven-source-plugin や maven-compile-plugin などの一般的な Maven プラグインの設定。
また、`full` プロファイルにて、javadoc を生成する設定も追加しています。

## Java の実装を持つモジュール

これ以降のモジュールは実際に Java のソースコードを含みます。

### initializr-version-resolver

こちらは initializr が適切なライブラリバージョンを選択・解決する機能を提供するモジュールです。

既存の Maven で使用されている依存解決方法はスレッドセーフではないことでローカルリポジトリが壊れてしまう問題が起こるそうで、その問題を回避するためのモジュールみたいです。
Spring のプロジェクトというよりも、Utility 系のプロジェクトといった印象。

### initializr-generator

テンプレートベースのコード生成と、Spring フレームワークを使用したプロジェクト生成の機能を提供している initializr の中核的なモジュールです。

### initializr-metadata

プロジェクト生成に必要なメタデータの定義に関する機能を提供しています。
依存性に `initializr-generator` を持っています。

### initializr-generator-spring

基本の `initializr-generator` を拡張して、Spring プロジェクトに特化した機能を提供するモジュールです。

`initializr-generator` と `initializr-metadata` を依存性として持っています。
また、テストスコープとして `initializr-generator-test` を使っています。

### initializr-generator-test

プロジェクト生成機能のテストを支援するユーティリティを提供しています。
また、テスト基盤としての役割を果たすため、主要なテストライブラリが実行時依存関係（compile scope）として含まれています。

`initializr-generator` と `initializr-metadata` を依存性として持っています。

### initializr-web

このモジュールが Spring Initializr の Web フロントエンドとして機能し、ユーザーインターフェースとAPIを提供しています。
具体的には以下のような機能です。

- REST API の実装
- プロジェクトのダウンロード機能
- プロジェクト生成のためのフォームハンドリング
- 各種メタデータの提供

`initializr-generator` と `initializr-metadata` を依存性として持ち、
テストスコープとして、`initializr-generator-spring`、`initializr-generator-test` を持ちます。

### initializr-actuator

Spring Boot Actuator を使用して、Spring Initializr の運用監視機能を提供しています。
具体的には、システムの健康状態、メトリクス、使用統計などの監視機能を提供しているようです。

依存性として今まで上記で紹介してきたライブラリを持ちます。

### initializr-docs

JavaDoc を生成するための機能を提供しています。
生成したドキュメントは以下で公開されているようです。

[仕様書](https://docs.spring.io/initializr/docs/current/reference/html/)
[Javadoc](https://docs.spring.io/initializr/docs/current/api/)

依存性として今まで上記で紹介してきたライブラリを持ちます。

### initializr-service-sample

Spring Initializr を実際にサービスとして実装する際のサンプル（参照実装）を提供しています。
ソースコードで処理の始まりから追っていきたい場合、ここを起点にするのがよさそう。
Spring Bootでのweb app開発 #1

## はじめに
みなさま初めまして。Nyamaです。
Qittaを含め、こういった技術ブログは初めて書くため、不慣れな点はご承知おきください。

Spring Bootを用いたWebアプリを製作するので、自分のためにも制作過程をまとめていきます。

## 制作するアプリの概要
- 飲食店で利用されている注文システム
- 客が席に置かれているQRコードを読み取ることで利用開始する

## 開発環境
|  | 製品名 | version |
|:-:|:-:|:-:|
| IDEA | JetBrains社 Intellij IDEA Community Edition | 2024.3.1 |
| buildツール | gradle Groovy | 3.0.22 | 
| Framework | Spring Boot | 3.4.0 |
| データベース | Mysql | 8.0.40 |

## Spring Frameworkについて(2024/12/14 追記)
- Spring BootはSpring Framework上で構築されているJavaベースのフレームワーク
- Webサーバが既に組み込まれているため、開発者が別途サーバをインストールする必要がない
- Spring Initializrを使用することで、利用するspring-boot-starterを簡単に組み込める

## プロジェクトの立ち上げ方
- Intellij IDEAから新しいプロジェクトを立ち上げる際に左手側のGenerators->start.spring.ioを選択することでSpring Initializrを利用できる
- 追加したstarterは"Spring Boot DevTools", "Spring Web", "Thymeleaf"
- その後"Lombok" や"Spring Data JPA"を追加しているが、おいおいできるので、最初は上記の物だけで良い気がする
<img width=75% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961282/7f602cbb-d919-9666-92cf-9762b19a5a6a.png">

## アプリ稼働中に変更を反映させる方法
- File => Settings => Build, Execution, Deployment => Compilerへ移動後、"Build project automatically"にチェックを入れApplyする

<img width=75% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961282/e8f08717-4a9f-593e-04a2-ce4ae8a8b364.png"><br><br>
- src/main/resources/application.propertiesに以下のコードを追記する
~~~
 spring.thymeleaf.prefix=file:./src/main/resources/templates/
 spring.thymeleaf.cache=false
~~~

- 調べてみると Helo => Find Acction から "Registry"を開き "compiler..."にチェックを入れるとの記事もあったが、versionの違いか、自分の環境ではその項目がなかったが、問題なくできた
ブラウザ拡張機能でツールバーボタンを使う

# 概要

これは[初心者のブラウザ拡張機能 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/browser-extension)の12日目の記事です。

ブラウザのツールバーボタンを使う方法を記載します。

# ツールバーボタンとは

ツールバーボタンはブラウザの上部にある検索ボックスの隣りに表示されるボタンのことです。
Firefoxの場合は以下画像の赤枠の部分です。

![ツールバーボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/60359877-b76e-e820-686f-21f9b6164da9.png)

# 具体的なコード

サンプルとしてツールバーボタンが押されたときにOSの通知を行う拡張機能を作ります。

```json:manifest.json
{
    "browser_specific_settings": {
        "gecko": {
          "id": "the-town-sample-toolbarbutton@example.com"
        }
    },
    "manifest_version": 2,
    "name": "init-extention",
    "version": "0.1",
  
    "description": "ツールバーボタンサンプル",
  
    "icons": {
      "48": "icons/icon-48.png"
    },
  
    "browser_action": {
      "default_icon": "icons/star-empty-38.png",
      "default_title": "sample"
    },

    "background": {
      "scripts": ["background.js"]
    },

    "permissions": [
      "tabs",
      "notifications"
    ]
}
```

`manifest.json`内で指定する箇所は`browser_action`です。
ここでボタンの名前とアイコンを指定します。


```javascript:background.js

function handleClick() {
    browser.notifications.create({
        type: "basic",
        iconUrl: browser.runtime.getURL("icons/icon-48.png"),
        title: "Clicked!",
        message: "クリックしました",
    });
}

browser.browserAction.onClicked.addListener(handleClick);
```

ツールバーボタンが押されたときに発生するイベントは`browser.browserAction.onClicked`でキャッチします。

# ツールバーにボタンを固定する方法

ツールバーへボタンを固定するには拡張機能から`ツールバーにピン留め`を選びます。

![ピン留め設定1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/f174f5a7-c561-3739-c9c2-9b188738f918.png)

![ピン留め設定2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/ad037353-2a8f-de5b-84bc-a3e05c55d783.png)

![ピン留め設定3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/c22a3d7b-2445-e637-21f8-14c2098a4a62.png)
凡人だからこそ資格が必要ー取った資格集

## そこに凡人がいる限り、資格は存在する ##
詰まるところ、凡人には資格が必要である。
資格がなければ、何ができるかも証明できない、その程度の人材なのだ。
だからと言って、ITでは資格を取ったからといって、その資格に関連した技術を
マスターしているとは言えない。
しかし、凡人が頑張ったという証拠として、エンジニア界隈で依然重要な役割をこれからも担っていくであろう。


## 資格取得の遍歴と感想〜更新中〜 ##
- 社会人０年目:
　**-簿記３級**
    こういう、いつ使えるか分からない知識って、めちゃくちゃずっと使えますよね。
    取っておいてよかったですよ、株とか会社のことやっていると本当にそう思います。
    <br>
    
- 社会人１年目:
　**-G検定**
　**-HTML5プロフェッショナル検定Lv.1〜２**
    社会人１年目の資格取得って、大学をサボっていた人の挽回のチャンスなんですよね。
    転職市場でも、
    「初期からキャリアを意識して、自ら行動できる人」
    っていう、ブランディングが出来たのでやっておいてよかったです。
    HTML5プロフェッショナル検定は、よりWebに特化した知識を習得できたので、普通によかったです。
    <br>
    
- 社会人２年目:
　**-基本情報技術者試験**
　**-応用情報技術者試験**
    勢い余って２つ取っちゃいました。元々理系だったので、なんだかんだ面白がりながら勉強できたのを覚えています。
    <br>
    
- 社会人３年目:
　**-AWS Solution Architect　Associate**
    クラウドはあんまり興味なかったのですが（笑）、一応取っておきました。あんまり、面白くなかったです。。。今となっては、もっと楽しく勉強できたんですかね？
    <br>

- 社会人４年:
(勉強中)
　**-国家キャリアコンサルタント資格**
    なんでこんな資格を勉強しているかというと、キャリア論・組織開発・人材開発の学問的背景にとても興味を持ったからです。試験を受けるために、決まったところの講義を受けなくてはいけないのですが、講義はめちゃくちゃためになっています。傾聴力が本当についたと実感。社会人としても、人間としても今ままでのどの資格よりも成長した実感を持てるものでした。エンジニアには関係ないけど。。。（笑）
　**-GC Professional Data Engineer**
    これは会社の居場所を確保するために勉強しています（笑）
Lambdaのエイリアスを使用した加重ルーティングの実装

# はじめに
AWS Lambdaではバージョンごとにエイリアスを設定することができます。本記事では、エイリアスを使用して、同じLambda関数の異なるバージョン間でトラフィックを加重ルーティングする方法を実装していきます。


# ゴール
Lambdaのバージョニングとエイリアスを利用した加重ルーティングの実施


# 加重ルーティングとは？
トラフィックを指定した割合で分割する事


# 作るもの
- Lambda
    - Python 3.12
- API Gateway

# Lambdaの作成

Lambdaのバージョンを2つ（バージョン1, 2）作成していきます。

- **バージョン1の作成**

Lambdaのバージョン1が実行された事が分かるよう内容にしてデプロイします。

```python
def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': 'これは Lambda バージョン 1 です。'
    }
```

デプロイ後にバージョンを作成します。
バージョンタブに移動し、`新しいバージョンを発行` をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/be39fb51-f49e-68bd-6bae-a7231f164a65.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/5b9b6cdb-c696-f9b7-7344-fc5444ae5163.png)

- **エイリアスの設定**

バージョンのエイリアスを作成します。
エイリアスタブに移動し、`エイリアスを発行` をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/0b2794ee-8fc5-b64e-b9a9-8297e70db135.png)

エイリアスの名前とバージョンを選択して保存をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/8bd04894-44be-a253-f8f3-4d721b8fa758.png)


- **バージョン2の作成**

バージョン1の作成と同様に2を作成します。
作成出来たらデプロイ後に新しいバージョンを発行します。

```python
def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': 'これは Lambda バージョン 2 です。'
    }
```

# 加重ルーティングの設定

エイリアスタブから `test` エイリアスを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/def4d89f-ee37-af87-8faa-3afef4bb57d6.png)

全体の20%のトラフィックはバージョン２に行くように振り分けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/822f32f8-0758-e26d-876e-ea5cc4385974.png)


# API Gatewayとの連携

以下の設定でAPI GatewayとLambdaを連携します。

- 統合タイプ：Lambda（エイリアスをつけたバージョンのLambdaを選択）
- メソッド：Get


# リクエストを送ってみる
Postmanから10回ほどリクエストを送って試してみます。
確率的には10回中８件はバージョン1、2件はバージョン2で処理されます。

## 実行結果
10回中7回はバージョン1、3回はバージョン2で処理されました。想定結果から大きく外れず、それぞれのLambdaバージョンが動いてることを確認できました。

7回
```
{
    "statusCode": 200,
    "body": "これは Lambda バージョン 1 です。"
}
```

3回
```
{
    "statusCode": 200,
    "body": "これは Lambda バージョン 2 です。"
}
```
わかりませんでした。P1P2片持ち梁の複数荷重(4/4)「sympyで、マコーレーの括弧を使って、片持ち梁の2つの荷重の弾性方程式を表示して下さい。」AI先生へ

:::note info
前　 [(3/4)「はりのたわみの エネルギー法のsympyのコードを 微分方程式の直接解法のsympyのコードへ 変換して下さい。」
](https://qiita.com/mrrclb48z/items/5677d05a2861aa3a2ef1)
:::
# User
あなた:
```
sympyで、マコーレーの括弧を使って、片持ち梁の2つの荷重の弾性方程式を表示して下さい。
```
# わかりませんでした。ChatGPT先生へ
回答抜粋
```python
from sympy import symbols, Piecewise, integrate, Function

# シンボルの定義
x, x1, x2, P1, P2, E, I = symbols('x x1 x2 P1 P2 E I')
v = Function('v')(x)  # 変位 v(x)

# モーメント M(x) の定義 (マコーレー括弧をPiecewiseで表現)
M = Piecewise(
    (P1 * (x - x1), x >= x1),
    (0, True)
) + Piecewise(
    (P2 * (x - x2), x >= x2),
    (0, True)
)

# 弾性方程式の計算 (1/EI を考慮)
v_eq = integrate(integrate(M / (E * I), x), x)

# 結果を表示
v_eq

print("#",v_eq)    # (2024-12-14) 私が追加しました。
```
??? 結果の省略


# わかりませんでした。Gemini先生へ
回答抜粋
```python
import sympy as sp

# 変数の定義
x, L, a, b, P1, P2, E, I = sp.symbols('x L a b P1 P2 E I')

# マコーレーの括弧を定義する関数
def macaulay(x, a):
    return sp.Heaviside(x-a)*(x-a)

# 曲げモーメントM(x)
M = P1 * macaulay(x, a) + P2 * macaulay(x, b)

# 弾性曲線y(x)の微分方程式
y_diff = sp.integrate(sp.integrate(M/(E*I), x), x)

# 境界条件：x=Lでy=0, y'=0
C1, C2 = sp.symbols('C1 C2')
y = y_diff + C1*x + C2
y_prime = sp.diff(y, x)
eq1 = y.subs(x, L)
eq2 = y_prime.subs(x, L)

# 境界条件から定数C1, C2を求める
sol = sp.solve([eq1, eq2], (C1, C2))

# 弾性曲線y(x)にC1, C2を代入
y = y.subs(sol)

# 結果を表示
# sp.pprint(y)

from sympy import *        # (2024-12-14) 私が追加しました。
print("#",y              ) # (2024-12-14) 私が追加しました。
print("#",y.subs({x:a})  ) # (2024-12-14) 私が追加しました。
print("#",y.subs({x:a+b})) # (2024-12-14) 私が追加しました。
print("#",y.subs({x:L})  ) # (2024-12-14) 私が追加しました。
```
??? 結果の省略

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

https://en.wikipedia.org/wiki/Macaulay_brackets

https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B3%E3%83%BC%E3%83%AC%E3%83%BC%E3%81%AE%E6%8B%AC%E5%BC%A7

＞ マコーレー括弧

https://www.google.com/search?q=%E3%83%9E%E3%82%B3%E3%83%BC%E3%83%AC%E3%83%BC%E6%8B%AC%E5%BC%A7&rlz=1CAUHAM_enJP1105&oq=%E3%83%9E%E3%82%B3%E3%83%BC%E3%83%AC%E3%83%BC%E6%8B%AC%E5%BC%A7&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIKCAEQABiABBiiBDIKCAIQABiABBiiBDIKCAMQABiABBiiBDIKCAQQABiABBiiBNIBBzkwOWowajSoAgCwAgE&sourceid=chrome&ie=UTF-8


https://qiita.com/mrrclb48z/items/2dcb37bb1909f9acf9c5