OmniAICreator/Qiita-1.07M huggingface dataset:
remove() と pop() の違い


# remove() と pop() の違い

`remove()` と `pop()` はどちらもリストから要素を削除するメソッドですが、使い方と動作が異なります。以下にその違いをまとめます。

---

### `remove()` メソッド

- **動作**: 指定した **値** をリストから削除します。
- **引数**: 値（要素）を指定します。
- **戻り値**: 戻り値はありません（削除された要素を返さない）。
- **注意点**: 指定した値がリストに複数回出現する場合、最初に見つかった値のみ削除されます。また、指定した値がリストに存在しない場合、`ValueError` が発生します。

**例**:

```python
fruits = ["apple", "banana", "cherry", "date"]
fruits.remove("banana")  # "banana" を削除
print(fruits)  # 出力: ['apple', 'cherry', 'date']
```

---

### `pop()` メソッド

- **動作**: 指定した **インデックス** の要素を削除し、その要素を返します。インデックスを指定しない場合、**リストの最後の要素** を削除して返します。
- **引数**: インデックス（省略可能。省略した場合、最後の要素が削除されます）。
- **戻り値**: 削除された要素が返されます。
- **注意点**: インデックスが範囲外の場合、`IndexError` が発生します。

**例**:

```python
fruits = ["apple", "banana", "cherry", "date"]
removed_item = fruits.pop(1)  # インデックス1の "banana" を削除
print(fruits)  # 出力: ['apple', 'cherry', 'date']
print(removed_item)  # 出力: "banana"
```

```python
fruits = ["apple", "banana", "cherry", "date"]
removed_item = fruits.pop()  # 最後の要素 "date" を削除
print(fruits)  # 出力: ['apple', 'banana', 'cherry']
print(removed_item)  # 出力: "date"
```

---

### まとめ

| 特徴 | `remove()` | `pop()` |
| --- | --- | --- |
| **削除する対象** | 値（要素） | インデックス |
| **戻り値** | なし | 削除された要素 |
| **インデックス指定** | 不可 | 可能（省略時は最後の要素） |
| **エラー処理** | 指定した値がないと `ValueError` | 範囲外インデックスで `IndexError` |

---

どちらのメソッドを使用するかは、削除したい要素が **値** か **インデックス** であるかによって使い分けます。
NHK の LIVEニュース RSS に情報が入ったら TC001 で通知する

## NHK は各種 RSS を用意している
NHK オンラインはジャンルごとにニュースのヘッドラインを RSS 化して提供している。

https://www.nhk.or.jp/toppage/rss/index.html

この中でも LIVE ニュース RSS は、緊急度の高いニュースがあった時のみ情報が入るようになっている。

MeePet の Slideshow でこの内容が表示されるようにしているが、これと合わせて TC001 の画面や通知音を使って速報が入ったことを知らせるようにしてみる。

## XML ノードを使って配列に入れる
ノード図は以下の通り。
![nhkrss1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/f715aa57-d7d4-1fcf-0745-5299806424a9.png)

RSS の配列化には XML ノードを使う。

http request は UTF8 文字列で出力
![nhkrss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/0286720d-df12-9072-66d7-6dc7c4995dee.png)

XML ノードの設定は特にしなくてよい。
![nhkrss3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/5f96e31c-1357-8744-6d00-88c24da9c5cb.png)

このように配列化されて `msg.payload` に渡される。
![nhkrss4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/2c075ba5-7590-2dc3-2e7e-9628d7dee655.png)

LIVEニュースが無い時とある時の RSS の違いは、 `rss.channel[0]` に含まれる要素の数で検知できる。
ニュースが無い時はチャンネル概要の4つのみ（title, description, link, lastBuildDate）、ある時はニュースの数だけ item が追加されるので5以上となる。
TC001 は 日本語を表示することができないため、 LIVE ニュースの入電有無の判定であればこれを使うだけで十分である。

要素数はそのまま `.length` を使って取れないので、 `Object.keys()` を使う。

code 変数をフラグとして利用し、 [気象庁サイトの注警報情報を取得し、 Ulanzi TC001 で表示させる](https://qiita.com/harycurl/items/9cfa881635a81916dec8) でやったようにコンテキストを用いて `flow.nhklive` に値を保存する。
前回の状態が 0 （LIVEニュースが無い）で今回 LIVE ニュースありの場合のみ通知をし、状態を 1 にする（次に LIVE ニュースが継続していても通知しない）。

```javascript: function
var rss = msg.payload;
var code = msg.code;
var count = Object.keys(rss.rss.channel[0]).length;
if (count > 4) {
    if (code == 0) {
        msg.payload = {"text": "Breaking News", "background": "#666600", "blinkText": 1000, "sound":"justin", "hold": true};
        msg.code = 1;
    } else {
        msg.payload = "";
        msg.code = 1;
    }
} else {
    msg.payload = "";
    msg.code = 0;
}

return msg;
```
今朝はユン大統領絡みで2度LIVEニュースが更新されたが、2回ともきちんと通知された。

## 通知音
おまけであるが、通知音は某テレビ系列局の速報音を rtttl で模して使っている。
```:/MELODIES/justin.txt
justin:d=4,o=5,b=100:16c#6,16p,16c#6,16p,p,16c#6,16p,16c#6,16p,p
```
また)M5StampS3とOLED SSD1306で遊ぶ (「46」)( Ubuntu 24.04 lts , Arduino IDE 2 )


x 過去ログを見よ!!
x Adafruit_SSD1306をインストール
x M5Stamp S3の事


目的
OLEDで遊ぶ


結果(成功)

![o_coq740.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f9ebe313-67a0-0036-48b0-5dc5f8491c44.jpeg)


● 「ライブラリを管理」を選択
----

![o_coq742.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/aaea8aee-cefe-6816-5bc7-fd593be87d83.jpeg)




● 「Adafruit SSD1306」を入力、インストール
----

```

Adafruit SSD1306

```

![o_coq743.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c23a9592-7a13-2164-7697-9461d35b32e3.jpeg)

![o_coq744.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/600439a9-bb24-4171-29cd-17f3ca855edf.jpeg)


● 「ライブラリを管理」を消す
----

![o_coq742.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/df18314e-c071-571b-b2e1-32433296ee59.jpeg)



● コピペ、実行
----


https://qiita.com/caa45040/items/fb1e33cfa0482eb0aa2b


```c++

//ssd1306_46_M5S3_1


//ヘッダーファイル
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


//定義
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


//初期化
void setup() {

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.clearDisplay();

  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(0, 10);

  //46を設定
  int tempval = 46;

  // 1行目に46を表示
  display.println(tempval);

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000); //1秒待つ

}//loop

```



![o_coq745.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/db72dcc4-bb46-7d94-85ad-7ea603694b77.jpeg)
nandgameでOS作ってみよう　#4

# サイト
https://nandgame.com/

# 前回とか
https://qiita.com/yamina-Tjatmg-Gui-Creater/items/d21d7ab2065663d9dde2

# 説明
Functionレベルの説明をしていきます。

これは渡された引数を2倍にしてスタックに入れるプログラムです

```
init.stack         # スタック初期化

push.value 5       # 5をプッシュ
pop.argument 1     # 5(ポップした値)を引数とする このマクロの引数には引数IDを指定する
call n_x2 1        # 関数を実行する このマクロの引数は関数名と引数の個数を指定する
push.static RETVAL # 返り値をプッシュする 

goto end　         # プログラムを終わらせる

function n_x2 1    # 関数を定義する このマクロの引数はローカル変数の個数を示す
push.argument 1    # スタックに引数を入れる
pop.d              # 実行するコード(この場合だと二倍するコード)
push.d
push.d
add
return             # スタックからとってきた値を返り値にして元の場所に返す

end:
```

ただ、引数を二個以上指定する方法は知らないので、有識者は教えてくれると嬉しいです！

# 次回とかまとめ
https://qiita.com/yamina-Tjatmg-Gui-Creater/items/d21d7ab2065663d9dde2
Warning: Supplying "ephemeral" for interaction response options is deprecated. Utilize flags instead.

# はじめに
初めまして鈴也 蓮(スズナリ レノ)と申します。
本記事では「discord.js ephemeral 非推奨について」話していこうと思います。

# さっそく...
年始早々、Discord BOTの開発をしていると下のような警告メッセージがターミナルで突如発生！！
```
Warning: Supplying "ephemeral" for interaction response options is deprecated. Utilize flags instead.
```

どうやら、 `ephemeral`君 が非推奨になったから `flags`君 を使ってくれとのこと。

## ephemeral ってなんぞや
Q. そもそも、 `ephemeral`君 ってだれ？

A. インタラクションの応答において「他のユーザーには見えない一時的なメッセージを送る」ためのオプションで、便利なショートカット（ヘルパー）です。

例：
```js
if (interaction.commandName === 'test') {
    interaction.reply({
        content: 'Hello world!',
        ephemeral: true
    });
}
```

結果：
![](https://storage.googleapis.com/zenn-user-upload/f81b54acc0eb-20250103.png)

## なんで非推奨になったのか
`ephemeral`君 がヘルパーであると言ったように、本来は `flags`君 を使ってオプションを適用させるのが正しい方法です。

開発者は `ephemeral`君 だけを特別扱いせず、コードの一貫性を保つため `ephemeral`君 を非推奨にしたと言えます。
![](https://storage.googleapis.com/zenn-user-upload/eaeac3de0d7e-20250103.png)

## flags を使って一時的なメッセージを送信する方法
Discord.js で `flags`君 を使って一時的なメッセージを送信する方法を3つ紹介します。

1. MessageFlags を使う方法（推奨）
```js
const { MessageFlags } = require('discord.js');

interaction.reply({
    content: 'Hello world!',
    flags: MessageFlags.Ephemeral
});
```

2. フラグ名を文字列で指定する方法
```js
interaction.reply({
    content: 'Hello world!',
    flags: 'Ephemeral'
});
```

3. フラグの値を直接指定する方法
```js
interaction.reply({
    content: 'Hello world!',
    flags: 64
});
```

# おわり
最後まで見てくれてありがとうございますた。じゃね👋
リアルとバーチャルの架け橋「箱庭ブリッジ」の宇宙応用

[リアルとバーチャルの架け橋、箱庭ブリッジとは？](https://hakoniwa-lab.net/2024/06/13/core-tech-06/)で示されているデジタルツイン環境「箱庭ブリッジ」を宇宙機や衛星に応用できればと思っています．

宇宙機や衛星では，ミッションの成功率を上げることが極めて重要です．将棋やチェスのように，二手・三手先の状況を読んで，的確な判断をすることができれば，ミッションの成功率を上げることができるでしょう．もし，宇宙機や衛星が，自らと周囲の動きを物理シミュレーションによって未来予測するリアルタイムのデジタルツインを搭載することができ，さらにデジタルツインにAIを結びつけることで，二手・三手先の可能性ある状況の中で最良の選択をすることができ，格段にミッションの成功率を高めることができます．

[TOPPERSカーネルと箱庭とElixirを利用したリアルタイムAIシステム・デジタルツイン構想について](https://qiita.com/zacky1972/items/19bb7c70a3647a90d832)でも示した，Vulkanを用いて物理シミュレーションとAIの両方をアクセラレーションできると考えています．

https://www.vulkan.org

VulkanはGPGPUの機能を備えており，AIだけでなく，物理シミュレーションで用いる線形代数や微分積分のアクセラレーションもすることができます．

箱庭ブリッジにAIと物理エンジンを接続し，Vulkanを接続してアクセラレーションを行うような環境を構築して，宇宙機や衛星に活用していきたいと考えています．
量子コンパイラを作る。 その15

# 概要
量子コンパイラを作る。
elixirで論理回路アセンブラをコンパイルして、qiskitな全加算器を生成した。

# 投入したソース

```
make 8
in 0 2
wire 3 5
xor 1 2 3
and 1 2 4
xor 0 3 7
and 0 3 5
or 4 5 6
out 6 7
```

# 生成したqiskit

```


from qiskit import QuantumCircuit
from qiskit.primitives import StatevectorSampler
qc = QuantumCircuit(8)
qc.h(0)
qc.h(1)
qc.h(2)
qc.cx(1, 3)
qc.cx(2, 3)
qc.ccx(1, 2, 4)
qc.cx(0, 7)
qc.cx(3, 7)
qc.ccx(0, 3, 5)
qc.ccx(4, 5, 6)
qc.cx(4, 6)
qc.cx(5, 6)

qc.measure_all()
print(qc)
sampler = StatevectorSampler()
job = sampler.run([qc], shots = 100)
result = job.result()
counts = result[0].data.meas.get_counts()
print(f" {counts}")
for ans, cnt in counts.items():
  print("carry = ", ans[7], " , ", ans[6], " + ", ans[5], " = ", ans[1], ", carry = ", ans[0])




```

# 成果物

https://paiza.io/projects/OO_Bk7fnWoWJ549LLTYEOw

# qiskit実行結果

```
$ python3 test21.py
        ┌───┐                                              ░ ┌─┐
   q_0: ┤ H ├───────■───────────────────■──────────────────░─┤M├─────────────────────
        ├───┤       │                   │                  ░ └╥┘┌─┐
   q_1: ┤ H ├──■────┼─────────■─────────┼──────────────────░──╫─┤M├──────────────────
        ├───┤  │    │         │         │                  ░  ║ └╥┘┌─┐
   q_2: ┤ H ├──┼────┼────■────■─────────┼──────────────────░──╫──╫─┤M├───────────────
        └───┘┌─┴─┐  │  ┌─┴─┐  │         │                  ░  ║  ║ └╥┘┌─┐
   q_3: ─────┤ X ├──┼──┤ X ├──┼────■────■──────────────────░──╫──╫──╫─┤M├────────────
             └───┘  │  └───┘┌─┴─┐  │    │                  ░  ║  ║  ║ └╥┘┌─┐
   q_4: ────────────┼───────┤ X ├──┼────┼────■────■────────░──╫──╫──╫──╫─┤M├─────────
                    │       └───┘  │  ┌─┴─┐  │    │        ░  ║  ║  ║  ║ └╥┘┌─┐
   q_5: ────────────┼──────────────┼──┤ X ├──■────┼────■───░──╫──╫──╫──╫──╫─┤M├──────
                    │              │  └───┘┌─┴─┐┌─┴─┐┌─┴─┐ ░  ║  ║  ║  ║  ║ └╥┘┌─┐
   q_6: ────────────┼──────────────┼───────┤ X ├┤ X ├┤ X ├─░──╫──╫──╫──╫──╫──╫─┤M├───
                  ┌─┴─┐          ┌─┴─┐     └───┘└───┘└───┘ ░  ║  ║  ║  ║  ║  ║ └╥┘┌─┐
   q_7: ──────────┤ X ├──────────┤ X ├─────────────────────░──╫──╫──╫──╫──╫──╫──╫─┤M├
                  └───┘          └───┘                     ░  ║  ║  ║  ║  ║  ║  ║ └╥┘
meas: 8/══════════════════════════════════════════════════════╩══╩══╩══╩══╩══╩══╩══╩═
                                                              0  1  2  3  4  5  6  7
 {'10001100': 16, '10001010': 13, '11010111': 10, '01010110': 16, '01101101': 25, '01101011': 6, '10000001': 8, '00000000': 6}
carry =  0  ,  0  +  1  =  0 , carry =  1
carry =  0  ,  1  +  0  =  0 , carry =  1
carry =  1  ,  1  +  1  =  1 , carry =  1
carry =  0  ,  1  +  1  =  1 , carry =  0
carry =  1  ,  0  +  1  =  1 , carry =  0
carry =  1  ,  1  +  0  =  1 , carry =  0
carry =  1  ,  0  +  0  =  0 , carry =  1
carry =  0  ,  0  +  0  =  0 , carry =  0
```

以上。
Javaで「フレームで使用するレイアウトマネージャーを設定する」の動作を確認してみた

# 概要

Javaで「フレームで使用するレイアウトマネージャーを設定する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/tutorial/jframe/index8.html

# 実装

以下のファイルを作成しました。
```Sample.java
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.FlowLayout;

class Sample extends JFrame{
  public static void main(String args[]){
    Sample frame = new Sample("MyTitle");
    frame.setVisible(true);
  }

  Sample(String title){
    setTitle(title);
    setBounds(100, 100, 728, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setLayout(new FlowLayout());

    JButton btn1 = new JButton("Open");
    JButton btn2 = new JButton("Close");
    add(btn1);
    add(btn2);
  }
}
```

以下のコマンドを実行しました。

```
$ javac Sample.java 
$ java Sample 
```

# まとめ

何かの役に立てばと。
2025/1/3主にITとかセキュリティの記事

OAuth 2.0の認可エンドポイントにおける脆弱な実装例と対策について考える(12/30)
https://qiita.com/task4233/items/3af1b3d2690b44979659

2025年AI時代のセキュリティ最前線：CrowdStrike警告のAIランサムウェアから組織の対策まで(1/1)
https://innovatopia.jp/cyber-security/cyber-security-news/45899/

AI悪用の詐欺ツールが台頭　トレンドマイクロが25年セキュリティー脅威予測　早期検知や防御強化を呼び掛け(1/1)
https://dempa-digital.com/article/619991

AIで巧妙化するサイバー犯罪から身を守る10の対策(1/1)
https://dime.jp/genre/1906026/

カレドスコップ2024:年間を通じてインドネシアを悩ませるさまざまなサイバー脅威(12/31)
https://voi.id/ja/teknologi/447213

ハッカーはフォルクスワーゲンの電気自動車データセキュリティギャップを見つけ、その800,000人の所有者が脅かされています(12/31)
https://voi.id/ja/otoinfo/447040

AIはサイバー脅威のリスクを高め、企業は警戒するよう求められます(1/1)
https://voi.id/ja/teknologi/447319

iOS新機能が写真データ共有を懸念に、プライバシーへの影響は(1/1)
https://tech-gadget.reinforz.co.jp/13543

Chrome拡張機能開発[～ゆりかごから墓場までGitHub Copilotにおんぶしてもらおう～](12/31)
https://qiita.com/Maji3289/items/51fcd0e84aeb2e1524a1

りそな、安定接続可能に　昨年末から不具合(1/1)
https://www.toonippo.co.jp/articles/-/1932357
https://www.jomo-news.co.jp/articles/-/588197
https://www.kanaloco.jp/news/economy/article-1137621.html
https://topics.smt.docomo.ne.jp/article/kyodo_nor/business/kyodo_nor-2025010101000522?fm=latestnews&redirect=1
https://www.tokyo-np.co.jp/article/377018?rct=economics
https://nordot.app/1247137340051669132
https://www.minyu-net.com/newspack/detail/2025010101000522
https://www.sankei.com/article/20250101-LPDB7X7YPNLMRGVRFIRNAOBULE/
https://www.saitama-np.co.jp/articles/116732
https://www.hokkoku.co.jp/articles/tym/1621374
https://ibarakinews.jp/news/newsdetail.php?f_jun=CO2025010101000522.1.N.20250101T193758.xml&elem=z
https://www.hokkoku.co.jp/articles/-/1621374
https://www.kobe-np.co.jp/news/zenkoku/compact/202501/0018503459.shtml

みずほ銀、ネットバンキングにサイバー攻撃で障害－約３時間後復旧(12/31)
https://newsdig.tbs.co.jp/articles/withbloomberg/1646477?display=1

米財務省にサイバー攻撃、中国関与か(12/31)
https://www.sakigake.jp/news/article/20241231FN0005/?nv=sports

米財務省、ハッキング被害 「重大な事案」中国関与か(1/1)
https://www.nikkei.com/article/DGKKZO85829080R31C24A2FF8000/

中国共産党のハッカー、米財務省にリモート侵入し文書を窃取(12/31)
https://m.epochtimes.jp/2024/12/272871.html

OpenAIのAIアップデート総ざらい！o3は本物か！？(1/1)
https://qiita.com/ryosuke_ohori/items/a50efab32a6fd696979c

「ご確認ください」とクレジットカード会社からのメールに、慌てて指定のフォームに情報を入力したら……いきなり不正利用されてしまった！ どうしたらいい？(1/1)
https://financial-field.com/living/entry-359965

NATO、海底ケーブル保護へ衛星バックアップ網を構築―HEIST計画の全容が明らかに(1/1)
https://xenospectrum.com/full-details-of-the-heist-programme-revealed/

Akamaiが目指す2025年の展望とサイバーセキュリティの未来(1/1)
https://news.3rd-in.co.jp/article/47ca5554-c7ef-11ef-a147-9ca3ba083d71#gsc.tab=0

担当大臣は、デジタルアイデンティティを構築するためにインドと協力することの重要性を表明しました(1/1)
https://voi.id/ja/teknologi/447338

AIの未来は宇宙へ一直線だから(1/1)
https://ja.futuroprossimo.it/2025/01/perche-il-futuro-dell-ia-porta-dritti-verso-lo-spazio/

チーム開発におけるテスト自動化の壁：難易度別の課題と解決策(12/31)
https://qiita.com/Baplisca/items/08d9ce726ade52a0c1f5

米財務省、大統領選妨害で制裁 イランとロシアの組織に(1/1)
https://www.chugoku-np.co.jp/articles/-/578747
【読書】ドイツ人のすごい働き方 日本の3倍休んで成果は1.5倍の秘密

[ドイツ人のすごい働き方 日本の3倍休んで成果は1.5倍の秘密](https://amzn.asia/d/axmQy4f) に関する読書メモ，知見の共有になります．

# なぜ読んだ？
以前，[世界一流エンジニアの思考法](https://amzn.asia/d/bxnJKDe)を読んだことにも共通しますが，自分自身の人生やキャリアをより豊かにするうえで重要なアイテムを拾えると感じたので，この本を読んでみることにしました．

表紙にある「日本の3倍休んで成果は1.5倍の秘密」は人生を豊かにするうえで重要な要素であると考えています．

以下の要素は特にレバレッジの効きそうなポイントだったため，特筆してまとめたいと思います．
- 思考のカギ
- 早起きについて
- マネジメント手法について
- 仕事の型

「要素 / 該当セクション」ごとに，自身とのかかわりが強いポイント，内容をまとめていきます．

# 本書の特筆箇所
## 思考のカギ
### 広いスペースで自由に思考する
前から経験的に重要だなぁと感じていたポイントでしたが，体系的や客観的に他者から与えられた情報は仕入れたことがなかったため，気になりました．

ドイツでは「思考のスケールは作業スペースの広さに比例する」という考えに基づいて，2倍のデスクの広さ，隣の席との2mの間隔，3mの高さの天井というデスク空間を作り出している．
→根拠は記述無し
本書では
- 創造性が刺激されて高い集中力が維持できる
- 心理的な満足感を高めてストレスを軽減する

と主張．

### ドイツ人が片付けに命をかける理由 / 人生の半分は整理整頓
年末年始という時期もあったり，前項の広いスペースとも関連すると感じたので，こちらについても触れています．

ドイツでは退勤時に，デスクはほぼ何も置かれていない状況になる．
ドイツ人の部屋は，自宅でもほぼ完ぺきに整頓されている．
様々な研究で，整理整頓された環境が **集中力を高め，ストレスを減らす** ことが明らかになっていると説明している．

## 早起きについて
### ドイツ流「早起き習慣」を身につける3つのコツ
14時以降のカフェインカットという標目があり，絶対に実践できていないと感じたので目に留まりました．
また，筋トレが習慣化されていて睡眠に興味があったことや，比較的睡眠に投資していたことも自身とかかわりが深いポイントです．

著者がドイツ人の早起き習慣を習得するために用いたTipsの共有．
早起きをするためには少しずつ，15分ずつでもいいから起きる時間をずらしていく．
14時以降にカフェインをとらないようにするのもポイント．
朝のルーティーンを固定し，それに逆算して寝る時間やほかのリズムを設定するとよい．
ルーティーンは目標に合わせて設定することで，自己実現にもつながる．

## マネジメント手法について
### 組織を自走させるサーバントリーダーシップ
最近よく聞くワードです．
個人的にはスクラムの朝会しかり，マイクロマネジメント寄りの仕組みが安心してしまう部分があるので，対抗する視点を仕入れたいという部分から気になった個所です．

日本のプレイングマネージャーから離れた，メンバーの職務範囲外の業務をうまく引き受けるのが，ドイツ式の上司の役割．
部下への権限の委任（デリゲーション）をうまく行いながら，
- タスク分散・ストレス管理
- リーダーシップとサポート
- 業務の明確化による効率的な業務遂行支援
- チームワークの醸成

を行っていく．
先頭を歩くのではなく，チームメンバーの必要な道具やアドバイスを提供する役割．
サーバント：召使い

## 仕事の型
### 仕事を「フロー型」から「ストック型」へ
これも最近よく聞くワードですね．
早めから型を固めたい部分であったので，こちらも気になりました．

フロー型：後に何も残らない仕事
ストック型：後々まで利用できるようになる，こなした仕事が資産となるような仕事
ドイツではフロー型の仕事を徹底排除する習慣がある．
場当たりではなく，後々の影響を考えられる効率的な動きがストック型になりうる．
フロー型の仕事しかもっていなかったとしても，そのフロー型を定型化，自動化 or 委託する動きはストック型である．（委任された人はフロー型にとどまる必要が出てくる可能性もある？）

# まとめ
今回は行動習慣や，テクニカルな部分を学びました．

特に行動習慣については，仕事の状況によらず，適用可能であると考えられます．
早起きという角度で，ルーティーン，自己実現と結び付けられるというのは，当たり前ではあると思いますが個人的には衝撃が強かったです．

新年の目標設定に合わせて，朝活から，自身の行動を修正していきたいと思います！
ESにおいて避けた方がいいデザインパターン

私のバックグラウンドを簡潔に話すとC++,Haskell,Python,TypeScript,Nimでの開発経験があります。その前提で、現時点でやらない方がいいデザインパターンについて共有したいと思います。

現代のツールや言語仕様では冗長で非効率的なデザインパターンについて説明します。

以下はECMAScript前提の話なので、話半分に聞いて下さい。

まずFactoryパターン。これはもう完全にいらないです。読むのに邪魔なので。
デコレータパターンも不要です。

というか人類は普通に素直にオブジェクトの特性を生かすことを考えた方がいいです。
オブジェクトの基礎を勉強すべきです。
オブジェクトとは、「データ（プロパティ）とそれに関する操作（メソッド）をまとめた構造」のことで、
```ts
const user = {
  name: "Alice",
  age: 25,
  greet() {
    return `Hello, my name is ${this.name}`;
  },
};
```
みたいなやつのことです。
この言語においてはオブジェクトが非常に強いので、オブジェクトを利用することでデータ構造を扱うのが異常に楽です。他の言語をやったことのあるひとなら頷いてくれると思います。

以下辛辣にバサバサ

## 1. Factoryパターン
- オブジェクト生成を直接記述する方がシンプルである

## 2. デコレータパターン
- 関数型プログラミングのアプローチでいい
- 関数合成とかで同等の記述ができるが、そもそもそういう面倒なことになったらコードがおかしい

## 3. シングルトンパターン
- そもそもシングルトンパターンが出来た経緯を考えるとDIコンテナで良くないかとなる

## 4. プロキシパターン
- ES6の`Proxy`オブジェクトでよい


で、実際学ぶべきなのはオブジェクトそのものの扱いです。
あと関数型プログラミングの知恵。
高階関数の取り扱いとかをやるといいと思います。

たとえばFactoryパターン、

```ts
class User {
  constructor(public name: string, public age: number) {}
}

class UserFactory {
  static createUser(name: string, age: number): User {
    return new User(name, age);
  }
}

const user = UserFactory.createUser("Alice", 25);

```

これを、こうじゃい
```ts
class User {
  constructor(public name: string, public age: number) {}
}
const createUser = (name: string, age: number) => new User(name, age);
const user = createUser("Alice", 25);
```
普通にひらたくcreateUserを書けばいい（この場合はコンストラクタそのままでもいいが）

アダプタパターンだと
```ts
class OldSystem {
  oldMethod() {
    return "Old System";
  }
}

class Adapter {
  constructor(private oldSystem: OldSystem) {}

  newMethod() {
    return this.oldSystem.oldMethod();
  }
}

const oldSystem = new OldSystem();
const adapter = new Adapter(oldSystem);
console.log(adapter.newMethod());
```

```ts
class OldSystem {
  oldMethod() {
    return "Old System";
  }
}

const adaptOldSystem = (oldSystem: OldSystem) => () => oldSystem.oldMethod();

const oldSystem = new OldSystem();
const newMethod = adaptOldSystem(oldSystem);
console.log(newMethod());
```

で等価ですが、そもそもこの種のデザインパターンが必要になった段階でコード自体が腐っているケースがほとんどです。

デザインパターンって全部銀の弾丸でしかなく、「銀の弾丸はない」。
競プロ日記#25/01/02

# アルゴ式-[Aj = max(Ai, Aj, Ak)](https://algo-method.com/tasks/259)
```
#include <algorithm>
```
で複数値のmax()関数を使える

# アルゴ式-[作れる三角形の種類数](https://algo-method.com/tasks/5f860b64c3783507)
- 長さが互いに相異なる N 本の棒があるのであらかじめソートをして数え上げる
→合同な三角形を数え上げてしまうのを防げる

# アルゴ式-[最大値の位置](https://algo-method.com/tasks/211)
- 単純にmax(),min()を使ってもよいがmax_element()やmin_element()を使ってもよい
※参考[（古い記事、C++17 以前）<algorithm>](https://zenn.dev/reputeless/books/standard-cpp-for-competitive-programming/viewer/library-algorithm)
2025年版 プログラミング言語ランキング

<iframe width="560" height="315" src="https://www.youtube.com/embed/yYIB084W6_8?si=vmD5-qYGpQJ7_BtA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


2025年に入り、プログラミング業界のトレンドは急速に変化しています。新しい技術やフレームワークの登場に伴い、プログラミング言語の人気にも変化が見られます。本記事では、Qiitaユーザーや業界のデータをもとに、2025年版のプログラミング言語ランキングを解説します！

---

## 1. **Python: 引き続きトップの座を維持**
Pythonは2025年も人気No.1を維持しています。その理由は以下の通りです：
- **AI/機械学習分野の強み**: ChatGPTやMidJourneyなどのAIツールの進化に伴い、PythonはAI分野で欠かせない存在です。
- **簡潔で分かりやすい文法**: 初心者からプロまで幅広く支持されています。
- **活発なコミュニティ**: 豊富なライブラリやフレームワークが開発を加速させています。

---

## 2. **JavaScript/TypeScript: フロントエンドとバックエンドでの躍進**
JavaScriptとその派生であるTypeScriptは、依然としてWeb開発の中心的存在です。
- **TypeScriptの台頭**: 型安全性が強化され、複雑なアプリケーション開発に最適。
- **フレームワークの進化**: Next.jsやNuxt.jsなどのフレームワークが高い人気を誇っています。
- **エコシステムの拡大**: DenoやBunなど、新しいランタイムが注目されています。

---

## 3. **Rust: セキュリティとパフォーマンス重視**
Rustはシステムプログラミング言語として、さらに普及しています。
- **WebAssemblyとの親和性**: Web開発にも進出。
- **安全性の高さ**: メモリ管理のミスを防ぐ仕組みが支持されています。
- **大規模プロジェクトでの採用**: MetaやMicrosoftなどの大手企業がRustを導入。

---

## 4. **Go: クラウド時代に特化した言語**
Goはクラウドネイティブアプリケーション開発の言語として、安定した人気を誇ります。
- **Kubernetesとの連携**: コンテナオーケストレーションでの利用が増加。
- **高速コンパイル**: スピーディーな開発を実現。
- **シンプルな構文**: 初心者でも学びやすい。

---

## 5. **Kotlin: Android開発とマルチプラットフォーム**
KotlinはAndroid開発の標準言語として確立されています。
- **Jetpack Composeの普及**: 新しいUIフレームワークでの利用が増加。
- **マルチプラットフォーム開発**: iOSやWebでも利用可能に。

---

## 6. **Swift: Appleエコシステムの柱**
SwiftはApple製品向けのアプリ開発で必須の言語です。
- **macOS、iOS開発の標準**: SwiftUIが主流に。
- **高速な実行速度**: パフォーマンス重視のプロジェクトに最適。

---

## 7. **C#: Unityとクラウドサービスで存在感**
C#はゲーム開発やMicrosoft Azureを活用したプロジェクトで人気です。
- **Unityゲームエンジンの採用**: ゲーム開発者の間で根強い支持。
- **BlazorによるWeb開発**: Webフロントエンドでも活躍。

---

## 今後注目すべき言語
- **Dart/Flutter**: モバイル・Web・デスクトップアプリの統合開発。
- **Julia**: 高速な科学計算の需要増。
- **Carbon**: C++の後継として注目。

---

### 終わりに
2025年もプログラミング言語は進化を続けています。AI、クラウド、Web、モバイル、ゲーム開発といった分野ごとに最適な選択肢が異なるため、自分の目的に合った言語を選びましょう。今年のトレンドを参考に、スキルアップの計画を立ててみてください！

あなたのお気に入りのプログラミング言語や注目のトピックがあれば、ぜひコメントで教えてください！
ラズパイ１号機、2号機のＣＰＵ温度について

ＣＰＵ温度について、調べてみた。　2025/01/12　室温　14.7度
１号機　RaspberryPi3B+　27-34度。　問題無。
 RPZ-IR-Senserのみ　ファン付けられず。　外からファンを回しています。
 RPZ-IR-Senserはcpuの温度を上げる一因かな。
 タスクマネージャーで見ても、CPU、メモリ(1G）とも半分以下ですね。
 Guiのツールを動かすと温度あがりますね。

２号機　RaspberryPi3B+　25-30度。　問題無。
 人感センサー　HC-SR501、ＴＦＴST7735S、camera Module3　ファンを付けてます。
  Guiのツールを動かすと温度あがりますね。

![IMG_0074.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433305/41f0ef4a-eedb-52fc-ac16-8928bd25acae.jpeg)

ラズパイ４以降だともっと温度が高いと聞く。 
・ラズパイ３の温度範囲 0～70℃
・ラズパイ４の温度範囲 0～50℃
・ラズパイ５の温度範囲　CPU 温度が高くなった場合は性能を制限して温度上昇を抑える
　CPU 負荷の大きい作業を継続的に実行したい場合はクーラーを用意するのがよい
 らしい。
【Swift UI】@Environment(\.dismiss)のせいでAppがフリーズする場合がある

# 環境
- Xcode 16.2
- iOS 18.2
# 概要

下記のコードは、ネスト構造の`NestedView`内で`NavigationLink`を使用し、同じ`NestedView`を再び表示するものとなっております。
最小限のViewModelと、@Environmentの`dismiss`が定義されていることが特徴ですが、こちらのコードがシミュレータ上でフリーズを引き起こし、メモリ使用量がみるみる上昇していくという挙動に遭遇しました。
例外が発生しないので発生箇所の特定が難しかったです。

```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        NestedView()
    }
}

struct NestedView: View {
    @Environment(\.dismiss) private var dismiss
    @State var viewModel: NestedViewModel

    init() {
        _viewModel = State(initialValue: NestedViewModel())
    }

    var body: some View {
        NavigationStack {
            NavigationLink {
                NestedView()
            } label: {
                Text(viewModel.str)
            }
        }
    }
}

@Observable
class NestedViewModel {
    var str = "Hello"
}


#Preview {
    ContentView()
}

```


# 解決策

:::note info
`@Environment(\.presentationMode)` を使用する
:::

己の力で調べましたが、根本的な原因はわかりませんでした。
しかし、`@Environment(\.dismiss) private var dismiss`を削除するとこの問題は発生しなくなりました。
そこで代わりに`@Environment(\.presentationMode) private var presentationMode`経由でdismissを呼び出すことでことなきを得ました。

この件について何か心当たりがある方、教えてください ><

# あとがき

例外ではない謎の無限ループでシミュレータがフリーズしたときは@Environmentを疑った方がいいかもですね…
プライベートサブネットとパブリックサブネットの技術的な違い

プライベートサブネットとパブリックサブネットについて、よく

> インターネットと直接通信できるのがパブリックサブネット、できないのがプライベートサブネット

という説明を目にしますが、具体的にどのような設定の違いによってこの特徴が生まれるのかについて、詳しく解説します。

結論から言うと、以下の違いによって定義されます：

パブリックサブネット：
- ルートテーブルに、インターネットゲートウェイ（IGW）への経路が含まれているサブネット
- 具体的には、送信先が「0.0.0.0/0」（すべてのIPv4アドレス）の場合、ターゲットがIGWとなっている

プライベートサブネット：
- ルートテーブルにIGWへの経路が含まれていないサブネット
- インターネットへの通信が必要な場合は、NATゲートウェイやNATインスタンスを経由する必要がある

この設定の違いにより、パブリックサブネットではインスタンスが直接インターネットと通信可能になり、プライベートサブネットではセキュリティを考慮した制限付きの通信となります。

## 参考文献
https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Network1-2022-reg-event.html?trk=aws_introduction_page
ENIとは

ENIは、AWSの仮想ネットワークインターフェースで、EC2インスタンスにアタッチして使用されます。ENIは、仮想マシンにネットワーク接続を提供するために使用され、仮想化環境でのネットワーク接続の管理を効率化します。

## 役割
ENIは、AWSクラウド上のEC2インスタンスがネットワークに接続するための仮想インターフェースです。ENIは物理的なNICの仮想化された形式であり、インスタンスがネットワーク通信を行うための設定や情報を保持します。


## NICとENIの関連
 NICは物理的なネットワークカードを指し、実際にハードウェアとして存在します。一方、ENIはAWSの仮想ネットワークインターフェースで、EC2インスタンスがネットワークに接続するための仮想的な構成要素です。

 ENIの活用例
 - 複数のENI: 1つのEC2インスタンスに複数のENIをアタッチして、異なるサブネットに接続することで、ネットワーク分離を実現したり、セキュリティグループの管理を行ったりします

- 通常、1つのEC2インスタンスには1つのENI（メインENI）が関連付けられますが、必要に応じて複数のENIをアタッチして、それぞれ異なるネットワーク環境に接続することができます


https://aws.amazon.com/jp/about-aws/whats-new/2023/10/multi-vpc-eni-attachments/

 - Elastic IPとの併用: ENIにElastic IPを割り当てることで、インスタンスが停止しても静的IPを維持し、インスタンスの移動やフェイルオーバーを実現できます
   - (UseCase)集中管理型アプライアンスやデータベースのように分離が難しいコンポーネントを複数VPCへENIレベルでアクセスさせたい場合
   - (UseCase)通信事業者のような顧客で「AWS内」と「AWS〜オンプレ間」で異なるタイプの通信を利用する必要があり、論理ネットワークを分離しつつ前述のようなリソースを共有したい場合 

特殊なケースのみ利用すると筆者は理解しました。

### ENIの構成要素
- MACアドレス
ネットワークインターフェイスを識別するための一位の識別子。
- IPアドレス
インスタンス内での通信に使用されるプライベートIPアドレス
- ElasticIP
インターネット向けの固定IPアドレスとしての割り当てが可能
- セキュリティグループ
ENIに適用されているインスタンスのファイアーウォールを設定。
サブネット
- ENIが所属するサブネット。これにより、IPアドレス範囲や通信ルールが決まる
- インターフェイス名
OS内で識別されるENIの名前
- ネットワークインターフェイスの状態
ENIがインスタンスにアタッチされているか、デタッチされているかの状態
- DNS設定
ENIがVPC内で名前解決を行うための設定
技術記事や手順書での括弧で記載する際の慣習

## はじめに

技術記事や環境構築手順書を書く際、任意の値やオプションをどう表現すれば良いか迷ったことはありませんか？
完全に標準化された書き方は存在しないものの、多くのドキュメントで利用される慣習があります。本記事では、その主要な記法を備忘のために残しておきます。

## 目次
1. [角括弧[]](#角括弧)
1. [山括弧<>](#山括弧)
1. [波括弧{}](#波括弧)


## 角括弧[]
使用例
```
ls [オプション] 
```

角括弧はオプションの項目など、任意の項目を示す際に用いる。

## 山括弧<>
使用例
```
mkdir <ディレクトリ名>
```

山括弧は必須の項目を示す際に用いる。

## 波括弧{}
使用例
```
ping {IPアドレス|ドメイン名}
```

波括弧は集合、選択肢を示す際に用いる。
列挙する際はパイプを用いる。
macで古いchromiumをインストールしたいとき

1.インストールしたいversionのzipをdownload(`chrome-mac.zip`を落としてくる)

https://vikyd.github.io/download-chromium-history-version/#/

2.ダブルクリックして解凍

3.macの防御機能を無効化する
- `ダウンロードしたアプリケーションの実行許可`にて、`すべてのアプリを許可`にする。`sudo spctl --master-enable`すればできる

![スクリーンショット 2025-01-03 0.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441085/f87e832c-b389-752a-446b-361385ac8fd9.png)

- 解凍したファイルの中にある、`Chromium.app`に対して、`xattr -cr Chromium.app`を実行する(解凍したファイルに対してmacが付与する`com.apple.quarantine`なるメタデータを消してやる必要がある)

4.これで開けるはず
Bootstrap.cssを特定の領域内部のみに適用し、その中にReactのコンポーネントを描画する方法(ShadowDOMを利用)


## はじめに

既存のWebサイトにReactのコンポーネント(react bootstrap)を描画しようとしたところ、bootstrap.cssを読み込む必要があり画面全体のレイアウトが崩れてしまいました

そこで、Reactのコンポーネントを描画するElementのみにbootstrap.cssを適用するため、ShadowDOMを利用してCSSのスコープを独立させてみます

### 1. createRootを使用してReactのコンポーネントをShadow DOMにレンダリングします
```tsx:ScopedStyleArea.tsx
import React, { useEffect, useRef } from 'react';
import ReactDOM from 'react-dom/client';

type ScopedStyleAreaProps = {
  children: React.ReactNode,
  styleSheets?: string[],
}
/**
 * スタイルシートを特定の領域のみに反映させ、更にその中にReactのコンポーネントを配置するためのコンポーネント
 * ・適用するスタイルシートはpropsで引き渡す
 *    <ScopedStyleArea styleSheets={['/bootstrap.min.css', '/other.css']}>
 *      <Button>Button Component</Button>
 *    </ScopedStyleArea>
 */
const ScopedStyleArea: React.FC<ScopedStyleAreaProps> = ({ children, styleSheets }) => {
  const containerRef = useRef<HTMLDivElement | null>(null);

  useEffect(() => {
    if (containerRef.current) {
      // Shadow DOMを作成
      const shadowRoot = containerRef.current.shadowRoot || containerRef.current.attachShadow({ mode: 'open' });

      // Shadow DOM内にReactコンポーネントをレンダリング
      const shadowRootElement = document.createElement('div');
      shadowRoot.appendChild(shadowRootElement);

      const root = ReactDOM.createRoot(shadowRootElement);
      root.render(
        <>
          {/* CSSの適用 */}
          {styleSheets?.map((sheet) => (
            <link key={sheet} rel="stylesheet" href={sheet} />
          ))}
          {children}
        </>
      );
    }
  }, [children, styleSheets]);

  return <div ref={containerRef} />;
};

export default ScopedStyleArea;

```

### 2. 利用方法

* ScopedStyleAreaを使ってReactのコンポーネントをShadow DOM内でレンダリングします
* 適用するcssを`styleSheets`に指定します

```typescript:App.tsx
import {Button} from 'react-bootstrap';
import ScopedStyleArea from './ScopedStyleArea';

function App() {
  return (
    <ScopedStyleArea styleSheets={['/bootstrap.min.css', '/other.css']}>
      <Button>Button Component</Button>
    </ScopedStyleArea>
  )
}

export default App

```
AMIとは

Amazon Machine Imageの略です。
インスタンスを起動するのに必要なOSやボリュームなどの情報がまとまったテンプレートのことです。

## メリット
AMIを使用することで、同一設定のEC2インスタンスを簡単に複数作成することが可能

## 詳細
OSやアプリケーション、データなどを記述しておくことが可能。作成したEC2インスタンスに引き継ぐことができる。


## 種類
クイックスタートAMI
- AWSがあらかじめ用意しているAMIでAmazonLinuxやWiindows ServerなどのOSがインストール済みのAMIです
- MyAMI
ユーザーが作成したAMIのことで、既存のEC2インスタンスから作成することが可能
- AWS Marketplace AMI
ベンダーなどが作成したAMIでSQL  Server,をrdPressなどのミドルウェアやソフトウェアがインストールされれているAMIです。
- コミュニティAMI
ユーザーが作成したAMIで一般公開されている。任意のユーザーにより作成されているので利用には注意が必要。

### AMIの作成方法
- EC2ダッシュボードにアクセス: AWSマネジメントコンソールでEC2サービスを選択し、左側のメニューから「インスタンス」を選びます

- インスタンスを選択: 作成したいAMIの元となるインスタンスを選択します

- 「アクション」メニュー: インスタンスが選択された状態で、「アクション」ボタンをクリックし、「イメージとテンプレート」→「イメージの作成」を選択します。



## まとめ
AMIとは、Amazon Machine Imageの略で、インスタンスを起動するのに必要なOSやVolなどの情報がまとまったテンプレートのこと。
【OCI】CohereのRerank後に参照した資料を表示する手法

# はじめに
本対応については、OCIやAWSのGenerativeAIでの開発をベースとしている場合の参考事例となります。Azureベースでの開発を行っている開発者の方はこんなことしなくても開発できるのに、と疑問に思われるかもしれません。著者はAzureでの開発は経験していない為、その点はご容赦ください。

# こんな方にお勧め
・GenerativeAIの利用を始めた方
・RAGのシステムをこれから作ろうと思っている方

# Rerankとは
検索システムの精度を向上させる処理のことをさします。
RAGにおける検索とは、セマンティック検索のことですが、セマンティック検索による検索はCOSINE類似度を用いたベクトルの向きを測るパターンが多く、純粋な数値のみで並び順が、決まることが多いです。
それだと、ユーザーが求める最適な並びとならない事が多く、よりユーザーの質問に対して関連性の高い文書を文脈から理解してランキングに落とし込んでくれる。
これを可能とするのが、Rerankという機能です。
主にCohereが提供しているイメージが強く、CohereへのAPI連携やLangChainで実装が可能です。
個人的には、RAGを実装するうえでRerankを行わないのはないと思えるほど、精度に影響する処理です。
イメージとしては、セマンティック検索でざっくり順位付けした後に、その中で更に詳細にRerankで順位付けさせることでより正確な順位付けが出来ると考えています。

# Rerankの書き方
ぼくが実施したのは、API連携でした。
Cohereのサイトでアカウント登録することでAPIキーを取得出来る為、そのAPIキーを取得したうえで、
**co = cohere.Client(api_key)**
としてcoへの接続を行ったうえで、
**results = co.rerank(query=text, documents=texts, top_n=5, model="rerank-multilingual-v3.0", return_documents=True)**
このような記載をします。

query：質問（プロンプト）
documents：文書（事前に取り込んだ資料）
top_n：取得したいランキング数
model：rerankに使用するモデル
return_documents：返却される配列にdocumentを含めるか否か

# Rerankすると文書のみになる
さて、そんなRerankですが当然といえば当然ながら文書に対してランキングを付ける意図しかない為、Rerank後は文書のみしか抽出されない為、その文書がどの資料の文書なのかなどの付属情報を取得することは叶いません。
その為、例えば参考資料などを回答生成後に表示したい場合、工夫が必要となります。
そこで今回の主題となります。

CohereのRerank後に参照した資料を表示する手法として、
**セマンティック検索を行った際に文書の頭に【資料名＋：】を付属させる**
これを1つの手段として提案したいと思います。

ぼくの場合は、
セマンティック検索時に
SELECT doc_id , document_name || '：' ||embed_data AS embed_data, embed_id 

このような記載で、ドキュメント名：チャンキング済み文書が一塊として抽出されるようにします。

その後に、
##リランキング
results = co.rerank(query=text, documents=texts, top_n=30, model="rerank-multilingual-v3.0", return_documents=True)
＜中略＞

##参考資料抽出
**additional_titles = [r.document.text.split('：')[0] for r in results.results if r.relevance_score >= 0.95 and '：' in r.document.text]**

このような記載で、リランキングによりランキング上位に上がった文書の中で一致率が高く文書の最初に：が来るまでの資料名を取得するようにプログラムを組んで、抽出された資料名を取得するようにしていました。

取得するのは、あくまで資料名のみですので実際のファイルを画面へ表示したい場合は、資料名と一致したものをAutonomousDBより直接呼び出す、GoogleドライブやOCIオブジェクトストレージなどに資料を格納したものを呼び出すなど、更なる工夫をこらしてください。

## 終わりに
今回は、Rerank後の資料の呼び出し方についてのお話でした。
セマンティック検索での抽出の場合、どうしても100％正しい資料のみを抽出したいという要望からは1歩届かない話となりますが、限りなく近いものを抽出することが可能です。
特にリランキングはほぼ必須となるRAGという技術においては、このような工夫が必ずに必要だと思っています。
他の方法があれば是非教えていただけると嬉しいです。
それでは、また次回の記事で！
AtCoder Daily Training EASY 2024/12/31 - A (Pairing)

```rust
use std::{collections::HashSet, io::{stdin, BufRead}};

fn main(){
    let std= stdin();
    let mut buf= std.lock().lines();
    let mut v: Vec<i32>= buf.next().unwrap().unwrap()
            .split_whitespace()
            .map(|f| f.parse::<i32>().unwrap() )
            .collect();

    let mut hashset:HashSet<i32>= HashSet::new(); 
    let mut cnt= 0;
    let v_cloned= v.clone();
    
    for e in v{
        let amount= v_cloned.iter().filter(|&n| *n == e).count();


        if amount > 3{
            cnt= 2;
            println!("{}", cnt);
            return;
        }

        if amount > 2{
            cnt= 1;
            println!("{}", cnt);
            return;
        }

        if hashset.contains(&e){
            cnt+=1;
        }
        hashset.insert(e);
    }

    println!("{}", cnt);
}
```


# Source

https://github.com/dongsub-joung/atcoder/blob/main/adt_easy_20241231_1/src/main.rs
Pythonで小さなOSを作る

<!-- Pythonで小さなOSを作る -->

## はじめに

Pythonで何か開発をしたいなと思い、色々考えてみた結果小さなOSを作ってみることにしました。

Windowsはアセンブリ言語やC言語で実装されていると聞きました。なので、Pythonでもある程度はできるんじゃないか、と思い立ったのがきっかけです。

## 目標

とりあえず、以下のことを目標としました。

1. ブートローダーを作る
2. カーネルを作る
3. シェルを作る
4. UIを作る
5. ファイルシステムを作る
6. ネットワーク通信を実装する
7. セキュリティ管理を実現する

OSの機能には以下のようなものがあります。

1. ハードウェアの管理と制御
2. ソフトウェアの管理
3. ファイルの管理
4. タスク管理
5. メモリ管理
6. UIの提供
7. ネットワーク通信
8. セキュリティ管理

これらの機能を上記の目標を達成する中で実装する、というのが目標です。

## 要件

また、自分なりに以下の要件を設定しました。

1. Pythonシステムで閉じている
2. 再起動する際データを保っているようにする
3. GUIとCUIどちらも使えるようにする
4. ネットワーク通信以外の機能はできるだけ外部に頼らず実装する

これらの要件を満たしつつ開発を進めていこうと思います。

## 展望

とりあえずリポジトリは立てました。

https://github.com/Gitudon/OS-with-Python

少しずつ進めていきたいと思います。

## 参考文献

[OSの役割や機能を具体例付きで7つ紹介！【わかりやすく解説】 | Webpia](https://webpia.jp/operating_system/#index_id9)

[ブートローダとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word15558.html)

[カーネルとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word15.html)

[シェルとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word11219.html)

[ファイルシステムとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word13127.html)
JuliaのITensorsでGPUとCPUを行き来する

# ITensorsとGPU
 GPUを用いると、DMRGなどの計算が早くなるため非常に快適です。

# GPUとCPUを変換
実際に変換してみましょう。次のように準備しておきます。

```julia
using CUDA
using ITensors, ITensorMPS

const L = 10
const sites = siteinds("S=1/2",L)
```
ここで、MPSを用意しておきましょう。（これは、CPU側にあります）
```julia
ψ = random_mps(sites,linkdims=2)
```


## CPU -> GPU
[こちらのサイト](https://itensor.github.io/ITensors.jl/dev/RunningOnGPUs.html)に従って、CPUからGPUに転送してみます。

```julia
ψ_gpu = NDTensors.CUDAExtensions.cu(ψ)
```
あるいは、ただ単に
```julia
ψ_gpu = cu(ψ)
```
とします。
これだけでCPUからGPUへと転送することができます。

## GPU -> CPU
[こちらのサイト](https://itensor.discourse.group/t/bring-mps-from-gpu-back-to-cpu/1659)に従って、GPUからCPUに転送してみます。


```julia
ψ_cpu = NDTensors.cpu(ψ_gpu)
```
これだけでGPUからCPUへと転送することができます。

## チェック
実際に、`ψ`と`ψ_cpu`が同一であるか確認してみます。

```julia
julia> ψ ≈ ψ_cpu
true
```
~~但し、CPUにある`ψ`では倍精度で定義されますが、`cu()`で転送した`ψ_gpu`では単精度になってしまう影響によるものか、厳密には一致しないので注意です。~~ [追記参照](#追記)。
```julia
julia> ψ == ψ_cpu
false
```

# 最後に
CPU -> GPUについての転送は記事が多くあったのですが、
GPU -> CPUについて、日本語の記事が見つからなかったため、作成しました。
また、CPU -> GPUへの転送の際に、`Float64`のGPUへと転送できる方法を探していますので、ご存じの方はコメントいただけると幸いです。

# 追記
`Float64`で変換するために、一旦`Array`に焼き直したのちに、`CuArray`でGPUへと倍精度で送り、それを`ITensor`で焼き直す、といった方法はとれそうです。

```julia
function mps_to_gpu(ψ::MPS)
    s = siteinds(ψ)
    ψ = orthogonalize!(ψ, 1)
    A = ψ[1]
    for j = 2:length(ψ)
        A = A * ψ[j]
    end
    A_array = Array(A, s...)
    return MPS(CuArray(A_array),s)
end
```

例えば、次のように用います。

```julia
ψ_gpu_ = mps_to_gpu(ψ)
```
これで、倍精度にすることができました。

但し、こちらの場合でも、もともとのとは一致しませんでした。

```julia
julia> ψ == NDTensors.cpu(ψ_gpu_)
false
```
Roo-cline + DeepSeek V3でMCPのfilesystem環境を刷新！驚異のコスパ体験記 🚀

## はじめに

MCPのファイルシステム環境を刷新するという大がかりなタスクに、Roo-clineとDeepSeek V3を使って挑戦してみました。大量のトークン（471.8k入力 + 5.4k出力）を消費したにもかかわらず、なんとトータルコストは**$0.0081（約1.27円）**！駄菓子よりも安いんです！しかも、パフォーマンスはClaude 3.5 Sonnetと遜色ありませんでした。

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">DeepSeek V3 使って filesystem環境を刷新した！<br>だいぶ手こずってトークン数消費したけど。。。なんと。。。$0.0081（1.27円）<br>駄菓子より安い！！このコスパマジで嬉しい！！！<br>ちなみに今のところはマジでSonnet 3.5 と使い心地は変わりません！！！！ <a href="https://t.co/eYzc7ygznC">https://t.co/eYzc7ygznC</a> <a href="https://t.co/zqilA5Lxg9">pic.twitter.com/zqilA5Lxg9</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1874813863386083521?ref_src=twsrc%5Etfw">January 2, 2025</a></blockquote> 


## DeepSeek V3とは？

2024年12月にリリースされたDeepSeek V3は、AI業界に大きな革新をもたらした最新モデルです。主な特徴は：

- 671B MoEパラメータ（有効活性化パラメータ37B）
- 14.8Tの高品質トークンでトレーニング
- 処理速度は前バージョンの3倍（60トークン/秒）
- 完全オープンソース（モデルとペーパーを公開）
- 驚異的なコストパフォーマンス

### 料金体系（2025年2月8日まで割引価格）
- 入力（キャッシュミス）：$0.14/1M トークン
- 入力（キャッシュヒット）：$0.014/1M トークン
- 出力：$0.28/1M トークン

## 実際のタスク内容と結果

### タスクの概要
1. MCPサーバーのリポジトリをクローン
2. filesystemディレクトリのindex.tsをビルド
3. Roo-clineとClaude Desktopの両方に登録
4. 設定ファイルの修正と最適化

### 実際の処理手順

1. **環境セットアップ**
```bash
cd C:/Users/makim/Documents/Cline/MCP/servers/src/filesystem
npm install && npm run build
```

2. **ビルド後の設定修正**
- distディレクトリへのパス更新
- argsの順序修正（-yオプションの配置修正）
- 両方のクライアントの設定ファイル更新

### エラー対応例
```
エラー：Error accessing directory -y
原因：argsの順序が不適切
解決：-yオプションの位置を@modelcontextprotocol/server-filesystemの後に移動
```

## コスト分析

実際の使用トークン数：
- 入力：471.8k トークン
- 出力：5.4k トークン
**合計コスト：$0.0081（約1.27円）**

これは驚異的なコストパフォーマンスです！例えば：
- うまい棒（10円）より安い
- ガムの1/10以下のコスト
- 1分の作業時間の人件費よりも安価

## Claude 3.5 Sonnetとの比較

実際の使用感では、以下の点でSonnetと同等のパフォーマンスを発揮：
- TypeScriptのビルド処理の理解
- 設定ファイルの適切な修正
- エラー解析と解決策の提示
- MCPプロトコルの理解と実装

## DeepSeek V3の強み

1. **高度な言語理解**
   - 複雑なTypeScriptコードの解析
   - ビルドエラーの的確な診断
   - 設定ファイルの構文理解

2. **問題解決能力**
   - エラーの根本原因の特定
   - 最適な解決策の提示
   - 段階的な問題解決アプローチ

3. **コスト効率**
   - 大量のトークン処理でも低コスト
   - キャッシュ機能による最適化
   - 高速な処理速度

## まとめ

DeepSeek V3は、その驚異的なコストパフォーマンスと高い性能で、大規模な開発タスクでも実用的な選択肢となることが実証できました：

- 複雑なMCP環境の構築を完遂
- エラー対応も的確に実施
- 驚異的な低コストを実現
- Claude 3.5 Sonnet相当の性能

開発プロジェクトにおいて、DeepSeek V3は「高性能・低コスト」という理想的な選択肢となりそうです。

## 参考リンク

- [DeepSeek V3 GitHub](https://github.com/deepseek-ai/DeepSeek-V3)
- [DeepSeek V3 論文](https://github.com/deepseek-ai/DeepSeek-V3/blob/main/DeepSeek_V3.pdf)
- [Roo-Cline ドキュメント](https://github.com/RooVetGit/Roo-Cline)
- [MCP Protocol](https://github.com/modelcontextprotocol)

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
FABでアセット販売してみた

FABでアセットを販売してみたのでその備忘録です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/53da3b27-1730-7079-92b4-08e7568406cb.png)


※販売者登録したのはFAB発表以前でフォーマットなど大きく変わっていそうなので割愛します。マイナンバーカードで登録できました。
記憶にある限り１日で登録が済んだような…

有料アセットを出品すればSubstanve Painterが６か月使えるのでお得ですね（もう終わってるかも？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/da884fd7-1a79-8b90-bd3c-b9bbab09081b.png)

# パブリッシャーページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/59bdad06-93e4-27a5-0bc4-0ac490f916da.png)

パブリッシャー関係のものはFABの公開から確認できます。
出品は出品ページを開けばOKです。

# 出品する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/5a3cbbd0-ee9a-2707-458b-4bf59be7c357.png)
出品は「新規に出品する」から追加できます。
今回はStaticMeshのアセットを販売しました。
コードの出品は手続きや注意点が違うようなのでご注意ください。

# 製品タイプの選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/7364f9e2-4746-99b8-dc2e-d7972a889b22.png)

事前にアセットの分類を選択する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/d6c12502-2a17-e23a-2424-2882e6f8b4f8.png)

FABのホームページにある分類です。

# 製品ページを書く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/cb72cd6d-3c43-79c0-9bb8-9b0905e3c83b.png)

タイトルや説明などアセットページのものを追加していきます。

メディアギャラリーで３Dモデルのプレビューが表示できるようになったのですが、１モデル（１ファイル分）しか表示できないようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/01303ace-ca07-6b3a-1354-1325b8b90f3f.png)

ライセンスについては何もなければ標準で問題ないと思います。
クリエイティブ・コモンズについてはこちら
https://creativecommons.org/licenses/by/4.0/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/d8e8bef2-9c86-fa87-5916-ae4c812b868b.png)

# 製品ファイルのアップロード
製品ファイルはFABになっていろいろな種類が売れるようになりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/e9988bf7-9bb5-967b-a1e4-7170384f7c55.png)

とはいってもUEの形式以外はファイルをアップロードするだけの状態…（審査もない模様）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/0f82e890-6b55-bd29-154c-48dfab6d6f3a.png)

UEだけは以前と同じガイドライン形式に則る必要があります。
https://www.unrealengine.com/ja/marketplace-guidelines
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/b2d0a165-886f-0fc8-fcb9-f3ce63ca78f2.png)


プロジェクトファイルのリンクは、GoogleDriveなどにアップロード→リンク共有公開→リンク貼り付けといった形で問題ありません。

サポートエンジンバージョンですが、UE5.4で制作したプロジェクトを5.1-5.5対応で出したのですが問題ありませんでした。Materialがバージョン依存などでなければ問題ないかと思います。


完成したらレビューに提出
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/1dfafd35-1f9c-1c63-ec41-aefd41129573.png)
レビュー後に手動で販売開始するか自動で販売開始するか選ぶことができます。

# 修正メールが返ってくる
修正点があるとサポートチームからメールが来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/aa623e1f-eacd-633e-582c-0025aa971591.png)

自分の時はStaticMeshのサジェスト付け忘れと記憶にないプラグインの抜き忘れについて修正してくださいとありました。

# 出品完了
問題がなくなると出品されます。

かかった時間はメールを１往復はさんで２日ほどでした。
FABになって日本語に対応している部分が増えたり、審査が緩くなった？ようなところもあるので皆さまぜひ出品してみてはいかがでしょうか。
Kubernetes入門を読んで得た知識・気づき・疑問

## 前提
「つくって、壊して、直して学ぶ Kubernetes入門」を読んだまとめです。書籍に記載のHands-Onはまだしてないけど、絵柄がかわいいし概要めちゃくちゃつかみやすくてよいです。
なお、昔ながらのインフラは何となく雰囲気でわかるものの今風なやつは全然わからず読んでみました。あとQiita初心者です


## 得た知識
- Kubernetesとは、Dockerとかのコンテナを便利に管理するツール
- コンテナを束ねてPodとして最小構成を作れる。主機能に加えて付随機能 (Log Archive機能など)を束ねるイメージ。ちなみにサブのやつはサイドカーと呼んだりする。この辺をマニフェストというレシピみたいなyamlファイル用意して管理していく
- Podは通常直接デプロイせずReplicaSet/Deploymentという形でデプロイする。ReplicaSetは要するに冗長化で、Deploymentでバージョン管理をしている。Deploymentとしてリリースすることで無停止切替が可能(RecreateとRollingUpdateを選択可)
- Deploymentだと負荷分散がないのでServiceというマニフェストを準備する。これ使うとクラスタIP用意したり外部のLBと紐づけができる
- コンテナデプロイしてもリソースが不足してたり依存する他Serviceが立ち上がっていなかったりするケースがありトラブルは起こるものなので、Readiness probeなどを使ってヘルスチェックが必要
- CPUとかメモリを指定してデプロイできる(必須・上限・QoSも設定可能)。SelectorといってSSDのノードだけにデプロイするとか、Affinityで近隣配置みたいなこともできる。Anti-Affinityでは同一ノードに載せないとか設定できるが、ノード以上にPodを増やせなくなるので、Pod Topology Spread Constraintsを使うとよい
- ConfigMap/Secretを使うことで環境変数みたいなやつを管理できる。Secretであればアクセス権限の追加が可能
- ProdとSTGで、マニフェストの差異が増えてくると管理が大変になるのでGitOpsの考え方を導入していく。Kustomizeを使えば、ベースのマニフェストに上書き(overlays)する形で環境固有の設定を管理できる
- Kubernetesのアーキテクチャ上、コントロールプレーンとデータノードが分かれており、コントロールプレーンのプロセスがダウンしていてもデータノードは生き残っておりサービス継続が可能とのこと。その意味では障害に強いらしい

## 疑問/できていないこと
- 結局物理ノードを管理しようとしたときにどうやってやるのか全然わからなかったのでどうやるんだろ
- 一般的に適用するべき組織体制の在り方。DevOps的にAppの範囲は広がってくるのは明確に分かるが、インフラポジションはPlatform Eng.とかでいるはず。どういう体制ででかいシステム群を運用するんだろ
- 軸はちょっと違うがコンテナのセキュリティってどうするんだ。脆弱性管理とかパッチ適用とか

## 気づき・所感
マイクロサービスを突き進んできたとき、k8s (もしくはCloud Nativeサービス)は必須になるわなと感じた。
一方で周辺知識がめちゃくちゃ必要。マイクロサービスを選択するときのトレードオフなんだろうけど、普通に障害ポイントが増えているのと調査がめんどくさそう、可観測性は必須。あとリソース設定しやすいからこそのミスもあると思うので、GitOpsも必須。それだけデプロイ頻度高めていきたい会社のツールなんだろうという感想。
この辺考えると、Kubernetes真面目に運用するよりも、あたりまえだけどFargateとかApp ServiceとかのPaaSサービスうまく使ってシステム作ったほうが基本的には楽そう。あんま使ったことないけど
あと結局全部RESTになるわけでコンピューティングのリソース消費激しい気がする。
自作OSのフォントについてモリサワに問い合わせ話

はい、miku_JK_Jbです。

今回は自作OSのフォントを決めた話をしていこう



私は最初、自作OSのシステムフォントに源ノ角ゴシックを使用しよう考えていた。

だが、ライセンス的に著作権表記やライセンスを他の人に伝わるようにしなければならないのが、私的にかなり面倒くさかった。

(源ノ角ゴシックのライセンスはSIL Open Font License1.1)



そこで私はCopilotニキやThreadsなどでM+Fontsが良いのではなかろうか？との情報を受け取ったので、公式サイトなどを見て回った。

だが、M+Fontsも私が見た限りSILライセンスだった orz



「あーあ、こいつもかよ」と思いながら、フォントを探していたところ モリサワのMB101がヒットした。
https://www.morisawa.co.jp/fonts/specimen/1203

これが見ればまぁ私が欲していたようなフォントな感じで、即採用しようと思った。

そして公式サイトを見ると、組み込みフォントがあるじゃないか
![組み込みフォント　MB101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3765588/f3f53021-454d-a757-759d-11c3fc3fb81b.png)



これは素晴らしい。モリサワ、最高だ。



ただ、公式サイトでは組み込みフォントの価格が書かれていない & 自作OSに使って良いのかもわからない。

ってことで、問い合わせてみた。



問い合わせた内容はこんな感じ↓

「現在、私は自作OSの開発を進めている高校生です。
このOSにおいて、貴社の「ゴシックMB101」フォントをシステムフォントとして組み込みたいと考えております。

以下の点についてご確認させていただきたく、ご連絡いたしました。

組み込みの許可:

「ゴシックMB101」フォントを、自作OSのシステムフォントとして組み込むことは可能でしょうか？

ライセンスの条件:

上記の使用に関するライセンス条件や必要な手続きについて教えていただけますでしょうか？

ソースコードを公開しない形でフォントを利用する際の特別な注意点や条件があれば、併せてご教示ください。

費用:

使用許可を得るためのライセンス費用が発生する場合、その詳細についても教えていただけますと幸いです。

お手数をおかけしますが、ご確認のうえご回答いただけますよう、何卒よろしくお願い申し上げます。」っと。



要約すると、自作OSを開発しているガキがフォントを使いたいだけど大丈夫そ？ & 価格はいくらになりそ？と聞いてみた。



ただ、この問い合わせを送った日が12月30日、モリサワは正月休みだった。で正月休みが終わるのが1月5日みたい

回答は来週あたりになるのかな？



次回に続く

頼むぜモリサワ。
ReactとFastAPIを使ってプロジェクトをセットアップする

今回は、Reactを使用したフロントエンド[(こちらの過去記事参照)](https://qiita.com/Qoo1000000/items/26d5aba3cae775efa666)とFastAPIを使用したバックエンドのプロジェクトをセットアップし、それぞれを起動する方法について説明します。
バックエンドでは、FastAPIを使ってシンプルなログインAPIを実装します。ここではトークンベースの簡単な認証を実装してみます。

## 1. Reactプロジェクトの作成とフロントエンドの起動

まず、Reactプロジェクトを作成し、フロントエンドを起動します。

### ステップ

1. **`web-vitals`のインストール**

   `web-vitals`は、ウェブパフォーマンスの指標を計測するためのツールです。以下のコマンドでインストールします。

   ```bash
   npm install web-vitals --save
   ```

2. **Reactプロジェクトの作成**

   `npx create-react-app`コマンドを使って新しいReactプロジェクトを作成します。`【プロジェクト名】`には、任意のプロジェクト名を入力します。

   ```bash
   npx create-react-app 【プロジェクト名】
   ```

3. **フロントエンドの起動**

   `npm start`コマンドで、ローカルサーバでReactアプリケーションを起動します。

   ```bash
   npm start
   ```

## 2. FastAPIの導入とバックエンドの起動

次に、FastAPIを使ってバックエンドをセットアップします。

### ステップ

1. **FastAPIのインストール**

   FastAPIをインストールするには、Pythonのパッケージ管理ツールであるpipを使用します。

   ```bash
   pip install fastapi
   ```

2. **FastAPIの起動**

   `uvicorn`を使用してFastAPIアプリケーションを起動します。`main`はFastAPIアプリのPythonファイル名(今回はmain.pyだからmain)、`app`はFastAPIのインスタンス名です。

   ```bash
   uvicorn main:app --reload
   ```

`--reload`オプションを使うことで、コードの変更があった場合、自動的にサーバが再起動されます。

この手順を完了することで、ReactとFastAPIをそれぞれの環境で立ち上げることができ、フルスタックアプリケーションの基礎を構築する準備が整います。

#### ログイン機能はこんな感じ
![スクリーンショット 2025-01-02 22.43.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288939/2070b0af-f4f8-86a6-9341-359054e9baad.png)


## 3. おわりに
今回は、フロントエンドとバックエンドの接続の練習および勉強も兼ねて実装をしてみました。

・フロントのUI/UX性能の向上
・データベースでのユーザー管理機能の導入
・Webサイトの画面機能の充実

など改善点は沢山ありそうですが、ひとまずフルスタックアプリケーションの基礎構築はできたと思います。
Transit Gatewayとは

複数VPCや、オンプレミスを単一のゲートウェイで接続することができるサービスです。Transit Gateway登場以前は、接続先が増えるたびにピアリングや、Direct Connect等でフルメッシュ構成が必要でした。

### フルメッシュ構成とは
ネットワーク設計の一つで、全てのノード（デバイス）が直接的に接続されている構成です。つまり、ネットワーク内の各ノードが他のすべてのノードと直接リンクを持ち、データの送受信が可能な状態です。




## アタッチメントタイプ
### VPC
VPCアタッチメントは、VPCとトランジットゲートウェイを接続するためのアタッチメントタイプです。このタイプを使用することで、トランジットゲートウェイが複数のVPCと接続され、VPC間のトラフィックをルーティングできるようになります
- 用途: 複数のVPCを単一のトランジットゲートウェイを通じて接続し、トラフィックを相互にやり取りをする
特徴: 各VPCにおけるサブネットのトラフィックを、トランジットゲートウェイを介して他のVPCやオンプレミスのネットワークと接続します。
### VPN
VPNアタッチメントは、オンプレミス環境やリモートネットワークとAWSのトランジットゲートウェイを接続するために使用します。これにより、インターネット経由で暗号化されたトンネルを使って安全に接続できます。
- 用途: オンプレミスのネットワークや他のクラウドプロバイダ、リモートオフィスとの接続を確立するために利用します
- 特徴: IPsec VPNトンネルを使用して、AWSのトランジットゲートウェイと外部ネットワークを接続します。これにより、セキュアな通信が可能になります
### Peering Connection
Peering Connectionアタッチメントは、異なるVPCトランジットゲートウェイ同士を接続するために使用します。これにより、複数のトランジットゲートウェイ間で通信を行えるようになります。通常、同一リージョンまたは異なるリージョンにあるVPC同士の接続に利用されます。
- 用途: 複数のトランジットゲートウェイを接続して、異なるVPC間での通信を可能にする
- 特徴: 複数のVPCトランジットゲートウェイを接続するために、トランジットゲートウェイ間のピアリングを構成します。異なるリージョンのVPCでも接続できる場合があります

### Connect
Direct Connectアタッチメントは、オンプレミスのネットワークとAWSのトランジットゲートウェイを直接接続するためのアタッチメントタイプです。専用線を使って、インターネットを経由せずにAWSのVPCやオンプレミス間でトラフィックをやり取りすることができます。

- 用途: 高速で低レイテンシーな接続が求められる場合に使用されます。オンプレミス環境とAWSクラウド間のトラフィックを専用線で接続します
- 特徴: 高いスループットと低レイテンシーを提供し、セキュリティの高い接続が可能です。AWSのインフラ内での高速な通信を実現できます

![アタッチメントタイプ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983428/55acce1d-35e6-71c0-7017-127f6526dd62.jpeg)
ウェブ上でビデオ通話アプリを構築する | React

このチュートリアルでは、React.jsを使用して、5分以内にウェブ上でオーディオおよびビデオ通話のデモを迅速に実装する方法を示します。最終的には1対1の通話とグループ通話のビデオ通話機能を実装し、ミュート、カメラのオンオフ、画面のズームインおよびズームアウトなどの完全なUIも含まれています。

- Node.js バージョン 16以上
- WebRTC APIをサポートするモダンブラウザ

# **ステップ 1. デモをダウンロード**

1. ターミナルを開き、リポジトリをクローンするコマンドを入力します。

```jsx
git clone https://github.com/Tencent-RTC/TUICallKit.git
```

2. 依存関係をインストールします。

```jsx
cd ./TUICallKit/Web/basic-react
```

```jsx
npm install
```

# **ステップ 2. デモを設定**

[Developer Console](https://trtc.io/login?s_url=https://console.trtc.io/)にログインし、**`SDKAppID`と`SDKSecretKey`を取得して、`GenerateTestUserSig-es.js`ファイルに入力します。**

ファイルパス: `TUICallKit/Web/basic-react/src/debug/GenerateTestUserSig-es.js`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957687/af0af29a-ae76-6aa9-15bf-81ba906d5425.png)

# **ステップ 3. デモを実行**

1. ターミナルでコマンドを入力してデモを実行します。

```jsx
npm run dev
```

2. 2つのブラウザページを開き、同じURLに入力し、異なるuserIDでログインします。

1. 両方のuserIDが正常にログインしたら、もう一方のページのuserIDを入力し、「Add to call list」ボタンをクリックします。「Call」ボタンをクリックして、最初の通話を体験します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957687/7b680a14-4cf6-6613-3313-d120e39afb01.png)


これで完了です！このプロジェクトの完全なソースコードは[GitHub](https://github.com/Tencent-RTC/TUICallKit)で入手できます。
【Mac】デフォルトのシェルをfishに変更する方法

## fishをインストールする

Homebrewでfishをインストールします。

```terminal
brew install fish
```

## ログインシェルをfishに変更する

以下のコマンドを実行してログインシェルをfishに変更します。

```terminal
echo /opt/homebrew/bin/fish | sudo tee -a /etc/shells
```

```terminal
chsh -s /opt/homebrew/bin/fish
```

## 参考

https://fishshell.com/docs/current/index.html#id1