OmniAICreator/Qiita-1.07M huggingface dataset:
AUTOSARをすべての産業標準の基礎に

AUTOSARを、すべての産業標準の基礎を目指していることという仮説に基づき、その根拠を記録する。　

輸送機械、工作機械、土木建築機械、農業機械、
などの分野では、それぞれの物理量があり、慣性の法則があり、時定数がある。　
そのため、抽象的な設計ではなく、物理的な設計により、　
論理的にはありえても物理的にはありえないことは考慮しなくてもよいかもしれない。　

論理回路の物理層では、同時に入力があると不定になるように、　
物理的に考えると、論理的には考えなくてもいいかもしれないことを検討しなくてはならないことがある。　

どちらかが簡単でどちらかが難しい問題かどうかはよく知らない。　

それぞれの領域の固有の現象を、他の領域とどう対応づけるかが大事だろう。　
論理的に起こり得ることも、物理的にはばらつき、雑音、熱現象などによって到達しないこともあるかもしれない。　

# 模型(Model)記述に基づく設計 
## 模擬試験による設計確認　
 
# 課題 
## 実時間設計(OSEK/VDX)
模型(model)設計の課題は実時間設計、実時間測定である。　

設計どおりに実際の時間処理が間に合うのかどうか。　

### 割り込みの分類整理(OSEK/VDX)
ISO OSEK/VDX OSでは、割り込みを分類している。　

#### Category 1 割り込み(OSEK/VDX)　

OSの機能を利用しない割り込み。　
OSの処理よりも早く処理したい場合に利用するとよい。　




### critical section


Critical Section Objects

https://learn.microsoft.com/en-us/windows/win32/sync/critical-section-objects

Parallel Programming: Understanding the impact of Critical Sections

https://web.archive.org/web/20110620203242/http://www.futurechips.org/tips-for-power-coders/parallel-programming-understanding-impact-critical-sections.html

Mutex Lock Code Examples
https://docs.oracle.com/cd/E19683-01/806-6867/sync-12/index.html

Semaphores
https://docs.oracle.com/cd/E19683-01/806-6867/sync-27385/index.html

Synchronization — Letting Accelerator/Parallel Developers Run Free
Locks, Semaphores, Critical Sections, and other Synchronization Constructs Used to Prevent Crashes and Bugs

https://www.intel.com/content/www/us/en/developer/articles/technical/synchronization-lets-parallel-developers-run-free.html?wapkw=#gs.ksjrpz

>Resource sharing synchronization
There are quite a few synchronization constructs that protect access to resources, and I will not be able to give code examples for all of them. So to allow you to dive in a little more, I’ll list a few and what they are generally used for:
critical section — allows only one thread to run code protected by the critical section at once.
lock/mutex — protects a code section by asking each thread to explicitly request access via a lock before running some code. This is different from a critical section as there are cases where multiple threads may access a shared resource simultaneously (e.g., a reader/writer paradigm to be discussed below).
semaphores — given a predefined number N; this allows only N users to run their code simultaneously.
Note that synchronization, if used inappropriately, can result in incorrect results and issues where threads fail to make progress or hang.


Concurrent Programming: Algorithms, Principles, and Foundations.
https://team.inria.fr/wide/files/2021/04/Springer-Book-1.pdf

RESEARCH PAPER ON SOFTWARE SOLUTION OF CRITICAL SECTION PROBLEM
https://www.researchgate.net/publication/268031056_RESEARCH_PAPER_ON_SOFTWARE_SOLUTION_OF_CRITICAL_SECTION_PROBLEM

Accelerating Critical Section Execution with Asymmetric Multi-Core Architectures

#### 未確認
Synchronization, coherence, and event ordering in multiprocessors

Critical Lock Analysis: Diagnosing Critical Section Bottlenecks in Multithreaded Applications

GNU/Linux Application Programming
ローカル環境で『supabaseUrl is required.』エラーが出た際に.envファイルの命名で確認すべきこと

## はじめに
こんにちは。
Viteの開発環境(`npm run dev`で出るローカル環境)上で、環境変数をenvで設定してsupabaseからデータを呼び出そうとした時に`supabaseUrl is required.`のエラーが発生しました。
解決策が見つからずハマってしまったので共有の意味もこめて記事化します。

## エラーが起きたコード

### 環境変数
```:.env.production
VITE_SUPABASE_URL=(supabaseのプロジェクトから引用したURL)
VITE_SUPABASE_ANON_KEY=(supabaseのプロジェクトから引用したanon key)
```
### 呼び出し先
```react:Supabase-function.ts
import { Supabase } from "../utils/Supabase";

export const getData = async ()=>{
    const response = await Supabase.from('study-record-ts').select("*");
    
    if(response.error){
        throw new Error(response.error.message);
    }
    
    return response.data;
}
```
```react:app.tsx
import { Button } from '@chakra-ui/react'
import './App.css'
import { getData } from "./utils/Supabase-function"

// 呼び出し確認のためにconsoleを使う
console.log(getData);

function App() {

  return (
    <>
      <h1>title</h1>
    </>
  )
}

export default App
```
このconsole.logの出力結果を見ようとすると`supabaseUrl is required.`となっていた。

## エラーの原因
**環境変数を設置するファイル名を`.env`ではなく`.env.production`としていた**。

`.env.production`は本番環境用の環境変数を設定するためのファイルであり、buildした場合でないと環境変数として読み込む対象にならない。

## 解決方法
**開発環境で環境変数を設定する際はファイル名を`.env`もしくは`.env.local`とする。**
そうすることで`npm run dev`下のローカル環境でも環境変数(supabaseUrl)が読み込まれるようになる。


## 最後に
.envファイルの命名については既存の記事がなく、かつあまり意識していなかった点で見落としていました。
皆さんも環境変数の設定ファイルの命名はチェックしておきましょう。


## 参考資料
https://ja.vite.dev/guide/env-and-mode

https://fwywd.com/tech/next-env

https://qiita.com/ktanoooo/items/64cad61096cf45f18c24
計算機関連研修講師として心がけている７つのこと。

１日から５日くらいの研修コースを想定しています。
場合によっては３週間から３ヶ月の話題も織り込むかもしれません。

研修講師として心がけている７つのこと。


# まず動かす。
### 批判 2.1 まず動かすと、動かしているだけで、何も覚えずに帰る人がいるのでだめだ。

午前中にコンパイルする。

説明を長々

# 2 目標設定
目標設定を、最初にするか、４分の１くらい進んだところでするか、半分進んだところでするかは、場合による。

受講いただく方の希望、目的、目標などを存じ上げない場合には、なるべく早い段階で目標設定をしていただく。

その設定した目標を拝見しながら、提供する情報、やるといいことを展開する。

## 批判 2.1  目標設定なんか、真面目にやるやつはいない。
## 批判 2.2 高すぎる目標は失望を招く
## 批判 2.3 低すぎる目標は遊んでるだけ

# 3 能力、経験を知る

受講いただく方の能力、経験を知ることはとても大拙です。

もし、事後アンケートをするのであれば、事前アンケートは必須です。
事前アンケートをしないのであれば、事後アンケートは無意味です。

# 4 やる気を増進させる

# 5 記録する

# 6 　振り返る
# 7 専門家にみてもらう
追試(再現試験)

ここで試験はもの事が意図(設計)通りに動くかを確かめる(試す|ためす)意味です。　

追試は誰かが行った試験がどういう条件で成り立つかを確かめる試験です。

RaspberryPi4 で flutter と dart を動かす動画の追試
https://qiita.com/nanbuwks/items/67d2a2fc7c4884ba5848

Common Lisp で行列計算するブログを追試してみた
https://qiita.com/guicho271828/items/60236e32871b9eb610c7

# self reference
必要なのは「車輪の再発明」ではなく「追試」
https://qiita.com/kaizen_nagoya/items/d773d57bc965cb2ab3eb

docker(26) Openjijをdockerで(追試)
https://qiita.com/kaizen_nagoya/items/ec1f7b1dbb64e5e22f7f

英語(68) Qiitaに記事を書く時と論文を書く時の共通部分と相違点
https://qiita.com/kaizen_nagoya/items/9af258c8d0f994de1316

社会現象の統計値の扱い方。追試。仮説(80)
https://qiita.com/kaizen_nagoya/items/1d87b81063679676ab18

博士論文　再現実験　前日徹夜
https://qiita.com/kaizen_nagoya/items/73c29931938a20739c30

「@subretu DockerfileにおけるCMDとRUNの挙動」追試：error now.
https://qiita.com/kaizen_nagoya/items/4821d67752cff3eca476
【Python】Tkinterでイベントの伝播を停止する方法（return 'break' の使い方）

# 1. 概要

Tkinterでイベントバインド `bind` を使う場合、デフォルトの処理が意図しない動作になることがある。それを防ぎたい（イベントの伝播を停止したい）場合に、`return 'break'` を使用する。

# 2. 実装

## イベントの伝播を停止しない例

下記を実行し、`entry1` のEntry内で `Tab` キーを押下する。
すると、`entry1` には何も文字は挿入されず、フォーカスが `entry2` へ移る。

```Python:main.py
import tkinter as tk
from tkinter import ttk


if __name__ == '__main__':
    root = tk.Tk()

    entry1 = ttk.Entry(root)
    entry1.pack()

    entry2 = ttk.Entry(root)
    entry2.pack()

    root.mainloop()
```

## イベントの伝播を停止する例

先の挙動を踏まえ、次のような機能を実装する。

- `entry1` で `Tab` キーを押下すると、`entry1` にタブ `\t` が挿入される。ただし、次のウィジェット（`entry2`）へフォーカスはしない。

```Python:main.py
import tkinter as tk
from tkinter import ttk


def on_tab_in_entry1(event):
    entry1.insert(tk.END, '\t')
    return 'break'


if __name__ == '__main__':
    root = tk.Tk()

    entry1 = ttk.Entry(root)
    entry1.pack()

    entry2 = ttk.Entry(root)
    entry2.pack()

    entry1.bind('<Tab>', on_tab_in_entry1)

    root.mainloop()
```

# 3. `return 'break'` について

## 用語説明（事前知識）

`Tcl`（ティクル）: スクリプト言語。
`Tk`: Tcl用に開発されたGUIツールキット。Tool kit 略して `Tk`。
`Tkinter`: Pythonの標準ライブラリ。Pythonで `Tk` を使うためのラッパー。内部的には `Tcl/Tk` を呼び出しているが、Pythonの文法で記述できる。

## 機能説明

Tkinterの `return 'break'` は、Tcl/Tkにおける `break` コマンドのラッパー的な動作をしている。つまり、コールバック関数の戻り値として `'break'` のような文字列を返すことで、Tcl/Tk 側で対応するコマンド（ここでは `break`）が実行される。

この仕様は、Tkinterの公式ドキュメントには記載されていない。

`Tcl/Tk` の公式ドキュメントには `break` コマンドの説明がある。

[MULTIPLE MATCHES - Tcl8.6.16/Tk8.6.16 Documentation](https://www.tcl-lang.org/man/tcl8.6/TkCmd/bind.htm#M55):

> If the break command is invoked within a binding script, then that script terminates and no other scripts will be invoked for the event.

Google Translate 和訳:

> バインディング スクリプト内で break コマンドが呼び出されると、そのスクリプトは終了し、イベントに対して他のスクリプトは呼び出されません。
導入アプリメモ

Linuxを使うにあたり、どのようなアプリがあるのか。
一通り探してこれらをインストールしてみた。

ブラウザ　Firefox
ブラウザ　Brave
メーラー　ThunderBird
ゲーム　Steam
バイナリエディタ　Okteta　KDE
プロジェクト管理　Plan KDE
プロジェクト管理　ProjectLibre KDE
サウンドエディタ　Kwave　KDE
ペインター　Krita　KDE
ペインター　GIMP
ペインター　KolourPaint　KDE
3Dエディタ　Blender
ドローエディタ　Inkscape
ビデオエディタ　SubtitleComposer　KDE
ビデオエディタ　Kdenlive　KDE
クロスパターンペインター　kxstitch　KDE
オフィス　LibreOffice
PDFエディタ　MasterPDFEditor
ファイル比較　Kompare
ダウンローダー　KGet　KDE
トレント　KTorrent　KDE
リモート　Remmina
テキストスピーチ　KMouth　KDE
財務管理　GnuCash
フロー図　draw.io
【ポートフォリオ】MedicineRecordについて

# はじめに
転職活動に向けてポートフォリオを作成し、仮ドメインにて運用しています。この記事ではそのポートフォリオの詳細について書いていこうと思います。
レポジトリURL: https://github.com/ono0227/MedicineRecord.git
ウェブアプリURL:http://medicine-record-alb-120277363.ap-northeast-1.elb.amazonaws.com/

# なぜ作ろうと思ったのか
祖母が服薬の継続に悩んでいる様子を見て、服薬のモチベを維持できるアプリの作成を決意しました。

# 使用技術について
Frontend: React（Material UI、ESLint、Prettier）＋ Nginx（本番環境のみ）
Backend: RubyonRails（APIモード、Rspec、Rubocop）
インフラ：　Docker、CircleCI、AWS（ECS Fargate、ECR、RDS、ALB、）

# 実装機能
### ユーザ向け

・ユーザの新規登録、編集、削除
・ゲストログイン
・パスワード更新機能（実装予定、仮ドメインのため現在使用不可）
・薬の新規登録、編集、削除
・服薬記録の登録、編集、削除
・カレンダー、グラフによる視覚化（chat-js、Material UIを使用）
・継続日数の表示
・お問い合わせ機能（Slack Webhookを使用）

### 非ユーザ向け

・Dockerによる開発環境のコンテナ化
・CircleCIによる自動CI&CDパイプラインの構築
・Nginxのキャッシュ保持による効率的な配信

### ER図
![ER図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4030405/27422bee-bf6a-4e57-940b-bee3a2972013.jpeg)

### インフラ構成図（Route53、ACMは現状未構築）
![AWSインフラ構成図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4030405/e48898a2-6fe7-4df0-984f-1a8563bb99c2.jpeg)
M5StickC  Plus2 で　MAX3012によって 脈拍を測定する

M5StickC  Plus2と MAX3012を使って脈拍を測定するコードの検索に苦労しました。
最後にようやく成功したのが下記サイトです。7

[[参考にさせて頂いたサイト]](https://qiita.com/awawaInu/items/4beba1ac8ea0925c951f)

ここの
12行目の
Wire.begin(32, 33);
だけを書き換えました。


```
#include <Wire.h>
#include "MAX30105.h"
// doc https://learn.sparkfun.com/tutorials/max30105-particle-and-pulse-ox-sensor-hookup-guide/all
MAX30105 particleSensor;

void setup()
{
  Wire.begin(32, 33); 
  Serial.begin(115200);
  
  Serial.println("");
  Serial.println("Initializing...");
 
  // Initialize sensor
  while(!particleSensor.begin(Wire, I2C_SPEED_FAST)){
    Serial.print(".");
  }
  Serial.println("OK!");
  
  //Setup to sense a nice looking saw tooth on the plotter
  byte ledBrightness = 0x1F; //Options: 0=Off to 255=50mA
  int sampleRate = 800; //Options: 50, 100, 200, 400, 800, 1000, 1600, 3200
  byte sampleAverage = 4; //Options: 1, 2, 4, 8, 16, 32
  // 結果的に800/4でサンプルレートは200になります
  // redとirが逆になっていて, ここが1だと赤外線LEDが発光します(見えない)
  byte ledMode = 1; //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green
  int pulseWidth = 411; //Options: 69, 118, 215, 411
  int adcRange = 4096; //Options: 2048, 4096, 8192, 16384
 
  particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); //Configure sensor with these settings
 
  Serial.println("red");  
}
 
void loop()
{
  //redとirが逆になっているらしく, getRed()でirの強度をとってきています 
  //uint32_t sensor_ir = particleSensor.getIR();
  uint32_t sensor_red = particleSensor.getRed();

  Serial.println(sensor_red);
}

```
M5StickC Plus2の場合、本来は：

Pin	　GPIO
SDA	　32
SCL	　33

ですので、Wire.begin()の時にピン指定が必要ということです
自分、意識高い“系”エンジニア、やってんなぁって話

## はじめに

この記事にたどり着いてくれて、ありがとうございます！  
おそらく「意識高い系」みたいなワードで検索して、ここまで来てくれたのかなと思います。

これは、**自分自身を客観視して整理したくて書いた記事**です。  
長文を書くのは得意じゃないので、ところどころ脈絡がおかしかったら多めに見てください🙇‍♂️

もし読んでいて「自分にも同じような経験あるな」と感じた方がいたら、ぜひコメントなどで教えてもらえると嬉しいです！


## 前置き✍️

私は現在、**業界歴10年目のフロントエンドエンジニア**です。  
「給料を上げたい」というモチベーションで、できる限り"Yes"を貫いてきた結果、
今では管理職にも就いています
（この時代にはちょっと珍しいキャリアかもしれません）。

ただ、実は技術やプログラミング自体は**好きだけど苦手**な分野だと感じています。  
その理由は、「一つの物事を深掘りする探究心が自分にはあまりない」と気づいたから。

たとえばエラーが起きたとき、原因を突き詰めるよりも**代替案を先に探す癖**があります。  
とはいえ、技術トレンドにはしっかりアンテナを張っていて、
フロントエンド・バックエンド・インフラに関しても広く浅く知識を持っているつもりです。  
社内ではアグレッシブに動けてる自負もあります。

そんな中で「意識高い系エンジニア」を意識し始めたきっかけがありました。


## 意識高い系ってなんだ🤔

ある日、メンバーとの飲み会で、上司から技術の話題を振られた場面がありました。  
他の同僚たちは、しっかり根拠のある話をしていたのに、**自分だけ中身の薄い回答**しかできなかったんです。  
（話の内容は忘れましたが、そのときの居心地の悪さだけは今も鮮明に覚えています）

その瞬間、「あれ、自分って実は“金メッキエンジニア”なんじゃ……？」という気持ちが芽生えました。  
ただ表面だけをなぞったようなスキルで、本質は何もできていないんじゃないか――。

そのときから、「意識高い“系”エンジニア」という言葉がずっと頭の中に残るようになりました。


## ChatGPT先生に聞いてみた🧑‍🏫

「意識高い系エンジニア」とは何なのか。  
正確に言語化できる自信がなかったので、ChatGPT先生に特徴を箇条書きしてもらいました。

```
意識高い系エンジニアの特徴：

・技術ブログやSNSで自己啓発系の投稿が多い（中身より姿勢アピール）
・バズ狙いの薄い発信が多い（例：「5分で〇〇してみた！」）
・「DX」「Web3」「AI」などのバズワードを多用
・カンファレンスや勉強会に頻繁に参加／登壇するが、実務スキルは伴わない
・勉強会参加＝実力アップと勘違いしている
・実践よりも発信重視で、手を動かさない
・流行技術にすぐ飛びつくが、使いこなせずに放置
・技術より「見せ方」や「ブランド」を優先
・オシャレなカフェでMacBook広げがち
・ツールやUIの見た目にこだわりすぎる
・スタートアップ文化・海外カルチャーに憧れがち
・レガシー技術を見下しがち
・他人への指摘が上から目線になりがち
・「思想」や「ビジョン」の話ばかりで実装は語らない
・発信の目的が「目立ちたい」「モテたい」になっている
```

……読んでて刺さりまくる。  
このリスト、**トゲありすぎませんか？笑**

---

## 自己分析してみた🔍

このリストの中で、特に自分に当てはまる項目を抜き出してみました：

- **バズ狙いの薄い発信**  
　→ Qiitaにそれっぽい記事いくつか書いてるなぁ…w  
- **実践よりも発信重視**  
　→ 記事を流し読みして「これよさそうです！」と社内で紹介して終わり、よくやるw  
- **流行技術にすぐ飛びつくが放置**  
　→ ブクマして満足してるパターン多い…  
- **オシャレなカフェでMac広げがち（に憧れる）**  
　→ 実際やってないけど、スタバでコード書いてる人見ると「かっこいいな〜」って思ってるw  
- **他人への指摘が上から目線になりがち**  
　→ 指摘した後に「言い方きつかったかな…」と自己反省することあるw  
- **目立ちたい・モテたいが動機になっている**  
　→ 「目立つ＝活躍＝評価UP」って思考回路に片足突っ込んでるw  

…けっこう当てはまってて、正直しんどい。  
でも、こういうのって**自覚してるだけマシ**だと思いたい。

---

## 上司に相談してみた🗣️

悩みをそのまま、上司にぶつけてみました。

**🐸 僕：**  
> 「知識が浅くて、本質を理解してないのに“できる風”に見せているのが辛いです。  
> 金メッキのエンジニアだなって思います。意識高い系の特徴にも当てはまりすぎて、将来崩壊しそうで怖いです……。」

**👼 上司：**  
> 「でも、管理職ってひとつに特化するよりも、広く知ってる人の方が向いてるんじゃない？  
> 行動を起こした時点で価値があるし、むしろ周りの人にも良い影響与えてると思うよ。」

この言葉に、ハッとさせられました。

自分の中では「崩壊の予兆」だと思ってた行動も、
**他人から見ればポジティブな刺激になっていた**のかもしれません。  
そう思えたら、気持ちが少しラクになりました。

## 結局、思ったこと📝

「意識高い系エンジニア」が揶揄の対象になることはあるけど、  
**そもそも行動を起こしている時点で一歩前に出てる**とも言えるんですよね。

浅い知識でも、それがあることでAIやツールを使って問題解決できることもあるし、  
幅広い知識があるおかげで、いろんな人と話を合わせられる場面もあります。

つまり、広く浅くの知識は**「強み」でもある**。

だから、「意識高い系やってんな〜自分w」って思いながらも、
**前向きに行動を続けていこう**と思いました。


## 最後に🔥

上っ面だっていい。  
「意識高い系エンジニア」だって、
**続けていればそのうち“本物”になるかもしれない。**

継続は力なり。  
いつか「意識高い“だけじゃない”エンジニア」になれることを願って、
これからも進んでいきます！
【AWS】CDKで「The provided execution role does not have permissions to call CreateNetworkInterface on EC2」エラーが出た場合

# 概要
AWS CDKでLambdaのIAMロールに任意のポリシーをアタッチしようとすると以下のエラーになりました。

> The provided execution role does not have permissions to call CreateNetworkInterface on EC2


```py
        lambda_role = iam.Role(self, "Sample-LambdaServiceRole",
            assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"),
            role_name="Sample-LambdaServiceRole"
        )

        lambda_policy = iam.Policy(self, "Sample-LambdaPolicy",
            policy_name="Sample-LambdaPolicy",
            statements=[
                iam.PolicyStatement(
                    actions=[
                        "logs:CreateLogGroup",
                        "logs:CreateLogStream",
                        "logs:PutLogEvents",
                        "ec2:CreateNetworkInterface",
                        "ec2:DescribeNetworkInterfaces",
                        "ec2:DeleteNetworkInterface"
                    ],
                    resources=["*"]
                ),
                iam.PolicyStatement(
                    actions=[
                        "secretsmanager:GetSecretValue"
                    ],
                    resources=[
                        f"arn:aws:secretsmanager:ap-northeast-1:{self.account}:secret:*"
                    ]
                ),
            ]
        )

        lambda_policy.attach_to_role(lambda_role)
```

# 解決方法
結論、以下であればエラーが出ずにデプロイできました。

```py
        lambda_role = iam.Role(self, "Sample-LambdaServiceRole",
            assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"),
            role_name="Sample-LambdaServiceRole"
        )

        lambda_role.add_managed_policy(
            iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AWSLambdaVPCAccessExecutionRole")
        )

        lambda_policy = iam.Policy(self, "Sample-LambdaPolicy",
            policy_name="Sample-LambdaPolicy",
            statements=[
                iam.PolicyStatement(
                    actions=[
                        "secretsmanager:GetSecretValue"
                    ],
                    resources=[
                        f"arn:aws:secretsmanager:ap-northeast-1:{self.account}:secret:*"
                    ]
                ),
            ]
        )
```

変更したのは、アタッチするポリシーをAWS管理ポリシーの`AWSLambdaVPCAccessExecutionRole`にしたことです。なぜこれにより通るようになったか？は不明です（ご存じの方いらっしゃったらコメントで教えてください！）。

いずれにせよ、AWS が提供するベストプラクティスに従った権限設定が適用された方が良いでしょう。

以前も同じようなエラーになったのですが、同様にAWS管理ポリシーにすることでエラーがなくなったことがありました。ご参考までに。

https://qiita.com/Ryo-0131/items/d61dd990a30d30e0aa61
AUTOSAR document list

Recommend methods and practics for timing analysis
https://qiita.com/kaizen_nagoya/items/0151c8518447cb550e39

Requirements of macsec 
https://qiita.com/kaizen_nagoya/items/9d8e406e3497bed80644

Requirements on diagnostics
https://qiita.com/kaizen_nagoya/items/897c1d51fab522c8702a

Explanation of service Oriented Vehicle Diagnostics
https://qiita.com/kaizen_nagoya/items/a5a75446b424f11859a9

Specification of Mac sek key management
https://qiita.com/kaizen_nagoya/items/69b9940c1d3106bfaad6

Specification of Ethernet Interface
Specification of Ethernet Tranceiver Driver
Specification of Ethernet Switch Driver
Requirements on Firewall
Specification of Firewall n Adaptive Platform
Specification of Diagnostics
Qwen3モデル評価：MacBook Air M4（32GB）でのローカルLLMコード生成検証

### はじめに
前回は phi4-8B や Qwen2.5-Coder-14B-Instruct などを対象に、MacBook Air (M4・32GB) 上で Roo Code と LM Studio／Ollama を使ったコード生成性能を評価しました。今回は、最新の **Qwen3 系列モデル** を中心に、同じタスクを用い評価し、前回との **差分** をまとめます。
※ Qwen3-30B-a3Bが最強でした
[MacBook Air 32GBでローカルLLMによるコード生成を評価してみた(2025/04 最終稿:Qwen3-30B-A3Bのlmxが最強)](https://qiita.com/notfolder/items/e6944da9a05e662e582c)

# 追加評価
- **/nothinkをプロンプトにつけると余計な回り道せずにそれなりのコードを出力する様になりました。**
- **lmstudio-community/Qwen3-30B-A3B-MLX-4bitが品質、スピードともに最強！/nothink要らず。かなり早い**

### 前回評価の振り返り
- **14B クラスモデル** が最低限必要 (32GB 環境)
- **8bit 量子化** (Q4_0/Q8_0) がメモリ・性能バランスで最適
- **M4 上では MLX 化 + LM Studio** が安定
- **コード系専用モデル** より汎用モデルのほうが応答品質良好
- よく動いたモデル：phi4-8b, deepseek-r1-distill-qwen-14b, Qwen2.5-Coder-14B-Instruct, meta-llama-3.1-8b-instruct
- 動作が厳しいモデル：phi4-mini系, codegemma系, CodeLlama13b, IBM Granite20b, mistral-nemo-instruct-2407

### 今回の評価方法
評価手法は前回と同一:
```text
・既存ファイルに Python の main 関数を追加し Hello World 出力
・scikit-learn の Iris 分類関数を作成し main 関数から呼び出し
・プロンプトを徐々に曖昧化し、複数モデルで出力の正しさを確認
```  
具体的なプロンプトは下記。
```text
・今開いているファイルにpythonのmain関数を追加してhello worldを出力するようにして
・scikit-learnのirisを分類する関数を作ってmain関数から呼び出すようにして
・複数モデルで評価して
```  
Roo Code と Ollama MPS／MLX-LM それぞれで動作を比較。

### 評価対象モデル
1. **Qwen3-MoE 系**
   - Unsloth Dynamic 2.0 量子化モデル (Ollama MPS)を評価
   - `Qwen3-30B-A3B` (A3B: 推論時に約3.3B 活性化) → MoE 非対応で MLX-LM 変換不可
   - ollamaをMPS対応バージョンにバージョンアップして評価(8Bとか4Bとか)
   - `unsloth/Qwen3-8B:Q4_K_XL` / `unsloth/Qwen3-4B:Q4_K_XL` → 出力前に長い thinking mode を生成し、待ち切れず
2. **Dense 系 Qwen3**
   - `qwen3-1.7B` → ループ多発
   - `qwen3-4B` → Roo Code の diff 出力形式にならず
   - `qwen3-8B` → 複雑タスクで正しいコード生成も diff 破壊
   - `qwen3-14B` → 正常動作、メモリ約9GB、生成高速だが思考ブロック多め

### 実験環境
- **マシン**：MacBook Air M4, 32GB RAM
- **Roo Code**：v3.15.0
- **LM Studio**：MLX-LM エンジン
- **Ollama**：v0.5.8 以上 (MPS 対応)
- **量子化**：INT4 (Q4_0/Q4_K_XL), INT8 (Q8_0)

### 結果と所感
- 結局14Bモデルを量子化するのが一番安定する。Qwen3はコードの質がよい気がする。
- **MoEモデル (A3B)**：変換も推論も不可。Dense モデル必須。
- **qwen3-1.7B**：軽量だがループ多発で実用性低い
- **qwen3-4B/8B**：コード生成そのものは高品質も、Roo Code 連携で diff 出力不可
- **qwen3-14B**：メモリ余裕、生成速度良好、コード品質高いが verbosity が過剰
- **UD2.0 (Q4_K_XL)**：精度高いが MPS 上では待ち切れないほど遅い

### 前回評価との主な差分
| 項目              | 前回                               | 今回                                         |
|-------------------|------------------------------------|----------------------------------------------|
| モデル群          | phi4, Qwen2.5 系                   | Qwen3 系 (MoE/Dense 両対応)                 |
| 量子化           | Q4_0/Q8_0                          | Q4_K_XL (Dynamic 2.0), INT4/INT8            |
| 環境              | 32GB RAM, LM Studio + Roo Code     | 32GB RAM, MPS(Ollama) / LM Studio + Roo Code              |
| Roo Code 連携可否 | diff 出力 OK                       | 14B以上で出力OK          |
| 推論速度         | phi4-8B: 実用                      | Qwen3-14B: 高速だが思考冗長                 |

### まとめと今後の展望
- **Dense Qwen3-14B** の8bit量子化が最もバランス良好：メモリ／速度／品質
- **UD2.0 動的量子化** は精度良好だが、ollama(MPS:非mlx)でしか動かずとても遅い
年間まとめ

プログラマの「日報、週報、月報、年報」考
https://qiita.com/kaizen_nagoya/items/97ad8ac9217c12c3bb69

日報、週報、月報、年報　考 2022
https://qiita.com/kaizen_nagoya/items/ae884b5667d3f4faf23c

Qiita(53) 2022 年間まとめ
https://qiita.com/kaizen_nagoya/items/413c7b1508640e1553fb

2022 いいねをいただいた記事ランキング(O.K.版) Advent Calendar 2022
https://qiita.com/advent-calendar/2022/goods

Countdown Calendar 2023, 百記事目を書くにあたって。
https://qiita.com/kaizen_nagoya/items/45185a04cfd88b71256a

Qiitaのいろいろランキング2024 感謝
https://qiita.com/kaizen_nagoya/items/73eb37f40aef6e5b3e65

Qiita 1年間をまとめた「振り返りページ」＠2024
https://qiita.com/kaizen_nagoya/items/ed6be239119c99b15828

裸の王様にならないために。
https://qiita.com/kaizen_nagoya/items/450a66b3d8778fc649ab

謹賀新年・祝休日2025年の目標
https://qiita.com/kaizen_nagoya/items/dfa34827932f99c59bbc
カレントフォルダ移動

指定フォルダにカレントフォルダを移動する
~~~
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' カレントフォルダ移動
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Public Function F_File_MoveCurrentFolder( _
        ByVal aFolder As String) As Boolean
    Dim wkRet As Boolean
    
    Dim wkTmpAry As Variant
    
    '引数チェック
    If Dir(aFolder, vbDirectory) = "" Then
        Exit Function
    ElseIf M_String.F_String_GetSplit(wkTmpAry, aFolder, ":\", aIncChkFlg:=True) <> True Then
        Exit Function
    End If
    
    ChDrive wkTmpAry(LBound(wkTmpAry))
    ChDir aFolder
    
    F_File_MoveCurrentFolder = True
End Function
~~~
DTOや直接受け渡し──最適なレイヤー連携を考える

レイヤーアーキテクチャ（層構造）では、役割ごとに「Presentation層」「Business Logic層」「Data層」に分割することで可読性や保守性を高められますが、過度なカプセル化（内部実装を隠蔽しすぎること）はシステムの冗長化や性能低下を招きます。
このため、あえてレイヤー間のブラックボックスを外し、最上位層から最下位層のエンティティを直接扱う設計を許可するケースがあります。
その際、DTO（Data Transfer Object）を使えばレイヤー間の分離を維持できますが、クラス数やマッピング処理が増えて実装が煩雑になりがちです。
下記にDTOや直接受け渡しについて、調べたことをまとめてみました。

## 1.レイヤーアーキテクチャとは
### 3層（Three-Tier）モデルの構造
3層アーキテクチャは、ユーザーインターフェースを担うPresentation層、業務ロジックを担うBusiness Logic層、データアクセスを担うData層に分ける設計パターンです。
Presentation層とData層は直接通信せず、必ずBusiness Logic層を経由することで依存関係を明確化し、安全性や拡張性を向上させます。

### 用語解説
**①レイヤー（層）**
機能ごとに分割したソフトウェアの階層

**②カプセル化**
内部実装を隠して外部に公開する操作。
過度に進むと他層とやりとりが不便に。

**③ブラックボックス**
詳細を隠して扱うコンポーネントのこと。

**④エンティティ**
永続化されたドメインオブジェクト（例：ユーザー、注文など）。

**⑤DTO（Data Transfer Object）**
レイヤー間でデータを受け渡すだけのオブジェクト。
メソッドを持たず、純粋なデータ構造として使う。

## 2.レイヤー設計の注意点
**過度なカプセル化による冗長性と性能低下**
各レイヤーの抽象化は処理ステップを増やし、不要なデータ変換やメソッド呼び出しを生みます。
特にリアルタイム性や高負荷が求められるシステムでは、レイヤーをまたぐたびに遅延が積み重なり、レスポンス低下を招くことがあります。
また、複数レイヤーで同じ問題を再実装すると非効率で、コード量が増え可読性も下がります。

## 3.ブラックボックスを外す判断
「どうしてもこの処理だけは最下位層のエンティティを直接操作したい」という要件がある場合、あえてBusiness Logic層を通さずPresentation層からData層のエンティティを引数として渡す設計を許可することがあります。

**メリット**
変換処理を省略でき、実装がシンプルに  ￼。

**デメリット**
層間の密結合が進み、将来的なレイヤー差し替えやテスト容易性が損なわれる可能性。

## 4.エンティティの直接受け渡しとDTO

**直接受け渡しのケース**
ブラウザから受信したJSONデータをすぐにEntityオブジェクトに詰め、Data層のリポジトリへ渡す。

**コード例：**
OrderEntity order = deserialize(requestBody); orderService.save(order); 
のように書く。

## 5.DTOを使うケース
DTOを定義し、受信データをDTOにマッピング ⇒ さらにEntityへ詰め替える。この2段階マッピングで層分離を維持。

**①DTOの利点**
バージョニングやAPI契約の明示、Presentation層とドメインモデルの変化切り離し。

**②DTOの欠点**
クラス数が増え、マッパー実装やテストケースが増加し、開発コストが上がる。

## 6.まとめ
* ３層アーキテクチャは基本的に推奨されるが、あくまで「線引き」のためのガイドライン。

* カプセル化しすぎると逆にパフォーマンスや可読性を損なう。

* ブラックボックスを外す判断は、パフォーマンスや実装のシンプルさと、将来の拡張性・テスト容易性のトレードオフ。

* DTOの使いどころを見極め、必要最小限に抑えるのがコツ。
【Python×英語】print()関数を英語で理解してみた！初心者でも安心のやさしい解説

# Pythonのprint関数、英語でどう説明する？

Pythonを学び始めたばかりの方へ。
今回は基本中の基本、`print()` 関数について、**英語でどう考えるのか**を学んでみましょう！

---

## 📌 基本の書き方

```python
print("Hello, world!")
これは、「Hello, world!」という文字を画面に表示する命令です。

📖 英語で説明すると？
text
Copy
Edit
Print the message 'Hello, world!' on the screen.
**「print」は「印刷する」ではなく「表示する」**という意味で使われます。

print() = show / display

よって、「画面に出力する（表示する）」という命令なんですね！
初心者へのアドバイス
英語がわかると、エラー文や公式ドキュメントも読みやすくなります！

ぜひ print() を「画面に表示する命令」として、英語で説明できるように覚えておきましょう！

🔗 関連リンク
Python公式チュートリアル（英語）

Real Python: Print Statement
Google NotebookLM の「音声概要」機能で情報発信が劇的に進化！Podcast風音声コンテンツを簡単作成

**はじめに**
GoogleのAIノートブック「NotebookLM」に、革新的な新機能「音声概要」が登場しました！この機能を使うと、アップロードしたドキュメントやウェブサイトなどの情報ソースを元に、まるでPodcastのような自然な音声での説明コンテンツを自動生成できるんです。
これまで、情報発信のためにブログ記事を書いたり、動画を制作したりするのに多くの時間と労力がかかっていた方もいるのではないでしょうか？この「音声概要」機能を活用すれば、より手軽に、そして魅力的な音声形式で情報を届けることが可能になります。
本記事では、この「音声概要」機能の概要、使い方、そして情報発信の可能性についてご紹介します。

**NotebookLM とは？**
NotebookLMは、アップロードしたドキュメントやウェブサイトの情報を学習し、それに基づいて質問に答えたり、要約を作成したりできるAIノートブックです。研究、執筆、学習だけでなく、情報発信の新たなツールとしても注目されています。

**新機能「音声概要」の概要**
今回ご紹介する「音声概要」機能は、以下のことが可能です。
	• 情報ソースの指定: NotebookLMにアップロードしたドキュメントやウェブサイトなどを、音声説明の元となる情報ソースとして指定できます。
	• 音声合成: 指定された情報ソースの内容をAIが解析し、自然な発声で音声合成を行います。
	• Podcast風出力: 生成される音声は、まるで人が話しているかのような抑揚や間があり、Podcastのような聴きやすい形式で出力されます。

これにより、専門的な知識や複雑な情報を、より多くの人に、そしてより魅力的な方法で届けることができるようになります。

**「音声概要」機能を使ってみる**
現時点では、この「音声概要」機能の具体的なインターフェースは公開されていない可能性があるため、想定される利用手順をご紹介します。

**1. NotebookLMを開き、情報ソースを追加**
まずはNotebookLMのウェブサイトにアクセスし、Googleアカウントでログインします。その後、音声で説明したい内容を含むドキュメントやウェブサイトをNotebookLMに追加します。

例として、D365fOのSecurity Governance機能関連のリソースを追加します
Security Governance
https://www.youtube.com/watch?v=jwhODWHNb-4
https://learn.microsoft.com/ja-jp/dynamics365/fin-ops-core/fin-ops/sysadmin/security-gov-overview
https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/fin-ops/sysadmin/security-governance-faq
https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/fin-ops/sysadmin/security-category

**2. 「音声概要」機能を選択**
ノートブック内で、情報ソースを選択した状態で「カスタマイズ」をクリックして、以下のシナリオを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043034/e610c4d7-5020-46bc-8578-d6e33e98d488.png)

まず、security governanceの概要を説明
その後、Process-based security roles, duties, and/or privilegesを説明
security governanceの様々な機能の説明
最期にsecurity governance関連のレポートを１つ１つ説明してください

**3. 音声生成の実行**
設定が完了したら、「生成」ボタンをクリックして音声の生成を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043034/6810a98d-1dfb-48c9-a8c0-aa4db224ae1a.png)

**4. 音声の確認と利用**
生成が完了すると、音声ファイルをダウンロードしたり、NotebookLM上で試聴したりできると考えられます。生成された音声は、Podcast配信プラットフォームにアップロードしたり、ウェブサイトに埋め込んだりして利用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043034/865aa58f-1590-44a3-aadb-f5f9e4da4331.png)

**「音声概要」機能の可能性**
この「音声概要」機能は、様々な分野での情報発信に革新をもたらす可能性があります。
	• 教育: 教材の内容を音声で解説することで、学習者の理解を深め、より多様な学習スタイルに対応できます。
	• ビジネス: 社内向けの情報共有や、顧客への製品説明などをPodcastのような形式で行うことで、よりパーソナルで魅力的なコミュニケーションが可能になります。
	• ジャーナリズム: ニュース記事や調査レポートの内容を音声で配信することで、視覚情報が苦手な人や移動中に情報を得たい人にもリーチできます。
	• コンテンツクリエイター: ブログ記事や研究成果などを音声コンテンツとして再利用することで、コンテンツのリーチを拡大し、新たなオーディエンスを獲得できます。

**まとめ**
Google NotebookLMの「音声概要」機能は、テキストベースの情報ソースを、手軽にPodcastのような高品質な音声コンテンツに変換できる画期的な機能です。情報発信の可能性を大きく広げ、より多くの人々に情報を届けるための強力なツールとなるでしょう。今後のアップデートにも期待が高まります。

https://blog.google/intl/ja-jp/company-news/technology/notebooklm-50/
Oracle Database 21c XEで「ORA-28001:パスワードが期限切れです。」の対応方法

# はじめに

「ORA-28001:パスワードが期限切れです。」がOracle Database 21c XEにて発生した場合の対応方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/09ba0ce1-9b9c-560b-6c45-f270d106c342.png)

# 手順

前提としてsystemユーザの接続情報が必要です。

## ① 管理者権限による接続

管理者権限を利用してDBに接続します。Oracle 19cではPDBごとにユーザを作成するため、パスワード切れになっているユーザが所属しているPDBを指定する必要があります。

```
sqlplus system/<password>@<host_name>/<pdb_name> as sysdba
```

実行例:

```
C:\>sqlplus system/passw0rd@localhost/xepdb1 as sysdba
```

## ② アカウント状況の確認

以下のSQLを実行して、アカウントの状況を確認します。

```sql
SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME = '<username>';
```

ACCOUNT_STATUSがEXPIREDの場合、パスワードが有効期限切れを起こしています。

|USERNAME     |ACCOUNT_STATUS|
|:------------|:-------------|
|_username_   |EXPIRED       |

## ③ (任意) パスワードの有効期限の変更

必要な場合、パスワードの有効期限を変更します。

```sql
-- パスワードの有効期限を無制限にする場合
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

-- パスワードの有効期限を300日にする場合
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 300;
```

## ④ パスワードの変更

以下のSQLを実行して、パスワードの有効期限を変更します。

```sql
ALTER USER <username> IDENTIFIED BY <new_password>;
```

実行例:

```sql
ALTER USER testuser IDENTIFIED BY passw0rd;
```



## ⑤ アカウント状況の確認

以下のSQLを実行して、アカウントの状況を確認します。

```sql
SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME = '<username>';
```

ACCOUNT_STATUSがOPENの場合、パスワードの有効期限切れは解消しています。

|USERNAME     |ACCOUNT_STATUS|
|:------------|:-------------|
|_username_   |OPEN          |

# 環境情報

```sql
SELECT * FROM V$VERSION;
```

|BANNER|BANNER_FULL|BANNER_LEGACY|CON_ID|
|:---|:---|:---|---:|
|Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production|Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production<br>Version 21.3.0.0.0|Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production|0|
windows11で、sketchup6 その91

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題やってみた。

# 練習問題
迷路を描け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e163fa69-5c49-46b5-b54a-0b523f82cc53.png)

# サンプルコード
起動 Maze.new

```

require 'sketchup.rb'


class Maze
	def build_maze(break_walls, maze)
		model = Sketchup.active_model
		entities = model.active_entities
		path = Sketchup.find_support_file "Fence Picket Straight Wide.skp" ,"Components/Landscape/"
		definitions = model.definitions
		compo = definitions.load path
		rows = maze.size
		cols = maze[0].size
		for i in 0..cols - 1
			putc '_'
			putc ' '
		end
		puts
		for i in 0..rows - 1
			putc '|'
			for j in 0..cols - 1
				if break_walls.any? { |a, b|
					a == [i, j] && b == [i + 1, j]
				}
					putc ' '
				else
					putc '_'
					point = Geom::Point3d.new 70 * i, 70 * j, 0
					trans = Geom::Transformation.new point
					entities.add_instance compo, trans
				end
				if break_walls.any? { |a, b| 
					a == [i, j] && b == [i, j + 1]
				}
					putc ' '
				else
					putc '|'
					point = Geom::Point3d.new 70 * i, 70 * j, 0
					trans = Geom::Transformation.new point
					ins = entities.add_instance compo, trans
					rot = Geom::Transformation.new point, Z_AXIS, 90.degrees
					ins.transform! rot
				end
			end
			puts
		end
	end
	def fill(fm, to, maze)
		rows = maze.size
		cols = maze[0].size
		for i in 0..rows - 1
			for j in 0..cols - 1
				if maze[i][j] == fm
					maze[i][j] = to
				end
			end
		end
	end
	
	def get_random_array(initAry)
		randAry = Array.new
		while(initAry.length > 0)
			randAry.push(initAry.slice!(rand(initAry.length)))
		end
		return randAry
	end
	
	def make(rows, cols)
		maze = []
		for i in 0..rows - 1
			maze << (0..cols - 1).map { |j|
				cols * i + j
			}
		end
		pairs = []
		for i in 0..rows - 1
			for j in 0..cols - 1
				pairs << [[i, j], [i, j + 1]] if j < cols - 1
				pairs << [[i, j], [i + 1, j]] if i < rows - 1
			end
		end
		break_walls = []
		pairsshuffle = get_random_array(pairs)
		pairsshuffle.each { |a, b|
			x = maze[a[0]][a[1]]
			y = maze[b[0]][b[1]]
			if x != y
				break_walls << [a, b]
				fill(x, y, maze)
			end
		}
		build_maze(break_walls, maze)
	end
	def initialize
		make 10, 10
	end
end


```

以上。
【Rails初学者】結合テスト：ログイン機能のテストコードとCapybaraメソッド解説

# 🧪 Rails結合テスト：ログイン機能のテストコードとCapybaraメソッド解説

こんにちは！Rails初学者として、今日は結合テストについて学習しました。特に、ログイン機能のテストコードを通じて、Capybaraのさまざまなメソッドを使用しました。以下に、実際に記述したコードと各メソッドの解説をまとめます。

---

## ✅ ログインが成功する場合のテスト

```ruby
context 'ログインができるとき' do
  it '保存されているユーザーの情報と合致すればログインができる' do
    visit root_path
    expect(page).to have_content('ログイン')
    visit new_user_session_path
    fill_in 'Email', with: @user.email
    fill_in 'Password', with: @user.password
    find('input[name="commit"]').click
    expect(page).to have_current_path(root_path)
    expect(find('.user_nav').find('span').hover).to have_content('ログアウト')
    expect(page).to have_no_content('新規登録')
    expect(page).to have_no_content('ログイン')
  end
end
```
## ❌ ログインが失敗する場合のテスト
```ruby
context 'ログインができないとき' do
  it '保存されているユーザーの情報と合致しないとログインができない' do
    visit root_path
    expect(page).to have_content('ログイン')
    visit new_user_session_path
    fill_in 'Email', with: ''
    fill_in 'Password', with: ''
    find('input[name="commit"]').click
    expect(page).to have_current_path(new_user_session_path)
  end
end
```
## 🛠️ 使用したCapybaraメソッドの解説
| メソッド | 説明 |
|----------|------|
| `visit` | 指定したパスにアクセスします。例：`visit root_path`でトップページに移動します。 |
| `expect(page).to have_content('文字列')` | ページ内に指定した文字列が含まれていることを確認します。 |
| `fill_in 'フィールド名', with: 値` | フォームの入力フィールドに値を入力します。 |
| `find('セレクタ')` | 指定したセレクタに一致する要素を探します。 |
| `click` | ボタンやリンクなどの要素をクリックします。 |
| `have_current_path(パス)` | 現在のページのパスが指定したパスと一致することを確認します。 |
| `hover` | 要素にマウスオーバー（ホバー）します。 |
| `have_no_content('文字列')` | ページ内に指定した文字列が含まれていないことを確認します。 |

## 🧠 学んだことのまとめ
・Capybaraを使用することで、ユーザーの操作をシミュレートしたテストが可能になります。

・visitやfill_in、clickなどのメソッドを組み合わせて、実際のユーザーの操作を再現できます。

・expectを使用して、ページの状態や表示内容を検証できます。

・テストコードを通じて、アプリケーションの挙動を確認し、バグの早期発見につなげることができます。

### 以上、今日の学習記録でした！引き続き、Railsの学習を進めていきます。🚀
【初心者】GitHubリポジトリ作成〜ローカル開発環境構築をまとめることにした（Pythonプロジェクト）

# 【初心者向け】GitHubリポジトリ作成〜ローカル開発環境構築までの完全ステップ（Pythonプロジェクト向け）
> GitHubでリポジトリを作成して、ローカルにクローンし、ディレクトリ構造を整えるところまでをまとめました。   Pythonなどの開発を始めたいときに便利なテンプレとして使えます！備忘録に残しておきます。
---
## ✅ ステップ①：GitHub上でリポジトリを作成する
1. GitHubにログインし、右上の「＋」→「New repository」をクリック  
2. 必要情報を入力：
   - **Repository name**：プロジェクト名を入力（例：`my-awesome-project`）
   - **Description**：任意
   - **Public / Private**：お好みで
   - ✅ 「**Add a README file**」にチェック（あとでクローンが楽になります）
   - ✅ 「**Add .gitignore**」にチェックし、テンプレートから `Python` を選ぶ
3. 「Create repository」をクリック
> ✅ READMEと.gitignoreを作っておくと、ローカルでの初期作業がぐっと楽になります！
---

## ✅ ステップ②：ローカルにクローンする
PowerShell（またはターミナル）で以下を実行：

```bash
git clone https://github.com/あなたのユーザー名/my-awesome-project.git
cd my-awesome-project
```
> my-awesome-project はあなたのリポジトリ名に置き換えてください。
---
## ✅ ステップ③：ディレクトリ構造を整える（Python開発向け）
```bash
mkdir data notebooks src tests
touch src/__init__.py
touch notebooks/.gitkeep
touch data/.gitkeep
```
・data/：データ保存用（.gitignore推奨）
・notebooks/：Jupyter Notebookなどを書く場所
・src/：Pythonのソースコード（パッケージ構造にする場合は __init__.py を入れる）
・tests/：テストコードを置く場所
> .gitkeep は「空のディレクトリもGitに含めたい」場合に入れるダミーファイルです（実体は空でOK）

---
## ✅ おまけ：venvを作って依存管理する（Pythonの場合）
```bash
python -m venv .venv
.\.venv\Scripts\Activate.ps1  # Windowsの場合（Mac/Linuxは source .venv/bin/activate）
pip install --upgrade pip
```
必要なパッケージをインストールしてから、requirements.txtに保存：
```bash
pip install pandas jupyter matplotlib  # 例
pip freeze > requirements.txt
```
次回以降は以下で再現できます：
```bash
pip install -r requirements.txt
```
---
## 🔚 おわりに
この流れを覚えておけば、GitHubでプロジェクトを初期化 → クローン → ローカル環境構築まで迷わず進めます！
`fun interface`を使ってKotlinでもJava互換の関数型インターフェースを実現する

## 関数型インターフェース

### 概要

ざっくり言うと、Javaで「関数を(型として)扱うためのインターフェース」が関数型インターフェースです。

関数を第一級オブジェクト（first-class object）として扱えないJavaで、第一級っぽく扱うための仕組みとしてJava 8で導入されました。そのため、「関数型インターフェース」という言葉は基本的にJavaの用語です[^functionIF]。

[^functionIF]: 概念自体は他の言語にもありますが、関数型インターフェース（functional interface）というワード自体はJava(JVM)固有のものです


### 定義

具体的には「 **抽象メソッドを1つだけ持つ**インターフェース」と定義され、SAM(Single Abstract Method)インターフェースとも言います。


もう少し細かく言うと、主に下記のルールがあります。

* 抽象メソッドは1つだけ
    * 2つ以上の抽象メソッドを定義するとコンパイルエラー
    * 非抽象メソッドなら複数あってもいい
    * 継承しているインターフェースの抽象メソッドも合算して1つだけ
* プロパティや定数などは持っていい

```java: Java
@FunctionalInterface // 関数型インターフェースの明示的宣言。抽象メソッドが2個以上あるとコンパイルエラーになる
public interface Logger {
    void log(String message);
}
```

Java公式の関数型インターフェース（`functional interface`）の説明は↓

https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html



### Kotlinでの関数型インターフェース

Kotlin 1.4からは`fun interface`キーワードで関数型インターフェースを宣言できます。

https://kotlinlang.org/docs/fun-interfaces.html

```kotlin: Kotlin
fun interface Logger {
    fun log(message: String)
}
```

Kotlin 1.3までは、Javaの関数型インターフェースをKotlinから利用することはできましたが、Kotlin側で関数型インターフェースを作成することはできませんでした。

なお、`fun interface`はコンパイルすると`@FunctionalInterface` 付きの通常のインターフェースになるためJavaからも利用でき、JavaとKotlinで相互に運用できます。


## 何がうれしいの？

### ラムダやメソッド参照でサクッと実装できる

関数型インターフェースは**関数を扱うためのインターフェース**であり、**抽象メソッドを1つしか持てない**と説明しました。これは言い換えれば、**その単一メソッドさえ実装すれば完成する**ということです。
この単一メソッドの実装として、ラムダ式やメソッド参照を渡すことができます。するとSAM変換[^SamConv]という仕組みにより、匿名クラスのインスタンスが自動で生成されます。

[^SamConv]: SAM(抽象メソッドが1つだけのインターフェース)への代入や引数渡しのときに、ラムダ式・メソッド参照をそのインターフェース実装オブジェクトへ自動変換するコンパイラの仕組み

```kotlin
// メソッド参照
val logger = Logger(::println)
```

このように、実装クラスを明示的に書くことなくラムダ式やメソッド参照で簡潔に実装できるのは関数型インターフェースのメリットの1つです。

またこれにより、テスト用のモックやスタブを用意するのも簡単になります。


### 名前をつけられるので意図が明確になる

単なる関数型(`(T) -> R`など)では引数と戻り値の型しか分かりません。これに対し関数型インターフェースでは名前をつけることができます。
例えば`Converter<T, R>`であれば、`T`を`R`に**変換する**処理なのだという意図が自然に伝わり、可読性が向上します。

```kotlin: Kotlin
fun interface Converter<T, R> {
    fun convert(value: T): R
}
```

### Java標準APIとの親和性

関数型インターフェースは、Javaの標準APIでも広く利用されています。
例えば以下のような場面では、関数型インターフェースが前提となっています。

#### ストリームAPI

`map`や`filter`に渡す関数は`Function<T, R>`や`Predicate<T>`などの関数型インターフェースです。

```kotlin: Kotlin
users.stream()
    .filter { it.age >= 30 }  // Predicate<User>
    .map { it.name.uppercase() }  // Function<User, String>
    .toList()
```


#### スレッド処理

`Runnable`は`run()`メソッド1つだけの関数型インターフェースなので、`Thread { ... }`のように書けます。

```kotlin: Kotlin
Thread { fetchRemoteData() }.start()
```

#### ソートや比較

`Comparator<T>`は`compare(T, T)`メソッド1つだけを持つため、ラムダで簡潔に書けます。

```kotlin: Kotlin
products.sortedWith { a, b -> a.price - b.price }  // Comparator<Product>
```
MATLABのスクリプトエディタでのみファイルが開けなくなった時の対処

## 概要
windows PCのPC名の付け方でミスをすると、MATLABのスクリプトエディタでのみ不具合が生じるという現象が発生します。PC名にはアンダーバーを使えないことが要注意ポイントです。

本記事は、「状況・環境・検証・解決方法・結論」の順で構成されます。
私はこの作業中に不具合に気づいただけで、他の方は別の箇所から不具合に気付くかもしれません。その時に検索しやすいように、今回検証した事柄は全て掲載しておきます。

## 状況：ネットワーク内の共有フォルダ内のファイルがMATLABでだけ開けない
windows11 homeのパソコンA内に共有フォルダを設置し、中にMATLABのスクリプトファイル(.m)やテキストファイルなどを格納しました。ファイル共有の権限等は問題なく、同じネットワーク内の他のパソコンBから、テキストファイルをメモ帳で開いて編集することはできました。このファイル共有は、ネットワークドライブではなく、UNCパスで行いました。（例えば、'¥¥Server-Name¥shared_folder'の形式）
しかしながら、MATLABデスクトップ環境からスクリプト(.m)ファイルを開いてスクリプトエディタに表示することができません。共同作業で編集しようと思っていたので、困りました。

#### 環境
ホストPC: windows 11 home、MATLAB2024b、プライベートネットワークにWiFi接続、外部セキュリティソフトはなし、ノートPC
リモートPC: windows 10 pro、MATLAB2024a、プライベートネットワークにLAN接続、外部セキュリティソフトはなし、デスクトップPC
ホストPC2: windows 10 pro、MATLAB2024a、プライベートネットワークにLAN接続、外部セキュリティソフトはなし、デスクトップPC

## 検証
### 1. スクリプトファイルは実行可能
コマンドラインからスクリプトファイルを指定すると、実行はできます。実行はできるのにスクリプトエディタで開くことだけができません。また、スクリプト内の関数一覧はDetails欄にきちんと表示されます。
この時点で、読み取り許可などの問題ではないことがわかります。

### 2. figure(.fig)ファイルは開いて編集可能
figureを作成し、figure(.fig)ファイルとして保存しました。同様にMATLAB GUI内から開くことを試み、見事表示できました。また、リモート側で編集することも可能でした。
ここから、書き込み権限に問題ないことがわかります。

### 3. 別のホストPCで同様の操作は可能
別のPPC（ホストPC2）にて、若干環境は違いますが、同様の操作を行いました。スクリプトエディタでスクリプト(.m)ファイルを開くことができ、編集も可能でした。
このことから、windowsやMATLABとしては、UNCパスによるフォルダ共有も問題ないことがわかります。

### 4. UNCパスをネットワークドライブに変更したら編集可能になった
共有フォルダをネットワークドライブとして登録して、ネットワークドライブ(たとえば、「Z:」など)のパスでMATLAB内から呼び出した場合は、スクリプトエディタで開くことができ編集もできました。
問題は固有のUNCパス内にあったことがわかります。しかし、MATLABで非推奨とされる非ASCII文字はUNCパス内に入っていません。（日本語を含む大体の全角文字は、非ASCII文字です。）

UNCパスは、フォルダ名とPC名から構成されています。そこで、PC名のみネットワークドライブ化して、その下のフォルダを読む形式にしました。（例：「Z:shared_folder」）この場合でも、スクリプトエディタで開くことができ、編集もできました。
原因はホストPCを同定する部分であることが分かりました。

### 5. ネットワーク探索の権限の許可設定は影響ない
ホストPCでMATLABの一部アクセスがブロックされている可能性もあります。そこで、ホストPCのファイアウォールの規則にMATLABの色々なアプリケーションを追加してみました。しかし、それでも改善しません。ネットワーク探索やファイル共有の権限も全て許可に変更しましたが、それでも改善しませんでした。

#### 考察事項
セキュリティ系の設定は問題ない、フォルダ名は問題ない、でもUNCパス内で問題が発生してる、しかしMATLABの外では影響がない。いったい何が原因なのか。
もう、ホストPCのPC名に非ASCII文字が入っているくらいしか、原因が思いつきません。たとえば、半角大文字アルファベットそっくりの全角文字が混入しているとか。
ホストPCのPC名の設定画面を開いて、１文字ずつ確認しようとしたそのとき、設定画面の一つの注意書きが目に入りました。

## 解決方法
原因はホストPCのPC名でした。
windowsのPC名の命名規則は、「文字、ハイフン、数字」を組み合わせて使用できます。
アンダーバー「_」は使用できないのです。

ホストPCのPC名のアンダーバーをハイフンに変更して、PCを再起動しました。
フォルダの共有パスを一通り設定しなおしたところ、通常通りスクリプトエディタで開くことができました。

windowsのPC名にアンダーバーが入っていても、windowsは許して通してくれます。普通のフォルダ共有もできて、大体のソフトウェアでファイルを開けます。MATLABのスクリプトエディタで開くことだけができませんでした。

面白いことに、フォルダ名にはアンダーバーが入っても大丈夫です。こうなると、MATLABだけの問題ではないようです。アンダーバーをどこかでハイフンに読み替える処理などしていたのでしょうか。

## 結論
windowsの初期設定の言葉は、一言一句読み飛ばさずに、しっかりと守って実行しましょう。落とし穴は思わぬところに開いています。まさかフォルダ共有したMATLABスクリプトファイルだけに効力があるとは...
Github初心者が困り果てたからリポジトリごと削除することにした（Windows編）

# 【完全ガイド】壊れた仮想環境・Git・GitHubリポジトリをまるごと整理してクリーンに再構築する方法（Windows編）

> 「.venvが壊れた」「Gitが変になった」「もう全部一回壊してやり直したい！」 そんなときに役立つ、**ローカル環境とGitHubのリポジトリを一括整理して再構築する方法**をまとめておきます。
実際に私も壊れてしまい初心者なので一度全て消そうと思い立ったのでメモ代わりに初投稿しておきます。
---
## ✅ ステップ①：ローカルのディレクトリを削除する（Windows）

PowerShell から、以下のコマンドで**フォルダごと削除**します。

```powershell
Remove-Item -Recurse -Force "フォルダパス"
```
⚠️ フォルダの親ディレクトリを間違えて消さないように注意！もしくは、エクスプローラーで右クリック →「削除」でもOKです。
---
## ✅  ステップ②：Gitの紐付け（ローカル）だけ解除したい場合

Git管理を外すだけで、フォルダそのものは残したい場合は .git を削除します：
```powershell
cd フォルダパス
Remove-Item -Recurse -Force .git
```
これでそのディレクトリはGit管理外の普通のフォルダになります。

---
## ✅  ステップ③：GitHub上のリポジトリを削除する

①GitHubで削除したいリポジトリのページを開く
　例：https://github.com/あなたのユーザー名/ae2dag

②上部メニューから Settings をクリック

➂下へスクロールし、[Danger Zone]（危険地帯） まで移動

④「Delete this repository」をクリック

⑤表示されたリポジトリ名を入力

⑥「I understand the consequences...」にチェックを入れる

⑦「Delete this repository」をクリッ⑦

>⚠️ 一度削除すると GitHub 上では復元できません！

---
## 🔁 ステップ④：クリーンに再スタートする方法

```powershell
git clone https://github.com/あなたのユーザー名/リポジトリ名.git
cd リポジトリ名
python -m venv .venv
.\.venv\Scripts\Activate.ps1  # 仮想環境を有効化（Windowsの場合）
pip install -r requirements.txt  # 必要なパッケージをインストール
```
> 💡 .gitignore に .venv/ を追加して、仮想環境をGit管理対象から外すのを忘れずに！

---
## ✅ おまけ：よくあるトラブルを回避するTips

・PowerShellの実行ポリシーが原因で仮想環境が有効化できない場合：

```
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
```
・requirements.txt がない場合は、必要なパッケージを都度 pip install でインストールしてから以下で保存：
```
pip freeze > requirements.txt
```
## 🔚 おわりに

仮想環境やリポジトリの不具合は避けられないものですが、**迷ったら一回壊して作り直す**という選択肢があるだけで心が軽くなりました。今度はちゃんと動くように試すぞ・・・
家計簿アプリを作る＃３９

![スクリーンショット 2025-05-01 205505.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/08ba4b19-7e7b-4c21-aa00-80739d61f078.png)
createThemeをMUIからインポートし、👆のように、Noto Sans JPを表示するように設定します。それ以降の部分は、もしNoto Sans JPが表示されなかった場合に、表示を代わりにしてくれるものです。

![スクリーンショット 2025-05-01 205904.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/bfbd3a60-3932-4a1c-b58c-ca086cd3c86a.png)
App.tsxファイルで、themeをインストールします。

![スクリーンショット 2025-05-01 210042.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/84054622-8990-4ac2-85fa-8a4b1b04aae6.png)
ThemeProviderで、全体を囲い、themeを指定します。
なぜファイル操作で「読み取り」や「書き込み」を指定する必要があるのか？

## はじめに

ファイル操作を初めてするとき、誰しもこう思うはずです。

> なんでファイルを開くときに "r"（読み取り）とか "w"（書き込み）とか指定する必要があるの？
> 

例えば、こんなコード。

```php
$fp = fopen("data.txt", "r");
fwrite($fp, "Hello!");
```

このとき、エラーになります。

なぜなら `"r"` は**読み取り専用**だからです。

---

## なぜ指定が必要なのか？

実は、OSとの関係がある。

ファイルというのは、複数のプログラムが同時に使う可能性があるリソース。

例えば、誰かが書き込み中に、別の人が同時に読み書きしようとしたら、データが壊れたり、競合が起こる可能性がある。

それを防ぐために、「このファイルをどう使うか？」を最初にOSに伝える必要がある。

そうすることで、OSが裏でファイル操作が正常にできるように仕事してくれる。

`fopen()`のモード指定は、そのための「宣言」ということ。

---

## おわりに

CSの知識って、こういう「ちょっとした違和感」や「なんで？」を解消するのに本当に役立ちます。

もちろん、理解しなくても仕事はできます。

でも、裏側の仕組みがわかると、プログラミングがもっと楽しくなる。

僕は、そう感じています。
(UNO3)Arduino-misakiUTF16で遊ぶ。1文字


参考
----


https://github.com/Tamakichi/Arduino-misakiUTF16



結果
----

![Screenshot from 2025-05-01 20-24-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4eaecf4e-4481-48cf-b774-c3da4c216237.png)


```

  #     
 #####  
  #     
 #####  
# # # # 
# ##  # 
 ##  #  

```


プログラム
----


```c++

#include <misakiUTF16.h>

void setup() {
Serial.begin(115200);

char font[8];              // フォント格納バッファ
getFontData(font, "あ");   // "あ"のフォントを取得

// 取得フォントの確認
for (uint8_t row=0; row<8; row++) {
    for (uint8_t col=0; col<8; col++) {
    Serial.write( (0x80>>col) & font[row] ? '#':' ');
    }
    Serial.write('\n');
}
}

void loop() {

}


```
【殴り書き】結局、CSRとSSRどっち使うのがいいの？

# 【けつろn】特に要件がなければ、一般的にはどちらを使うのがいいの？
**SSRを使うのがよいらしい**

現在のWeb開発の潮流では、SEOや初期表示速度を重視するケースが多いらしい。

実装をとにかく簡単にしたい場合や、SEO不要・内部利用中心ならCSRでも可
将来的な拡張や汎用性を考えるとSSRが推奨される



# レンダリングの違いはわかったが...
CSRやSSGやCSR、ISRの違いを説明した記事はたくさんある。

がしかし、実際どのシーンでどれを使うのが適切か、特に要件がなければ何を使うのがいいか、はわからない。

**この記事で、どのようなシーンで、どのような要件の時にどのレンダリング方法を使うのがいいのかを深ぼっていく**

# CSRの利用シーンを調べる
### CSRの利点
#### サーバー負荷が軽い
- サーバー費用を安く抑えたい時に有効、ユーザ数が増えていくと効果が出てくる


#### ページ遷移が高速
- レスポンス速度を重視したい時に有効

#### インタラクティブなUIに最適
- リッチなページを作りたい時に有効

### CSRの欠点
#### 初期表示が遅い
- JavaScriptの量が多いページは、ダウンロード・パース・実行に時間がかかり、初期表示が遅くなるので不利
- ページ表示のために複数のAPIコールや重いデータ取得が必要な時、JavaScript実行後にさらにネットワーク待ちが発生し、表示が遅くなるので不利

#### SEOに不利
- 検索エンジンに引っ掛けたい内容の時は不利
- 逆に会員以外には非公開のページであれば、SEOを気にする必要はないのでCSRがよい？

#### セキュリティや認証の考慮が必要
- データフェッチ時のセキュリティをリスクを気にする、実装コストをかけたくないのなら、CSRはやめた方がいい

#### ターゲットユーザーのデバイス性能とネットワーク環境に依存する
- ユーザのネットワーク環境が悪い場合やデバイスの性能が低い場合はCSRは有効ではない

# SSRの利用シーンを調べる
### SSRの利点
#### SEOに強い
- Qittaのような記事を公開するサービスでは、検索に引っ掛からせるため、SEOが重要になる

#### 動的コンテンツ・パーソナライズに最適
- SmartNewsのようなものの場合、毎日のアクセス時点でパーソナライズされた最新のデータを表示する必要がある時に有効

#### 低スペック端末でも快適
- クライアント側でのJavaScript実行負荷が少ないため、低スペック端末や回線速度が遅い環境に有効



### SSRの欠点
#### サーバー負荷が高い
- サーバー負荷をかけたくない時はやめた方がいい

#### ページ遷移がCSRより遅い場合がある
- ページ遷移のたびにサーバーリクエストが発生するため、ボタンを押した後のページ遷移が遅くなるため、遷移を早めたい場合はやめた方がいい
38歳未経験から目指すエンジニア転向

# 自己紹介
現在38歳でエンジニアへの転向を目指すKengineerです。これまで約15年間、営業職としてキャリアを築いてきましたが、この度、エンジニアという新たな道へ進むことを決意しました。

営業最後となる第1四半期では、所属セグメントでTop Performerとして評価され、営業としてのキャリアを気持ち良く締めくくることができました。やり切ったという充実感とともに、新たな挑戦への意欲が湧いています。

## 現在の状況
- 2025年4月末に退職
- 4月は案件の引き継ぎと並行して、Pythonの独学とLangChainやRAGを使った生成AI開発のスクールを受講（修了済）
- 5月から3ヶ月間の短期集中で、開発スキルを体系的に学ぶスクールを受講予定

## エンジニア転向を決意した背景
実は数年前にもエンジニアへの転向を検討した時期がありました。GitHubやQiitaのアカウントはその頃に開設したものです。当時のきっかけは、コロナ禍における外資系企業でのレイオフでした。その後、幸運にも興味のある企業からお声がけいただき、再び外資系SaaSベンダーの営業としてキャリアを継続していました。

エンジニアへの転身には、キャリアチェンジのハードルや、転職後の年収に対する不安がないわけではありません。しかし、今後の自身の生活、家族との時間、そして働き方を深く考えた結果、フルリモートという働き方と、以前から強く惹かれていたプログラミングという2つの要素が、今回の決断を後押ししました。40歳を目前に、新たな一歩を踏み出すことに決めました。

特に大きな理由としては、シニア期に入った愛犬の存在があります。直近の手術や今後の介護を考えると、できる限り一緒に過ごせる時間を大切にしたい、常にそばにいたいという強い想いがあります。

## 今後の計画
- スクールで開発の基礎と応用を体系的に習得
- スクールの課題とは別に、自主的なポートフォリオ制作
- 自身の強みを活かせるエンジニアの専門分野を見極める

## 最後に
恐らく大前提として、スクールのカリキュラムを一通りやるだけでは、エンジニア初級レベルになれるかどうかだと思っています。採用側から考えると、未経験、40歳手前の人を雇うメリットが感じられず、選択肢としては少なくなってしまうことは目に見えています。

営業職でも同じくだと思いますが、この人を採用したいと思ってもらえるような要素を付け足していくしか道はありませんので、エンジニアとして将来活躍できるように取り組んでいきます。
RAG（Retrieval-Augmented Generation）検索精度をグンと高める7つのレシピ(サンプル付き)

## RAGの検索精度に関する対策について質問を受けましたので、調査してまとめてみます。

## もくじ
1. RAG って何？ ざっくり 3 行で  
2. 失敗しがちなポイント  
3. 今日から使える7つの改善策  
4. サンプルコード（LangChain 版）  
5. 結論

---

## 1. RAG って何？ ざっくり 3 行で

| 役割 | たとえ |
| --- | --- |
| **Retrieve**: 関連資料を探す | Google 検索 |
| **Augment**: 見つけた資料を LLM に渡す | 資料を横に置いて説明 |
| **Generate**: LLM が回答を書く | 人がレポートをまとめる |

つまり **「検索エンジン＋ChatGPT」= RAG**。検索がズレると答えもズレる ――ここが改善ポイントです。

Hallucination（幻覚）低減や最新情報の活用が期待できる一方、検索精度が低いと結局は誤情報を拡大再生産してしまうという課題があります

---

## 2. 失敗しがちなポイント

* **チャンク/chunk（文書分割）が大きすぎ／小さすぎ**  
→ 例：マニュアルを1ページ丸ごと検索したら、欲しい情報が埋もれる。
* **固有名詞・数字を取りこぼす**（ベクトル検索だけだと弱い） 
→ 例：「2024年度予算」が「予算」だけで検索されてしまう。 
* **検索結果が多すぎて LLM が迷子**  
→ 例：100件の資料が返ってきて、AIが的外れな回答を生成。
* **そもそも、RAGの良し悪しをどうやって測ればいいかわからない**

---

## 3. 今日から使える7つの改善策

失敗を防ぐ、初心者でもすぐ試せるコツを紹介します。たとえ：RAGを「図書館で本を探してレポートを書く」作業に例えるとわかりやすいよ！

### ① 文書は「300～500語」くらいで分割＋少し重なりを
図書館で本を「1ページ単位」だと細かすぎ、「1冊丸ごと」だと大雑把すぎ。300～500語（トークン）で文書を切り、隣のチャンクと100語くらい重なるようにすると、検索が安定します（Mediumの調査より）。例：マニュアルの「休暇申請」の章を、3～4パラグラフずつに分ける。
### ② 高性能な「埋め込みモデル」を選ぶ
埋め込みモデルは、文章を「検索しやすい数字」に変換する道具。初心者におすすめは OpenAIのtext-embedding-3-large や Hugging Faceのe5-large-v2。例：これを使うと「休暇申請」と「バケーションルール」が同じ意味だとAIが理解してくれる。
### ③ 「ハイブリッド検索」で固有名詞や数字もカバー
普通の検索（ベクトル検索）だけだと「2024」や「SaaS」みたいな固有名詞を見逃しがち。ハイブリッド検索（ベクトル＋キーワード検索）をONにすると解決！例：Qdrantというツールなら、1行でハイブリッド検索に切り替え可能。
### ④ 「再ランキング」で大事な資料だけ厳選
検索で50件出てきた資料を、CohereのRerank APIで「本当に役立つ10件」に絞る。例：図書館で本を50冊借りても読めないよね？ 10冊に絞ればAIも集中できる。
### ⑤ 「クエリ拡張」で質問を賢くリライト
質問をAIに「別の言い方で3～5パターン作って」と頼むと、検索漏れが減る。例：「休暇申請のルール」→「バケーション申請」「休みを取る手順」も検索対象に。これを RAG-Fusion と言い、5～10%精度が上がる（論文より）。
### ⑥ メタデータで「古い資料」を除外
資料に「作成日」や「カテゴリ」をタグ付けして、検索を絞り込む。例：{"year": 2024, "lang": "ja"}とタグ付けすれば、2023年の古いマニュアルを無視。
### ⑦ 評価ツール「RAGAS」で改善をチェック
RAGの回答が「正確か」「質問に合ってるか」を RAGAS というツールで自動評価。例：毎日スコアをチェックして、検索のチューニングが効いてるか確認。


---

## 4. サンプルコード（LangChain 版）

```python
from langchain.chat_models import ChatOpenAI
from langchain.retrievers import MultiQueryRetriever
from langchain.retrievers.document_compressors import CohereRerank

llm = ChatOpenAI(model_name="gpt-4o-mini")

# 1) ハイブリッド検索 + Multi-Query (RAG-Fusion)
hybrid_retriever = qdrant.as_retriever(search_type="hybrid", alpha=0.3)
multi_query = MultiQueryRetriever.from_llm(
    retriever=hybrid_retriever, llm=llm, batch_size=3
)

# 2) 再ランキング
rerank = CohereRerank(model="rerank-english-v2", top_n=10)

# 3) チェイン
def answer(question):
    docs = multi_query.get_relevant_documents(question)
    top = rerank.compress_documents(docs, query=question)
    return llm.predict_messages(
        [{"role": "system", "content": "あなたは有能な社内アドバイザーです。"},
         {"role": "user", "content": f"{question}\n\n参考資料:\n{top}"}]
    )

print(answer("社内SaaSの最新版リリース日は？"))
```

---

## 5. 結論

1. **検索精度＝RAG 成功の 8 割**  
2. **ハイブリッド検索 → 再ランキング → クエリ拡張** が “効く３点セット”  
3. **RAGAS で自動評価**し、改善を回し続ける  

これだけでも多くのプロジェクトが “検索ズレ→幻覚” を大幅に減らせます。