OmniAICreator/Qiita-1.07M huggingface dataset:
宣言的UI(SwiftUI)と命令的UI(UIKit)

## はじめに
最近はUIKitを用いた開発から、ようやくSwiftUIを用いた開発をしています。
頭の整理のため、そもそも宣言的UIと命令的UIってなんだっけ？という部分から落とし込んでいきます。

## 命令的UI(UIKit)
まず従来の命令的UIから...
- **どのように**Viewが構成されているのか記述されている

ってことらしいんですが、正直これだけみたら全然わからないです。
具体例ともに見るのが一番。
ちょっと極端な例ですが、リスト表示するパターンを見てみます
```swift
import UIKit

class TableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    let tableView = UITableView()
    let items = ["Apple", "Banana", "Cherry"]

    override func viewDidLoad() {
        super.viewDidLoad()

        // TableViewのセットアップ
        tableView.frame = view.bounds
        tableView.dataSource = self
        tableView.delegate = self
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        view.addSubview(tableView) // Viewに追加
    }

    // MARK: - UITableViewDataSource
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = items[indexPath.row]
        return cell
    }
}
```
UIKitのTableViewやCollectionViewは表示するための手続きが多く、DataSourceの登録や各アクションのDelegateが分かれており、エンジニアになった当初は苦戦した記憶があります。
ということで記述も多いですね。
> **どのように**Viewが構成されているのか記述されている

ということだったのですが、
- `cell.textLabel?.text`にはitems配列の各itemが代入され
- tableViewを手動で宣言し
- それをviewにaddSubviewする

以上のようにどのような流れでViewが構成されるか、そして状態が変化するか開発者が明示的に命令する。
ということかなと思います。
最終的にどんな階層構造のUIとなるのか、コードを見ただけではなかなか理解できないです。
これに加えて、描画の更新するには`reloadData()`などを呼び、明示的に更新する必要があったりします。


## 宣言的UI(SwiftUI)
対して宣言的UIは
- **何で**Viewが構成されているのか記述されている

ということらしいです。
```swift
import SwiftUI

struct ContentView: View {
    let items = ["Apple", "Banana", "Cherry"]

    var body: some View {
        List(items, id: \.self) { item in
            Text(item)
        }
    }
}

```
完結すぎる...
> **何で**Viewが構成されているのか記述されている

"何で"というのは、
- **items配列**からなるListViewがあり
    - 配列の**各item**を表示するTextViewがある

というように、何で（何のプロパティで、何のViewで）構成されているのか記述されているってことだと思います。
宣言的UIの名前の通り、UIの完成形の構造を宣言して構築しているので、構成が容易に想像できます。
また詳しくは今回割愛ですが、itemsが変更されれば、自動で再描画されるのもポイント高いです。


## さいごに
はじめは宣言的命令的って言葉が何となく理解しずらく感じましたが、確かにそれぞれ宣言・命令していますね。
宣言的UIの
- ひとめ見て構造が理解しやすい
- 各Viewがどのデータに基づいて表示されているかわかりやすい
- 記述量の少なさ

は本当に魅力的だなと感じました。

とはいえ、UIKitではできてSwiftUIだと実現できないような部分がまだあるのは事実です。
- WebViewの実装
- 複雑な描画制御
- UIKit向けにしか提供していない外部ライブラリ

など...
今後SwiftUIがアップデートされ対応していく可能性はありますが、引き続きUIKitの知識は必要そうです。



#### 余談
Androidの話になりますが、Droid会議2024のセッションなんかでも殆どJetpack Compose前提の話だったので、モバイル開発やフロント開発ではもう宣言的UIがスタンダードですね。


## 参考

https://zenn.dev/bannzai/articles/99c48fb610716a#%E5%91%BD%E4%BB%A4%E7%9A%84ui
bit,進数

## bit

最小の単位
2進数1桁
0と1

## 進数

よく使われるn進数…２進数、８進数、１６進数
n進数のnとは…つかえる数字の数。収まらない時は桁が上がる

### ◯２進数
0,1,10,11,100,101,110,111,1000　

111→1000の解説
増えるのは必ず１桁目から。
111の1桁目が繰り上がって、0
そうすると2桁目も繰り上がって0
3桁目同じように繰り上がって0
4桁目に1がくる


### ◯8進数
0,1,2,3,4,5,6,7,10,11,12,13,14,15,16,17,20,21,〜76,77,100
7の次がないので桁あがり

### ◯16進数
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10,11,12,13,〜19,
1A,1B,〜1E,1F,20,21,22,〜F1,F2,〜FE,FF,100
Fの次がないので桁あがり

FF→100の解説
1桁目が繰り上がることで、2桁目も加算されて繰り上がって3桁になる


### <各桁の重み>

- 小数点より前

|桁|重み|10進数|2進数|8進数|16進数|
|---|---|---|---|---|---|
|1桁目　| $n^0$ |1|1|1|1|1|
|2桁目　| $n^1$ |10|2|8|16|
|3桁目　| $n^2$ |100|4|64|16|
|4桁目　| $n^3$ |1000|8|512|256|
|N桁目　| $n^{N-1}$ |||||

- 小数点より後ろ

|桁|重み|10進数|2進数|8進数|16進数|
|---|---|---|---|---|---|
|1桁目　| $n^{-1}$ |1/10|1/2|1/8|1/16|
|2桁目　| $n^{-2}$ |1/100|1/4|1/64|1/512|
|3桁目　| $n^{-3}$ |1/1000|1/8|1/512|1/4096|
|N桁目　| $n^{-N}$ |||||

 ☆ -乗については別で解説
【Rails】データベーススキーマからER図を生成する方法

Liam ERDを使用すると`schema.rb`からER図を生成できます。

https://github.com/liam-hq/liam

## 生成方法

### リポジトリが公開されている場合

GitHubのリポジトリが公開されている場合には以下のように`schema.rb`のURLに`liambx.com/erd/p`を挿入するだけでER図が生成されます。

```text
https://liambx.com/erd/p/github.com/UserName/repository-name/blob/main/db/schema.rb
```

以下のように表示を切り替えられます。

- 全てのフィールドを表示
![スクリーンショット 2025-02-08 23.40.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/ac7fdb06-87d9-f2e4-ee74-ef7693f88523.png)

- テーブル名のみ
![スクリーンショット 2025-02-08 23.41.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/cd3db916-4ee5-7bc8-8d48-add2f82e22d4.png)

- テーブル名とキー
![スクリーンショット 2025-02-08 23.42.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/ed88ad71-6bd9-7bbe-bcf2-49e0a967e203.png)

テーブルをクリックすると詳細情報が表示されます。

![スクリーンショット 2025-02-08 23.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/a7f0cecd-7076-07cd-8b76-c04119f16423.png)

テーブルの表示・非表示を切り替えることもできます。

https://liambx.com/docs/web

### リポジトリが非公開の場合

リポジトリが公開されていない場合には以下をご参照ください。

https://liambx.com/docs#private-project-setup
素因数分解手法の研究ノート(rho法の因数発見確率について)

# はじめに
素因数分解のアルゴリズムとして、試し割法やrho法、p-1法、楕円曲線法(ecm)などが有名である。これらの長所短所はよく知られているが、具体的にどのような場合にどのアルゴリズムを(更にはどのパラメータを)使うかはあまり知られていない。例えば、何の情報もない自然数nに対してecmを試すよりも、まずは2や3といった小さい素数で試し割をしてみるだろうし、逆に試し割をある程度行ったならばecmに切り替えた方が効率的だろう。雰囲気はそういうことが知りたいのだが、具体的な境界を示すのはちょっと大変だ。

ここで結論が出ているわけではなく、ああだこうだ言っているだけであることに注意してほしい。

# rho法
[rho法](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%A9%E3%83%BC%E3%83%89%E3%83%BB%E3%83%AD%E3%83%BC%E7%B4%A0%E5%9B%A0%E6%95%B0%E5%88%86%E8%A7%A3%E6%B3%95) 自体の説明はリンク先に譲る。

$n$の素因数$p$について、大体$\sqrt{p}$回のループで$p$を発見できることが知られている。理屈の上ではそうなのだが、実験して調べてみる。$k$回のループではどれほどの大きさの$p$が見つかることが期待できるのだろうか？

![rho.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294220/682275d6-d575-c35b-bebe-e861536eb9be.png)

このグラフは、rho法のループ回数を300, 1000, ..., 30000と変化させたとき、大きさ$\lg p$の素因数を発見できる確率を表している。例えば、1000回のループだと、$2^{18}$くらいまでは確実に見つけられるが、そこからどんどん発見確率は下がり、$2^{25}$くらいの素因数を発見できる確率はごくわずかだ。ただしあくまで素因数のサイズとループ回数の関係を知りたいので、失敗は考慮していない。rho法の場合、2つの素因数が近いとき失敗することがあるが、その時は初期値を変えてリトライすればよい。

とは言え、何か閾値を設けないと扱い辛い。そこで、ecmの界隈で利用されている[T-level](https://oeis.org/wiki/OEIS_sequences_needing_factors#T-levels)を参考に、$1-1/e$=約63%を基準としてみよう。つまり、$k$回のループを実行すると63%の確率で見つかる素因数のサイズを見積もりたい。

![rho_k_p.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294220/9ca50150-e2ae-d207-f47f-936ff8cefc71.png)

実験結果から$\lg k$と$\lg p$の関係は線形になることが分かる。近似すると、$\lg p = 2\lg k - 0.35$が得られた。$\sqrt{p}$回のループで$p$を発見できるという見積もりは、実証的に間違ってはいないようだ。
【AtCoder 入茶】茶色になるまでにしたこと

2025年2月8日開催のAtCoder Beginner Contest 392 (ABC392) に出場し，入茶することができました！そこで茶色になるまでにしたことをまとめてみたいと思います．
![18d6e5d2cb3ddeeccae16a912543b15e304e18876515f316f56d37db0272b73a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819031/466edf3e-90f6-05e8-5b7e-6407c5b27986.png)
# 筆者について
非情報系の大学4年生です．Pythonをはじめとして，プログラミングの経験は2,3年程度あります．数理と関連分野（グラフ理論，最適化，アルゴリズムなど）の知識は多少ありますが，競プロは初心者です．AtCoderは2年前（2023年1月ごろ）に3回ほど出たことがありましたが，すぐに辞めてしまいました．2025年1月に再開し，再開後6回目のコンテストで茶色になれました．なお，AtCoderではPythonを使っています．

# 茶色になるまでにしたこと
私は書籍[競技プログラミングの鉄則](https://book.mynavi.jp/ec/products/detail/id=131288)（いわゆる鉄則本）を用いて学習しつつ，毎週ABCに出場し，その復習を行うことで茶色になりました．それぞれにかけた時間は以下の通りです．
- ABC出場と復習，その他ABC問題演習など：約40時間
- 鉄則本：約25時間

以下にそれぞれ詳しく記述します．
## ABC出場と復習，その他ABC問題演習など
まず初めに，AtCoderのデータの入出力に慣れるために，[Python入門 AtCoder Programming Guide for beginners (APG4bPython) - AtCoder](https://atcoder.jp/contests/APG4bpython)を解きました．その後，ABCのA，B問題をいくつか解き，入出力に慣れてきたら，コンテストに出場し始めました．毎週のABCでは，出場するだけでなく，終わった後に復習も行いました．復習では，[AtCoder Problems](https://kenkoooo.com/atcoder)の難易度水色以下の問題を解き，解説などを見ながら自分でACできるように努めました．ABCには解説放送というものがあります．解説放送では，問題の解答だけでなく，正解に至るまでの過程が解説されるので，とてもおすすめです．
出場していない分のABCについてはあんまり解いていません．

なお，個人的には，ABCの各問題について，以下のような役割があると感じました．参考にしてみてください．
- A，B問題：データの入出力，条件分岐やforループを正しく使えるか
- C問題：計算量を意識できるか．たまにちょっとしたアルゴリズムも出題される．
- D問題〜：アルゴリズムやデータ構造を使えるか

## 鉄則本
鉄則本では，競プロで必要なアルゴリズムやテクニックを網羅的に学習できます．私は鉄則本の例題のみを解き進め，現在は第8章「データ構造」まで読み終えました．例題を解くときには，できるだけ自分で解いてみるようにしています．解けないときは，解説を見て，理解した上で自分でACします．基本的なアルゴリズムやデータ構造が網羅されているので，初心者にはおすすめです．ただし，分野別の縦割りにしている関係で，難しいトピックもいくつか扱われています（LIS，文字列のハッシュなど）．筆者も，「これは初見じゃ絶対に解けない...」と苦しんだ問題も多々ありました．そのため，1週目には難しい問題（例えば難易度星5の問題）は飛ばしてもいいかもしれません．

# その他おすすめのリンク
自分が参考になったと感じた記事や動画をいくつか紹介します．
- [未経験者のアナタもハマる？競技プログラミング「AtCoder」って何だ？【橋本幸治の理系通信】（2021年3月19日） - YouTube](https://youtu.be/WGNQrH0AV2k?si=74BsVOjEHHrrnjIp)
  - AtCoderってなんだろう，始めてみようかなと思っている方におすすめです．
- [レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【初級編：競プロを始めよう】 #競技プログラミング - Qiita](https://qiita.com/e869120/items/f1c6f98364d1443148b3)
- [【競技プログラミング】プログラミング初心者がAtCoderを始めて10か月で水色になった方法【ゆっくり解説】 - YouTube](https://youtu.be/eOUXJ_KP9xg?si=0N7aNvaRmDnB_GM0)


# 今後の目標
茶色になることができたので，次の目標は緑色になることです．緑色になるために，鉄則本を終わらせた上で，[Educational DP Contest / DP まとめコンテスト](https://atcoder.jp/contests/dp?lang=ja)や，[レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編：目指せ水色コーダー！】](https://qiita.com/e869120/items/eb50fdaece12be418faa#2-3-%E5%88%86%E9%87%8E%E5%88%A5%E5%88%9D%E4%B8%AD%E7%B4%9A%E8%80%85%E3%81%8C%E8%A7%A3%E3%81%8F%E3%81%B9%E3%81%8D%E9%81%8E%E5%8E%BB%E5%95%8F%E7%B2%BE%E9%81%B8-100-%E5%95%8F)に載っている「分野別　初中級者が解くべき過去問精選 100 問」を解いていこうと思います．
自作レーザーハープ(2/n)[arduino検証]

前回に引きつづき制作していく
↓前回

https://qiita.com/sakuchia6276/items/0b087ff06e99a66c5ac8

### マイコンの選定
案としてあるのは、ATmega328p、ATmega32u4、RP2040
この中でarduinoのライブラリが対応しているのは32u4だけなので、arduino microを買おう。
今回はamazonで互換機を購入した。

### arduinoのライブラリについて
arduinoでUSB経由のmidi信号を出すなら、ライブラリが三択あるようだ。
・MIDIUSB
・USBMIDI
・USB‐MIDI

>MIDI信号についても書いておこう
MIDI信号とは、電子楽器やコンピューターなどの機器間で演奏情報を通信する規格だ。
大事なのは音の波形を送っているのではなく音程、音色などの情報をおくっていることだ。
なので、MIDI信号を処理するソフト、プログラムによって全く異なる音が鳴る。
5ピンDINコネクタを使うのが一般的だが、PCに取り込む際はUSBを用いることが多い。

すべてサンプルプログラムを試したが、どれもPC側でMIDIコントローラとして認識されない。
原因として考えられるのは、
1.環境設定のミス
2.arduinoが不良品
3.アプデが追い付いていない
のどれかだろう。
うーむ、わからない
あきらめよう。
諦めが早すぎる、これじゃあカスのブログだ。
仕方がないので方向性を少し変えよう。

### HIDを用いた入力
MIDI信号を使うのはあきらめ、qwertyキーボードで音を鳴らせるソフトを使うことにする。
前にHIDデバイスは作ったのでそれを改造するだけだ。
一旦グーグルで検索をかけたがピアノとPCが両方”キーボード”なせいであまり情報が出てこない...
今回はvitalというソフトを使います。

https://vital.audio/

WE  TYU  OP　{
ASDFGHJKL+ *}
を鍵盤に見立てて使うようです。
1オクターブと3音を入力できます。
音色は変更できるようです。

音階にある音を鳴らすだけならこれでもいいですが、SEとかを鳴らしたくなったら困りますね。
どうにかしたいですね。

次回↓

https://qiita.com/kurumi18891/items/cd9b2837996049cbff52
ChatGPTで作るCコンパイラ

ChatGPTを使って実験的なCコンパイラを作るという面白いプロジェクトを紹介します。このプロジェクトでは、CコードをChatGPTに渡して、直接x86アセンブリコードを生成するという、少し変わった（ちょっと危険な）ことをしています。

https://github.com/Sawyer-Powell/chatgcc

## はじめに：なぜAIコンパイラなのか？

通常、プログラミング言語のコンパイラは、ソースコードを解析し、中間表現を経て、最終的にマシンコードを生成する複雑なプログラムです。今回紹介するプロジェクトは、この過程をAIに任せてしまおうという大胆な試みです。

## 技術的な仕組み

このプロジェクトは、以下の要素で構成されています：

1. シェルスクリプト（chatgcc.sh）
2. OpenAI API
3. GNUアセンブラ（as）とリンカ（ld）

### 主要なコンポーネント

```bash
# プロジェクトの基本構成
chatgcc.sh        # メインスクリプト
test.c           # 入力となるCソースコード
test.asm         # 生成されるアセンブリコード
test             # 最終的な実行ファイル
```

### 動作の流れ

1. Cソースコードの読み込み
2. ChatGPTへのプロンプト生成
3. APIを通じたアセンブリコードの生成
4. 生成されたコードのアセンブルとリンク

以下が主要な処理を行うシェルスクリプトの概要です：

```bash
# ChatGPTへの指示（プロンプト）
prompt="
You are a C compiler targeting x86_64 assembly. Generate assembly code with the following specifications:
- Make sure you include the _start entry symbol
- Use AT&T/GAS syntax (default GNU assembler syntax)
- Include necessary sections (.text, .data, etc.)
- Include proper function prologue/epilogue
- Handle C standard library functions appropriately
- Include comments explaining key operations
- Target Linux x86_64 platform"

# APIを使用してアセンブリコードを生成
assembly=$(curl https://api.openai.com/v1/... | grep -oP '```assembly\K[^`]*(?=```)')

# アセンブルとリンク
as -o "${filename%.c}.o" "${filename%.c}.asm"
ld -o "${filename%.c}" "${filename%.c}.o"
```

## 使い方

1. 事前準備：OpenAI APIキーの設定
```bash
export OPENAI_API_KEY="sk-..."
```

2. コンパイルの実行
```bash
./chatgcc.sh test.c
```

これにより、以下の処理が行われます：
- test.c → ChatGPT → test.asm （アセンブリコード生成）
- test.asm → as → test.o （オブジェクトファイル生成）
- test.o → ld → test （実行ファイル生成）

## 生成されるアセンブリコードの例

簡単な「Hello, World!」プログラムを例に見てみましょう：

```c
// test.c
int main() {
    puts("Hello, World!");
    return 0;
}
```

ChatGPTが生成する可能性のあるアセンブリコード：

```nasm
.section .data
    message: .string "Hello, World!\n"

.section .text
    .global _start

_start:
    # 関数プロローグ
    pushq %rbp
    movq  %rsp, %rbp

    # puts("Hello, World!")相当の処理
    movq  $1, %rax          # write syscall
    movq  $1, %rdi          # stdout
    leaq  message(%rip), %rsi  # メッセージのアドレス
    movq  $14, %rdx         # 長さ（\nを含む）
    syscall

    # プログラムの終了
    movq  $60, %rax        # exit syscall
    xorq  %rdi, %rdi       # status = 0
    syscall
```

## 注意点と制限事項

このプロジェクトには以下のような注意点があります：

1. 生成の不確実性
   - ChatGPTの出力は毎回異なる可能性があります
   - 複雑なコードでは正しく動作しない場合があります

2. セキュリティ上の考慮
   - 生成されたコードは検証が必要です
   - 重要なシステムでの使用は避けるべきです

3. パフォーマンス
   - 生成されるアセンブリコードは最適化されていません
   - APIコールのオーバーヘッドがあります

## まとめ

このプロジェクトは、AIを活用した実験的な開発の一例です。実用的なツールというよりは、学習とアイデア検証のためのプロジェクトだと思いますが、おもしろいですね

## 参考文献
- [GitHubリポジトリ](https://github.com/Sawyer-Powell/chatgcc)
PostgreSQLチートシート

## psqlの開始・終了
#### データベースの一覧表示
```powershell:ターミナル
psql -h ホスト名 -U ユーザー名 -l
```
#### psqlの開始
```powershell:ターミナル
psql -d データベース名
```
#### データベース内の全テーブルの表示
```:psql
\dt
```
#### psqlの終了
```:psql
\q
```
## テーブルの作成・削除
#### テーブルの作成
```
CREATE TABLE テーブル名
(
	列名1 データ型1, 
    列名2 データ型2
);
```
#### デフォルト値(初期値)
```
CREATE TABLE テーブル名
(
	列名1 データ型1 DEFAULT デフォルト値, 
    列名2 データ型2
);
```
#### 検査制約
```
CREATE TABLE テーブル名
(
	列名1 データ型1 CHECK (式), 
    列名2 データ型2
);
```
```コメント:例：価格を必ず正の数にする
    price numeric CHECK (price > 0)
```
#### 非NULL制約
```
CREATE TABLE テーブル名
(
	列名1 データ型1 NOT NULL,
	列名2 データ型2
);
```
#### 一意性制約
```
CREATE TABLE テーブル名
(
	列名1 データ型1 UNIQUE,
	列名2 データ型2
);
```
#### プライマリキー(主キー)
```
CREATE TABLE テーブル名
(
	列名1 データ型1 PRIMARY KEY,
	列名2 データ型2
);
```
```コメント:プライマリキーに複数列を指定する場合
	列名1 データ型1,
	列名2 データ型2,
    PRIMARY KEY (列名1, 列名2)
```
#### 外部キー
```
CREATE TABLE テーブル名
(
	列名1 データ型1,
	列名2 データ型2 REFERENCES 参照先テーブル名 (参照先列名)
);
```
#### レコード削除の制限およびカスケード
- 削除の制限：子テーブルから参照されている自レコードは、削除されない
- カスケード：親テーブルにある参照先レコードが削除されたら、自レコードも削除する
```
CREATE TABLE テーブル名
(
    列名1 データ型1 REFERENCES 子テーブル名 ON DELETE RESTRICT,
    列名2 データ型2 REFERENCES 親テーブル名 ON DELETE CASCADE
    PRIMARY KEY (列名1, 列名2)
);
```
#### テーブルの削除
```
DROP TABLE テーブル名;
```
## テーブルの変更
#### テーブル名の変更
```
ALTER TABLE 変更前のテーブル名 RENAME TO 変更後のテーブル名;
```
#### 列の追加
```
ALTER TABLE テーブル名 ADD COLUMN 列名 データ型;
```
#### デフォルト値の追加
```
ALTER TABLE テーブル名 ALTER COLUMN 列名 SET DEFAULT デフォルト値;
```
#### 検査制約の追加
```
ALTER TABLE テーブル名 ADD CHECK (式);
```
#### 外部キー制約の追加
```
ALTER TABLE テーブル名
ADD FOREIGN KEY (外部キーを付けるテーブルの列名) REFERENCES 参照先テーブル名 (参照先列名);
```
#### 列のデータ型の変更
```
ALTER TABLE テーブル名 ALTER COLUMN 列名 TYPE 変更後のデータ型;
```
#### 列の削除
```
ALTER TABLE テーブル名 DROP COLUMN 列名;
```
#### インデックスの作成
```
CREATE INDEX インデックス名 ON テーブル名 (列名1 ,列名2);
```
#### インデックスの削除
```
DROP INDEX インデックス名;
```
## データの操作
#### データの参照
```
SELECT 列名1, 列名2 FROM テーブル名;
```
#### データの挿入
```
INSERT INTO テーブル名 (列名1 ,列名2) VALUES (値1 ,値2), (値1 ,値2);
```
#### データの更新
```
UPDATE テーブル名 SET 列名1 = 値1, 列名2 = 値2, WHERE 条件;
```
#### データの削除
```
DELETE FROM テーブル名 WHERE 条件;
```
## 参考資料
- [PostgreSQL 16.4文書 PostgreSQLクライアントアプリケーション psql](https://www.postgresql.jp/document/16/html/app-psql.html "psql")
- [PostgreSQL 16.4文書 パート II. SQL言語 第5章 データ定義](https://www.postgresql.jp/document/16/html/ddl.html "第5章 データ定義")
- [PostgreSQL 16.4文書 パート II. SQL言語 第6章 データ操作](https://www.postgresql.jp/document/16/html/dml.html "第6章 データ操作")
TerminalからVScodeを起動

# はじめに
macを使っている時、気軽にterminalからvscodeを開く方法がないか探していました。
以下記事を参考にしたら、簡単にできたので紹介します。

[ターミナルからVisual Studio Codeを起動する方法【公式の方法】](https://qiita.com/naru0504/items/c2ed8869ffbf7682cf5c)

# 手順
* VScodeでコマンドパレットを開く
* shellと入力
* インストール

以上。

terminal上でcodeと入力するとvscodeが立ち上がるはずです。
[R] vignette から inst/extdata/ 配下のデータが読めない？となったときに確認すること

パッケージ開発者が公開データを置く場所は `inst/extdata` だが、vignette 執筆中に `system.file()` しても自パッケージのデータを読めない？となったので見落としていた確認ポイントをメモしておく。

https://r-pkgs.org/data.html#:~:text=If%20you%20want%20to%20store%20data%20in%20some%20raw%2C%20non%2DR%2Dspecific%20form%20and%20make%20it%20available%20to%20the%20user%2C%20put%20it%20in%20inst/extdata/


## 結論

下記 2 点をやり忘れていないか確認するとよい:
- `package = MY_PACKAGE_NAME` を引数に与える
- `devtools::load_all()` する

https://devtools.r-lib.org/reference/load_all.html

## 解説

### `package = MY_PACKAGE_NAME` を引数に与える

`system.file()` の `package =` 引数のデフォルト値は `"base"` なので、自パッケージ名を与えないと base パッケージの `inst/extdata` からファイルを検索してしまうため。

https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/system.file

### `devtools::load_all()` する

:::note warn
前提
「インストール」「インポート」「ロード」の違いを理解しておくこと
- **ロード**: パッケージがエクスポートしているオブジェクト（関数やデータ）をロードパスに載せる操作。パッケージ開発者は `devtools::load_all()` を使うことで、自パッケージをインストールすることなしにロードできる
- **インストール**: 一般ユーザーが `install.packages("PACKAGE_NAME")` するのと同じように、開発中のパッケージをインストールパスに置く操作。`devtools::install()` などで実行できる
- **インポート**: インストール済みのパッケージを利用可能にすること。`library(PACKAGE_NAME)` で実行できる。パッケージがエクスポートしているオブジェクトをロードパスに載せる操作なので、パッケージをユーザーとしてロードするための方法とも言いかえられる
:::

https://devtools.r-lib.org/reference/install.html

R パッケージの vignette では、自パッケージを `library("MY_PACKAGE_NAME")` してインポートできる。
これはユーザーに提供する関数を説明するために便利だが、この `library()` 時に読み込まれるパッケージは、最後に自パッケージをインストールした時の状態なので、下記のような状態では `system.file()` してもファイルは見つからない:

1. `devtools::install()`
1. `inst/extdata/` にファイルを置く
1. `library(MY_PAKAGE)` する
1. `sysrem.file("extdata", "THE_FILE", package = "MY_PACKAGE")` する
1. `library()` でインポート（ロード）されたパッケージは `1.` でインストールしたときの状態なので、`2.` で置いたファイルはまだロードパスに載っておらず見つからない

パッケージ開発時には`devtools::load_all()` をこまめにする習慣をつけるとよい。シンタックスエラーを早期発見できるメリットもある。
というか、`devtools::install()` は CRAN 提出前の最終確認に使う程度で、ふだんは全く使わなくてよさそう。
自作レーザーハープ(1/n)[構想]

平沢進がよく使っているレーザーハープを自作したい
だってかっこいいじゃないですか
↓レーザーハープの使用例
[平沢進-白虎野の娘/Hybrid Phonon](https://youtu.be/xgNqRJTw6WY?si=EeMIQc5-AFYARE8N)

### 構造
aruduinoまたはラズパイpicoを用いて制御する。
組み込みなのでラズパイがいい

レーザーモジュールの光をフォトトランジスタorカドミウムセルで感知し、制御する。
USBmidiを出力し、PCからmidiソフトを用いて音を出す。


### 課題
arduinoでmidiを出力する方法を検討
・ライブラリで存在するが、arduino Leonardo用だったりする。arduino uno r4か、ラズパイpicoに対応しているか調査。
・最悪midi信号をUSBmidiに変換するものを買い、制御。できるかわからんし金かかるので可能性小
レーザーモジュール及びフォトトランジスタを固定する方法
・3Ⅾcadで設計し、3DPで印刷する。
・ホムセンで木材を買い、穴をあけて固定する。
Next.jsでページ遷移を実装する際、LinkコンポーネントとuseRouterフックのどちらを使うべきか

<!-- title: Next.jsでページ遷移を実装する際、LinkコンポーネントとuseRouterフックのどちらを使うべきか -->
<!-- tags: Next, React, Typescript -->

# Next.js のページ遷移：`<Link>` vs `useRouter`

Next.js でのページ遷移には、`<Link>`コンポーネントと`useRouter`フックの 2 つの方法がある。それぞれの特徴や使い方を理解し、適切に使い分けることで、効率的なナビゲーションを実現できる。

## `<Link>`コンポーネントとは？

`<Link>`は、Next.js が提供する組み込みのコンポーネントで、HTML の`<a>`タグを拡張し、クライアントサイドのナビゲーションやプリフェッチ（事前読み込み）などの機能を提供する。主に静的なリンクを作成する際に使用される。

### 使用例

```jsx
import Link from "next/link";

export default function Home() {
  return (
    <div>
      <Link href="/about">About Us</Link>
    </div>
  );
}
```

このコードでは、`/about`ページへのリンクが作成され、クリックするとクライアントサイドでのページ遷移が行われる。また、`<Link>`はデフォルトでリンク先のページを事前に読み込む（プリフェッチ）ため、ユーザー体験の向上が期待できる。

## `useRouter`フックとは？

`useRouter`は、Next.js のルーター機能にアクセスするための React フックで、プログラム的にルートを変更したり、現在のルート情報を取得したりするのに使用される。主に動的なナビゲーションやユーザーのアクションに応じたページ遷移を実現する際に便利。

### 使用例

```jsx
"use client";

import { useRouter } from "next/navigation";

export default function Home() {
  const router = useRouter();

  const goToAbout = () => {
    router.push("/about");
  };

  return (
    <div>
      <button onClick={goToAbout}>Go to About Us</button>
    </div>
  );
}
```

このコードでは、ボタンをクリックすると`/about`ページに遷移する。`useRouter`を使うことで、ユーザーのアクションに応じて動的にルートを変更できる。

## どちらを使うべきか？

### `<Link>`を使うべき場合

- **静的なリンク**：ナビゲーションメニューや記事一覧など、固定のリンクを表示する場合。
- **SEO 対策**：`<Link>`は内部的に`<a>`タグを生成するため、検索エンジンがリンクを正しく認識する。

### `useRouter`を使うべき場合

- **動的なナビゲーション**：フォーム送信後や特定の条件に応じてページ遷移させたい場合。
- **プログラム的な制御**：ユーザーのアクションやイベントに応じてルートを変更したい場合。

基本的には、**静的なリンクには`<Link>`、動的なナビゲーションには`useRouter`**を使うのが良い。状況に応じて使い分けることで、コードの可読性やメンテナンス性が向上する。

## まとめ

Next.js でのページ遷移には、`<Link>`コンポーネントと`useRouter`フックの 2 つの方法がある。それぞれの特徴を理解し、適切に使い分けることで、より効率的でユーザーフレンドリーなアプリケーションを構築できる。
ABC392をPythonで（A～D）

日本レジストリサービス（JPRS）プログラミングコンテスト2025#1（AtCoder Beginner Contest 392）の解答等の速報的まとめ

https://atcoder.jp/contests/abc392



# A問題
https://atcoder.jp/contests/abc392/tasks/abc392_a

小さい2つの積が一番大きいのと一致するかを判定すればいい
```python:A
a = sorted(map(int, input().split()))
print("Yes" if a[0] * a[1] == a[2] else "No")
```
# B問題
https://atcoder.jp/contests/abc392/tasks/abc392_b

内包表記で入っていないものをリストアップした
```python:B
n, m = map(int, input().split())
a = set(map(int, input().split()))

c = [i for i in range(1, n + 1) if i not in a]

print(len(c))
print(*c)
```
# C問題
https://atcoder.jp/contests/abc392/tasks/abc392_c

ゼッケン番号から何番目の人か逆検索できる辞書を作ればいい
```python:C
n = int(input())
p = list(map(int, input().split()))
q = list(map(int, input().split()))

d_q = {q_i:i for i, q_i in enumerate(q)}

ans = []
for i in range(1, n + 1):
    ind = d_q[i] # ゼッケンiを付けいている人
    p_i = p[ind] - 1 # indが見ている人
    ans.append(q[p_i])

print(*ans)
```
# D問題
https://atcoder.jp/contests/abc392/tasks/abc392_d

すべての組み合わせで期待値計算を行う
期待値はダイスA、ダイスBが各目iに対して
(ダイスAが目iを出す確率)$\times$(ダイスBが目iを出す確率)
で求まる
```python:D
def calc(dice_i, dice_j):
    k_i, d_i = dice_i
    k_j, d_j = dice_j

    res = 0
    for key, val in d_i.items():
        if key in d_j:
            res += val / k_i * d_j[key] / k_j

    return res


n = int(input())
dice = []
for _ in range(n):
    k, *arg = map(int, input().split())
    dic = dict()
    for a_i in arg:
        if a_i not in dic:
            dic[a_i] = 0
        dic[a_i] += 1
    dice.append([k, dic])

print(max(calc(dice[i], dice[j]) for i in range(n) for j in range(i)))
```

# E問題
https://atcoder.jp/contests/abc392/tasks/abc392_e

切っても問題ない辺を調べて、それぞれをUnionFindで違うグループの頂点につなげればいい

と考えて実装していたが１時間以上費やしてもうまくいかなかった
【Rails6→Rails8】errors.full_messagesが取得できないエラーのデバッグ

## はじめに
Rails6を使っている教材を、Rails8で取り組んでいます。
バリデーションエラーが表示されずハマったので、原因と解決策を残しておきます。

## やりたいこと

- Validationエラーの内容を表示したい

### やったこと

- Modelにvalidatesの記述
  ```ruby
    validates :title, presence: true
    validates :content, presence: true
  ```
- viewに@article.errors.full_messagesをeachメソッドで出力できるように記載
  ```ruby
  <ul>
   <% @article.errors.full_messages.each do |message| %>
     <li><%= message %></li>
   <% end %>
  </ul>
  ```

## エラー内容

- 空のまま送信してもエラーメッセージが表示されない
- ループ処理内に記載したliタグ自体が生成されていない

## 調査

- コンソール上で確認したところ正常にValidationが効いている
    
    ```bash
    myapp(dev)> article = Article.new
    => #<Article:0x00007f1d3978bf88 id: nil, title: nil, content: nil, created_at: nil, updated_at: nil>
    myapp(dev)> article.valid?
    => false
    myapp(dev)> puts article.errors.full_messages
    Title can't be blank
    Content can't be blank
    => nil
    ```
    
- オブジェクトにエラーが入っているかを確認：正常に動作していそう
    
    ```ruby
      def create
        @article = Article.new(article_params)
        if @article.save
          redirect_to article_path(@article)
        else
          Rails.logger.debug "エラー内容: #{@article.errors.full_messages.inspect}"
          render :new
        end
      end
    ```
    
    - ログ
    
    ```bash
    エラー内容: ["Title can't be blank", "Content can't be blank"]
    ```

## 原因

### **Rails 7 では `Turbo` がデフォルトで有効になった**

- `form_with` を使うと、デフォルトで `remote: true`（非同期リクエスト）として扱われる
- その結果、フォーム送信後のレスポンスが `Turbo Stream` として処理される

### **非同期処理の場合、`render :new` の結果が `Turbo` によって正しく適用されない**

- Rails 6 では `render :new` すると、HTMLがそのまま更新される
- Rails 7 のデフォルト（`Turbo` 有効）では、サーバーが `200 OK` を返すと、画面は更新されるが `@article.errors` が適切に反映されないことがある

### **422 ステータス（`unprocessable_entity`）を返さないと、バリデーションエラー時のフォーム描画が正しく動かない**

- `render :new` のデフォルトのステータスは `200 OK` であるため、エラー時にも通常のページ遷移と同じ挙動をしてしまう
- `Turbo` は `200 OK` を受け取ると、**「成功した」と判断してしまう**
- `unprocessable_entity`（422）を返せば、「フォームの再描画が必要なエラー状態」と正しく認識される

## 解決策

- Turboをfalseにする
    
    ```ruby
    = f.button :submit, data: { turbo: false }
    ```
    
- 422ステータスを返すようにする
    ```ruby
    render :new, status: :unprocessable_entity
    ```

### どちらを選ぶか
個人的にはせっかくなのでTurboを使える422のほうが良いかと思い、こちらを選びました。
そもそもTurboはUX向上の為にデフォルトになったはずなので、あえて意図的に停止させなくてもよいかなと…
あと、フォームごとにTurboだったりTurboじゃなかったりすると、分かりづらいコードになってしまうと考えました。

## 終わりに
Railsのアップデートについてもっと学習が必要だと感じました。
参考にあげたZenn本にも時間があるときに取り組んでみようと思います。

## 参考

- https://github.com/heartcombo/simple_form/issues/1789
- これも読んでおきたい
    - https://zenn.dev/shita1112/books/cat-hotwire-turbo
X（旧ついったー)用の個人アカウントから個人単位でフードロス解消を支援するPGM

<h3>X（旧ついったー)用の個人アカウントから個人単位でフードロス解消を支援するPGM</h3>

X（旧ついったー)用の個人アカウントから個人単位でフードロス解消を支援する文を出力するPGMを作りました

2025.02.09:バグ修正しました

<hr>

githubURL:https://github.com/NanjoMiyako2/FoodLosKaisho
サンプルページURL:https://nanjomiyako2.github.io/FoodLosKaisho/

<hr>

出力例

![スクリーンショット 2025-02-08 222747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/a1d6cce9-649a-047a-bde4-2114135c1951.png)


![スクリーンショット 2025-02-08 222756.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/c5330a89-1b80-dc5e-1d92-734ceb8dfe44.png)
StyleGAN

2025.01試行
ubuntu2204 RTX4090

## styleGANを試してみよう

stylegan1,stylegan2のオリジナルの実装はtensorflow1系でdockerを使ってもうまく動かないなど難しい。

stylegan2-adaという、学習が安定するバージョンもtensorflow1系だが、pytorchの実装も存在する。

## stylegan2-ada-pytorchなら動きそうだ
今回は、stylegan2-ada-pytorch　を試した。

https://github.com/NVlabs/stylegan2-ada-pytorch

docker環境とネイティブ環境での参考コードがありますが、環境構築の手間が無いdocker環境を使用します。

```
git clone https://github.com/NVlabs/stylegan2-ada-pytorch.git

cd stylegan2-ada-pytorch
```
## サンプルコード動くか？
とりあえず、画像生成してみよう
```
docker build --tag sg2ada:latest .
./docker_run.sh python3 generate.py --outdir=out --trunc=1 --seeds=85,265,297,849 \
    --network=https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/metfaces.pkl
```
docker build --tag sg2ada:latest .でフォルダ内のDockerfileからイメージを作成します。
次のコマンドで、コンテナ内のpythonプログラムを実行して、4種類のシードから、画像を生成して、outフォルダに格納します。学習済みのpklを（初回）ダウンロードします。シードを変えてみて異なる画像が生成されることを確認してみる。


さて、dockerがどこのフォルダで実行されているのか確認してみると、
```
./docker_run.sh pwd
$ /scratch
./docker_run.sh ls
$ Dockerfile	 dataset_tool.py  generate.py  out .....など
```
内部では、/scratchフォルダがホームであることが分かります。（docker_run.shにあるとおりですが、）
## 潜在空間で元画像(生成画像)を探してみよう
ランダムシードで作成した画像だけど、こんな画像はどんな潜在空間にあるのだろう？

ここのサンプルコードで面白いのは、**潜在空間への画像の投影**(google翻訳）のところで、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/95c6a25b-c348-eea7-b1df-177adcabd013.png)

コンテナ内で先ほど作成された画像out/seed0085.pngの潜在ベクトルを見つける過程は、
```
 ./docker_run.sh python3 projector.py --outdir=out2 --target=/scratch/out/seed0085.png --network=https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/metfaces.pkl
```
潜在空間を探索しながら元画像に近づいていく様子が分かります。(1000試行してロスが減少していく様子と外時の画像がmp4ファイルで保存される)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/3940d443-a3d3-f927-8c82-a7af528cc281.png)

学習データと別のモデル(pkl)を使ってみるのも面白い。
```
 ./docker_run.sh python3 projector.py --outdir=out2 --target=/scratch/out/seed0085.png --network=https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/ffhq.pkl
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/b498438e-0d55-9b7f-3adb-2a09d7c930be.png)

まあ、ここまでは上手く行った。今日はここまで。

## styleGANのお勉強

だいぶ詳しく解説してある。
https://lambdanalytique.com/2022/07/01/stylegan-vs-stylegan2-vs-stylegan2-ada-vs-stylegan3

ミックスの例
https://www.justinpinkney.com/blog/2020/stylegan-network-blending/
【電脳少女 プログラミング2088 Cランク】 廃マンションの一室 C言語による

## 概要
↓こちらに参加し、といた中で現時点でん？となったものです
https://paiza.jp/entry/denno2088_qiita

> 2025/02/09更新 
ご指摘いただき、main関数内のconvert(N, &result)をconvert(N, result)に変更

## コーディング経験
大学に入ってからC言語を学習中

## アプローチ
シンプルに、10進数から3進数に変換する際と10進数から特殊な3進数への変換の際に発生するギャップを埋める方法をとりました。結構汚いコードを書いているとは思いますが暖かく、余力があればご指摘いただけると幸いです。

## コード
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 40

void convert(int n, char *result);
int main(void)
{
    int N;
    char result[MAX_LEN];
    scanf("%d ", &N);
    convert(N, result);
    printf("%s", result);
    return 0;
}
void convert(int n, char *result){
    if(n == 0){
        strcpy(result, "0");
        return;
    }
    
    char temp[MAX_LEN];
    int index, remainder, i;
    index = 0;
    
    //特殊な3進法への変換
    while(n != 0){
        remainder = n % 3;
        n /= 3;
        //もしあまりが2であったら、それを-1として扱い、n++する(繰り上げする)
        //この特殊な3進法においては、通常10進法から3進法を導く時の方法はそのまま使えない。
        //なぜなら、10進法の2を特殊な3進法へ変えた時、結果は2となるが、2は特殊3進法で-1を表すためである。
        //もし使うのだとしたら、この帳尻を3あげることで、つまり元の10進法で繰り上げることで表現すれば良い。
        if(remainder == 2){
            remainder = -1;
            n++;
        //あまりが-2に突入したら、あまりを1にする
        }else if(remainder == -2){
            remainder = 1;
            n--;
        }
        temp[index++] = (remainder == -1) ? '2' : ('0' + remainder);
    }
    
    for(i = 0; i < index; i++){
        result[i] = temp[index - 1 - i];
    }
    //ヌル文字で終端を表す
    result[index] = '\0';
}
```

## レイミレビュー(ナルシストVer)
![Screenshot 2025-02-08 at 22.22.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768702/aaae2689-0e0b-a4ae-b3be-ec4de2e420ba.png)

## 感想
意外と記事書くのって難しいんですね。それはともかく、レビューをAIに受けることができるのとゲーム性を同時に楽しみながらコーディングできるの、すっごいワクワクして面白いと感じました。
E-commerceの成功を支えるmanaged ecommerce services

現代のビジネス環境では、E-commerceの重要性が日に日に増しています。多くの企業がオンラインストアを運営する中で、複雑な管理業務に頭を悩ませることが少なくありません。そんな時に頼りになるのがmanaged ecommerce servicesです。
managed ecommerce servicesとは、E-commerceの運営を専門のチームに任せることで、企業は自らのビジネスのコア部分に集中できるサービスです。例えば、在庫管理、顧客サービス、サイトのセキュリティなど、オンラインビジネスを維持するための幅広いニーズを、専門のチームが一括して引き受けます。
Amastyが提供するmanaged ecommerce servicesは、企業の成長を加速させるための包括的なサポートを提供します。サイトのパフォーマンスを監視し、デザインを改善し、新しい機能を実装するなど、幅広いサービスを提供しています。また、24時間の顧客サポートや詳細なアナリティクスレポートなども含まれており、企業はデータに基づいた戦略的な決定を下すことができます。
[managed ecommerce services](https://amasty.com/managed-ecommerce-service.html)を選ぶことで、企業は専門のノウハウにアクセスし、サイトの最適なパフォーマンスを保証し、運営コストを削減することができます。また、強力なセキュリティと継続的なモニタリングにより、ビジネスを保護することができます。
E-commerceの成功を実現するためには、専門のサポートが不可欠です。Amastyのmanaged ecommerce servicesは、そのようなニーズに応えるための最適な選択肢です。
image_pickerで勝手にpngがjpegに変換される件について

# 問題のコード
```
final picker = ImagePicker();
    final pickedFile = await picker.pickImage(source: ImageSource.gallery);
    if (pickedFile == null) {
      return;
    }
```
このコードでpathの拡張子を確認するとpngじゃなくてjpgになる。
サイズが大きい画像の場合はpngで保存された画像をpngのまま読み取ってくれるのに、サイズが小さい画像の場合はpngなのにjpgに変換されるというワケワカメ。
調べてみると、iOSの仕様的に変換されることがあるとかどっかに書いてあるので、pickImageは使わないという感じの英語記事がどっかにあった気がするが、URLがどっかいってしまった。とりあえず、下ｄ解決はできた。

# 解決策
file_pickerを使えばいい
```
final FilePickerResult? pickedFile = await FilePicker.platform
        .pickFiles(type: FileType.image, withData: true);
Uint8List? pngBytes = pickedFile.files.single.bytes;
```
【Python】出力文字に色を付ける

### 何？
print()などで出力する文字に色を付ける。


``` Python
class AnsiStyle:
    """ANSIカラーコードを提供するクラス"""

    BLACK = "\033[30m"
    RED = "\033[31m"
    GREEN = "\033[32m"
    YELLOW = "\033[33m"
    BLUE = "\033[34m"
    MAGENTA = "\033[35m"
    CYAN = "\033[36m"
    WHITE = "\033[37m"
    RESET = "\033[0m"

    BOLD = "\033[1m"
    UNDERLINE = "\033[4m"
    REVERSED = "\033[7m"

    @classmethod
    def get(cls, name: str, *, strict: bool = False) -> str:
        """色名を指定してカラーコードを取得する。

        strict=True の場合、存在しない色なら例外を発生させる

        Args:
            name (str): 色名
            strict (bool): 未知の色名の場合に例外を発生させるか

        Returns:
            str: カラーコード

        Raises:
            ValueError: strict=True で未知の色名が指定された場合

        """
        color = getattr(cls, name.upper(), None)
        if color is None:
            if strict:
                message = f"'{name}' は有効な色名ではありません。 有効な色名: {cls.available_colors()}"
                raise ValueError(message)
            return cls.RESET
        return color

    @classmethod
    def available_colors(cls) -> list:
        """利用可能な色名の一覧を取得する

        Returns:
            list: 利用可能な色名のリスト

        """
        return [attr for attr in dir(cls) if attr.isupper() and not attr.startswith("_")]

    @classmethod
    def format(cls, text: str, color: str, *,
               bold: bool = False,
               underline: bool = False,
               reversed_: bool = False,
               ) -> str:
        """テキストに色やスタイルを適用して返す

        Args:
            text (str): 対象のテキスト
            color (str): 色名
            bold (bool): 太字にするか
            underline (bool): 下線を引くか
            reversed_ (bool): 文字色と背景色を反転させるか

        Returns:
            str: スタイルが適用されたテキスト

        """
        style = cls.get(color, strict=True)
        if bold:
            style += cls.BOLD
        if underline:
            style += cls.UNDERLINE
        if reversed_:
            style += cls.REVERSED
        return f"{style}{text}{cls.RESET}"

```

### 使い方
``` Python
cololize_text = AnsiStyle.format("Hello, World!", "red")
print(cololize_text)
```
TypeScriptの型ガード関数がなぜ必要か

### **TypeScriptの型ガード関数とは？**
型ガード関数は、TypeScriptで **変数の型を特定の型に絞り込む（Narrowing）** ための関数。

### **結論**
✅ 型ガード関数 (`value is 型`) を使うと、TypeScriptが `if` 文の中で型を確定できる  
❌ `boolean` を返す関数では型を絞り込めない。これはTypeScript の型システムの設計上の仕様。


#### **❌ 型エラーの例**
```ts
type CommonProps = FooProps | BarProps;

type FooProps = { id: string; type: 'foo' };
type BarProps = { id: string; type: 'bar' };

let foo: string = 'foo';

const args: CommonProps = {
  id: 'id',
  blockType: foo  // ❌ エラー：string型を代入できない
};
```
TypeScriptは `foo` の型を `string` と認識するため、型エラーになる。

---

### **✅ 型ガード関数で解決**
```ts
function isValidBlockType(value: string): value is 'foo' | 'bar' {
  return value === 'foo' || value === 'bar';
}

if (isValidBlockType(foo)) {
  const args: CommonProps = {
    id: 'id',
    blockType: foo  // ✅ エラーなし！
  };
}
```
**`value is 型` を使うと、TypeScriptは `true` の場合に型を確定できる**

---

### **❌ `boolean` を返す関数ではダメな理由**
```ts
function checkBlockType(value: string): boolean {
  return value === 'foo' || value === 'bar';
}

if (checkBlockType(foo)) {
  const args: CommonProps = {
    id: 'id',
    blockType: foo  // ❌ エラー発生
  };
}
```
TypeScriptは **関数の内部ロジックを解析しない** ため、型を絞り込めない。
TypeScript の型解析（型推論エンジン）が関数の内部ロジックを解析しないためであり、これは TypeScript の型システムの設計上の仕様。型チェック（type checker）の制約。
今後、その仕様が変われば関数の内部ロジックを解析して型を判別するようになり、型ガード関数は不要になるかも。
Magento 1 Facebook Pixel: ウェブサイトの効果的な分析と広告最適化

Magento 2 用の Facebook Pixel 拡張機能は、Magento で Facebook アカウントを接続する時間を節約し、Facebook Business アカウントでのデータ収集と分析を容易にします。このツールは、顧客との関係を築き、新しい忠実な顧客を見つけ、売上を増やすのに役立ちます。広告キャンペーンの効果を測定し、顧客の行動を理解し、リマーケティングのためのオーディエンスを作成することができます。
Facebook Pixel は、ウェブサイトに追加された JavaScript コードで、サイト訪問者の活動を追跡し、その行動を分析し、広告キャンペーンを調整することができます。Magento 2 用の Facebook Pixel 拡張機能は、複数の Facebook Pixel ID を追加し、異なるストアビューに異なる Pixel ID を割り当てることができます。これにより、ターゲットオーディエンスの重複を避けることができ、分析用のデータがより明確になります。
Magento 2 用の Facebook Pixel 拡張機能は、Magento のバックエンドに Facebook アナリティクスのデータを保存し、ログを確認して設定が正しいか、修正が必要かどうかを確認することができます。また、サーバーの応答時間を最適な速度に維持するための遅延アップロード機能や、重複データを自動的に削除して有効なデータのみを保存する機能もあります。
Magento 2 用の Facebook Pixel 拡張機能は、広告キャンペーンの効果を高めるための強力なツールです。Magento で Facebook Pixel を設定する方法は簡単で、CLI コマンドを実行し、Facebook Pixel コードを設定し、正常に統合されていることを確認するだけです。Magento で Facebook Pixel を使用することで、広告の効果を最適化し、顧客の行動をより深く理解し、ビジネスを成長させることができます。
[Magento 1 Facebook Pixel](https://amasty.com/facebook-pixel-for-magento-2.html) も同様の機能を提供し、Magento 1 のユーザーも Facebook Pixel の恩恵を受けることができます。Magento 1 用の Facebook Pixel を使用することで、Magento 1 のユーザーも Facebook Pixel の恩恵を受けることができます。
ragas の処理が時間が長かった時の対処記録

# 背景

ragas を使って評価しようとしてたが、めっちゃ時間がかかることがあった際の調査と対処記録

# 前提

- RAG 用評価軸のみ
- ragas 2.9 

ただ、2.12 でやっても動作だけは確認。（ログは未調査

https://qiita.com/baku2san/items/befd694ee5af53bc6c3f

# 結論

- Retreival data の個数を減らす
- 以下2つを一時的に止める
    - Noise Sensitivity
    - Context Precision

## 詳細

ログから、LLM の call 回数を調査した記録

|指標|LLM call 数とその理由|
|-|-|
|Context Entity Recall|reference, context で常に２回|
|Context Precision|Retreived data の個数の回数分|
|Context Recall|常に1回|
|Faithfulness|常に2回|
|Noise Sensitivity|reference, user input, retreived data の組み合わせの数？ Retreived data の倍以上になる。|
|Response Relevancy|LLM で 3回、embedings で 2回の計5回|

# あとがき

ちゃんと数式を考えればわかる話なんでしょうけどね・・ :sweat_smile:
rex0220 計算式プラグイン リッチエディターへ文字列設定

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、リッチエディターへ文字列を設定してみます。

# 概要

リッチエディター項目は、html のタグで構成された文字列を設定することが出来ます。
計算式のタグ関数を使うと動的に文字列を生成できます。
※ Ver.86 以降で動作

- 文字列複数行の HTML 文字列をそのままセット
    - [リッチエディターから文字列複数行へ](https://qiita.com/rex0220/items/0ee6b249e5d3cb474a12)で取得した HTML 文字列
- 計算式のタグ関数で作成した HTML文字列
    - [リッチエディターから文字列複数行へ](https://qiita.com/rex0220/items/0ee6b249e5d3cb474a12)で取得した 計算式
- 計算式のタグ関数をループ処理した HTML文字列

![2025-02-08_22h20_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a4f71a57-9d1c-4f70-4ab2-ddd041b8bc6e.png)


# 操作例

html を変更して、リッチエディターを書き換えます。
リスト行数を変更して、リッチエディターの行数を変更できます。

![2025-02-08_21h59_36.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/457dab9a-7f3c-71a0-9a7a-e6b7552d966b.gif)


# 計算式プラグイン設定

- リッチエディター：　html の文字列をそのままセット
- リッチエディター関数セット：　タグ関数で HTML 文字列を生成
- リッチエディターループセット：　リスト行数で指定された行数を生成
    - 行番号で文字色を指定

![2025-02-08_21h53_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9812f309-c7f5-af82-8c08-09ef786681c0.png)

```.js
計算式プラグイン
APP: リッチエディターへ文字列設定 (3347)
NOTE: 
OPTION: 

// リッチエディター RICH_TEXT
html

// リッチエディター関数セット RICH_TEXT
TAGS_HTML(
  TAG("div", "ABC"),
  TAG("div", TAG("font", ATTR("color", "#ff0000"), "TEST "), TAG("font", ATTR("color", "#0000ff"), TAG("b", "テスト　", TAG("a", ATTR("href", URL("https", "rex0220.stores.jp/"), "target", "_blank", "rel", "nofollow noopener noreferrer"), "リンク")))),
  TAG("div", TAG("ul", TAG("li", "A"), TAG("li", "B"), TAG("li", "C")))
)

// リッチエディターループセット RICH_TEXT
TAGS_HTML(
  TAG("div",
    TAG("span", "ループリスト", STYLE("color", "red")),
    TAG("ul",
      ARRAY_FOR(リスト行数, x, 
        TAG("li", "A-"&(x+1),
          STYLE("color", IF(x%2, "red","blue"))
        )
      )
    )
  )
)
```

# タグ関数の HTML 文字列を確認

計算式ツールで、タグ関数の HTML 文字列を確認できます。

![2025-02-08_22h07_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/fb25c2df-b765-15aa-2e45-fae1caa006cf.png)

※VSCODEで、フォーマット済み
```html
<div><span style="color:red;">ループリスト</span>
    <ul>
        <li style="color:blue;">A-1</li>
        <li style="color:red;">A-2</li>
        <li style="color:blue;">A-3</li>
    </ul>
</div>
```
Google CloudのGPUメモ (2025/2/8)

**概要**

Google Cloudでは、VMインスタンスにGPUをアタッチすることで、機械学習やデータ処理などの特定のワークロードを高速化できます。大きく分けて、GPUが自動的にアタッチされた「アクセラレータ最適化VM」と、汎用VM（N1シリーズなど）にGPUを手動でアタッチする方法があります。

**GPUの種類と性能**

Google Cloudで利用できる主要なGPUと、その性能、主な用途は以下の通りです。

*   **NVIDIA H200 (A3 Ultra VM)**

    *   **メモリ**: 141 GB HBM3e
    *   **相互接続**: NVLink Full Mesh
    *   **主な用途**: 大規模な機械学習モデルのトレーニング、推論、HPC
*   **NVIDIA H100 (A3 Mega, High, Edge VM)**

    *   **メモリ**: 80 GB HBM3
    *   **相互接続**: NVLink Full Mesh
    *   **主な用途**: 大規模な機械学習モデルのトレーニング、推論、HPC
*   **NVIDIA A100 (A2 Ultra, Standard VM)**

    *   **メモリ**: 80 GB または 40 GB HBM2
    *   **相互接続**: NVLink Full Mesh
    *   **主な用途**: 機械学習のトレーニング、推論、HPC
*   **NVIDIA L4 (G2 VM)**

    *   **メモリ**: 24 GB GDDR6
    *   **相互接続**: なし
    *   **主な用途**: 機械学習の推論、トレーニング、リモート可視化ワークステーション、ビデオトランスコーディング
*   **NVIDIA T4 (N1 VM)**

    *   **メモリ**: 16 GB GDDR6
    *   **相互接続**: なし
    *   **主な用途**: 機械学習の推論、トレーニング、リモート可視化ワークステーション、ビデオトランスコーディング
*   **NVIDIA V100 (N1 VM)**

    *   **メモリ**: 16 GB HBM2
    *   **相互接続**: NVLink Ring
    *   **主な用途**: 機械学習のトレーニング、推論、HPC
*   **NVIDIA P100 (N1 VM)**

    *   **メモリ**: 16 GB HBM2
    *   **相互接続**: なし
    *   **主な用途**: 機械学習のトレーニング、推論、HPC、リモート可視化ワークステーション
*   **NVIDIA P4 (N1 VM)**

    *   **メモリ**: 8 GB GDDR5
    *   **相互接続**: なし
    *   **主な用途**: リモート可視化ワークステーション、機械学習の推論、ビデオトランスコーディング

**GPUの価格**

GPUの価格は、リージョン、GPUの種類、利用方法（オンデマンド、コミットメント割引、スポットVM）によって異なります。

*   **オンデマンド価格**: 時間単位で課金されます。
*   **コミットメント割引**: 1年または3年の期間でリソースの使用を確約することで、割引が適用されます。
*   **スポットVM**: 余剰リソースを利用するため、大幅な割引が適用されますが、VMが中断される可能性があります。

**料金例（米国アイオワリージョン、2024年5月時点）**

| GPU        | 時間あたりの価格（USD） | 1年コミットメント割引後の価格（USD） | 3年コミットメント割引後の価格（USD） |
| ----------- | ---------------------- | --------------------------------- | --------------------------------- |
| NVIDIA T4   | $0.35                  | $0.22                             | $0.16                             |
| NVIDIA P4   | $0.60                  | $0.378                            | $0.27                             |
| NVIDIA V100 | $2.48                  | $1.562                            | $1.116                            |
| NVIDIA P100 | $1.46                  | $0.919                            | $0.657                            |

**NVIDIA RTX Virtual Workstations**

3D可視化などのグラフィック集約型ワークロード向けには、NVIDIA RTX Virtual Workstations (vWS)が利用できます。これらのワークステーションでは、NVIDIA RTX vWSライセンスが自動的にVMに追加されます。

**価格に関する注意点**

*   上記はあくまで例であり、実際の価格は変動する可能性があります。
*   価格には、VMインスタンスの料金は含まれていません。
*   ディスク、ネットワーク、イメージなどの料金は別途発生します。
*   最新の正確な価格については、Google Cloudの料金計算ツールまたは料金表をご確認ください。

**まとめ**

Google CloudのGPUは、多様なワークロードに対応できる幅広い選択肢があります。最適なGPUを選択するには、ワークロードの要件（計算性能、メモリ容量、相互接続など）と予算を考慮する必要があります。
Visual Studio 便利な設定

# はじめに
Visual Studio 2022 はデフォルトの設定のままだとあまり使い勝手が良くないと感じるので、いつも設定しているものの覚書です。

# 設定集
特に断りがない限りメニューバーが起点です。
## タイトルバーを表示させる
タイトルバーがないとウィンドウを移動させる時にドラッグする部分が狭いので。
- ツール → オプション
  - オプション
    - 環境
      - 全般
        - 視覚的効果
          - **コンパクト メニューと検索バーを使用** のチェックを外す
## 行番号を表示させる
誰かと一緒にコードを見る時に場所を共有しにくいので。
- ツール → オプション
  - オプション
    - テキスト エディター
      - すべての言語
        - 全般
          - 設定
            - **行番号** にチェックを入れる
## 現在編集しているファイルをソリューション エクスプローラに表示させる
プロジェクトによってはプロジェクト上のフォルダ階層と物理ファイルの階層が異なり、
今見ているファイルが行方不明になる事がある。
ソリューション エクスプローラの "アクティブ ドキュメントとの同期" で手動で実行する事もできるが、
手間が煩わしい場合はこの設定で自動化しておくと楽。
- ツール → オプション
  - オプション
    - プロジェクトおよびソリューション
      - 全般
        - **アクティブな項目をソリューション エクスプローラーで選択された状態にする** にチェックを入れる

## 空白/タブを表示させる
半角スペースとタブの混在、たまに見つかるけど見て気付けば予防になる。
- 編集 → 詳細
  - **スペースの表示** をクリックして有効にする
## CodeLensを無効にする
個人的な好みだけど、行が部分的にずれると見づらいので。
- ツール → オプション
  - オプション
    - テキスト エディター
      - すべての言語
        - CodeLens
          - **CodeLens を有効にする** にチェックを外す
## ラスタフォント(MS ゴシック)を使用する
これも完全に個人的な好みだけど、くっきりして見やすいので。
- ツール → オプション
  - オプション
    - 環境
      - フォントおよび色
        - 設定の表示
          - **テキスト エディター** を選択
            - フォント (太字は固定幅フォントを示します)
              - **MS ゴシック** を選択
          - **環境** を選択
            - フォント (太字は固定幅フォントを示します)
              - **MS UI Gothic** を選択  
              (※いつぞやのバージョンのVisual Studioはこれだったはず)
# おまけ
## Visual Studio Code で Visual Studio と同じショートカットキーを使う
[Visual Studio Keymap - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vs-keybindings)

https://marketplace.visualstudio.com/items?itemName=ms-vscode.vs-keybindings

戻る/進むは Visual Studio (`Ctrl`+`-` / `Ctrl`+`Shift`+`-`) よりも Code (`Alt`+`←` / `Alt`+`→`) の方が好きだな...
MOSFETのパラメータ


```
import numpy as np

# MOSFET パラメータ
Vth = 1.0  # しきい値電圧 (V)
k_n = 0.5e-3  # トランスコンダクタンスパラメータ (A/V^2)
lambda_ch = 0.02  # チャネル長変調係数
V_GS = 2.0  # ゲート-ソース電圧 (V)
V_DS = 1.0  # ドレイン-ソース電圧 (V)

# ドレイン電流の計算関数 (チャネル長変調あり)
def calc_I_DS(V_GS, V_DS):
    if V_GS < Vth:
        I_DS = 0  # カットオフ領域: ドレイン電流なし
        region = "カットオフ領域"
    elif V_DS < (V_GS - Vth):
        I_DS = k_n * (2 * (V_GS - Vth) * V_DS - V_DS**2)  # トライオード領域
        region = "トライオード領域"
    else:
        I_DS = k_n * (V_GS - Vth) ** 2 * (1 + lambda_ch * V_DS)  # 飽和領域 (チャネル長変調あり)
        region = "飽和領域 (チャネル長変調あり)"
    return I_DS, region

# 計算結果
I_DS, region = calc_I_DS(V_GS, V_DS)

# 出力
print("\n### 計算結果 ###")
print(f"動作領域: {region}")
print(f"V_GS = {V_GS:.2f} V")
print(f"V_DS = {V_DS:.2f} V")
print(f"I_DS = {I_DS:.6f} A")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/f46a082a-3721-d661-7caf-83430649eba0.png)



```
import numpy as np

# パラメータ設定
beta = 11e-3  # トランスコンダクタンスパラメータ (A/V²)
V_GS = 0.7  # ゲート-ソース電圧 (V)
Vth = 0.22  # しきい値電圧 (V)
lambda_ch = 0.06  # チャネル長変調係数 (1/V)
V_DS = 1.0  # ドレイン-ソース電圧 (V)
R_D = 5e3   # ドレイン抵抗 (Ω)

# ドレイン電流 I_DS の計算
def calc_I_DS(V_GS):
    if V_GS < Vth:
        return 0  # カットオフ領域
    return (beta / 2) * (V_GS - Vth) ** 2  # 飽和領域

I_DS = calc_I_DS(V_GS)

# トランスコンダクタンス g_m の計算
g_m = np.sqrt(2 * beta * I_DS)

# ドレイン抵抗 r_o の計算
r_o = 1 / (lambda_ch * I_DS) if I_DS > 0 else np.inf  # チャネル長変調あり

# 並列抵抗計算
def parallel(R1, R2):
    return (R1 * R2) / (R1 + R2)

r_parallel = parallel(r_o, R_D) if I_DS > 0 else R_D

# 電圧利得 A_v の計算
A_v = g_m * r_parallel if I_DS > 0 else 0

# 出力
print("\n### 計算結果 ###")
print(f"I_DS = {I_DS * 1e6:.3f} µA")
print(f"g_m = {g_m * 1e3:.3f} mA/V")
print(f"r_o = {r_o / 1e3:.1f} kΩ")
print(f"並列抵抗 = {r_parallel / 1e3:.1f} kΩ")
print(f"A_v = {A_v:.2f}")
```

```
# ライブラリの再インポート
import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
VDD = 5.0  # 電源電圧 (V)
R = 1e3    # 抵抗値 (Ω)

# ID の範囲設定 (0A から 5mA まで)
ID_values = np.linspace(0, 5e-3, 100)  # 0A から 5mA

# VDS の計算
VDS_values = VDD - R * ID_values

# 指定された ID = 2mA の VDS 計算
ID_given = 2e-3  # 2mA
VDS_given = VDD - R * ID_given

# プロット
plt.figure(figsize=(8, 5))
plt.plot(ID_values * 1e3, VDS_values, label=r'$V_{DS} = V_{DD} - R \cdot I_D$', color='blue')
plt.scatter(ID_given * 1e3, VDS_given, color='red', label=f'ID = {ID_given*1e3:.1f} mA, VDS = {VDS_given:.2f} V')

# 軸ラベルとタイトル
plt.xlabel(r'$I_D$ (mA)')  # 横軸: ドレイン電流 (mA)
plt.ylabel(r'$V_{DS}$ (V)')  # 縦軸: ドレイン-ソース間電圧 (V)
plt.title('Drain-Source Voltage vs. Drain Current')
plt.legend()
plt.grid()
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/742d4daf-18fd-6299-e033-8c75c920b625.png)






https://www.falstad.com/circuit/


http://www.venus.dti.ne.jp/~s-takei/circuit/SpiceEditor3.html


```



```
【VRChat】UdonSharpの導入手順 (2025年2月時点)

# 概要
2025年2月現在、UdonSharpは手動で導入する必要はありません。VCC (VRChat Creator Companion)からWorldプロジェクトを作成する際に自動で導入されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864812/df3da80d-3821-5615-88c9-b60b4c1f70b7.png)

# 確認環境
- Unity 2022.3.22f1
- VCC (VRChat Creator Companion) v2.3.1
- VRChat SDK - Base 3.6.1
- VRChat SDK - Worlds 3.6.1

# ひとこと
VRChatやUdonSharpの細かい仕様を調べる際にTwitter(現:X)での検索をよく利用するのですが、古い記事を参考に手動でUdonSharpを導入してしまっている方を多く見かけるので今回記事にしました。
画像がnullの場合、デフォルト画像を表示する方法

#  optional()
optional() は null安全演算子（Null Safe Operator） のようなもので、オブジェクトが null の場合でもメソッドやプロパティにアクセスしてエラーを回避できます。


# optional() の基本的な使い方
```
$object = null;
echo optional($object)->name; // null (エラーなし)
```
🔹 $object が null でも ->name を呼び出してもエラーにならず null を返す。


# Laravel で optional() を使う例
```
<img src="{{ asset('storage/' . optional($item)->image_path) }}" alt="商品画像">
```
$item が null でも optional($item)->image_path は null を返し、エラーにならない。


# optional() と ?? を組み合わせる
```
<img src="{{ asset('storage/' . (optional($item)->image_path ?? 'noImage.jpg')) }}" alt="商品画像">
```
🔹 $item->image_path が null の場合、noImage.jpg を表示する。


# 画像の保存場所
Laravel で画像を保存する場合、基本的には storage/app/public/ に保存される。
```
storage/app/public/items/noImage.jpg
```
しかし、シンボリックリンクを作成することで、public/storage/ からアクセスできるようになる。

🔹 シンボリックリンクを作成
```
php artisan storage:link
```
🔹 公開アクセスできるパス
```
public/storage/任意フォルダ/noImage.jpg
```
このパスで asset() を使うと画像が表示されるようになる。


# noImage.jpg の適切な保存場所
```
storage/app/public/任意のフォルダ/noImage.jpg  # ✅ 保存場所
public/storage/任意のフォルダ/noImage.jpg      # ✅ ここからアクセス
```
🔹 noImage.jpg を storage/app/public/items/ に保存し、Laravel の php artisan storage:link を実行すると、public/storage/items/ からアクセス可能になる。
数学Ⅱ三角関数の最大と最小【三角関数155】 「0<=x<2*π,y=5*(cosx)^2+6*sinx*cosx-3*(sinx)^2の最大値と最小値」をwolframalpha と ChatGPTでやってみたい。

＞1周期の定積分 π
本問題も?、奥が深いようです。もしかしたら有名関数かも。

# オリジナル
・ニッキーランド 様 (0:00〜5:59)
https://youtu.be/QDQoZhWX_PM
＞まずは次数を下げる...
＞整理する時、普通はsinから書く...
＞sinとcosの多項式は求めにくい
＞合成できる条件...


# WolframAlpha 先生へ 

https://www.wolframalpha.com/input?i=0%3C%3Dx%3C2*%CF%80%2Cy%3D5*%28cosx%29%5E2%2B6*sinx*cosx-3*%28sinx%29%5E2%E3%81%AE%E6%9C%80%E5%A4%A7%E5%80%A4%E3%81%A8%E6%9C%80%E5%B0%8F%E5%80%A4&lang=ja

x≈0.321751 のとき, max{5 cos^2(x) + 6 sin(x) cos(x) - 3 sin^2(x)|0<=x<2 π} = 6
x≈0.321751 のとき, max{5 cos^2(x) + 6 sin(x) cos(x) - 3 sin^2(x)|0<=x<2 π} = 6
x≈1.89255 のとき, min{5 cos^2(x) + 6 sin(x) cos(x) - 3 sin^2(x)|0<=x<2 π} = -4
x≈0.321751 のとき, max{5 cos^2(x) + 6 sin(x) cos(x) - 3 sin^2(x)|0<=x<2 π} = 6

https://www.wolframalpha.com/input?i=0%3C%3Dx%3C2*%CF%80%2Cy%3D5*%28cosx%29%5E2%2B6*sinx*cosx-3*%28sinx%29%5E2%E3%81%AE%E3%82%B0%E3%83%A9%E3%83%95&lang=ja

https://www.wolframalpha.com/input?i=5*%28cosx%29%5E2%2B6*sinx*cosx-3*%28sinx%29%5E2&lang=ja

＞1周期の定積分 π


# ChatGPT先生へ

```
0<=x<2*π,y=5*(cosx)^2+6*sinx*cosx-3*(sinx)^2の最大値と最小値
```
>(回答省略)
```
上記をsympyのソースコードで教えて下さい。。結果も表示して下さい。
```
>(回答抜粋)
```python
import sympy as sp

# 変数の定義
x = sp.symbols('x')
y = 5 * sp.cos(x)**2 + 6 * sp.sin(x) * sp.cos(x) - 3 * sp.sin(x)**2

# 導関数を求める
dy_dx = sp.diff(y, x)

# 導関数 = 0 の解を求める（極値候補）
critical_points_explicit = [sp.simplify(sp.atan(3/4)/2 + k * sp.pi/2) for k in range(4)]

# 各臨界点での関数値を求める（具体的な数値）
critical_values_explicit = {point: y.subs(x, point).evalf() for point in critical_points_explicit}

# 結果を表示
critical_points_explicit, critical_values_explicit
```

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

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