OmniAICreator/Qiita-1.07M huggingface dataset:
【ConoHa VPS】DNSの反映が遅すぎるときの解決法

# はじめに
:::note warn
この記事はIT系初心者が書いています。
そのため誤りが含まれている可能性があります。ご了承ください。
:::
# 問題が起こった背景
2024年11月
旧サーバー（ConoHa-Wing）構築。
ConoHa-Wingにてドメイン（example.net）取得。
正常に動作。

2025年2月
旧サーバー
↓
新サーバー（ConoHa-VPS 3.0, xxx.xxx.xxx.xxx）に移行する作業を実施。

このときDNS設定を以下のように設定した。
![{2096E61F-ACDC-455C-BFC9-067BEA2D5EB9}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520620/d97986ca-3fff-acbe-419f-5318e108a108.png)

しかし48時間経っても全く反映されず...
```
[tarui@vm-e609c0a2-b1 ~]$ nslookup example.net
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
*** Can't find examle.net: No answer
```

こちらのサイトを用いても全てにおいて結果はＸ。
https://www.whatsmydns.net/#A

何かがおかしいと思い調査開始。

# 調査開始→そして原因発覚へ
```
[tarui@vm-e609c0a2-b1 ~]$ dig example.net @a.conoha-dns.com

; <<>> DiG 9.16.23-RH <<>> example.net @a.conoha-dns.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27798
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;example.net.                   IN      A

;; ANSWER SECTION:
example.net.            60      IN      A       xxx.xxx.xxx.xxx

;; AUTHORITY SECTION:
example.net.            3600    IN      NS      a.conoha-dns.com.
example.net.            3600    IN      NS      b.conoha-dns.org.
```


### ダミーサイトをWingでつくってみた。
そこでConoHa-Wingにて、ダミーサイトをexample.netで構築。
その際のDNS設定がこちら。
（画像がないので再現）
| タイプ | 名称 | TTL | 値 |
|:-:|:-:|:-:|:-:|
| NS | @    | 3600 | ns-a1.conoha.io |
| NS | @    | 3600 | ns-a2.conoha.io |
| NS | @    | 3600 | ns-a3.conoha.io |
| A  | @    |   60 | xxx.xxx.xxx.xxx |
| A  | www  |   60 | xxx.xxx.xxx.xxx |

ダミーサイトを構築した瞬間、whatsdns.netでは✔が出始めました。おやおや？？

### いろいろ設定を見比べてみたら...？
ドメインのネームサーバー設定を見てみました。

![{DDC4F227-4F19-478A-A951-84DFC978A965}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520620/ebfa3643-3019-1cd0-e561-20130d506220.png)

DNS設定と異なっていますね...？

そして以下はConoHa-VPS ご利用ガイド「DNSを使う」に記載されていた内容。

![{810AE251-31C9-4FF7-99C2-BB9454BB4421}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520620/819b1714-1824-a6f2-dc32-ef83cb948a13.png)

おやおや。

絶対原因これやん。

# 解決策
同様の症状に悩まされている方は次の設定をしてみてください。

①ドメイン→[該当のドメイン]→ネームサーバー設定　を　「カスタム」に変更。
②カスタムネームサーバーに次の項目を設定。

```
a.conoha-dns.com
b.conoha-dns.com
```

![{46580055-9529-4695-8AA9-224CB3A3CB02}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520620/ebb81ca4-3017-ae1e-7dbd-a5058ecb173a.png)


# 考えられる原因

・ドメインはConoHa-Wingの管理画面で取得した。
　→ドメインのネームサーバー設定の「ConoHa（標準）」はWing/VPS2.0のNS（ns-ax.conoha.io）で登録される
↓
・DNS設定をVPS3.0で作成した。
　→NSのレコードがVPS3.0のもの（x.conoha-dns.xxx）で作成される。
↓
・ドメイン側のNS設定とDNS設定のNS設定に差異があり、その影響で設定が反映されない。
10日前に申請したFirefoxブラウザ拡張機能が承認されました

10日前に申請したFirefoxブラウザ拡張機能は、途中で資料の修正を経て、ついに承認され、無事リリースされました！
Firefoxユーザーの皆様、ぜひインストールしてご利用ください。フィードバックもお待ちしております！
[WA Number Checker - CheckNumber.AI](https://addons.mozilla.org/en-US/firefox/addon/wa-number-checker/)

ブラウザ拡張機能をインストールしたくない方は、直接私たちのウェブサイトをご利用いただけます：https://checknumber.ai/
DNSとAWS Route 53の基本

# はじめに

個人開発を進める中で、独自ドメインを設定するために AWS の Route 53 を触る機会がありました。その際に、DNS の仕組みや Route 53 の使い方について理解を深める必要があると感じたため、今回の記事では DNS の基本から Route 53 の機能までを整理してまとめます。

# 1. DNSとは何か

### 1.1 DNSの基本概念
DNS (Domain Name System) は、インターネット上でドメイン名を IP アドレスに変換する仕組みです。
例えば `www.example.com` を `192.0.2.1` のような IP アドレスに変換することで、ユーザーがわかりやすい URL を使ってアクセスできるようになります。

### なぜ DNS が必要なのか？
- **人間にとってわかりやすい**: 数字の羅列である IP アドレスを直接覚えるのは現実的ではない。
- **柔軟な管理が可能**: サーバーの IP アドレスが変更されても、ドメイン名を更新するだけで対応可能。
- **負荷分散や可用性向上**: DNS を利用したロードバランシングが可能であり、トラフィックの分散が容易になる。

## 1.2 DNSの階層構造と解決プロセス
DNS は階層構造を持ち、問い合わせの際には以下のような流れで名前解決が行われます。

1. **ルートDNSサーバー (`.`)**: 世界中の DNS の起点。
2. **トップレベルドメイン (TLD) サーバー (`.com`, `.net` など)**: 各 TLD の情報を保持。
3. **権威DNSサーバー**: 特定のドメインについての情報を保持し、最終的な応答を行う。

### クエリの流れ
1. ユーザーが `www.example.com` にアクセス。
2. クライアントの DNS リゾルバがルートDNSサーバーへ問い合わせ。
3. `com` の TLD サーバーを案内される。
4. `example.com` の権威DNSサーバーへ問い合わせ。
5. `www.example.com` の IP アドレスを取得し、クライアントがサーバーに接続。

# 2. AWS Route 53とは何か

### 2.1 AWS Route 53の概要
AWS Route 53 は、Amazon が提供するスケーラブルなマネージド DNS サービスです。インターネット向けの DNS 解決だけでなく、AWS の他のサービスとの統合も容易にできます。

## 2.2 主な機能
| 機能                 | 説明 |
|----------------------|-------------------------------------------------|
| **DNS名前解決**     | ドメイン名を IP アドレスに変換する基本機能 |
| **ドメイン登録**     | Route 53 経由で独自ドメインを購入・管理可能 |
| **トラフィックルーティング** | 地域やヘルスチェックの状態に応じたルーティング設定 |
| **ヘルスチェック**   | エンドポイントの可用性を監視し、障害時に別の経路に切り替え |
| **レイテンシーベースルーティング** | ユーザーの地理的な位置に応じて最適なエンドポイントを選択 |
| **GeoDNS**          | 地域ごとに異なる IP を返す設定が可能 |

# 3. DNSレコードとRoute 53の対応表

AWS Route 53 では、標準的な DNS レコードをサポートしています。

| レコードタイプ  | 役割                                      | Route 53の設定イメージ                  |
|------------------|-----------------------------------------|--------------------------------------------|
| **Aレコード**       | ドメイン名をIPv4アドレスにマッピング | ホストゾーン内で指定          |
| **AAAAレコード**   | ドメイン名をIPv6アドレスにマッピング | 必要に応じて設定可能          |
| **CNAMEレコード**  | 別のドメイン名へのエイリアス | サブドメインのリダイレクトに使用 |
| **MXレコード**     | メールサーバーの指定                      | メールの受信ドメインを設定      |
| **NSレコード**     | 権威DNSサーバーの指定                      | Route 53が自動生成              |
| **TXTレコード**    | 任意のテキスト情報 (メール認証やドメイン所有確認) | SPF/DKIM認証などに使用     |

# 4. まとめ

DNS はインターネットの基盤となる重要な技術であり、AWS Route 53 を活用することでスケーラブルで信頼性の高いドメイン管理が可能になります。

### 主なポイント
- **DNS の基本概念を理解** (ドメイン名→IP変換の仕組み)
- **DNS の階層構造を理解** (ルート、TLD、権威 DNS)
- **AWS Route 53 の機能を活用** (名前解決, ルーティング, ヘルスチェック)
- **適切な DNS レコードを設定** (A, CNAME, MX, TXT など)

個人開発で独自ドメインを運用する際に、Route 53 を活用すると AWS のサービスと連携しやすく、スムーズにドメイン管理ができます。DNS の仕組みを理解することで、より柔軟な運用が可能になり、トラブル時の対応力も向上します。
え、また消えた！？ VSCodeのショートカットがなくなる原因

# え、また消えた！？ VSCodeのショートカットがなくなる原因  

PCを立ち上げたら、 **VSCodeのショートカットが消えている…** 🤔  
実は、以前も同じことがあり、気になったので調べてみました。  

## 📌 同様のケースが多発している？  

調べてみると、 **同じ現象に悩んでいる人は多い** ようです。  

- [VSCodeのショートカットが消えた話](https://qiita.com/ryt-t5/items/9acfee61b9ac683d3bc1)  
- [VSCodeが消えた！？ 原因と対策](https://blog.freks.jp/vscode-disappeared/)  

## 🔍 原因は VSCode の更新中にPCをシャットダウンしたから？  

どうやら **VSCodeのアップデート中にPCを落とすと、ショートカットが消える** ことがあるようです。  
再インストールすれば直りますが、 **正直めんどくさい…** 🥲  

## ✅ 対策  

### 1. VSCodeのアップデート中はPCを落とさない！  
とはいえ、自動アップデートなので気づかないこともありますよね。  

### 2. ショートカットが消えたら再インストールする  
手動でショートカットを作ろうとしても、 **本体ごと消えていることが多い** ので、結局再インストールが必要になります。  

[Visual Studio Code のダウンロードページ](https://code.visualstudio.com/) から最新版をインストールすればOK！  

---

## 🎤 まとめ  

- **VSCodeのアップデート中にPCを落とすとショートカット（本体）が消えることがある**  
- **ショートカットだけ消えたように見えても、本体がなくなっている可能性大**  
- **復旧するには再インストールが手っ取り早い**  

VSCodeが消えて焦る前に、 **まずは再インストール！** これで解決です 💡
JavaScriptでレーダーチャートを描画してみた

## はじめに
後輩社員の評価のために、レーダーチャートをつかって可視化したい！と思って、でもExcelはつまんないしなーというのでJavaScriptでつくってみた、という話

### 参考
主にこの記事を大いに参考にさせていただきました
[Chart.jsでグラフを描画してみた](https://qiita.com/Haruka-Ogawa/items/59facd24f2a8bdb6d369#3-4-%E3%83%AC%E3%83%BC%E3%83%80%E3%83%BC%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88)

## 成果物
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381909/87d38fe0-c763-89a1-7f0e-295587a93cc0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381909/09d0a377-8aa0-32d5-7132-93e49ff222ca.png)

### 説明
画面はこんな感じ
後輩社員の名前を入れて、特定の時期で数値比較をしたいなぁという意図
日付と数値入力したら、こんな感じでレーダーチャートが出るというだけの内容

### ロジック
やっていることとしては、
DOM操作でinputのテキスト情報を取得して、レーダーチャートのデータに当てはめているだけ

### ハマったこと
主にチャート描画とは関係ない初歩的な内容でハマった

・HTMLのidのタイプミスで全然反映されない
→VScodeでいい感じに検出してくれる拡張機能はないものか。。。

・最初からオブジェクトのプロパティにアクセスしようとして、nullでエラー
→htmlでオブジェクトのvalueに初期値を設定し、js側で下記のようにケアした

```js
var val_com = document.getElementById("val_communication");
var val = val_com?.value ?? "かえるのうた";
```

## 感想
JavaScriptは趣味でたま～に触る程度なので、毎回細かい内容を忘れると思ったので、定期的に触ろうかな、と思った
あと、一応GitHubに今回のやつ置いているので、コード見たい方はどうぞ

https://github.com/muen-6en/GrowDiffChart
eJPTv2に合格した

# はじめに
<!-- 発端や概要を記載 -->
[INE](https://ine.com/)が出しているeJPTv2という資格に合格したので情報共有の投稿です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/7312f0e7-af5a-6d82-4769-a2c141fc8524.png)


# 結論
- 誰におすすめか
    - オフェンシブセキュリティ初心者・とりあえずオフェンシブセキュリティがどんなものか知りたい人
    - 講義を見ながら学習したい人
- 勉強時間
    - 2.5 ~ 3か月くらい
- 難易度
    - ツールの使い方が分かればOK
- 費用
    - Voucher単体:  $200
    - コースバンドル（3か月）: $249

# 目次
<!-- タイトルとアンカー名を編集 -->
1. 資格について
1. 受験動機
1. 学習方法
1. テスト
1. ツール・Cheatsheet等
1. おわりに

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 資格について
オフェンシブセキュリティ (Penetration Tester) を目指す人のエントリーレベルの資格です。
試験はハンズオンラボでの実践形式となります。なお、ブラウザからKali Linuxに接続して操作する形式のため、特別な用意は必要ありません。

> eJPT は、実際のエンゲージメント中に使用されるスキルをシミュレートする実践的なエントリーレベルの Red Team 認定です。

https://security.ine.com/certifications/ejpt-certification/

<a id="#Chapter2"></a>
# 受験動機
オフェンシブセキュリティに興味があったからです。将来的にOSCPなども受験しようと考えていますが、ひとまずの基礎固め（+資格）が格安でできると考え、受験に至りました。
eJPTv2はVoucherのみで\\$200、3か月のコースバンドルで\\$249なので比較的安めの部類かと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/8e71a729-1a0b-736b-3008-9652470656dd.png)

https://checkout.ine.com/


<a id="#Chapter3"></a>
# 学習方法
コースバンドルを購入した場合は[Penetration Testing Student](https://my.ine.com/CyberSecurity/learning-paths/61f88d91-79ff-4d8f-af68-873883dbbd8c/penetration-testing-student)というLearning Pathへアクセスすることができます。基本的にはこちらに沿って学習を進めました。Learning PathにはLabも含まれており、動画形式で学んだ内容を実際に試して理解することができます。（一部Labのないトピックもあります）

https://my.ine.com/CyberSecurity/learning-paths/61f88d91-79ff-4d8f-af68-873883dbbd8c/penetration-testing-student


動画だけで153hと大ボリュームとなっており、それに（取り組む場合は）Labの時間も加算されるため、結構時間がかかります。ただし、一部重複する内容があったり、ITを勉強したことがある人にとってはすでに知っているような内容（IPアドレスについてなど) もあり、それらを飛ばすことで時間の削減は可能だと思います。（私はもったいない精神で全体の90%くらい見ました）

上記からもわかる通り、どちらかというと先に手を動かすより、まずは全体を俯瞰して方法論や仕組みを知ったうえで実践に挑戦したいという方に合っているかもしれません。（私もそのタイプです）手を動かすほうが伸びるというのはその通りだと思うのですが、本当に何もないところから手を動かすのは難しいものです。そのような場合に広く（浅く）知識を取り入れるという意味では非常に有効なコースだったなと振り返ってみて思います。

<a id="#Chapter4"></a>
# テスト
試験は48hで35の設問に回答します。OSCPのような監視などは特になく、「Exam Start」のボタンを押すとすぐに始めることができます。冒頭にも記載した通り、インターネットにつながる環境とパソコンさえあればほかに特に準備することもありませんでした。試験時間も非常に長いため気軽な気持ちで受けることができます。

ただし、接続遅延や環境起因のバグ（のような動作）については注意が必要です。
そもそも環境が日本にはない（アジアはIndiaとSingapore）ので仕方がないのですが、たびたび画面がフリーズしたり、コピペがうまくいかなかったりということがありました。一番つらかったのは環境起因のバグ？で、ツールがうまく動かなかったり、とれるはずの情報が取れなかったりしたことです。
あるホストに対してユーザーのブルートフォースを行っていた時何度試してもクレデンシャルが判明しなかったのが、環境を再起動して再度試すとすぐに判明したということがありました。他に突破口があるのかもと別のEnumに数時間を費やしたので結構な痛手でした。なんかちょっとおかしいかもと思ったら環境の再起動も検討してみてください。（ただし環境内のデータは削除されるので、外部でメモ等をとっておくこと）

<a id="#Chapter5"></a>
# ツール・Cheatsheet等
## ツール
有用だったツールを紹介します。（というかこの辺のツールの使い方を覚えておけばたぶん合格できます。）
- nmap
- netdiscover
- crackmapexec
- smbclient
- enum4linux
- hydra
- dirb
- davtest
- ssh
- ftp
- impacket-psexec
- searchsploit
- metasploit

あとはLinux, Windowsの基本的なコマンド等

## Cheatsheet
ここら辺はオフェンシブセキュリティをやっている人なら知っているかと思いますが念のため。

https://book.hacktricks.wiki/en/index.html

https://hackviser.com/tactics

<a id="#Chapter6"></a>
# おわりに
今までオフェンシブセキュリティに興味はあったものの気まぐれにTHMやHTBなどを触るくらいであまりちゃんと勉強してこなかった自分にとっては、基礎固めとしてしっかりと腰を据えて学習できた3か月間だったかなと思います。今後はより上位の資格取得を目指して頑張ろうと思います。**Pay Harder**
「RUN --mount=type=cache, target=/root/.npm」を持つDockerfileをGithub Actionsで実行するとき

## `RUN --mount=type=cache, target=/root/.npm`ってなにしてるの？
- **Docker BuildKit**の`--mount=type=cache`オプションを使用し、/root/.npmディレクトリを永続的なキャッシュストレージとして指定しています
- これにより、ビルド間でnpmのダウンロード済みパッケージが再利用可能になり、`package.json`に変更がない限り再ダウンロード不要になります

:::note info
**そもそもDocker BuildKitって？**
- Docker v23.0以降でデフォルトとなった機能
- 以下の特徴を持っている
    - Dockerfile内の命令を依存関係に基づいて並列実行できる
    - ビルドキャッシュが最適化され、変更がない部分は再実行せずに済む ... and more
:::

## じゃあ、そのキャッシュはどこに保存されるの？
- 直接ホストの`/root/.npm`には存在せず、BuildKitが管理する内部キャッシュ領域に保持される
- 具体的には、Dockerのデータディレクトリ内（多くの場合、`var/lib/docker/buildkit`配下）

:::note warn
**Github Actionsのワークフローで実行しても、終了時にキャッシュが削除されちゃうんじゃ？**
- Github Actionsは各ワークフロー実行時に用意される一時的な環境であり、ワークフロー終了時または、ジョブ終了時にその環境が破棄される
- 外部キャッシュとしてエクスポートする仕組みを導入しない限り、そのキャッシュも次回のワークフロー実行時には利用できない
:::

## じゃあ、Github Actionsでどうやってキャッシュをエクスポートするの？
### Dcoker公式のactionsを使おう！（[`docker/build-push-action@v6`](https://github.com/docker/build-push-action)）
```dockerfile:使用例
-name: 'イメージのビルド&プッシュ'
 uses: docker/build-push-action@v6
 with:
   push: true
   tags: ここにタグを入力
   cache-from: type=gha
   cache-to: type=gha, mode=max
```

## 解説
### `docker/build-push-action@v6`
- BuildKitを活用した高度なDockerイメージのビルド・プッシュ機能が使える

### `push`
- **機能**: ビルド完了後のレジストリへのプッシュ制御
- **選択肢**:
    - `true`: 常にプッシュ実行
    - `false`: ビルドのみ実行
    - 条件式: ${{ github.event_name != 'pull_request' }}（PR時はプッシュしない）

### `cache-from/cache-to (オプション)`
- **機能**: ビルドキャッシュの管理

| タイプ      | 説明                          |
|-------------|-------------------------------|
| `gha`       | GitHub Actionsキャッシュ      | 
| `registry`  | レジストリをキャッシュストア   |
| `inline`    | イメージにキャッシュ埋め込み   |
| `local`     | ローカルファイルキャッシュ     |



#### `cache-from:type=gha`
以前エクスポートしたキャッシュが読み込まれ、変更ないレイヤーは再ビルドされずに済む

#### `cache-to:type=gha, mode-max`
ビルドした各レイヤーのキャッシュがGithub ActionsのキャッシュAPIを経由してリモートに保存される
- **`mode`**
    - `min` (デフォルト): 最終レイヤーのみキャッシュ
    - `max`: 中間レイヤーを含む全キャッシュ保存
AWS Certified Advanced Networking - Specialty 受験記

AWS Certified Advanced Networking - Specialty（ANS-C01）の受験期になります。

# 自己紹介
- 総合電機メーカー 入社3年目
- 最近はデータ分析よりもデータ処理やIoT関連のアーキテクチャを考えることが増えてきた
- AWS歴 2年
- 好きなサービス Lambda
- 取得済みAWS認定 CLF, SAA, SOP, DVA, DOP, SAP

# 勉強方法
教材としては以下の物を使った
- [Udemyの講義](https://www.udemy.com/course/aws-certified-advanced-networking-specialty-ans/?utm_source=aff-campaign&utm_medium=udemyads&LSNPUBID=PPkX79%2Fc*b0&ranMID=47901&ranEAID=PPkX79%2Fc*b0&ranSiteID=PPkX79_c.b0-jFx338zmOe9YebYr7tdaLA&couponCode=24T5MT071025) セクション15のDirect Connect途中まで、ハンズオンはすべてスキップ
- [Cloud Tech](https://kws-cloud-tech.com/) 200問目までは3週、それ以降は1週のみ

いつもはCloud Techの問題集を解きまくっていたが、今回初のSpecialty試験かつ業務であまりDirect ConnectやSite間VPNのようなネットワーク系のサービスを使ったことがなかったため、まずはUdemyの講義を受けた。

今回の勉強において一番活躍したのは[Perplexity](https://www.perplexity.ai/)
わからない問題の解説や他の選択肢がなぜ間違っているのかを聞いて各サービスを深く理解するのに務めた。
活用したプロンプトとしては以下の通り
- 以下の問題を解いてANSの試験を受けるにあたって、覚えておいた方がいいことを教えて。（以下、問題文）
- 以下の問題において、（回答選択肢）が間違っている理由を教えて。
- （サービスの利用例などを挙げて）別の物に置き換えて分かりやすく説明してください。

結構、サービスの関係などを別の物に置き換えて説明してもらうのは理解にとても役立ったのでおすすめ。

# 受験本番
今回も1問2分ほどで解くように意識した。
すべて解き終わった時点で90分経過、回答に自信がなくフラグを付けた問題が17問だった。

その後、80分かけて回答に自信がなかったものを見直して、フルで時間を使って終了

# 結果
これまでの試験のどれよりも高い点数で合格できてびっくり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272113/2b6ffbdb-2c25-2994-5225-6a09cf2f8d2a.png)

受けたのが13:00-16:00だったが、その日の20時くらいにはCredlyに通知が来ていた。

# 所感
やっぱりDirect Connect、Site間VPN、Transit Gatewayのあたりがよく出ていたイメージ。NATに関する問題が結構出てて驚いた。
いつもと違いUdemy使った講義を受けたが、いつもと同じようにCloud Licenceだけでも良かった気がする。
ただCloud LicenceのANS-C01は現時点で回答やシステムに怪しい部分があったため、そこを判断するのにUdemyは役だったかも。

# 終わり
今年度中にData Engineer Associate受けて目標の1年4つを達成するぞ！
<コピペで簡単>GAS(Google Apps Script)をつかって、SpreadSheetのグラフを正方形にする

<h2>はじめに</h2>
グラフの形を正方形にする方法です。マウスを使っても正確な正方形は出ないので、GASに頼ることとしました。

![体重と目標体重(4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250476/c05dbb91-1771-4162-a263-afe319b92e91.png)
こんなふうなグラフが![体重と目標体重(3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250476/d1ffb2b7-00ef-cbfa-fc2a-9d7b028a3f6e.png)
このように完全な正方形になります。
ただし、対象のSpreadsheetのすべてのグラフが正方形になるので注意してください。あと、ダイエットは成功させます。グラフの縦軸ミスってるけど気にしないでください。修正してます。
特定のグラフだけ、みたいなのは作っていないです。
<h2>作り方</h2>
まずSpreadsheetの、対象のスプレッドシートにアクセスしてください。

次に、”拡張機能”から”Apps Script”を選択してください。

遷移すると思うので、そこにこのコードをペーストしてください。（デフォルトで存在するコードは消して構いません）

```
function resizeChartToSquare() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var charts = sheet.getCharts();

  if (charts.length === 0) {
    Logger.log("グラフが見つかりません。");
    return;
  }

  charts.forEach(function(chart) {
    var builder = chart.modify();  // グラフの変更用ビルダーを取得
    builder.setOption('width', 1000);  // 幅を1000pxに設定
    builder.setOption('height', 1000); // 高さを1000pxに設定（正方形）

    sheet.updateChart(builder.build()); // 更新
  });

  Logger.log("グラフのサイズを正方形（1000*1000）に変更しました。");
}
```
ちなみに、正方形以外にもピクセル数を指定することは可能です。
```
    builder.setOption('width', 1000);  // 幅を1000pxに設定
    builder.setOption('height', 1000); // 高さを1000pxに設定（正方形）
```
の1000の部分を任意の値に変えるだけです。

”ドライブにプロジェクトを保存”をクリックしたら、”実行”ボタンをクリックしましょう。

すると、Spreadsheetのすべてのグラフが正方形(ここでは1000px*1000px)になっているはずです。


<h2>さいごに</h2>
いかがでしたか？

もし問題があればAIに聞いてみてください。
今からはじめるAIキャッチアップ

## きっかけ
「2025年はAIエージェントだ」、「Deepseekやばい」、「Deep Researchまだ使ってないの？」といったポストを、Xで見ると、何だかモヤモヤしていた。理由は私が**根本の仕組みを理解していないから！**
とあるネット番組で、東京大学の松尾豊教授が「AIをどうやって学んだらいいですか？」という問いに対し、「とりあえず、OpenAIのAPI叩いて、どんなことができるか試すとか、使いながら学ぶのが良い。」「低レイヤーを学ぶことにあまり意味がなくなってきている。」と仰っていた。なるほど...とりあえずAIサービスに課金？ いや、待て。私はエンジニア！仕組みを知らずして、使うなんてエンジニアの姿勢ではない！
と思い、今からどうやってAIをキャッチアップするか調べて、それを実践することにした。
## 調査結果
継続的にキャッチアップできる方法を探し、東京大学 松尾・岩澤研究室の  
[「人工知能を学ぶためのロードマップ」](https://weblab.t.u-tokyo.ac.jp/lecture/learning-roadmap/) を実践することに決めた。  

このロードマップは、人工知能や深層学習を学んだことのない人向けに、「研究者」「データサイエンティスト」「エンジニア」「ビジネス」の4つの職業ごとに4段階のレベルで構成されている。  
各レベルには、学習コンテンツ（書籍・動画など）と推奨学習時間が記載されている。  

## エンジニアロードマップ

### LEVEL 0 - 「AIの歴史と概要」
- **STEP0：技術に触れる（1h）**  
  AIサービスを実際に使ってみる
- **STEP1：人工知能の概要・歴史（10h）**  
  書籍を通じて、人工知能の全体像と歴史的背景を学ぶ
- **STEP2：機械学習/深層学習のキーワード理解（20h）**  
  [G検定](https://www.jdla.org/certificate/general/) の参考書を活用し、機械学習・深層学習の基礎概念を学ぶ。  

※LEVEL 0の内容は全職業共通。

### LEVEL 1 - 「機械学習/深層学習の基礎」
- **STEP1：数学の学習（30h）**  
  「線形代数」「微分積分」「統計学」の基礎を学ぶ
- **STEP2：プログラミングの学習（40h）**  
  Pythonの基礎を習得し、NumPyやPandasを使ったデータ分析を学ぶ
- **STEP3：機械学習/深層学習の実装（70h）**  
  機械学習/深層学習の理論を学びながら、Pythonライブラリを使って実装を進める

### LEVEL 2 - 「機械学習/深層学習の実践」
- **STEP1：コンピュータサイエンス（40h）**  
  効率的なプログラムを書くため、アルゴリズムとデータ構造を学ぶ 
- **STEP2：アプリ開発（20h）**  
  学んだ知識を活用し、物体認識アプリやチャットボットアプリを開発する

### LEVEL 3 - 「研究/実務経験」
このレベルでは「発展的な内容を習得し、主体的に問題解決や研究ができる」ことが目標。インターンシップやAI案件への参画が推奨されている。

## 評価
- **コスト**：学習時間 **230h** + 書籍費用  
- **アウトプット**：  
  - 機械学習/深層学習を実装できるスキル  
  - その領域で必要な基礎知識  


## まとめ
- **約3〜4ヶ月の学習期間でAIの低レイヤーの基礎知識を習得できる**ことが分かった。  
松尾・岩澤研究室のロードマップは、学習内容が段階的に整理されており、初心者でもスムーズに取り組めそう。
- 数学やアルゴリズムなどの基礎からしっかり固めることで、**ただのAIの利用者ではなく、技術的な理解を持ったエンジニアとして成長できそう**。  

- 今後は、各レベルで学習した内容を整理し、実際の学習プロセスや実装の過程をアウトプットとして記事にまとめていく予定。  

同じようにAIを学びたい人たちの参考になれば嬉しいです。
【編集中】 jp106 loadkeys  , Couldn't get a file descriptor referring to the console"

```コマンド実行.
localectl
```
で確認。

```コマンド実行.
sudo nvim /etc/locale.gen
```
を編集する。

```/etc/locale.gen
...(略)...
ja_JP.UTF-8 UTF-8 //行頭の#を外してコメントでなくする
...(略)...
```

```コマンド実行.
sudo locale-gen
```

---
mozc 日本語　漢字
fcitxは実行する。
i3なら
```.config/i3/config
exec --no-startup-id fcitx5
```
ナップサック問題を解くPythonプログラムの実装例

# はじめに
こんにちは！今回はナップサック問題(Knapsack Problem)をPythonで解くプログラムを紹介します。このプログラムは、動的計画法(Dynamic Programming)を用いて「制限された重量の中で、価値の最大化」を達成するアイテムの組み合わせを求めます。さらに、結果を見やすく表示するためにpandasを活用しています。
# ナップサックとは？
- ナップサック問題は次のような最適化問題
- 複数のアイテムであり、それぞれに「重さ」と「価値」が割り当て
- ナップサックの容量が決まっており、その容量を超えないようにアイテムを選択
- 選択したアイテムの総価値を最大化することが目的
# 実装コード
以下がプログラムの全体コードです。
```py:Knapsack.py
from decimal import Decimal
import pandas as pd


def knapsack(goods, weights):
    """
    ナップサック問題を動的計画法で解く関数

    Args:
        goods: 各アイテムの名前、重さ、価値を含む辞書
        weights: ナップサックの容量リスト

    Returns:
        動的計画法のテーブルを返す
    """
    n = len(goods)
    table = [[(Decimal(0), [])] * (len(weights)+1) for _ in range(n+1)]
    for i, item in enumerate(goods, 1):
        for j in range(1, len(weights)+1):
            w = goods[item][0]
            w_id = weights.index(w) + 1

            if weights[j-1] < w:
                table[i][j] = table[i-1][j]
            else:
                tmp1 = table[i-1][j][0]
                tmp2 = table[i-1][j-w_id][0] + goods[item][1]
                if tmp1 >= tmp2:
                    table[i][j] = table[i-1][j]
                else:
                    table[i][j] = (tmp2, table[i-1][j-w_id][1] + [item])
    return table


def format_list(data, index_=None, columns_=None):
    """
    動的計画法のテーブルを整形して DataFrame に変換する関数

    Args:
        data: 動的計画法のテーブル
        index_: 行ラベル
        columns_: 列ラベル

    Returns:
        整形された DataFrame
    """
    data = [[(int(value), _) for value, _ in inside] for inside in data]  # Decimalをintに変換

    formatted_list = []
    for sublist in data[1:]:
        tmp = []
        for value, names in sublist[1:]:
            tmp.append(f"({value}, {{{', '.join(names if names else '𝜙')}}})")
        formatted_list.append(tmp)
    return pd.DataFrame(formatted_list, index=index_, columns=columns_)


# 実行例
GOODS = {  # アイテム名: (重さ, 価値)
    'A': (2.5, 200),
    'B': (1, 100),
    'C': (2, 50),
    'D': (0.5, 150),
    'E': (1.5, 200),
}
weights = [Decimal(str(0.5 * i)) for i in range(1, 7)]  # 重さのリスト: [0.5, 1.0, ..., 3.0]

result = knapsack(GOODS, weights)
display(format_list(result, GOODS.keys(), weights))
```
# プログラムの説明
### 動的計画法を使った解法
動的計画法の考え方を利用して、ナップサック問題を解きます。「価値が最大となる組み合わせ」を表形式で記録しながら計算します。
- knapasck関数は、各重さごとの最大価値を計算し、同時にそのときのアイテムの組み合わせも保存
- format_list関数は計算結果を整形し、DateFrameとして表示
### 入力データ
- GOODS:各アイテムの重さと価値を表す辞書
- weights:ナップサックに入れられる重さのリスト
# 実行結果
以下のこのプログラムの実行結果です。
```
       0.5        1.0       1.5       2.0       2.5       3.0
A  (0, {𝜙})  (0, {𝜙})  (0, {𝜙})  (0, {𝜙})  (200, {A}) (200, {A})
B  (0, {𝜙}) (100, {B}) (100, {B}) (100, {B}) (200, {A}) (200, {A})
C  (0, {𝜙}) (100, {B}) (100, {B}) (100, {B}) (200, {A}) (200, {A})
D  (150, {D}) (150, {D}) (250, {D, B}) (250, {D, B}) (350, {D, A}) (350, {D, A})
E  (150, {D}) (150, {D}) (200, {E}) (350, {D, E}) (350, {D, A}) (450, {D, A, E})
```
# まとめ
ナップサック問題をPythonで解く方法を紹介しました。動的計画法を利用すれば、複雑な最適化問題も効率的に解けます。最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！
４．　基数変換②　2進数と8進数、16進数の基数変換


8進数は2の3乗
16進数は2の4乗

**2進数を8進数にする場合**
2進数を3桁に区切り（ない桁は0を補う）。
区切った1つ1つが8進数の1桁にあたる。
2進数1101.01→001  101.010
区切り単位でそれぞれ10進数に直す
001→（0×4）+（0×2）+（1×1）＝1
101→（1×4）+（0×2）+（1×1）＝5
010→（0×4）+（1×2）+（0×1）＝2
これをくっつけて8進数に。15.2

**2進数を16進数に直す場合**
2進数を4桁ごとに区切り、区切り単位でそれぞれ10進数に直す。（4桁ないところは0を補う）
2進数1101.01→1101.0100
1101→（1×8）+（1×4）+（0×2）+（1×1）＝13→16進数に直すとD
0100→（0×8）+（1×4）+（0×2）+（0×1）＝4
16進数の場合は9の次にA〜Fが来る16進表記になる。
くっつけて、D.4

反対に**8進数や16進数を2進数に基数変換する場合**は、逆の流れで、
8進数1桁を2進数3桁に
16進数1桁を2進数4桁に、と分解する。

8進数15.2を2進数に
1→001、5→101、小数点　2→010
001101.010両端から余計な0を取ると、
1101.01

16進数D.4を2進数に
D→1101  小数点　4→0100
1101.0100→1101.01
DNSSECについて学ぼう！

# この記事の対象者
- DNS（ドメインネームシステム）の仕組みを理解している人
- セキュリティについて学びたい人

※DNS（ドメインネームシステム）とは
　ドメイン名（例：www.example.co.jp）
　から対象サーバのIPアドレス（例：172.217.160.66）を取得するシステム

図１．DNSの仕組み
![DNSの仕組み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007480/01269a39-372b-ce92-a325-8299446949fd.png)


# DNSSECとは？
DNSをセキュアにする技術で、以下のようなリスクを防ぐことを主な目的としている。
- DNSキャッシュポイズニング
- BGPハイジャック
- DNSスプーフィング

# DNSSECの仕組み
DNSSECは「公開鍵暗号方式」と「信頼の連鎖」という技術を用いて実現されている。

図２．DNSSECの仕組み
![DNSSECの仕組み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007480/6bc48060-2297-0481-7b26-aecc25cc6a34.png)
（独り言：自分でまとめてみて、なぜ２つの技術をひとまとめにした図解が存在しないかよくわかりました…ムズ）

まだまだ理解に自身がないので、認識齟齬がありましたらご指摘いただけますと幸いです！なお、関連情報も受け付けております:raised_hands_tone1:
３．　基数変換①n進数から10進数、10進数からn進数


# n進数から10進数への基数変換
→各行の数字にその桁の重みを掛け算する

2進数1101.011を10進数へ変換
**整数部**
1×8（←桁の重み）＝8
1×4＝4
0×2＝0
1×1＝1　8＋4＋0＋1＝13

**小数部**
0×1/2＝0
1×1/4＝0.25
1×1/8＝0.125 　0＋0.25＋0.125＝0.375
13＋0.375＝13.375←1101.011を10進数に変換した数

　
# 10進数からn進数への基数変換
・重みを使う方法
　左から順に桁の重みを使って割り算していく（省略）

・割り算と掛け算を使う方法
　基数を使って整数部は割り算、小数部は掛け算する

１３.３７５を２進数に変換
**整数部**
１０進数を基数で割って、その商をまた基数で割るを繰り返す。
13÷2＝６余り１
6÷2＝３余り０
3÷2＝1余り1
1÷2＝0余り1 　商が0になったので終了
　*↑整数部は余りを下から並べ直す*　☆1101


**小数部**
小数部が０になるまで基数で掛け算を繰り返す
2×0.375=0. 75
2×0.75=1.5
2×0.5=1.0　小数部が0になったので終了
　　　*↑小数部は掛け算した結果の整数部分を上から並べる*　☆011

答　1101.011
PostgreSQL：特定カラムを持つテーブル一覧を取得するSQL

## 目次
- [はじめに](#はじめに)
- [対象](#対象) 
- [環境](#環境)
- [手順](#手順)


## はじめに
PostgreSQLでカラム名に特定のワードを含むテーブルの一覧を調査する機会があったので備忘代わりにSQLを残します。

## 対象
* PostgreSQLで特定カラムを持つテーブルを取得したい人

## 環境
* PostgreSQL

## 手順
PostgreSQLに接続して以下のSQLを実行する。

### SQL説明
* 取得項目：テーブル名、カラム名
* 取得条件：カラム名にcolumn_nameを含む

```list.sql
select
  table_name,
  column_name
from
  information_schema.columns
where
  column_name LIKE '%column_name%';
```
AWS Lambdaで.NETのILoggerを使いたい

こんにちは。

テックリードのTerukiです。

.NETアプリをLambdaで動かす時はログをCloudWatchに飛ばしたいですよね。

ILambdaContextのLoggerを使えば良いのですが、Microsoft.Extensions.Loggingの ILoggerを使いたいというか、ILambdaContextのLoggerは微妙に使いづらいのであまり使いたくありません。

今日はその辺りをうまいことやれるようにする記事を書こうと思います。


# やってみる

AWSが.NETアプリにCloudWatchをILogger経由で叩けるようにライブラリを用意してくれています。

https://github.com/aws/aws-logging-dotnet

NuGetパッケージをインストールすると、ConfigureLoggingの中かILoggerBuilderでCloudWatchに飛ばす処理を登録できます。

```cs
builder.Logging.AddAWSProvider();
```

EC2やFargateで動かす分にはこれで終了ですが、Lambdaではそうはいきません。

このコードをLambdaで動かしてログを出力すると中途半端なログがCloudWatchに飛んできます。

Lambdaは本処理が終わるとそのアプリのプロセスをフリーズさせますが、このライブラリはログを出力するコードとは別のスレッドでCloudWatchに送る処理が動いています。

このスレッドが処理を終える前にプロセスを止められてしまうためアプリ終了間際に出力されたログはCloudWatchに届きません。

というわけで本処理を終える前に明示的にログをCloudWatchに送るように指示することができればこの問題は解決します。

以下の例はConsoleAppFramework v5のフィルタで実装してみたものです。

```cs
internal class Filter(ConsoleAppFilter next, ILogger<Filter> Logger, IServiceProvider ServiceProvider) : ConsoleAppFilter(next) {
    /// <inheritdoc />
    public async override Task InvokeAsync(ConsoleAppContext context, CancellationToken cancellationToken) {
        try {
            await Next.InvokeAsync(context, cancellationToken).ConfigureAwait(false);
        } catch (Exception e) {
            Logger.LogError(e, "例外が発生しました");
            throw;
        } finally {
            var loggerProvider = ServiceProvider.GetRequiredService<ILoggerProvider>();
            // AWS Loggerの場合
            if (loggerProvider is AWSLoggerProvider awsLoggerProvider) {
                var coreField = awsLoggerProvider.GetType().GetField("_core", BindingFlags.Instance | BindingFlags.NonPublic)!;
                var core = coreField.GetValue(awsLoggerProvider) as IAWSLoggerCore;
                // ログを無理やりフラッシュする
                core!.Flush();
            }
        }
    }
}
```

リフレクションを使わずに実装するのは厳しそうでした🥲

やってることはシンプルでfinallyの段階でLoggerProviderを取得してそれがAWSLoggerProviderだった場合はFlushする処理を明示的に呼んでいるだけです。

これで中途半端にログが送信される問題は解決します。

正攻法ではないので、プロダクションで使用するかは自己責任と思いますがMicrosoft.Extensions.LoggingのILoggerを使えるので便利です。

探したらライブラリなどでもうちょっと楽に出来る何かがある説はありますが、これがミニマムかなと思います。

# おわりに

リフレクションを使用しているので、ライブラリのバージョンを上げた場合はちゃんとテストをする必要があると思います。
リフレクションを使わなくてもFlushを呼べたら良いのですが、それはまだできなさそうです。

短いですが、誰かの役に立てば良いなと。


# Oh my teethについて
[Oh my teeth](https://www.oh-my-teeth.com/?tags=qiita)では未来の歯科体験を創るために日々活動しています。

Techチームではより良いユーザー体験を提供するべく、Webフロントエンドからバックエンド、スマホアプリに機械学習モデルなど、さまざまなプロダクトを開発しています。

一緒に未来の歯科体験を創りませんか？興味がある方は是非こちらを確認してください。

https://oh.careers/

カジュアル面談も可能なので気軽に応募してみてください！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192685/0138b492-e02b-852e-61fa-fc065b53d285.png" width="450" />
【TailwindCSS】v3からv4へアップグレードする方法

## アップグレードツールを使用

以下のコマンドを実行することで大部分の作業を自動で行えます。

```terminal
yarn dlx @tailwindcss/upgrade@next
```

https://tailwindcss.com/docs/upgrade-guide#using-the-upgrade-tool

## 手動でアップグレード

手動でアップグレードするにはTailwindCSSをv3からv4に変更することに加えて以下の作業を行います。

### `@tailwindcss/postcss`をインストール

以下のコマンドを実行して`@tailwindcss/postcss`をインストールします。

```terminal
yarn add @tailwindcss/postcss
```

### 不要な依存関係の削除

`autoprefixer`がある場合は削除します。

```terminal
yarn remove autoprefixer
```

### `postcss.config.mjs`の変更

`postcss.config.mjs`を以下のように変更します。

```diff_javascript:postcss.config.mjs
export default {
  plugins: {
-   tailwindcss: {},
-   autoprefixer: {},
+   "@tailwindcss/postcss": {},
  },
};

```

### `@tailwind`ディレクティブを削除

`@tailwind`ディレクティブを`@import "tailwindcss";`に変更します。

```diff_css
- @tailwind base;
- @tailwind components;
- @tailwind utilities;
+ @import "tailwindcss";
```

### `tailwind.config.js`を読み込む

`tailwind.config.js`が読み込まれなくなっています。
読み込まれるようにするにはCSSファイルに以下を追記する必要があります。

```css
@config "../../tailwind.config.js";
```

または設定をCSSファイルに移行します。

https://tailwindcss.com/docs/upgrade-guide#using-a-javascript-config-file

### 破壊的変更の影響を受ける箇所を更新

以下のページにリストされている破壊的変更の影響を受ける箇所を更新します。

https://tailwindcss.com/docs/upgrade-guide#changes-from-v3
英語の変数名の付け方

わかりやすい英語の変数名を付けるのに迷うのが嫌なので、一般法則的なものをまとめておく。

1.関数の命名
Principle01.動詞+目的語
Example01.getUserName(), setPlayerScore(), updateEnemyPos(), calculateDamage(), createEnemy(), deleteEnemy(), removeObject(), resetTimer(), loadNextScene(), sendRequest(), ProcessThrusting(),,,
Principle02.is/has/can + * (true or falseを返す場合)
Example02.isGameOver(), hasPermission(), canAttack(),,,
Principle03.on + * (なにかが発生したときに実行される場合)
Example03.onClick(), onPlayerDeath(), onCollisionEnter(), onKeyPress(),,,
2.クラスの命名
Principle01.基本は名詞を使う
Example01.Player, Enemy, GameManager,,,
Principle02.* + Manager/Contoller (管理系のクラスの場合)
Example02.GameManager, AudioManager, SceneController,,,
Principle03.* + Helper/Utils (Utilityクラスの場合)
Example03.MathHelper, StringUtils,,,
3.変数の命名
Principle01.数字は単語の後ろ
Example01.player1, player2, retryCount,,,
Principle02.序数は最初
Example02.firstPlayer, secondAttempt,,,
Principle03.* + count/limit (回数や制限を表す場合)
Example03.retryCount, speedLimit,,,
Reference03.numも良く使われるが、countの方が自然なこと多い。
[自分用メモ]Dockerのプロキシ設定

1. rootユーザに移行

2. プロキシファイルディレクトリの作成

   ```
   mkdir -p /etc/systemd/system/docker.service.d/
   ```

3. プロキシファイルの作成

   ```
   vim /etc/systemd/system/docker.service.d/http-proxy.conf
   ```

   内容は以下のとおり

   ```
   [Service]
   Environment="HTTP_PROXY=http://<プロキシサーバーのアドレス>:<ポート番号>"
   Environment="HTTPS_PROXY=http://<プロキシサーバーのアドレス>:<ポート番号>"
   Environment="NO_PROXY=<除外するホスト名またはIPアドレス>"
   ```

4. デーモンの再起動

   ```
   sudo systemctl daemon-reload
   ```

5. Dockerの再起動

   ```
   sudo systemctl restart docker
   ```

6. Dockerプロキシ設定の確認

   ```
   docker info
   ```

   以下のように、プロキシ設定が表示されればOK

   ```
    ~~~~
    HTTP Proxy: http://<プロキシサーバーのアドレス>:<ポート番号>
    HTTPS Proxy: http://<プロキシサーバーのアドレス>:<ポート番号>
    No Proxy: <除外するホスト名またはIPアドレス>
   ~~~~
   ```
#0041（2024/02/10）固定IPのネットワークの手動設定

# 固定IP設定の意味

この設定は、PCのネットワーク接続に関するパラメータを手動で固定（スタティック）設定しているという意味になります。各項目の意味は以下の通りです。

## 1. IPアドレス:例) `192.168.11.211`
- このアドレスは、ローカルネットワーク内でPCを一意に識別するための番号です。
- ネットワーク上の他の機器と重複しないように設定する必要があります。

## 2. サブネットマスク: 例) `255.255.255.0`
- これはネットワーク部分とホスト部分を区別するための情報です。
- この場合、「192.168.11.0/24」のネットワークを利用していることになり、同じネットワーク内の機器は `192.168.11.x` という形になります。

## 3. ゲートウェイ: 例) `192.168.11.11`
- ゲートウェイは、PCがローカルネットワーク外（たとえばインターネット）に通信する際の出入口となる機器（通常はルーター）のアドレスです。
- PCは、送信先がローカルネットワーク内にないパケットをこのアドレスに送ることで、外部との通信を行います。

## 4. DNSサーバ: 例) `8.8.8.8`

- `8.8.8.8` は一般的にGoogleが提供しているパブリックDNSサーバのアドレスです。
- PCがドメイン名（例: `www.example.com`）をIPアドレスに変換する際に、このサーバに問い合わせるという設定となります。
- 通常、DHCPサーバは自動的にIPアドレスなどのネットワーク設定を配布する役割を持ちます。（Dynamic Host Configuration Protocol = 動的ホスト構成プロトコル）

---

## まとめ

- **固定IPの設定**  
  PCに対して固定IP（`192.168.11.211`）を設定することで、常に同じIPアドレスでネットワークに参加することができます。

- **ネットワークの一貫性**  
  サブネットマスク `255.255.255.0` により、同一ネットワーク内（この場合は `192.168.11.x`）の機器同士が直接通信できるようになります。

- **通信の出入口**  
  ゲートウェイ `192.168.11.11` を設定することで、PCはローカルネットワーク外へ通信する際にルーターを経由します。

- **DNSサーバの設定**  
  `8.8.8.8` は通常DNSサーバとして利用され、ドメイン名の名前解決を行います。  

このような設定により、PCは常に同じアドレスでネットワークに参加し、必要な通信ルートや名前解決先が明確に決まっている状態となります。
分散並列学習の概要と様々な方式

# 分散学習とは

深層学習において、必要な計算を多数の計算機に分散させることで高速化を図る手法である。

大きくは以下2つの方法に分けることができる。

## Data Parallel

異なるデータで同じモデルを並列処理し、実行効率を上げる方法。

### 手順

1. 各デバイスに異なるデータ（バッチ）を割り当てる
2. 学習・逆伝播を行う
3. 勾配を共有し、モデルを更新する

### 更新方式

- 同期更新：パラメータサーバ
    - 1つ以上のプロセスモデルでモデルを管理
    - 各GPUからすべて勾配を受け取り次第更新
- 非同期更新：Peer-to-Peer
    - GPU間で直接勾配情報を通信
    - 1つ以上の勾配計算が完了し次第、その時点での情報で更新

## Model Parallel

モデルを分散し、1つのGPUに収まらない計算を実行可能にする。

### 手順

1. モデルを分割し、それぞれを別のGPUに展開
2. 必要に応じてGPU間通信をしながら学習

# 分散学習の課題

分散学習は、一般的に処理時間を短くできることや大規模なモデルを学習できることなどメリットばかりに思えるが、課題もあるらしい。

### Large Batch Size Problem

大規模化に伴う精度劣化

- 小さいバッチサイズでは、1ステップあたりのデータが少ないため、データの一部しか反映できない
⇒局所解に捕らわれにくくなる。
- バッチサイズを大きくすると、1ステップ当たりのデータが多くなり、データ全体に適応しやすくなってしまう
⇒局所解にとらわれやすい
- バッチサイズが大きいと、学習率が過剰に大きくなってしまう
⇒**LARS**、**LAMB**といった学習率をスケールアップする手法が有用らしい

### Staleness

非同期更新時の精度劣化

- 速く終了した勾配が最新のモデルに対して古くなってしまい、劣化を招く

### 通信コストの増大

学習の過程で必ずどこかで情報を集約・通信する必要があるため、コストが生じる

# 基本概念

### Host

分散学習ノード（マシン）のIPアドレスやホスト名

### Port

ノード間通信に使用するネットワークポート番号

### Rank

分散環境におけるノードやプロセスの識別番号

### World Size

分散環境全体のプロセス数（全GPU数）

# 分散学習の種類

## Data Parallel方式

### Data Parallel (DP)

1つのノードがメインとなって、GPUを管理する。オーバーヘッドが大きいため、現在は非推奨。

1. それぞれのGPUにmodelをコピー
2. バッチを分割して、各GPUで処理
3. 情報を集約して勾配の計算

### Distributed Data Parallel (DDP)

それぞれのGPU上のpipelineを別々のprocessが持つ。GPU間の通信は勾配の集約・分散のみとDDより少ない。

1. それぞれのGPUで学習を進める
2. 勾配を計算
3. それぞれのGPU同士で勾配の集約・分散を行う

## Model Parallel方式

### Tensor Parallel (TP)

行列積は行方向・列方向ともに分割できるという特性から、TensorをそれぞれのGPUに分割する。

### Pipeline Parallel (PP)

モデルを分割し、レイヤー毎にGPUへ振り分けることで、１つのGPUに乗りきらない大規模なModelでも学習できる。

### Fully Sharded Data Parallel (FSDP)

モデルパラメータ、オプティマイザの状態、および勾配を分割して、各GPUに分散する手法。これによりメモリを効率的に使用し、大規模なモデルを学習できる。

PyTorchに統合されており、比較的実装が簡単らしい。

### ZeRO (Zero Redundancy Optimizer)

メモリ効率を最適化するため、**段階的に**モデルパラメータ、勾配、オプティマイザの状態を分散して管理する仕組み。

DeepSpeedというMicrosoftのフレームワークに実装されており、複雑な通信パターンにより実装が少し難しいらしい。

# 使い分け

- モデルが1つのGPUに載る場合 ⇒ **DDP**
- モデルが1つのGPUに載らない場合
    - 演算ごとに細かく分割したい ⇒ **TP**
    - モデルの階層ごとに細かく分割したい ⇒ **PP**
    - PyTorchに分割はお任せしたい ⇒ **FSDP**

# 参考文献

[第111回お試しアカウント付き並列プログラミング講習会 「第1回 ディープラーニング分散学習ハッカソン」 分散学習基礎講座](https://www.cc.u-tokyo.ac.jp/events/lectures/111/20190124-1.pdf)
[大規模言語モデルを支える分散並列学習の仕組み Part1](https://zenn.dev/turing_motors/articles/0e6e2baf72ebbc)
[Distributed and Parallel Training for PyTorch](https://speakerdeck.com/tattaka/distributed-and-parallel-training-for-pytorch)
#0040（2024/02/10）NICとは

# PCのNICとは？

**NIC (Network Interface Card)** は、PCがネットワークに接続するためのハードウェアコンポーネントです。  
一般的には「ネットワークカード」とも呼ばれ、有線（Ethernet）や無線（Wi-Fi）など、さまざまな通信方式に対応しています。

---

## 主な役割

- **ネットワーク接続の実現**  
  NICは、PCとLAN（ローカルエリアネットワーク）やインターネットなどの広域ネットワーク間でデータを送受信するための物理的なインターフェースを提供します。

- **データパケットの送受信**  
  ネットワーク上で送信されるデータは、パケットと呼ばれる単位に分割され、NICによって送信・受信されます。  
  受信したパケットは、適切なプロトコルに基づいてPC内のソフトウェアに渡されます。

- **データリンク層の機能**  
  NICはOSI参照モデルの第2層（データリンク層）に位置し、**MACアドレス** を利用してネットワーク上の機器を識別し、衝突回避などの制御を行います。

---

## 主な種類

- **有線NIC**  
  - **特徴:**  
    RJ-45コネクタを備え、Ethernetケーブルを用いて接続します。  
  - **メリット:**  
    高速かつ安定した通信が可能で、ビジネス用途やデータセンターなどで広く利用されています。

- **無線NIC**  
  - **特徴:**  
    Wi-Fiモジュール（内蔵またはUSB接続のアダプタ）として実装され、ワイヤレスネットワークに接続します。  
  - **メリット:**  
    ケーブルが不要なため、モバイル環境やレイアウトの柔軟性が求められる環境に適しています。

---

## 重要な仕様

- **通信速度**  
  NICの性能は、対応する通信規格（例：Fast Ethernet、Gigabit Ethernet、10 Gigabit Ethernetなど）によって決まります。

- **MACアドレス**  
  各NICには固有のMACアドレスが割り当てられており、ネットワーク上でのデバイス識別に利用されます。

- **ドライバと設定**  
  NICは、オペレーティングシステムと連携するための専用ドライバが必要です。  
  また、IPアドレスやサブネットマスク、ゲートウェイなどのネットワーク設定が行われ、通信の基盤を構築します。

---

## まとめ

PCのNICは、ネットワーク通信を可能にするための基盤的なハードウェアコンポーネントです。  
有線と無線の両方の形態が存在し、それぞれの環境に応じた接続方法が選択されます。  
また、NICはデータリンク層の機能を担い、MACアドレスによる識別やパケットの送受信を通じて、ネットワークのパフォーマンスとセキュリティに大きな影響を与えます。
Amazon Bedrock Flows のマルチターン会話対応: 日本語での活用方法と CLI コマンド

### **はじめに**
Amazon Bedrock Flows は、AWS の生成 AI ワークフローを構築・管理するための強力なツールです。2025年1月には、エージェントノードに **マルチターン会話対応** の機能が追加され、ユーザーとの対話型インタラクションがよりスムーズになりました。[Amazon Bedrock Flows announces preview of multi-turn conversation support](https://aws.amazon.com/about-aws/whats-new/2025/01/amazon-bedrock-flows-multi-turn-conversation-support/)

本記事では、マルチターン会話対応の概要、日本語での利用可否、設定方法、および **AWS CLI を用いた実装方法** について解説します。

---

## **1. マルチターン会話とは？**

マルチターン会話とは、AI がユーザーと複数回のやり取りを行いながら、適切な情報を取得し、最適な処理を実行する対話型の仕組みです。

例えば、ホテル予約のワークフローを考えてみましょう。

**従来の課題：**
- ユーザーが「ホテルを予約したい」と入力
- 必要な情報（宿泊日数、部屋タイプなど）が不足していると、処理が失敗する

**マルチターン会話対応後の動作：**
1. ユーザーが「ホテルを予約したい」と入力
2. AI エージェントが「何泊しますか？」と質問
3. ユーザーが「3泊」と回答
4. AI エージェントが「シングルルームとダブルルームのどちらをご希望ですか？」と質問
5. ユーザーが「ダブルルーム」と回答
6. AI エージェントが予約を確定

このように、足りない情報を動的に取得することで、よりスムーズなインタラクションが可能になります。

---

## **2. 日本語での利用可否**

Amazon Bedrock Flows のマルチターン会話機能は、日本語を含む **複数の言語に対応** しています。ただし、
- 選択する **基盤モデル（Foundation Model, FM）** によって、日本語の応答精度が異なる
- 一部のモデルは、日本語の文脈理解が英語ほど高くない

例えば、Amazon Bedrock で利用可能な **Anthropic Claude や Meta Llama などのモデル** は、日本語にも対応していますが、
より高精度な対話を行うためには、日本語対応が強いモデルを選ぶ必要があります。

---

## **3. マルチターン会話の設定方法**

### **(1) AWS マネジメントコンソールでの設定**

1. **Amazon Bedrock コンソール** にアクセス
2. **Flows（フロー）** の作成
3. **エージェントノード** を追加
4. **「マルチターン会話を有効化」** をオンにする
5. **フローのデプロイ** を実行

### **(2) AWS CLI を用いた設定**

AWS CLI を使用して、マルチターン会話を有効化することも可能です。

#### **Step 1: Bedrock Flows の作成**
```sh
aws bedrock create-flow --name "hotel_booking_flow" --description "ホテル予約フロー"
```

#### **Step 2: エージェントノードの作成**
```sh
aws bedrock create-agent-node \
    --flow-name "hotel_booking_flow" \
    --node-name "HotelBookingAgent" \
    --enable-multi-turn true
```

#### **Step 3: フローのデプロイ**
```sh
aws bedrock deploy-flow --flow-name "hotel_booking_flow"
```

これにより、**日本語でもマルチターン会話が有効なフロー** を AWS 上にデプロイできます。

---

## **4. まとめ**

Amazon Bedrock Flows の **マルチターン会話対応** により、AI エージェントは動的にユーザーとやり取りしながら、より高度なインタラクションを実現できるようになりました。

 **ポイントまとめ：**
- マルチターン会話対応で、AI が足りない情報を補完可能に
- 日本語でも利用可能（ただし、基盤モデルに依存）
- AWS CLI を用いて簡単に設定・デプロイ可能

AWS Bedrock を活用し、より高度な対話型 AI フローを構築しましょう！
Serverless Framework v3でAWS API Gatewayのステージ内のメソッドを削除できない問題と対処法

## はじめに

Serverless Framework v3を使用してAWS API Gatewayを管理している際に、不要になったメソッドを削除しようとしたものの、正常に削除できないという問題が発生することがあります。本記事では、この問題の原因と解決策について解説し、具体的なCLIコマンドを用いた削除方法を紹介します。

## 問題の概要

Serverless Framework v3を使用してAPI Gatewayのリソースやメソッドを定義し、デプロイを行った後に、serverless.yml から特定のメソッドを削除して再デプロイしても、API Gatewayのステージ内のメソッドが削除されずに残り続けることがあります。

この問題の主な原因として、Serverless FrameworkがAPI Gatewayのリソース変更を適切に反映しない場合があることが挙げられます。Serverless FrameworkはCloudFormationを使用してAPI Gatewayをデプロイしますが、CloudFormationの管理外になったリソース（既にデプロイされたが、Serverless Frameworkの定義から削除されたリソース）が自動で削除されないケースがあります。

## 解決策

### 1. API Gatewayのリソースを手動で削除

Serverless Frameworkでは削除が行われない場合、AWS CLIを使用して不要なメソッドを手動で削除することが可能です。

#### **1.1 メソッドの削除**
API Gatewayの不要なメソッドを削除するには、以下のAWS CLIコマンドを使用します。

```sh
aws apigateway delete-method \
    --rest-api-id <API_ID> \
    --resource-id <RESOURCE_ID> \
    --http-method <HTTP_METHOD>
```

**パラメータの説明：**
- `<API_ID>`: API GatewayのID（`aws apigateway get-rest-apis` で取得可能）
- `<RESOURCE_ID>`: 削除したいメソッドが含まれるリソースのID（`aws apigateway get-resources --rest-api-id <API_ID>` で取得可能）
- `<HTTP_METHOD>`: 削除対象のメソッド（例: `GET`, `POST`, `PUT`, `DELETE` など）

### 2. API Gatewayのデプロイをリセット

メソッドを削除した後、API Gatewayのステージに変更を適用するためにデプロイをリセットする必要があります。

```sh
aws apigateway create-deployment \
    --rest-api-id <API_ID> \
    --stage-name <STAGE_NAME>
```

**パラメータの説明：**
- `<API_ID>`: API GatewayのID
- `<STAGE_NAME>`: 対象のステージ名（例: `dev`, `prod` など）

### 3. Serverless FrameworkでAPI Gatewayをクリーンアップ

Serverless Frameworkが不要なメソッドを削除しない場合、デプロイ前にAPI Gatewayのキャッシュをクリアするのも一つの方法です。

#### **3.1 CloudFormationスタックの削除と再デプロイ**

Serverless Frameworkが作成したCloudFormationスタックを一度削除し、API Gatewayを再デプロイすることで、不要なメソッドを完全に削除できます。

```sh
serverless remove
serverless deploy
```

この方法はAPI Gatewayのすべてのリソースを再構築するため、一部の設定が失われる可能性がある点に注意が必要です。

## まとめ

Serverless Framework v3でAPI Gatewayのステージ内のメソッドが削除できない問題の主な原因は、CloudFormationがリソースの削除を適切に管理しないことにあります。本記事では、以下の解決策を紹介しました。

1. **AWS CLIを使用して不要なメソッドを削除**
2. **API Gatewayのデプロイをリセット**
3. **Serverless FrameworkのCloudFormationスタックを削除して再デプロイ**

これらの方法を活用することで、API Gatewayの不要なメソッドを確実に削除し、適切な状態を維持することが可能になります。
カプセル化について

### カプセル化って？？
オブジェクト指向プログラミングにおいて、データやメソッドを閉じ込め、
外部からのアクセスを制限すること

###### 自分のクラスでのみ、編集を可能にする

### プロパティでの制御
C#にはオブジェクトの状態を取得・設定するためのアクセサメソッドである
プロパティが存在します。
プロパティ内で値のチェックなど処理を行う
プロパティ：フィールドにアクセスする専用のメソッド

```c#:sample.cs
public class Person
{
    private string _name;//これは変数
    
    public string Name //Nameプロパティ ここで値の処理
    {
        get { return _name; }
        set { _name = value; }
    }
}
```
※変数前に_（アンダーバー）をつけることで、クラス内部で使用される変数を
　示しています

 ### getterとsetter
 ・`get`でprivateな変数の値を取得（参照）する
  ・`set`でprivateな変数の値を変更する

  privateな変数は外から書き換えなどが不可能なため、getter,setterを用いて
  参照、変更を行う

  ```c#:sample2.cs
public class Person
{
    private string _name;//これは変数
    
    public string Name //Nameプロパティ ここで値の処理
    {
        get { return _name; } //_nameを取得
        set { _name = value; }//_nameに値を入れ込む　何もしないままだとvalueに値が自動的に入る
    }
}
```

また上記の処理は省略が可能(こんな省略しちゃうの..?)
変数の宣言とプロパティを一緒にしてる
※中で処理が必要ないときに有効
  ```c#:sample3.cs
public class Person
{
    public string Name {get;set;}//続けて=takashiと記載すると初期値を設定できる
}
```
CISの提供するツールとサービス #1 ラインナップの全体像を知る

# この記事について
米国の[Center for Internet Security, Inc. (CIS)](https://www.cisecurity.org/)が提供する、サイバーセキュリティのための支援ツールやサービス群を小分けにして考察します。

今回のテーマは **「ラインナップの全体像を知る」** です。

## この投稿の読者想定
組織のITセキュリティを体系的に強化すべく、CISのスイートを有効活用したいが、それぞれの違いや関係性がよくわからない（投稿者自身を含む）。


# 1. ラインナップの全体像

CISは多くのツール・サービスを提供していますが、先ずは全体像の把握が必要かと思います。[Cybersecurity Tools and Resources](https://www.cisecurity.org/cybersecurity-tools) の一覧を眺めましょう。


![1738909193-p6cHuydOIkATYrJe15B4lV2W.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666588/431426bf-cdd9-1417-dedb-8e5ed271a91c.png)
> Image source: Center for Internet Security (CIS), "[Cybersecurity Tools](https://www.cisecurity.org/cybersecurity-tools)", licensed under CC BY-NC-SA 4.0.


表中、左端の列がCISの提供するツール・サービス群の名称です。CIS ControlsやCIS Benchmarks辺りはよく耳にするかと思いますが、ファミリーとして相互に依存関係を持つであろう、その他多くのものが提供されています。

# 2. 三つのニーズを理解する
個々のツール・サービスを追いかける前に、"三つのニーズ"を認識しておきましょう。この三軸において有効、且つアプローチの異なるものが様々に提供されているというわけです。
* Secure your Organization（組織をセキュアにする）
* Secure your Platforms（プラットフォームをセキュアにする）
* Track Specific Threats（特定の脅威を追跡する）

# 3. アプローチの形態、費用の違いを理解する
ツール・サービスとしてのアプローチ（形態）や費用も様々で、Availabilityの列からそれぞの属性を掴むことができます。文書系、WEBサービス、コンサルティングサービス、無償・有償など、色々あるようですね。

ちなみにリンク先の列名をクリックすると、列の要素に紐づくツール・サービスの絞り込みができます。

今回はライトにここまで。ありがとうございました。
AITRIOSシステム構成とサービス

AITRIOSのシステム構成を独自に書いてみました。誰かの参考になれば幸いです。
見やすくするために、Console Developer Edition + AIH-IVRW2 に絞っています。ごめんね。

# AITRIOSシステム構成とサービス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/8af9e446-e8cd-8daf-94c0-15b860e86bf8.png)

# Edge Device

AI機能付きカメラIMX500を内蔵したカメラ。
カメラで捉えた画像をAI ModelとEdge Appで処理して出力します。
また、カメラの動作にCommand Parameterを使います。これはデバイス内部ではなく、Consoleに保存されています。（おそらく、カメラ稼働時に通信で取得している模様。）
カメラの出力は2つあります。

* 入力画像
* 推論結果

# Console

AITRIOSが提供するクラウドサービスのうちの一つ。
Edge DeviceのCommand Parameterを保持していたり、AI ModelやEdge Appをデバイスに配布したりなど、デバイスを管理する機能を持っています。
また、後述するAI Modelの学習や、Edge Device出力を保存といった機能もあります。

# Trainについて

AI Modelを作成（学習）するための手段がいくつかあります。

* Custom Vision (Cloud)
* Studio (Cloud)
* Local Studio (Local)
* TFLite/Keras/PyTorch (Local)

# Inferenceについて

カメラの出力（入力画像、推論結果）は大まかに3つのサービスへ保存/送信できます。

* Console
* Cloud Vendor
  * Azure Blob Storage
  * Azure Event Hub (推論結果のみ）
  * AWS S3
* Private Server
  * HTTP Server
SQL ServerでNLL、空文字を変換したい



# 1. はじめに
* SQL ServerでSQLの値を取得する時に、NULL、ブランクを別の値に変換したい

# 2. 開発環境
* SQL Server 2022

# 3. NULL値を変換する
## 3.1. ISNULL関数
* NULL値を固定の文字に変換する
```SQL: 例 UserNameがNULL値の場合、ブランクを取得する
SELECT 
    UserId 
    , ISNULL(UserName, '') 
FROM User;
```

## 3.2. COALESCE関数
* NULL値の場合、別のカラムの値に変換する
```SQL: 例 Career1がNULL値の場合、Career2を取得する
SELECT
    UserId
    , UserName
    , COALESCE(Career1, Career2) AS Career
FROM User;
```

# 4. ブランクを変換する
## 4.1. CASE関数
* 条件を記載して取得項目を変換する
```SQL: 例 FirstNameがブランクの場合、LastNameを取得する
SELECT 
    CASE WHEN FirstName <> '' FirstName
     ELSE LastName END AS Name
FROM User;
```
# 5. 参考文献

https://learn.microsoft.com/ja-jp/sql/t-sql/language-elements/coalesce-transact-sql?view=sql-server-ver16

https://qiita.com/WeedMashroom/items/e0db6f9bea6b3f507453
秀丸エディタにコピペしてファイル一覧を作りたい

# 1. はじめに
* サクラエディタと同じようにコピペでファイル一覧をつくりたい

# 2. 開発環境
* 秀丸エディタ Ver9.4.1 32bit edition
* Windows 11

# 3. 実行イメージ
* エクスプローラーから対象ファイルをコピーして、秀丸へペーストする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/6c85ac11-87e9-06d4-7cf9-bd8fd103b8c7.png)

# 4. 事前準備
* 秀丸エディタのマクロライブラリより「エクスプローラーでコピーしたファイルをテキストリストにしてペーストするマクロ」をダウンロードする

https://hide.maruo.co.jp/lib/macro/pastedropfile.html

# 5. 秀丸エディタの設定変更
## 5.1. マクロの格納場所を調べる
*メニューの[その他]->[動作環境]->[環境]->「マクロファイル用のフォルダ」で確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/99877fab-210d-adb1-9297-a5d610173684.png)

## 5.2. マクロを保存する
*「マクロファイル用のフォルダ」にダウンロードしたファイルを格納する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/d149ec03-f8bd-332f-0297-9534afde762c.png)

## 5.3. ```PasteDropFile.mac```をマクロに登録する
* メニューの[マクロ]->[マクロの登録] で 開いてマクロを登録する。(マクロ11以降が推奨)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/8aec9791-81f6-0894-2f46-538d593cfba4.png)

* ショートカットキー「Ctrl + V」に割り当てる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/1acc7829-cf7e-9da0-0873-c38fb7bc05ef.png)

# 6. 参考文献

https://hide.maruo.co.jp/lib/macro/pastedropfile.html

https://t-nashi.hatenadiary.org/entry/20131112/1384282562
VertiTab 2.16.0 更新：ウェブページの重要更新を見逃さない！新「タブレンズ」でサイドバーから簡単に監視


2025年2月10日にリリースされた VertiTab の最新バージョン 2.16.0 では、タブ管理の新機能「タブレンズ」が追加され、サイドバーから直接ウェブページの重要な情報を監視し、リアルタイムで更新をチェックできるようになりました。これにより、タブの中身を整理しながら、重要な更新を素早く確認できるようになります。以下では、今回のアップデートの主要な新機能、改善点、修正内容について詳しくご紹介します。

## デモ動画
新しい「タブレンズ」機能がどのように動作するのか、実際にご覧いただけるデモ動画もご用意しました。以下のリンクから動画をご確認いただき、どれだけ便利な機能かをご体験ください：

[デモ動画を見る](https://static.rabbitpair.com/public/20250207/Video_2025-02-07_220415.mp4)


## 新機能：タブレンズ
### 「タブレンズ」とは？

「タブレンズ」は、ブラウザタブ内のウェブページから重要な情報を抽出し、サイドバーで直接監視できる新しい機能です。タブタイトルに表示される情報を見逃さず、サイドバーに表示されたコンテンツをリアルタイムで更新してくれるため、複数のタブを管理しながらも、重要な変更や更新を見逃すことなく作業を進められます。

主な特徴は次の通りです：

- **重要なコンテンツの自動キャプチャ**: ウェブページから必要な情報（価格、在庫状況、通知数など）を自動的に取り込み、タブタイトルに表示します。また、サイドバーにもその情報を表示し、どのタブでどんな更新があったかをすぐに把握できます。
- **スマートなコンテンツ抽出**: ページ内で重要な要素を抽出し、タブやサイドバーに反映します。
- **リアルタイム更新**: サイドバーの情報は自動的に更新され、常に最新の状況を確認できます。
- **フォーカスモード**: サイドバーで重要なタブを強調し、気が散ることなく作業に集中できるようにします。
- **柔軟なURLルール**: 特定のURLに対して、設定を自動的に適用（完全一致、部分一致、正規表現マッチングなど）。
- **カスタマイズ可能なビジュアルスタイル**: 表示スタイルをカスタマイズして、重要な情報を視覚的に強調できます。
- **複数の表示モード**: タイトル、タグ、サブタイトルなど、サイドバー内で表示するスタイルを変更できます。
- **最大長設定とコンテンツセパレータ**: サイドバー内の情報が見やすく整理されるよう、タブタイトルや情報の長さを調整できます。
- **設定の永続化**: 各サイトごとに設定が保存され、次回訪問時にも反映されます。

**使用例**:
- **ショッピングサイト**: 価格や在庫状況をリアルタイムでサイドバーから追跡。
- **ソーシャルメディア**: 未読メッセージや通知数をサイドバーから管理。
- **プロジェクト管理ツール**: サイドバーでタスクの進捗状況や期限を一目で確認。
- **金融関連**: サイドバーから株価やポートフォリオの変動をリアルタイムで監視。

![タブレンズ機能](https://static.rabbitpair.com/public/20250207/tab_lens.webp)


## Chrome タブグループ機能の改善
新しく追加された「最初のタブのタイトルをグループ名として使用」オプションにより、タブグループの管理がより直感的になりました。

## 改善点
- プレミアム機能のプロンプトが更新され、ユーザーにログインを促すように変更されました。
- タブツリー構造の最適化により、親子関係の管理が向上。
- アニメーション制御が可能になり、パフォーマンス設定が改善されました。
- ログインボタンのテキストがよりわかりやすく更新されました。
- タブのグループ化ロジックが強化されました。

## 修正点
- タブグループ化操作中のタブオープナー関係の管理が修正されました。
- テキストの視認性向上のため、色のコントラスト計算が修正されました。
- UIコンポーネントの動作やスタイルに関するいくつかの問題が修正されました。
- ポップアップウィンドウのタブ切り替えに関する問題が解決されました。
- ランタイムメッセージのエラー処理が改善されました。

## インストール方法
VertiTab をまだインストールしていない場合は、以下のリンクからインストールできます：

[VertiTabをインストール](https://chromewebstore.google.com/detail/chejfhdknideagdnddjpgamkchefjhoi)

新しいバージョン 2.16.0 では、タブ管理がさらに進化しました。サイドバーから重要な更新を監視し、タブの整理も効率的に行えるようになり、作業がより快適になります。ぜひアップデートして、その機能を体験してください！
rust クロージャってなんだ！？

数字が入っている配列の最も大きい値のインデックス値が欲しくなった

調べたらこのようなプログラムが、、、

```rs
fn main() {
    let arr = [3, 10, 5, 8, 12, 7];

    // 最大値の要素番号（インデックス）を取得
    let max_index = arr.iter()
        .enumerate()
        .max_by_key(|&(_, &value)| value)
        .map(|(index, _)| index);

    match max_index {
        Some(idx) => println!("最大値の要素番号: {}", idx),
        None => println!("配列が空です"),
    }
}
```

え。。。？
```rs
        .max_by_key(|&(_, &value)| value)
        .map(|(index, _)| index);
```
なにこれ・・・？

と思って調べました

クロージャ（無名関数） で、Rust の max_by_key() に渡される比較用の関数らしいです

まだよくわからない

## クロージャとは
|x, y| x + y のように |引数| 処理 という形で書く。

[凄くわかりやすい記事](https://zenn.dev/mebiusbox/books/22d4c1ed9b0003/viewer/64c6f3)

このような例も
```rs
fn main() {
    let add = |x, y| x + y; // クロージャ
    println!("{}", add(2, 3)); // 出力: 5
}
```
このような使い方以外にも、このクロージャ式を関数の引数に書いて、そのクロージャの結果をかんすうにひきすうとして渡すこともできるのだとか。

クロージャのような機能に触れたことがないのでびっくりです

そもそも知らなかったけど、Rust では `*_`（アンダースコア）には 「無視する（不要な値）」 という意味があります。
rustの「アンダースコア」の意味について

Rust では *_（アンダースコア）には 「無視する（不要な値）」 という意味があります。

通常、関数の引数やタプルの一部を 使わない場合、Rust では警告が出ることがあります。 その時に `let _` を使うことで 未使用変数の警告を回避 できます。

### ふつうに変数を無視すると・・・
```rs
fn main() {
    let x = 10;
}
```
このように実行すると・・・
```rs
warning: unused variable: `x`
 --> src/main.rs:2:9
  |
2 |     let x = 10;
  |         ^ help: if this is intentional, prefix it with an underscore: `_x`
```
警告が出る

---

`_` を使うことで意図的に使わないことをアピール

```rs
fn main() {
    let _x = 10; // _x は使わなくても警告が出ない
}
```
`_x` という変数名にすることで、「この変数は意図的に使わない」と Rust に伝えられる。

fn main() {
    let _ = 10; // 何もしない（変数を一切作らない）
}
`_ = 10;` は「値 `10` を使わずに捨てる」ことを意味する。

## 使用例

### タプルの一部を無視する

```rs
fn main() {
    let tup = (1, 2, 3);

    let (a, _, c) = tup; // 2 を無視
    println!("a: {}, c: {}", a, c);
}
```
output
```
a: 1, c: 3
```

### enumerate() のインデックスを無視
```rs
fn main() {
    let arr = [10, 20, 30];

    for (_, value) in arr.iter().enumerate() {
        println!("{}", value);
    }
}
```
output
```
10
20
30
```

### 関数の引数を無視する
```rs
fn unused_param(_x: i32) {
    // `_x` を使わないが警告は出ない
}
```

### _ を型のプレースホルダーとして使う
#### 型推論を Rust に任せる
```rs
fn main() {
    let num: _ = 10; // Rust が型 `i32` を推測
    println!("{}", num);
}
```

#### Vec の型を _ で省略
```rs
fn main() {
    let v: Vec<_> = vec![1, 2, 3]; // Rust が `Vec<i32>` だと推測
}
```

### match 式で _ をワイルドカードとして使う
```rs
fn main() {
    let number = 5;

    match number {
        1 => println!("1です"),
        2 => println!("2です"),
        _ => println!("その他の数字です"),
    }
}
```
output
```
その他の数字です
```

### _ を関数の戻り値で使う
Ok(_) で成功時の値を無視
```rs
fn main() {
    let result: Result<i32, &str> = Ok(42);

    match result {
        Ok(_) => println!("成功"),
        Err(err) => println!("エラー: {}", err),
    }
}
```
output
```
成功
```

### _ をジェネリック型のプレースホルダーとして使う
ジェネリック型 T などを _ で省略できる。
::<_> を使うことで、Rust に型推論を任せる。
```rs
fn add<T: std::ops::Add<Output = T>> (a: T, b: T) -> T {
    a + b
}

fn main() {
    let result = add::<_>(10, 20); // Rust が型を自動推測
    println!("{}", result);
}
```