OmniAICreator/Qiita-1.07M huggingface dataset:
都内のマンションでStarlinkを試す

都内のマンションでStarlinkを試してみましたので共有です。
結論としては我が家の環境では使い物にならなかったので返品しました。
マンションにお住まいの方で、検討中の方の参考になれば幸いです。
＊本記事は2025年1月時点の情報です。お住まいの地域や契約のプラン、タイミングによって状況が異なる可能性があります。

## 前提条件
・設置場所：マンションのベランダ、方角は南、階数は10階建ての6階
・機種：Starlink 標準フラット（第三世代）
・プラン：レジデンシャル

## 背景
基本、自宅でテレワークをしています。自宅のネットワークはVDSLということもあり、時間帯によっては不安定になることもしばしばありました。また最近の災害リスクの高まりから元々Stalinkには注目していました。

## 設置場所の状態確認
事前にアプリをスマホにダウンロードし、設置予定場所で障害物有無の確認が行えます。
障害物の有無とその条件下でのネットワークの品質が確認できます。この時点で、私の家では南側の空以外は全て障害物に覆われている状態で、大幅な遅延が見込まれるという診断結果でした。（南むきのベランダなので、南以外の空はマンション自体が傷害となる形です）
結果として、この時点の確認結果が実際に設置した際のネットワーク品質と同じでしたので事前確認は参考になるものと思われます。つまり、この時点で結果がイマイチな場所への設置はほぼ無理と考えた方がいいかもしれません。

## 注文〜到着
公式サイトから注文しました。初回の注文時に郵便番号まで特定できる住所が送付先に指定されてしまい、正しく認識されませんでしたが、発送準備中(Pending）の状態で送付先住所を正しい住所に修正しました。
念の為、正しい住所が番地や部屋番号まで指定されているかチェックすることをお勧めします。

その後、アメリカからの発送で1週間ほどで届きました。

## 開封〜設置
専用の段ボールに梱包されて到着しました。段ボールは新品ですが、中を開けるとかなり使用感がありました。袋詰めとかはされておらず、専用の段ボールに直に入っています。
アメリカだと整備済み品が半額以下の価格で指定可能なので、日本も整備済み品が選べるようになっていればいいのにとは思いました。外に設置するものなので多少汚れていようがあんまり気にしませんが、気になる方は要注意です。

同梱物は以下の通りです。
・ACケーブル（日本のコンセントで使用可能です）
・Stalink（アンテナ部分です）
・Starlinkとルータの接続ケーブル
・ルータ（Stalinkと接続するルータです。WiFi機能も搭載しています）

接続イメージは以下の通りです。
・Starlinkとルータは有線接続
・ルータにはLANポートが搭載。WiFiも飛びます。
・AC電源はルータに接続。Stalinkにはルータ経由で給電。
・Stalinkが衛星と接続した後はインターネット経由（Stalinkアプリ）で自宅のStalinkをリモート操作可能

．![IMG_0006.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995557/f6ee1bc1-2041-080e-1bb3-c4bd502071c6.jpeg)

設置方法はStalinkアプリをスマホにダウンロードし、ガイドに従って設置すれば完了です。
電源を入れた後、初期セットアップを完了させるためにアプリをインストールしたスマホでルータのアクセスポイントに無線接続するように促されます。しかし、私の環境ではルータの起動直後だとアクセスポイントに接続してもルータに接続したとアプリからうまく認識されず、時間をおいて試したり、再起動したりしたらうまく接続できるようになりました。

スマホとルータが接続され、Stalinkまで接続されると後は衛星からの受信状況を自動的にチェックし始めます。チェックが始まってから私の環境では1時間ほどかかってようやく衛星と通信されるようになりました。Stalinkのアップデートのダウンロードも始まりましたが、2時間経っても9％しか進まず、ネットワークの診断結果もpingの損失率が95%という状態で残念ながら使い物になりませんでした。

## 設置場所の改善
何種類かのマウントキットが公式ショップから入手可能です。こちらも返品可能なので、同時に準備した方が良いと思います。
設置業者の方に相談しましたが、集合住宅で最上階かルーフバルコニー等がないと厳しい感じでした。また、基本的に北側から受信するそうなので、南むきのベランダではほぼ受信できないようです。（業者は「Stalink マンション」のキーワード検索で上位に出てきた業者に相談しました）
また、配線をエアコンの配管から通すのが難しいから壁に穴を開けて配管を通す必要があるケースが多いそうです。賃貸だと完全にNGですし、分譲でも管理規約によってはNGなところもあるかと思います。

## 向いていない環境
まとめると以下の感じかと思います。
・（北向きの）空が開けていない場所
・室内で利用する場合、外壁に配管を通す工事ができない場所

## 返品
我が家の環境では使い物にならなかったので返品することにしました。
・Stalinkのサイトからログインして、サービスの管理画面からサービスのキャンセル
・キャンセル時にStalinkを返品するかどうかの選択肢がでる
・返品を選択すると、DHLの発送伝票が添付されたメールが送られてくるので、印刷してStalinkの梱包材に貼り付けて、最寄りのDHLへ持ち込み。集荷してくれないのと、DHLの営業所は国内配送業者と比較しても少なく、また車でしか行けないようなところばかりなので注意です。（公共交通機関で運ぶのは結構大変かと思います、持ち運べないほど重くはないですがサイズは大きいので）

## 感想
・アプリのユーザエクスペリエンスは非常に高い（勉強になる）
・カスタマーエクスペリエンスも高い（発送時のメール、返品対応の迅速さはストレスフリー）
・テスラのソリューション（Powerwallやテスラ車）と組み合わせれば上下水道以外の主要なインフラが整うのでこれによって助かる人は多いだろう
・Stalink miniも国内サービスが開始されたので、キャンプしながらワーケーションなどは捗りそう
GitHub Codespacesからqiita-cliをつかって記事を投稿

GitHub Codespacesからqiita-cliをつかって投稿してみました。

## きっかけ

先月、マナビDXクエストのアドベントカレンダー参加のためにQiitaデビューしました。  
初めて投稿した記事の内容が、AI開発の話題に少し触れているとはいえ、ほぼポエムでした。  
内容的にプログラムと関係ないと判断されてもおかしくないと思っています。

Qiitaの記事削除されたときのためにバックアップしたくなり、やり方を調べた所 qiita-cliの存在を知りました。

## やったこと

1. プライベートリポジトリを作成
1. GitHub Codespacesにqiita-cliをインストールしてログイン 
   https://github.com/increments/qiita-cli
1. `npx qiita pull`で記事データをダウンロード
1. `npx qiita new <記事タイトル>`で新規記事ファイル作成
1. 作成されたファイルの内容を書き換え
1. `npx qiita publish <記事タイトル>`で投稿

## 気づいたこと

`npx qiita preview` でプレビューするとき、転送されたポートをブラウザで開くとうまく表示されない(真っ白になる)  
エディターでのプレビューだとうまく表示される
shadcn/uiで簡単にダークモード対応をする

# 概要
shadcn/uiではダークモード対応のために手順が用意されています。

https://ui.shadcn.com/docs/dark-mode

しかし、上記手順は少々複雑です。システム設定を反映させるだけならもっと簡単な方法があったのでメモします。

以下はremixの場合ですが、他のフレームワークでも使えるかもしれないです。

# 手順

## 1. CSS変更
`app/tailwind.css`の
```
.dark {
  ...
}
```
を
```
@media (prefers-color-scheme: dark) {
  :root {
    ...
  }
}
```
に書き換える。

## 2. tailwind設定変更
`tailwind.config.ts`で、以下をコメントアウト。
```
// darkMode: ["class"],
```
もしくは以下に変更。
```
darkMode: ["media"],
```

# ソース
https://github.com/shadcn-ui/ui/issues/1125
文字列を()内のものを除き,で分割する

どんな場合でも使える方法ではないですが。


```java
// これを
final String sqlBlock = "a.hoge=:hoge, a.moge=:moge, b.foo=IFNULL(a.foo, 'xxx')";
// このパーツに分解したい
// "a.hoge=:hoge"
// "a.moge=:moge"
// "b.foo=IFNULL(a.foo, 'xxx')"
```

単に `sqlBlock.split(",")` でやってしまうと `"b.foo=IFNULL(a.foo,"`  と `" 'xxx')"` に分割されてしまって悲しい。

正規表現の否定後読みを使って

```java
sqlBlock.split("(?<!\([a-zA-Z.]+), ");
```

これでなんとかなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27987/769a5111-f59a-b19d-1bb0-f1fc0022d47c.png)
Windows環境にWSLを立ち上げる自分的簡易メモ

## :sailboat: この記事の目的
Windows環境でWSLを複数立ち上げたり、削除したりする際のコマンドのメモです。
詳しい解説はありません。必要事項のみ記載します。

## :sailboat: Ubuntuイメージのダウンロードサイト

以下からWSL向けのtar.gzファイルを取得する。

Ubuntu WSL Images
https://cloud-images.ubuntu.com/wsl/

## :sailboat: 実行コマンド集

#### 現存のWSL環境を確認
```
wsl -l -v
```

#### WSLイメージファイルを取得
※PowerShellで実行

`curl <ネット上のファイル名> -outfile <ローカルの保存先ファイル名>`

実行例
```
curl "https://cloud-images.ubuntu.com/releases/focal/release-20221018/ubuntu-20.04-server-cloudimg-amd64-wsl.rootfs.tar.gz" -OutFile "c:\ubuntu-20.04-server-cloudimg-amd64-wsl.rootfs.tar.gz"
```

#### インポート
コマンド例
`wsl --import <環境名> <展開先フォルダ名> <イメージファイル名>`
　・環境名 = "wsl -l -v"コマンドでWSLの一覧に表示される名前
　・展開先フォルダ名 = この中にext4.vhdxファイルが作成される

```
wsl --import ubuntu_new "c:\ubuntu_new" "c:\ubuntu-20.04-server-cloudimg-amd64-wsl.rootfs.tar.gz"
```

#### 作成後の確認
```
wsl -l -v
```

#### 実行
```
wsl -d <環境名>
```

#### 削除
```
wsl --unregister <環境名>
```

#### Ubuntu内にユーザを追加
以下はUbuntu内、rootユーザで作業
```
useradd -m -G sudo -s /bin/bash (username)
sudo passwd (username)
echo -e "[user]\ndefault=(username)"
cat /etc/wsl.conf
exit
```

#### 確認
停止
```
wsl -t <環境名>
```
開始
```
wsl -d <環境名>
```

以上

:paperclip: 参考サイト
WSLにまっさらな新規のUbuntu環境をつくる
https://goodbyegangster.hatenablog.com/entry/2022/10/25/015309
WindowsForm C# DataGridViewでFullRowSelectの使用方法

この記事は、WindowsフォームのDataGridViewでセルをクリックした際に行全体を選択する方法について説明です。DataGridViewの選択モードをFullRowSelectに設定すると、列ヘッダーに不要な選択背景色が表示されてしまうので以下の通り対応しました。

## DataGridViewのデフォルト表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951101/59e8029f-50b8-0558-c303-97e61b360630.png)

以下のCellPaintingイベントでコードを追加して、DataGridViewで行を選択したときに列ヘッダーに選択色が表示されないようにしました。

```ruby:TestForm.cs
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WinFormsDemo.Forms
{
    public partial class TestForm : Form
    {
        public TestForm()
        {
            InitializeComponent();
        }

        private void TestForm_Load(object sender, EventArgs e)
        {
            // DataGridView に列を追加
            dataGridView2.Columns.Add("Id", "ID");       // ID 用の列を追加
            dataGridView2.Columns.Add("Name", "名前");    // 名前用の列を追加
            // DataGridView の列を DataGridView の全幅に合わせてサイズ変更
            dataGridView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            // DataGridViewの選択モードをFullRowSelectに設定する
            dataGridView2.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            // DataGridView に行を追加
            dataGridView2.Rows.Add("1", "たなか");
            dataGridView2.Rows.Add("2", "しまだ");
            dataGridView2.Rows.Add("3", "太郎");
            dataGridView2.Rows.Add("4", "れいな");
        }

        private void dataGridView2_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            // 列ヘッダー行の選択色を防止
            if (e.RowIndex == -1 && e.ColumnIndex >= 0)
            {
                e.Handled = true;
                // 列ヘッダーの背景色を塗る
                using (Brush headerBrush = new SolidBrush(dataGridView2.ColumnHeadersDefaultCellStyle.BackColor))
                {
                    e.Graphics.FillRectangle(headerBrush, e.CellBounds);
                }
                // 列ヘッダーのテキストを描画
                TextRenderer.DrawText(
                    e.Graphics,
                    e.Value?.ToString(),
                    e.CellStyle.Font,
                    e.CellBounds,
                    dataGridView2.ColumnHeadersDefaultCellStyle.ForeColor,
                    TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter
                );
                // ヘッダーセルの周りにデフォルトの枠線スタイルを描画
                ControlPaint.DrawBorder(
                    e.Graphics,
                    e.CellBounds,
                    dataGridView2.GridColor, // 枠線の色
                    ButtonBorderStyle.Solid // 枠線スタイル
                );
            }
        }

        private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                textBoxId.Text = dataGridView2.Rows[e.RowIndex].Cells["Id"].Value.ToString();
                textBoxName.Text = dataGridView2.Rows[e.RowIndex].Cells["Name"].Value.ToString();
            }
        }
    }
}
```
## 修正した後DataGridViewの表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951101/846c711a-6211-6a13-42ea-63064c4ed018.png)
\:kissing_closed_eyes: ☆☆☆
push_swap MoriP Sort 42Tokyo＃1


## はじめに
Hello world、2024年10月入学のMoriPです。
今回生まれて初めて記事を書くので、話があっちこっちするかもしれませんが、よかったら最後まで読んでください！

今回は、レビューや友人から好評だったpush_swap（以下プッスワ）のソートアルゴリズムについて紹介させていただきます。基数ソートより簡単で、100点（本人96点）も狙えるので、初心者救済のソートとして多くの人に知ってもらえると嬉しいです！

その名も「MoriP Sort」です！

## MoriP Sortとは
チャンク（塊）に分けて処理を行うソートアルゴリズムです。

### アルゴリズムの概要
1. データをチャンクに分割
2. チャンクの範囲内の要素を探して送る
3. そのチャンクに該当する要素がなくなったら次のチャンクへ
4. これを要素がなくなるまで繰り返す

### 具体例
以下の説明は座標圧縮後の値で進めます
座標圧縮は[こちら](https://qiita.com/_ken_/items/7d5a955eaf362ccf1dc6)から

例えば、ランダムに100個並んだ配列を5つのチャンクに分ける場合：
- チャンクサイズ：各20個
- 範囲区分：
  - チャンク1：1〜20
  - チャンク2：21〜40
  - チャンク3：41〜60
  - チャンク4：61〜80
  - チャンク5：81〜100

処理の流れ：
1. スタックAから最初のチャンク(1〜20)に該当する要素を探す
2. 見つかった要素をスタックBにプッシュ
3. 最初のチャンクの要素がなくなったら次のチャンク(21〜40)へ移動
4. これを最後まで繰り返す

#### 処理フロー前半
![MoriP Sort 処理フロー（前半）](https://raw.githubusercontent.com/MoriP-K/images/refs/heads/main/chunk-sort-part1.svg)

#### 処理フローの前半
![MoriP Sort 処理フロー（後半）](https://raw.githubusercontent.com/MoriP-K/images/refs/heads/main/chunk-sort-part2.svg)

## 実装の流れ

### 1. 構造体の初期化
- スタックA
- スタックB
- コマンド出力用リスト

### 2. 引数のエラー処理
- 数字と文字の混合チェック
- 記号のみの引数チェック
- その他無効な入力の検証

### 3. 座標圧縮
引数の値を0から始まる連続した数値に変換します。

### 4. ソート処理
- 3〜5個の引数：最適化されたソート
- 6個以上：MoriP Sortを実行

### 5. コマンド出力
- コマンド実行時にリストを作成
- 実行した各コマンド（raなど）をデータとしてリストに保存
- 最後にraやrbが続いていたらそれらのコマンドを圧縮して出力

### 6. メモリの解放
- mallocで確保したメモリを適切にfree
- いろんな入力パターンでメモリリークをチェック​​​​​​​​​​​​​​​​

## まずはソートできる関数を作る
- スタックAからスタックBへ
スタックAの最小値を持つインデックスを探し、スタックの真ん中より上か下にあるかどうかでra, rraをしスタックA[0]に移動させる
　
- スタックBからスタックAへ
スタックAとは逆に、最大値を持つインデックスを探し、同じくスタックB[0]に移動させる

スタックA、Bを往復するソートができます。
このままだと操作回数がどえらいことになりますが、これにさっき話したチャンクのロジックを追加すればMoriP Sortになります。
最大値、最小値を探す関数を作るのがキモです。

## テスト結果
### 引数サイズ: 100
```zsh
❯ python3 push_swap_tester.py -l 100 -c 100
Test 100 cases: arg_length=100 range=(-2147483648, 2147483647)
....................................................................................................
---- Result ----
max   : 661
median: 622
min   : 577
See result.log for details
```
### 引数サイズ: 500
```zsh
❯ python3 push_swap_tester.py -l 500 -c 100
Test 100 cases: arg_length=500 range=(-2147483648, 2147483647)
....................................................................................................
---- Result ----
max   : 5773
median: 5574
min   : 5360

```


引数が500のときはあと少し最適化すれば5500を切って満点でしたが、先に課題を進めるために一旦スキップして提出しました。
工夫した点としては、pbするときにその値がそのチャンクの中央値より大きいか小さいかでpbした後raするかどうか判定していました。またpaするときにの最大値と最大値 −１を探して近い方をpaすることでコマンドの実行回数を減らせるようにしました。
Visualizerしたやつです。

![MoriP Sort Visualizer](https://github.com/MoriP-K/images/blob/main/push_swap.png?raw=true)


## MoriP Sortの背景
現在巷では、プッスワの課題を基数ソートが推奨されていますが、84点程度しか取れないとのこと。アルゴリズム未経験の私は「リスト？配列っしょ！」と思いながら、100点を取ってやる！と心の中で叫びながら取り組みました。

今回の実装では配列を使用しましたが（コマンド出力にリストを使用）、友人は双方向循環リストで100点を獲得しました。つまり、配列・リストどちらでも高得点が可能です！


## 最後に

うまく説明できたかわかりませんが、ここで言語化された説明をコードで書けるあなたは何も問題ないでしょう！
よくわかっていない、そこのあなた！もっと詳しく聞きたかったらMoriPを探して42を駆け回ってください。丁寧に説明します！
それか強強の友だちにたくさん聞きましょう！
42の課題もまだまだ序盤です。これからも一緒に頑張っていきましょう！！


## tester || visualizer
https://github.com/nafuka11/push_swap_tester

https://github.com/o-reo/push_swap_visualizer
【イベントレポート】ITネタ・自動化ネタ｜ライトニングトーク大会！～初参加者大歓迎～ #RPALT

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

今回は2025.01.28に開催した**ITネタ・自動化ネタ｜ライトニングトーク大会！～初参加者大歓迎～**へ参加＋登壇しましたので、アウトプットとしてイベントレポートを執筆いたしました。

初学者でもサクッと読めるように平易な表現で執筆しておりますので、お気軽に読んでいただければ幸いです。

:::note info
誤字脱字、分かりづらい表現などは極力なくすように心がけていますが、リアルタイムで執筆しているため、誤字脱字があるかもしれません。
:::

:::note info
私の登壇セクションに関してはいったん省かせていただきます。
（別途、ブログを執筆するかもしれませんが）
:::

#### イベントページ

https://rpacommunity.connpass.com/event/343151/

# 目次
- イベント概要（Connpassより抜粋）
- LT
    - ChatGPTにテストデータを作ってもらう～UiPathをセコセコ操って...～
    - Tango で手順書作成を半自動化しよう！
    - パン屋さんからIT転職したわけ
    - ChatGPTにPower Platformの勉強を手伝ってもらおう
- まとめ

## イベント概要（Connpassより抜粋）
>IT活用や自動化が好きな人たちが集まって各々の取り組み・技・Tipsをライトニングトーク（プレゼン）するイベント！みなさん、一緒に楽しく情報収集＆学びましょう！
オンラインでの開催です。

次のような方におすすめのイベントとなっております。
- IT活用や自動化ネタを楽しく学びたい
- 様々なメンバーの話を聞いて楽しみたい
- 自動化やIT活用に取り組む仲間と出会いたい
- 自動化やIT活用にちょっと興味があるのでゆるく参加したい

## LT

### ChatGPTにテストデータを作ってもらう～UiPathをセコセコ操って...～
- UiPathのテスト系アクティビティ
    - テストデータ生成にChatGPTを活用してみたら工数削減できそう
- ChatGPTに任せてみた
    - 住所データなど難しいデータも生成してくれる
    - 必ずしも求めているデータが出るわけではないためチェックが必要
    - UiPathを利用してデータ加工すればいい感じになる
- ChatGPTからUiPath用にデータ取得する
    - インデックス情報など余計なデータが含まれるためいい感じに取り扱えない
    - 新しいチャットなどの工夫を行えば、いい感じになる
- まとめ
    - ChatGPTの精度は無料版だとそこまで
    - お金がなくても工夫次第でいい感じで処理できる
    - Web処理に関しては大変

### Tango で手順書作成を半自動化しよう！
- 自己紹介
    - RPA LTのLT支部運営の方
    - Power Automate Web支部運営も担当されている
- Tangoとは
    - Google Chromeの拡張機能
    - 取得したキャプチャデータを加工する機能
- 観劇アプリでのデモ
    - 動画形式でキャプチャが行える
    - 加工もTango内で行えるため簡単にマニュアル用画像を生成できる
    - マークダウン方式もフォローしているためQiitaなどのブログでも利用可能
- その他
    - データに関してはTango用のクラウドに保管されるため社外秘データは注意が必要
    - 個人利用で利用するのがベター

### パン屋さんからIT転職したわけ
- 自己紹介
    - 渋谷のコミュニティスペースのマネージャー
    - 前職はパン屋さん（知っているパンは何でも作れる）
        - 製造だけでなくマーケティングも担当している
- パン屋さんの一日
    - パンを製造するまでの工程はあまたある
    - 朝が早い、物価高などがありしんどさを感じていた
    - ITを活用すれば業務改善できると思いジョブチェンジを行った
- パン屋さんのDX
    - 関係者全員が協力することでDX推進を行っていけると考えている
    - 現場とIT部門の橋渡しを行っていける人材が求められると思っている

### ChatGPTにPower Platformの勉強を手伝ってもらおう

#### わたるふさんブログ

https://wataruf.hatenablog.com/entry/2024/12/08/000000

https://wataruf.hatenablog.com/entry/2024/12/12/000000

https://wataruf.hatenablog.com/entry/2024/12/23/000000

- 自己紹介
    - マイクロ製品に携わっている方
    - 今はPower Automateに興味を持っている
- 内容
    - Power Platformの学習としてChatGPTを利用した
- 利用イメージ
    - ChatGPTに1問1答を試してみた
        - 逆質問を活用したプロンプトを利用した
        - 誤答した問題を再出題、フォローアップメッセージの設定なども行ってくれる
        - 指示方法によって様々な出題形式に対応してくれる
        - 応用的な問題も生成してくれる
            - トラブルシューティング問題も作ってくれる
- ロールプレイング形式の問題
    - 個人的記憶を踏まえたプロンプトを入れることでいい感じのロールプレイング形式の問題を生成してくれる
    - 追加問題を生成する場合は登場人物になりきってプロンプトを入れることで生成してくれる
- まとめ
- ChatGPTと感想戦を行ってみる
    - 質問の質を改善させるためには試行錯誤が必要
    - 将棋や囲碁で用いている**感想戦（ふりかえり）**を用いることで、より簡単に適切な質問を生成してくれる
- まとめ
    - ChatGPTとのやりとりを活用すればいい感じの文章生成を行ってくれる

## まとめ

登壇者の方のお話を聞いて、**RPAの使い方、ChatGPTの使い方にはまだまだ余地がある**と思いました。そのうえで、今後もLT登壇を積極的に行っていきたいと思いました！！

最後まで記事を読んでいただきありがとうございました👍

PS：
私の登壇資料は以下になります～
最後の雑談トークは面白かったです～

https://speakerdeck.com/masakiokuda/power-automate-plus-chatgptwoshi-tuteenziniajiao-yu-wogai-shan-sitemita-number-rpalt
pythonのイテレーターとnext() 備忘録


# Pythonのイテレータと`next()`の使い方を詳しく解説！

Pythonでデータ処理を行う際に頻繁に登場する「**イテレータ（Iterator）**」について、しっかり理解できていますか？この記事では、イテレータと、それを操作するための関数である`next()`について詳しく解説します。

---

## **イテレータとは？**

イテレータは、**「一度に一つずつ値を取り出せるオブジェクト」**です。イテレータを使うと、巨大なデータセットをメモリを節約しながら処理することができます。

具体的には、以下の2つの条件を満たすオブジェクトがイテレータと呼ばれます：
1. **`__iter__()`メソッドを持つ**  
2. **`__next__()`メソッドを持つ**

これらのメソッドによって、イテレータは次の要素を順番に取り出すことができます。

---

## **イテラブルとイテレータの違い**

Pythonでは、リストやタプル、文字列なども「反復可能（イテラブル）」なオブジェクトですが、これらは**イテレータそのものではありません**。  
イテラブルを`iter()`関数に渡すことで、イテレータを生成できます。

例：
```python
# リストはイテラブル（iterable）
my_list = [1, 2, 3]

# イテレータを生成
my_iterator = iter(my_list)

print(next(my_iterator))  # 出力: 1
print(next(my_iterator))  # 出力: 2
print(next(my_iterator))  # 出力: 3
```

### **ポイント**
- イテラブル: 繰り返し処理が可能だが、直接`next()`を使えない。
- イテレータ: イテラブルから生成され、`next()`で要素を一つずつ取り出せる。

---

## **`next()`関数について**

`next()`はイテレータから**次の要素を取得**するための組み込み関数です。

基本的な使い方：
```python
# イテレータの作成
my_iterator = iter([10, 20, 30])

# 次の要素を取得
print(next(my_iterator))  # 出力: 10
print(next(my_iterator))  # 出力: 20
print(next(my_iterator))  # 出力: 30
```

### **StopIteration例外**
イテレータの要素をすべて取得した後に`next()`を呼び出すと、`StopIteration`例外が発生します。

例：
```python
my_iterator = iter([1, 2])

print(next(my_iterator))  # 出力: 1
print(next(my_iterator))  # 出力: 2
print(next(my_iterator))  # StopIteration例外
```

エラーを防ぎたい場合は、`next()`の第2引数を使うことで、デフォルト値を指定できます：
```python
my_iterator = iter([1, 2])

print(next(my_iterator, "デフォルト値"))  # 出力: 1
print(next(my_iterator, "デフォルト値"))  # 出力: 2
print(next(my_iterator, "デフォルト値"))  # 出力: デフォルト値
```

---

## **カスタムイテレータの作成**

Pythonでは、自分でイテレータを作成することも可能です。以下は、1から指定された値までカウントするイテレータの例です：

```python
class Counter:
    def __init__(self, max_count):
        self.current = 1
        self.max_count = max_count

    def __iter__(self):
        return self

    def __next__(self):
        if self.current > self.max_count:
            raise StopIteration
        result = self.current
        self.current += 1
        return result

# イテレータの使用
counter = Counter(5)
for num in counter:
    print(num)  # 出力: 1, 2, 3, 4, 5
```

---

## **イテレータを使うメリット**

1. **メモリ効率が良い**  
   イテレータは必要なときにだけデータを生成するので、メモリ使用量を抑えられます。

2. **無限のデータ処理が可能**  
   イテレータは終了条件を持たない無限のシーケンスも表現できます。

例：無限の偶数を生成するイテレータ
```python
def infinite_even_numbers():
    n = 0
    while True:
        yield n
        n += 2

evens = infinite_even_numbers()
print(next(evens))  # 出力: 0
print(next(evens))  # 出力: 2
print(next(evens))  # 出力: 4
```

---

## **まとめ**

- イテレータは、一度に一つの要素を取り出すオブジェクト。
- `next()`を使って、イテレータから次の要素を取得できる。
- カスタムイテレータを作成して柔軟なデータ処理が可能。

イテレータの概念を理解すれば、Pythonのコードがさらに効率的に書けるようになります。ぜひ試してみてください！
Mysql2::Error: Can't connect to local MySQL server through socket

awsのecsを利用して、コンテナ間通信でmysqlへアクセスしようとしたところ事象が発生


タスク内のコンテナ：
DBコンテナ(Mysql)、APPコンテナ(Rails)

エラー内容：
APPコンテナを起動する際、entrypoint.shにて rails db:create をしようとしたところエラー

結論：
DBコンテナの起動をした後、コンテナ内のMysqlサーバが起動する前に、Railsアプリの初期化処理（rails db:createなど）が動いていたことで、エラーが発生（mysqlが起動する前にRailsがソケットファイルを利用してmysqlへ接続しようとしていた）

前提条件：
database.ymlのソケットファイル名およびホスト名を正しいものを設定しておく
ソケットファイル名はDBコンテナにログインして確認。ホスト名はAPPコンテナにログインし、ローカル環境でDBにアクセス可能なポートが入っているIPまたはホスト名を指定（今回は　127.0.0.1 を指定）

やること：
dbコンテナの起動およびmysqlサーバが起動したことを確認してから（DBコンテナのヘルスチェックを行う）、railsアプリを起動するようにしてあげる

方法：
1. aws ecsのタスク定義からAPPコンテナの設定箇所にスタートアップの依存関係の順序を指定する。（条件はHealthyにする）
![スクリーンショット 2025-01-28 20.40.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447864/09f3139c-4dd2-5e3b-ad8a-d63ffd3dbcdf.png)
2. DBコンテナのヘルスチェックを追加する（mysqlの起動ができたことを確認する）
![スクリーンショット 2025-01-28 20.42.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447864/50b8879e-2619-77fa-9148-e7c15d62251d.png)

上記を行い、再デプロイしたところ無事にAPPコンテナで rails db:create　が成功するようになりました

殴り書きですみません。
031 AI屋さんの　LLMに200万トークン全文入力　Flask＋Gemini　実践編




031 AI屋さんの　LLMに200万トークン全文入力　Flask＋Gemini　実践編

ようやく、整いました。
内容的には、第一回の　吾輩は猫である　の内容と同等です。
一周回って戻って来ました。


これで　Gemini　に全文入力できます。
前回との差分は、雛形をベースに

　１、app.py　にGeminiをちょい足ししました。
　２、Dockerfile　にライブラリもちょい足ししました。
　３、追加学習用の資料を、思いっきり足します。

Gemini のプログラムは、ここから
ソースコードとAPI KEY(token)を　入手します。

https://aistudio.google.com/prompts/new_chat

![スクリーンショット 2025-01-30 21.11.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/61931bbe-9636-ee45-3133-9d3d42623991.png)





![スクリーンショット 2025-01-28 20.44.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/eda22d7b-1a2c-2e72-0b19-c80531b7b0a5.png)



作ったものは、webAPIです（webアプリではないです）が、
HTMLもCSSも　LLMに直接書いてもらいます。
すると、ブラウザで開いても　それっぽく表示されます。
いいのか、こんなので



![スクリーンショット 2025-01-28 20.19.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/e5805584-d2f8-e1fb-3a57-1b2f9dafed4e.png)



---

ソースコードは、こちら


https://st.bono0.com/gemini-flask001

![スクリーンショット 2025-01-28 20.41.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/b8b419ed-0090-1b15-c433-df719b70d808.png)


![スクリーンショット 2025-01-28 20.51.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/2dc876aa-24cc-d9d7-4611-bc86c353e81b.png)


---






目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7


今回は、２００万トークン全文入力まで　行けましたね。

　031 AI屋さんの　LLMに200万トークン全文入力　Flask＋Gemini　実践編

完成です。おめでとうございます。


ー続くー
データ基盤構築の案件に取り組んだ体験記

# はじめに
今回は受託系開発企業でデータ基盤構築の案件に参画時の話です。プロジェクトの概要や取り組み、得られた知見を共有し、同様の業務に関心のある方々に少しでも参考になる内容をお届けできればと思います。

# 案件に入った経緯
もともと、受注前の調査に参加しており、受注が決まったことでプロジェクトメンバーの一員として参画することになりました。

# 案件で行ったこと
今回は要件定義には参加せず、基本設計から開発まで担当しました。データベースにはOracleを使用し、PL/SQLを利用して毎日データを統合するシステムの作成を行いました。

# 案件でよかったこと
SQLの知識が大いに身についたことが、今回の案件で最も良かった点だと思います。具体的には、以下のようなスキルを習得できました。

- WITH句を使った可読性重視のSQL開発
- パフォーマンスを意識したインデックスの活用
- トラブルシューティング時のエラーログ解析

社会人になってから、これほどまでにSQLに触れる機会は初めてで、その結果知識が定着したと感じています。単純にSQLを書くこと自体は、AIで調べれば簡単に答えを得ることができます。しかし、AIでは予測できないような考慮すべき要素が多く存在するため、それに対応するための工夫が求められます。このような知識を身につけることができたので、今回の案件では一番大きな収穫でした。

SQLに向き合った約2ヶ月間を振り返ると、まだまだ思考力が足りないと感じる部分もあり、今後は周囲の経験豊富なメンバーから学び、さらにスキルを向上させる必要があると認識しています。

# 案件でよくなかったこと
要件定義の内容が不十分だったことが、非常に大きな課題でした。要件定義を担当したメンバーによると、データ構造の把握が全くなされておらず、「データが収集できているから大丈夫」という雰囲気で要件定義が終了してしまいました。

その結果、第一正規化もされていないデータが大量に存在しており、開発が大幅に遅延しました。また、先方から提供される予定だったサンプルデータが2週間遅れで届いたため、プロジェクトの進行にも大きな影響を与えました。

ただし、先方の納期遅れもあり、納期が若干延長されたため、最終的には無事納品できました。この点については、開発メンバー全員が協力して解決した結果だと思います。大変嬉しく感じています。

# 最後に
今回参加した案件は、引き続き進行中であり、プロジェクトは第二フェーズに移行するみたいです。私自身は別プロジェクトのアサインのため今回限りで完結しましたが、続けていくメンバーのサポートは怠らないようにしようと思っています。
個人的な備忘録：AWSが提供するRoute 53やルーティングの種類、ネームサーバーについて体系的にまとめてみた

## はじめに

Route 53は、AWS環境内外のリソースを効率的に管理し、高可用性・スケーラブルなDNSサービスを提供します。

:::note info
**小規模なアプリからグローバル規模のウェブサービスまで、幅広いユースケースに対応できる強力なツールです。**
:::

この記事は自分の備忘録を中心にまとめた内容です。***温かい目で読んでいただけると幸いです。***

## Route 53とは？
Route 53は、AWSが提供するスケーラブルで高可用性のDNS（Domain Name System）サービスです。

このサービスでは以下の3つの主要機能を提供し、ウェブアプリケーションやサービスの名前解決を簡単に管理できます。

- **ドメインの登録**
- **DNSルーティング**
- **ヘルスチェック**

## Route 53のすごいところ
Route 53の魅力を簡単にまとめると、以下になります。

:::note warn
- **信頼性**  
  AWSのインフラ上で動作し、高い可用性を提供。

- **スケーラビリティ**  
  大規模なトラフィックにも対応可能。

- **シンプルな操作性**  
  コンソールやCLIを使った簡単な設定。

- **コスト効率**  
  必要な分だけ課金される従量課金制。
:::

## DNSルーティングとは
DNSルーティングは、ドメイン名をIPアドレスや他のリソースに解決する仕組みのことです。

:::note info
**これにより、ユーザーが「**example.com**」のような分かりやすいドメイン名を入力するだけで、適切なIPアドレスやリソースに接続できるようになります。**
:::

***結果として、複雑なIPアドレスを覚える必要がなく、利便性が向上します。***

**シンプルルーティング**
  - **概要**: 最も基本的なルーティング方式です。1つのドメイン名に対して1つのIPアドレスやリソースを関連付けます。
  - **利用例**: 小規模なウェブサイトや単一のサーバーを持つ場合に使用。
  - **特徴**:
    - 設定がシンプルで簡単。
    - 複数のルートを提供する必要がない場合に適している。

**レイテンシールーティング**
  - **概要**: ユーザーとサーバーの間のネットワーク遅延（レイテンシー）が最も低いリソースにルーティングします。
  - **利用例**: グローバルに分散したユーザーに対して、最も近いデータセンターを選択して応答時間を最小化する場合。
  - **特徴**:
    - レイテンシーを測定して最適なリソースを選択。
    - ユーザー体験の向上に貢献。

**フェイルオーバールーティング**
  - **概要**: プライマリリソースが利用できない場合にバックアップリソースへルーティングを切り替えます。
  - **利用例**: 高可用性が求められるアプリケーションやウェブサービス。
  - **特徴**:
    - プライマリがダウンしている場合、自動的にバックアップへ切り替え。
    - ユーザーのダウンタイムを最小限に抑える。

**加重ルーティング**
  - **概要**: 複数のリソースに対して、トラフィックの分散割合を指定します。指定した加重値に基づき、リソースにルーティングされます。
  - **利用例**: トラフィックの分散テストやリソースの負荷分散を行いたい場合。
  - **特徴**:
    - 各リソースに比率（例: 50:50や80:20など）を設定可能。
    - サーバーの負荷を柔軟に分散できる。

## NSレコードをお名前.comに登録する意味

### ドメイン名をRoute 53のDNSに接続する

ドメインを購入しただけでは、どのDNSサービスがそのドメインを管理するかは決まっていません。

:::note warn
***Amazon Route 53で作成したホストゾーンのNSレコードをお名前.comに登録することで、「**このドメインのDNS管理はRoute 53で行う**」という指定が可能になります。***
:::

NSレコードを登録することで、ドメインに対するすべてのDNSクエリがAmazon Route 53に送られるようになります。

### Route 53で高度なDNS管理を行うため

Route 53はお名前.comよりも柔軟で強力なDNS設定機能を提供します。

* **高度なポリシー:**
    * レイテンシールーティング
    * 加重ルーティング
    * 地理的ルーティングなど

***NSレコードをお名前.comに登録することで、これらの高度なルーティング機能を活用し、柔軟なDNS管理が可能になります。***

## まとめ
最後までお読みいただき、ありがとうございました。

:::note info
**今回は基礎的な内容ではありますが、Route53について自分なりに整理し、言語化することで理解を深めることができました。**
:::

***これからも、このような基本的な内容を丁寧にまとめ、知識を定着させていきたいと思います。***
.NETのお勉強3_mysqlコンテナと連携

# 概要
AmazonLinux2023インスタンス上にコンテナで.NETを利用したサーバをたてる
そのお勉強メモ3

mysqlコンテナと連携する

# 連携の前にmysqlコンテナ単体たてる
最低限がこんな感じ
データの永続化のためvolumesで外にも出す
``` docker-compose.mysql.yml
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: admin
    ports:
      - "3306:3306"
    volumes:
      - ./mysql:/var/lib/mysql
```
# テーブル作ってテストデータ入れとく
mysqlコンテナ内からcliでmysqlに入ってコマンド実行
```
CREATE TABLE example (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL);
INSERT INTO example (name) VALUES ('Tanaka'),('Sato'),('Yamada');
```

# ソース
``` src/Controller/MysqlController.cs
using Microsoft.AspNetCore.Mvc;
using MySql.Data.MySqlClient;

[ApiController]
[Route("[controller]")]
public class MysqlController : ControllerBase
{
    [HttpGet("{id}")]
    public IActionResult Get(int id)
    {
        string connectionString = "Server=mysql;Port=3306;Database=cs_test;User=user;Password=password;";
        var connection = new MySqlConnection(connectionString);
        connection.Open();

        string query = "SELECT name FROM example WHERE id = @id";
        var command = new MySqlCommand(query, connection);
        command.Parameters.AddWithValue("@id", id);
        var reader = command.ExecuteReader();

        string name = string.Empty;
        if (reader.Read()) {
            name = reader["name"].ToString();
        } else {
            return NotFound($"Not found! ID={id}");
        }

        return Content(name, "text/plain");
    }
}
```

``` src/MyServerApp.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="MySql.Data" Version="8.1.0" />
  </ItemGroup>
</Project>
```

``` docker-compose.hotload.yml
services:
  build:
    image: builder
    build:
      context: .
      dockerfile: Dockerfile.build
    volumes:
      - ./src:/src
    ports:
      - "80:8080"
    command: dotnet watch run --urls=http://0.0.0.0:8080
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: cs_test
    ports:
      - "3306:3306"
    volumes:
      - ./mysql:/var/lib/mysql
```

# 実行テスト
`xx.xx.xx.xx/mysql/1`アクセスで、Tanaka
`xx.xx.xx.xx/mysql/2`アクセスで、Sato
`xx.xx.xx.xx/mysql/3`アクセスで、Yamada
`xx.xx.xx.xx/mysql/4`アクセスで、Not found! ID=4
と画面表示されればok

# その他メモ
### IActionResult型
HTTP レスポンスを返すための抽象型
`return Ok(object) => 200レスポンス`
`return NotFound(string) => 404レスポンス`
`return BadRequest(string) => 400レスポンス`
等、柔軟に色々なレスポンスに対応している

### ルート定義
例えば
[HttpGet("{id}")]なら`xx.xx.xx.xx/mysql/{id}`のGET通信
[HttpGet("method_name")]なら`xx.xx.xx.xx/mysql/method_name`のGET通信
[HttpPost]なら`xx.xx.xx.xx/mysql`のPOST通信
git-ssh設定備忘録

# githubでの設定

## sshキーの設定
```
cd ~/.ssh
ssh-keygen
```

ただのファイル名なのでそのままEnterでOK
```
Enter file in which to save the key (/Users/UserName/.ssh/id_ed25519): 
```

ここで設定したパスワードが
githubへアクセスするパスワードになる(パスワードとしてsshの鍵が要求されるため)

```
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
```

```出力.txt
Your identification has been saved in /Users/UserName/.ssh/id_ed25519
Your public key has been saved in /Users/UserName/.ssh/id_ed25519.pub
```

ファイル名を変えた人は`id_ed25519`がその入力した名前になっています。
```
user_naeme/
　├ bin/
　├ .ssh/
　│　├ id_ed25519
　│　├ id_ed25519.pub #このpubの中身をgithubの設定欄に入力する
　│
```



## sshをgithubに入力する
githubの設定/access/sshの設定

# 毎回パスワードを打たなくて良くする設定


```
// SSH鍵をssh-agentに登録
ssh-add /Users/user_name/.ssh/id_ed25519
// ここでssh鍵のキーを入力する

// ssh
ssh-add --apple-use-keychain

// 登録されていることを確認する
ssh-add -l
```


### 補足
`--apple-use-keychain`
キーチェーンとして追加する
このオプションをつけないと再起動時に毎回ssh-addをしないといけなくなる
`-K`でも同じ意味を持つがmacOS Monterey (12.0)以降、Appleは古い-Kオプションを
**非推奨（deprecated）** として警告がですようになっている。


# 参考記事

https://qiita.com/litswd0211/items/70f8f9ae50f1b9e24dce
C#のWindowsFormでタブ追加風のデザインにしたい

# 1. はじめに
* 標準のタブコントロールを使用して、ブラウザのようなタブ追加のイメージに近づけたい
* Control.HandleCreatedイベントを使用してタブの横幅の最小サイズを変更したい

# 2. 開発環境
* C#
* .NET8
* Visual Studio 2022
* Windows 11

# 3. 画面イメージ
## 3.1. 変更前
* 標準のタブコントロールのままだとタブ追加(+)の横幅が大きくなってしまう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/b449e582-7d30-979e-d72a-9513ae3a8dd8.png)

## 3.2. 変更後
* タブの最小横幅を見直すことでブラウザに近いイメージになった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/d390c809-f104-68aa-fc98-bdbb2d055a45.png)

# 4. ソースコード
## 4.1. デザイナー
* タブコントロールにHandleCreatedイベントを追加する（最終行)
```Csharp:Form1.Designer.cs (抜粋)
    // 
    // tabControl1
    // 
    tabControl1.Controls.Add(tabPage1);
    tabControl1.Controls.Add(tabPage2);
    tabControl1.Controls.Add(tabPage3);
    tabControl1.Dock = DockStyle.Fill;
    tabControl1.Location = new Point(0, 0);
    tabControl1.Name = "tabControl1";
    tabControl1.Padding = new Point(16, 3);
    tabControl1.SelectedIndex = 0;
    tabControl1.Size = new Size(593, 378);
    tabControl1.TabIndex = 1;

    // HandleCreatedイベントを追加
    tabControl1.HandleCreated += TabControl1_HandleCreated;
```

## 4.2. Form
* HandleCreatedイベントを実装し、タブの最小横幅を16に変更する
* 実際のタブ追加の処理までは未実装のため、別途追加する必要がある
```CSharp:Form1.cs
using System.Runtime.InteropServices;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // タブのサイズを変更
            this.tabControl1.ItemSize = new Size(240, 40);
        }

        [DllImport("user32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
        private const int TCM_SETMINTABWIDTH = 0x1300 + 49;
        private void TabControl1_HandleCreated(object sender, EventArgs e)
        {
            SendMessage(tabControl1.Handle, TCM_SETMINTABWIDTH, IntPtr.Zero, (IntPtr)16);
        }
    }
}
```

# 5. 参考文献

https://stackoverflow.com/questions/36895089/tabcontrol-with-close-and-add-button

https://juejin.cn/post/7151429408271073310
LLMOpsって、なに？

近年、大規模言語モデル（LLM: Large Language Model）の活用が様々な業界で広がっています。しかし、これらのモデルを最大限に活用し、効率的に運用するためには「LLMOps（Large Language Model Operations）」が欠かせません。本記事では、LLMOpsの基本的な概念や重要性、さらにLLMを活用する企業や個人にも必要な理由について解説します。
※この記事は、ChatGPTの出力を基に作成しています。

---

### **LLMOpsとは？**
LLMOpsとは、**大規模言語モデルを開発・運用・改善するための技術やプロセスの集合体**です。具体的には以下の要素が含まれます：

1. **モデルの開発**  
   - 訓練データの収集・前処理
   - モデルのトレーニングやハイパーパラメータの最適化

2. **デプロイ（展開）**  
   - モデルを本番環境に導入し、APIとして提供する
   - リアルタイム処理やバッチ処理を最適化

3. **モニタリング**  
   - モデルの応答精度、速度、異常検出などを継続的に監視

4. **フィードバックループ**  
   - ユーザーやシステムのフィードバックをもとにモデルを改善

5. **スケーリング**  
   - 高トラフィックに対応するための動的リソース管理

6. **セキュリティと倫理**  
   - データプライバシー保護、モデルの公平性確保、不適切な応答の防止

LLMOpsはこれらのプロセスを通じて、LLMの性能を最大限に引き出しながら、運用効率や信頼性を高めます。

---

### **LLMOpsはLLM開発企業だけのもの？**
一見すると、LLMOpsはLLMを開発している企業だけが行うものと思われがちですが、実際には**LLMを活用する企業や個人にとっても非常に重要**です。その理由を以下で詳しく説明します。

---

### **LLMOpsが活用企業にも必要な理由**

#### **1. カスタマイズの必要性**
LLMをそのまま使うのではなく、自社の目的やサービスに適合させるためのカスタマイズが必要です。例えば：
- **ファインチューニング**: 自社のデータを使ってモデルを最適化。
- **プロンプトエンジニアリング**: 必要な応答を得るために効果的なプロンプトを設計。

これらの作業は、LLMを活用する上で欠かせないプロセスであり、LLMOpsの一部といえます。

---

#### **2. 運用・モニタリング**
LLMを業務で活用する際には、運用中の品質管理が重要です。
- **応答の品質監視**: 不適切な回答や誤解を招く応答の検出と改善。
- **パフォーマンス管理**: 応答速度やエラーの監視。
- **コスト管理**: LLMの推論には計算リソースが必要なため、効率的なリソース配分が求められる。

---

#### **3. スケーラビリティの確保**
小規模なプロジェクトでは問題にならなくても、ユーザーやデータが増加すると以下の対応が必要になります：
- リソースのスケールアップ（増加）/ダウン（削減）
- 高負荷環境下での性能維持（負荷テストの実施）

---

#### **4. セキュリティとコンプライアンス**
- **データプライバシーの保護**: モデルが扱うデータが機密情報や個人情報を含む場合、適切な保護対策が必須。
- **規制対応**: 地域や業界に応じた法律（例：GDPR）への準拠が求められる。

---

### **具体例**
LLMOpsがどのように役立つのか、以下の具体例で見てみましょう。

- **企業A（LLMを活用する企業）**  
  カスタマーサポート用にLLMを導入し、顧客データを基にモデルを微調整。さらに、モデルの応答を継続的にモニタリングし、品質改善を実施。

- **企業B（LLMを提供する企業）**  
  独自のLLMを開発し、顧客企業に提供。クライアントがLLMをスムーズに運用できるよう、技術サポートを通じてLLMOpsを支援。

---

### **まとめ**
LLMOpsは単にLLMを開発する企業だけが取り組むべきものではありません。**LLMを活用する企業や個人にとっても、モデルの品質維持、運用効率の向上、セキュリティ確保のために重要な取り組み**です。

LLMを導入しようと考えている企業は、LLMOpsの基本的な考え方を理解し、自社に適した運用体制を整えることが成功のカギとなります。
開発日記12日目：システムアーキテクチャ設計完了！Gunma Naviの全体像が見えてきました！🏗️✨

# 開発日記12日目：システムアーキテクチャ設計完了！Gunma Naviの全体像が見えてきました！🏗️✨

---

群馬県民がもっと地元イベントを楽しめるように！イベント発見アプリ「**Gunma Navi**」を個人開発している🐮です！

---

🎮 **今日達成した"ゲームで言うと"**

「世界地図を手に入れて、これから冒険の計画を立て始めた状態」🗺️🧭

---

🌟 **今日のハイライト**

✅ アプリケーション全体のシステムアーキテクチャを設計！

✅ フロントエンドとバックエンドの連携方法を決定！

✅ データの流れを明確化！

---

🛠 **今日の作業内容**

1. **アプリケーション全体の基本的なシステムアーキテクチャを設計**

   昨日までにデータベース設計が完了したので、今日はアプリ全体のシステムアーキテクチャを設計しました。

   - **技術スタックの再確認**

     - **フロントエンド**：ユーザーが直接触れる部分なので、**React Native**を使ってクロスプラットフォーム対応のモバイルアプリを開発します。

     - **バックエンド**：データの処理と提供を担う部分は、**Node.js**と**Express**でAPIサーバーを構築します。

     - **データベース**：非構造化データに柔軟な**MongoDB**を採用します。

   - **モジュールとコンポーネントの整理**

     - フロントエンドとバックエンドそれぞれで、機能ごとにモジュール化を進めます。

     - 認証、イベント管理、コメント機能などの主要コンポーネントを定義しました。

   - **システム全体像の図示**

     - システムアーキテクチャ図を作成し、各コンポーネントの関係性やデータの流れを視覚化しました。

2. **フロントエンドとバックエンドの連携方法やデータの流れを設計**

   - **APIエンドポイントの設計**

     - ユーザー認証関連：`/api/users/login`, `/api/users/register`

     - イベント取得関連：`/api/events`, `/api/events/:id`

     - コメント投稿関連：`/api/comments`, `/api/events/:id/comments`

   - **データのリクエストとレスポンス形式**

     - **JSON形式**を採用し、フロントエンドとバックエンド間のデータ通信を統一しました。

   - **認証・認可の方法**

     - **JWT（JSON Web Token）**によるトークン認証を採用し、セキュアなAPIアクセスを実現。

     - ユーザー情報の保護と、不正アクセス防止に配慮しました。

---

🔍 **システムアーキテクチャ設計のポイント**

1. **拡張性のある設計**

   - 将来的な機能追加を見据え、**モジュール化**と**疎結合**を意識。

   - フロントエンドではコンポーネントを再利用しやすいように設計。

2. **効率的なデータ通信**

   - 必要最低限のデータをやり取りし、通信量を削減。

   - **RESTful API**の原則に従い、シンプルで理解しやすいAPI設計。

3. **セキュリティへの配慮**

   - **HTTPS**通信と**JWT**による認証で、データの安全性を確保。

   - ユーザー情報やパスワードは暗号化して保存。

---

🗾 **群馬愛ある開発のこだわり**

「地元のイベント情報を素早く入手できるよう、**オフラインでも閲覧可能な設計**を検討中！  
電波状況が不安定な地域でも、群馬の魅力を存分に楽しんでもらいたいです📱✨」

---

💬 **読者のみなさんに質問！**

「アプリを使う上で、**データの反映速度**や**レスポンスの速さ**はどれくらい重要だと思いますか？  
皆さんが快適に使えるよう、ぜひご意見をお聞かせください！😊」

---

💡 **今日の気づきと学び**

**成功した点**

- **全体像の可視化**

  - システムアーキテクチャを図にすることで、今後の開発がスムーズになりそうです。

- **連携方法の明確化**

  - フロントエンドとバックエンドの役割分担と通信方法を詳細に決めたので、実装時の迷いが減りそうです。

**改善が必要な点**

- **APIの詳細設計**

  - エラーハンドリングやステータスコードの統一など、さらに細かい部分を詰める必要があります。

- **セキュリティ強化**

  - 認証・認可の仕組みをもう少し深掘りして、安全性を高める必要があります。

---

🚀 **次回予告：イベント情報の表示機能を実装！**

- **イベント一覧画面のUIを作成**し、見やすく使いやすいデザインを目指します。

- **バックエンドからイベントデータを取得**する処理を実装！

- いよいよアプリが動き始めます！楽しみです！🔥

---

✨ **今日のひとこと**

アプリの全体像がはっきりしてきて、開発がますます楽しくなってきました！  
頭の中で描いていたアイデアが形になり始める瞬間は、本当にワクワクしますね。  
引き続き、群馬の皆さんに喜んでもらえるアプリを目指して頑張ります！💪

---

最後までお読みいただきありがとうございます！

皆さんの応援やフィードバックが本当に励みになります。  
コメントやいいね、お待ちしています！😊

明日も引き続き頑張りますので、よろしくお願いします！では、また明日〜！👋
絵文字で変わる！エンジニアリングコミュニケーション術💬🔧

# エンジニアと絵文字：仕事を彩る小さなアイコンたち 🚀💻✨

エンジニアリングの世界では、コードや設計図の中に感情を込めることは難しいですが、絵文字という小さなアイコンがそのギャップを埋めてくれます。
絵文字は単なる装飾ではなく、コミュニケーションを豊かにし、同僚とのつながりを深める重要なツールとなっています。
本記事では、エンジニアと絵文字の関係を掘り下げ、そのユニークな活用法や面白いエピソードをご紹介します。

---

## **エンジニアが絵文字を使う理由 🛠️**

1. **感情の補完**  
   エンジニアのコミュニケーションはテキスト中心になりがちですが、絵文字を使うことで感情やニュアンスを伝えることができます。例えば、レビュー依頼に「🙏」を添えるだけで、丁寧さや感謝の気持ちが伝わります。

2. **視覚的な整理**  
   絵文字は情報を整理し、視覚的にわかりやすくする役割も果たします。「🐛」でバグ、「🚀」で新機能、「✅」でタスク完了など、プロジェクト管理ツールやSlackでの会話が一目で理解できるようになります。

3. **チーム文化の形成**  
   特定の絵文字をチーム内で共有することで、一体感やユーモアが生まれます。カスタム絵文字を作成する企業も多く、独自文化を築いている例もあります。

---

## **エンジニアがよく使う絵文字トップ10 🔝**

以下はエンジニアたちが日常的に活用する絵文字とその意味です[1][3][6]：

| 絵文字 | 意味と使い方                           |
|--------|-----------------------------------|
| 🐛     | バグ報告や修正時に使用               |
| 🚀     | 新機能のリリースやプロジェクト進捗     |
| 🔧     | 修正作業や調整                     |
| ✅     | タスク完了や確認済み                 |
| 🙏     | レビュー依頼や感謝の意を込めて         |
| 🎉     | 成功や達成を祝う場面                 |
| 💻     | プログラミング作業全般               |
| 🔒     | セキュリティ関連の変更               |
| ⚙️     | システム設定やメカニズム             |
| ✨     | 改善や特別な変更                     |

---

## **面白い絵文字活用事例 😄**

### **1. コミットメッセージでの活用**  
Gitコミットメッセージに絵文字を添えることで、一目で変更内容がわかるようになります。例えば：
- `🐛 Fix: 修正したバグ`
- `✨ Add: 新しい機能追加`
- `🎨 Refactor: コードの整理`

これにより、履歴が視覚的に整理され、チーム全体で統一感が生まれます。

### **2. Slackでのカスタム絵文字**  
Slackでは独自のカスタム絵文字を作成して楽しむ文化があります。例えば、「全裸待機」や「もう帰りたい♡」など、ユーモラスなカスタム絵文字が人気です。また、「名前印」のように投票や確認作業にも役立つ実用的な使い方もあります。

![絵文字.webp](https://uuuu.to/wp-content/uploads/2023/08/Slack2-1024x699.webp
)


### **3. ソフトウェアテスト専用絵文字**  
MagicPodでは「ソフトウェアテスト関係者しか使わない絵文字」を公開しています。「9割できてます」や「運用でカバー」といったユーモラスなものから、「テスト中」「バグ発見」など実務向けまで、多彩なラインナップがあります。

![絵文字.png](https://magicpod.com/acms-media/008/202205/mode3_w1920-2%E3%82%A2%E3%83%BC%E3%83%88%E3%83%9B%E3%82%99%E3%83%BC%E3%83%88%E3%82%99_1.png)


---

## **エンジニアと絵文字：ユーモアと効率性の融合 🤔✨**

エンジニアリングには真剣さが求められる一方で、ユーモアも欠かせません。以下はエンジニア特有のユーモラスな表現です：

- **🐛 バグ vs 機能**  
  「複雑なバグは機能と見分けがつかない」というジョークがあります。「これは仕様です」と言い張る場面で「♻️」などを使うと笑いが取れることも。
  

- **┻━┻ テーブルひっくり返し**  
  Rubyでは「❨╯°□°❩╯︵┻━┻」というメソッド名まで存在します。これはフラストレーションを表現するために使われるユーモラスな例です。

```ruby
# テーブルをひっくり返す（ジョーク的な意味で）
def ❨╯°□°❩╯︵┻━┻
  puts "落ち着いてください！テーブルを戻します。"
  puts "┬─┬ ノ( ゜-゜ノ)"
end

# メソッドを呼び出す
❨╯°□°❩╯︵┻━┻
```
実行結果
```ruby
落ち着いてください！テーブルを戻します。
┬─┬ ノ( ゜-゜ノ)
```

---

## **まとめ：小さなアイコンが生む大きな効果 🌟**

絵文字は単なる装飾ではなく、エンジニアの日常業務において重要な役割を果たしています。コミュニケーションを円滑にし、チーム文化を形成しつつ、時には笑いや親近感も生み出します。
次回SlackやGitHubでメッセージを書く際には、お気に入りの絵文字を添えてみてください。それだけで会話が少し楽しくなるかもしれませんよ！ 🎉
PythonでGmailを送信する方法【アプリパスワードを使ったSMTP設定】

### はじめに

PythonでGmailを送信する際、`smtplib` モジュールが便利です。この記事では、Googleアカウントのセキュリティを高めるために「アプリパスワード」を使用し、SMTP設定を行う方法を詳しく解説します。

### なぜアプリパスワードが必要なのか？

Googleアカウントでは、セキュリティ強化のため「2段階認証」が推奨されています。2段階認証を有効にすると、パスワードに加えて、スマートフォンなど別のデバイスでの認証も必要になります。しかし、PythonプログラムからGmailにアクセスする場合、毎回スマートフォンで認証するのは手間がかかります。そこで、「アプリパスワード」が役立ちます。

アプリパスワードは、特定のアプリやデバイスに対して生成されるパスワードで、通常のパスワードの代わりに使用することができます。

### アプリパスワードの設定方法

1. **Googleアカウントにログインする**
2. **セキュリティの設定を開く**
3. **アプリパスワードを選択する**
4. **アプリを選択する**
   - 今回は「メール」を選択するのが一般的です。
5. **デバイスを選択する**
   - 「その他」を選択し、アプリ名として「Python」などを指定します。
6. **アプリパスワードを生成する**
   - 生成されたパスワードをメモしておきます。

### Pythonコード

```python
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# Gmailアカウント情報
sender_email = "your_email@gmail.com"  # 自分のGmailアドレス
app_password = "your_app_password"  # アプリパスワード
receiver_email = "recipient_email@gmail.com"  # 受信者のメールアドレス

# メール内容
subject = "PythonでのGmail送信テスト"
body = """
こんにちは、
Pythonを使ってメールを送信しました！

よろしくお願いします。
"""

# メールメッセージの作成
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject

# 本文の追加
message.attach(MIMEText(body, "plain"))

try:
    # GmailのSMTPサーバーに接続
    with smtplib.SMTP("smtp.gmail.com", 587) as server:
        server.starttls()  # TLS（暗号化）を開始
        server.login(sender_email, app_password)  # ログイン
        server.send_message(message)  # メールの送信
        print("メールが送信されました！")
except Exception as e:
    print(f"エラーが発生しました: {e}")
```

### コード解説

* **smtplib:** Python標準ライブラリのモジュールで、SMTPプロトコルを使ってメールを送信するための機能を提供します。
* **MIMEText:** メール本文を作成するためのクラスです。
* **MIMEMultipart:** 複数のMIMEパートを含むメールを作成するためのクラスです。
* **SMTPサーバー:** GmailのSMTPサーバーは`smtp.gmail.com`、ポート番号は587です。
* **TLS:** 通信を暗号化するプロトコルです。

### 注意点

* **アプリパスワードの秘密保持:** アプリパスワードは、通常のパスワードと同様に厳重に管理してください。
* **セキュリティ:** 最新のPythonバージョンとライブラリを使用し、定期的にセキュリティアップデートを行うことを推奨します。
* **エラー処理:** `try-except`ブロックを使用して、エラーが発生した場合に適切な処理を行うようにしましょう。

### まとめ

この記事では、Pythonの`smtplib`モジュールを使用して、Googleアカウントのアプリパスワードを用いてGmailを送信する方法を解説しました。この方法を用いることで、セキュリティを確保しながらPythonからメールを送信することができます。

**補足:**
* **安全性の低いアプリの許可:** 2022年以降、Googleは「安全性の低いアプリの許可」を廃止しました。そのため、アプリパスワードを使用する必要があります。
* **SMTP設定:** GmailのSMTPサーバーは`smtp.gmail.com`、ポートは587 (TLSを使用)です。
自分の体得した技術を文章として書くと言うこと

# 1週間が30分に凝縮されるとき
どうも、最近この↓本を読みまして、

https://www.shoeisha.co.jp/book/detail/9784798185736

そうしたらその文章の中に、

https://developer.google.com/tech-writing

ってのがあって、目からうろこなものもありました。

そんなことより、最近思うんです。**自分の書いた文章ってそれを書くまでにものすごく時間がかかった下準備の上で成り立っている**んじゃないかなぁ。って。

何が言いたいかというと、今日も自分の作ったプログラムの解説書を書いていたわけでして、1週間以上作成にかかって作成したプログラムを文章にすると30分くらいで書き終わってしまうのです。しかも皆さんが目にする技術文章ですから**自分の苦労話なんて勿論載せられない**のです。

自分が苦労して体得した技術を文章にインプリするのは良いのですが、苦労はそこには見えない。

なんか空しい気分になってきました。

苦労話はどこに書けば良いのでしょうね。_チラシの裏？_

そんな末経験者の戯言でした。
python入門 #1

## コメント化(メモ)
```python
#このように#の後の文字は無視されるからめもがわりにつかうことができる
```

## データーの表示(出力)
```python
print(123)
print("hello") #文字の場合は「"」か「'」で囲う必要がある
```
[問題演習1-1(print)](https://qiita.com/itijuku/items/8eceda32413b6dd4b1cb)


### 演算(基本)
```python
print(1+1) #足し算
print(1-1) #引き算
print(2*2) #掛け算
print(2/2) #割り算

print("cat" + "dog") #文字をくっつける
```
[問題演習2-1(演算)](https://qiita.com/itijuku/items/8eceda32413b6dd4b1cb)
## 変数の使い方
※ここではhensuとしているが、基本何でもいい(数字から始まるものは不可)
```python
hensu = 10
print(hensu)
```
[問題演習3-1と3-2(変数)](https://qiita.com/itijuku/items/8eceda32413b6dd4b1cb)
## input(入力)
```python
hensu = input()
print(hensu)
```
[問題演習4-1(入力)](https://qiita.com/itijuku/items/8eceda32413b6dd4b1cb#%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E8%A1%A8%E7%A4%BA)
## if文(もし~ならば)
```python
if 1==1:
    print("yes")
```
## while文(~の間繰り返す)
```python
hensu = 1
while hensu != 10:
    print(hensu)
    hensu = hensu + 1
```

### 条件式(基本)
```python
==等しいか
!=等しくないなか
< 左の値より右の値のほうが大きいか
> 右の値より左の値のほうが大きいか
```


## "1" + 1のような文字+数字を行う方法
"1" + 1だと文字+数字と認識され、エラーが出る。これを解決するためには"1"を数字として認識させられるようにしないといけない。
```python
print(int("1") + 1)
```
具体的な処理の流れは
int("1") + 1
1 + 1
2

### "abc" + 1のような文字+数字を行う方法2
この場合abcは数字にできないので1を文字として認識させるようにしないといけない。
```python
print("abc" + str(1))
```
具体的な処理の流れは
"abc" + str(1)
"abc" + "1"
abc1

## 関数(Scratchでいう定義)の使い方１
```python
def kansu():#kansuという名前はあくまで関数名だから何でもいい
    print("1") #ここに関数の動作を書く]

kansu()#これで関数を実行する
kansu()#繰り返し使うこともできる
```

## 関数(Scratchでいう定義)の使い方２
```python
def kansu(abc):
    print(abc)
kansu(123)
```
分かりにくいかもしれないのでScratchで簡単に示すとこういう感じです。
![Screenshot 2025-01-28 21.27.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975134/4dcb5a71-2ddd-7b9d-c652-d94eff05fc40.png)

## for文
iというのは変数名なので、今まで同様iではなくて良いが、基本的にはiを使われることが多い。そしてrange(10)の10は繰り返す数。1回の繰り返しごとにiという変数は1ずつ増加する
```python
for i in range(10):
    print(i)
```
実行結果
```
0
1
2
3
4
5
6
7
8
9
```

こちらもScratch版を載せとく
![Screenshot 2025-01-28 21.30.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975134/39523ade-3a51-4e32-8bdf-678a14114899.png)
Scratchと似た感覚でJavaScriptで動画を作れるライブラリを作っている

:::note alert
文章が適当です。
:::


Scratchと似た感覚でJavaScriptから動画を作れるライブラリを作っています。

https://www.npmjs.com/package/jsvideo

## どういうことか
AviUtl等の動画編集アプリは外部プラグインで実現できるものもありますが
独自のイージングを書くのは難しい...
また、動画編集アプリでは中間点を多用しないといけなくて大変...

そこで、Scratchはそのようなめんどくさいもの無しで動画のようなものを作れたりできます。
しかしScratchはマウスを多用しないといけない。トラックパッド生活の自分にとっては地獄..

そこでScratchのようなものをJavaScriptで実現できれば！ということで作りました。
## 仕組み
今回は知らない人もいるであろう**ジェネレータ関数**というものを使います。
> 何それ?おいしいの？

説明しましょう。
```js
function* GeneratorFunc(){
    yield 0;
    yield 1;
    yield 2;
}
const generator = GeneratorFunc();
console.log(generator.next().value); //0
console.log(generator.next().value); //1
console.log(generator.next().value); //2
```
ジェネレーター関数はジェネレーターを生成し、next関数でyieldが出るまで処理をし、yieldが出たところでその値を返すような仕組みです。
非同期処理に活用されてたりしますがみなさんからは忘れられているでしょう...

yieldで処理を中断できるので、自分はこれを再レンダリングに活用できると思いました。
複数の、Scratchでスプライトに相当するものを以下のように同時進行で進められるためです。
```js
function drawSprites(sprites){
    for(let i = 0;i < 60;i++){
        sprites.forEach(e=>e.next());
    }
}
```
またこれにもメリットあって再レンダリング(再描画)のタイミングが明示的になるんです。Scratchはソースコードでも見ない限り分からないので。
## 現状の使い方
複数のレイヤーがジェネレーターを実行してそれがステートを変更する感じです。
```js:text.js
import { L } from "jsvideo";
export default L.text(function*(state){
    state.text = "Hello!";
    yield; //再描画
    for(let i = 0;i < 30;i++){
        state.y += (300-state.y)/10; //イージング
        yield;
    }
})
```
```js:index.js
import text from "./text.js"
import { createVideoRenderer, L } from "jsvideo"
const video = createVideoRenderer(640, 480, [
    L.rect(function*(state){
        state.width = 640;
        state.height = 480;
        while(true) yield true; //trueを指定すると他のレイヤーが終わった場合に一緒に終わる
    }),
    text
])
document.appendChild(video.canvas);
requestAnimationFrame(function callback(){
    if(video.render()) return; //renderがtrueを返したら終わり
    else requestAnimationFrame(callback)
})
```
こんな感じで作れます。
使いたかったら使ってみてください。
```bash
$ bun i jsvideo
```
npmを使っている人なら
```bash
$ npm install jsvideo
```
こんな一般的な単語があいてたのはラッキーですね。
Rust 1.84.0にアップデート時に発生した "error: component 'rust-std' for target 'wasm32-wasi' is unavailable for download for channel 'stable'" エラーの解消方法

rustupでRust 1.84.0にアップデートしようとしたところ、以下のエラーが発生しました。

```
$ rustup update
info: syncing channel updates for 'stable-aarch64-apple-darwin'
info: latest update on 2025-01-09, rust version 1.84.0 (9fc6b4312 2025-01-07)
error: component 'rust-std' for target 'wasm32-wasi' is unavailable for download for channel 'stable'
error: If you don't need the component, you could try a minimal installation with:
error:
error:     rustup toolchain add stable --profile minimal
error:
error: If you require these components, please install and use the latest successful build version,
error: which you can find at <https://rust-lang.github.io/rustup-components-history>.
error:
error: After determining the correct date, install it with a command such as:
error:
error:     rustup toolchain install nightly-2018-12-27
error:
error: Then you can use the toolchain with commands such as:
error:
error:     cargo +nightly-2018-12-27 build

  stable-aarch64-apple-darwin update failed - rustc 1.83.0 (90b35a623 2024-11-26)

info: cleaning up downloads & tmp directories
info: self-update is disabled for this build of rustup
info: any updates to rustup will need to be fetched with your system package manager
```

エラーの原因を調べたところ、WASI 0.2がリリースされた関係でRust 1.84.0からターゲットに新たに `wasm32-wasip2` が追加され、さらにWASI 0.1と区別するため `wasm32-wasi` が `wasm32-wasip1` にリネームされた模様です。

https://blog.rust-lang.org/2024/04/09/updates-to-rusts-wasi-targets.html

## エラー解消方法

rustupのターゲットから `wasm32-wasi` を取り除く必要があります。

まず追加済みのターゲットを確認します。

```bash
$ rustup target list --installed
aarch64-apple-darwin
aarch64-unknown-linux-gnu
aarch64-unknown-linux-musl
wasm32-unknown-unknown
wasm32-wasi
x86_64-unknown-linux-gnu
x86_64-unknown-linux-musl
```

`wasm32-wasi` が含まれているのが確認できたので、これを取り除きます。

```bash
rustup target remove wasm32-wasi
```

そして改めて `rustup update` を実行します。

```bash
rustup update
```

無事アップデートできれば完了です。

あとは必要に応じて、`wasm32-wasip1` や `wasm32-wasip2` をターゲットに追加するとよさそうです。

```bash
# WASI 2.0
rustup target add wasm32-wasip2

# WASI 1.0 (旧wasm32-wasi)
rustup target add wasm32-wasip1
```

めでたしめでｔ
VMware(Esxi)上にHyper-vを作った時にはまった話

## 症状
ネットワークの設定をいくら修正しても、同セグメントでも通信できない！！！
仮想スイッチをいくら作り直しても、通信できない！！
## 結論(TIPS)
Esxiのネットワーク(vswitchやらVM Network)のセキュリティポリシーを緩和してあげればよい
具体的に言えば、
「MACアドレス変更」「偽装転送」「無差別モード（プロミスキャスモード : promiscuous mode）」を許可しセキュリティを緩和する。
NICにネットワークを割り当てて、該当のNICに外部仮想スイッチを紐づけてあげれば
疎通通ると思う。
【C++】TemplateMethod(デザインパターン)

## TemplateMethodとは?
**アルゴリズムの骨組みを基底クラスで定義し、
具体的な処理をサブクラスに委譲する**ことで、
アルゴリズムの全体的な構造を保ちつつ、
**部分的な処理をカスタマイズできる**設計。
- アルゴリズムの共通部分を基底クラスに集約することで、コードの重複を減らし、
**再利用性を高める**
- サブクラスで具体的な処理をオーバーライドすることで、**柔軟性・拡張性が高くなる**
- **制御の反転**が実現する

### C++
```C++:TemplateMethod.cpp
#include <iostream>

/// <summary>
/// アルゴリズムの骨組み
/// </summary>
class AbstractClass
{
public:
    void TemplateMethod(void)
    {
        Step1();
        Step2();
        Step3();
    }

    inline virtual void Step1(void) = 0;
    inline virtual void Step2(void) = 0;
    inline virtual void Step3(void) = 0;
};

/// <summary>
/// 詳細A
/// </summary>
class ConcreteClassA
    : public AbstractClass
{
private:
    inline void Step1(void) override
    {
        std::cout << "上着を着る" << std::endl;
    }
    inline void Step2(void) override
    {
        std::cout << "手袋をはめる" << std::endl;
    }
    inline void Step3(void) override
    {
        std::cout << "スマホをポッケに入れる" << std::endl;
    }
};

/// <summary>
/// 詳細B
/// </summary>
class ConcreteClassB
    : public AbstractClass
{
private:
    inline void Step1(void) override
    {
        std::cout << "スマホをポッケに入れる" << std::endl;
    }
    inline void Step2(void) override
    {
        std::cout << "手袋をはめる" << std::endl;
    }
    inline void Step3(void) override
    {
        std::cout << "上着を着る" << std::endl;
    }
};

int main(void)
{
    ConcreteClassA patternA;
    ConcreteClassB patternB;

    patternA.TemplateMethod();
    patternB.TemplateMethod();

    return 0;
}
```

### C#
```C#:TemplateMethod.cs
using System;

/// <summary>
/// アルゴリズムの骨組み
/// </summary>
public abstract class AbstractClass
{
    public void TemplateMethod()
    {
        Step1();
        Step2();
        Step3();
    }

    public abstract void Step1();
    public abstract void Step2();
    public abstract void Step3();
}

/// <summary>
/// 詳細A
/// </summary>
public class ConcreteClassA : AbstractClass
{
    public override void Step1()
    {
        Console.WriteLine("上着を着る");
    }

    public override void Step2()
    {
        Console.WriteLine("手袋をはめる");
    }

    public override void Step3()
    {
        Console.WriteLine("スマホをポッケに入れる");
    }
}

/// <summary>
/// 詳細B
/// </summary>
public class ConcreteClassB : AbstractClass
{
    public override void Step1()
    {
        Console.WriteLine("スマホをポッケに入れる");
    }

    public override void Step2()
    {
        Console.WriteLine("手袋をはめる");
    }

    public override void Step3()
    {
        Console.WriteLine("上着を着る");
    }
}

public class Program
{
    static void Main()
    {
        ConcreteClassA patternA = new ConcreteClassA();
        ConcreteClassB patternB = new ConcreteClassB();

        patternA.TemplateMethod();
        Console.WriteLine("");
        patternB.TemplateMethod();
    }
}
```