OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxとは


Linuxが誕生したのは1991年のことでした。フィンランド人のリーナス・トーバルズ氏が最初のLinuxバージョンを公開したのが始まりです。驚くことに彼は当時学生で、個人的に1からOSを作ったといわれています。
<br>
Linuxを使えばプログラミングも可能です。プログラムを書くために必要な「テキストエディタ」や、プログラムの開発を効率化する「統合開発環境（IDE）」には、Linuxに対応したものが数多くあります。
<br>

Linuxカーネル
Linuxカーネルとは、Linuxにおける中核部分の制御を担当するプログラムのことです。Linuxには次のような機能がありますが、これらはLinuxカーネルによって実現しています。
メモリ（コンピューターのデータ領域）の管理
    プロセス（コンピューター上で実行されるプログラム）の管理
    プロセス間通信
    ファイル操作
    ネットワーク
<br><br>


Linuxディストリビューション
「Linuxディストリビューション」とは、Linuxの構成要素（カーネルやツールなど）をひとまとめにして、インストールすれば使える状態にした配布物を指します。簡単にいえば、Linuxにおける「流派」のようなものです。
ここでは、おすすめのLinuxディストリビューションとして、次の4つを紹介します。

    Ubuntu
    Debian
    Red Hat Enterprise Linux (RHEL)
    Fedora


![スクリーンショット 2025-03-26 181756.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045855/dbe3917f-a25f-4fd5-b0a0-0a239d761338.jpeg)

<br><br>
Ubuntu
「Ubuntu」は、Debian系のLinuxディストリビューションです。LinuxディストリビューションのなかでもGUI機能が充実しており、よく使われるツール類も数多く搭載されています。

そのため使いやすく、Linuxの経験が少ない初心者にもおすすめです。Linuxディストリビューションのなかでも高いシェアを誇っています。Ubuntuについて詳しく知りたい人は、次の記事を参考にしてください。

<br>
Debian<br>
「Debian」は名前のとおり、Debian系のベースとなっているLinuxディストリビューションです。日本のコミュニティが発展しており、日本語の参考情報がWeb上に豊富な点が強みといえます。

また、1993年から存在する歴史の長いLinuxディストリビューションであり、信頼性・安定性も高いです。そのため個人利用はもちろん、企業のサーバーにも広く採用されています。
<br>

Red Hat Enterprise Linux (RHEL)
「Red Hat Enterprise Linux (RHEL)」は名前のとおり、Red Hat社が開発したLinuxディストリビューションです。商用向けで、企業のサーバーに広く採用されています。

有償のため、「サポート」や「責任」という面での安心感が強みです。最新のセキュリティ対策を適用できるため、セキュリティ性の面でも優れています。

<br>
Fedora<br>
「Fedora」は、Red Hat社が支援する「Fedora Project」からリリースされているLinuxディストリビューションです。RHELは有償ですが、Fedoraは無償で利用できます。

「RHELに入れたい新機能を、Fedoraで試験的に導入する」という流れのため、最新の技術を試せるのが魅力です。ただし、有償版のRHELと比べてサポートは限定的となります。
rust cargo

```
cargo update -p bytemuck_derive --precise 1.7.0
```

```shell
cargo tree -i ahash

error: There are multiple `ahash` packages in your project, and the specification `ahash` is ambiguous.
Please re-run this command with one of the following specifications:
  ahash@0.7.7
  ahash@0.8.6
```

```
cargo tree | grep  ahash

note: for more details see https://doc.rust-lang.org/cargo/reference/resolver.html#resolver-versions
│   │       └── ahash v0.8.6
│   │   │       └── ahash v0.7.7
│   │   │   ├── ahash v0.8.6 (*)
```
Geminiで可愛い子を描いてもらった。

# 概要

Geminiにリクエストを出して、可愛い子を描いてもらいました。

# 実装

リクエストは以下の通り。

```
可愛い子を描いてみてください。 
```

![可愛い子.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/f505a7cb-2324-4639-9da4-b7f287ef5c9d.png)

他にもいろんなリクエストをしてみました。いろいろ出てきて楽しいです。

```
ポニーテールだとどうなりますか？
```

```
10歳くらいだとどうなりますか？
```

```
15歳くらいだとどうなりますか？
```

# まとめ

何かの役に立てばと。
結果ファイルは「Wav2Lip/results/」配下に出力されます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/716df63a-bc35-4ebb-ba74-017b178cc914.png)
# 🎤 Wav2Lipでビデオに声を合わせよう！

「**Wav2Lip**」は、動画の中の人物に、指定した音声をくちパクで合わせる魔法のようなAIツールです！

キービジュアルな日本語の音声を読み上げる動画を作りたい。あるいは、会社のプロモーション動画に読み上げ声を入れたい。
そんなニーズを手込みで解決してくれるのがWav2Lipなのです！

---

## Wav2Lipとは？

「Wav2Lip」は、動画中の人物の唇を、音声のリズムに合わせるための深層学習AIモデルです。

- 音声と動画を入力として、唇動を自動生成
- 元のビデオを使用するので、自然な合成が可能
- 非想像的なアプリケーションも多数


例：非動の表情の人物に、中の音声の指示に合わせて自然なクチパクを付与する

---

## ⚡ Google ColabでWav2Lipを実行してみよう

### （↑）Colabの準備

1. Google Colabを開き、メニューの「編集 → ノートブックの設定」で、「GPU」を選択

### （→）Python環境の切り替え

```bash
%%bash
MINICONDA_INSTALLER=Miniconda3-py37_4.8.2-Linux-x86_64.sh
MINICONDA_DOWNLOAD_HP=https://repo.anaconda.com/miniconda
MINICONDA_PREFIX=/usr/local
wget $MINICONDA_DOWNLOAD_HP/$MINICONDA_INSTALLER
chmod +x $MINICONDA_INSTALLER
./$MINICONDA_INSTALLER -b -f -p $MINICONDA_PREFIX
```

### （→）Google Driveのマウント

```python
from google.colab import drive
drive.mount('/content/drive')
%cd '/content/drive/My Drive/work'
```

### （→）Wav2Lipフォルダのクローン

```bash
!git clone https://github.com/Rudrabha/Wav2Lip.git
%cd Wav2Lip
!pip install -r requirements.txt
!pip install resampy==0.3.1
```

---

## 🔧 モデルファイルの配置

- 下記モデルを「Wav2Lip/checkpoints」配下に置きます
- ダウンロード元：https://github.com/Rudrabha/Wav2Lip

---

## 🎧 音声 & 動画ファイルの用意

「Wav2Lip/」配下に、以下のファイルを置きます

- zunda.wav （声）
- zunda.mp4 （動画）

静止画像の動画を使用すると、少し使用メモリーが減れて動作がスムーズです

---

## ✨ 推論の実行

```bash
!python inference.py \
    --checkpoint_path checkpoints/wav2lip.pth \
    --face zunda.mp4 \
    --audio zunda.wav
```


---

## 🌟 実用アイデア

- バーチャルYouTuberのリップ合成
- 同時読上げでのデモンスピーチ
- 居ながらプレゼンテーション
- 回復支援や、視聴覚障害者への合成アイデア

---

## ✅ おわりに

Wav2Lipは、ただの動画を「喋る動画」に変える魔法のようなAIです！

また、どんな動画も家庭で生成できることで、小さなプロジェクトから問題解決まで実用性は無限夢です！

次は、この動画をWebで表示する方法や、AIナーチャーとの連携もご紹介しますね🎉
IBM Security Verifyに接続できない場合のGateway for Windowsの動作を変更する

## はじめに
前回の記事、[インターネットへの接続をHTTP Proxy経由のみに制限されているWindowsサーバーに多要素認証を組み込む](https://qiita.com/ogawa_to/items/6cb669784b9e075e115f) のようにネットワーク接続に制限がある場合などは、Windowsサーバーがインターネットに接続できない場合についての考慮も大事です。
インターネットに接続できないことで多要素認証ができなくなり、Windowsサーバーにログインできなくなってしまうと困ります。

今回は、何らかの障害や設定ミスにより、HTTP Proxy経由での接続ができなくなってしまった場合の回避策を検討します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147690/e978c3a9-cebc-41d9-9e84-7c33ff37b892.png)

## いくつかの利用できそうなパラメータ
このような問題に対する回避策に使えそうないくつかのパラメータが、[マニュアル Config.json](https://www.ibm.com/docs/ja/security-verify?topic=configuration-configjson-file)に記載されています。
+ failmode-insecure
+ no-mfa-account
+ rdp-only
+ disable-builtin-password-logon

### failmode-insecure
trueに設定すると、Gateway for Windows Login が IBM Security Verify に接続ができない場合の動作が変わります。ユーザーがWindowsのIDとパスワードを入力後、IBM Security Verifyへの接続を試します。
接続できない場合には多要素認証を実施せず、そのままWindowsにログインをします。IBM Security Verify に接続できない場合は、多要素認証なしでログインができます。

### no-mfa-account
多要素認証を必要としない、専用のユーザーを作成します。この専用のユーザーであれば、多要素認証を必要とせずにログインができます。
多要素認証を必要とするユーザーはWindowsへのログインができません。
[マニュアル](https://www.ibm.com/docs/ja/security-verify?topic=configuration-configjson-file)にも記載がありますが、このユーザーにはRDP接続を許可しないなどWindowsでの設定も合わせて実施すると良いです。
通常時であっても、このユーザーは多要素認証なしでログインができる点に注意が必要です。

### rdp-only
リモート・デスクトップ・ログインでのみGateway for Windows Login による多要素認証を行う設定です。
ローカル・デスクトップ・ログオンをすればログインが可能です。
IBM Security Verifyに接続できない場合は、多要素認証ができないため、リモート・デスクトップ・ログインでのログインができません。
この設定は、ネットワーク障害時に限らず、通常時であっても、ローカル・デスクトップ・ログオンでは多要素認証なしでログインができる点に注意が必要です。

### disable-builtin-password-logon
falseに設定すると、ログインの際の「サインイン オプション」を変更することで、多要素認証なしでログインができるようになります。（デフォルト値はfalseです）
通常時であっても、サインイン オプションを変更することで、多要素認証なしでログインができる点に注意が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147690/c8b6934b-6da3-4b8b-8905-36ff02d0f75c.png)


## 最後に
IBM Security Verifyに接続できない場合のGateway for Windowsの動作を変更するいくつかのパラメータを確認しました。これらの設定は多要素認証をせずにログインができるような設定です。どの条件であれば多要素認証なしのログインを許容できるかに合わせて、適切なパラメータを選択することができます。
VSCode設定完全ガイド - 生産性を300%上げる10の神拡張機能




### **🔥 1. エンジニア必須の10拡張機能**  

#### **1. GitHub Copilot**  
- AIによるコード補完で**開発速度2倍**  
- 設定例:  
  ```json
  "github.copilot.enable": {
    "*": true,
    "plaintext": false
  }
  ```

#### **2. Prettier**  
- コードフォーマットを自動化  
- 設定例:  
  ```json
  "prettier.singleQuote": true,
  "prettier.printWidth": 100
  ```

#### **3. ESLint**  
- JavaScript/TypeScriptの静的解析  
- プロジェクト全体のコード品質を統一  

（※他の7つの拡張機能も詳細解説）  

---  

### **⚡ 2. 生産性を爆上げするキーボードショートカット**  

| 操作 | ショートカット | 効果 |  
|---|---|---|  
| ファイル検索 | `Ctrl+P` | 0.5秒でファイル移動 |  
| コード検索 | `Ctrl+Shift+F` | プロジェクト全体検索 |  
| ターミナル表示 | `` Ctrl+` `` | 即座にターミナル起動 |  

---  

### **💎 3. チーム開発必須の設定**  

#### **設定の共有**:  
```json
// .vscode/settings.json  
{
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  }
}
```

#### **拡張機能推奨リスト**:  
```json
// .vscode/extensions.json  
{
  "recommendations": [
    "esbenp.prettier-vscode",
    "dbaeumer.vscode-eslint"
  ]
}
```

---  

### **🎯 まとめ：今日から始める3ステップ**  
1. **GitHub Copilot**をインストール  
2. **Prettier+ESLint**でコード統一  
3. **ショートカット**をマスター  

---  

**💬 あなたのおすすめ拡張機能をコメントで教えてください！**  
次回は「** アルゴリズム＆設計パターン**」を解説予定です。  



「役に立った！」と思ったら♡やリポストをお願いします！ 🚀
雑談こそ最強のチームビルディング：生産性を上げる“無駄話”の力

## はじめに

「雑談は仕事に関係ない」「無駄話してる暇があったら作業を進めてほしい」  
そんなふうに思ったことはありませんか？

実は、**雑談こそがチームを強くする鍵**かもしれません。

本記事では、エンジニアチームや開発現場において、**雑談がどのようにチームビルディングに寄与するのか**を、実体験や心理学的な背景を交えて紹介します。  
さらに、設計やレビューなど**具体的なフェーズでの雑談の効果**や、**雑談しづらいチームの改善アイデア**についても触れていきます。

---

## 1. 雑談が持つ3つのチームビルディング効果

### 1-1. 心理的安全性を高める

雑談は、メンバー同士の**人間関係の潤滑油**です。  
業務外の話題（趣味、週末の出来事など）を共有することで、相手のパーソナリティを知るきっかけになります。

心理的安全性が高まることで、
- 意見を出しやすくなる
- ミスを恐れずに発言できる
- サポートを頼みやすくなる

といったポジティブな効果が得られます。

---

### 1-2. コミュニケーションのハードルを下げる

業務連絡だけの関係だと、相談や質問の際に心理的なハードルを感じがちです。  
しかし、雑談を通して自然な関係性があると、**業務のやり取りもスムーズ**になります。

---

### 1-3. チームの一体感を生む

日常のちょっとした笑いや共感できる話題は、**「このチーム、居心地がいいな」**という感覚を生み出します。  
それがやがて、チーム全体の一体感やモチベーション向上につながります。

---

## 2. 雑談の威力を実感した実体験

以前、私が参加したあるプロジェクトでは、リモート環境での開発が中心でした。  
最初は、業務連絡のみのやり取りが続き、**メンバー間に壁があるような感覚**が拭えませんでした。

ところが、ある日リーダーが「朝会の冒頭に最近のプチニュースを話そう」と提案。  
最初はぎこちなかったものの、1〜2週間も経つと「昨日のドラマ見た？」「猫がキーボードの上で寝てたｗ」など、雑談が自然に生まれました。

その結果…
- 気軽にコードレビューを依頼できるようになった
- 設計議論で率直な意見が出やすくなった
- 納期に間に合わないときも「一緒に頑張ろう」の雰囲気が生まれた

と、**チームの雰囲気とパフォーマンスが明らかに改善**したのです。

---

## 3. チーム開発の各フェーズでの雑談効果

### 🔧 設計段階

設計方針の議論には、**自由なアイデアの出し合い**が不可欠。  
雑談で心理的ハードルが下がっていると、「こんな案もあるんじゃ？」という柔軟な発言がしやすくなります。

### 🧪 実装中

バグや詰まりが出たときに、「ちょっと聞いていい？」と聞ける関係性があるだけで、**問題の早期解決**につながります。

### 🔍 レビュー時

コードレビューでのフィードバックは、時に指摘がキツく感じられることもあります。  
雑談で信頼関係があると、「指摘＝攻撃」ではなく「改善のための意見」として素直に受け取りやすくなります。

---

## 4. 「雑談しづらいチーム」での改善アイデア

### 💡 小さな工夫で自然に雑談を生むには？

#### 4-1. Slackの「#雑談」「#ランチ」チャンネルを設ける

雑談専用のチャンネルを用意し、「まずは投稿例を出してみる」ことがポイント。  
例：
```md
#雑談  
今日のランチはカレー🍛 みんなは何食べた？
```

#### 4-2. アイスブレイクを朝会に取り入れる

毎朝1分、「今日の天気」「おすすめアニメ」など軽い話題を話すだけでも十分です。  
話題例リストをあらかじめ用意しておくと、ネタ切れにも対応できます。

#### 4-3. 雑談が苦手なメンバーには「見るだけ参加OK」にする

無理に発言させるのではなく、**聞いているだけでもOKな環境**を整えることが大切です。  
まずは「反応ボタンを押すだけ」から始めても、関係性は徐々に深まります。

---

## 5. 雑談＝非効率という誤解

「雑談が多いと仕事が進まない」というのは、表面的な印象です。  
実際には、
- 情報共有がスムーズになる
- ミスが減る
- チーム内の助け合いが増える

といった形で、**トータルの生産性はむしろ向上**することが多いのです。

---

## おわりに

雑談は、単なるおしゃべりではありません。  
それは、**信頼と安心感を育むチームビルディングの武器**です。

もしあなたのチームで「なんとなく距離感がある」「相談しづらい」と感じることがあれば、  
まずは**雑談を少しずつ取り入れてみる**ところから始めてみてください。

---

### 📝 まとめ

- 雑談は心理的安全性とチームの信頼関係を築くのに効果的
- 設計・レビュー・実装すべてのフェーズで雑談が活きる
- 雑談しづらい環境には、チャンネル設計やアイスブレイクなどの工夫が効果的
- 雑談は、長期的に見れば生産性を高める力がある
【Python】Noneの判定に == や != を使うのはやめよう


## ✅ 結論

`None` の判定には `==` や `!=` ではなく、  
**必ず `is` / `is not` を使いましょう！**

---

## 🎯 背景：こんな問題がありました

```python
l = [1, 2, None, 3]

# 以下のように出力したい 
1 2 10000 3
```

---

### ❌ よくある間違い

```python
for i in l:
    if i == None:  # ← 一見よさそうだけど…
        i = 10000
    print(i, end=" ")
```

→ 一部のケースでは正しく動かないことがあります。

---

### ✅ 正しい書き方

```python
for i in l:
    if i is None:
        i = 10000
    print(i, end=" ")
```

---

## 🤔 なぜ `== None` はNGなの？

Pythonでは `==` や `!=` の挙動をクラス側でカスタマイズ（オーバーロード）できます。

少し深掘ると以下のようなことです。
- `__eq__` や `__ne__` で`==`や`!=`の挙動のカスタマイズができる
- そのカスタマイズによって**Noneじゃないのに `== None` がTrueになることがある！**

これは思わぬバグにつながるため、**Noneとの比較は常に `is` / `is not` を使うのが鉄則**です。

---

## 🔗 参考リンク

- 📘 [PythonでNoneの判定にはisを使うべき理由 - nkmk note](https://note.nkmk.me/python-none-usage/#none-is-none-is-not-none)  
- 🧠 [公式ドキュメント: 特殊メソッド名（__eq__など）](https://docs.python.org/ja/3/reference/datamodel.html#special-method-names)

---

## 📝 まとめ

| 比較方法 | 用途 | OK? |
|-----------|------|-----|
| `a == None` | 値の等価性 | ❌ 避けるべき |
| `a is None` | オブジェクトの同一性 | ✅ 推奨 |

---

今後 `None` を扱うときは、  isを使おうと思いました。
【実践編】今すぐ使えるAI技術の最先端プラットフォーム完全ガイド| [第11回] AI技術の未来 – トレンドと前渡

人工知能（AI）は近年急速に発展し、私たちの生活やビジネスのあらゆる分野に影響を与えています。本記事では、AI技術の最新トレンドと今後の発展について詳しく解説し、どのように活用すべきかを考察します。

---

## 1. AI技術の現在のトレンド

### 1.1. 大規模言語モデル（LLM）の進化

GPT-4やMistralのような大規模言語モデルは、自然言語処理の精度を飛躍的に向上させました。特に以下のような分野での活用が進んでいます。

- **カスタマーサポート**：チャットボットによる迅速な対応
- **コンテンツ生成**：記事作成や広告文の自動生成
- **プログラミング補助**：コード補完やデバッグの自動化

例えば、以下のようなPythonコードを使うことで、GPT-4 APIを活用した自然言語処理を実装できます。

```python
import openai

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "AIの未来について教えて"}]
)
print(response["choices"][0]["message"]["content"])
```

### 1.2. マルチモーダルAIの進展

テキストだけでなく、画像・音声・動画を統合的に処理できるAIが注目されています。OpenAIのGPT-4 VisionやGoogle DeepMindのGeminiなどが代表例です。

- **画像認識と文章生成の組み合わせ**
- **音声アシスタントの高度化**
- **動画解析によるインサイト抽出**

### 1.3. AI倫理と規制の強化

AIの発展に伴い、倫理的な問題も増えています。特に、データプライバシーやバイアスの問題が重要視されており、以下のような対策が求められています。

- **フェアなデータセットの使用**
- **説明可能なAI（XAI）の導入**
- **各国のAI規制への適応**

---

## 2. AIの未来 – どこへ向かうのか？

### 2.1. 自律型AIの台頭

今後のAI技術は、単なる補助ツールではなく、自律的に意思決定を行う方向へ進化していきます。

- **自動運転車の普及**
- **ロボットによるフルオートメーション化**
- **自己学習型AIの開発**

例えば、自律型エージェントを実装するには、以下のようなLangChainのコードを活用できます。

```python
from langchain.llms import OpenAI

llm = OpenAI(model_name="gpt-4")
response = llm.predict("次のタスクを自動化してください: 顧客問い合わせへの対応")
print(response)
```

### 2.2. AIと量子コンピューティングの融合

量子コンピューティングがAIの計算能力を大幅に向上させる可能性があります。特に以下のような分野での応用が期待されています。

- **新薬開発の加速**
- **気象予測の精度向上**
- **金融モデリングの最適化**

### 2.3. AIによる人間拡張（Augmented Intelligence）

完全にAIに依存するのではなく、人間とAIが協力する形が主流になると考えられます。

- **医療診断の補助**
- **教育分野でのパーソナライズ学習**
- **創造的な作業のサポート**

例えば、AIを活用した診断支援システムのコードは以下のようになります。

```python
import tensorflow as tf
from tensorflow import keras

model = keras.models.load_model("medical_diagnosis_model.h5")
input_data = ...  # 患者のデータ
prediction = model.predict(input_data)
print("診断結果: ", prediction)
```

---

## 3. まとめ – AI技術の未来を見据えて

本記事では、AIの最新トレンドと未来の展望について詳しく解説しました。

✅ **大規模言語モデルとマルチモーダルAIの進展**  
✅ **AI倫理と規制の重要性**  
✅ **自律型AIと量子コンピューティングの可能性**  
✅ **人間拡張（Augmented Intelligence）による共生**  

**AI技術の未来を見据え、ビジネスや生活にどのように活用できるかを考えてみましょう！**

**「LGTM」＆コメントでフィードバックをお待ちしています！**
【実践編】今すぐ使えるAI技術の最先端プラットフォーム完全ガイド| [第10回] PythonとRustのAIアプリ開発比較

近年、AIアプリケーション開発においてPythonとRustの選択肢が注目されています。本記事では、**PythonとRustのAI開発における特徴、利点、欠点、および実際のユースケース**について詳しく解説します。

---

## 1. PythonとRustの概要

### 1.1. Pythonとは？
Pythonは、シンプルな構文と豊富なライブラリを備えた高水準プログラミング言語です。AIやデータサイエンス分野で広く利用されています。

**メリット**:
- 豊富な機械学習・AIライブラリ（TensorFlow, PyTorch, Scikit-learn）
- コードの可読性が高く、学習コストが低い
- Jupyter Notebookを利用したインタラクティブな開発が可能

**デメリット**:
- 実行速度が遅い（インタプリタ言語のため）
- GIL（Global Interpreter Lock）の影響で並列処理が制限される

### 1.2. Rustとは？
Rustは、パフォーマンスと安全性を兼ね備えたシステムプログラミング言語で、近年AI分野でも注目されています。

**メリット**:
- 高速な実行性能（C++と同等のパフォーマンス）
- メモリ安全性が確保されている（所有権システム）
- 並行処理が容易で、GILの制約がない

**デメリット**:
- 学習コストが高い
- AIライブラリがPythonほど充実していない

---

## 2. AIアプリ開発におけるPythonとRustの比較

| 比較項目 | Python | Rust |
|----------|--------|------|
| 実行速度 | 遅い | 高速 |
| メモリ管理 | 自動（ガベージコレクション） | 所有権システムに基づく手動管理 |
| 並列処理 | GILの制約あり | 高度な並列処理が可能 |
| AIライブラリ | 豊富（TensorFlow, PyTorch） | 限られている（tch-rs, burn） |
| 開発のしやすさ | 簡単 | 難しい |

---

## 3. Pythonを使ったAIアプリ開発の実例

Pythonでは、機械学習モデルの構築が容易であり、多くのオープンソースライブラリが利用できます。

### 3.1. PyTorchを使った画像分類モデル
```python
import torch
import torchvision.models as models

model = models.resnet18(pretrained=True)
model.eval()
```

---

## 4. Rustを使ったAIアプリ開発の実例

Rustでは、機械学習の推論処理を高速に実行できます。

### 4.1. tch-rsを使った推論
```rust
use tch::{CModule, Tensor};

fn main() {
    let model = CModule::load("model.pt").unwrap();
    let input = Tensor::randn(&[1, 3, 224, 224], (tch::Kind::Float, tch::Device::Cpu));
    let output = model.forward_ts(&[input]).unwrap();
    println!("{:?}", output);
}
```

---

## 5. どちらを選ぶべきか？

| ユースケース | 推奨言語 |
|--------------|--------|
| 研究開発、プロトタイピング | Python |
| 高速な推論処理、組み込みAI | Rust |
| 並列処理が必要なアプリケーション | Rust |
| 既存の機械学習フレームワークを活用したい | Python |

---

## 6. まとめ

本記事では、PythonとRustのAIアプリ開発における違いを比較しました。

✅ Pythonは開発のしやすさと豊富なライブラリが強み
✅ Rustは高いパフォーマンスとメモリ安全性が魅力
✅ ユースケースに応じて適切な言語を選択することが重要

**あなたのAI開発にはPythonとRustのどちらが適していますか？ コメントで意見をお聞かせください！**
【実践編】今すぐ使えるAI技術の最先端プラットフォーム完全ガイド| [第9回] AWSでのAI導入コストとパフォーマンス最適化

AI技術をAWSに導入する際、コストとパフォーマンスのバランスを最適化することが重要です。本記事では、**AWS環境でAIアプリケーションを構築する際のコスト削減戦略とパフォーマンス向上テクニック**について詳しく解説します。

---

## 1. AWSを活用したAI導入の課題

AWSでAIを導入する際には、以下のような課題があります。

- **高コスト**: GPUインスタンスやストレージのコストが高額になりやすい。
- **レイテンシー**: 推論速度の最適化が求められる。
- **スケーラビリティ**: リクエストの増減に柔軟に対応する必要がある。
- **データセキュリティ**: 機密データの保護が不可欠。
- **運用の複雑さ**: AWSの多様なサービスを適切に組み合わせる必要がある。

こうした課題を克服するために、最適なサービス選定や設定を行う必要があります。

---

## 2. コスト最適化のためのAWSサービス選定

### 2.1. 適切なコンピューティング環境の選択

| AWSサービス | 特徴 |
|------------|------------------------------|
| **EC2 Spot Instances** | 通常のEC2より最大90%安価 |
| **AWS Lambda** | 小規模な推論処理に最適、完全サーバーレス |
| **Amazon SageMaker** | モデルのトレーニングと推論を低コストで実行 |
| **AWS Fargate** | コンテナベースのサーバーレスコンピューティング |

例えば、バッチ処理には **EC2 Spot Instances** を利用し、リアルタイム推論には **AWS Lambda** や **SageMaker Endpoint** を活用することでコストを抑えられます。

### 2.2. コスト削減のための具体的なアプローチ

- **リザーブドインスタンスの活用**: 長期的な使用を見越して予約することで最大75%のコスト削減。
- **Auto Scalingの導入**: 必要なときにのみリソースを拡張し、無駄なコストを削減。
- **スポットインスタンスの適用**: 一時的な処理にスポットインスタンスを活用し、コストを削減。

---

## 3. パフォーマンス最適化の戦略

### 3.1. モデルの最適化

AIモデルの推論速度を向上させるために、以下の手法を活用します。

- **ONNXやTensorRTを使用したモデル最適化**
- **量子化（Quantization）によるモデルサイズの削減**
- **AWS Inferentia（専用AI推論チップ）を活用**
- **バッチ推論の活用**: まとめて処理することで、1リクエストあたりのコストとレイテンシーを削減。

```python
import onnxruntime as ort

session = ort.InferenceSession("model.onnx")
input_data = {"input": some_numpy_array}
output = session.run(None, input_data)
```

### 3.2. 分散処理の活用

大量のデータ処理には **AWS Batch** や **AWS Step Functions** を活用し、ワークフローを効率化します。

```yaml
States:
  RunInference:
    Type: Task
    Resource: arn:aws:lambda:region:function:my-ai-function
    Next: ProcessResults
```

### 3.3. ネットワーク最適化

- **Amazon CloudFrontの導入**: 推論結果をキャッシュし、レスポンス時間を短縮。
- **AWS Global Acceleratorの利用**: ネットワーク遅延を最小限に抑える。
- **VPCエンドポイントの活用**: セキュアな内部通信でレイテンシーを改善。

---

## 4. ストレージとデータ管理の最適化

AWSでAIを運用する際のデータ管理は、コストに大きく影響します。

- **S3 Intelligent-Tiering** を利用して、アクセス頻度に応じたコスト最適化。
- **Amazon FSx for Lustre** を活用し、高速なデータアクセスを実現。
- **AWS Glue** を使ってETL処理を自動化し、データの整理を効率化。
- **Athenaを利用したクエリ最適化**: ビッグデータ解析を低コストで実行。

```python
import boto3
s3 = boto3.client("s3")
s3.put_object(Bucket="my-ai-data", Key="model-output/result.json", Body=json.dumps(results))
```

---

## 5. セキュリティとガバナンス

AIアプリケーションの運用では、セキュリティとデータガバナンスの最適化も欠かせません。

- **IAMポリシーを活用したアクセス制御**
- **AWS KMSによるデータ暗号化**
- **CloudTrailを活用した監査ログの管理**
- **Amazon Macieでデータの自動検出と分類**

---

## 6. まとめ

本記事では、AWS環境でのAI導入コスト削減とパフォーマンス最適化の方法を解説しました。

✅ **コスト最適化のためのAWSサービス選定**  
✅ **推論速度を向上させるためのモデル最適化手法**  
✅ **データ管理を最適化するためのAWSストレージ戦略**  
✅ **セキュリティとガバナンスの最適化**  

**AWSを活用してAIの導入コストを抑えつつ、パフォーマンスを最大化しましょう！**

**「LGTM」＆コメントでフィードバックをお待ちしています！**
【FastAPI / BackgroundTasks】レスポンスを返した後に特定の処理を実行したい

## はじめに

FastAPIで、レスポンスを返した後に特定の処理を実行する仕組みがないかなと調べているときにBackgroundTasks機能を知ったので紹介します。

## BackgroundTasksとは

公式サイトを引用します。

> レスポンスを返した 後に 実行されるバックグラウンドタスクを定義できます。
>
>これは、リクエスト後に処理を開始する必要があるが、クライアントがレスポンスを受け取る前に処理を終える必要のない操作に役立ちます。

https://fastapi.tiangolo.com/ja/tutorial/background-tasks/

たとえば、以下のようなケースで使用できます。
BackgroundTasksを使用することで、レスポンスを早く返して非同期で各処理を実行できます。

- ログの記録
  - APIを呼び出したユーザーのアクセスログをデータベースやファイルに記録
- メールの送信
  - フォームを送信した際にサーバ側でメール送信
- 定期的なデータの更新
  - API呼び出したユーザーのキャッシュデータをバックグラウンドで更新
- 大きなファイルの処理
  - すぐにレスポンスを返した後でバックグラウンドで圧縮、解析

## 具体例

公式サイトに載っているサンプルプログラムを見ていきます。

`.add_task()`メソッドを利用し、バックグラウンドで利用したい関数と引数を`background_tasks`オブジェクトに渡すだけです。

```python
from fastapi import BackgroundTasks, FastAPI

app = FastAPI()

# レスポンスを返した後でバックグラウンドで実行する関数
def write_notification(email: str, message=""):
    with open("log.txt", mode="w") as email_file:
        content = f"notification for {email}: {message}"
        email_file.write(content)


@app.post("/send-notification/{email}")
async def send_notification(email: str, background_tasks: BackgroundTasks):
    background_tasks.add_task(write_notification, email, message="some notification")
    return {"message": "Notification sent in the background"}
```


これで、`send_notification`のレスポンスが返った後で`write_notification`関数が実行されます。

`send_notification`関数に渡す引数は`email`だけで良いです。

:::note
`background_tasks`に引数を渡す必要はありません
リクエストが呼ばれたときにFastAPI側がBackgroundTasksのインスタンスを自動的に返してくれるためです
:::

非常にシンプルです。

## 終わりに

本記事はほとんど公式サイトの引用ですが、`send_notification`関数を呼び出すときに`background_tasks`に引数として何を渡せばいいかは公式サイトに書かれておらずよくわからなかったため、誰かの参考になればと思い記事を作成しました。
CS・ビジネスモデルの考え方

## はじめに
これまでエンジニアとして働いてきたのですが、新しく新規事業に取り組む中で、「CS（Customer Success）ってどう定義したらいいの？」「ビジネスモデルって、結局どう組み立てたらいいの？」と悩むことが多かったので、備忘に思考の流れを整理しておきます。
どなたかの参考になれば、うれしいです。:hatching_chick:

## CS（Customer Success）の考え方 
「CS＝お客さんの成功」といっても、いきなりVP（Value Proposition）を考えるのは難しいです。まずは観察→自分ごと化→汎化、という思考の順番で捉えると、自然に本質に近づいていけます。

### ステップ1：観察⇒自分ごと化⇒汎化
1. あの人、こんな風に困ってるな
2. そういえば、自分もこういうシーンで似た困りごと抱えるな
3. そういえば、他の人もこうやって困ってること多そうだな

この流れで、CSの“タネ”をつかみます。

### ステップ2：問題の構造を深掘る
4. この問題って何でおきてるんだっけ？
5. どういう流れでこれが問題になっているんだっけ
6. この問題の本質はどこにあるのだろうか？

ここまでくると、「だからこそ、こうしてあげるのが“お客さんの成功”だよね」という形が見えてきます。

### ステップ3：自社の強みをかけ合わせ、VP（提供価値）へ落とし込む

顧客の困りごとが明確になったら、自社の強みや立ち位置を踏まえた上で、「どのような状態にしてあげると成功といえるか？」を考え、VPを定義します。

## ビジネスモデルの考え方
こちらは以下の記事がとても参考になります。
特に「図解の説明書」セクションを最初に読むのがおすすめです。
[ビジネスモデル2.0図鑑 #全文公開チャレンジ](https://note.com/tck/n/n95812964bcbb#f16888cc-fa6b-4b47-becb-ac819638e62c)

### 思考の流れ（ざっくり）
1. ステークホルダーを列挙
2. 中央列を書く
3. 上記記事の順番に従って、左右に要素を広げていく
4. 最後に関係性を示す矢印を書く（内包関係から考えると整理しやすい）
5. 吹き出しで補足

### ポイント
:white_check_mark: 要素は 8〜9個以内 に絞るのがコツ
:white_check_mark: もし事業が複数にまたがってしまう場合は、複合して1つの要素にまとめるのもOK
【実践編】今すぐ使えるAI技術の最先端プラットフォーム完全ガイド| [第8回] AWS LambdaとAPI Gatewayを活用したAI APIの構築

AI技術の進化により、クラウド上でのAI APIの開発・運用がますます重要になっています。本記事では、**AWS LambdaとAPI Gatewayを活用してAI APIを構築する方法**について詳しく解説します。

---

## 1. AWS LambdaとAPI Gatewayの利点

AWS LambdaとAPI Gatewayを活用すると、以下のようなメリットがあります。

- **サーバーレスアーキテクチャ**: インフラ管理不要でスケーラブル。
- **コスト効率**: 使用した分だけ課金される。
- **セキュリティ**: IAM認証とAPI Gatewayの制御により安全な運用が可能。

まず、AWS環境をセットアップしましょう。

```bash
aws configure
```

---

## 2. Lambda関数の作成

Lambda関数を作成し、AIモデルの推論を処理するように設定します。

### 2.1. 必要なライブラリのインストール

Lambda環境に必要なライブラリ（boto3, numpy など）を含めるため、ローカルでパッケージングします。

```bash
mkdir lambda_function
cd lambda_function
pip install boto3 numpy -t .
zip -r lambda_function.zip .
```

### 2.2. Lambda関数のコード

以下のPythonコードをLambda関数にデプロイします。

```python
import json
import boto3
import numpy as np

def lambda_handler(event, context):
    data = json.loads(event['body'])
    prediction = np.mean(data["values"])  # ダミーのAI推論
    return {'statusCode': 200, 'body': json.dumps({'prediction': prediction})}
```

この関数は、受け取った数値データの平均値を返すシンプルなAI APIです。

---

## 3. API Gatewayの設定

### 3.1. API Gatewayの作成

AWSコンソールから**API Gateway**を開き、新しいREST APIを作成します。

- **エンドポイントタイプ**: Regional
- **リソースパス**: `/predict`
- **メソッド**: POST

### 3.2. Lambda統合

作成したAPI GatewayのエンドポイントをLambda関数に接続します。

- **統合タイプ**: Lambda 関数
- **Lambdaプロキシ統合**: 有効

デプロイ後、エンドポイントURLが発行されます。

---

## 4. フロントエンドからの利用

Next.jsやReactを使用して、API Gateway経由でLambda関数を呼び出します。

```tsx
import { useState } from 'react';

export default function Home() {
  const [input, setInput] = useState('');
  const [prediction, setPrediction] = useState('');

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    const res = await fetch('https://your-api-gateway-url/predict', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ values: [1, 2, 3, 4, 5] }),
    });
    const data = await res.json();
    setPrediction(data.prediction);
  };

  return (
    <div>
      <h1>AI APIテスト</h1>
      <button onClick={handleSubmit}>予測を実行</button>
      <p>結果: {prediction}</p>
    </div>
  );
}
```

---

## 5. デプロイと運用

本番運用を考慮し、以下のポイントを押さえましょう。

- **CloudWatchでLambdaのログを監視**
- **API Gatewayのレート制限を設定**
- **IAMロールで適切な権限管理を実施**

デプロイの自動化にはAWS CLIやTerraformを活用できます。

```bash
aws lambda update-function-code --function-name myLambdaFunction --zip-file fileb://lambda_function.zip
```

---

## 6. まとめ

本記事では、AWS LambdaとAPI Gatewayを活用したAI APIの構築方法について解説しました。

✅ **LambdaでAI推論を処理**  
✅ **API Gatewayでエンドポイントを公開**  
✅ **Next.jsと連携しフロントエンドを構築**  

**AWSを活用したAI API開発にぜひ挑戦してみてください！**

**「LGTM」＆コメントでフィードバックをお待ちしています！**

---
【Pydantic v2】Computed Fieldsの使用法

## はじめに

先日Pydantic v2で新しく導入されたComputed Fieldsを初めて使いました。
日本語の記事があまりなかったので紹介します。

## Computed Fieldsとは

Computed Fieldsとは、モデルのデータを計算したフィールドです。
データベースには保存されていないデータを、APIのレスポンスやオブジェクトのプロパティとして使用できます。

## 基本的な例

以下は公式サイトのサンプルです。
`area`はデータベースには含まれませんが、オブジェクトのプロパティには含まれています。

```python
from pydantic import BaseModel, computed_field


class Rectangle(BaseModel):
    width: int
    length: int

    @computed_field
    @property
    def area(self) -> int:
        return self.width * self.length


print(Rectangle(width=3, length=2).model_dump())
#> {'width': 3, 'length': 2, 'area': 6}
```

## APIでの使用例

FastAPIの内部ではPydanticが使われているので、FastAPIでcomputed_fieldを使うことで、フロント側で簡単に計算結果を取得できます。

:::note warn
Pydantic v2に対応しているのはFastAPI 0.100.0以降の場合のみです
:::

具体例として、以下のサンプルプログラムをChatGPTに生成してもらいました[^1]。

```python
from fastapi import FastAPI
from pydantic import BaseModel, computed_field

app = FastAPI()

class ProductModel(BaseModel):
    name: str
    price: float
    tax_rate: float = 0.1  # 税率デフォルト 10%

    @computed_field
    @property
    def price_with_tax(self) -> float:
        return self.price * (1 + self.tax_rate)

@app.get("/product")
def get_product():
    product = ProductModel(name="Laptop", price=1000.0)
    return product
```

`GET /product`をすると以下のJSONが返ります。
`price_with_tax`はデータベースには含まれませんが、APIのレスポンスには含まれています。

```json
{
  "name": "Laptop",
  "price": 1000.0,
  "tax_rate": 0.1,
  "price_with_tax": 1100.0
}
```

レスポンスとして`ProductModel`型のデータを返すとき、`price_with_tax`も返ってくるので、フロント側でいちいち計算する手間が省けます。

## おわりに

Computed Fields、めちゃくちゃ便利です。

## 参考

https://docs.pydantic.dev/2.0/usage/computed_fields/

https://zenn.dev/tk_resilie/articles/fastapi0100_pydanticv2#(%E6%96%B0%E6%A9%9F%E8%83%BD)computed_field

[^1]:本筋とは無関係ですが、税率は別途定数の設定ファイルに記載した方がいいと思います
Homebrewってなに？

>「Homebrew って何？入れるとどうなるの？」

Homebrewは、macOSやLinuxで使えるパッケージ管理ツールです。これをインストールすると、ターミナルを使って簡単にソフトウェアをインストール、更新、管理できるようになります。

例えば、通常ならインストール作業が面倒なソフトウェアも、Homebrewなら以下のような簡単なコマンドでインストールできます:

```bash
brew install <パッケージ名>
```

これを使うことで、手動でダウンロードしたり、複雑なインストール手順を踏んだりすることなく、簡単にソフトを追加できるようになります。

また、Homebrewを使うと、ソフトウェアの依存関係も自動で管理してくれるので、システムがうまく動かなくなる心配が減ります。

例えば、Node.js、Python、Git、MySQLなど、開発に必要なツールを簡単にインストールできるようになるので、開発環境のセットアップがかなり楽になります。

>使わなくてもターミナルでインストールできるんじゃないの？どう違う？

確かに、ターミナルを使って直接インストールすることもできますが、Homebrewを使うことで得られる主な利点は以下の通りです：

### 1. **簡単なインストールと管理**
   - Homebrewは、コマンド一発でソフトウェアをインストール・アップデート・アンインストールできます。手動でのインストールは、公式サイトからダウンロードして、手動で解凍したり、設定を行ったりする必要があり、少し面倒です。
   - 例えば、`brew install node` と入力するだけで、Node.jsが自動的にインストールされ、依存関係も管理されます。手動でインストールする場合は、依存関係を一つひとつ確認して設定する必要があります。

### 2. **依存関係の管理**
   - 多くのソフトウェアは、他のソフトウェアに依存していることがあります。Homebrewはこれを自動で管理してくれるので、どのパッケージがどのライブラリやツールに依存しているかを気にせずにインストールできます。
   - 例えば、あるツールが特定のバージョンのPythonを要求している場合、Homebrewが自動的にそのバージョンをインストールしてくれるので、手動でインストールするよりもトラブルが少ないです。

### 3. **アップデートの簡便さ**
   - インストールしたソフトウェアが古くなった場合、`brew update` や `brew upgrade` といったコマンドで一括して更新でき、手動でインストールしたソフトウェアの更新を個別に確認する必要がなくなります。

### 4. **アンインストールが簡単**
   - 使わなくなったソフトウェアを `brew uninstall <パッケージ名>` で簡単にアンインストールできます。手動でインストールした場合、削除する際に不要なファイルや設定が残ることが多いですが、Homebrewならそれを自動で綺麗に取り除いてくれます。

### 5. **パッケージのバージョン管理**
   - Homebrewは、特定のバージョンのパッケージをインストールしたり、古いバージョンを保持したりすることも可能です。これにより、複数のバージョンを同時に扱うことができます。

要するに、Homebrewを使うことで、ソフトウェアのインストール・管理・アップデート・削除が非常に楽になり、開発環境のセットアップがスムーズに進みます。
【実践編】今すぐ使えるAI技術の最先端プラットフォーム完全ガイド| [第6回] Next.jsを活用したAIフロントエンドアプリの構築

近年、AI技術の進化に伴い、ユーザーフレンドリーなインターフェースを提供するAIフロントエンドの重要性が高まっています。Next.jsは、高速で柔軟なフロントエンド開発を可能にするReactベースのフレームワークであり、AIアプリケーションのUI/UXを向上させるのに最適です。本記事では、**Next.jsを活用したAIフロントエンドアプリの構築**について詳しく解説します。

---

## 1. Next.jsがAIフロントエンドに適している理由

Next.jsは以下の特徴を持ち、AIフロントエンド開発に最適です。

- **SSR（サーバーサイドレンダリング）対応**: 初回ロードが速く、SEOにも優れる。
- **APIルート機能**: バックエンドと連携しやすく、AIモデルの推論結果をフロントエンドに組み込みやすい。
- **動的ルーティング**: AIアプリのユーザー体験を向上させる。
- **Reactのエコシステムを活用**: 強力なコンポーネント設計が可能。

まず、Next.jsの環境をセットアップしましょう。

```bash
npx create-next-app@latest ai-frontend --typescript
cd ai-frontend
npm install
```

---

## 2. AI APIとの連携

AIアプリのフロントエンドでは、バックエンドのAIモデルと連携するAPIが必要です。Next.jsのAPIルート機能を使って、シンプルなAI推論APIを作成します。

### 2.1. APIエンドポイントの作成

`/pages/api/predict.ts` に以下のコードを追加します。

```typescript
import type { NextApiRequest, NextApiResponse } from 'next';

type Data = {
  prediction: number[];
};

export default function handler(
  req: NextApiRequest,
  res: NextApiResponse<Data>
) {
  const input = req.body.values;
  const prediction = input.map((num: number) => num * 2); // 仮のAI推論
  res.status(200).json({ prediction });
}
```

---

## 3. フロントエンドの実装

### 3.1. フォーム入力とAI予測結果の表示

Next.jsの`useState`と`fetch`を活用して、ユーザーが入力したデータをAPIに送信し、予測結果を取得します。

`/pages/index.tsx` に以下のコードを追加します。

```tsx
import { useState } from 'react';

export default function Home() {
  const [input, setInput] = useState('');
  const [prediction, setPrediction] = useState<number[]>([]);

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    const res = await fetch('/api/predict', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ values: input.split(',').map(Number) }),
    });
    const data = await res.json();
    setPrediction(data.prediction);
  };

  return (
    <div className="container mx-auto p-8">
      <h1 className="text-2xl font-bold">AI予測アプリ</h1>
      <form onSubmit={handleSubmit} className="mt-4">
        <input
          type="text"
          value={input}
          onChange={(e) => setInput(e.target.value)}
          placeholder="数値をカンマ区切りで入力"
          className="border p-2 mr-2"
        />
        <button type="submit" className="bg-blue-500 text-white p-2">予測</button>
      </form>
      <div className="mt-4">
        <h2 className="text-xl">予測結果:</h2>
        <p>{prediction.join(', ')}</p>
      </div>
    </div>
  );
}
```

---

## 4. Next.jsの最適化とデプロイ

Next.jsアプリのパフォーマンスを最適化するために、以下の点を考慮します。

- **`getServerSideProps` を活用**: サーバーサイドでデータを事前に取得し、ロード時間を短縮。
- **画像最適化 (`next/image`)**: AIによる画像処理アプリでパフォーマンスを向上。
- **キャッシュ (`revalidate` 設定)**: APIのレスポンスを効率的に管理。

また、Next.jsアプリは**Vercel**を使って簡単にデプロイできます。

```bash
npx vercel
```

デプロイ後、AIフロントエンドアプリを公開できます！

---

## 5. まとめ

本記事では、Next.jsを活用してAIフロントエンドアプリを構築する方法を解説しました。

✅ **Next.jsはSSRとAPIルート機能を活用できるため、AIアプリと相性が良い**  
✅ **AI APIと連携するシンプルなフロントエンドを構築できる**  
✅ **Vercelを使えば、簡単にデプロイ可能**  

**Next.jsを使ったAIアプリ開発に興味がある方は、ぜひ試してみてください！**

**「LGTM」＆コメントでフィードバックをお待ちしています！**

---
1からVSCodeのRemote SSHを使えるようにする

Remote SSHを使用してサーバに接続できるようにするための手順の備忘録

## 接続できるようになるまでの手順
### 秘密鍵・公開鍵の生成

https://qiita.com/soma_sekimoto/items/35845495bc565c38ae9d

ターミナルを開き、
`ssh-keygen`
と入力。以下諸々聞かれるがエンターキー連打

### 公開鍵認証の設定
VSCodeのRemote SSHでは、パスワード認証で接続できない。そのため、これを設定する。
Macの場合はssh-copy-idを使用

https://zenn.dev/rmt_drums/articles/173b4536f1c6e6


Windowsの場合はssh-copy-idの代わりに下記の記事を参考にする

https://qiita.com/tabu_ichi2/items/446722c15e6b5678ccad

### ~/.ssh/configファイルの設定
下記を追記
```
Host 覚えやすい名前
  HostName 接続先のIPアドレス
  IdentityFile ~/.ssh/id_rsa（など。作成された秘密鍵のパスを通す）
  User ssh接続先のユーザー名
  ```

### 拡張機能のインストール
VSCodeの拡張機能を検索。
Remote - SSHというプラグインをインストールする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498275/9087c288-39ad-42ba-9966-e5704dda91fc.png)

ここをクリックして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498275/7a1a7c41-4141-4233-bed5-8ad7d757d743.png)

ここの一覧に、自分が設定したHost名が表示されていたら成功。
右矢印を押すことで接続できる。
## やっておくべき設定
以下は、必須ではないがマシンリソースを食い潰すことをあらかじめ防ぐためにやっておくべき設定。

### Watcher Excludeの設定
https://blog.masuyoshi.com/%E3%80%90vscode%E4%BD%BF%E7%94%A8%E8%80%85%E6%B3%A8%E6%84%8F%E3%80%91%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E9%A3%9F%E3%81%84%E6%95%A3%E3%82%89%E3%81%8B%E3%81%99/

### search.followSymlinksの設定
https://zenn.dev/genssk/articles/19b509351e12f2
[pandas] indexが複数あるときのタイトルの付け方 [Python]

indexが1つだけのときと2つ以上のときとでは設定方法が異なる。

# 方法

indexが1つの場合
```pyth
df.index.name='foo'
```

indexが2つ以上の場合
```python
df.index.names=['foo','bar']
```
indexが1つの場合も、長さ1の配列を渡せば`df.index.names`で設定可能。

# 使用例
```python
import pandas as pd

# サンプルデータの作成（MultiIndex）
arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=('カテゴリ', '番号'))
data = {'値': [10, 20, 30, 40]}
df = pd.DataFrame(data, index=index)

# インデックスのタイトルを変更
df.index.names = ['新カテゴリ名', '新番号名']

print(df)

#                   値
# 新カテゴリ名 新番号名    
# A            1    10
#              2    20
# B            1    30
#              2    40

```
Radix UIのTooltip.Arrowをカスタマイズする

Radix UIのTooptipを表示する時に、それの下の三角はデフォルトが黒三角ですが、実際のデザインに合わせて、独自な三角を描画する方法をメモする。

### デフォルト三角

![スクリーンショット 2025-03-26 16.45.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123446/24490eed-325b-4b40-9fb7-0ddade6015dc.png)

### デザインの三角

- 白い背景
- Strokeあり

![スクリーンショット 2025-03-26 16.35.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123446/cdfa5175-1641-4713-9089-1c88ead69d1b.png)


### 実装方法

svgタグを使って、その中でpolylineタグにより直接に線を引く

```tsx
<RadixTooltip.Arrow asChild width={10} height={5}>
  <svg className="fill-white stroke-slate300 stroke-[2px]">
    <polyline points="0,0 15,10 30,0" />
  </svg>
</RadixTooltip.Arrow>
```

- svgタグのclass名に直接fill-white色などを記載できる
balenaEtcher を Ubuntu にインストール

「milk-V Duo First impression」
https://qiita.com/nanbuwks/items/2e704af9ea7d64480321

で使った balenaEtcher. 記事では AppImage 版を使いましたが、その他の版を試してみました。


# 環境

- Ubuntu 24.04
- balenaEtcher 2.1.0

# zip パッケージ


```
$ unzip balenaEtcher-linux-x64-2.1.0.zip
$ cd balenaEtcher-linux-x64
```

```
$ ./balena-etcher 
[5079:0326/162809.048511:FATAL:setuid_sandbox_host.cc(158)] The SUID sandbox helper binary was found, but is not configured correctly. Rather than run without sandboxing I'm aborting now. You need to make sure that /home/nanbuwks/Downloads/balenaEtcher-linux-x64/chrome-sandbox is owned by root and has mode 4755.
Trace/breakpoint trap (コアダンプ)
```
これを回避するための方法はいろいろあるのですが、とりあえず以下のようにしたら動きました。
```
$ ./balena-etcher  --no-sandbox

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d7935d7c-40ea-4eaa-b62a-b2f73df98c37.png)
ACCESS VBAを使って「保存済みのインポート操作」「保存済みのエクスポート操作」を別のACCDBへ移行する

## はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/cbf29178-3bd3-4026-b1b5-a8c4f9804180.png)

Access VBAを使用して、「保存済みのインポート操作」および「保存済みのエクスポート操作」を別のACCDBファイルへ移行する方法について説明します。Accessにはこれらの操作を直接コピーする機能がないため、VBAを使用してXML形式で定義をエクスポートし、それを別のデータベースにインポートする手順を紹介します。

## 背景

Accessでデータベースを移行する際、「保存済みのインポート/エクスポート操作」も移行する必要がありましたが、標準機能では対応していませんでした。そのため、VBAを使用してこの移行プロセスを実現しました。

## 環境

* Microsoft Access

## 手順

### 1. エクスポート元のACCDB（a.accdb）での操作

まず、エクスポート元のデータベース（a.accdb）で、移行したいインポート/エクスポート操作の定義をXMLファイルとして出力します。

```vba
Function exportSettingXML()
    Dim Prj As CodeProject
    Dim Obj As ImportExportSpecification
    Dim strExportName As String
    ' エクスポート操作、またはインポートの名前を指定
    strExportName = "対象の操作名"
    Set Prj = CurrentProject
    
    ' XMLで定義を取得する
    Set Obj = Prj.ImportExportSpecifications(strExportName)
    strXML = Obj.XML

    ' 変更後のXMLをファイルに出力
    Dim filePath As String
    filePath = CurrentProject.Path & "\ExportSpec.xml"
    Open filePath For Output As #1
    Print #1, strXML
    Close #1
End Function
```

このコードでは、指定されたインポート/エクスポート操作の定義をXML形式で取得し、`ExportSpec.xml`というファイルに出力します。

### 2. インポート先のACCDB（b.accdb）での操作

次に、インポート先のデータベース（b.accdb）で、出力されたXMLファイルからインポート/エクスポート操作を復元します。

```vba
Function ImportExportSpecFromXML(xmlFilePath As String, specName As String) As Boolean
    Dim Prj As CodeProject
    Dim Obj As ImportExportSpecification
    Dim strXML As String
    Dim stream As Object

    On Error GoTo ErrorHandler

    ' XMLファイルを読み込む
    Set stream = CreateObject("ADODB.Stream")
    stream.Type = 2 ' adTypeText
    stream.Charset = "Shift_JIS"
    stream.Open
    stream.LoadFromFile xmlFilePath
    strXML = stream.ReadText
    stream.Close
    Set stream = Nothing

    ' 指定された名前のインポート/エクスポート仕様を取得
    Set Prj = CurrentProject
    Set Obj = Prj.ImportExportSpecifications(specName)

    ' インポート/エクスポート仕様が存在しない場合は作成
    If Obj Is Nothing Then
        Set Obj = Prj.ImportExportSpecifications.Add(specName, strXML)
    Else
        ' インポート/エクスポート仕様を更新
        Obj.XML = strXML
    End If

    ImportExportSpecFromXML = True

Cleanup:
    Exit Function

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
    ImportExportSpecFromXML = False
    Resume Cleanup
End Function

Sub TestImportExportSpecFromXML()
    Dim xmlFilePath As String
    Dim specName As String

    xmlFilePath = CurrentProject.Path & "\ExportSpec.xml"' a.accdbが出力したXMLファイルのパスを指定
    specName = "対象の操作名" ' 上書きまたは作成するインポート/エクスポート操作の名前を指定

    If ImportExportSpecFromXML(xmlFilePath, specName) Then
        MsgBox "インポート/エクスポート操作を更新または作成しました。", vbInformation
    Else
        MsgBox "インポート/エクスポート操作の更新または作成に失敗しました。", vbCritical
    End If
End Sub
```

このコードでは、指定されたXMLファイルを読み込み、インポート/エクスポート操作を復元または新規作成します。

## 注意点

* XMLファイルの文字コードは、環境によって`Shift_JIS`または`UTF-8`を適切に選択してください。
* インポート先のデータベースで、同じ名前のインポート/エクスポート操作が既に存在する場合は、上書きされます。
* 新規作成部分のテストは不十分ですので、必要に応じて修正してください。

## まとめ

この方法を使用することで、Accessの「保存済みのインポート/エクスポート操作」を別のACCDBファイルへ移行することができます。Accessの標準機能では対応していないため、VBAによる自動化は非常に有効です。
Stackblitzの.envファイルが反映されない

## GitHub側の.envファイルを変更しても、Stackblitz側で反映されない場合

### Settingsをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515139/39d4ae4e-8ff2-4062-b439-13b77c271c66.png)

### Variablesから該当のプロジェクトを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515139/62a78a33-88da-4472-b6db-de6317a03f4d.png)

**ここに値が保存されているので、更新されない値をRemoveして削除する**


# メモ
.envの値を確認したい場合、ターミナルから下記コマンドで確認かｎ
```
node
process.env
```
Nginxのserver_nameについて

Nginxの設定においてリクエストがserver_nameに合致しない場合などの挙動への理解が曖昧だったのでserver_name周りについて調べてまとめました。   
リクエスト処理の流れについては[こちら](https://qiita.com/vossibop/items/999aa6a5c3330fde6f4f)参考


## 1. server_name の基本
`server_name`は、Host ヘッダーに基づいてリクエストをどの`server`ブロックで処理するかを決める設定。

e.g. `http://example.com`のリクエストが以下の`server`に割り当てられる。
```
server {
    listen 80;
    server_name example.com;
}
```

## 2. server_name のマッチングルール
1. 完全一致（Exact Match）
    * `server_name example.com;` -> `Host: example.com` に完全一致した場合のみ適用
    * `www.example.com`には適用されない
2. ワイルドカード（*.example.com）
    * 先頭(`*.example.com`)または末尾(`example.*`)にワイルドカードを使用可能
    * `server_name *.example.com;` -> `www.example.com`や`app.example.com`にマッチする
    * ただし、`example.com`にはマッチしない
3. 正規表現（Regex Match）
    * `~`を付けると、正規表現（PCRE）でマッチ
    * `server_name ~^www\d+\.example\.com$;` -> `www1.example.com`, `www2.example.com`などにマッチ

## 3. server_name の優先順位
リクエストがNginxに届いたとき、次の順で`server_name`を評価する
1. 完全一致（Exact Match）が最優先
2. ワイルドカード（前方一致 *.example.com や example.*）
3. 正規表現（Regex Match ~^www\d+\.example\.com$）
4. デフォルトの server（default_server の指定があるもの or 最初の server）

## 4. server_name が合致しない場合
NginxはリクエストのHostヘッダーに一致する`server_name`を持つ`server`を探すが、見つからない場合はデフォルトの`server`が適用される。   
デフォルトの`server`は以下のいずれかになる。
1. `default_server`が指定されている`server`
2. 指定がない場合、設定ファイル内で最初に定義された`server`

e.g. `default_server`を指定する場合
```
server {
    listen 80 default_server;
    ...
}
```

## 5. server_name _; の挙動
`server_name _;`はserver_name に該当しないリクエストを処理するための一般的な設定。   
「すべてのリクエストを受け入れる」設定ではない。   
Hostヘッダーが空の場合にも適用される。

## 6. server_name_in_redirect
Nginxの`server_name`をリダイレクト時に使うかどうかを制御   

e.g. Nginxはリダイレクト時に`server_name`ではなくHostヘッダーを使用する
```
server {
    listen 80;
    server_name example.com;
    server_name_in_redirect off;
}
```

## ref
* https://nginx.org/en/docs/http/server_names.html
* https://nginx.org/en/docs/http/request_processing.html
Terraform使ってみたい

## はじめに
AWSを社内研修で一通り学んで、アウトプットしたく書き始めてます。

Terraformって何か流行ってるみたいだし触ってみようかな、と思いUdemyの講座を参考に勉強していこうと思っています。
## Terraformってそもそも何？
インフラ構成をソースコードとして管理できる機能。(infrastructur as Code)
インフラのセットアップが自動化できる。
AWS以外にもGCPやAzureにも対応してる。
## Terraformを使って何するか
- EC2を立ち上げ
- セキュリティグループの設定
- ユーザーデータを使ってnginxを自動インストール
- デフォルトVPCにつなぐ
## プロバイダの設定
TerraformはGCPやAzure等AWSでも使えるので、使うプラットフォームのプロバイダを使用する。
今回はAWSを使うのでAWSプロバイダを使用。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs
上記の公式ドキュメントからプロバイダの書き方の例を引っ張ってきて自分の環境に合わせてコードを書き換える。
## インスタンスリソースを記述
resourceは何かを作り出すための構文。
 一行目はaws_instanceを作るよ的なこと。
main.tfを作り下記の項目を埋める。
```
resource "aws_instance" "this" {
  ami           = ""←ここにAMIのイメージIDを入力
  
  instance_type = "t2.micro"←インスタンスのスッペク

  tags = {
    Name = ""←インスタンスの名前
  }
}
```
## Terraformの基本コマンドを行う
- terraform init(Terraformを使う準備)
- terraform plan(構築するインフラの確認)
- terraform validate(構文の確認)
- terraform apply(インフラ構築)
- terraform destroy(構築したインフラの削除)
上記のコマンドの実行をインスタンスリソースをファイル(main.tf)に記述し行った。ここではEC2インスタンスを立ち上げた。

基本的にはコードを公式ドキュメントから引っ張ってきて、コマンドで実装の流れだったので下記の項目は割愛します。
- セキュリティグループの設定
- ユーザーデータを使ってnginxを自動インストール
- デフォルトVPCにつなぐ

## まとめ
Terraformを使用してのインフラの構築は出来たので、まだまだ勉強しないといけないこともありますがいったんまとめとします。
知識が浅くまとまりがないですがご了承ください。

参考にした講座はこちらです。
- https://www.udemy.com/course/terraform-with-aws/?couponCode=CM240325
- https://youtu.be/h1MDCp7blmg?si=yFWj-EEAkzDYI7T0
Nginxのリクエスト処理の流れについて

Nginxがリクエストを受け取り処理を行う流れや優先順位と設定ファイルの対応関係についての認識が曖昧だったのでまとめました。

## 1. NGINX のリクエスト処理の流れ

1. クライアントが HTTP リクエストを送信
    * Hostヘッダーをもとに適切なserverブロックを選択
    * e.g. `GET /index.html HTTP/1.1 Host: example.com`
2. `server_name`を元に、一致するserverを探す
    * 一致しない場合は`default_server`（または最初の`server`）が選ばれる
    * `location`ディレクティブで処理を決定
3. リクエストされたパス(`/index.html`など)に合致した`location`ブロックを選択
4. 対応する処理を実行
    * `root`ディレクティブ : 静的ファイルを返す
    * `proxy_pass` : 別のサーバーにリクエストを転送
    * `return` : 即座にレスポンスを返す（リダイレクトなど）
    * `rewrite` : URL をリライトする

## 2. server ブロックの選択
NginxはリクエストのHostヘッダーを元に、以下の優先順位で適切な`server`ブロックを選ぶ
1. `server_name`の完全一致
2. ワイルドカード（*.example.com など）
3. `default_server`が適用（なければ最初のserver）

e.g. 
```
server {
    listen 80;
    server_name example.com;
}
server {
    listen 80;
    server_name *.example.com;
}
server {
    listen 80 default_server;
    server_name _;
}
```
| Hostヘッダー | 適用されるserver |
| :--: | :--: |
| example.com | 1番目のserver（完全一致）|
| app.example.com | 2番目のserver（ワイルドカード）|
| unknown.com | 3番目のserver（default_server）|

server_nameについては[こちら](https://qiita.com/vossibop/items/ff4195f5e9c3370b8e9c)参考

## 3. location ブロックの選択ルール
`server`が決まったら、リクエストURLに対して最も適した`location`ブロックが選ばれる
マッチングの優先順位は以下の通り
1. 完全一致（ `location = /exact/path` ）
2. 前方一致（ `location /prefix` ）
3. 正規表現（ `location ~ regex` ）
4. デフォルト（ `location /` ）

```
server {
    listen 80;
    server_name example.com;

    location = /ping {
        return 200 "pong";
    }
    location /api/ {
        proxy_pass http://backend;
    }
    location ~ \.php$ {
        fastcgi_pass php-fpm;
    }
    location / {
        root /var/www/html;
    }
}
```

| リクエストURL | 適用されるlocation |
| :--: | :--: |
| /ping | location = /ping（完全一致） |
| /api/users | location /api/（前方一致） |
| /index.php | location ~ \.php$（正規表現） |
| /index.html | location /（デフォルト） |

## 4. リバースプロキシ (proxy_pass)
`proxy_pass`を使うと、Nginxはリクエストをバックエンド（別のサーバー）に転送する

e.g. `http://example.com/api/users`のリクエストを`http://backend/api/users`に転送
* 複数サーバー指定（負荷分散）
```
# バックエンドの定義
upstream backend {
    server 192.168.1.100:8080;
    server 192.168.1.101:8080;
}
# リバースプロキシ設定
server {
    listen 80;
    server_name example.com;

    location /api/ {
        proxy_pass http://backend;
    }
}
```

* ローカルのアプリケーション
```
upstream backend {
    server localhost:8080;
}

server {
    listen 80;
    server_name example.com;

    location /api/ {
        proxy_pass http://backend;
    }
}
```

## 5. 静的ファイルの処理 (root & index)
`root`はドキュメントルートを設定。
`index`はデフォルトのファイル (index.html) を指定。

e.g. -> `http://example.com/`にアクセスすると`/var/www/html/index.html`を返す
```
location / {
    root /var/www/html;
    index index.html;
}
```

## 参考
* https://nginx.org/en/docs/http/request_processing.html
rclone + macfuseでマウント覚書き

Macでrcloneとmacfuseを使ってSFTPをドライブとしてマウントする。

1.homebrewをインストールしておく。

2.必要なライブラリをインストール
$ brew install --cask macfuse
$ brew install rclone

3.Rcloneの設定（設定がごちゃごちゃしているので直接書く）
sudo vi ~/.config/rclone/rclone.conf
[マウント名]
type = sftp
host = ホスト名
user = ユーザー名
port = ポート番号
key_file = ~/.ssh/秘密鍵.pem
key_use_agent = false
shell_type = unix
md5sum_command = md5sum
sha1sum_command = sha1sum


4.マウントポイントをつくる
$ mkdir -p ~/mount/マウント名

5.ターミナルマウントする
rclone mount マウント名:/ ~/mount/マウント名 \
  --vfs-cache-mode full \
  --vfs-cache-max-size 2G \
  --vfs-read-ahead 128M \
  --buffer-size 32M \
  --poll-interval 15s \
  --dir-cache-time 12h \
  --transfers 4 \
  --multi-thread-streams 4 \
  --attr-timeout 1s \
  --umask 002 \
  --allow-other \
  --daemon
【用語解説】バーチャルホストってなんだー？？

### バーチャルホストの概要
1台のサーバーで複数のドメインやWebサイトを運用する技術。

### バーチャルホストの種類
**・IPベースのバーチャルホスト：** 各ドメインに異なるIPアドレスを割り当てる方法。サーバーは受信したIPアドレスに基づいて適切なWebサイトを提供。

**・名前ベースのバーチャルホスト：** 1つのIPアドレスに複数のドメインを関連付ける方法。
クライアントからのリクエストに含まれる各情報を基に、サーバーは適切なWebサイトを提供。

:::note warn
名前ベースのバーチャルホストはTLSを使ったHTTPS通信時、サーバーが適切な証明書を提示できない場合がある。

→そのためにServer Name Indication(SNI)という拡張機能が利用される。
:::

:::note info
SNIはTLSプロトコルの拡張機能である。
クライアント→サーバーへの接続時に接続先のホスト名を通知する仕組み。

→これによって1つのIPアドレスで複数の証明書を使用し、複数のドメイン名を安全にホスティングすることが出来る。
:::



### 参考文献
https://www.tnjapan.net/6373/?utm_source=chatgpt.com
[備忘録]環境構築

# 仮想環境構築

## はじめに
二か月ぶりに新しいアプリケーションを開発するため
仮想環境を構築した時にエラーが出ちゃった
miniconda3

## エラー内容
```
C:\Users\mahiro sakurai\Desktop\py\家計簿管理アプリ>conda -v
'conda' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

## 環境変数の確認
```
C:\Users\mahiro sakurai\miniconda3\Scripts>conda.exe -V
conda 4.12.0
```
```
C:\Users\mahiro sakurai\miniconda3\Scripts\conda.bat -V
'conda.bat' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

環境変数は通ってると思うけど
conda.batだけ使えないのがよくわからん

```
C:\Users\mahiro sakurai\miniconda3\Scripts\conda.exe -V
'conda.exe' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```
なぜ？

## condaの初期化
```
C:\Users\mahiro sakurai\miniconda3\Scripts\conda.exe init
```
その後pcを再起動
仮想環境作れた

# 教訓
教訓1　コマンドが動かない時は「物理的な存在」と「環境変数」の両方を確認

dirコマンドで実行ファイルの存在確認
where 実行ファイルのパスが県境変数に登録確認

教訓2 condaはconda.exeだけでなくコマンドプロンプトとの統合が必要　そのためにconda.init

教訓3 環境変数を変更したり、conda initを実行しても既存のターミナルでは設定が変更されない→pc再起動


## 仮想環境作成
### エラー
```
>conda create virtual_env

CondaValueError: The target prefix is the base prefix. Aborting.
```
base環境を変更しようとしているからだめ

### 成功
```
>conda create --name moneyenv
conda acivate moneyenv
(moneyenv) C:\Users\mahiro sakurai\Desktop\py\家計簿管理アプリ>
```
環境変数の名前の重複は不可
/miniconda3/envsの中に作成して仮想環境が
すべて入ってる
「Web開発フルスタックコース（HTML＆CSS編）」を学べるおすすめ講義

こんにちは、韓国在住のSANAです！

Web開発を学びたいけど、どこから始めたらいいかわからない…。
そんな方にぴったりなのが、「Web開発フルスタックコース」のHTML & CSS編です！この講義シリーズでは、Web開発の基本となるHTMLとCSSをしっかり学ぶことができます。



主な学習内容
:writing_hand:HTMLの基本タグからスタートして、Webページを作成するために必要な基礎をしっかり身につけます。

:writing_hand:より柔軟で便利なWebページ作りができるようになります。

:writing_hand:SEOにも強いWebサイト作りが可能になります。

:writing_hand:レイアウト作成のためのCSSの使い方を習得し、レスポンシブWebデザインを実装して、どんなデバイスでも見やすいWebサイトを作れるようになります。


:star:開発環境とツール:star:
Visual Studio Code（VS Code）を使った実践的な開発方法を学びます。VS Codeの便利な拡張機能も紹介し、より効率的にコーディングができるようになります。

Node.jsをインストールして、JavaScriptの実行環境を整え、Web開発の幅が広がることを実感できます。


:star:実践的な学び:star:
単なる理論だけでなく、実際のWebサイトを作成するために、公共データOpen APIを使ってリアルなデータを表示する方法も学びます。これによって、より実践的なスキルを習得できます


こんな方におすすめ！
:seedling:HTMLを使って自分のWebサイトを作りたい方

:seedling:JavaScriptのDOM操作を理解し、Webサイトを動的にしたい方

:seedling:Open APIを活用して、リアルタイムなデータをWebサイトに表示させてみたい方

Web開発の基礎をしっかり学び、実際に自分のWebサイトを作るためのスキルが身につきます！
今回紹介する講義は全部無料で見れるので、始めたばかりの方でも安心して取り組める内容です！ぜひチャレンジしてみてください。

～おすすめ講義～
https://u.inf.run/428IAqd
https://u.inf.run/4j3PILh
https://u.inf.run/4hS724R
https://u.inf.run/3FF96jj
Qiita記事のリアクション数を自分と全体で比較するプログラム

# 概要
以前検討したQiitaのリアクション数の取得コードや分析のための指標をまとめました。
自分の投稿記事のリアクション数とQiita全体の比較を簡単にできるようにしました。

以前の記事
- https://qiita.com/shimajiroxyz/items/bc69473d88c7fad9cfac

# コード
以下で公開しています。
https://github.com/jiroshimaya/qiitareactioncounter

# 使い方
リポジトリにも記載していますが、uvがインストール済みであれば

- リポジトリのクローンして移動
- QIITA_TOKENを環境変数に登録
- uv run src/qiitareactioncounter/run_analysis.py

でリアクション数を取得し、分析結果を出力します。
オプション引数により、分析対象の記事の投稿期間やuseridを指定できます。
指定しない場合は、useridはトークンの認証ユーザ、期間はuseridの記事の最も古い投稿日から現在までとなります。

なお、リアクション数の取得と分析はそれぞれ別のコードになっており、個別に実行することも可能です。
コマンドはhelpを参照ください。

- uv run src/qiitareactioncounter/count_reactions.py -h
- uv run src/qiitareactioncounter/analyze_reactions.py -h


# 事例
試しに筆者（shimajiroxyz）の記事のリアクション数を分析してみます。

```sh
% uv run src/qiitareactioncounter/r
un_analysis.py 

認証ユーザーのIDを取得しました: shimajiroxyz

開始日をユーザーの最も古い投稿の日付に設定しました: 2020-02-23
全ユーザーのリアクション数を集計します...
Query: created:>=2020-02-23 created:<=2025-03-26
ランダムに選んだページ番号: [59, 89, 2, 35, 24, 94, 47, 69, 10, 7, 72]
ページ 59 から 100 件取得
ページ 89 から 100 件取得
ページ 2 から 100 件取得
ページ 35 から 100 件取得
ページ 24 から 100 件取得
ページ 94 から 100 件取得
ページ 47 から 100 件取得
ページ 69 から 100 件取得
ページ 10 から 100 件取得
ページ 7 から 100 件取得
results/all_users_reactions.csv を保存しました。
全ユーザーの集計結果を保存しました: results/all_users_reactions.csv

全ユーザーの集計結果を分析します...

=== results/all_users_reactions.csvの統計 ===
全記事数: 1000
中央値: 0.00
平均値: 5.61
上位10%の閾値: 4.00
上位10%の平均: 41.99
上位10%の中央値: 6.00
上位10%の記事数: 123

1以上リアクションがついた記事の割合: 42.20%

2以上リアクションがついた記事の割合: 23.10%

3以上リアクションがついた記事の割合: 15.70%

shimajiroxyzのリアクション数を集計します...
Query: created:>=2020-02-23 created:<=2025-03-26 user:shimajiroxyz
ランダムに選んだページ番号: [1, 2, 3]
ページ 1 から 100 件取得
ページ 2 から 100 件取得
ページ 3 から 8 件取得
results/shimajiroxyz_reactions.csv を保存しました。
shimajiroxyzの集計結果を保存しました: results/shimajiroxyz_reactions.csv

shimajiroxyzの集計結果を分析します...

=== results/shimajiroxyz_reactions.csvの統計 ===
全記事数: 208
中央値: 2.00
平均値: 6.28
上位10%の閾値: 15.00
上位10%の平均: 37.45
上位10%の中央値: 24.50
上位10%の記事数: 22

1以上リアクションがついた記事の割合: 66.35%

2以上リアクションがついた記事の割合: 50.96%

3以上リアクションがついた記事の割合: 40.87%
```

Qiita全体と指定したユーザーの記事についての指標がそれぞれ出力されます。
指標はどういったものが適切かはケースバイケースなのでとりあえず思いつくものを色々出力しています。
どの指標も基本的には多いほど優れていると考えてよいです。

例えば、中央値は全体が0、ユーザが2、平均値は全体が5.61、ユーザが6.28です。
1以上のリアクションがついた記事の割合だと全体が42%、ユーザが66%です。

その他どの指標でもユーザが大きいため、リアクション数という観点では、ユーザの記事はQiita全体よりも高品質だったことが示唆されます。

ちなみに前回の検討では直近半年に限定すると、筆者よりQiita全体のほうが高パフォーマンスでした。
リアクション数の指標はバズった記事があると伸びやすいです。
バズが起きるためにはある程度の試行回数が必要なため、ユーザを限定し期間も短いと、条件的に不利になってしまうのかもしれません。

# おわりに
QiitaのAPIを用いて、自分の投稿に対するリアクション数をQiita全体と簡単に比較できるCLIプログラムを作ってみました。
なにかの参考になれば幸いです。