OmniAICreator/Qiita-1.07M huggingface dataset:
RDKit FingerprintGenerator

## RDKitのAllChem.GetMorganFingerprintAsBitVectでエラー

新しめのバージョンのRDKitでAllChem.GetMorganFingerprintAsBitVectすると以下のエラーが出ました
```
DEPRECATION WARNING: please use MorganGenerator
```

issueもありました

https://github.com/rdkit/rdkit/issues/7625

Gregさんが回答してくださっている、以下のRDKit blogの通りにすればエラーは出なくなります。従来のやり方ではなくこちらの方が推奨される理由は、"The idea of the new code is that all supported fingerprinting algorithms can be used the same way."だそうです。

https://greglandrum.github.io/rdkit-blog/posts/2023-01-18-fingerprint-generator-tutorial.html

↓みたいな感じで書き換えればエラーが出なくなりました。
```python
from rdkit import Chem
from rdkit.Chem import rdFingerprintGenerator

# generator
mfpgen = rdFingerprintGenerator.GetMorganGenerator(radius=2,fpSize=2048)

# smi -> fp
smi = "CCC"
m = Chem.MolFromSmiles(smi)
fp = mfpgen.GetFingerprint(m)
```
Apple HFS+ディスクイメージのマウント

# マウント

```
sudo mkdir /mnt/mount_point
sudo kpartx -av /path/to/disk.img
sudo mount -t hfsplus /dev/mapper/loop0p1 /mnt/mount_point
```

# アンマウント

```
sudo umount /mnt/mount_point
sudo kpartx -d /path/to/disk.img
sudo losetup -d /dev/loop0
suro rm -f /dev/loop0
```
🤖 AIエージェント革命！🚀 デジタルインタラクションを変える次世代AIの可能性

AIの進化は止まることを知らず、**「AIエージェント」** が今、新たなデジタルインタラクションの形を築いています。かつてのAIは、単なるツールやアシスタントとして機能していましたが、近年ではユーザーとの関わり方が劇的に変化しています。

本記事では、AIエージェントの最新トレンド、どのように私たちの生活やビジネスを変えているのか、そして今後の展望について詳しく解説します！🚀

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/215ace5a-20ee-440f-9ef7-5d98b05aa608.png)

---

## **📌 AIエージェントとは？**

AIエージェントとは、**自律的に判断し、タスクを実行する人工知能システム**のことを指します。これまでのAIは、ユーザーが指示を与えないと動作しない「受動型」でしたが、AIエージェントは、

✅ **ユーザーのニーズを予測し、主体的に行動**
✅ **マルチステップのタスクを処理し、最適な解決策を提供**
✅ **環境から学習し、経験を活かして進化する**

といった能力を備えており、まるでデジタル秘書のような存在へと進化しています。

例えば、GoogleやOpenAI、Anthropicといった企業が開発する**高度なAIエージェント**は、単に質問に答えるだけでなく、複雑な意思決定を行い、タスクを自動化するレベルにまで進化しています。


---

## **🛠️ AIエージェントの活用事例**

AIエージェントはすでに**私たちの日常生活やビジネス**において、次のような形で活用されています。

### **1️⃣ カスタマーサポートの自動化** 💬

💡 **企業は、AIエージェントを導入して、顧客の問い合わせ対応を大幅に効率化しています。**

- OpenAIの**ChatGPT**やAnthropicの**Claude**などは、ユーザーの過去の問い合わせ履歴を学習し、より適切な対応を提供。
- AIが**FAQの対応や予約管理を担当**し、オペレーターの負担を軽減。
- 会話型AIは、単なる「応答システム」ではなく、ユーザーの意図を理解し、**最適な提案を自動で行う**。

### **2️⃣ AIエージェントによるパーソナライズドな検索と情報収集** 🔎

💡 **検索エンジンに頼らず、AIエージェントが必要な情報を自動で収集し、まとめて提供！**

- Googleが開発中のAIエージェントは、従来の検索エンジンを超えて、**ユーザーの好みに合わせた情報を最適な形で整理**してくれる。
- 例えば、「次の旅行の計画を立てたい」と言うだけで、**おすすめの宿泊施設、移動手段、観光スポットを統合して提案**。

### **3️⃣ 電子商取引（EC）の自動最適化** 🛒

💡 **AIエージェントは、ECサイトでのユーザー体験を大幅に向上させる！**

- Amazonや楽天のAIエージェントは、顧客の過去の購買データを学習し、**パーソナライズされた商品提案**を行う。
- **AIが価格比較を行い、最もコストパフォーマンスの良い選択肢を提示**。
- 「最適なノートPCが欲しい」と伝えると、**スペックやレビューを自動で分析し、最適な製品を提案**。

### **4️⃣ AIエージェントによるオートメーション業務** 📊

💡 **企業内での作業を自動化し、生産性を向上させる！**

- スケジュール管理、メールの自動返信、タスクの割り当てなど、AIエージェントが**オフィスワークを自動化**。
- AIエージェントがドキュメントを解析し、レポートを自動生成。
- プロジェクト管理ツールと連携し、タスクの進捗をリアルタイムで把握。


---

## **📊 AIエージェントの今後の展望**

### **🧠 1. より高度な意思決定能力の向上**

AIエージェントは、今後さらに高度な推論能力を持ち、**より複雑な意思決定が可能**になります。

🔹 **ビジネス戦略の立案や市場分析をAIが自動で実行する時代が来るかも！？**
🔹 **AIエージェントが法律文書を解釈し、適切な法的アドバイスを提供するようになるかも！？**

### **📡 2. AIエージェント同士の連携が進む**

異なるAIエージェント同士が連携し、**より効率的なタスク処理が可能に**。

🔹 例えば、**スケジュール管理AIとメール管理AIが連携**し、会議の予定を自動調整。
🔹 ECサイトのAIが、銀行のAIと連携し、最適な支払いプランを提案。

### **🤖 3. AIが「感情」を持つ？**

近い将来、AIエージェントは「感情を理解し、適切に反応する能力」を持つようになる可能性があります。

🔹 **ユーザーの声のトーンや表情を解析し、最適な対応をするAIエージェントが登場！？**
🔹 **カウンセリングAIが、ユーザーの感情に寄り添った対応をする時代に！？**

---

## **🎯 まとめ：AIエージェントが未来のデジタル体験を変える！**

✅ **AIエージェントは、検索、EC、オートメーション、カスタマーサポートなど、あらゆる分野で活躍！**
✅ **今後は、より高度な意思決定能力を持ち、AI同士が連携する時代へ！**
✅ **感情を理解するAIエージェントが登場し、より人間らしい体験が可能になるかも！？**

AIエージェントは、私たちのデジタルライフを根本から変える革命的な存在となりつつあります。あなたは、AIエージェントがどのように進化してほしいですか？ **ぜひコメントで意見を聞かせてください！😊**
Ubuntu: jose を使う

Ubuntu 24.10 のパッケージに　python の jose がないので、仮想環境で pip でインストールします。

仮想環境の使い方はこちら
[Ubuntu で Python の仮想環境を使う](https://qiita.com/ekzemplaro/items/6eb8098c9ac8a07a972d)

## 仮想環境をアクティベイト

```text
$ source myenv/bin/activate
(myenv) uchida@shimizu: ~$
```

## jose のインストール

```bash
pip install jose
```

./myenv/lib/python3.12/site-packages にインストールされました。

## jose のテスト

```text
(myenv) uchida@shimizu: ~$ python
Python 3.12.7 (main, Feb  4 2025, 14:46:03) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from jose import jws
>>> signed = jws.sign({'aa': 'bb'}, 'secret', algorithm='HS256')
>>> print(signed)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhYSI6ImJiIn0.lEijQJvrHVHycblxAUTYTFexPExaoXEbQo1VxzZcurM
>>> jws.verify(signed, 'secret', algorithms=['HS256'])
b'{"aa":"bb"}'
>>>
```

## テストスクリプト

```python:jose_test01.py
from jose import jws
#
signed = jws.sign({'aa': 'bb'}, 'secret', algorithm='HS256')
print(signed)
vv = jws.verify(signed, 'secret', algorithms=['HS256'])
print(vv)
```

実行結果

```text
$ python jose_test01.py 
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhYSI6ImJiIn0.lEijQJvrHVHycblxAUTYTFexPExaoXEbQo1VxzZcurM
b'{"aa":"bb"}'
```

## 確認したバージョン

```text
$ python
Python 3.12.7 (main, Feb  4 2025, 14:46:03) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import jose
>>> jose.__version__
'3.4.0'
>>> 
```

## 参考ページ

[JSON Web Signature](https://python-jose.readthedocs.io/en/latest/jws/index.html#examples)
Flutter 非推奨　ウィジェット

| 非推奨（deprecated）                | 代替（Material 3対応）                          | 備考 |
|--------------------------------|--------------------------------|--------------------------------|
| `ElevatedButton.icon` | `FilledButton.icon` | M3の `FilledButton` に置き換え |
| `TextButton.icon` | `FilledButton.icon` | M3では `FilledButton` が推奨 |
| `OutlinedButton.icon` | `OutlinedButton` | `OutlinedButton.icon` が廃止され、直接 `OutlinedButton` を使う |
| `ElevatedButtonThemeData.style` | `FilledButtonThemeData.style` | M3では `FilledButton` が推奨 |
| `OutlinedButtonThemeData.style` | `OutlinedButtonThemeData.styleFrom` | `OutlinedButton` 用の新テーマ |
| `TextButtonThemeData.style` | `TextButtonThemeData.styleFrom` | `TextButton` 用の新テーマ |
| `FloatingActionButton` (M2) | `FloatingActionButton.large` / `FloatingActionButton.small` | サイズオプションが変更 |
| `FloatingActionButton.extended` | `FloatingActionButton.large` / `FloatingActionButton.small` | サイズオプションが変更 |
| `AppBar` | `AppBar（M3スタイル適用）` | `surfaceTintColor` などの変更あり |
| `AppBar.backgroundColor` | `surfaceTintColor` を使用 | 背景色の変更を `surfaceTintColor` に統一 |
| `Dialog` | `AlertDialog（M3適用）` | `useMaterial3: true` によりデザイン変更 |
| `SnackBar` | `SnackBar（M3適用）` | M3では影や背景のデフォルトが変更 |
| `SnackBarBehavior.fixed` | `floating` | M3では `floating` が推奨 |
| `BottomNavigationBar` | `NavigationBar` | M3では `NavigationBar` に統一 |
| `PopupMenuButton` | `MenuAnchor` | メニューの制御がより柔軟に |
| `Chip` | `FilterChip`, `ElevatedChip`, `AssistChip`, `InputChip` | Chip の種類がより詳細に分かれた |
| `ChipThemeData` (M2) | `ChipTheme` (M3) | Chip のデザインが M3 に統一 |
| `Checkbox` | `Checkbox.adaptive` | M3ではデザインが変更、適応型の使用推奨 |
| `ButtonStyleButton.iconAlignment` | `styleFrom` のオプションを使用 | `ButtonStyle` の一部として提供 |
| `ThemeData.dialogBackgroundColor` | `DialogThemeData.backgroundColor` | `DialogTheme` の正規化 |
| `MaterialStateProperty<T>` | `WidgetStateProperty<T>` | M3では `WidgetStateProperty` に移行 |
Calendar Selector for Google Calendarの代替

## グーグルカレンダーのグルーピング機能

Calendar Selector for Google Calendarは会議室のみ、自分の部署のみ、部長以上だけ表示など、プリセットしておくことでカレンダーに表示する人・会議室をワンクリックで切り替えることができるchromeの拡張機能です。

## ほかにも似たものはないか

リンク（Easy Grouping for Google Calendar）
https://chromewebstore.google.com/detail/easy-grouping-for-google/kohnpgjnebgngobifoimegihoblapbnl?hl=ja&utm_source=ext_sidebar

大体似たことができる上に動作が少し早い印象
Karpenterで起動したBottlerocketのdefault registryをmirror.gcr.ioに変更してDocker HubのRate Limit回避する

Docker HubのRate Limitが4月1日から10pull/hourになるため、Karpenterで起動するBottlerocketノードのデフォルトレジストリを[mirror.gcr.io](https://docs.docker.com/docker-hub/usage/)に変更して利用する手順を紹介します。

## 1. Karpenterの設定

Bottlerocketのuser-dataに以下のTOMLスニペットを追加します。これにより、Docker Hubのpull要求が`mirror.gcr.io`を経由するようになります。

```diff
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
  name: my-bottlerocket
spec:
  amiFamily: Bottlerocket
+ userData: |
+   [[settings.container-registry.mirrors]]
+     registry = "docker.io"
+     endpoint = ["https://mirror.gcr.io"]
```

## 2. まとめ

この設定により、Docker Hubのpull要求はデフォルトで `docker.io` ではなく `mirror.gcr.io` を利用するようになり、4月1日からのRate Limit（10pull/hour）による影響を回避できます。実際にPodをデプロイして、pullの挙動も併せて確認してください。
【Salesforce】Lightning Web Components（LWC）を使用したページ更新を伴わないケースレコードのリフレッシュ

## はじめに

Salesforceでの作業中、ページ全体を再読み込みすることなくレコードデータをリフレッシュしたい場面は多々あります。
例えば、Amazon Connectとの連携を考えた場合、通話中にページ全体をリフレッシュしてしまうと、通話が途切れてしまうため、部分的にリフレッシュしたい場面があります

そこで、今回はLightning Web Components（LWC）を使用して、ページ全体を再読み込みせずに対象のレコードのデータをリフレッシュする方法を記載します。
今回はケースオブジェクトを使用した方法の記載とします。

## Lightning Web Components

```caseDetails.html
<template>
    <lightning-card title="ケース詳細" icon-name="standard:case">
        <div class="slds-m-around_medium">
            <div style="text-align:right;">
                <lightning-button-icon onclick={handleRefresh} icon-name="utility:refresh"></lightning-button-icon>
            </div>
            <lightning-record-form object-api-name="Case" record-id={recordId} layout-type="Full" columns="2" mode="view"></lightning-record-form>
        </div>
    </lightning-card>
</template>

```

```caseDetails.js
import { LightningElement, api } from 'lwc';
import { notifyRecordUpdateAvailable } from 'lightning/uiRecordApi';

export default class CaseDetails extends LightningElement {
    @api recordId;

    handleRefresh() {
        //リフレッシュボタン押下時にLightningデータサービス（LDS）へ変更通知をする
        //通知することにより、関連コンポーネントがリフレッシュされる
        notifyRecordUpdateAvailable([{recordId: this.recordId}]);
    }
}

```

https://developer.salesforce.com/docs/platform/ja-jp/lwc/guide/reference-notify-record-update.html

※ `getRecordNotifyChange` は現在非推奨のため、 `notifyRecordUpdateAvailable` を使用する

## 実際の画面

下記のGIFは、作成したLWC内のボタンでケースレコードのリフレッシュ操作が行われても、Amazon Connectを通じた通話が継続されていることが確認できます。

![LWC-GIF.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718267/bca4f082-c7b6-40a9-be89-cf20cdf754f8.gif)

## 追記

本記事の続きとして、ケースレコードの更新を検知し、リフレッシュが必要かどうかをコンポーネントに表示する方法を記載した記事を作成しました。

https://qiita.com/kotaro-saito/items/d756fa29ac12559a6aba
プリアンブルについて理解する

# はじめに
イーサネットの仕様であるプリアンブルについて理解を深める。
主にプリアンブルのビットの値について言及しつつ1Gbpsでどんな値として扱われるのかとLSBでの値の変換結果についての理解を目指す。

# イーサネットとは？
パソコンなどのデバイスをインターネットに接続する際に、ケーブルを使用して正しくデータを送受信する通信規格の一つ。
1973年に米ゼロックスのパロアルト研究所で開発され、1983年にIEEEで標準規格802.3として認められている。
データ様式のことをイーサネットフレームもしくはMACフレームと呼ぶ。
イーサネットフレームは最小64byte、最大1518byteとなり内容は宛先MACアドレス、送信元MACアドレス、タイプ、ペイロード、FCSから構成される。
VLANタグが附属する場合もあるがオプションであり必須ではない。
後述するプリアンブルとSFDを足した場合は物理層パケットと呼称される。

# プリアンブルとは？
preambleを英英辞典[^1]で調べると
> an introduction to a book or a written document; an introduction to something you say

訳は本やドキュメントにおいてイントロダクションにあたる部位に相当する。

イーサネットにおいてはパケットで情報をやり取りする際の序文にあたる内容がプリアンブルである。

# ビットパターン
プリアンブルの伝送路上のビットパターンは以下のようになる。
``` 10101010 10101010 10101010 10101010 10101010 10101010 10101010 ```

ビットの交互パターン```10```を連続させており、受信側はこの情報を元に同期を行う。

これらの信号は LSB[^2]が先頭となる十六進表現を使うことがある。
1Gbps通信のGMIIは8並列バスのため```10101010```が対応部位となる。
そのビットを反転すると```01010101```となりこれを16進数に変換すると0x55となる。

なおプリアンブルの後に続く１オクテットの情報をSFD[^3]と呼び、```10101011```のパターンで表現されている。
また8並列バスで反転計算すると```11010101```となり、16進数に変換すると```0xD5```となる。

# 考察
``` 10101010 ```というパターンだけだと直感的でないが
この２進数を16進数に直すと```AA```になる。
つまりこの値を設定する際に```AA```を並べた値を検出に利用するようにしたのではないかと考えられる。
またSFDを加えても
``` AA AA AA AA AA AA AA AB ```
となり明瞭にしたのではないかと考えられる。

# 参考資料

https://www.youtube.com/watch?v=eUM23QPRpLE

https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0

https://wa3.i-3-i.info/word1539.html

https://nw.tsuda.ac.jp/lec/ether2/

# 注釈
[^1]: Oxford Learner's Dictionariesより引用 https://www.oxfordlearnersdictionaries.com/definition/english/preamble
[^2]: LSB 【Least Significant Bit】 最下位ビット https://e-words.jp/w/LSB-2.html
[^3]: SFD 【Start Frame Delimiter】 開始フレーム識別子https://e-words.jp/w/SFD.html
npm run devを実行してもローカルサーバーが立ち上がらない時の対処法

初めまして！
普段Xで活動しているmuguと申します！
Xで活動している傍ら、エンジニアとして開発している際に出てきたエラーや制作物をこちらのQiitaにまとめていこうと思います。

## エラー内容

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929144/798a793e-165a-4299-bfb5-5b612e7fdc21.png)

画像のような感じでブラウザにてアクセスしてみると「ERR_CONNECTION_REFUSED」と表示されました

## 環境情報

- OS: Windows 10 (10.0.19045)
- Node.js: v22.12.0 → v18.17.0（解決後）
- Next.js: v14.2.0 → v13.4.19（解決後）

## 試した解決策

### 1. 実行する際のディレクトリの確認
→合っていました

### 2. 新規で別のフォルダを作成してみたが効果なし

### 3. ポート番号の変更
・3000→4000に変更

### 4. node_modulesとpackeg.jsonの再インストール
→効果なし


## 最終的な解決策

上記の修正を試みましたが、根本的な問題はNode.jsとNext.jsのバージョンの互換性にありました。

### 解決策1: Node.jsのバージョンを変更

NVM for Windowsを使用して、Node.jsのバージョンを変更しました：

```
nvm install 18.17.0
nvm use 18.17.0
```

### 解決策2: Next.jsのバージョンをダウングレード

`package.json`ファイルを編集して、Next.jsのバージョンを14.2.0から13.4.19に変更しました：

```json
{
  "dependencies": {
    "next": "13.4.19",
    // ...
  },
  "devDependencies": {
    "eslint-config-next": "13.4.19",
    // ...
  }
}
```

その後、依存関係を再インストールしました：

```
npm install
```

## まとめ

この問題は、主に以下の2つの要因によって引き起こされていました：

1. **Node.jsのバージョンが新しすぎた**：Node.js v22.12.0は最新すぎるため、Next.jsとの互換性に問題がありました。LTSバージョン（v18.17.0）に変更することで解決しました。

2. **Next.jsのバージョンの問題**：Next.js 14.2.0はまだ安定していない部分があり、特にWindowsパスの処理に関するESMの問題がありました。バージョン13.4.19に変更することで解決しました。

この経験から、新しいプロジェクトを始める際は、互換性のあるバージョンの組み合わせを使用することが重要だと学びました。特に最新のバージョンを使用する場合は、公式ドキュメントで推奨されるNode.jsのバージョンを確認することをお勧めします。
AIが解き明かす！ DNAの3D構造解析を革新する新手法 〜複数のゲノムデータを統合する最適な解像度を自動決定〜

Taguchi, YH., Turki, T. Novel AI-powered computational method using tensor decomposition for identification of common optimal bin sizes when integrating multiple Hi-C datasets. Sci Rep 15, 7459 (2025). https://doi.org/10.1038/s41598-025-91355-8

### **一般読者向けのまとめ**
この研究では、**DNAの立体構造を解析するHi-Cデータをより正確に扱うための新しいAI手法**を開発しました。Hi-Cデータを解析するときに、どのくらい細かくデータを区切るか（ビンサイズ）が重要ですが、従来の方法では複数のデータセットを統合する際に最適なサイズを決めるのが難しかったのです。

今回の研究では、**AIを活用した新しい数学的手法**（テンソル分解）を用いることで、データの構造を自動的に解析し、**最適なビンサイズを決めることができる**ようになりました。この方法を使えば、Hi-Cデータの解析精度を高め、遺伝子の働きをより詳細に調べることができます。

# はじめに

この技術は、**ゲノム研究や医学研究に役立つ可能性があり、将来的には病気の診断や新しい治療法の開発につながるかもしれません**。



この[論文]( https://doi.org/10.1038/s41598-025-91355-8)は、**複数のHi-Cデータセットを統合する際の最適なビンサイズ（解像度）の決定方法**について、新しいAIを活用した計算手法を提案しています。具体的には、**テンソル分解（Tensor Decomposition: TD）に基づく教師なし特徴抽出（Unsupervised Feature Extraction: FE）を適用することで、最適なビンサイズを自動的に決定**できる方法を開発しました。

---

### **背景**

 Hi-Cデータは、ゲノムの立体構造（クロマチン相互作用）を解析するために用いられる技術ですが、データを解析する際には「**ビンサイズ**」（遺伝子情報を区切る解像度）が重要です。

- **ビンサイズが大きすぎる**と、細かいクロマチン構造を見落とす可能性がある。
- **ビンサイズが小さすぎる**と、短いリードが細かく分割され、統計的なノイズが増えてしまう。

特に**複数のHi-Cデータセットを統合する場合、すべてのデータセットで共通の最適なビンサイズを見つけることが困難**です。従来の手法では、個々のデータセットの品質評価に基づいてビンサイズを決定する方法がありましたが、それでは**統合したときの最適な解像度を決めることができません**でした。

---

### **研究の貢献**

この研究では、新しい手法として**ATDベースの教師なし特徴抽出**（TD-based unsupervised FE）を用いることで、最適なビンサイズを決定できることを示しました。この方法の特徴は以下の通りです。

1. **フェーズトランジション（相転移）現象**を利用し、最適なビンサイズを自動的に決定。
2. **事前にしきい値を設定する必要がない**（パラメータの調整が不要）。
3. **既存のHi-Cデータ解析ツール（QuASARやmultiHiCcompare）では対応できなかった、複数データセットの同時解析が可能**。

---

### **方法**
- **Hi-Cデータセット**（GSE260760およびGSE255264）を用いて、異なるビンサイズでTDベースの教師なし特徴抽出を適用。
- **隠れた共通構造**（hidden common structure）がどのビンサイズまで維持されるかを分析し、相転移現象が起こるビンサイズを最適解として選択。
- **CTCF結合部位やTAD（トポロジカル関連ドメイン）などの機能部位との相関を評価**し、この手法の有効性を確認。

---

### **結果**
- 提案手法により、**ビンサイズが小さすぎると共通の構造が失われることが確認され、最適なビンサイズを自動で決定できることを実証**。
- 具体的には、**GSE260760では100万塩基（1,000,000 bp）、GSE255264では15万塩基（150,000 bp）が最適**であると推定された。
- **既存の単純な平均処理（simple averaging）よりも、TDベースの教師なしFEのほうが機能部位との相関が高い**ことが示され、この手法の精度の高さが確認された。

---

### **結論**
- **Hi-Cデータの解析において、TDベースの教師なし特徴抽出を用いることで、最適なビンサイズを自動決定できる**ことを示した。
- **この手法により、複数のHi-Cデータセットを統合する際の解析精度を向上できる**。
- **従来手法では困難だった「複数のHi-Cデータセットを統合する際の最適解」を見つけることが可能となった**。

---
Christofidesアルゴリズム

Christofidesアルゴリズムは、度量TSP（Metric Traveling Salesman Problem）に対して、最適解の総コストの **3/2倍以内** という保証付きで近似解を求める有名なアルゴリズムです。以下では、アルゴリズムの前提条件、手順、具体例を交えて、解説します。

---

## 1. 問題の背景

**旅行セールスマン問題（TSP）** は、与えられたすべての都市を一度ずつ訪問し、出発地点に戻る最短経路を求める問題です。しかし、TSPはNP困難であるため、最適解を求めるのは計算量的に現実的ではありません。

**度量TSP** は、以下の条件を満たすTSPです：

- **非負性**：任意の都市間の距離は0以上（自己ループは0）。
- **対称性**：\( c(i, j) = c(j, i) \)（都市間の移動コストは同じ）。
- **三角不等式**：任意の3都市 \(i, j, k\) に対して、\( c(i, k) \leq c(i, j) + c(j, k) \) が成り立つ。

これらの条件が成立することで、ある種の近似手法が理論的に保証できるようになります。

---

## 2. Christofidesアルゴリズムの手順

Christofidesアルゴリズムは大きく3つのステップに分かれます。

### 2.1 最小全域木（MST）の構築

- **目的**：全都市を含むグラフから、全体の総移動コストが最小となる全域木（MST）を求めます。  
- **性質**：MSTの総コストは、最適なTSP解のコスト（OPT）以下であるため、基礎として利用可能です。

### 2.2 奇数次数頂点の最小完璧マッチング

- **奇数次数頂点の抽出**：MSTの中で次数が奇数の頂点集合 \(O\) を求めます。  
  ※グラフの性質上、奇数次数頂点は必ず偶数個存在します。
- **最小完璧マッチングの計算**：頂点集合 \(O\) 上で、全ての頂点をペアに分ける完璧マッチングを求めます。このとき、各ペアの辺の総和が最小となるようにします。  
- **目的**：このマッチングをMSTに加えることで、すべての頂点の次数を偶数にし、オイラーグラフ（全辺を一度ずつ通る経路が存在するグラフ）を構成します。

### 2.3 オイラー路の構成とショートカット

- **オイラー路の構成**：MSTと最小完璧マッチングを合わせたグラフはすべての頂点の次数が偶数になるため、オイラー路が存在します。  
- **ショートカット（Shortcutting）**：オイラー路は同じ頂点を複数回訪れる可能性がありますが、TSPでは各都市を一度だけ訪問する必要があります。そこで、既に訪問した頂点が再び現れた場合は、直接次の新しい頂点へ移動（ショートカット）します。  
  ※度量TSPでは三角不等式により、ショートカットをしても全体のコストは増加しません。

---

## 3. 具体例による説明

例えば、次のような都市と距離が与えられたとします：

| 都市 | A  | B  | C  | D  |
|------|----|----|----|----|
| **A** | 0  | 10 | 15 | 20 |
| **B** | 10 | 0  | 35 | 25 |
| **C** | 15 | 35 | 0  | 30 |
| **D** | 20 | 25 | 30 | 0  |

### ステップ1：MSTの構築
- **例**：辺 \(A\)–\(B\) (10)、\(A\)–\(C\) (15)、\(A\)–\(D\) (20) を選んだとします。  
- **MST総コスト**：\(10 + 15 + 20 = 45\)

### ステップ2：奇数次数頂点のマッチング
- **奇数次数の頂点**：このMSTでは、頂点Aの次数は3（奇数）、B, C, Dの各頂点は次数1（奇数）となります。  
- **最小完璧マッチング**：例えば、頂点BとDをペアにすると、距離は25となり、これが最小となる組み合わせと仮定します。

### ステップ3：オイラー路とショートカット
- **グラフ合成**：MSTに最小完璧マッチングの辺を加えると、すべての頂点の次数が偶数になり、オイラー路が構成可能です。  
- **ハミルトン閉路への変換**：オイラー路上で、既に訪問済みの頂点が出現した際はショートカットを行い、各都市を一度だけ訪問する巡回路に変換します。

---

## 4. アルゴリズムの評価

Christofidesアルゴリズムでは、以下の保証が成り立ちます：

- **MSTの性質**：\( \text{MSTのコスト} \leq \text{OPT} \)
- **マッチング部分**：最小完璧マッチングのコストは \( \leq \frac{1}{2} \times \text{OPT} \)
- **総コスト**：したがって、最終的なハミルトン閉路のコストは  
  \[
  \text{MST} + \text{Matching} \leq \text{OPT} + \frac{1}{2}\,\text{OPT} = \frac{3}{2}\,\text{OPT}
  \]

つまり、Christofidesアルゴリズムによって得られる解は、最適解のコストの \( \frac{3}{2} \) 倍以内に収まることが保証されます。

---

## 5. まとめ

- **問題設定**：TSPは各都市を一度だけ訪問して最短巡回路を求める問題で、NP困難です。
- **度量TSP**：非負性、対称性、三角不等式が成立するTSPであり、近似アルゴリズムが適用可能です。
- **Christofidesアルゴリズムの手順**：
  1. MSTを構築する
  2. MSTの奇数次数頂点に対して最小完璧マッチングを行う
  3. MSTとマッチングを合成し、オイラー路を構成 → ショートカットでハミルトン閉路に変換する
- **評価**：最終解は最適解の \( \frac{3}{2} \) 倍以内のコストであることが保証される

このアルゴリズムは、複雑なTSP問題に対して、シンプルな手法（MSTとマッチング）を組み合わせることで、計算可能な近似解を提供する点で非常に有用です。
GecoDriver  Selenium インスト Safari設定

<h4>selenium インスト</h4>

```ruby:qiita.rb
pip install selenium
```
<br>
<h4>safari　開発環境 設定 </h4>
<p>safari　→ 設定　→詳細タブ → 一番下チェック</o>

![スクリーンショット 2025-02-17 20.20.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/2e8137f5-2fba-4550-a02e-cfc00c18b47b.png)

<br>
<h4>GeckoDriver インスト</h4>

```ruby:qiita.rb
brew install geckodriver
```

<br>
<h3>code</h3>

```ruby: ✅ 

```
大学3年のJKが1ヶ月で応用情報に一発合格した話

## はじめに
あと1ヶ月ちょっとしかなくて諦めかけてる人，なんとかなります．
<br>

お初にお目にかかります．大学3年のJK(情報工学部生)，shigureです．
R5の応用情報秋期試験に合格したので，その時の記憶を引っ張り出しながら少しでも役立つ記事が書ければと思います．
※前提として，基本情報技術者は取得済みです．

以下は私の点数です．
|  | 点数 |
|:-:|:-:|
|午前|86.25/100|
|午後|84.00/100|

1ヶ月の詰め込み勉強で合格点を超えることが出来ました．
この点数を見て，少しでも希望を持ってもらえたらと思います．

## 使用した教材
①応用情報技術者試験ドットコム 過去問道場
https://www.ap-siken.com/apkakomon.php

②キタミ式イラストIT塾 応用情報技術者
https://www.amazon.co.jp/dp/4297138093

①は言わずもがなですが，一番効果的です．
正直，8割はこのサイトのおかげで合格できたといっても過言ではないです．

②はサブで使用していました．過去問道場の解説を読んでもわからなかったときに読むといった感じです．

## 実際のスケジュール
### 1.試験日の1週間前まで
1ヶ月前の話がいきなり1週間前の話になって驚かせてしまったかもしれません．
勉強を始めて1週間前までは過去問道場の正解率が8割以上になるまで，ひたすら解いて解いて解きまくっていました．
今見てみたら3000問くらいでした．

ここまでは午前の対策しかしていませんでした．
午後の対策も並行して進めていきたいという思いはあったのですが，どうしてもやりたくなかった...(だって記述とか嫌じゃん)

そんなこんなで午後の対策を先延ばしにしていたのですが，
結論から述べるとこれが良かったのかなと．

午前の対策を多めにやった結果，午後の対策をするときにはある程度自信がついた状態で臨めた気がします．
### これだけは言いたい
午後の過去問を解き始める前にどの分野を解くか決めてください．
これ決めずに闇雲に解くのだけは回避してほしいです．

私の場合は以下の記事たちを参考にして分野を決めました．
https://qiita.com/railgun-0402/items/fdc7ef895ca59bcd8c75
https://qiita.com/IYT-engineer/items/dcf272ea9b89958bb3af

ネットワークとかデータベースとかは難しそうだと思ってやめました．

結果的に，
・セキュリティ(必須)
・組込みシステム開発
・プロジェクトマネジメント
・サービスマネジメント
・システム監査
を選びました．

これらの分野はほぼ国語なので詳しくない人でもなんとかなります．(なんとかなった)
あとはサブ分野で経営戦略とプログラミングも考えていましたが過去問1回解いたくらいでやめました．

### 2.試験日の1週間前から当日まで
この期間は午後の対策をメインにしていました．ただ，午前問も並行してやってました．
午後は記述なので机が無いと何ともならないけど，午前問は電車の中とかでもスマホでやれるので．

結果的に午後問題も過去問道場だけでなんとかなりました．
決めた分野の問題を過去3回分くらい解きました．
過去問を解くときは30分以内で解くようにして，かつ時間も計ってました．
時間を計って解くことで，自分がその分野の問題に対してどれくらい余裕があるのかわかってきます．

厳しめに採点して6割を上回ることもあれば下回ることも全然ありました．
不安ではありましたが，1ヶ月しかなかったことを考えるとしょうがないかなと割り切って，当日は落ちてもまた次受ければいいやというくらいの気持ちで臨みました．

## おわりに
この記事が少しでも焦人(あせんちゅ)の手助けになればと思います．
ここに書かれているのはあくまでも私の場合なので，自分の理解度に応じてスケジュールは調整してみてください．
<br>
ということで，この記事を最後まで読んでくださった皆様．
**何やってるんですか！勉強してください！**
あなたのデータは守られている？ハッシュ関数の秘密とマイニングの仕組み

# 🔐 **1. ハッシュ関数の計算**

### 💡 **ハッシュ関数とは？**
ハッシュ関数（Hash Function）は、任意の長さのデータ（テキストやファイルなど）を入力すると、**固定長の文字列**（ハッシュ値）を出力する関数だよ。

- 例: 「Hello, World!」 → `a591a6d40bf420404a011733cfb7b190`

### 🔑 **特性**
- **一方向性:** ハッシュ値から元のデータを逆算することはほぼ不可能。
- **固定長出力:** 入力が短くても長くても、出力は常に同じ長さ（例えば、SHA-256なら256ビット）。
- **衝突耐性:** 異なる入力が同じハッシュ値になる可能性は極めて低い。
- **微小変化に敏感:** 入力の1ビットでも変わると、ハッシュ値は大きく変わる。

### 🧮 **具体的な計算方法（SHA-256の場合）**
1. **入力データの準備:** 「Hello, World!」のようなデータをバイナリ形式に変換する。
2. **パディング:** データの長さが512ビットの倍数になるように調整する。
3. **初期ハッシュ値の設定:** 規定された8つの32ビットワード（固定値）を準備。
4. **メッセージの分割:** 512ビットごとにデータを分割。
5. **圧縮関数の実行:** 64ラウンドの計算を実行し、データを「混ぜる」。
6. **最終出力:** 256ビットのハッシュ値が得られる。

### 🔒 **ブロックチェーンでの利用例**
- **ブロックハッシュ:** 各ブロックにはその内容から生成されたハッシュが付与される。
- **データ改ざん防止:** もしブロックのデータが改ざんされると、ハッシュ値も変わるので一目瞭然。

---

# ⛓️ **2. ブロック生成時の計算（PoWとマイニング）**

### 🚧 **PoW（プルーフ・オブ・ワーク）とは？**
PoW（Proof of Work）は、**「計算量の証明」** を行うことで、ブロックチェーンネットワークの安全性を保つ仕組みだよ。

- 例えば、ビットコインのネットワークでは、**新しいブロックを追加する権利** を得るために、このPoWを競争するんだ。
- これが「マイニング（採掘）」と呼ばれる作業だよ。

---

### ⛏️ **マイニングの計算方法**

1. **ブロック情報の準備**
   - 新しい取引データ、前のブロックのハッシュ、タイムスタンプ、その他の情報をまとめる。

2. **ナンス（Nonce）の設定**
   - ナンスとは、マイナー（採掘者）が自由に変更できる数値のこと。
   - これを色々変えて試すことで、正しいハッシュ値を見つける。

3. **ハッシュ関数の実行**
   - ブロックのデータ + ナンスをハッシュ関数（SHA-256など）に通す。

4. **正しいハッシュ値の探索**
   - 出力されるハッシュ値が、**「難易度ターゲット（Difficulty Target）」** と呼ばれる条件を満たすまで、ナンスを変えてハッシュを計算し続ける。
   - 例えば、ハッシュ値が「0000...」といった特定の先頭のゼロの数を持つ必要がある。

5. **成功したらブロックを追加**
   - 条件を満たすハッシュ値を見つけたマイナーが、新しいブロックをネットワークに送信。
   - 他のノードがその計算を確認して、正しければブロックチェーンに追加する。

---

### 📈 **計算の難易度**
- ビットコインの場合、**約10分ごと** にブロックが生成されるように、難易度が自動的に調整されるよ。
- マイナーの参加が増えれば難易度が上がり、逆に減れば難易度が下がる仕組みだね。

---

### 💵 **報酬（インセンティブ）**
- 正しいブロックを生成したマイナーは、**新しく発行されたビットコイン** と、**取引手数料** を報酬として受け取れるんだ。
- これがマイナーたちが競争して計算を行う大きなモチベーションになっているよ。

---

## 💡 **まとめ**

### 🔐 **ハッシュ関数の役割**
- データを固定長の一意な値に変換し、改ざんを防止する。
- ブロックチェーンの安全性を支える重要な技術。

### ⛓️ **PoWとマイニングの仕組み**
- ナンスを変えながらひたすらハッシュ計算を行い、特定の条件を満たすハッシュ値を見つける。
- 計算力が高いほどブロック生成の成功率が上がる（＝報酬も増える）。
【PHP】switch文（勉強）

PHPのswitch文を勉強しています。
学習内容をまとめただけですのであしからず。

### 対象者
- switch文に触れるのが初めての方

## switch文とは
結果の値によって処理を分岐したいときに使用できる
それならばif文でもいいのでは？と思うのだが、用途によって使い分けるのが得策かと思われる。
- switch文に向いているもの
    ⇒分岐したい値がある程度決まっている。
    例：）じゃんけんの結果によって出し分けをする
        じゃんけんの値は「グー」「チョキ」「パー」の3パターン。
        分岐の結果は「勝ち」「負け」「あいこ」に限られるため適している。

### 例
```
<?php
    $num = 1;
    switch($num) {
        case 1: 
            echo '結果は1です。';
            break;
        case 2:
            echo '結果は2です。';
            break;
        defalut:
            echo '該当しません。';
    }
?>
```
　defalutはif文の```else```と同じで、caseのどれにも当てはまらなかった場合の指定をする。
 
### 注意
switch文が行う比較は```==```と同じ比較（緩やかな比較）なので注意。
また、continue命令が使える。```break```と同じ動作をする。

:::note info
continue命令とは
現在の繰り返し処理をスキップして、残った続きの処理を行うこと
:::
# WebサイトのSEO必須知識：robots.txtとsitemap.xmlを徹底解説

## はじめに
Webサイトを運営する上で、SEO（検索エンジン最適化）は避けて通れない重要な要素です。その中でも、**robots.txt** と **sitemap.xml** は、検索エンジンのクローラー（ロボット）があなたのサイトをどのように扱うかを制御するための重要なファイルです。本記事では、これらのファイルの役割や設定方法、クロールの仕組みを徹底解説します。

---

## 1. robots.txt とは？

### 1.1 役割
`robots.txt` は、Webサイトのサーバーに設置する **テキストファイル** で、検索エンジンのクローラーに対して **「サイト内のどのページをクロールして良いか、またはクロール禁止か」** を指示するために使われます。

- **クロール許可 (`Allow`)**: 指定したページやディレクトリをクローラーに見せる
- **クロール禁止 (`Disallow`)**: 特定のページや機密情報をクロールさせない

### 1.2 実際の設定例
```txt
User-agent: *
Allow: /
Disallow: /admin
Sitemap: https://example.com/sitemap.xml
```
- `User-agent: *`: すべてのクローラーに適用
- `Allow: /`: サイト全体をクロール許可
- `Disallow: /admin`: 管理画面はクロール禁止
- `Sitemap:`: サイトマップの場所を指定

---

## 2. sitemap.xml とは？

### 2.1 役割
`sitemap.xml` は、Webサイト内の **URL一覧** をXML形式でまとめたファイルです。検索エンジンに **「サイト内の全てのページの構造や更新情報」** を伝えることで、より効率的にクロールしてもらうために使います。

- **URLの一覧**: クローラーが見つけにくいページも確実にクロールされる
- **最終更新日 (`<lastmod>`)**: ページの更新情報を伝える

### 2.2 実際の設定例
```xml
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://example.com/</loc>
    <lastmod>2025-02-28</lastmod>
  </url>
  <url>
    <loc>https://example.com/about</loc>
    <lastmod>2025-02-27</lastmod>
  </url>
</urlset>
```

---

## 3. クローラーの仕組みと両者の関係

### 3.1 クロールの流れ
1. クローラーがWebサイトにアクセス
2. `robots.txt` を最初に確認
3. 許可されているページをクロール
4. `sitemap.xml` を見て、サイト内のすべてのページを巡回
5. インデックス（検索エンジンに登録）される

### 3.2 具体的なフロー
```txt
1. https://example.com/robots.txt にアクセス
↓
2. 許可されたページをクロール（Allow: /）
↓
3. https://example.com/sitemap.xml も確認
↓
4. サイトマップ内のページをすべてクロール
↓
5. 検索結果に反映
```

---

## 4. Next.js での実装方法

### 4.1 robots.ts の設定例
```typescript
export default function robots() {
  return {
    rules: {
      userAgent: '*',
      allow: '/',
    },
    sitemap: 'https://example.com/sitemap.xml',
  };
}
```

### 4.2 sitemap.ts の設定例
```typescript
export default function sitemap() {
  return [
    {
      url: 'https://example.com/',
      lastModified: new Date(),
    },
    {
      url: 'https://example.com/about',
      lastModified: new Date('2025-02-27'),
    },
  ];
}
```

---

## 5. まとめ

- **`robots.txt`** は「クロールのルール」を設定するファイル
- **`sitemap.xml`** は「サイト構造とURL情報」を提供するファイル
- 2つを組み合わせて、検索エンジンに効率よくページをインデックスしてもらうことがSEOに効果的
- **Next.js** を使えば、`robots.ts` と `sitemap.ts` を使って自動的にこれらのファイルを生成可能

Webサイトを運営するなら、ぜひ `robots.txt` と `sitemap.xml` を活用して、検索エンジンにもユーザーにも優しいサイト作りを目指しましょう！
🛠️ Tailwind CSS と PostCSS の関係

1. **PostCSS は「変換エンジン」**
   - PostCSS は、CSS を**加工・変換するためのツール**だよ。
   - ただのエンジンなので、**プラグイン**を使って実際の機能を追加する必要があるんだ。

2. **Tailwind CSS は「PostCSS のプラグイン」の一つ**
   - Tailwind CSS 自体が PostCSS 用のプラグインとして提供されているよ。
   - Tailwind CSS は、HTML や JSX の中で使われているクラス (`bg-red-500` や `p-4` など) を見つけて、それに対応する CSS を生成する役割を持っているんだ。
---

## 🔗 **具体的な処理の流れ**

### 1. **設定ファイルの準備**
```js
// postcss.config.js
module.exports = {
  plugins: {
    tailwindcss: {},   // Tailwind CSS を PostCSS プラグインとして登録
    autoprefixer: {},  // （必要なら）ベンダープレフィックスを追加
  },
};
```

- **`tailwindcss: {}`** と書くことで、PostCSS が Tailwind CSS を使って CSS を変換するように指示するよ。

---

### 2. **グローバルCSSで Tailwind CSS をインポート**
```css
/* global.css */
@tailwind base;       /* リセットCSSなど、基本スタイル */
@tailwind components; /* プリセットコンポーネントスタイル */
@tailwind utilities;  /* Tailwindのユーティリティクラス */
```

- ここで書かれた `@tailwind` ディレクティブが、PostCSS を通して**実際のCSS**に変換されるんだ。

---

### 3. **Tailwind CSS と PostCSS の連携**

#### 💡 **PostCSS の変換フロー**
```plaintext
1. global.css を読み込む
↓
2. Tailwind CSS プラグインが発動
   - tailwind.config.ts を参照して、カスタム設定を取得
   - content プロパティで指定されたファイルをスキャン
   - 使用されているクラスに対応するCSSを生成
↓
3. Autoprefixer プラグインが発動（オプション）
   - display: flex → -webkit-flex など、古いブラウザ対応のプレフィックスを追加
↓
4. 最終的なCSSファイルを出力
```

---

### 4. **最終的に生成されるCSS**

例えば、HTMLでこんなコードがあったとする：
```html
<div class="bg-red-500 p-4">
  こんにちは、Tailwind CSS!
</div>
```

PostCSS を通した後、生成されるCSSはこんな感じになるよ：

```css
/* Tailwind CSS によって自動生成されたCSS */
.bg-red-500 {
  background-color: #f56565;
}

.p-4 {
  padding: 1rem;
}

/* Autoprefixer によるベンダープレフィックス追加 */
body {
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}
```

---

## 🤔 **じゃあ、PostCSS を経由しないとどうなるの？**
- `@tailwind base` などが **そのまま文字列** として表示されちゃう。
- Tailwind のユーティリティクラス（例: `bg-red-500` や `p-4`）が **機能しない**。
- Tailwind CSS のカスタム設定（`tailwind.config.ts` で設定したカスタムカラーなど）も **反映されない**。

---

## ✅ **まとめ**
- Tailwind CSS は、PostCSS の「プラグイン」として動作するよ。
- **PostCSS → Tailwind CSS プラグイン → 変換されたCSS** という流れ。
- PostCSS は、**CSSのビルドエンジン**として機能して、Tailwind CSS のクラスを正しく変換してくれるんだ。
高精度の3Dハンドヘルドスキャンを実現する方法

3Dハンドヘルドスキャナーは、その携帯性と柔軟性から、工業検査、3Dプリント、文化財保護、医療モデリングなどの分野で広く利用されています。しかし、高精度のスキャンを実現するには、適切な機器の選択だけでなく、スキャン環境の最適化、正しい操作方法の習得、データ処理の調整が必要です。本記事では、これらの要素をどのように最適化し、高精度のスキャンを達成するかを詳しく解説します。 

![01a813a8d7242ad8fc9d262714aa9d6e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/c7bbdc76-94cd-4c4d-b5be-30c0a8b7080a.png)


---

## 1. 適切な3Dハンドヘルドスキャナーの選択  

3Dハンドヘルドスキャナーは、スキャン精度、解像度、動作モードなどに違いがあり、用途に応じた適切な選択が重要です。以下の表は、主要な選択基準を示しています。  

| **選択基準** | **影響** | **推奨事項** |
|------------|--------|------------|
| **スキャン精度** | モデルの細部の再現性を決定 | 高精度が必要な場合（例：工業検査）、精度0.05mm以下の機器を選択 |
| **解像度** | 点群密度とディテールの表現に影響 | 精密な形状を取得する場合、高解像度（0.2mm/点以下）が適切 |
| **スキャン方式** | 構造光は屋内向け、レーザーは屋外向け | 屋内の高精度スキャンには構造光、屋外や光沢のある素材にはレーザー |
| **作業距離** | スキャン可能範囲に影響 | 大型物体をスキャンする場合、長い作業距離の機器を選択 |
| **テクスチャキャプチャ** | カラーモデルのリアルさに影響 | カラー情報が必要な場合、RGBカメラ付きのスキャナーを選択 |

https://www.revopoint3d.jp/

---

## 2. スキャン環境の最適化  

スキャン環境はデータ精度に大きく影響します。最適な環境を作ることで、ノイズや誤差を減らし、高精度のデータを取得できます。  

### **(1) 照明条件の調整**  
- **構造光スキャナー**：均一で柔らかい光が理想的。強い直射光や影を避ける。  
- **レーザースキャナー**：環境光の影響を受けにくいが、極端な明暗の差は避ける。  

### **(2) 背景の整理**  
- 複雑な背景はスキャナーの誤認識を引き起こすため、可能な限り単色の背景を使用する。  
- 背景と対象物の色が類似している場合は、黒や白の布を敷いてコントラストを高める。  

### **(3) スキャン対象の固定**  
- **小型物体**：ターンテーブルを使用して均一に回転させると、データの一貫性が向上。  
- **大型物体**：安定した台に置くことで、スキャン中の揺れを防ぐ。  

---

## 3. 正しいスキャン操作  

スキャナーの操作は、データの精度や完全性に直結します。以下の表に、正しいスキャン方法をまとめました。  

![5f58326475c1ac7ee3a4de46e736973f.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/b3b081cd-de49-4e36-a31f-b321dee8925a.jpeg)


| **操作のポイント** | **影響** | **具体的な方法** |
|-----------------|---------|------------|
| **スキャン速度** | データの欠落を防ぐ | 一定の速度で移動し、極端に速く・遅くしない |
| **スキャン距離** | 精度とカバー範囲に影響 | メーカー推奨距離（例：20-50cm）を維持 |
| **スキャン角度** | 盲点の回避 | 360°からデータを取得し、すべての面をカバー |
| **重複スキャン** | データの整合性向上 | 30～50%の重複率でスキャンし、後処理の精度を向上 |
| **ターゲットマーカーの活用** | シンプルな形状の物体に有効 | 反射が強い表面や特徴が少ない物体にマーカーを貼る |

大型オブジェクト（自動車、彫刻など）をスキャンする場合は、セクションごとにスキャンし、後で統合することで精度を向上できます。

---

## 4. スキャンデータの処理と最適化  

スキャンデータは、後処理によって精度と品質を向上できます。 


### **(1) ノイズ除去**  
- 点群データの中から不要なノイズ（浮遊点や誤検出部分）を削除。  
- MeshLabやGeomagicを使用してフィルタリング処理を行う。  

### **(2) 点群の位置合わせ**  
- マルチスキャンのデータを手動または自動で統合し、精度を高める。  
- ICP（Iterative Closest Point）アルゴリズムを活用し、誤差を最小化する。  

### **(3) メッシュ再構築**  
- 点群データを三角ポリゴンに変換し、3Dモデルとして統合。  
- メッシュ密度を適切に調整し、ディテールを向上。  

### **(4) テクスチャマッピング**  
- カラー情報を補正し、モデルのリアルさを向上。  
- PhotoshopやBlenderを使用し、UVマッピングを最適化する。  

---

## 5. よくあるエラーと対策  

スキャン中に発生しやすい問題とその解決策を以下の表に示します。  

| **エラー** | **原因** | **解決策** |
|-----------|--------|---------|
| **ドリフト誤差** | 長時間のスキャンで累積誤差発生 | マーカーを使用して基準点を確保 |
| **鏡面反射** | ガラスや金属の反射光が干渉 | 反射防止スプレーを使用 |
| **データ欠損** | 角度や速度が適切でない | 角度を調整し、速度を下げる |
| **ノイズが多い** | 環境光の影響や機器の限界 | 高精度スキャナーを使用、光環境を調整 |

---

## 6. 高精度スキャンの応用技術  

### **(1) マルチモードスキャンの活用**  
- 構造光とレーザーを組み合わせ、環境ごとに最適なモードを選択。  
- 精密な小物は構造光、大型オブジェクトはレーザーでスキャン。  

### **(2) 高精度アライメントソフトの活用**  
- Geomagic ControlやPolyWorksを使い、高精度データ統合を行う。  

### **(3) フォトグラメトリーとの併用**  
- 高精細なディテールを得るため、写真測量技術を併用する。  

---

## 7. まとめ  

高精度3Dスキャンを実現するには、適切な機器の選択、環境の最適化、正しいスキャン方法の習得、データ処理の工夫が重要です。これらを組み合わせることで、より高品質な3Dモデルを作成し、3Dプリントや産業検査、文化財のデジタル保存などの用途で活用できます。
【git】うっかりrebaseをしそうなときに止めてもらう（自分用.git-template）


うっかり考えなしにrebaseをしてしまったので、.git-templateのhooksでrebaseの実行を警告する方法を模索していた。

# 目的
.git-templateのhooksを用いて、rebaseを行うときは警告(確認)を出すようにする。

ローカルの、自分の環境でのみ適用される。
チームには影響を与えない。

また、Windows環境である。

# 方法

- git bashを開いて、以下のコマンドを実行する。
```
mkdir -p ~/.git-template/hooks

cat <<EOL > ~/.git-template/hooks/pre-rebase
#!/bin/sh
echo "⚠ リベースは禁止されています！" >&2
echo "リベースを中止しました。" >&2
exit 1
EOL

chmod +x ~/.git-template/hooks/pre-rebase
```

- git にテンプレートを設定
```
git config --global init.templateDir ~/.git-template
```

- rebaseできないようになっていることをテスト
```
# リポジトリに移動
git checkout -b test-branch  # テスト用ブランチ作成
echo "First commit" > file.txt
git add file.txt
git commit -m "First commit"

git checkout -b feature-branch  # もう一つ別のブランチ作成
echo "Feature commit" >> file.txt
git commit -am "Feature commit"

git checkout test-branch
git rebase feature-branch
```

## 補遺

### 積み残し課題
本当は「本当にrebaseしますか？(y/n)」というような風にしたかったのだが、うまく動作しなかったので断念した。


### 削除方法
「rebaseを実行するときに確認するのは絶対のことであり、そういったことのぼうしｄhooksを使用するべきではない。pushするときは入念な注意を払って行うように」とお達しをいただいたので、この設定は削除することになった。
削除の仕方（git templateの解除方法）は、以下の通りである。

- 現在の init.templateDir 設定を確認

```sh
git config --global --get init.templateDir
```

- 出力例（それぞれのパスが出るよ）

```
/Users/username/.git-template
```

* 保存されている箇所のパス

```sh
git config --global --unset init.templateDir
```

- 設定が消えたか確認

```sh
git config --global --get init.templateDir
```

何も出力されなければOK。

# rebaseについての覚書
rebaseはgitの履歴を改ざんする行為で、容易に使ってはいけないが（≒publicにある履歴を軽い気持ちで改ざんしてはいけないが）ローカルでやる分には有用な場合がある。

Merging vs. rebasing
https://www.atlassian.com/ja/git/tutorials/merging-vs-rebasing

あなたはmerge派？rebase派？綺麗なGitログで実感したメリット
https://style.biglobe.co.jp/entry/2022/03/22/090000
Webサイト向けの軽量動画＆画像フォーマットを作成してみよう～WebP/WebM編～


## はじめに
Webサイト用に「WebP」、「WebM」形式のアニメーション素材を制作する機会があったため、備忘も兼ねてまとめてみます。
今回使用するツールは
* 「[Adobe Media Encoder](https://www.adobe.com/jp/products/media-encoder.html)」
* 「[アニメ画像に変換する君](https://apps.microsoft.com/detail/9n36kvc52st9?hl=ja-JP&gl=JP#activetab=pivot:overviewtab)」

になります。
Webサイトにアニメーションを採用したい場合に、参考になれば幸いです。

## WebPとは
WebPは、Googleが開発した画像フォーマットで、PNGやJPEGと比較して高い圧縮率を誇ります。WebPを使用することで、Webページの読み込み速度を向上させ、SEOの最適化にも貢献できます。256色のインデックスカラーやアルファチャンネル、アニメーションもサポートしています「.webp」というファイル拡張子が使われています。

## WebMとは
WebMは、Googleが開発した動画フォーマットで、主にWeb向けの軽量な動画再生を目的としています。MP4と比べて、ファイルサイズが小さく、ストリーミングに最適なのが特徴です。「.webm」というファイル拡張子が使われています。

## WebP / WebMの作成方法
今回はこのようなアニメーションをWebP / WebMで制作します。
現在WebP / WebMを直接Adobeツールから書き出す方法がないため、アプリやプラグインを利用して書き出します。
![asiato_animal_b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946930/1ef2f7e3-0abe-4e53-ba0c-df83a092a67f.gif)

### WebP 作成方法
#### 1\. アニメーションのPNG連番を用意
アニメーションのPNG連番を用意します。
私の場合は「After Effects」を利用しています。
![renban.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946930/6b0b1139-d1aa-46b2-95bc-5f69fb3c38ec.jpeg)

#### 2\. 「アニメ画像に変換する君」をインストール
次に「[アニメ画像に変換する君](https://apps.microsoft.com/detail/9n36kvc52st9?hl=ja-JP&gl=JP#activetab=pivot:overviewtab)」というアプリをインストールします。
このアプリは連番画像をweb用アニメーション画像に変換するソフトウェアで、WebPだけではなくAPNGという形式にも変換できる優れたツールです！

#### 3\. 「アニメ画像に変換する君」でPNG連番をWebPに変換
アプリを開いて先程書き出したPNG連番をインポートします。
用途「webページ用アニメーション」を選択します。
出力したいファイル形式にチェックをいれます。
今回は「WebPファイル出力」のみにチェック。

:::note info
容量最適化
気づかない程度に画質を落とし、容量を最適化してくれるモードです
必要に応じてチェックを入れましょう
:::

「アニメ画像を保存する」ボタンを押し、出力先を選択し出力完了となります。
![animetool01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946930/b7516b44-7403-4e64-b57d-2f8b5a48a016.jpeg)

ちなみに容量最適化の比較ですが、今回の場合は激しい動きのアニメーションではないのもあったためか、画質の差はほとんど感じない見た目でした。
今回の場合、容量としては約半分ほどの容量最適化に成功しています。
![data.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946930/66350f47-d3e6-407f-a0bb-bf06c6a2e992.jpeg)

### WebM 作成方法
#### 1\. 「WebM Plug-In for Premiere Pro」をインポート
「[WebM Plug-In for Premiere Pro](https://www.fnord.com/)」は「Premiere」と名前がついていますが、「Adobe Media Encoder」にも適応されるWebM変換用プラグインです。
こちらをインストールすると「Adobe Media Encoder」のファイルフォーマットにWebMが追加されます。

#### 2\. 「Adobe Media Encoder」にWebMにしたいアニメーションをインポート、書き出し
書き出し設定も、かなり細かく行える仕様になっています。
こちらはパラメータ詳細省略しますが、各々適切な設定で書き出しを行ってみてください。

![export.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946930/6b4eba50-7ba9-4e0f-b46c-b4007636e45e.jpeg)

私が経験した事象として、「Color Space」に「Rec.709」を選択して書き出し、ウェブサイトに実装した際、赤系の色味がすこし青に転がる事象が発生したことがありました。
その場合は「Color Space」を「Rec.601」にして書き出すと解決しました。
（これについて知見ある方、シェアいただければ幸いです！）

## おわりに
今回はWebP / WebMフォーマットの概要を紹介しつつ、具体的な制作方法をまとめてみました。
他の方法としては「FFmpeg」などを利用して作成する方法があると思います。
場合によっては、そちらを使用しなければいけない状況などでてくるかもしれないですが、コマンドを打つことに慣れていない非エンジニア系寄り人材としては、上記で示した方法は比較的簡単に制作できると感じています。（ツール制作者に感謝…！）
適材適所でフォーマットを選び、軽量かつ高品質なメディアを実現するために少しでも役立てていただければ幸いです。

最後までお読みいただきありがとうございます！
【2025年03月版】GmailのアプリパスワードURLメモ

# はじめに

いつも忘れるので

# URL

- [GMailのアプリパスワードのURL](https://myaccount.google.com/apppasswords)

# 備考

- ２重認証がONになってないとつかえないので注意

# リンク

- [Gmail ヘルプ - アプリ パスワードでログインする](https://support.google.com/mail/answer/185833?hl=ja)

# さいごに

わすれたくない
【Laravel 開発入門】Eloquentの「first」と「get」の違いを徹底解説

# Laravel Eloquentの「first」と「get」の違いを徹底解説

LaravelのEloquent ORMは、データベース操作を直感的かつ効率的に行うための強力なツールです。特に初心者の方にとって、`first()`と`get()`メソッドの違いは混乱しがちなポイントの一つです。この記事では、それぞれのメソッドの違い、使い方、適切な使用シーンについて詳しく解説します。

## `first()`と`get()`の基本的な違い

### `first()`メソッド
- **返り値**: 単一のモデルインスタンス（見つからない場合は`null`）
- **目的**: クエリ条件に一致する最初のレコードだけを取得したい場合に使用
- **SQLイメージ**: `SELECT * FROM テーブル名 WHERE 条件 LIMIT 1`

### `get()`メソッド
- **返り値**: モデルインスタンスのコレクション（空のコレクションも含む）
- **目的**: クエリ条件に一致する全てのレコードを取得したい場合に使用
- **SQLイメージ**: `SELECT * FROM テーブル名 WHERE 条件`

## データ型の違い

### `first()`の戻り値
- **データ型**: Eloquentモデルインスタンス（または`null`）
- **例**: `App\Models\User`のインスタンス
- **アクセス方法**: オブジェクト構文でプロパティに直接アクセス（例: `$user->name`）
- **値がない場合**: `null`が返される

### `get()`の戻り値
- **データ型**: `Illuminate\Database\Eloquent\Collection`クラスのインスタンス
- **中身**: Eloquentモデルインスタンスのコレクション
- **空の場合**: 空のコレクションオブジェクト（`null`ではない）

## コレクションとは？

Laravelのコレクションは単なる配列ではなく、データを扱うための多くの便利なメソッドを持つラッパークラスです。通常の配列との主な違いは以下のとおりです：

1. **メソッドチェーンが可能**
2. **豊富なヘルパーメソッド**
3. **データ変換が簡単**
4. **柔軟なデータアクセス方法**

## 実用例

### `first()`の例

```php
// IDが1のユーザーを取得
$user = User::where('id', 1)->first();

// メールアドレスでユーザーを検索
$user = User::where('email', 'test@example.com')->first();

// 条件に一致するユーザーがいない場合はnullが返る
if ($user === null) {
    // ユーザーが見つからなかった場合の処理
}
```

### `get()`の例

```php
// アクティブな全ユーザーを取得
$activeUsers = User::where('active', true)->get();

// 特定の年齢以上のユーザーを取得
$adultUsers = User::where('age', '>=', 18)->get();

// 結果をループで処理
foreach ($activeUsers as $user) {
    echo $user->name;
}

// 結果が空でも空のコレクションが返る
if ($activeUsers->isEmpty()) {
    // ユーザーが見つからなかった場合の処理
}
```

## `first()`のデータアクセス例

```php
$user = User::where('email', 'test@example.com')->first();

// nullチェックが必要
if ($user !== null) {
    echo $user->name;  // オブジェクトのプロパティとしてアクセス
    $user->update(['last_login' => now()]); // モデルメソッドを直接使用可能
}
```

## `get()`のデータアクセス例

```php
$users = User::where('active', true)->get();

// コレクションのメソッドが使える
$names = $users->pluck('name');  // 名前だけの配列を取得
$totalAge = $users->sum('age');  // 年齢の合計を計算

// foreachでループ処理
foreach ($users as $user) {
    echo $user->name;
}

// 空かどうかのチェック
if ($users->isEmpty()) {
    echo 'ユーザーがいません';
}
```

## どのような場面で使うべきか

### `first()`が適している場面
- 一意の識別子（ID、メールアドレスなど）で特定のレコードを検索する場合
- 条件に一致する最初のレコード「だけ」が必要な場合
- 単一のモデルインスタンスとして扱いたい場合
- 「見つからなかった」という状態（`null`）を明示的に扱いたい場合

### `get()`が適している場面
- 条件に一致する全てのレコードが必要な場合
- 結果をループで処理したい場合
- コレクションメソッド（`map`、`filter`、`each`など）を使用したい場合
- 結果が0件の場合でも一貫してコレクションとして扱いたい場合

## パフォーマンスの観点

`first()`は`LIMIT 1`を使用するため、大量のデータがある場合でも1レコードのみを取得して処理を終了します。一方、`get()`は条件に一致する全てのレコードを取得するため、大量のデータがある場合はメモリ使用量が増加します。

## 初心者向けのアドバイス

1. **単一のレコードを扱う場合**:
   - `first()`を使う
   - 戻り値は直接モデルのプロパティにアクセスできる
   - `null`チェックをお忘れなく

2. **複数のレコードを扱う場合**:
   - `get()`を使う
   - 戻り値はコレクションなので、豊富なメソッドが使える
   - ループ処理や配列操作が簡単

## まとめ

- 単一のレコードが欲しい → `first()`
- 複数のレコードが欲しい → `get()`
- パフォーマンスを考えると、単一レコードを取得する場合は常に`first()`を使うことをお勧めします。

この違いを理解することで、適切なシチュエーションで適切なメソッドを選択できるようになります。Laravel Eloquentの強力な機能を活用して、より効率的なコードを書きましょう。
【NestJS × Docker】全てのレスポンスを整形 -- グローバルインターセプタ --

## プロフィール
22歳の大学生です、2025/4月から就職してエンジニアをやります

- サッカー好き
    - 国内サッカー：柏レイソルサポーター
    - 海外サッカー：プレミア、セリエを観戦 Roma推し
- アニメ、漫画好き
    - ジャンププラス定期購読者
    - ラノベ系のアニメ
    - 最近はガンダムにハマる
- ラーメンは二郎系が好み

最近はNestJSで個人開発を進めています

## 従来のシリアライズ

以前は外部クラスを呼び出してシリアライズしていました。
以下の記事を参考にしてください。
[【NestJS × Docker】BigIntのシリアライズエラー、大目に見てくれよ - Do not know how to serialize a BigInt -](https://qiita.com/JonyTask/items/4acf8432ab76c810d5f0)

簡単に要約すると、serviceクラスでreturnするオブジェクトをわざわざ整形してから返していました。
毎度のように外部クラスを呼び出して、整形していました。

少しアホくさいかもしれませんが、「まあこれでいっか」とも思っていました。
しかしここで問題が発生します。

## POSTではシリアライズが通用しない
以下のプログラムを見てほしいです。
```
async addTodo(TodoDto: TodoDto) {
    try {
        return await this.prisma.todo.create({
            data: {
                user: { connect: { id: TodoDto.user_id } },
                stock: { connect: { id: TodoDto.stock_id } },
            }
        });
    } catch (error) {
        console.error('add Favorite todo:', error);
        throw error;
    }
}
```
関数名や変数名は適当に命名したものですので、無視してください。

userとstockというリレーションに基づき、渡されてくるuser_idとstock_idという外部キーを挿入します。

ここからが問題なのですが、postのレスポンスではここで作成されたレコードが返ってきます。
ですがservice層でPOSTのレスポンスを整形することはできません。
これまでGETでレスポンスをくれるものをservice層で整形していましたが、POSTではどうしよう、困ったものです。

## グローバルインターセプターの介入
もう面倒なので、全てのレスポンスを整形しようと思いました。
```
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from "@nestjs/common";
import { map, Observable } from "rxjs";

@Injectable()
export class BigIntToStringInterceptor implements NestInterceptor {
    intercept(context: ExecutionContext, next: CallHandler<any>): Observable<any> | Promise<Observable<any>> {
        return next.handle().pipe(
            map((data) => this.convertBigInt(data))
        );
    }

    private convertBigInt(value: any): any {
        if (typeof value === 'bigint') {
            return value.toString();
        }

        if (Array.isArray(value)) {
            return value.map((item) => this.convertBigInt(item));
        }

        if (value !== null && typeof value === 'object') {
            for (const key in value) {
                if (Object.prototype.hasOwnProperty.call(value, key)) {
                    value[key] = this.convertBigInt(value[key]);
                }
            }
        }

        return value;
    }
}
```

これがグローバルインターセプターです。
NestInterceptorをインターフェースとして呼び出し、interceptメソッドで次のハンドラの実行を制御しつつ、レスポンスの整形も行います。

整形自体はconvertBigIntメソッドで行われています。
渡されてきた値、配列、オブジェクトにあるBigInt型の値を文字列に変換する処理を行っています。

そして肝心なのはここからです。
以下のようにmain.tsに追記します。

```
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { BigIntToStringInterceptor } from './infrastructure/utils/BigIntToStringInterceptor';

async function bootstrap() {
    const app = await NestFactory.create(AppModule);
    //ここが追記
    app.useGlobalInterceptors(new BigIntToStringInterceptor());
    await app.listen(3000);
}
bootstrap();
```

これで全レスポンスに整形をかけられる仕様となりました。


## 終わり
BigIntのシリアライズは面倒です。
困ったことがあったらchatGPTをフル活用して学習を進めています。

自分はchatGPT plusに課金しているため、o3-mini-highモデルを利用しているのですが、これがすごい優れもの。
NestJSは比較的日本語の情報が少ないと有名のフレームワークですが、このモデルがあればそんなことは困らない

ものすごく良いペースで進められていると感じています。

AIに教えられたことはなるべくこのQiitaでの発信などを通して噛み砕くようにしています。

openAI最高
勾配ブースティングとは何か？

### **1. 基本概念**
#### **Q1: 勾配ブースティングとは何か？**
- 勾配ブースティング（Gradient Boosting）は、**弱学習器（通常は決定木）を逐次的に構築し、前のモデルの誤差を補正するように学習する手法** です。

#### **Q2: 勾配ブースティングとランダムフォレストの違いは？**
- ランダムフォレストは**複数の決定木を独立して学習し、最終予測を多数決や平均で決める**。
- 勾配ブースティングは、**各決定木が前のモデルの誤差を学習するように順番に追加される**。

---

### **2. XGBoost / LightGBM のアルゴリズムの違い**
#### **Q3: XGBoost と LightGBM の違いを説明してください。**
| 特徴 | XGBoost | LightGBM |
|------|--------|--------|
| 木の成長 | **深さ優先（Depth-wise）** | **リーフ最適化（Leaf-wise）** |
| 速度 | 遅め（正則化が強力） | 速い（並列処理が得意） |
| メモリ使用量 | 高い | 低い |
| カテゴリ変数処理 | One-hot エンコーディングが必要 | 直接処理可能 |

---

### **3. モデルの内部メカニズム**
#### **Q4: LightGBM で Leaf-wise の利点と欠点は？**
- **利点**: 木の成長をより効率的に進めることで **高速な学習が可能** 。
- **欠点**: 深い木ができやすく **過学習しやすい** 。

#### **Q5: XGBoost で使われる正則化手法は？**
- L1 正則化（LASSO）: **不要な特徴量をゼロにする**。
- L2 正則化（Ridge）: **モデルの過学習を防ぐ**。

---

### **4. 勾配ブースティングの最適化**
#### **Q6: XGBoost における Shrinkage（学習率）とは？**
- 各決定木の影響を小さくし、**徐々に収束することで過学習を防ぐ** ための手法。

#### **Q7: LightGBM での Histogram-based Algorithm とは？**
- データを**ビン（ヒストグラム）に分割し、計算量を削減** することで学習速度を向上させる。

#### **Q8: Early Stopping とは？**
- **検証データのスコアが改善しなくなったら学習を打ち切る** ことで過学習を防ぐ。

---

### **5. ハイパーパラメータの調整**
#### **Q9: 勾配ブースティングでチューニングが重要なパラメータは？**
| パラメータ | 役割 |
|------------|----------------|
| learning_rate | 学習率（小さすぎると遅い、大きすぎると発散） |
| num_leaves | 決定木のリーフ数（大きすぎると過学習） |
| max_depth | 決定木の深さ（過学習を防ぐために制限） |
| min_child_weight | 分割を許可する最小データ数（過学習を抑制） |
| colsample_bytree | ランダムに特徴量を選択し過学習を抑制 |

#### **Q10: XGBoost の learning_rate を小さくするときに考慮すべきことは？**
- 学習率が小さいと収束が遅くなるため、**`n_estimators`（決定木の数）を増やす** 必要がある。

---

### **6. 具体的な実装**
#### **Q11: LightGBM で欠損値はどのように処理される？**
- LightGBM は **自動的に欠損値を考慮して分割を行う** ため、手動で埋める必要はない。

#### **Q12: カテゴリ変数を LightGBM で直接処理できるのはなぜ？**
- **決定木の分岐ルールを用いた最適なエンコーディング** を自動で行うため。

---

### **7. 特徴量の解釈**
#### **Q13: Feature Importance の計算方法は？**
- **Gini importance**（分岐での情報ゲインを集計）  
- **Permutation importance**（特徴量をシャッフルしスコアを比較）

#### **Q14: SHAP（Shapley Additive Explanations）とは？**
- **各特徴量がモデルの予測に与える影響を定量的に評価** する手法。

---

### **8. 実務での活用**
#### **Q15: 勾配ブースティングが向いているタスクは？**
- **構造化データ（表データ）の分類や回帰** に適している。

#### **Q16: Deep Learning ではなく XGBoost / LightGBM を選ぶべき状況は？**
- **データが小さい**（10万件以下）  
- **特徴量エンジニアリングが重要**  
- **計算コストを抑えたい**
Karpenter の Bottlerocket で kubelet に引数を渡す方法

今回は、Karpenter を使って Bottlerocket ノードをプロビジョニングする際に、kubelet に `--housekeeping-interval=1s` の引数を渡す方法をご紹介します。  

## 手順

1. **EC2NodeClass の YAML マニフェスト** に `userData` セクションを追加します。  
2. `userData` 内で、TOML 形式の `[settings.kubernetes]` セクションにカスタム引数を記述します。

以下はサンプル YAML です：

```diff
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
  name: my-bottlerocket
spec:
  amiFamily: Bottlerocket
+ userData: |
+   [settings.kubernetes]
+   housekeeping-interval = "1s"
```

この設定により、Karpenter が生成する最終的な Bottlerocket のユーザーデータに  
`--housekeeping-interval=1s` がマージされ、kubelet の起動時にその引数が渡されます。
【保存版】vim操作一覧

# 1. Vimの基本
## Vimのモード
Vimの3つのモード：

<dl>
    <dt>ノーマルモード（Normal mode)</dt>
    <dd>コマンドを実行するモード（デフォルト）</dd>
    <dd>文字入力はできず、カーソル移動や削除などの操作を行う</dd>
    <dd>ESCキーを押すとこのモードに戻る</dd>
    <dt>挿入モード（Insert mode）</dt>
    <dd>テキストを入力するモード</dd>
    <dd>ノーマルモードで <code>i</code> や <code>a</code> を押すと切り替わる</dd>
    <dd>ESCキーを押すとノーマルモードに戻る</dd>
    <dt>コマンドラインモード（Command-line mode）</dt>
    <dd>ファイルの保存や検索などを行うモード</dd>
    <dd><code>:</code> を押すとコマンドを入力できる（例：<code>:w</code> で保存）</dd>
</dl>
    
# 2. Vimの起動と終了
## 起動：
```sh
vim ファイル名
```
(存在しない場合は新規作成）

## 終了：
- `:q` → ファイルを変更していなければ終了
- `:q!` → 変更を保存せずに強制終了
- `:wq` または `ZZ` → 変更を保存して終了
- `:x` → `:wq` と同じ（変更があった場合のみ保存）

# 3. ノーマルモードでの基本操作
### カーソル移動

- `h` → 左へ移動
- `l` → 右へ移動
- `j` → 下へ移動
- `k` → 上へ移動
### 単語単位で移動：

- `w` → 次の単語の先頭へ
- `e` → 単語の末尾へ
- `b` → 前の単語の先頭へ
### 行単位で移動：

- `0` → 行の先頭へ移動
- `^` → 行の最初の文字へ移動（インデントを無視）
- `$` → 行の末尾へ移動
### ページ単位の移動：

- `Ctrl-d` → 画面の半分だけ下へスクロール
- `Ctrl-u` → 画面の半分だけ上へスクロール
- `Ctrl-f` → 次のページへ（下方向にスクロール）
- `Ctrl-b` → 前のページへ（上方向にスクロール）
### ファイル内の移動：

- `gg` → ファイルの先頭へ移動
- `G` → ファイルの末尾へ移動
- `nG` → n 行目へ移動（例：10G は10行目へ移動）
# 4. 挿入モードへの切り替え
- `i` → カーソルの前に入力開始
- `a` → カーソルの後に入力開始
- `I` → 行の先頭で入力開始
- `A` → 行の末尾で入力開始
- `o` → 次の行に新しい行を追加して入力開始
- `O` → 現在の行の前に新しい行を追加して入力開始
# 5. テキストの削除・コピー・貼り付け
### 削除（ノーマルモード）
- `x` → カーソルの位置の1文字を削除
- `dw` → 単語を削除
- `dd` → 行を削除
- `D` → カーソル位置から行末まで削除
- `d$` → カーソル位置から行末まで削除（Dと同じ）
- `dG` → カーソル位置からファイルの最後まで削除
### コピー＆貼り付け
- `yy` または `Y` → 行をコピー（ヤンク）
- `yw` → 単語をコピー
- `p` → コピーしたものをカーソルの後ろに貼り付け
- `P` → コピーしたものをカーソルの前に貼り付け
### 取り消し（アンドゥ＆リドゥ）
- `u` → 1つ前の操作を取り消す（Undo）
- `Ctrl-r` → 取り消した操作をやり直す（Redo）
# 6. 文字列の検索と置換
### 検索
- `/検索語` → 下方向に検索
- `?検索語` → 上方向に検索
- `n` → 次の検索結果へ移動
- `N` → 逆方向の検索結果へ移動
### 置換
- `:s/old/new/` → 現在の行で最初に見つかった old を new に置換
- `:s/old/new/g` → 現在の行のすべての old を new に置換
- `:%s/old/new/g` → ファイル全体で old を new に置換
- `:%s/old/new/gc` → 置換を1つずつ確認しながら実行
# 7. ファイルの保存と管理
- `:w` → 保存（write）
- `:w ファイル名` → 別のファイル名で保存
- `:saveas ファイル名` → 指定したファイル名で保存
- `:e ファイル名` → 別のファイルを開く
- `:q!` → 保存せずに終了
# 8. 便利な操作
### 複数のファイルを開く
- `:split ファイル名` → 水平分割して開く
- `:vsplit ファイル名` → 垂直分割して開く
- `Ctrl-w w` → 分割したウィンドウ間を移動
### タブの操作
- `:tabnew` → 新しいタブを開く
- `:tabnext (:tn)` → 次のタブへ移動
- `:tabprev (:tp)` → 前のタブへ移動
- `:tabclose` → 現在のタブを閉じる
# 9. ヘルプ

```sh
:help
```
特定のコマンドについて調べたい場合：

```sh
:help コマンド名
```