OmniAICreator/Qiita-1.07M huggingface dataset:
猿でもわかるAIビジネス活用シリーズ 🐵📊 AIを社内教育に活かす！社員研修のスマート化とは？

 

## AIを社内教育に活かす！社員研修のスマート化とは？

---

### 1. はじめに：OJTやマニュアル研修、もう限界では？

現場で新しいメンバーが入ってくると、「あの資料どこにあったっけ？」「〇〇さんが詳しいけど今MTG中…」という状況、よくありませんか？

属人的なOJTや、検索しづらいマニュアルの山。
そして、繰り返し説明する側の負荷と、聞く側の遠慮。

こうした課題に対して、**AIを活用したスマート社員研修**というアプローチが、最近注目を集めています。

---

### 2. 技術の概要：AIチューター × ナレッジグラフ ＝ インタラクティブ研修

AIを使った社員教育の仕組みは、大きく分けて以下の2つを組み合わせることで構成されます：

#### 🧠 ① AIチューター（対話型LLM）

* 社員が自然言語で質問 → AIが回答
* 例：「SlackのBot設定ってどうやるの？」→ GPTが回答
* OpenAI APIやClaude、Gemini などで実現可能

#### 🗂️ ② 社内ナレッジの構造化（ナレッジグラフ or ベクトルDB）

* 社内のPDF・マニュアル・Confluence・Notionなどの情報をLLMに「読ませる」
* 文書を意味ベースで検索できるようにし、RAG構成で回答の裏付けを提供

これにより、**「受け身な研修」から「自発的な学び」を支援する仕組み**が実現できます。

---

### 3. 実装編：LangChain × OpenAI API で簡易AI研修Botを作る

ここでは最小構成として：

* ドキュメントをベクトル化
* RAG構成で回答
* Streamlitで簡易UI化

#### 3.1 ドキュメントの前処理と分割

```python
from langchain.text_splitter import RecursiveCharacterTextSplitter

with open("training_manual.txt", "r") as f:
    raw_text = f.read()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.create_documents([raw_text])
```

#### 3.2 ベクトル化と保存（FAISS使用）

```python
from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings

embedding = OpenAIEmbeddings()
db = FAISS.from_documents(docs, embedding)
db.save_local("faiss_index")
```

#### 3.3 質問→回答の流れを構築

```python
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(model_name="gpt-4", temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=db.as_retriever())

response = qa_chain.run("社内VPNの接続手順は？")
print(response)
```

#### 3.4 StreamlitでUI化（ローカルで試せる）

```python
# streamlit_app.py
import streamlit as st

st.title("社内AI研修Bot")
query = st.text_input("質問を入力してください")

if query:
    answer = qa_chain.run(query)
    st.write(answer)
```

```bash
streamlit run streamlit_app.py
```

---

### 4. 実務でのTIPSと落とし穴

#### ✅ 実務TIPS

* **実際のFAQから始める**：よくある質問からBotを学習させると、導入初期でも価値が出せる
* **情報はなるべくテキスト化する**：スライドや動画より、まずはテキストが扱いやすい
* **逐次的な改善**：回答の品質にフィードバックを加えて改善ループを回す

#### ⚠️ 落とし穴

* **ナレッジの更新忘れ**：マニュアル変更時にベクトルDBを再構築し忘れるケース多発
* **初期導入に時間がかかる**：資料整理や精査に想像以上の工数がかかる
* **全社導入の壁**：ITリテラシーが高い部署とそうでない部署で格差が出る

---

### 5. 応用編：個別カスタマイズ・スキルマップとの連携

以下のような拡張で、より高度な社内教育が可能です：

* **社員ごとの学習履歴に応じて出題内容を変える**
* **試験問題・模擬演習をAIが生成する**
* **スキルマップと連携して「次に学ぶべきこと」を提案する**

例えば、社員が「DevOps初級」を完了したら「IaC（Infrastructure as Code）」の演習問題を自動で生成する、といった仕組みも可能です。

---

### 6. まとめ：AIは「研修コスト削減ツール」ではなく「学習の伴走者」

| 観点   | メリット            | デメリット           |
| ---- | --------------- | --------------- |
| 教育効率 | 質問対応の時間を大幅削減    | 導入時に情報整理が必要     |
| 柔軟性  | 部署ごとに内容を最適化できる  | コンテンツ品質に依存      |
| 自発性  | 社員が「自分で学ぶ」文化を促進 | 全員が使いこなすには啓蒙が必要 |

社内教育を「面倒な作業」から「自発的な学びの体験」に変えるには、AIの活用が非常に効果的です。
特に、現場に即した情報をリアルタイムで得られる環境は、社員の成長スピードを格段に上げる可能性を秘めています。

---

### 📌 補足資料・参考リンク

* [LangChain公式ドキュメント](https://docs.langchain.com/)
* [OpenAI GPT API](https://platform.openai.com/)
* [FAISS（Facebook AI Similarity Search）](https://github.com/facebookresearch/faiss)
Windows11(WSL2)でAzure OpenAI Serviceを使ったCodex-CLIセットアップ

# はじめに
(巷ではCodexが流行っている最中ですが、単純に課金していないため、)
Azure OpenAI Serviceを使用して、Codex-CLIをセットアップする手順を説明します。
これにより、Windows11のWSL2環境でCodexを利用できるようになります。

# 前提条件
- Windows11がインストールされたPC
- WSL2が有効化されており、Node.js22以上がインストールされていること
- Azure OpenAI Serviceのリソースが作成されていること(今回はGPT-4.1で作成)

# 手順

1. Codex CLIのインストール
    ```bash
    npm i -g @openai/codex
    ```

2. Codex CLIのセットアップ
    1. ~/.codex/config.jsonの作成
        以下内容のファイルを~/.codex/config.jsonに作成します。
        - modelはAzure OpenAI Serviceで作成したdeployment名に置き換えてください。
        - providerはazureに設定してください。
        - baseURLはAzure OpenAI Serviceのエンドポイントに置き換えてください。
        
        ```json
        {
          "model": "gpt-4.1",
          "provider": "azure",
          "providers": {
            "azure": {
              "name": "AzureOpenAI",
              "baseURL": "https://YOUR_PROJECT_NAME.openai.azure.com/openai",
              "envKey": "AZURE_OPENAI_API_KEY"
            }
          },
          "history": {
            "maxSize": 1000,
            "saveHistory": true,
            "sensitivePatterns": []                                                                 
          }                                                                                         
        }                                                                                           
              
        ```

    2. .envファイルの作成
        作業フォルダに.envファイルを作成し、以下の内容を記述します。
        - Azure OpenAI ServiceのAPIキーを設定してください。
        - OPENAI_API_KEYもAzure OpenAI ServiceのAPIキーを設定します。
        - AZURE_OPENAI_API_VERSIONは、Azure OpenAI ServiceのAPIバージョンを指定します。
        
        ```env
        # .env
        OPENAI_API_KEY=xxx
        AZURE_OPENAI_API_KEY=xxx    
        AZURE_OPENAI_API_VERSION=api-version=2025-01-01-preview
        ```

    3. Codex CLIの動作確認
        ```bash
        codex --provider azure
        ```
        正常に動作する場合、以下のようなメッセージが表示されます。
        ```bash
        user
        Hi
        
        codex
        Hello! How can I assist you today?
        ```
        
        うまく動作しない場合は以下でcodexを起動し、デバッグ情報を確認してください。
        ```bash
        DEBUG=true codex --provider azure
        ```
        
        - 特にbaseURLがおかしいとAPI呼び出しのURLが変になります。
          - 正しいURLは以下のようになります。
        ```https://YOUR_PROJECT_NAME.openai.azure.com/openai/deployments/YOUR_DEPLOYMENT_NAME/chat/completions?api-version=2025-01-01-preview```

# 参考
- [Codex CLI GitHub](https://github.com/openai/codex)
- [Azure OpenAI Service](https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/)
Re:VIEWでPDFにフォントが埋め込まれていない時の対処

## 概要

デフォルトで生成される設定ファイルでは、Re:VIEWでPDFにフォントが埋め込まれていません。
PDFに日本語フォントが埋め込まれていないと印刷前のチェックでNGが出てしまいます。


## 対処

まずRe:VIEW用のカスタムスタイルファイルにて、pxchfonパッケージの使用を宣言します。

```
$ echo '\usepackage[ipa]{pxchfon}' >> sty/review-custom.sty
```


## 参考
https://gihyo.jp/admin/serial/01/ubuntu-recipe/0548#sec4_h2

https://github.com/kmuto/review/issues/329
Refineでコア機能部分で提供されているメッセージを日本語化する

Refineを使っていて、テンプレート部分を編集すれば画面のメインの部分は日本語化できますが、それではコア機能に近いところは日本語化できません。

例えばサイドバーの「Logout」ですとか、操作系の「Edit」や「Delete」などはテンプレートファイルには記載がなく、日本語化できません。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/03502e2e-d9e6-463e-9b36-c669dc6a7943.png)

これらのラベルを日本語化するにはi18nの仕組みを使う必要があります。

## i18n 化

これからRefineをインストールする場合には、下記のように `--i18n` オプションを付与してインストールします。

```bash
npm create refine-app@latest my-app --i18n
```

すでにインストール済みの場合には下記のようにすると必要なパッケージがインストールされます。

```bash
npm install react-i18next i18next i18next-browser-languagedetector i18next-http-backend
```

その上でi18nの初期化とi18nプロバイダを渡すようにします。


```typescript:src/i18n.ts
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import ja from "./locales/ja/common.json";

  .use(initReactI18next)
  .init({
    lng: "ja",
    fallbackLng: "ja",
    resources: { ja: { translation: ja } },
    detection: { /* ブラウザ言語検出オプション */ },
    backend: { /* JSON ファイル読み込みオプション */ },
  });

export default i18n;
```

```tsx:src/App.tsx
import "./i18n";
import { useTranslation } from "react-i18next";
import { Refine, I18nProvider } from "@refinedev/core";

const App: React.FC = () => {
  const { t, i18n } = useTranslation();
  const i18nProvider: I18nProvider = {
    translate: (key, params) => t(key, params),
    changeLocale: lang => i18n.changeLanguage(lang),
    getLocale: () => i18n.language,
  };

  return (
    <Refine
      /* …既存の dataProvider, authProvider など… */
      i18nProvider={i18nProvider}
    >
      {/* 既存のルーティング/レイアウト */}
    </Refine>
  );
};
```

実際の翻訳対応ファイルを作成します。
元ファイルは下記から拾ってきました。

https://github.com/refinedev/refine/blob/main/examples/i18n-react/public/locales/en/common.json

このファイルを元にAIに「日本語にして」といったファイルが下記になります。

https://gist.github.com/yousan/e1b475bc8cd4e535d21eb5bae21eefcc


これを `vite-app-ant/src/locales/ja/common.json` に置くと日本語化されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/24b342dd-ac70-4bb4-91ed-20435c1a702f.png)
「AIを『論理と計算』の眼で見る」──3回連続講義のご案内



生成AIが話題になる今、あえて「理論」からAIを考えてみませんか？

この講義シリーズは、ChatGPTなどのAIが本質的に何をしていて、何ができないのかを  
**論理学と計算理論の視点**からひもとく、知的好奇心のための連続講義です。

---

## 👤 こんな方におすすめ

- ChatGPTなどのAIに関心があるが、仕組みを根本から理解したい方  
- 数理的なアプローチからAIを考えてみたい方  
- 論理学や計算理論に興味があるが、いきなり専門書はハードルが高い方  

---

## 🧠 講座概要

- 講座名：**AIを『論理と計算』の眼で見る ─ 理論からひもとく3回講義シリーズ**  
- 主催：論計舎（https://ronkeisha.net）  
- 形式：Zoomによるオンライン講義（録画視聴あり）  
- 各回90分（＋質疑応答）・**全3回構成（各回独立／通し参加可）**  
- 講師：川井 新（論計舎主宰・在野研究者）

---

## 📅 各回テーマと日程

### 第1回：**Riceの定理 ─ AIにおける限界の源泉**  
🗓 2025年6月6日（金）19:30〜21:00  
AIは「すべてを判断できる」と思っていませんか？  
この回では、プログラムの「意味的性質」が理論的に判定できないことを示す**Riceの定理**を通して、AIの本質的な限界を考察します。

### 第2回：**SATソルバ ─ 限定された領域でのAI的勝利**  
🗓 2025年7月25日（金）19:30〜21:00  
理論的には難しい問題（NP完全）を、実用上は高速に解く──  
この矛盾を可能にするのがSATソルバです。  
AIにおける「論理アルゴリズム」の勝利を、**制約・最適化・検証の視点**から読み解きます。

### 第3回：**シンボリックAI×ディープラーニング融合：論理と直観の両輪**  
🗓 2025年9月5日（金）19:30〜21:00  
論理的推論と機械学習の融合に注目！  
LLM（大規模言語モデル）と論理ツール（SMT・形式検証）を比較・実演しながら、  
**AIの「思考する力」**の最前線を探ります。

---

## 💡 特別セット（コンサル付）

受講に加えて「講義で学んだことを深める個別相談」もセットにできます。  
- 通常：29,700円  
- セット価格：**24,200円（5,500円引）**

▶ 個別の疑問を整理したい方におすすめです。

---

## 💰 受講料と申込

| 参加形式   | 通常価格 | 早割価格（5/23まで） | 学生価格（※学籍確認要） |
|------------|----------|------------------------|---------------------------|
| 単発参加   | 3,300円  | 2,750円                | 2,200円                   |
| 通し参加   | 7,700円  | 6,600円                | 5,500円                   |

🔗 **申込フォーム**：  
[https://ronkeisha.net/events/202506ai/](https://ronkeisha.net/events/202506ai/)

---

## 🙋‍♀️ よくあるご質問

**Q：予備知識がなくても大丈夫ですか？**  
A：はい、一般教養レベルからご案内します。専門用語は丁寧に解説します。

**Q：録画視聴のみもできますか？**  
A：可能です。リアルタイム参加が難しい方もご安心ください。

---

## 🎙 講師プロフィール

**川井 新（かわい・しん）**  
論計舎主催。在野研究者として数理論理学・哲学的論理学・計算理論を中心に活動。  
RIMS共同研究にて発表経験多数。論理学友の会発起人。  
教育・研究両面において、論理の「知的対話」を重視する姿勢で知られる。

---

AIに「できること・できないこと」を、  
**感覚でなく理論で**捉えてみませんか？

ご参加を心よりお待ちしています。
【React】Zustand


## はじめに

こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。
現在、Udemy の講座「React に入門した人のためのもっと React が楽しくなるステップアップコース完全版」で React の学習を進めています。
上記講座では ContentAPI 以外に、Recoil ライブラリでグローバル state を管理できると紹介されていたのですが、よくよく調べると Recoil は 2025 年 1 月 1 日にソースコードが読み込み専用(おそらくこれ以上の開発はない?)になっていたため、自分で調べたところ Zustand というライブラリが useState みたいに使用できてはやっていると聞きました
本日は Zustand について記事を書いていきたいと思います

## Zustand の特徴

- **シンプルな API**

  - Redux や Recoil と比較して圧倒的にシンプルな記述で導入できます。
  - Provider や Context の設定が不要。

- **高パフォーマンス**

  - レンダリングの最適化が自動的に行われる。

- **Typescript 対応**

  - 型安全な記述が可能。

- **React 以外でも利用可能**

  - 状態のロジックは React に依存していないため、外部からも直接操作が可能。

---

## インストール方法

```bash
npm install zustand
```

または

```bash
yarn add zustand
```

---

## 基本的な使い方

1. **ストアの作成**

```tsx
import { create } from 'zustand';

// ストアの定義
type State = {
  count: number;
  increment: () => void;
};

export const useStore = create<State>((set) => ({
  count: 0,
  increment: () => set((state) => ({ count: state.count + 1 })),
}));
```

ここでの state は「Zustand のストアに格納されている“今この瞬間の値”」です。

例えば、ストアが { count: 3, increment: f } の状態だった場合、

- set((state) => ({ count: state.count + 1 })) が呼ばれると
- state には { count: 3, increment: f } がそのまま渡ります。
- その中の count を 1 つ増やしたオブジェクトを返しているイメージです。

2. **コンポーネントでの利用**

```tsx
import { useStore } from './store';

const Counter = () => {
  const count = useStore((state) => state.count);
  const increment = useStore((state) => state.increment);
  return (
    <div>
      <h1>{count}</h1>
      <button onClick={increment}>+1</button>
    </div>
  );
};
```

- それぞれ必要な state だけをセレクタ（関数）で取得しています。
- 例えば count が変わっても increment 関数自体は変わらないので、count だけで再レンダリングが起き、他の state は無視される。
- 大規模アプリやパフォーマンス重視の時は、必要な state だけ取得するのがベストプラクティスです。
- 無駄な再レンダリングを防げるので、効率が良い。

---

## 他の状態管理ライブラリとの比較

| ライブラリ | 特徴                               | 学習コスト | パフォーマンス | 規模           |
| :--------- | :--------------------------------- | :--------- | :------------- | :------------- |
| Redux      | 業界標準、エコシステム豊富         | 高         | 高             | 大規模向き     |
| Recoil     | アトミックな状態管理、依存関係管理 | 中         | 中             | 中規模〜大規模 |
| Zustand    | シンプル、軽量、柔軟               | 低         | 高             | 小〜中規模     |
| Jotai      | 最小限で直感的な API               | 低         | 高             | 小〜中規模     |

---

## メリット・デメリット

### メリット

- コード量が少なく、直感的に書ける
- Redux のようなボイラープレートが不要
- パフォーマンスが良い
- Context API や Provider が不要

### デメリット

- 巨大なアプリでは設計によって管理が煩雑になる場合がある
- 状態の変更を追跡したい（DevTools 等）場合、Redux に比べて若干弱い

---

## まとめ

Zustand は「小〜中規模のアプリ」や「とにかくシンプルにグローバルステートを管理したい」場合に最適なライブラリです。
公式ドキュメントも非常に分かりやすいので、まずは簡単なアプリで導入してみることをおすすめします。

---

## 参考リンク

https://github.com/pmndrs/zustand
コンビネータ論理：Extra practice 2.35(b)抽象化

[Lambda-Calculus and Combinators: An Introduction](https://amzn.to/4iYmQU3)
Hindley & Seldin より

# Extra practice 2.35(b)

### (i)
$[x].xu(xv)$
$\equiv S([x].xu)([x].xv)$
$\equiv S(S([x].x)([x].u))(S([x].x)([x].v))$
$\equiv S(SI(Ku))(SI(Kv))$

### (ii)
$[y].ux(uy)$
$\equiv S([y].ux)([y].uy)$
$S(K(ux))u$

### (iii)
$[x,y].ux(uy)$
$\equiv[x].([y].ux(uy))\equiv[x].S([y].ux)([y].uy)$
$\equiv S(K(ux))u$
Re:VIEWでEPUBを生成できない場合の対処

# Re:VIEWでEPUBを生成できない場合の対処

## 問題

Re:VIEWでEPUBを生成する際に、以下のエラーが発生していました：

```
ERROR   entity expansion has grown too large
```

これは、REXMLライブラリ（Rubyの標準XMLパーサー）のエンティティ展開テキスト制限に関する問題です。デフォルトでは、REXMLはXMLエンティティ展開攻撃を防ぐために、展開されるテキストのサイズに制限を設けています。しかし、大きなドキュメントを処理する場合、この制限が原因でエラーが発生することがあります。


## 参考

こちらのissueでこちらの問題が議論されていました。
https://github.com/kmuto/review/issues/1929

こちらのプルリクでrubyにentity_expansion_text_limitが導入され、Re:VIEWでエラーがでるようになりました。
https://github.com/ruby/rexml/pull/202




## 修正手順

1. プロジェクトのルートディレクトリ（articlesフォルダ）に`review-ext.rb`ファイルを作成します。

2. 以下の内容を`review-ext.rb`ファイルに記述します：

```ruby
#!/usr/bin/env ruby

# REXMLのエンティティ展開テキスト制限を設定
require 'rexml/document'
REXML::Security.entity_expansion_text_limit = 102400  # 10万に設定

puts "REXML entity expansion text limit set to #{REXML::Security.entity_expansion_text_limit}"
```

3. `rake epub`コマンドを実行して、EPUBを生成します。

## 解説

- Re:VIEWは`review-ext.rb`ファイルが存在する場合、ビルドプロセスで自動的にこのファイルを読み込みます。
- このファイルでREXMLのエンティティ展開テキスト制限を大きな値（10万）に設定することで、大きなドキュメントでも処理できるようになります。
- コンソール出力に「REXML entity expansion text limit set to 102400 」と表示されれば、設定が正しく適用されています。

## 注意点

- この修正は、XMLエンティティ展開攻撃に対する保護を弱めることになります。しかし、信頼できるコンテンツのみを処理する場合は問題ありません。
- 値を大きくしすぎると、メモリ使用量が増加する可能性があります。必要に応じて値を調整してください。
HTMLでよく使われるEmmetの書き方

## 1. ! → HTMLのひな型を展開
`!`
➡️ Tabを押すと基本的なHTML5テンプレが一瞬で展開されます。
```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```

## 2.タグ名.class名 → class付き要素
`div.container
`
➡️`<div class="container"></div>`

## 3.タグ名#id名 → id付き要素
`section#about`
➡️`<section id="about"></section>`

## 4.class名 → divタグの省略記法
`.box`
➡️`<div class="box"></div>`

## 5.`>` → 子要素を作る
`ul>li`
```
<ul>
  <li></li>
</ul>
```

## 6.+ → 兄弟要素を作る
`h1+p
`
```
<h1></h1>
<p></p>
```

## 7.*数字 → 繰り返し生成
`li*3
`
```
<li></li>
<li></li>
<li></li>
```

## 8.{テキスト} → 中身のテキストも一緒に書ける
`a{クリックしてね}
`
➡️ `<a href="">クリックしてね</a>`

## 9.組み合わせて最強に！
`ul.list>li.item*3{Item $}
`
```
<ul class="list">
  <li class="item">Item 1</li>
  <li class="item">Item 2</li>
  <li class="item">Item 3</li>
</ul>
```
猿でもわかるAIビジネス活用シリーズ 🐵📊 経営者が知っておくべきAIリスクとその対策

経営者が知っておくべきAIリスクとその対策 🧠⚠️【猿でもわかるAIビジネス活用シリーズ】

## 1. はじめに：AI活用の裏に潜む“見えないリスク”

AIはビジネスの現場に急速に浸透しています。業務の自動化、カスタマーサポートの効率化、需要予測など、さまざまな場面で「AI導入」が進んでいます。しかし、導入の波に乗る一方で、「リスクマネジメント」が軽視されているケースも少なくありません。

特に経営層は、\*\*「AIは魔法の杖ではない」\*\*という認識を持つことが重要です。本稿では、現場のエンジニア視点も交えながら、AI活用における代表的なリスクとその対策を解説していきます。

---

## 2. AI導入における主なリスクとその構造

AIに関するリスクは、単なる技術的課題にとどまらず、組織全体の意思決定や社会的信用にも影響を及ぼします。ここでは、実務で頻繁に遭遇する代表的なリスクを紹介します。

### リスク①：データバイアス（偏った学習）

#### 説明：

学習データが偏っていると、AIの予測結果も当然ながら偏ります。たとえば、過去の採用データに基づいたAIモデルが、特定の性別や学歴を優遇する可能性があります。

#### 実例：

ある大手企業が社内昇進推薦AIを導入したところ、「男性×理系出身」が優遇されていた過去データをもとに、女性社員の推薦率が著しく低下。

---

### リスク②：ブラックボックス化と説明責任

#### 説明：

AIモデル（特にディープラーニング）は内部の意思決定ロジックが不透明になりやすく、**なぜその判断になったのか**を説明しにくい。

#### 実例：

医療現場で画像診断AIが誤診。結果の根拠がわからず、現場での信頼が大きく低下した。

---

### リスク③：運用段階でのデータドリフト

#### 説明：

学習時と本番運用時でデータの性質が異なると、精度が低下する「データドリフト」が発生。特に長期運用で無視されがち。

#### 実例：

小売業で導入した需要予測AIが、コロナ禍で顧客行動が変化したことで精度が一気に低下。発注ミスが続出。

---

## 3. リスク回避のための実践的アプローチ（コード付き）

以下は、**Python + scikit-learn** を使った簡単な「バイアス検出」の実装例です。

### ▶️ ケース：採用AIモデルにおける性別バイアスの検出

```python
import pandas as pd
from sklearn.metrics import classification_report
from sklearn.linear_model import LogisticRegression

# サンプルデータ（性別と合否）
data = pd.DataFrame({
    'gender': [0, 1, 0, 1, 0, 1],  # 0: 女性, 1: 男性
    'score': [85, 90, 78, 88, 92, 95],
    'hired': [1, 1, 0, 1, 1, 1]
})

# 学習
X = data[['gender', 'score']]
y = data['hired']
model = LogisticRegression().fit(X, y)

# 性別ごとの予測結果
data['pred'] = model.predict(X)
print(data.groupby('gender')['pred'].mean())  # 男女で大きく差があればバイアスの可能性大
```

### ✅ ポイント：

* 性別などの「センシティブ属性」は意識的に除外・監視する
* 単に精度を見るだけでなく、「公平性」や「再現性」を確認する

---

## 4. よくある落とし穴と現場でのTips

| 誤解 or 落とし穴    | 現場のTips                       |
| ------------- | ----------------------------- |
| モデル精度さえ高ければOK | 「なぜその精度なのか」「説明可能か」を重視すべき      |
| データが多ければ勝てる   | 質の低いデータはむしろリスク。前処理・検証が重要      |
| 運用後は放置してOK    | モデルの「健康診断（monitoring）」を定期的に行う |

---

## 5. 発展的な活用：Explainable AI（XAI）の導入

AIの意思決定を「見える化」するXAI（Explainable AI）は、リスク回避の強力な武器になります。以下は、**SHAP（SHapley Additive exPlanations）** を使ってモデルの出力を可視化する例です。

```python
import shap

explainer = shap.Explainer(model, X)
shap_values = explainer(X)
shap.plots.waterfall(shap_values[0])  # 最初の予測の要因を視覚化
```

✅ 経営層にも「この予測はなぜこうなったのか」を説明しやすくなる
✅ トラブル時の原因追跡や社内説得にも有効

---

## 6. まとめ：AI活用は“攻め”と“守り”のバランスが命

| 項目    | メリット      | リスク       | 対策            |
| ----- | --------- | --------- | ------------- |
| AI導入  | 生産性・効率UP  | 信頼低下・バイアス | XAI導入・データ監視   |
| 自動化   | 人手削減・高速処理 | 判断根拠不明    | ロジック開示・説明性    |
| 学習データ | パターン抽出    | 社会的偏見反映   | 精査・サンプリングバランス |

---

## 🚀 今後の展望

* ガバナンスを意識した「AI倫理チーム」の組成
* コンプライアンスとAIの整合性確保
* LLMや生成AI時代における**AIの透明性の再定義**

AIは確かに強力な武器です。しかし、「正しく恐れ、正しく使う」ことで初めてビジネスに資する存在となります。
 

## 🔗 関連リンク

* [SHAP公式ドキュメント](https://shap.readthedocs.io/)
* [scikit-learn fairness module（今後追加予定）](https://scikit-learn.org/)
* [猿でもわかるAIシリーズ過去記事一覧](#)
無料で使えるAIカバーアプリ・サイト・API活用ガイド【AIに歌わせる時代】

AIによる音声合成・ボーカルカバー技術の進化により、「憧れの声で歌わせる」ことが身近なものとなりました。
本記事では、無料で使えるAIカバーアプリ・サイト・APIサービスを紹介しつつ、開発者や音楽クリエイターにとって有益な知識を整理します。

## そもそもAIカバーとは？
AIカバーとは、人工知能が既存の楽曲の音声を解析し、別のボーカル（例：アーティスト、アニメキャラ、VTuberなど）の声で再合成する技術です。歌声のトーン、リズム、ピッチを模倣し、驚くほど自然な合成音を生成します。

## 実際に使える！無料AIカバーアプリ・サイト紹介
**1. TopMediai AIカバー【Web】**
概要：誰でも簡単にAIでカバー曲を生成できるWebベースのサービス。無料枠あり。

機能：
100種類以上のAI音声モデル（男性・女性・VTuber風など）
音声アップロード／YouTube音源から自動生成
音質調整・キー変更・テンポ調整機能
著作権確認機能あり

おすすめポイント：
アカウント登録だけで無料トライアル可能
商用利用にはプレミアムプランあり
音声出力形式：MP3, WAV

使い方（概要）：
① AI音声モデルを選ぶ  
② カバーしたい曲の音声をアップロード  
③ オプション設定（キー変更など）  
④ 「生成」ボタンを押すだけで、数分で完成  

公式サイト：[TopMediai AIカバー](https://jp.topmediai.com/ai-song-cover/)


**2. MagicMic【Windows / Mac / モバイルアプリ】**
概要：リアルタイムで音声を他のボイスに変換可能なボイスチェンジャー。AIカバー用途にも応用可能。

特徴：
配信・録音対応のリアルタイム音声変換
エフェクト・プリセット豊富
無料体験あり（有料機能あり）

ユースケース：
ゲーム実況・VTuber配信
Discord / Zoom などの会話系アプリ

公式サイト：https://jp.imyfone.com/voice-changer/

**3. Musicfy【Web】**
概要：Musicfyは、AIを活用して数秒でお気に入りの曲をカバーできるツールです。Ariana Grande、Eminem、Drakeなどの人気アーティストの曲がライブラリにあり、独自のAI機能を使用して簡単にミックスやカバーができます。

主な特徴:
人気アーティストのヒット曲がラインナップ
AIが自然なボーカルでカバー音源を生成
ユーザーがプレイリストを作成し、音楽をカスタマイズ可能

公式サイト：https://create.musicfy.lol/

##   開発者向け：AIカバーAPIサービス（TopMediai API）
TopMediaiは、音声合成機能をプログラムから利用可能なAPIも提供しています。

**TopMediai　AIカバーAPIサービス：**
https://jp.topmediai.com/api/ai-song-cover-api/

主な仕様（例）：
**エンドポイント例（※架空）：**
bash
POST https://api.topmediai.com/v1/ai-cover

**パラメータ例（JSON）：**
json
{
  "voice_model": "Hatsune_Miku",
  "audio_url": "https://example.com/input.mp3",
  "pitch_shift": -2,
  "output_format": "wav"
}

**レスポンス例：**
json
{
  "status": "success",
  "output_url": "https://cdn.topmediai.com/output/ai_cover123.wav"
}

**活用例：**
音楽アプリへのAIボーカル導入
SNS連携型カバー生成ボット
教育・言語学習コンテンツ制作
※API利用には事前申請が必要です。利用条件・商用ライセンスは公式APIページを参照。

**利用時の著作権と注意点**
AIで楽曲をカバーする場合、以下の2点に注意が必要です：

1.元の楽曲の著作権
　→ JASRAC等での確認が必要な場合があります

2.声モデルの権利（肖像権・パブリシティ権）
　→ 特定の声優・歌手の声を模倣する場合は注意が必要

TopMediaiなど一部のサービスでは、利用ガイドラインや非営利利用可否を明記しています。必ず確認してから活用してください。

##  まとめ：AIカバーの活用はここから始めよう！
サービス名	特徴	無料枠	API対応	推奨用途
TopMediai	音質・UIともに高品質。日本語にも強い	◎	◎	音楽制作、開発統合、教育など
MagicMic	リアルタイム変声が魅力	△	✕	配信、通話、遊び用途
Musicfy	海外アーティスト風の曲が簡単生成	△	△（予定）	ファン活動、個人制作

🔗 **参考リンク**
https://jp.topmediai.com/ai-song-cover/
https://jp.topmediai.com/ai-cover/ai-cover-application/
https://jp.imyfone.com/voice-changing/ai-song-cover/

##  最後に
AIカバーは遊び用途からプロの音楽制作まで応用範囲が広がっています。
Qiita読者の中でも、プログラミングと音声処理を組み合わせたプロジェクトを考えている方には、API連携のあるツールから試してみるのがおすすめです。
画像・動画・音声... 生成AIサービスが１つにまとまらないのはなぜ？

# はじめに
普段から chatGPTなど生成AIは使わせていただいていますが、
いつも思います。

「生成AI系サービス多すぎてキャッチアップ追いつかなさすぎ！」

ここでは概念の理解で深掘りはしていませんが、なぜ１つのサービスでまとまって
いろんなものを生成できないのかを軽くまとめます。

# 生成AIの違いについて
生成AIでできることはたくさんあります。

- 言語生成
- コード生成
- 画像生成
- 音声生成
- 動画生成
- 3Dモデル生成
...

なぜこれらがそれぞれ違うサービスになるかというと、
単なる「出力の違い」だけでなく、**学習するデータの性質やモデルの設計も根本的に異なるから**です。

## できることの違いが生まれる理由

1. 入力データ・生成対象の構造が根本的に違う
-> 何を生成するかによって**前処理や特徴量抽出、学習時の表現方法がまったく異なります**。


2. モデルアーキテクチャの最適化が違う
-> モデル設計は、目的に合わせた最適解を追求しているため、**ひとつのモデルに全部詰め込むのはかなり難しく非効率**であるのが現状です。

3. 計算コストとリソースの問題
-> 全てのモダリティを高性能で処理できる巨大な統合モデルを作るには、**莫大な計算資源**が必要です。  

## サービスによって最新情報に違いがあるのは？
### モデルは一度学習された「静的な知識」を持つ

多くの生成AIはこのように作られています：

1. 大量のテキストや画像を収集  
2. 数週間〜数ヶ月かけてモデルを学習（Pretraining）  
3. 学習済みモデルをAPIやUIとして提供  

つまり、「2024年10月時点までの情報を学習したモデル」は、  
その後のこと（2025年のニュースや法改正）は**一切知らない**のです。  
これを**カットオフ**と呼びます。

サービスやモデルによって、このカットオフの時期が違うため、最新情報に違いが出てくるわけです。


### なぜ毎日学習させないの？
これはシンプルに **学習に膨大な計算資源が必要** だからだと思います。
上述したように、学習するためには(長い)時間やコストをかけて情報を収集する必要があるため、随時読み込ませたりサービスを更新し続けるには限度があります。

#### 外部データを使って補う方法がある

- **RAG（Retrieval-Augmented Generation）**：  
　→ 外部検索の結果をAIに渡して答えさせる手法  
- **MCP（Model-Context Prompting）**：  
　→ 最新のPDF、表、CSVなどをプロンプトに渡して活用する設計

これらを使えば、モデルが知らない情報でも「今知っているふうに」使わせることが可能になります。


# 最後に
今回の内容を調べるだけでも知らない用語がたくさんあり、脳みそが追いついていかないですね...
LLM, RAG, MCP 等々、まだまだ深ぼって調べることがたくさんあるため、別途記事にしたいと思います。

また、筆者もまだまだ入門者ですので、
「こういうこと学んだこといいよ」
「自分も学び始めだけど、こういうこと知りたい」
とかあればぜひ教えてください〜！

また、株式会社シンシアでは、実務未経験のエンジニアの方や学生エンジニアインターンを採用し一緒に働いています。
※ シンシアにおける働き方の様子はこちら

https://www.wantedly.com/companies/xincere-inc/stories

弊社には年間100人以上の実務未経験の方に応募いただき、技術面接を実施しております。
この記事が少しでも学びになったという方は、ぜひ wantedly のストーリーもご覧いただけるととても嬉しいです！
IT業界未経験で訓練校で学んでいる途中に Java Silver SE17 を受験してみた結果・・・

初めまして、IT業界未経験からプログラマーになりたくて転職を決意し、現在職業訓練校に通っています。訓練期間は半年間で、間も無く卒業ということで就活を始めたのですが、中々、書類選考にも受からないということで資格を取得しようと思い受験することを決心しました。

取得している資格は、ITパスポート試験のみで一時期、基本情報技術者試験の勉強もしていたのですが、訓練校に入校を決めてから、YouTubeでJavaの勉強を始めたので資格勉強は一時中断していました。

実際訓練校に通い始めて初めてプログラムを学び始めてから実際に自分の書いたコードが動いたりすることにすごく楽しさを覚え、学校以外でもJavaの勉強をしていました。主に教科書とeclipseを使用してのコードを書いたりしてました。
Java Silver SE17を受けようと思い、黒本を購入し１月半ほど勉強しました。自分では内容を理解しているつもりで、テキストの過去問も8.5割は常に取れる様になったので受験しようと申し込みました。

結果は65%（60問中39問）で合格のところを55%（33問）で落ちてしまいました。
60問の内、何問かは配点に含まれない問題もあるみたいなので実際、何問正解したかはわかりません。途中、お腹が痛くなりトイレに行かせてもらったので少し時間が足りなくなったため、５問ほどは空白のままとなってしまいました。
今回のSE17からは、それまでの問題数より20問少なくなっているみたいなのですが、時間が半分（180分 → 90分）なので、一問あたり1分半で解かないといけないので、あまり1問に割ける時間もありません。過去問を受けている際は、何度も反復したこともあり、だいたい１時間くらいで終わっていたのですが、初めて受ける問題ばかりということと、一つ一つの変数名も長く問題を理解するのにもかなり時間を要してしまいました。（英語が全然できないのでなおさら・・・）
試験を受けている際にも画面右上に時間がでているので意識はしていたのですが・・・。

今回受験するにあたって、Oracle公式の再受験無料キャンペーンを使用していたので、もう一度受けることはできますが、普段できて理解できていると思っていたところも間違ったりしていたので、もう一度最初から勉強しようと思いました。本屋さんで紫本を立ち読みしたのですが、自分的には紫本の方に近い問題の出した方だと思いました。（よくサイトなどでは黒本をオススメされていますが・・）

QiitaもGitHubも始めたばかりでまだまだわからないことが多いですので、何かご指摘アドバイス等ありましたら、気軽に教えていただくと嬉しいです。
今後も投稿していってみようと思いますのでよろしくお願いします。
初めてのRailsアプリ作成手順まとめ

🔧 1. 必要なものをインストールしよう
まずはアプリを作る前に、準備が必要です。

✔ インストールしておくべきもの
Ruby（3.x 以上がおすすめ）

Rails（gem install rails）

Node.js（JavaScriptを動かすため）

Yarn（CSS・JSライブラリ管理）

PostgreSQL（データベース）

Git（コード管理）

# 例：Rails をインストール
```
gem install rails
```
🏗️ 2. 新しいアプリを作ろう
ターミナルで作りたい場所に移動して、アプリを作成します。
```
rails new my_app_name -d postgresql
cd my_app_name
```
ポイント：

-d postgresql は「PostgreSQLを使うよ」という意味

my_app_name は好きなアプリ名に変えてOK



🔃 3. データベースを作成
アプリの中に入ったら、データベースを作成します。

```
bin/rails db:create
```
成功すればOKです！

🏃 4. サーバーを立ち上げてみよう
実際にアプリを起動して、ブラウザで見てみましょう！

```
bin/dev
または
rails server
```

📁 5. Gitで管理しよう（おすすめ）
コードをしっかり管理しておくために Git を使います。

git init
git add .
git commit -m "初期コミット"



✨ まとめ
手順	内容
①	必要なものをインストール
②	rails new で新規アプリ作成
③	db:create でデータベース準備
④	rails server で起動して確認
⑤	Gitでバージョン管理も忘れずに！
Pythonのプロジェクトのフォルダ構造

Pythonのプロジェクトを開発する際に推奨される標準的なフォルダ構造を紹介します。

以下は、一般的なPythonプロジェクトの構成です：

```
project-name/
│
├── README.md                # プロジェクト概要、使い方、環境構築方法
├── LICENSE                  # ライセンスファイル
├── .gitignore               # Gitで無視するファイルを指定
├── requirements.txt         # 必要なPythonパッケージのリスト
├── setup.py                 # パッケージ化するためのセットアップファイル
├── pyproject.toml           # 現代的なビルド設定・依存関係管理（任意）
│
├── src/                     # ソースコードを格納するフォルダ
│   └── your_package/
│       ├── __init__.py      # パッケージ化のための初期化ファイル
│       ├── main.py          # アプリケーションのメイン処理
│       ├── module1.py       # 各種モジュール
│       └── module2.py
│
├── tests/                   # ユニットテストを格納するフォルダ
│   ├── __init__.py
│   ├── test_module1.py
│   └── test_module2.py
│
├── docs/                    # ドキュメントを保存（任意）
│   ├── usage.md
│   └── api_reference.md
│
├── examples/                # 使用例やサンプルスクリプト（任意）
│   └── demo.py
│
└── data/                    # データファイルや外部リソースを保存（任意）
    └── sample_data.csv
```

---

## 各フォルダ・ファイルの詳細な説明

### ① 基本ファイル

* `README.md`

  * プロジェクト概要、導入方法、使い方、開発環境設定方法を記載。

* `LICENSE`

  * ソフトウェアのライセンス情報。

* `.gitignore`

  * Git管理対象外のファイルを指定（キャッシュファイルやログ、設定ファイル等）。

### ② Python依存関係の管理

* `requirements.txt`

  * プロジェクトに必要なPythonパッケージをリストアップ。

  ```plaintext
  numpy==1.26.3
  torch==2.3.0
  opencv-python==4.11.0
  ```

* `setup.py`

  * パッケージとして公開したり、他のプロジェクトで再利用したりする際に利用。

  ```python
  from setuptools import setup, find_packages

  setup(
      name="your_package",
      version="0.1.0",
      packages=find_packages(where="src"),
      package_dir={"": "src"},
      install_requires=[
          "numpy",
          "torch",
          "opencv-python"
      ],
  )
  ```

* `pyproject.toml`

  * モダンな依存関係管理に使用する場合（PoetryやPDM等）。

### ③ ソースコードフォルダ (`src/`)

* Pythonのソースコードを格納。
* プロジェクトが大きくなっても整理しやすいようにパッケージ形式を採用。
* `__init__.py` は空でもよく、Pythonがフォルダをパッケージとして認識するために使用。

```python
# src/your_package/module1.py
def foo():
    pass
```

```python
# 利用時
from your_package.module1 import foo
```

### ④ テストコード (`tests/`)

* `pytest` などを使ってユニットテストを行う。
* 実際のソースコードと分けることで、コードの明確化やテスト管理を容易にする。

```python
# tests/test_module1.py
from your_package.module1 import foo

def test_foo():
    assert foo() is None
```

### ⑤ ドキュメント (`docs/`)

* Markdownなどでプロジェクトの詳細なドキュメントを作成。
* 将来的にSphinxなどを使ったAPIドキュメント化も可能。

### ⑥ サンプル・実行例 (`examples/`)

* 実際のコードの使い方を示すためのサンプルコード。

```python
# examples/demo.py
from your_package.module1 import foo

print(foo())
```

### ⑦ データフォルダ (`data/`)

* CSVやJSONファイル、画像データ等を格納。
* 特にデータ分析や機械学習系プロジェクトでよく利用される。

---

##  推奨ベストプラクティス

* ソースコードは必ず `src/` フォルダ内にまとめる。
* テストコードを充実させる。
* 依存関係を `requirements.txt` または `pyproject.toml` に明確に記載する。
* プロジェクト直下には、主要なファイルや設定ファイルのみを置き、整理する。

---

##  この構造のメリット

* 他人や未来の自分が理解しやすい。
* 再利用やメンテナンスが容易。
* GitHub等での公開やパッケージ化も簡単。

---

このような構成を参考にしてプロジェクトを進めると、管理性が向上し、可読性・再利用性の高いプロジェクトになります。

## 参考資料

https://www.jetbrains.com/help/pycharm/configuring-project-structure.html#mark-dir-settings
Vue 3 の ref と computed の違いについて

ref と computed の違いってけっこう混乱しやすいポイントだと思います。どっちも「リアクティブ（反応的）」って書いてあるし、見た目も似てるし、どう使い分ければいいの？って思いました。

## ref は「変えられる値」
ref は、基本的に「自分で値をセットするもの」です。
たとえば、カウントアップするような数値や、ユーザーが入力した値を保持するような場面で使います。

```
const count = ref(0)

function increment() {
  count.value++
}
```

テンプレートで使うときは、.value をつけずにそのまま使えます。
```
<p>{{ count }}</p>
```
このように、ref は .value を使って中の値を読んだり、書き換えたりします。リアクティブなので、count.value が変わると、それを使っているテンプレートも自動で更新されます。

## computed は「自動で計算してくれる関数」
一方で、computed は、自分では値を変えません。
代わりに、「他の値が変わったら、自動で再計算してくれる」便利な関数です。

```
const firstName = ref('マチス')
const lastName = ref('太郎')

const fullName = computed(() => {
  return `${lastName.value} ${firstName.value}`
})
```

この場合、fullName は lastName や firstName が変わったときだけ、自動で再計算されます。そしてその値をテンプレートなどで使えます。
**「他の値から計算される値」** 、**「読み取り専用」**  というのがポイントです

## 結論
どっちを使えばいいの？

- 自分で値を更新したい → ref

- ある値に基づいて計算された値が欲しい → computed

たとえば :
- フォームの入力内容を保存したい → ref
- 入力された名前をもとにフルネームを表示したい → computed
15分で完成！Flutter × Supabase 認証UIキットを公開しました（AuthX Kit）

# Flutter × Supabase で15分！メール認証UIキットを作ってみた（AuthX Kit）

FlutterでMVPを作るときに「認証UI」って毎回手間じゃないですか？

- Supabase使いたいけど、画面はゼロから組まないといけない…
- go_router / Riverpod構成で統一したいけど意外とめんどい…
- ダークモードやテーマ切り替えもあと回しにしがち…

そんな方に向けて、「AuthX Kit」を作りました。

---

## ✨ AuthX Kitとは？

メールアドレスとパスワードでログインするための**4画面UIキット**です。  
Supabase専用に設計しており、**3ステップで導入可能**。  
ダークモードやMaterial3にも対応済みです。

---

## 🔧 構成技術

- Flutter 3.x
- Supabase Auth
- Riverpod 3
- go_router 14
- Material3（`colorSchemeSeed` 対応）

---

## 🎥 動作デモ（GIF）

![demo](https://domin-assets.web.app/demo_signup_login.gif)

---

## 🖼️ UIイメージ（ダーク・ライト対応）

| ダークモード | ライトモード |
|--------------|--------------|
| ![dark](https://domin-assets.web.app/screenshot_dark.png) | ![light](https://domin-assets.web.app/screenshot_light.png) |

---

## 📦 含まれる画面

- Sign-In（ログイン）
- Sign-Up（新規登録）
- Forgot Password（パスワードリセットメール送信）
- Profile（プロフィール確認＋ログアウト）

---

## 🛠️ 導入方法（3ステップ）

```bash
# 1. 必要なパッケージを追加
flutter pub add go_router flutter_riverpod supabase_flutter

# 2. lib/auth_ui をプロジェクトにコピー

# 3. dart-define で Supabase URL / Key を指定して起動
flutter run \
  --dart-define=SUPABASE_URL=https://xxxxx.supabase.co \
  --dart-define=SUPABASE_ANON_KEY=xxxxxxxxxxxxxxx
```

## 🛒 入手先（Gumroad）
商品ページ: https://otasukedomino.gumroad.com/l/rmofmg

クーポンコード：LAUNCH20（先着10名限定・20%オフ）
GIT チェックアウトブランチの入力がめんどくさいので

## naze

複数に開発しているときに
ブランチどこにいるのか
またプルリクとか確認のたびにブランチを切り替えるのがめんどくさかった
（GUI的に切り替えるやつ使えばよかったかも）
ので少しでも楽にしたい

## らくにしたやつ

以下コードを~/.bashrcに追記
```
vi ~/.bashrc
```

bashrcに追記する内容
```
# ブランチ名表示やつ
if [ $UID -eq 0 ]; then
    PS1='\[\033[31m\]\u@\h\[\033[00m\]:\[\033[01m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\\$ '
else
    PS1='\[\033[36m\]\u@\h\[\033[00m\]:\[\033[01m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\\$ '
fi

# ブランチ簡単チェックアウトしたいなやつ
gitco() {
  local branches branch index
  branches=($(git branch --sort=-committerdate | sed 's/^\*//' | sed 's/^ //'))
  for i in "${!branches[@]}"; do
    printf "%2d: %s\n" "$i" "${branches[$i]}"
  done

  if [ -n "$1" ]; then
    index="$1"
    branch="${branches[$index]}"
    if [ -n "$branch" ]; then
      git checkout "$branch"
    else
      echo "Invalid index: $index"
    fi
  fi
}

```

bashrc再読み込み
ログインログアウトでも可
```
source ~/.bashrc
```

一覧表示
```
(main)$ gitco

 0: main
 1: feature/branchA
 2: feaarui/branchB
 3: branchC#2234
 4: branchD/kozin
 5: branchE/kojin
```

コマンド+IDでブランチへスイッチ
```
(main)$ gitco 3

Switched to branch 'branchC#2234'
Your branch is behind 'origin/main' by 10 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

(branchC#2234)$ 
```

まとめ
```
gitco        # 番号付きで一覧表示
gitco 1      # インデックス番号でチェックアウト
```
AWS認定8冠達成！ここまでの学びをふりかえる（2025年5月）

## はじめに
- 2025年5月、AWS認定を8個取得することが出来たのでふりかえってみる 
- 2023年ゆっくりとしたスタートだった
- とりあえず受けてみようという軽い考えでCLFを受験
- AWS認定試験が何個あるとか、全部取得したいと考えてもいなかった
- 途中不合格を経験し、一時的に手から離れた時期もあった
- 2025年に入り一気に加速
- 加速した理由は、
    - AWSコミュニティのイベントに参加したこと
    - Xをはじめたこと(今ごろ‥‥というのは置いといて)
- 残り4つの試験の山はかなり大きいと感じているので、その前に整理の意味でふりかえってみた


## 資格一覧
- 約1年半のブランク明けのSOAで不合格
- それ以外は一発で合格

| No. | 資格名                                      | レベル         | 資格コード | 受験日     | 点数  | 結果  |
|-----|--------------------------------------------|----------------|------------|------------|-------|-------|
| 1   | AWS Certified Cloud Practitioner            | FOUNDATIONAL   | CLF-C01    | 2023-02-04 | 838   | ✅合格  |
| 2   | AWS Certified Solutions Architect - Associate | ASSOCIATE    | SAA-C03    | 2023-06-14 | 736   | ✅合格  |
| 3   | AWS Certified SysOps Administrator - Associate | ASSOCIATE    | SOA-C02    | 2024-11-02 | 695   | ❌不合格 |
| 4   | AWS Certified SysOps Administrator - Associate | ASSOCIATE    | SOA-C02    | 2025-01-28 | 723   | ✅合格  |  
| 5   | AWS Certified Developer - Associate          | ASSOCIATE      | DVA-C02    | 2025-02-22 | 798   | ✅合格  |    
| 6   | AWS Certified AI Practitioner                 | FOUNDATIONAL   | AIF-C01    | 2025-03-15 | 863   | ✅合格  |    
| 7   | AWS Certified Machine Learning Engineer - Associate | ASSOCIATE | MLA-C01    | 2025-04-01 | 901   | ✅合格  |    
| 8   | AWS Certified Machine Learning - Specialty    | SPECIALTY      | MLS-C01    | 2025-04-26 | 792   | ✅合格  |   
| 9   | AWS Certified Data Engineer - Associate       | ASSOCIATE      | DEA-C01    | 2025-05-17 | 730   | ✅合格  |


## 8個取得までの道のり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045441/bdec6a1a-4c46-4dee-9624-a0bae97b8e67.png)

## 勉強方法
- 最初は書籍、Udemyとアレコレ購入したが、途中からCloudtechメインで学習に取り組んだ

## 勉強時間確保のコツ
- **2024年まで**：
    - 自宅に帰り食事をするとダラダラして、そのまま就寝。学習時間確保はたまに気が向いたときのみ
- **2025年から**：
    - 帰宅後食事をしたら、必ず机に向かう、パソコンに向かう、書籍に向かう、Xを見るだけでもいいといった習慣をつけた
    - ただ、集中することが出来なかったので問題10題解いて、動画見て、問題10問解いて、本読んでといった事を繰り返した。ポモドーロ勉強法や15分勉強法と言われているらしい

## 2025年からのモチベーションの維持
- Xを常に見る
⇒ 試験結果を投稿している人を見てモチベーション上げる
- Xに投稿する
⇒自分も投稿して、相互で刺激しあう
- AWSコミュニティのイベントに参加する
⇒最新情報についていく意識を持った
    
## AWS認定取得を通して得られたこと
- 何と言ってもAWSコミュニティで頑張っている方に出会えたこと
- 共に学び、勇気づけ、方向性を示してくれる、といった方に出会えたことは財産と思う
- そして、自分がこうやってアウトプットしているという事

## 今後の意気込み
- 残りProfessionalｘ２，Specialityｘ２となった
- まずはSAPを次のターゲットとして、この流れを止めずに受験する

## これからAWS認定を目指す方へ

::: note
①試験の順番はとても大事！
:::
- 私が受験した順番は以下
    - 初めに、CLF,SAAで基礎固めをして
    - SOA,DVAにて、AWSサービスを深く理解
    - AIF,MLA,MLS,DEAにて、AI/ML関連に特化　**←特にこの4つはセットで考えて流れで受験をした**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045441/2c6a2d5b-6977-4736-949e-87d7f1b045a3.png)



::: note
②Web問題集に頼り過ぎないこと！    
:::      
- SOAは暗記に頼って不合格の経験をした。これを教訓にハンズオン実践   
- 初見の問題でもサービスの特性から判断できるよう深い理解
- その為に生成AIを効率的に、徹底的に活用

## さいごに
- 残り4つ取得し、『12冠のふりかえり』を書く！という決意をして、投稿を終了します
- 最後まで読んでいただきありがとうございました
BME280 温度・湿度・気圧センサーの環境構築と実行


---

# BME280 温度・湿度・気圧センサーの環境構築と実行

## 概要
**BME280**は、温度・湿度・気圧の3つを計測できるセンサーで、**I2C通信**によりRaspberry Piなどと接続できます。

---

## 必要なもの

- BME280 センサーモジュール（I2C対応）
- Raspberry Pi（または互換マイコン）
- ジャンパーワイヤー
- ブレッドボード（任意）

---

## 配線（I2C接続）

| BME280 | Raspberry Pi |
|--------|--------------|
| VCC    | 3.3V (Pin 1) |
| GND    | GND (Pin 6)  |
| SDA    | SDA (Pin 3)  |
| SCL    | SCL (Pin 5)  |

> **注意**: BME280 は通常 3.3V 動作です。5V に接続しないよう注意してください。

---

## I2C の有効化と確認

### 1. I2C を有効にする

```bash
sudo raspi-config
# → [5 Interfacing Options] → [P5 I2C] → Enable
```

2. I2Cツールのインストール

```
sudo apt update
sudo apt install -y i2c-tools python3-smbus
```

3. 接続確認

```
i2cdetect -y 1
```
> 結果に 0x76 や 0x77 が表示されれば正常に認識されています。




---

Pythonでの読み取り

1. ライブラリのインストール
```
pip3 install adafruit-circuitpython-bme280
```
2. サンプルコード（Python）
```
import board
import busio
import adafruit_bme280

# I2C通信の初期化
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c)

# 計測結果を表示
print(f"Temperature: {bme280.temperature:.2f} °C")
print(f"Humidity: {bme280.humidity:.2f} %")
print(f"Pressure: {bme280.pressure:.2f} hPa")
```

---

よくあるエラーと対策

エラー内容	原因と対策

i2cdetect に何も表示されない	配線ミス、I2Cが無効、電源不足などを確認
ModuleNotFoundError	ライブラリのインストールができていない。再度 pip3 install を実行



---

参考リンク

BME280 Datasheet (Bosch)

Adafruit BME280 Pythonライブラリ


---
Git コマンド一覧(自分用)

# Overview
業務でもなんとなくなあなあにして避けてきたGit。
sourcetreeやVS codeのエクステンションでGUI様にたくさん助けてもらったけど、もういい歳だし、ポートフォリオサイト作成や自己開発の増加を見越してコマンドくらいはいちいち調べず覚えようと、ここにまとめておこう。さすがに今更感もあるけど、自分用だしQiitaのカムバックログイン的な記事なので気にしない気にしない。

# Commands
|コマンド|やりたいこと|
|---|---|
|git pull|プル|
|git add {fileName}\ngit add .|ステージング|
|git reset HEAD {fileName}|ステージングを取り消す|
|git commit|コミットする|
|git push|ローカルリポジトリの変更点をリモートリポジトリにマージ|
|git log|ログを確認する|
|git diff|何処を編集したのか知りたい場合|
|git branch|ブランチ|
|git checkout -b {branchName}|新規ブランチを作りそれをカレントブランチにする|
|git merge {branchName}|他のブランチを現在のカレントブランチに取り込む|
rsyslogdとsystemd-journaldについて（概要）

## 役割の概要
| 機能 | rsyslog | systemd-journald |
|:-:|:-:|:-:|
| 主な役割 | ログの収集・保存・転送 | ログの収集・管理 |
| 対応ログ形式 | プレーンテキスト | バイナリログ |
| 出力先 | /var/log/ | 設定次第（下記参照） |
| 起動方式 | 独立したサービス | systemdに統合 |

基本的にどちらもログ採取できるが、journaldはログ採取、rsyslogdは保存を担当させることが多い

## rsyslog
### 特徴
* 古くからあるSyslog実装
* 柔軟なログ転送が可能
* `/etc/rsyslog.conf`または`/etc/rsyslog.d/*conf`で設定
* テキストファイルベースの出力
* フィルタ、フォーマット、キューなどの細かい設定が可能

### rsyslogを覗いてみる
###### 起動確認
```
systemctl status rsyslog
```
または
```
ps aux | grep "rsyslog"
```

##### ログを見る
テキストベースなので`cat`などで見ることができる
ここでは例として認証・セキュリティ関連のログを覗いてみる
```
cat /etc/log/secure
```

## systemd-journald
### 特徴
* systemdに標準搭載されたログ管理機構
* カーネルログ、syslogなど、ほぼすべてのログを取り込む
* バイナリ形式として保存する
* ログは`journalctl`コマンドで参照でき、フィルタや検索可能
* 信頼性が高く、メタデータも豊富

### 保存先
デフォルト（筆者の環境）では、ログの永続保存がされておらず、
`/run/log/journal/`配下に保存され再起動するごとに削除されてしまう
#### 永続化
設定ファイルは`/etc/systemd/journald.conf`
##### 方法1　設定ファイルの書き換え
```
#Storage=auto
↓
Storage=persistent
```
##### 方法２　ディレクトリの作成
```
#Storage=auto
↓
Storage=auto
```
```
$ sudo mkdir -p /var/log/journal
$ sudo systemd-tmpfiles --create --prefix /var/log/journal
```

##### 共通
再起動（サービスだけでもいいとは思うが初心者過ぎて、systemdに結合されているので端末再起動しました）
```
sudo reboot
```

### journalを覗いてみる
###### 起動確認
```
systemctl status systemd-journald
```
または
```
ps aux | grep "jounal"
```

##### ログを見る
バイナリベースなので`cat`などで見ることができない
```
journalctl
```
###オプション
| オプション | 概要 |
|:-:|:-:|
|  -r | 降順 |
| -e X | 直近のＸ行をページャで表示 |
|  -n X | 最後からＸ行を表示 |
| -f | リアルタイム表示 |
| -k | カーネルログを表示 |
| -u XXX | ＸＸＸサービスでフィルタ |
|  -p X | Ｘプライオリティ以上でフィルタ |
| -since="Y-M-D" | YMD以降からのログを表示 |
Microsoft 365 に既存の独自ドメインを設定する手順書

MS365導入に際して、色々と行った内容を整理、メモしておきます。

前提
+ 既存のドメインを持っている
+ MS365のアカウントは買ったものの、一部の人だけの分しかない
+ 既存のドメインのアカウントは大塚商会のAlphaメールにて管理している
+ 既存ドメインでのメールのやり取りを一部の人だけ、MS365に持っていきたい



# Microsoft 365 に既存の独自ドメインを設定する手順書

## ✅ 概要

この手順書は、Microsoft 365 環境において、既存の独自ドメイン（例：`XXX.co.jp`）を送信専用アドレスとして設定するためのものです。  
受信は既存のメールサービス（例：Alpha-Mail）を引き続き利用し、MS365では一部のユーザーのみメール送信に活用する構成です。

---

## 🧭 手順概要

1. Microsoft 365 に独自ドメインを追加
2. DNS にTXTレコードを追加して所有権を確認
3. Exchangeメール受信設定をスキップ（MXレコード不要）
4. Exchange管理センターで送信用アドレスを追加
5. SPFレコードを任意で設定

---

## 🔧 Step 1：独自ドメインの追加

1. Microsoft 365 管理センター（https://admin.microsoft.com）にサインイン
2. [設定] → [ドメイン] → 「ドメインの追加」
3. 追加したいドメイン名を入力（例：`XXX.co.jp`）
4. 表示された TXT レコードを控える（例：`MS=ms12345678`）

### 📌 DNSプロバイダ（例：Alpha-Mail）に以下のレコードを追加

| ホスト名 | 種別 | 値               |
|----------|------|------------------|
| @        | TXT  | MS=ms12345678    |

5. 管理センターに戻り「確認」をクリックして所有権を証明

---

## 🔧 Step 2：Exchange設定をスキップ

1. ドメイン所有権の確認後、「Exchange」および「Exchange Online Protection」のチェックを外す
2. 「続行」を選択し、MX等の受信設定をせずにドメイン追加を完了

---

## 🔧 Step 3：ユーザーに送信用メールアドレスを付与

1. [Exchange 管理センター](https://admin.exchange.microsoft.com) にアクセス
2. [受信者] → [メールボックス] → 対象ユーザーを選択
3. [メールアドレス]タブで「＋追加」
   - 種類：SMTP（大文字）
   - メールアドレス：`user@XXX.co.jp`
   - 「プライマリに設定」にチェック
4. 保存（反映まで数分〜最大1時間）

---

## ✅ ユーザー操作：Outlook上で送信元アドレスを確認

- OutlookまたはOutlook Web（OWA）で新規メール作成
- 「差出人」欄が `@XXX.co.jp` になっていることを確認
- 表示されない場合は差出人を手動で追加・選択

---

## 🛡️ SPFレコードの設定（任意・推奨）

受信側メールサーバーからの信頼性向上のため、以下のようなSPFレコードを追加：

```
v=spf1 include:spf.protection.outlook.com include:spf.alpha-mail.ne.jp ~all
```

※ `include:spf.alpha-mail.ne.jp` の部分は利用しているメールサービスの指定に応じて調整してください。

---

## ✅ チェックリスト

| チェック項目 | 状況       |
|---------------|------------|
| 独自ドメインの追加 | ✅ 済 |
| TXTレコードでの所有確認 | ✅ 済 |
| Exchange受信設定のスキップ | ✅ 済 |
| ユーザーへの送信専用メールアドレス設定 | ✅ 済 |
| SPFレコードの登録 | ⬜ 任意 |

---

## 📘 補足

- 既存メールサービス（Alpha-Mail等）を受信専用で継続する場合、**MXレコードはMS365に向けて変更しない**よう注意
- Exchangeの「送信専用」であれば、メールのフローも変更せず導入可能
- 将来的に受信もMS365へ統合する場合は、MX設定やメールボックス移行が必要となる

---


---

## ⚠️ 同一ドメイン内での送信時の「宛先不明」対策

### 💡 問題の概要
Microsoft 365 に一部のユーザーのみを移行し、残りは引き続き Alpha-Mail を利用している場合、  
**同一ドメイン（例：`@XXX.co.jp`）内のメール送信時に、存在しないユーザーと誤認されてバウンス（宛先不明）となる**ことがあります。

### 🛠️ 解決策：Microsoft 365 にコネクタとアドレス一覧を設定

#### 方法1：外部配信ルールを作成して内部送信でもメールを外部に出す

1. Microsoft 365 管理センターで [Exchange 管理センター](https://admin.exchange.microsoft.com) にアクセス
2. [メールフロー] → [ルール] で新しいルールを作成
3. 条件：
   - 差出人 → 内部
   - 宛先 → `@XXX.co.jp` のドメイン
4. 処理：
   - 「このコネクタを使って外部に転送」 → 既存の外部ルーティングコネクタを選択

#### 方法2：非MS365ユーザーを「連絡先」として登録する

1. Exchange管理センターで [受信者] → [連絡先] → 「＋追加」
2. 表示名：該当ユーザーの名前
3. メールアドレス：`user@XXX.co.jp`
4. 登録された連絡先により、内部から送っても外部ルートが選ばれるようになる

---

## 📝 推奨構成まとめ（ハイブリッド運用時）

| 構成項目 | 設定内容 |
|-----------|----------|
| ドメイン | XXX.co.jp |
| 受信サーバ | Alpha-Mail（既存） |
| 送信ユーザー | Microsoft 365上に登録 |
| 他のユーザー | Exchangeで「連絡先」登録 |
| メールフロー | すべて外部に一旦出すルールあり |
因果モデル

タイムマシンもどきが、作れるはず。

# 因果ネットワークモデル
事象空間を
```math
E=e_1,e_2,...,e_n
```
とする。
各事象
```math
e_i
```
には時空座標
```math
x_i^\mu
```
と状態変数
```math
\phi_i
```
がある。
因果関係は有向グラフ
```math
G=(E,C)
```
によって定義され、エッジ
```math
c_{ij}\in C
```
は事象
```math
e_i\rightarrow e_j
```
への因果的影響

### 因果影響量

$$
\Delta \phi_j = \sum_{i} c_{ij} \cdot f(\phi_i)
$$

ここで、

$$
f(\phi_i) = \phi_i \cdot e^{-\alpha \cdot d_{ij}}
$$

```math
\phi_j　　事象jの状態変数（影響を受ける側）
```
```math
\phi_i　　事象iの状態変数（影響を与える側）  
```
```math
c_{ij}　　因果リンクの重み（影響強度）  
```
```math
d_{ij}　　事象間の距離（時空距離）  
```
```math
\alpha　　影響の減衰率（正の定数）
```

# 因果保存の法則

$$
\sum_{e_i \in E} \phi_i = \text{const}
$$



```math
E　全ての事象の集合
```
```math
\phi_i　各事象e_iにおける状態量（例：エネルギー、情報、影響強度など）
```
```math
\text{const}　全体で一定の総量（保存）
```

$$
\sum_j c_{ij} = \sum_k c_{ki}
$$

```math
c_{ij}　事象iからjへの因果リンクの重み（流出）  
```
```math
c_{ki}　事象kからiへの因果リンクの重み（流入）
```

上式は「ノードiにおいて因果の入出力がバランスする」ことを意味する


# エントロピーと観測困難度モデル

$$
S(t) = S_0 + \beta t
$$

```math
S(t)　　時刻tにおけるエントロピー
```
```math
S_0　　初期エントロピー
```
```math
\beta　　エントロピーの増加率（定数）
```

### 観測可能な情報量
$$
I(t) \propto \frac{1}{S(t)}
$$

```math
I(t)　　観測可能な情報量
```

エントロピーが高い（遠い過去）ほど、情報は失われ、観測が難しくなる
Blenderモデルのタイムライン（任意フレーム間）アニメーション出力

# Blenderでキーフレームを打ったモデルをスクリプトでアニメーション出力する
## タイムラインの任意フレーム間
### 例：１〜３０
Blenderのサンプルモデルとして，Cubeをｘ，ｙ，ｚ方向に１ｍずつ動かした．

![my_animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/0282ae3a-9c08-4cca-bedb-81781a94fd03.gif)

```out_anim.py
import bpy
import os

def render_animation_to_mp4(start_frame, end_frame, filename="animation.mp4"):
    """指定したフレーム範囲をMP4アニメーションとしてカレントディレクトリに出力します。

    Args:
        start_frame (int): レンダリングを開始するフレーム番号。
        end_frame (int): レンダリングを終了するフレーム番号。
        filename (str, optional): 出力ファイル名. Defaults to "animation.mp4".
    """
    # 現在のシーンを取得
    scene = bpy.context.scene

    # カレントディレクトリを取得
    output_path = os.getcwd()
    
    # レンダリング設定
    scene.render.filepath = os.path.join(output_path, filename)
    scene.render.image_settings.file_format = 'FFMPEG'
    scene.render.ffmpeg.format = 'MPEG4'
    scene.render.ffmpeg.codec = 'H264'
    scene.render.ffmpeg.constant_rate_factor = 'MEDIUM'
    scene.render.ffmpeg.gopsize = scene.render.fps * 2 # 1秒の2倍のGOPサイズ

    # フレーム範囲を設定
    scene.frame_start = start_frame
    scene.frame_end = end_frame

    # アニメーションをレンダリング
    bpy.ops.render.render(animation=True)

if __name__ == "__main__":
    # 設定
    start_frame = 1
    end_frame = 30
    output_filename = "my_animation.mp4" # 出力ファイル名 (適宜変更してください)

    # レンダリングを実行
    render_animation_to_mp4(start_frame, end_frame, output_filename)

    print(f"フレーム {start_frame} から {end_frame} までのアニメーションを {output_filename} としてカレントディレクトリに出力しました。")

```
朗報　GRANDSTREAM HT813 新ファームウェア（β）登場！

asteriskユーザーみんな大好き（過言）GRANDSTREAM HT813のバグフィックス＋新機能追加のβ版ファームウェアがリリースされました。

https://www.grandstream.com/support/firmware/ht813-beta-test-firmware

caller ID　（日本でいうナンバーディスプレイ）取得中に切断されるバグその他が修正されている模様です。
これから人柱やります。

続報に乞うご期待！

---
# 2025/05/23追記

## 結論
ナンバーディスプレイ（Caller ID）の表示と、着信時に切断されてしまう問題は解決した模様。

## まずはバージョンアップ

上記のサイトからファームウェアをダウンロードしてきます。
これはβ版なので、実運用環境ではくれぐれも注意してください。
といいますか、安定版が出るまでは様子を見ましょう。
ADVANCED SETTINGS => （一番下の方） => Upload Firmware:　から実行します。
再起動含め250秒くらいかかる模様です。絶対電源を切らないこと！

### バージョンアップ終了後
念のため、初期化して再起動しましょう


## 外線発着信試験
### Asterisk設定（最低限だけ）

```pjsip.conf
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060

[acl]
type=acl
deny=0.0.0.0/0.0.0.0
permit=192.168.0.0/24

; ===== 内線 300 =====
[300]
type=endpoint
context=from-internal
aors=300
disallow=all
allow=ulaw
auth=300_auth
direct_media=yes

[300_auth]
type=auth
auth_type=userpass
username=300
password=<<password>>

[300]
type=aor
max_contacts=1

; ===== 外線トランク: HT813 =====

[ht813_fxo]
type=endpoint
auth=none
aors=ht813_fxo_aor
transport=transport-udp
context=from-internal
disallow=all
allow=ulaw
direct_media=no

[ht813_fxo_aor]
type=aor
max_contacts=1
contact=sip:192.168.0.232:5062

[ht813_fxo_identify]
type=identify
endpoint=ht813_fxo
match=192.168.0.232

;=====外線着信=====

[ht813_in]
type=endpoint
transport=transport-udp
context=from-trunk
disallow=all
allow=ulaw
direct_media=no
;auth=none
aors=ht813_in_aor

[ht813_in_aor]
type=aor
max_contacts=1

[ht813_in_identify]
type=identify
endpoint=ht813_in
match=192.168.0.232/32
```
```extensions.conf
[from-internal]
; 外線発信（0から始まる番号）
exten => _0.,1,NoOp(外線発信: ${EXTEN})
 same => n,Dial(PJSIP/${EXTEN}@ht813_fxo,60)
 same => n,Hangup()

; 内線300の定義
exten => _3XX,1,NoOp
 same => n,Dial(PJSIP/${EXTEN},30)
 same => n,Hangup()

[from-trunk]
exten => s,1,NoOp(外線着信)
; same => n,Answer()
 same => n,Dial(PJSIP/301,30)
 same => n,Hangup()
 ```

 ### HT813設定
 今回の仕様では、Asteriskにレジストレーションしない方法で行うこととした。
 
 ![192.168.0.232_cgi-bin_config2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642366/cd4d2930-96f3-4164-9b7d-e1f790bdd831.png)

 ![192.168.0.232_cgi-bin_config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642366/6ba3beb6-5ecf-4d49-9c82-87db3ffaf0f8.png)

![192.168.0.232_cgi-bin_config_a2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642366/1d7a217a-0776-4406-851e-1b243dda476f.png)

## 発信試験

内線300から自分の携帯に発信

→問題なく着信。通話も問題なし。


## 着信試験

自宅の電話番号に携帯から発信

→Cisco IP PHONE 303の液晶ディスプレイに携帯の番号が表示された！成功！

10コールほど鳴らしてからオフフック。通話異常なし。

## 途中経過

ということで、以前のファームウェアまでで発生していた「Caller ID Scheme:」を「NTT Japan」としておくと発生していた2～3コールで切断されてしまう事象は解消した模様。

## 謝辞
[HT813のナンバーディスプレイ対応（解決）-暇言さま](https://wp.hima-jin.info/ht813_numberdisplay_update/)
ファームウェア更新のきっかけを作ってくださった偉大な方。
ここに感謝を申し上げます。ありがとうございます。

[VoIP-Info.jpさま](https://voip-info.jp/)
いつもお世話になっております。ありがとうございます。

ChatGPT 4o
使い倒してます。
Next.js server action Error: An unexpected response was received from the server.

## 何が起きたか

next.js ver 15...でserver actionを使用している際にError: An unexpected response was received from the server.というエラーが発生しました。

## server actionとは？
serverで実行される非同期関数のことです。
'use server'ディレクティブを使用して クライアントサイドのコードから呼び出せる、サーバサイドの関数をマークします。

https://ja.react.dev/reference/rsc/use-server


## ディレクトリ構成
```
src/
  app/
    contact/
      - page.tsx
      complete/
        - page.tsx
  lib/
    - contact.ts
```

## 問題が発生するコード
lib/contact.ts
server action
```ts
"use server";
import { redirect } from "next/navigation";

export async function submitContactForm(formData: FormData) {
  redirect("contact/complete");
}
```

contact/page.tsx
```tsx
import React from "react";
import { submitContactForm } from "@/lib/actions/contact";

export default function Contact() {
  return (
    <form action={submitContactForm}>
        <button>送信</button>
    <form>
  );
}
```

contact/complete/page.tsx
```tsx
import React from "react";

export default function Complete() {
  return (
    <p>complete</p>
  );
}
```

## 期待する挙動

form送信後にcompleteページへ飛ぶこと

## 発生したエラー

![スクリーンショット 2025-05-20 8.22.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1390680/32832744-a744-415f-a135-cac09136e5c5.png)


## 原因
server action内のnavigationにエラーがあります

```ts
x  redirect("contact/complete");
⚪︎ redirect("/contact/complete");

/から始める必要があります
```
機械学習に出てくる埋め込み (Embedding) とは?

# はじめに
埋め込み (Embedding)が出てくるたびににこいつなんだっけ??となるので、ここでしっかりとまとめておく。

# 埋め込み（Embedding）とは
主に自然言語分野で使われ、各単語の関係性を定量化させるために**単語を固定長な実数値のベクトルで表現したもの**を埋め込み表現と呼ぶ。意味が近い単語同士は、ベクトル空間上で近い位置に配置される。

# 埋め込み手法
各単語をベクトルに落とし込む手法として代表的なのが**word2vec**や**GloVe**だ。

**word2evec**はGoogleのMikolovらによって提案された。その学習モデルとしてCBOWとSkip-gramがある。

**Efficient Estimation of Word Representations in Vector Space**

https://arxiv.org/pdf/1301.3781

**GloVe**はスタンフォード大学のPenningtonらによって提案された。word2vecが局所的な文脈情報を利用するのに対し、GloVeは大域的な単語の共起回数(共起とは、ある言葉と他の言葉が同時に文書の中で出現すること)を活用する。これによりword2vecよりも高精度を示した。

**GloVe: Global Vectors for Word Representation**

https://nlp.stanford.edu/pubs/glove.pdf